antd-color-editor
Version:
An open-source color editor for designing color system
403 lines (398 loc) • 15.7 kB
JavaScript
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
import { CollapseTitle } from '@ant-design/pro-editor';
import { useLocalStorageState } from 'ahooks';
import { Tabs } from 'antd';
import { useControls, useCreateStore } from 'leva';
import { memo, useEffect, useMemo, useState } from 'react';
import { advanceConfig, cacheEditorConfig, colorConfig, defineGenerateConfig, displayConfig, editConfig, genScales, hueConfig, neutralAdvanceConfig, neutralConfig, patternConfig, setForceConfig, stepConfig, threeConfig, tokenConfig } from "../genScalesByConfig";
import { AccessPanel, ColorsList, ExportPanel, Footer, JsonView, LevaPanel, NavBar, PanelGroup, ScalePreview, StepFliter, TabKey, ThreeView, TokenView } from "./..";
import { CanvasView, ColorView, EditorView, PanelView } from "../styles";
import { jsx as _jsx } from "react/jsx-runtime";
import { Fragment as _Fragment } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";
var Collapse = CollapseTitle;
var PanelTabKey = /*#__PURE__*/function (PanelTabKey) {
PanelTabKey["access"] = "access";
PanelTabKey["display"] = "display";
PanelTabKey["edit"] = "edit";
PanelTabKey["export"] = "export";
PanelTabKey["pattern"] = "pattern";
return PanelTabKey;
}(PanelTabKey || {});
var ColorStudio = /*#__PURE__*/memo(function (_ref) {
var logo = _ref.logo,
logoHref = _ref.logoHref,
title = _ref.title,
_ref$showFooter = _ref.showFooter,
showFooter = _ref$showFooter === void 0 ? true : _ref$showFooter,
forceConfig = _ref.forceConfig,
onChange = _ref.onChange;
var _useLocalStorageState = useLocalStorageState('antd-color-tabkey', {
defaultValue: TabKey.colors
}),
_useLocalStorageState2 = _slicedToArray(_useLocalStorageState, 2),
tabKey = _useLocalStorageState2[0],
setTabKey = _useLocalStorageState2[1];
var _useLocalStorageState3 = useLocalStorageState('antd-color-panelkey', {
defaultValue: PanelTabKey.edit
}),
_useLocalStorageState4 = _slicedToArray(_useLocalStorageState3, 2),
panelTabKey = _useLocalStorageState4[0],
setPanelTabKey = _useLocalStorageState4[1];
var _useState = useState(cacheEditorConfig.colorList),
_useState2 = _slicedToArray(_useState, 2),
colorList = _useState2[0],
setColorList = _useState2[1];
var _useState3 = useState(cacheEditorConfig.stepFliter),
_useState4 = _slicedToArray(_useState3, 2),
stepFliter = _useState4[0],
setStepFliter = _useState4[1];
useEffect(function () {
if (forceConfig) setForceConfig(forceConfig);
}, []);
/******************************************************
************************* Store **********************
******************************************************/
// 调色
var editStore = useCreateStore();
var hueStore = useCreateStore();
// 调色-L&D
var lightUpStore = useCreateStore();
var lightDownStore = useCreateStore();
var darkUpStore = useCreateStore();
var darkDownStore = useCreateStore();
// 调色-L&D Advance
var lightUpAdvanceStore = useCreateStore();
var lightDownAdvanceStore = useCreateStore();
var darkUpAdvanceStore = useCreateStore();
var darkDownAdvanceStore = useCreateStore();
// 调色-Neutral
var neutralStore = useCreateStore();
var neutralAdvanceStore = useCreateStore();
// 色板
var patternStore = useCreateStore();
var stepStore = useCreateStore();
// 视图
var displayStore = useCreateStore();
var threeStore = useCreateStore();
var tokenStore = useCreateStore();
/******************************************************
************************* Controls *******************
******************************************************/
// 调色
var edit = useControls(editConfig, {
store: editStore
});
var hue = useControls(hueConfig, {
store: hueStore
});
// 调色-L&D
var lightUp = useControls(colorConfig.lightUp, {
store: lightUpStore
});
var lightDown = useControls(colorConfig.lightDown, {
store: lightDownStore
});
var darkUp = useControls(colorConfig.darkUp, {
store: darkUpStore
});
var darkDown = useControls(colorConfig.darkDown, {
store: darkDownStore
});
// 调色-L&D Advance
var lightUpAdvance = useControls(advanceConfig.lightUp, {
store: lightUpAdvanceStore
});
var lightDownAdvance = useControls(advanceConfig.lightDown, {
store: lightDownAdvanceStore
});
// 调色-Neutral
var darkUpAdvance = useControls(advanceConfig.darkUp, {
store: darkUpAdvanceStore
});
var darkDownAdvance = useControls(advanceConfig.darkDown, {
store: darkDownAdvanceStore
});
// 调色-Neutral
var neutral = useControls(neutralConfig, {
store: neutralStore
});
var neutralAdvance = useControls(neutralAdvanceConfig, {
store: neutralAdvanceStore
});
// 色板
var pattern = useControls(patternConfig, {
store: patternStore
});
var step = useControls(stepConfig, {
store: stepStore
});
// 视图
var display = useControls(displayConfig, {
store: displayStore
});
var three = useControls(threeConfig, {
store: threeStore
});
var token = useControls(tokenConfig, {
store: tokenStore
});
/******************************************************
************************* Configs ********************
******************************************************/
var generateConfig = defineGenerateConfig({
darkDown: darkDown,
darkDownAdvance: darkDownAdvance,
darkUp: darkUp,
darkUpAdvance: darkUpAdvance,
edit: edit,
hue: hue,
lightDown: lightDown,
lightDownAdvance: lightDownAdvance,
lightUp: lightUp,
lightUpAdvance: lightUpAdvance,
neutral: neutral,
neutralAdvance: neutralAdvance,
step: step
});
var editorConfig = {
colorList: colorList,
generate: generateConfig,
stepFliter: stepFliter,
system: {
edit: edit,
pattern: pattern
}
};
/******************************************************
********************** PanelGroup ********************
******************************************************/
var editPanelGroup = [{
header: '调色配置',
panel: /*#__PURE__*/_jsx(LevaPanel, {
store: editStore
})
}, {
header: edit.isolateEdit ? 'LIGHT 上梯度' : '上梯度',
panel: /*#__PURE__*/_jsxs(_Fragment, {
children: [/*#__PURE__*/_jsx(LevaPanel, {
store: lightUpStore
}), /*#__PURE__*/_jsx(Collapse, {
title: "\u9AD8\u7EA7\u914D\u7F6E",
children: /*#__PURE__*/_jsx(LevaPanel, {
store: lightUpAdvanceStore
})
})]
})
}, {
header: edit.isolateEdit ? 'LIGHT 下梯度' : '下梯度',
panel: /*#__PURE__*/_jsxs(_Fragment, {
children: [/*#__PURE__*/_jsx(LevaPanel, {
store: lightDownStore
}), /*#__PURE__*/_jsx(Collapse, {
title: "\u9AD8\u7EA7\u914D\u7F6E",
children: /*#__PURE__*/_jsx(LevaPanel, {
store: lightDownAdvanceStore
})
})]
})
}, {
header: 'DARK 上梯度',
hidden: !edit.isolateEdit,
panel: /*#__PURE__*/_jsxs(_Fragment, {
children: [/*#__PURE__*/_jsx(LevaPanel, {
store: darkUpStore
}), /*#__PURE__*/_jsx(Collapse, {
title: "\u9AD8\u7EA7\u914D\u7F6E",
children: /*#__PURE__*/_jsx(LevaPanel, {
store: darkUpAdvanceStore
})
})]
})
}, {
header: 'DARK 下梯度',
hidden: !edit.isolateEdit,
panel: /*#__PURE__*/_jsxs(_Fragment, {
children: [/*#__PURE__*/_jsx(LevaPanel, {
store: darkDownStore
}), /*#__PURE__*/_jsx(Collapse, {
title: "\u9AD8\u7EA7\u914D\u7F6E",
children: /*#__PURE__*/_jsx(LevaPanel, {
store: darkDownAdvanceStore
})
})]
})
}, {
header: '色相旋转补偿',
panel: /*#__PURE__*/_jsx(LevaPanel, {
store: hueStore
})
}, {
header: 'Neutal 中性色',
panel: /*#__PURE__*/_jsxs(_Fragment, {
children: [/*#__PURE__*/_jsx(LevaPanel, {
store: neutralStore
}), /*#__PURE__*/_jsx(Collapse, {
title: "\u9AD8\u7EA7\u914D\u7F6E",
children: /*#__PURE__*/_jsx(LevaPanel, {
store: neutralAdvanceStore
})
})]
})
}];
var patternPanelGroup = [{
header: '色板配置',
panel: /*#__PURE__*/_jsx(LevaPanel, {
store: patternStore
})
}, {
header: '梯度阶梯',
panel: /*#__PURE__*/_jsx(LevaPanel, {
store: stepStore
})
}, {
header: '梯度筛选',
hidden: !pattern.isFliterStep,
panel: /*#__PURE__*/_jsx(StepFliter, {
color: colorList[0],
config: generateConfig,
defaultFliter: stepFliter,
onChange: setStepFliter
})
}, {
header: '色板列表',
panel: /*#__PURE__*/_jsx(ColorsList, {
colorList: colorList,
isolateDark: pattern.isolateDark,
setColorList: setColorList
})
}];
var displayPanelGroup = [{
header: '展示配置',
panel: /*#__PURE__*/_jsxs(_Fragment, {
children: [/*#__PURE__*/_jsx(LevaPanel, {
store: displayStore
}), /*#__PURE__*/_jsx(Collapse, {
defaultExpand: true,
title: "\u6A21\u578B\u89C6\u56FE",
children: /*#__PURE__*/_jsx(LevaPanel, {
store: threeStore
})
})]
})
}];
var exportPanelGroup = [{
header: '变量配置',
panel: /*#__PURE__*/_jsx(LevaPanel, {
store: tokenStore
})
}];
var colorListScale = colorList.map(function (c, index) {
var _genScales = genScales(c, editorConfig),
scales = _genScales.scales,
color = _genScales.color,
darkColor = _genScales.darkColor;
return {
color: color,
darkColor: darkColor,
dom: /*#__PURE__*/_jsx(ScalePreview, {
color: _objectSpread(_objectSpread({}, c), {}, {
color: color,
darkColor: darkColor
}),
config: editorConfig,
displayConfig: display,
scales: scales
}, index),
name: c.title,
scales: scales
};
});
useEffect(function () {
// @ts-ignore
if (onChange) onChange(colorListScale.map(function (c) {
return {
name: c.name,
scales: c.scales
};
}));
}, [editorConfig]);
var items = useMemo(function () {
return [{
children: /*#__PURE__*/_jsx(PanelGroup, {
panels: editPanelGroup
}),
key: PanelTabKey.edit,
label: '调色'
}, {
children: /*#__PURE__*/_jsx(PanelGroup, {
panels: patternPanelGroup
}),
key: PanelTabKey.pattern,
label: '色板'
}, {
children: /*#__PURE__*/_jsx(AccessPanel, {
data: colorListScale
}),
key: PanelTabKey.access,
label: '可读性'
}, {
children: /*#__PURE__*/_jsx(PanelGroup, {
panels: displayPanelGroup
}),
key: PanelTabKey.display,
label: '视图'
}, {
children: /*#__PURE__*/_jsxs(_Fragment, {
children: [/*#__PURE__*/_jsx(PanelGroup, {
panels: exportPanelGroup
}), /*#__PURE__*/_jsx(ExportPanel, {
config: editorConfig
})]
}),
key: PanelTabKey.export,
label: '存储'
}];
}, [editPanelGroup, patternPanelGroup, colorListScale, displayPanelGroup, exportPanelGroup]);
return /*#__PURE__*/_jsxs(EditorView, {
children: [/*#__PURE__*/_jsxs(CanvasView, {
children: [/*#__PURE__*/_jsx(NavBar, {
logo: logo,
logoHref: logoHref,
setTabKey: setTabKey,
tabKey: tabKey || TabKey.colors,
title: title
}), tabKey === TabKey.colors && /*#__PURE__*/_jsxs(ColorView, {
children: [colorListScale.map(function (color) {
return color.dom;
}), showFooter && /*#__PURE__*/_jsx(Footer, {})]
}), tabKey === TabKey.three && /*#__PURE__*/_jsx(ThreeView, {
config: _objectSpread(_objectSpread({}, three), display),
data: colorListScale
}), tabKey === TabKey.token && /*#__PURE__*/_jsx(TokenView, {
config: token,
data: colorListScale
}), tabKey === TabKey.config && /*#__PURE__*/_jsx(JsonView, {
data: editorConfig
})]
}), /*#__PURE__*/_jsx(PanelView, {
children: /*#__PURE__*/_jsx(Tabs, {
defaultActiveKey: panelTabKey,
items: items,
onChange: setPanelTabKey
})
})]
});
});
export default ColorStudio;