UNPKG

amis-theme-editor

Version:

amis主题编辑器

408 lines (405 loc) 14.3 kB
/** * amis-theme-editor v2.0.22-beta.2 * Copyright 2018-2023 @fex */ import { __extends, __assign, __decorate, __spreadArray } from 'tslib'; import React__default from 'react'; import { observer } from 'mobx-react'; import { FormItem, render } from 'amis-core'; import '../icons/index.js'; import { Select, NumberInput, Overlay, PopOver } from 'amis-ui'; import ColorPicker from './ColorPicker.js'; import cloneDeep from 'lodash/cloneDeep'; import find from 'lodash/find'; import isEqual from 'lodash/isEqual'; import { ThemeWrapperHeader } from './ThemeWrapper.js'; import cx from 'classnames'; import { getValueByPath, getInheritValue, setInheritData } from '../util.js'; import { i18n } from 'i18n-runtime'; import { Icon } from 'amis'; /** * @file Shadow.tsx * @description 设置阴影 */ function ShadowView(props) { var show = props.show, target = props.target, name = props.name, value = props.value, close = props.close; return React__default.createElement(Overlay // @ts-ignore , { // @ts-ignore container: document.body, target: target.current, show: show, placement: "top", offset: [0, -8] }, React__default.createElement(PopOver, { overlay: false, onHide: close }, React__default.createElement("div", { className: "Theme-ShadowView" }, React__default.createElement("div", { className: "Theme-ShadowView-header" }, i18n("9cf15d01ed2846c4104d1607836bbe79")), React__default.createElement("div", { className: "Theme-ShadowView-body" }, React__default.createElement("div", { className: "Theme-ShadowView-body-shadow" }, React__default.createElement("div", { className: "Theme-ShadowView-body-shadow-square", style: { boxShadow: (value === null || value === void 0 ? void 0 : value.join(', ')) || 'none' } })), React__default.createElement("div", { className: "Theme-ShadowView-body-title" }, name), React__default.createElement("div", { className: "Theme-ShadowView-body-value" }, value === null || value === void 0 ? void 0 : value.map(function (shadow, index) { return React__default.createElement("div", { className: "Theme-ShadowView-body-value-item", key: index }, shadow); })))))); } function ShadowEditor(props) { var data = props.data, onChange = props.onChange, value = props.value, hasSenior = props.hasSenior, options = props.options, colorOptions = props.colorOptions, state = props.state, itemName = props.itemName, editorThemePath = props.editorThemePath; var target = React__default.useRef(null); var _a = React__default.useState(true), open = _a[0], toggleOpen = _a[1]; var _b = React__default.useState(false), senior = _b[0], toggleSenior = _b[1]; var _c = React__default.useState(false), show = _c[0], toggleViewShow = _c[1]; var customShadow = { label: i18n("f1d4ff50f3828f9b73412e7d94e6dd6e"), value: 'custom', realValue: [{ inset: false, x: '0px', y: '0px', blur: '0px', spread: '0px', color: 'transparent' }], visible: false }; var shadowOptions = options ? __spreadArray(__spreadArray([], options, true), [customShadow], false) : __spreadArray(__spreadArray([], cloneDeep(data.shadowOptions || []), true), [customShadow], false); if (state && state !== 'default') { shadowOptions.unshift({ value: editorThemePath ? 'inherit' : "var(".concat(data.default.token, "shadow)"), label: i18n("a4f758412c3797290c957544c56db443"), realValue: editorThemePath ? [i18n("a4f758412c3797290c957544c56db443")] : ["var(".concat(data.default.token).concat(itemName, ")")] }); } var editorDefaultValue = getValueByPath(editorThemePath, data); var editorInheritValue = getInheritValue(editorThemePath, data); var defaultValue = value ? value.indexOf('inherit:') > -1 && 'inherit' || find(cloneDeep(shadowOptions), function (item) { return item.value === value; }) || formateCustomValue(value) : null; var _d = React__default.useState(defaultValue), shadowData = _d[0], setShadowData = _d[1]; React__default.useEffect(function () { if (defaultValue && (!shadowData || defaultValue.value !== shadowData.value)) { setShadowData(defaultValue); } }, [defaultValue]); function formateCustomValue(value) { var color = {}; var colorIndex = 0; value = value.trim().replace(/((rgba|rgb|var)\(.*?\))|(#.{6})/g, function ($1) { var key = '$' + colorIndex; colorIndex++; color[key] = $1; return key; }); var realValue = value.split(',').map(function (item) { var inset = false; if (item.includes('inset')) { inset = true; item = item.replace('inset', ''); } item = item.trim(); var css = item.split(' '); return { inset: inset, x: css[0], y: css[1], blur: css[2], spread: css[3], color: color[css[4]] }; }); return { label: i18n("f1d4ff50f3828f9b73412e7d94e6dd6e"), value: 'custom', realValue: realValue }; } function formatRealValue(value) { if (!value) { return { value: '', source: [] }; } var res = value.map(function (shadow) { return "".concat(shadow.inset ? 'inset' : '', " ").concat(shadow.x || '', " ").concat(shadow.y || '', " ").concat(shadow.blur || '', " ").concat(shadow.spread || '', " ").concat(shadow.color || 'transparent'); }); return { value: res.join(', '), source: res }; } function onShadowSelect(value) { if (value === 'custom') { return; } if (value) { var findItem = find(shadowOptions, function (item) { return item.value === value; }); if (findItem === null || findItem === void 0 ? void 0 : findItem.value) { setShadowData(findItem); onChange(setInheritData(findItem.value, editorInheritValue)); } } else { setShadowData(undefined); onChange(undefined); } } function changeToCustom(shadowData) { if (!shadowData.value) { return shadowData; } var findItem = find(shadowOptions, function (item) { return item.value === shadowData.value; }); if (!isEqual(shadowData.realValue, findItem.realValue)) { return __assign(__assign({}, shadowData), { label: i18n("f1d4ff50f3828f9b73412e7d94e6dd6e"), value: 'custom' }); } return shadowData; } function handleAdd(inset) { var newData = changeToCustom(__assign(__assign({}, shadowData || { label: i18n("f1d4ff50f3828f9b73412e7d94e6dd6e"), value: 'custom' }), { realValue: __spreadArray(__spreadArray([], (shadowData === null || shadowData === void 0 ? void 0 : shadowData.realValue) || [], true), [{ inset: inset, x: '0px', y: '0px', blur: '0px', spread: '0px', color: 'transparent' }], false) })); setShadowData(newData); onChange(formatRealValue(newData.realValue).value); } function handleDelete(index) { if (shadowData.realValue.length === 1) { return; } var data = cloneDeep(shadowData); data.realValue.splice(index, 1); var newData = changeToCustom(data); setShadowData(newData); onChange(formatRealValue(newData.realValue).value); } function handleEdit(value, type, index) { if (type !== 'color') { value += 'px'; } shadowData.realValue[index][type] = value; var newData = changeToCustom(shadowData); setShadowData(newData); onChange(formatRealValue(newData.realValue).value); } // 数据格式化 var formatter = function (value) { return value + 'px'; }; // 还原数据 var parser = function (value) { return parseFloat(value); }; return React__default.createElement("div", { className: "Theme-ShadowEditor" }, React__default.createElement(ThemeWrapperHeader, { title: i18n("803205e38834280d9e6a75993ac00764"), hasSenior: hasSenior, senior: senior, toggleSenior: toggleSenior, open: open, toggleOpen: toggleOpen }), open && React__default.createElement("div", { className: "Theme-ShadowEditor-body" }, React__default.createElement("div", { className: "Theme-ShadowEditor-line" }, React__default.createElement("div", { ref: target, className: "Theme-ShadowEditor-view", onMouseOver: function () { return toggleViewShow(true); }, onMouseOut: function () { return toggleViewShow(false); } }, React__default.createElement("div", { style: { boxShadow: formatRealValue(shadowData === null || shadowData === void 0 ? void 0 : shadowData.realValue).value }, className: "Theme-ShadowEditor-view-inner" })), React__default.createElement(ShadowView, { target: target, show: show, close: function () { toggleViewShow(false); }, name: (shadowData === null || shadowData === void 0 ? void 0 : shadowData.label) || i18n("6f9c7d7109f2b4b5a759359a455201e9"), value: formatRealValue(shadowData === null || shadowData === void 0 ? void 0 : shadowData.realValue).source }), React__default.createElement("div", { className: "Theme-ShadowEditor-item" }, React__default.createElement(Select, { options: shadowOptions, clearable: true, value: shadowData === null || shadowData === void 0 ? void 0 : shadowData.value, onChange: function (res) { onShadowSelect(res.value); }, placeholder: editorDefaultValue || i18n("6f9c7d7109f2b4b5a759359a455201e9") }))), senior || (shadowData === null || shadowData === void 0 ? void 0 : shadowData.value) === 'custom' ? React__default.createElement("div", { className: "Theme-ShadowEditor-customContent" }, React__default.createElement("div", { className: "Theme-Wrapper-header Theme-ShadowEditor-sub-header" }, React__default.createElement("div", { className: "Theme-Wrapper-header-left" }, i18n("26db990dad6d76c6725375b24c0941e1")), React__default.createElement("div", { className: "Theme-Wrapper-header-right" }, render({ type: 'dropdown-button', level: 'link', btnClassName: 'Theme-ShadowEditor-add', icon: 'plus', hideCaret: true, closeOnClick: true, align: 'right', buttons: ['', 'inset'].map(function (item) { return { label: item ? i18n("b24a723b73f96ab3340fe9502370ee13") : i18n("92d393c2ae53f424856479d090de718f"), onClick: function () { return handleAdd(!!item); } }; }) }))), (shadowData === null || shadowData === void 0 ? void 0 : shadowData.realValue.length) ? shadowData.realValue.map(function (item, index) { return React__default.createElement("div", { className: "Theme-ShadowEditor-line", key: index }, React__default.createElement("div", { className: "Theme-ShadowEditor-item" }, React__default.createElement("div", { className: "Theme-ShadowEditor-color-picker" }, React__default.createElement(ColorPicker, { needCustom: true, needTheme: true, value: item.color, options: colorOptions || data.colorOptions || [], onChange: function (value) { handleEdit(value, 'color', index); } })), React__default.createElement("div", { className: "Theme-ShadowEditor-item-label" }, item.inset ? i18n("b24a723b73f96ab3340fe9502370ee13") : i18n("92d393c2ae53f424856479d090de718f"))), React__default.createElement("div", { className: "Theme-ShadowEditor-item" }, React__default.createElement(NumberInput, { value: parseFloat(item.x), parser: parser, formatter: formatter, onChange: function (value) { handleEdit(value, 'x', index); } }), React__default.createElement("div", { className: "Theme-ShadowEditor-item-label" }, "X")), React__default.createElement("div", { className: "Theme-ShadowEditor-item" }, React__default.createElement(NumberInput, { value: parseFloat(item.y), parser: parser, formatter: formatter, onChange: function (value) { handleEdit(value, 'y', index); } }), React__default.createElement("div", { className: "Theme-ShadowEditor-item-label" }, "Y")), React__default.createElement("div", { className: "Theme-ShadowEditor-item" }, React__default.createElement(NumberInput, { value: parseFloat(item.blur), parser: parser, formatter: formatter, onChange: function (value) { handleEdit(value, 'blur', index); } }), React__default.createElement("div", { className: "Theme-ShadowEditor-item-label" }, i18n("203bab8001257b60e1aed951a0939393"))), React__default.createElement("div", { className: "Theme-ShadowEditor-item" }, React__default.createElement(NumberInput, { value: parseFloat(item.spread), parser: parser, formatter: formatter, onChange: function (value) { handleEdit(value, 'spread', index); } }), React__default.createElement("div", { className: "Theme-ShadowEditor-item-label" }, i18n("2dc90225b8033d17c41b08f39fa42de2"))), React__default.createElement("div", { className: "Theme-ShadowEditor-item trash-icon" }, React__default.createElement(Icon, { icon: "trash", className: cx('common-icon', shadowData.realValue.length === 1 && 'disabled-icon'), onClick: function () { handleDelete(index); } }))); }) : null) : null)); } observer(ShadowEditor); /** @class */(function (_super) { __extends(ShadowEditorRenderer, _super); function ShadowEditorRenderer() { return _super !== null && _super.apply(this, arguments) || this; } Object.defineProperty(ShadowEditorRenderer.prototype, "render", { enumerable: false, configurable: true, writable: true, value: function () { return React__default.createElement(ShadowEditor, __assign({}, this.props)); } }); ShadowEditorRenderer = __decorate([FormItem({ type: 'amis-theme-shadow-editor', strictMode: false, renderLabel: false })], ShadowEditorRenderer); return ShadowEditorRenderer; })(React__default.Component);