amis-theme-editor
Version:
amis主题编辑器
1,261 lines (1,257 loc) • 42.3 kB
JavaScript
/**
* amis-theme-editor v2.0.22-beta.2
* Copyright 2018-2023 @fex
*/
import { __extends, __assign, __decorate } from 'tslib';
import React__default, { useRef, useState, useEffect, useImperativeHandle } from 'react';
import { FormItem, resolveVariableAndFilter, classnames, findTree, render, eachTree } from 'amis-core';
import cx from 'classnames';
import { SketchPicker } from 'react-color';
import { TooltipWrapper, Icon, Overlay, PopOver, SearchBox, NumberInput, Select } from 'amis-ui';
import cloneDeep from 'lodash/cloneDeep';
import debounce from 'lodash/debounce';
import { i18n } from 'i18n-runtime';
import { getValueByPath, formatInheritData, getInheritValue, setInheritData } from '../util.js';
import '../icons/index.js';
import { Icon as Icon$1 } from 'amis';
/**
* @file 颜色选择器
* @description 设置颜色
*/
var POSITION_MAP = ['left top', 'center top', 'right top', 'left center', 'center center', 'right center', 'left bottom', 'center bottom', 'right bottom'];
function findColor(value, tree) {
var res = {
label: value,
value: value
};
if (typeof value === 'string' && (value === null || value === void 0 ? void 0 : value.indexOf('var')) === 0) {
var r = findTree(tree, function (item) {
return item.value === value;
});
if (r) {
res = {
label: "".concat(r.label, "-").concat(r.realValue),
value: r.realValue
};
} else if (!value.includes('--colors-')) {
res = {
label: i18n("a4f758412c3797290c957544c56db443"),
value: value
};
}
}
if (value === 'transparent') {
res = {
label: i18n("1110ba0bda5a251c55247f122e923848"),
value: 'transparent'
};
}
if (value === 'custom') {
res = {
label: i18n("d8a4e8cdc29e9aa576e669ed165892c9"),
value: 'transparent'
};
}
if (value === 'inherit') {
res = {
label: i18n("a4f758412c3797290c957544c56db443"),
value: value
};
}
return res;
}
function ThemeColorList(props) {
var _a;
var themeList = props.themeList,
onChange = props.onChange,
value = props.value,
data = props.data,
itemName = props.itemName,
state = props.state,
editorThemePath = props.editorThemePath;
var editorInheritValue = props.editorInheritValue || getInheritValue(editorThemePath, data);
var defaultVar = state && state !== 'default' ? 'inherit' : "var(".concat((_a = data === null || data === void 0 ? void 0 : data.default) === null || _a === void 0 ? void 0 : _a.token).concat(itemName, ")");
var _b = useState(cloneDeep(themeList || [])),
colorList = _b[0],
setColorList = _b[1];
var _c = useState(true),
showFlag = _c[0],
setShowFlag = _c[1];
function setColor(value) {
onChange(setInheritData(value, editorInheritValue));
}
function searchColor(value) {
var list = cloneDeep(themeList || []);
var showFlag = false;
if (value) {
eachTree(list, function (item, key, level, paths) {
var _a, _b, _c, _d, _e, _f;
if (item.children) {
item.show = ((_a = item.label) === null || _a === void 0 ? void 0 : _a.includes(value)) || ((_b = item.value) === null || _b === void 0 ? void 0 : _b.includes(value));
}
if (paths && ((_c = paths[level - 2]) === null || _c === void 0 ? void 0 : _c.show)) {
item.show = true;
} else {
item.show = ((_d = item.value) === null || _d === void 0 ? void 0 : _d.includes(value)) || ((_e = item.realValue) === null || _e === void 0 ? void 0 : _e.includes(value)) || ((_f = item.label) === null || _f === void 0 ? void 0 : _f.includes(value));
}
if (item.show) {
showFlag = true;
}
});
} else {
showFlag = true;
}
setShowFlag(showFlag);
setColorList(list);
}
return React__default.createElement("div", {
className: "ThemeColorList"
}, React__default.createElement("div", {
className: "ThemeColorList-content ThemeColorList-content--top"
}, React__default.createElement("div", {
className: "ThemeColorList-content-title"
}, i18n("aa05fd09a619ddbf07d8d903e6d32c5e")), React__default.createElement("div", {
className: "ThemeColorList-content-labels"
}, React__default.createElement(TooltipWrapper, {
trigger: "hover",
placement: "top",
tooltip: {
children: function () {
return React__default.createElement("div", null, i18n("ee5841a88da34c5a0e0515c4d863752a"));
}
}
}, React__default.createElement("div", {
className: cx('ThemeColorList-content-label', value === 'transparent' && 'ThemeColorList-content-label--active'),
onClick: function () {
return setColor('transparent');
}
}, React__default.createElement("div", {
className: cx('ThemeColorList-content-label-inner', 'ThemeColor--transparent')
}))), React__default.createElement(TooltipWrapper, {
trigger: "hover",
placement: "top",
tooltip: {
children: function () {
return React__default.createElement("div", null, i18n("d81bb206a889656035b929cd8bb1ef10"));
}
}
}, React__default.createElement("div", {
className: cx('ThemeColorList-content-label'),
onClick: function () {
return setColor(undefined);
}
}, React__default.createElement("div", {
className: "ThemeColorList-content-label-inner"
}, React__default.createElement("div", {
className: "ThemeColor--delete"
})))), (data === null || data === void 0 ? void 0 : data.state) && data.state !== 'default' || state && state !== 'default' ? React__default.createElement(TooltipWrapper, {
trigger: "hover",
placement: "top",
tooltip: {
children: function () {
return React__default.createElement("div", null, i18n("a4f758412c3797290c957544c56db443"));
}
}
}, React__default.createElement("div", {
className: cx('ThemeColorList-content-label', value === defaultVar && 'ThemeColorList-content-label--active'),
onClick: function () {
return setColor(defaultVar);
}
}, React__default.createElement("div", {
className: cx('ThemeColorList-content-label-inner', 'ThemeColor--transparent')
}, React__default.createElement("div", {
className: "ThemeColorList-content-label-inner",
style: {
background: defaultVar
}
})))) : null), React__default.createElement("div", {
className: "ThemeColorList-content--search"
}, React__default.createElement(SearchBox, {
placeholder: i18n("517c1de3f9f069c1c33003ec8d75c3da"),
onChange: searchColor
}))), showFlag ? colorList === null || colorList === void 0 ? void 0 : colorList.map(function (item, i) {
var _a, _b;
var show = item.show;
(_a = item.children) === null || _a === void 0 ? void 0 : _a.forEach(function (n) {
var _a;
(_a = n.children) === null || _a === void 0 ? void 0 : _a.forEach(function (m) {
if (m.show !== false) {
show = true;
}
});
});
return show ? React__default.createElement("div", {
key: i
}, React__default.createElement("div", {
className: "ThemeColorList-title"
}, i18n(item.label)), (_b = item.children) === null || _b === void 0 ? void 0 : _b.map(function (colors, i) {
var _a, _b;
var show = colors.show;
(_a = colors.children) === null || _a === void 0 ? void 0 : _a.forEach(function (n) {
if (n.show !== false) {
show = true;
}
});
return show ? React__default.createElement("div", {
className: "ThemeColorList-content",
key: i
}, React__default.createElement("div", {
className: "ThemeColorList-content-title"
}, i18n(colors.label)), React__default.createElement("div", {
className: "ThemeColorList-content-labels"
}, (_b = colors.children) === null || _b === void 0 ? void 0 : _b.map(function (color, i) {
return color.show !== false ? React__default.createElement(TooltipWrapper, {
key: i,
trigger: "hover",
placement: "top",
tooltip: {
children: function () {
return React__default.createElement("div", null, "".concat(i18n(color.label), "-").concat(color.realValue));
}
}
}, React__default.createElement("div", {
className: cx('ThemeColorList-content-label', value === color.value && 'ThemeColorList-content-label--active'),
onClick: function () {
return setColor(color.value);
}
}, React__default.createElement("div", {
className: cx('ThemeColorList-content-label-inner', color.realValue === '#ffffff' && 'ThemeColorList-content-label--border'),
style: {
background: color.value
}
}))) : null;
}))) : null;
})) : null;
}) : React__default.createElement("span", {
className: "ThemeColorList-content-title"
}, i18n("d6a80fc3f53d0b11e5f96a538b096c06")));
}
function CustomColor(props) {
var value = props.value,
onChange = props.onChange,
themeList = props.themeList;
if ((value === null || value === void 0 ? void 0 : value.indexOf('var')) === 0) {
var res = findColor(value, themeList).value;
value = res;
}
return React__default.createElement("div", {
className: "Theme-CustomColor"
}, React__default.createElement(SketchPicker, {
width: "216px",
color: value,
presetColors: [],
onChangeComplete: function (value) {
if (value.rgb.a === 1) {
onChange(value.hex);
} else {
var rag = value.rgb;
onChange("rgba(".concat(rag.r, ", ").concat(rag.g, ", ").concat(rag.b, ", ").concat(rag.a, ")"));
}
}
}));
}
function GradientColor(props) {
var _a;
var slider = useRef(null);
var rangeRef = useRef(null);
var rangeRefPanel = useRef(null);
var value = props.value,
onChange = props.onChange,
themeList = props.themeList;
var _b = useState([]),
colors = _b[0],
setColors = _b[1];
var _c = useState(0),
index = _c[0],
setIndex = _c[1];
var _d = useState(0),
range = _d[0],
setRange = _d[1];
var _e = useState(false),
rangeShow = _e[0],
setRangeShow = _e[1];
var _f = useState(false),
move = _f[0],
setMove = _f[1];
var currentIndex = index;
// 格式化渐变
function formatGradient(value) {
var str = /linear-gradient\((.*)\)/.exec(value);
if (!str) return {
colors: [],
range: 0
};
str = str[1];
var bracketStart = false;
var length = str.length;
var rangeAndColor = [];
var j = 0;
rangeAndColor[j] = '';
for (var i = 0; i < length; i++) {
var w = str[i];
if (w === '(') {
bracketStart = true;
}
if (w === ')') {
bracketStart = false;
}
if (w === ',' && !bracketStart) {
j++;
rangeAndColor[j] = '';
} else {
rangeAndColor[j] += w;
}
}
var range = parseFloat(rangeAndColor.shift());
var len = rangeAndColor.length;
var res = [];
rangeAndColor.forEach(function (item, i) {
var colorAndPosition = /(.*) (.*)/.exec(item);
var color = {
color: findColor(colorAndPosition[1], themeList).value,
position: (i + 1) / len * 100
};
if (colorAndPosition[2]) {
color.position = parseFloat(colorAndPosition[2]);
}
res.push(color);
});
return {
colors: res,
range: range
};
}
useEffect(function () {
if ((value === null || value === void 0 ? void 0 : value.indexOf('linear-gradient')) === 0) {
var _a = formatGradient(value),
colors_1 = _a.colors,
range_1 = _a.range;
setColors(colors_1);
setRange(range_1);
} else {
var color = value;
if ((value === null || value === void 0 ? void 0 : value.indexOf('url')) === 0) {
color = '#fff';
}
setColors([{
color: color || '#fff',
position: 0
}, {
color: color || '#fff',
position: 100
}]);
}
}, [value]);
function gradientChange(range, colors) {
onChange("linear-gradient(".concat(range, "deg,").concat(colors.map(function (item) {
return "".concat(item.color, " ").concat(item.position, "%");
}).join(','), ")"));
}
// 渐变角度改变
function rangeChange(value) {
setRange(value);
gradientChange(value, colors);
}
// 添加渐变点
function handleClickSlider(e) {
if (move) {
return;
}
var target = e.currentTarget.getBoundingClientRect();
var itemPosition = Math.round((e.clientX - target.x) / target.width * 100);
var tempColors = cloneDeep(colors);
var len = tempColors.length;
var index = 0;
if (tempColors[0].position > itemPosition) {
tempColors.unshift({
color: tempColors[0].color,
position: itemPosition
});
} else if (tempColors[len - 1].position < itemPosition) {
tempColors.push({
color: tempColors[len - 1].color,
position: itemPosition
});
index = len;
} else {
for (var i = 0; i < len; i++) {
if (tempColors[i].position < itemPosition && tempColors[i + 1].position > itemPosition) {
index = i + 1;
tempColors.splice(index, 0, {
color: tempColors[i].color,
position: itemPosition
});
break;
}
}
}
setColors(tempColors);
setIndex(index);
gradientChange(range, tempColors);
}
// 按住渐变点
function handleDownSliderItem(e, i) {
setIndex(i);
setMove(true);
currentIndex = i;
window.addEventListener('mousemove', handleMoveSliderItem);
window.addEventListener('mouseup', handleUpSliderItem);
}
// 移动渐变点
function handleMoveSliderItem(e) {
var target = slider.current.getBoundingClientRect();
var itemPosition = Math.round((e.x - target.x) / target.width * 100);
var tempColors = cloneDeep(colors);
// 渐变点个数大于2,当y轴移动大于30,删除渐变点
if (Math.abs(e.y - target.y) > 30 && tempColors.length > 2) {
tempColors.splice(currentIndex, 1);
setIndex(0);
setColors(tempColors);
gradientChange(range, tempColors);
}
// 限制不能超过最大、最小值
else if (itemPosition >= 0 && itemPosition <= 100) {
tempColors[currentIndex].position = itemPosition;
// 向前交换渐变点
if (tempColors[currentIndex - 1] && itemPosition < tempColors[currentIndex - 1].position) {
var temp = cloneDeep(tempColors[currentIndex - 1]);
tempColors[currentIndex - 1] = cloneDeep(tempColors[currentIndex]);
tempColors[currentIndex] = temp;
setIndex(currentIndex - 1);
}
// 向后交换渐变点
else if (tempColors[currentIndex + 1] && itemPosition > tempColors[currentIndex + 1].position) {
var temp = cloneDeep(tempColors[currentIndex + 1]);
tempColors[currentIndex + 1] = cloneDeep(tempColors[currentIndex]);
tempColors[currentIndex] = temp;
setIndex(currentIndex + 1);
}
setColors(tempColors);
gradientChange(range, tempColors);
}
}
// 放开渐变点
function handleUpSliderItem() {
window.removeEventListener('mousemove', handleMoveSliderItem);
window.removeEventListener('mouseup', handleUpSliderItem);
setTimeout(function () {
setMove(false);
}, 0);
}
// 通过角度计算位置
function computedRange(angle) {
if (angle === void 0) {
angle = 0;
}
var radian = Math.PI / 180 * angle;
var left = 21 + Math.sin(radian) * 25;
var top = 21 - Math.cos(radian) * 25;
return {
left: left,
top: top
};
}
// 按下渐变角度句柄
function handleDownRange() {
window.addEventListener('mousemove', handleMoveRange);
window.addEventListener('mouseup', handleUpRange);
}
// 移动渐变角度句柄
function handleMoveRange(e) {
var panel = rangeRefPanel.current.getBoundingClientRect();
var panelX = panel.x + 25;
var panelY = panel.y + 25;
var x = Math.abs(e.x - panelX);
var y = Math.abs(e.y - panelY);
var angle = Math.round(Math.atan(x / y) * 180 / Math.PI);
// 二象限
if (e.y > panelY && e.x > panelX) {
angle = 180 - angle;
}
// 三象限
if (e.x <= panelX && e.y > panelY) {
angle = 180 + angle;
}
// 四象限
if (e.x < panelX && e.y < panelY) {
angle = 360 - angle;
}
setRange(angle);
gradientChange(angle, colors);
}
// 抬起渐变角度句柄
function handleUpRange() {
window.removeEventListener('mousemove', handleMoveRange);
window.removeEventListener('mouseup', handleUpRange);
}
return React__default.createElement("div", {
className: "Theme-GradientColor"
}, React__default.createElement("div", {
className: "Theme-GradientColor-slider"
}, React__default.createElement("div", {
ref: slider,
className: "Theme-GradientColor-slider-inner",
style: {
backgroundImage: "linear-gradient(to right,".concat(colors.map(function (item) {
return "".concat(item.color, " ").concat(item.position, "%");
}).join(','), ")")
},
onClick: handleClickSlider
}, colors.map(function (item, i) {
return React__default.createElement("div", {
key: i,
className: cx('Theme-GradientColor-slider-inner-item', i === index && 'Theme-GradientColor-slider-inner-item--active'),
onMouseDown: function (e) {
handleDownSliderItem(e, i);
},
onClick: function (e) {
e.stopPropagation();
},
style: {
left: "calc(".concat(item.position, "% - 7px)"),
background: item.color
}
});
})), React__default.createElement("div", {
className: "Theme-GradientColor-range",
ref: rangeRef,
onClick: function (e) {
setRangeShow(true);
e.stopPropagation();
window.addEventListener('click', function () {
setRangeShow(false);
});
}
}, React__default.createElement(NumberInput, {
formatter: function (value) {
return value + '°';
},
max: 360,
min: 0,
value: range,
onChange: rangeChange
}), React__default.createElement(Overlay
// @ts-ignore
, {
// @ts-ignore
container: document.body,
// @ts-ignore
target: rangeRef.current,
show: rangeShow,
placement: "center-bottom-center-top",
rootClose: false,
offset: [0, 4]
}, React__default.createElement(PopOver, null, React__default.createElement("div", {
className: "Theme-GradientColor-range-panel"
}, React__default.createElement("div", {
className: "Theme-GradientColor-range-panel-title"
}, i18n("c7706039e8ad85969df13ce3458d199a")), React__default.createElement("div", {
className: "Theme-GradientColor-range-panel-content",
ref: rangeRefPanel
}, React__default.createElement("div", {
className: "Theme-GradientColor-range-panel-content-handler",
onMouseDown: handleDownRange,
style: {
left: computedRange(range).left + 'px',
top: computedRange(range).top + 'px'
}
}))))))), React__default.createElement(SketchPicker, {
width: "216px",
color: (_a = colors[index]) === null || _a === void 0 ? void 0 : _a.color,
presetColors: [],
onChangeComplete: function (value) {
var color = value.hex;
if (value.rgb.a !== 1) {
var rag = value.rgb;
color = "rgba(".concat(rag.r, ", ").concat(rag.g, ", ").concat(rag.b, ", ").concat(rag.a, ")");
}
var colorsTemp = cloneDeep(colors);
colorsTemp[index].color = color;
setColors(colorsTemp);
gradientChange(range, colorsTemp);
}
}));
}
function ImageInput(props) {
var onChange = props.onChange,
value = props.value,
imageType = props.imageType,
receiver = props.receiver,
env = props.env;
var _a = useState(''),
image = _a[0],
setImage = _a[1];
var _b = useState('auto'),
mode = _b[0],
setMode = _b[1];
var _c = useState(4),
position = _c[0],
setPosition = _c[1];
var _d = useState(''),
color = _d[0],
setColor = _d[1];
function formatData() {
var _a, _b;
var list = value.split(' ');
var imgRes = /url\((.*)\)/.exec(list[0]);
if (imgRes) {
var img = imgRes[1];
setImage(img);
var res = value.replace(imgRes[0] + ' ', '');
var list_1 = res.split(' ');
// 解析position
var position_1 = list_1[0] + ' ' + list_1[1];
var index = POSITION_MAP.findIndex(function (n) {
return n === position_1;
});
setPosition(index);
res = res.replace(position_1 + ' / ', '');
list_1 = res.split(' ');
// 解析mode
var mode_1 = list_1[0];
if (~((_a = list_1[1]) === null || _a === void 0 ? void 0 : _a.indexOf('repeat'))) {
mode_1 += ' ' + list_1[1];
}
if (~((_b = list_1[1]) === null || _b === void 0 ? void 0 : _b.indexOf('100%'))) {
mode_1 = '100% 100% no-repeat';
}
setMode(mode_1);
// 解析color
var color_1 = res.replace(mode_1 + ' ', '');
setColor(color_1);
}
}
useEffect(function () {
formatData();
}, [value]);
return React__default.createElement("div", {
className: "Theme-ImageInput"
}, render({
type: imageType || 'input-image',
receiver: receiver,
name: 'image',
onChange: function (url) {
if (url) {
onChange("url(".concat(url, ") ").concat(POSITION_MAP[position], " / ").concat(mode, " ").concat(color));
}
}
}, {
data: {
image: image
}
}, __assign({}, env)), React__default.createElement("div", {
className: "Theme-ImageInput-func"
}, React__default.createElement(Select, {
className: ":Theme-ImageInput-fill",
value: mode,
clearable: false,
options: [{
label: i18n("21f3929a4484e6e992af64ec1dd3a576"),
value: 'auto no-repeat'
}, {
label: i18n("0f1fd39145bad43e18f81337e0144c8c"),
value: 'cover no-repeat'
}, {
label: i18n("e0d76824dfe5e09c7068b44f605266d2"),
value: 'contain no-repeat'
}, {
label: i18n("e39d3b7a3600d9327221a637f910fc0b"),
value: '100% 100% no-repeat'
}, {
label: i18n("e1ff2c83c09f2dc6cc74ae02ab6b8222"),
value: 'auto repeat'
}, {
label: i18n("7ddd9dbf373f760acfd63778469b5c4b"),
value: 'auto repeat-x'
}, {
label: i18n("4ab931e0f709f9b493e660156925a113"),
value: 'auto repeat-y'
}],
onChange: function (res) {
if (image && (res === null || res === void 0 ? void 0 : res.value)) {
onChange("url(".concat(image, ") ").concat(POSITION_MAP[position], " / ").concat(res.value, " ").concat(color));
}
}
}), React__default.createElement(ImagePosition, {
value: position,
onChange: function (value) {
onChange("url(".concat(image, ") ").concat(POSITION_MAP[value], " / ").concat(mode, " ").concat(color));
}
}), React__default.createElement(ImageColor, __assign({}, props, {
value: color,
onChange: function (value) {
onChange("url(".concat(image, ") ").concat(POSITION_MAP[position], " / ").concat(mode, " ").concat(value));
}
}))));
}
function ImagePosition(_a) {
var value = _a.value,
onChange = _a.onChange;
var positionMap = Array.from(Array(9).keys());
var _b = useState(false),
show = _b[0],
setShow = _b[1];
var target = useRef(null);
function close() {
setShow(false);
}
function positionChange(value) {
onChange(value);
}
return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", {
className: "Theme-ImageInput-position",
ref: target,
onClick: function () {
setShow(true);
}
}, positionMap.map(function (position) {
return React__default.createElement("div", {
key: position,
className: cx('Theme-ImageInput-position-item', value === position && 'Theme-ImageInput-position-item--active')
});
})), React__default.createElement(Overlay
// @ts-ignore
, {
// @ts-ignore
container: document.body,
target: target.current,
show: show,
offset: [0, 4]
}, React__default.createElement(PopOver, {
overlay: true,
onHide: close
}, React__default.createElement("div", {
className: "Theme-ImageInput-position-container"
}, React__default.createElement("div", {
className: "Theme-ImageInput-position-title"
}, i18n("61a87a021904dc65995e99d4c476cb21")), React__default.createElement("div", {
className: "Theme-ImageInput-position-content"
}, positionMap.map(function (position) {
return React__default.createElement("div", {
key: position,
className: cx('Theme-ImageInput-position-content-item', value === position && 'Theme-ImageInput-position-content-item--active'),
onClick: function () {
positionChange(position);
}
});
}))))));
}
function ImageColor(props) {
var value = props.value,
onChange = props.onChange,
themeList = props.themeList,
subTabList = props.subTabList;
var _a = useState(false),
show = _a[0],
setShow = _a[1];
var _b = useState(0),
tab = _b[0],
setTab = _b[1];
var target = useRef(null);
function close() {
setShow(false);
}
function handleTab(value) {
setTab(value);
}
useEffect(function () {
if (~value.indexOf('var')) {
setTab(0);
} else {
setTab(1);
}
}, [value]);
return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", {
ref: target,
className: "Theme-ImageInput-color",
style: {
background: value
},
onClick: function () {
setShow(true);
}
}), React__default.createElement(Overlay
// @ts-ignore
, {
// @ts-ignore
container: document.body,
target: target.current,
show: show,
offset: [0, 4]
}, React__default.createElement(PopOver, {
overlay: true,
onHide: close
}, React__default.createElement("div", {
className: "Theme-ImageInput-color-container"
}, React__default.createElement("div", {
className: "Theme-ImageInput-color-content"
}, React__default.createElement("div", {
className: "Theme-ImageInput-color-content-tab"
}, subTabList.map(function (item) {
return React__default.createElement("div", {
className: cx('Theme-ImageInput-color-content-tab-item', tab === item.id && 'Theme-ImageInput-color-content-tab-item--active'),
onClick: function () {
handleTab(item.id);
},
key: item.id
}, item.name);
})), tab === 0 ? React__default.createElement(ThemeColorList, __assign({}, props, {
themeList: themeList,
onChange: function (value) {
onChange(value);
close();
},
value: value
})) : null, tab === 1 ? React__default.createElement(CustomColor, {
onChange: onChange,
value: value,
themeList: themeList
}) : null)))));
}
/**
* 最近颜色列表
*/
function PresetColors(props) {
var themeList = props.themeList,
onChange = props.onChange,
onRef = props.onRef,
needGradient = props.needGradient,
needImage = props.needImage,
needTheme = props.needTheme,
needCustom = props.needCustom;
var _a = useState({
colors: [],
linearGradient: [],
img: []
}),
colors = _a[0],
setColors = _a[1];
var _b = useState(false),
edit = _b[0],
setEdit = _b[1];
function setPresetColor(value) {
if (!value) {
return;
}
var presetColors = cloneDeep(colors);
if (!!~value.indexOf('linear-gradient')) {
if (presetColors.linearGradient.length < 8 && !colors.linearGradient.find(function (n) {
return n.color === value;
})) {
presetColors.linearGradient.unshift({
color: value,
title: value
});
}
} else if (!!~value.indexOf('url')) {
// 图片不加入最近颜色列表
return;
// if (
// presetColors.img.length < 8 &&
// !colors.img.find(n => n.color === value)
// ) {
// presetColors.img.unshift({
// color: value,
// title: value
// });
// }
} else if (presetColors.colors.length < 8 && !colors.colors.find(function (n) {
return n.color === value;
})) {
var title = void 0;
if (value.indexOf('var(') === 0) {
title = findColor(value, themeList).label;
}
presetColors.colors.unshift({
color: value,
title: title
});
}
localStorage.setItem('presetColors', JSON.stringify(presetColors));
setColors(presetColors);
}
useImperativeHandle(onRef, function () {
return {
setPresetColor: debounce(setPresetColor, 500)
};
});
useEffect(function () {
var presetColors;
try {
presetColors = JSON.parse(localStorage.getItem('presetColors') || '');
} catch (e) {
presetColors = {
colors: [],
linearGradient: [],
img: []
};
}
setColors(presetColors);
}, []);
function getColorsLen(colors) {
return colors.colors.length + colors.linearGradient.length + colors.img.length;
}
function colorClick(color, index, type) {
if (edit) {
var newColors = cloneDeep(colors);
newColors[type].splice(index, 1);
setColors(newColors);
localStorage.setItem('presetColors', JSON.stringify(newColors));
if (getColorsLen(newColors) === 0) {
setEdit(false);
}
} else {
onChange(color);
}
}
return React__default.createElement("div", {
className: "Theme-ColorSelect-PresetColors"
}, React__default.createElement("div", {
className: "Theme-ColorSelect-PresetColors-header"
}, React__default.createElement("span", {
className: "Theme-ColorSelect-PresetColors-title"
}, i18n("7778401c65bfef9c0ad4d543e3b5b310")), getColorsLen(colors) > 0 ? React__default.createElement("span", {
className: cx('Theme-ColorSelect-PresetColors-edit', edit && 'Theme-ColorSelect-PresetColors-editing'),
onClick: function () {
setEdit(!edit);
}
}, edit ? i18n("769d88e425e03120b83ee4ed6b9d588e") : i18n("95b351c86267f3aedf89520959bce689")) : null), React__default.createElement("div", null, getColorsLen(colors) > 0 ? Object.keys(colors).map(function (key) {
if (!needGradient && key === 'linearGradient') {
return null;
}
if (!needImage && key === 'img') {
return null;
}
if (!needTheme && !needCustom && key === 'colors') {
return null;
}
return colors[key].length > 0 ? React__default.createElement("div", {
key: key,
className: cx('Theme-ColorSelect-PresetColors-content', edit && 'Theme-ColorSelect-PresetColors-content-editing')
}, colors[key].map(function (color, index) {
return React__default.createElement(TooltipWrapper, {
trigger: "hover",
placement: "left",
tooltip: {
children: function () {
return React__default.createElement("div", null, color.title || color.color);
}
},
key: color.color,
container: document.body
}, React__default.createElement("div", {
className: "ThemeColor--transparent Theme-ColorPicker-label-out",
onClick: function () {
colorClick(color.color, index, key);
}
}, React__default.createElement("div", {
style: {
background: color.color
},
className: "Theme-ColorSelect-PresetColors-content-item"
})));
})) : null;
}) : React__default.createElement("span", {
className: "Theme-ColorSelect-PresetColors-content-placeholder"
}, i18n("ec8baa57611b5a89a37b31c7432a01d7"))));
}
function ColorSelect(props) {
var show = props.show,
target = props.target,
themeList = props.themeList,
onChange = props.onChange,
close = props.close,
value = props.value,
needGradient = props.needGradient,
needImage = props.needImage,
needTheme = props.needTheme,
needCustom = props.needCustom;
var _a = useState('color'),
tab = _a[0],
setTab = _a[1];
var _b = useState(0),
subTab = _b[0],
setSubTab = _b[1];
var presetColorRef = useRef();
var tabMap = {
color: {
name: 'color'
}
};
if (needGradient) {
tabMap['gradient'] = {
name: 'gradient'
};
}
if (needImage) {
tabMap['img'] = {
name: 'img',
icon: React__default.createElement(Icon$1, {
icon: "color-picker-img"
}),
activeIcon: React__default.createElement(Icon$1, {
icon: "color-picker-img-active"
})
};
}
var subTabList = [needTheme && themeList && themeList.length > 0 && {
name: i18n("a1c76c6e1bd796959e536718e04d10ca"),
parent: 'color',
id: 0
}, needCustom && {
name: i18n("255f442c4a1b92624a6e96541202a0be"),
parent: 'color',
id: 1
}].filter(function (n) {
return n;
});
function setSubTabCheck() {
if (needTheme && value.indexOf('#') !== 0 && value.indexOf('rgba') !== 0 && subTabList.find(function (item) {
return item.id === 0;
})) {
setSubTab(0);
} else if (needCustom && subTabList.find(function (item) {
return item.id === 1;
})) {
setSubTab(1);
}
}
useEffect(function () {
if (needTheme && ((value === null || value === void 0 ? void 0 : value.indexOf('var')) === 0 || value === 'transparent' || !value) && subTabList.find(function (item) {
return item.id === 0;
})) {
setTab('color');
setSubTab(0);
} else if (needGradient && (value === null || value === void 0 ? void 0 : value.indexOf('linear-gradient')) === 0) {
setTab('gradient');
} else if (needImage && (value === null || value === void 0 ? void 0 : value.indexOf('url')) === 0) {
setTab('img');
} else if (needCustom && subTabList.find(function (item) {
return item.id === 1;
})) {
setTab('color');
setSubTab(1);
}
}, [show]);
useEffect(function () {
if (needTheme) {
setSubTab(0);
} else if (needCustom) {
setSubTab(1);
}
}, [needCustom, needTheme]);
function colorOnChange(value) {
var _a;
onChange(value);
(_a = presetColorRef.current) === null || _a === void 0 ? void 0 : _a.setPresetColor(value);
}
function renderSubTab() {
var list = subTabList.filter(function (item) {
return item.parent === tab;
});
if (list.length > 0) {
return React__default.createElement("div", {
className: "Theme-ColorSelect-tab-sub"
}, list.map(function (item) {
return React__default.createElement("div", {
key: item.id,
className: cx('Theme-ColorSelect-tab-sub-item', subTab === item.id && 'Theme-ColorSelect-tab-sub--active'),
onClick: function () {
return setSubTab(item.id);
}
}, item.name);
}));
} else {
return null;
}
}
return React__default.createElement(Overlay
// @ts-ignore
, {
// @ts-ignore
container: document.body,
target: target.current,
show: show,
placement: "left"
}, React__default.createElement(PopOver, {
overlay: true,
onHide: close
}, React__default.createElement("div", {
className: "Theme-ColorSelect"
}, Object.keys(tabMap).length > 1 ? React__default.createElement("div", {
className: "Theme-ColorSelect-tab"
}, Object.keys(tabMap).map(function (key) {
return React__default.createElement("div", {
key: key,
className: cx('Theme-ColorSelect-tab-' + key, tab === key && "Theme-ColorSelect-tab-".concat(key, "--active")),
onClick: function () {
setTab(key);
setSubTabCheck();
}
}, tab === key ? tabMap[key].activeIcon : tabMap[key].icon);
})) : null, renderSubTab(), React__default.createElement("div", {
className: "Theme-ColorSelect-content"
}, tab === 'color' ? React__default.createElement("div", {
className: "Theme-ColorSelect-content-color"
}, subTab === 0 ? React__default.createElement(ThemeColorList, __assign({}, props, {
themeList: themeList,
onChange: colorOnChange,
value: value
})) : null, subTab === 1 ? React__default.createElement(CustomColor, {
onChange: colorOnChange,
value: value,
themeList: themeList
}) : null) : null, tab === 'gradient' ? React__default.createElement(GradientColor, {
value: value,
onChange: colorOnChange,
themeList: themeList
}) : null, tab === 'img' ? React__default.createElement(ImageInput, __assign({}, props, {
value: value,
onChange: colorOnChange,
subTabList: subTabList
})) : null, React__default.createElement(PresetColors, {
onRef: presetColorRef,
onChange: colorOnChange,
themeList: themeList,
needGradient: needGradient,
needImage: needImage,
needTheme: needTheme,
needCustom: needCustom
})))));
}
function ColorPicker(props) {
var _a;
var value = props.value,
options = props.options,
data = props.data,
onChange = props.onChange,
labelMode = props.labelMode,
needGradient = props.needGradient,
needImage = props.needImage,
needTheme = props.needTheme,
needCustom = props.needCustom,
placeholder = props.placeholder,
disabled = props.disabled,
readOnly = props.readOnly;
var themeList = options;
if (typeof options === 'string') {
themeList = resolveVariableAndFilter(options, data, '| raw');
}
var container = useRef(null);
var target = useRef(null);
var _b = useState(value),
color = _b[0],
setColor = _b[1];
var _c = useState(false),
show = _c[0],
setShow = _c[1];
function colorSelectHandler() {
!disabled && setShow(!show);
}
function handleClean(event) {
setColor(undefined);
onChange(undefined);
event.preventDefault();
event.stopPropagation();
}
useEffect(function () {
setColor(value);
}, [value]);
return React__default.createElement("div", {
className: cx('Theme-ColorPicker', disabled && 'is-disabled', readOnly && 'is-readOnly'),
ref: container
}, React__default.createElement("div", {
className: cx('Theme-ColorPicker', labelMode === 'input' && 'Theme-ColorPicker--input'),
onClick: colorSelectHandler,
ref: target
}, React__default.createElement("div", {
className: "ThemeColor--transparent Theme-ColorPicker-label-out"
}, findColor(color || placeholder, themeList).value ? React__default.createElement(TooltipWrapper, {
trigger: "hover",
placement: "left",
disabled: labelMode === 'input',
tooltip: {
children: function () {
return React__default.createElement("div", null, findColor(color || placeholder, themeList).label);
}
}
}, React__default.createElement("div", {
className: cx('Theme-ColorPicker-label'),
style: {
background: findColor(color || placeholder, themeList).value
}
})) : React__default.createElement("div", {
className: "ThemeColor--delete"
})), labelMode === 'input' ? React__default.createElement(React__default.Fragment, null, React__default.createElement("div", {
className: cx('Theme-ColorPicker-input')
}, color ? React__default.createElement("div", null, findColor(color, themeList).label) : React__default.createElement("div", {
className: cx('Theme-ColorPicker-input--placeholder')
}, ((_a = findColor(placeholder, themeList)) === null || _a === void 0 ? void 0 : _a.label) || placeholder)), value && !disabled && !readOnly ? React__default.createElement("span", {
className: classnames('Select-clear'),
onClick: handleClean
}, React__default.createElement(Icon, {
icon: "input-clear",
className: "icon"
})) : null, React__default.createElement("span", {
className: cx('Theme-ColorPicker-arrow', show && 'Theme-ColorPicker-arrow--active')
}, React__default.createElement(Icon, {
icon: "right-arrow-bold",
className: "icon"
}))) : null), React__default.createElement(ColorSelect, __assign({}, props, {
needGradient: needGradient !== null && needGradient !== void 0 ? needGradient : false,
needImage: needImage !== null && needImage !== void 0 ? needImage : false,
needTheme: needTheme !== null && needTheme !== void 0 ? needTheme : true,
needCustom: needCustom !== null && needCustom !== void 0 ? needCustom : false,
value: value || placeholder || '',
show: show,
close: function () {
setShow(false);
},
container: container,
target: target,
themeList: themeList,
onChange: onChange
})));
}
function ColorPickerControl(props) {
var _a;
var editorDefaultValue = getValueByPath(props.editorThemePath || '', props.data);
var value = formatInheritData(props.value) || editorDefaultValue;
return React__default.createElement(React__default.Fragment, null, React__default.createElement(ColorPicker, __assign({}, props, {
placeholder: value,
options: props.options || props.data.colorOptions,
labelMode: (_a = props.labelMode) !== null && _a !== void 0 ? _a : 'default',
needGradient: props.needGradient,
needImage: props.needImage,
needTheme: props.needTheme,
needCustom: props.needCustom
})));
}
/** @class */(function (_super) {
__extends(ColorPickerRenderer, _super);
function ColorPickerRenderer() {
return _super !== null && _super.apply(this, arguments) || this;
}
Object.defineProperty(ColorPickerRenderer.prototype, "render", {
enumerable: false,
configurable: true,
writable: true,
value: function () {
var _a;
return React__default.createElement(ColorPickerControl, __assign({}, this.props, {
labelMode: (_a = this.props.labelMode) !== null && _a !== void 0 ? _a : 'default',
needGradient: this.props.needGradient,
needImage: this.props.needImage,
needTheme: this.props.needTheme,
needCustom: this.props.needCustom
}));
}
});
ColorPickerRenderer = __decorate([FormItem({
type: 'amis-theme-color-picker',
strictMode: false,
renderLabel: true
})], ColorPickerRenderer);
return ColorPickerRenderer;
})(React__default.Component);
export { ColorPicker as default };