@canlooks/can-ui 0.0.103 → 0.0.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/cjs/components/card/card.d.ts +1 -1
  2. package/dist/cjs/components/card/card.js +1 -2
  3. package/dist/cjs/components/card/card.style.js +9 -5
  4. package/dist/cjs/components/dataGrid/dataGrid.d.ts +14 -0
  5. package/dist/cjs/components/dataGrid/dataGrid.style.js +2 -2
  6. package/dist/cjs/components/dataGrid/dataGridHead.js +5 -1
  7. package/dist/cjs/components/dataGrid/filterBubbleContent.d.ts +1 -1
  8. package/dist/cjs/components/dataGrid/filterBubbleContent.js +4 -4
  9. package/dist/cjs/components/inputBase/inputBase.d.ts +2 -2
  10. package/dist/cjs/components/pagination/jumper.d.ts +2 -1
  11. package/dist/cjs/components/serialInput/serialInput.js +21 -7
  12. package/dist/cjs/components/table/table.style.js +2 -2
  13. package/dist/cjs/components/theme/index.d.ts +2 -0
  14. package/dist/cjs/components/theme/index.js +2 -0
  15. package/dist/cjs/components/theme/themeContext.js +15 -9
  16. package/dist/cjs/components/theme/themeMethods.d.ts +11 -0
  17. package/dist/cjs/components/theme/themeMethods.js +70 -0
  18. package/dist/cjs/components/theme/themeRegistry.d.ts +5 -0
  19. package/dist/cjs/components/theme/themeRegistry.js +20 -0
  20. package/dist/cjs/components/theme/themeTypes.d.ts +6 -3
  21. package/dist/cjs/components/theme/themeVariables.d.ts +5 -13
  22. package/dist/cjs/components/theme/themeVariables.js +5 -67
  23. package/dist/cjs/components/tree/tree.style.js +2 -4
  24. package/dist/cjs/components/tree/treeDnd.style.js +1 -1
  25. package/dist/esm/components/card/card.d.ts +1 -1
  26. package/dist/esm/components/card/card.js +1 -2
  27. package/dist/esm/components/card/card.style.js +9 -5
  28. package/dist/esm/components/dataGrid/dataGrid.d.ts +14 -0
  29. package/dist/esm/components/dataGrid/dataGrid.style.js +2 -2
  30. package/dist/esm/components/dataGrid/dataGridHead.js +5 -1
  31. package/dist/esm/components/dataGrid/filterBubbleContent.d.ts +1 -1
  32. package/dist/esm/components/dataGrid/filterBubbleContent.js +5 -5
  33. package/dist/esm/components/inputBase/inputBase.d.ts +2 -2
  34. package/dist/esm/components/pagination/jumper.d.ts +2 -1
  35. package/dist/esm/components/serialInput/serialInput.js +21 -7
  36. package/dist/esm/components/table/table.style.js +2 -2
  37. package/dist/esm/components/theme/index.d.ts +2 -0
  38. package/dist/esm/components/theme/index.js +2 -0
  39. package/dist/esm/components/theme/themeContext.js +13 -7
  40. package/dist/esm/components/theme/themeMethods.d.ts +11 -0
  41. package/dist/esm/components/theme/themeMethods.js +65 -0
  42. package/dist/esm/components/theme/themeRegistry.d.ts +5 -0
  43. package/dist/esm/components/theme/themeRegistry.js +15 -0
  44. package/dist/esm/components/theme/themeTypes.d.ts +6 -3
  45. package/dist/esm/components/theme/themeVariables.d.ts +5 -13
  46. package/dist/esm/components/theme/themeVariables.js +4 -64
  47. package/dist/esm/components/tree/tree.style.js +2 -4
  48. package/dist/esm/components/tree/treeDnd.style.js +1 -1
  49. package/documentation/bootstrap.mjs +8 -0
  50. package/documentation/dist/assets/{index-DvrKS6Tv.js → index-UNtoAKsZ.js} +5326 -4849
  51. package/documentation/dist/index.html +1 -1
  52. package/documentation/vite.config.mjs +22 -0
  53. package/extensions/curd/index.d.ts +1 -0
  54. package/extensions/{curd.cjs → curd/index.js} +4 -5
  55. package/extensions/curd/index.mjs +1 -0
  56. package/extensions/curd/package.json +12 -0
  57. package/extensions/documentViewer/index.d.ts +1 -0
  58. package/extensions/{textFormatter.cjs → documentViewer/index.js} +4 -5
  59. package/extensions/documentViewer/index.mjs +1 -0
  60. package/extensions/documentViewer/package.json +12 -0
  61. package/extensions/reactiveForm/index.d.ts +1 -0
  62. package/extensions/{documentViewer.cjs → reactiveForm/index.js} +4 -5
  63. package/extensions/reactiveForm/index.mjs +1 -0
  64. package/extensions/reactiveForm/package.json +12 -0
  65. package/extensions/textFormatter/index.d.ts +1 -0
  66. package/extensions/{reactiveForm.cjs → textFormatter/index.js} +1 -2
  67. package/extensions/textFormatter/index.mjs +1 -0
  68. package/extensions/textFormatter/package.json +12 -0
  69. package/package.json +4 -4
  70. package/dist/cjs/components/transportStyle/transportStyle.style.d.ts +0 -1
  71. package/dist/cjs/components/transportStyle/transportStyle.style.js +0 -57
  72. package/dist/esm/components/transportStyle/transportStyle.style.d.ts +0 -1
  73. package/dist/esm/components/transportStyle/transportStyle.style.js +0 -54
  74. package/extensions/curd.d.ts +0 -1
  75. package/extensions/curd.js +0 -1
  76. package/extensions/documentViewer.d.ts +0 -1
  77. package/extensions/documentViewer.js +0 -1
  78. package/extensions/reactiveForm.d.ts +0 -1
  79. package/extensions/reactiveForm.js +0 -1
  80. package/extensions/textFormatter.d.ts +0 -1
  81. package/extensions/textFormatter.js +0 -1
@@ -4,7 +4,7 @@ export interface CardProps extends FlexProps {
4
4
  flexable?: boolean;
5
5
  /** 是否显示边框,默认为`false` */
6
6
  bordered?: boolean;
7
- /** @ 支持0-5,明亮主题表示阴影的程度,默认为`0`; 暗黑主题表示背景色,默认为`2` */
7
+ /** 支持0-5,明亮主题表示阴影的程度, 暗黑主题表示背景色,默认为`0` */
8
8
  elevation?: number;
9
9
  /** 默认为{@link Theme.borderRadius} */
10
10
  borderRadius?: number;
@@ -6,10 +6,9 @@ const card_style_1 = require("./card.style");
6
6
  const utils_1 = require("../../utils");
7
7
  const theme_1 = require("../theme");
8
8
  const flex_1 = require("../flex");
9
- function Card({ flexable, bordered, elevation, borderRadius, ...props }) {
9
+ function Card({ flexable, bordered, elevation = 0, borderRadius, ...props }) {
10
10
  const theme = (0, theme_1.useTheme)();
11
11
  borderRadius ??= theme.borderRadius;
12
- elevation ??= theme.mode === 'light' ? 0 : 2;
13
12
  return ((0, jsx_runtime_1.jsx)(flex_1.Flex, { direction: "column", ...props, css: card_style_1.style, className: (0, utils_1.clsx)(card_style_1.classes.root, props.className), style: {
14
13
  display: flexable ? 'flex' : void 0,
15
14
  borderRadius,
@@ -40,16 +40,20 @@ exports.style = (0, utils_1.defineCss)(({ spacing, mode, background, divider, bo
40
40
  @layer reset {
41
41
  padding: ${spacing[8]}px;
42
42
 
43
+ &[data-bordered=true] {
44
+ border: 1px solid ${divider};
45
+ }
46
+
43
47
  &[data-elevation="0"] {
44
- background-color: ${gray(.1)};
48
+ background-color: ${gray(.14)};
45
49
  }
46
50
 
47
51
  &[data-elevation="1"] {
48
- background-color: ${gray(.14)};
52
+ background-color: ${gray(.18)};
49
53
  }
50
54
 
51
55
  &[data-elevation="2"] {
52
- background-color: ${gray(.2)};
56
+ background-color: ${gray(.22)};
53
57
  }
54
58
 
55
59
  &[data-elevation="3"] {
@@ -57,11 +61,11 @@ exports.style = (0, utils_1.defineCss)(({ spacing, mode, background, divider, bo
57
61
  }
58
62
 
59
63
  &[data-elevation="4"] {
60
- background-color: ${gray(.34)};
64
+ background-color: ${gray(.30)};
61
65
  }
62
66
 
63
67
  &[data-elevation="5"] {
64
- background-color: ${gray(.45)};
68
+ background-color: ${gray(.34)};
65
69
  }
66
70
  }
67
71
  `
@@ -27,7 +27,21 @@ export interface ColumnType<R extends RowType = RowType> extends Omit<ComponentP
27
27
  /**
28
28
  * @enum true 不会弹出气泡框,需配合{@link DataGridBaseProps.onFilterClick}实现筛选逻辑
29
29
  * @enum FilterOptionsProps 传递至`OptionsBase`组件
30
+ * @example FilterOptionsProps
31
+ * {
32
+ * filter: {
33
+ * options: [
34
+ * {value: '1', label: '选项1‘}
35
+ * ]
36
+ * }
37
+ * }
30
38
  * @enum FilterControlProps 自定义渲染气泡内容
39
+ * @example FilterControlProps
40
+ * {
41
+ * filter: {
42
+ * control: <Input/>
43
+ * }
44
+ * }
31
45
  */
32
46
  filter?: boolean | FilterOptionsProps | FilterControlProps;
33
47
  /** @private 内部使用,在{@link useDataGridColumns}内赋值 */
@@ -62,12 +62,12 @@ exports.style = (0, utils_1.defineCss)(({ spacing, mode, gray, text, colors, eas
62
62
  -webkit-tap-highlight-color: transparent;
63
63
 
64
64
  &:hover {
65
- background-color: ${gray(mode === 'light' ? .05 : .26)};
65
+ background-color: ${gray(mode === 'light' ? .05 : .2)};
66
66
  }
67
67
 
68
68
  &:active {
69
69
  transition: background-color 0s;
70
- background-color: ${gray(mode === 'light' ? .01 : .22)};
70
+ background-color: ${gray(mode === 'light' ? .09 : .24)};
71
71
  }
72
72
 
73
73
  &[data-ordering=true] {
@@ -16,6 +16,8 @@ const button_1 = require("../button");
16
16
  const faFilter_1 = require("@fortawesome/free-solid-svg-icons/faFilter");
17
17
  const bubble_1 = require("../bubble");
18
18
  const filterBubbleContent_1 = require("./filterBubbleContent");
19
+ const form_1 = require("../form");
20
+ const utils_1 = require("../../utils");
19
21
  exports.DataGridHead = (0, react_2.memo)(({ allowSelectAll, columnResizable, flattedColumns, completedColumns, rows, primaryKey, orderColumn, orderType, onOrderChange, onFilterClick }) => {
20
22
  const { multiple, setValue, selectionStatus } = (0, selectionContext_1.useSelectionContext)();
21
23
  const allSelectionStatus = (0, react_2.useMemo)(() => {
@@ -33,6 +35,7 @@ exports.DataGridHead = (0, react_2.memo)(({ allowSelectAll, columnResizable, fla
33
35
  ? setValue(rows?.flatMap(r => r[primaryKey] ?? []) || [])
34
36
  : setValue([]);
35
37
  };
38
+ const { formValue } = (0, form_1.useFormValueContext)();
36
39
  const renderedHead = (0, columnResize_1.useRenderHead)(Column => {
37
40
  const columnDefinitions = columnResizable ? flattedColumns : completedColumns;
38
41
  if (!columnDefinitions) {
@@ -83,7 +86,8 @@ exports.DataGridHead = (0, react_2.memo)(({ allowSelectAll, columnResizable, fla
83
86
  const sortable = sorter && !children?.length;
84
87
  const isOrderingColumn = orderColumn === _key;
85
88
  const currentOrderType = isOrderingColumn ? orderType : 'descend';
86
- const filterButton = ((0, jsx_runtime_1.jsx)(button_1.Button, { className: dataGrid_style_1.classes.filterButton, variant: "plain", color: "text.placeholder", onClick: e => {
89
+ const isFilteredColumn = !(0, utils_1.isUnset)(formValue?.[_key]);
90
+ const filterButton = ((0, jsx_runtime_1.jsx)(button_1.Button, { className: dataGrid_style_1.classes.filterButton, variant: "plain", color: isFilteredColumn ? 'primary' : 'text.placeholder', onClick: e => {
87
91
  e.stopPropagation();
88
92
  onFilterClick?.(_key, e);
89
93
  }, children: (0, jsx_runtime_1.jsx)(icon_1.Icon, { icon: faFilter_1.faFilter }) }));
@@ -2,7 +2,7 @@ import { MenuOptionType, OptionsBaseProps } from '../optionsBase';
2
2
  import { Id } from '../../types';
3
3
  import { FormItemChildren } from '../form';
4
4
  type FilterSharedProps = {
5
- /** 是否显示`重置`与`确定`按钮,默认为`true` */
5
+ /** 是否显示`重置`按钮,默认为`true` */
6
6
  showButton?: boolean;
7
7
  };
8
8
  export interface FilterOptionsProps extends FilterSharedProps, OptionsBaseProps<MenuOptionType> {
@@ -22,10 +22,10 @@ exports.FilterBubbleContent = (0, react_1.memo)(({ columnKey, columnFilterProps
22
22
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(form_1.FormItem, { field: columnKey, children: 'control' in columnFilterProps
23
23
  ? columnFilterProps.control
24
24
  : (0, jsx_runtime_1.jsx)(FilterOptions, { ...columnFilterProps }) }), columnFilterProps.showButton !== false
25
- ? (0, jsx_runtime_1.jsxs)(flex_1.Flex, { gap: 6, justifyContent: "flex-end", marginTop: 6, children: [(0, jsx_runtime_1.jsx)(button_1.Button, { variant: "text", onClick: () => {
26
- formRef.current.setFieldValue(columnKey, null);
27
- setOpen(false);
28
- }, children: "\u91CD\u7F6E" }), (0, jsx_runtime_1.jsx)(button_1.Button, { onClick: () => setOpen(false), children: "\u786E\u5B9A" })] })
25
+ ? (0, jsx_runtime_1.jsx)(flex_1.Flex, { gap: 6, justifyContent: "center", marginTop: 6, children: (0, jsx_runtime_1.jsx)(button_1.Button, { variant: "text", onClick: () => {
26
+ formRef.current.setFieldValue(columnKey, null);
27
+ setOpen(false);
28
+ }, children: "\u91CD\u7F6E" }) })
29
29
  : (0, jsx_runtime_1.jsx)(TriggerFilterOnChange, {})] }));
30
30
  });
31
31
  const FilterOptions = (0, react_1.memo)(({ multiple = true, showButton = true, value, onChange, ...props }) => {
@@ -1,8 +1,8 @@
1
1
  import { ComponentProps, ReactElement, ReactNode, Ref } from 'react';
2
2
  import { ColorPropsValue, DivProps, Size } from '../../types';
3
3
  export interface InputBaseRef extends HTMLDivElement {
4
- select?: HTMLInputElement['select'];
5
- setSelectionRange?: HTMLInputElement['setSelectionRange'];
4
+ select: HTMLInputElement['select'];
5
+ setSelectionRange: HTMLInputElement['setSelectionRange'];
6
6
  }
7
7
  export interface InputBaseProps<T extends 'input' | 'textarea'> extends Omit<DivProps, 'ref' | 'prefix' | 'onChange' | 'children'> {
8
8
  ref?: Ref<InputBaseRef>;
@@ -1,8 +1,9 @@
1
1
  import { Ref } from 'react';
2
2
  import { DivProps } from '../../types';
3
3
  import { InputProps } from '../input';
4
+ import { InputBaseRef } from '../inputBase';
4
5
  export interface PaginationJumperProps extends DivProps {
5
6
  InputProps?: InputProps;
6
- InputRef?: Ref<HTMLDivElement>;
7
+ InputRef?: Ref<InputBaseRef>;
7
8
  }
8
9
  export declare const PaginationJumper: import("react").MemoExoticComponent<({ InputProps, InputRef, ...props }: PaginationJumperProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
@@ -36,14 +36,28 @@ exports.SerialInput = (0, react_2.memo)(({ separator, count = 1, defaultValue, v
36
36
  onFinish?.(newValue);
37
37
  }
38
38
  }
39
- else if (0 < index && prevLength === 1 && curr.length === 0) {
40
- // 聚焦前一个输入框
41
- inputRefs.current[index - 1].focus();
42
- }
43
39
  },
44
- onKeyDown: ({ key }) => {
45
- if (key === 'Backspace' && innerValue.current[index].length === 0 && 0 < index) {
46
- inputRefs.current[index - 1].focus();
40
+ onKeyDown: (e) => {
41
+ switch (e.key) {
42
+ case 'Backspace':
43
+ if (innerValue.current[index].length === 0 && index > 0) {
44
+ const prevInput = inputRefs.current[index - 1];
45
+ prevInput.focus();
46
+ const selectionIndex = innerValue.current[index - 1].length;
47
+ prevInput.setSelectionRange(selectionIndex, selectionIndex);
48
+ }
49
+ break;
50
+ case 'ArrowRight':
51
+ if (index < count - 1) {
52
+ e.preventDefault();
53
+ inputRefs.current[index + 1].focus();
54
+ }
55
+ break;
56
+ case 'ArrowLeft':
57
+ if (index > 0) {
58
+ e.preventDefault();
59
+ inputRefs.current[index - 1].focus();
60
+ }
47
61
  }
48
62
  }
49
63
  });
@@ -10,8 +10,8 @@ exports.classes = (0, utils_1.defineInnerClasses)('table', [
10
10
  'cell'
11
11
  ]);
12
12
  exports.style = (0, utils_1.defineCss)(({ mode, spacing, gray, divider, background, easing, colors }) => {
13
- const headerBg = gray(mode === 'light' ? .03 : .22);
14
- const stripedBg = gray(mode === 'light' ? .02 : .21);
13
+ const headerBg = gray(mode === 'light' ? .03 : .18);
14
+ const stripedBg = gray(mode === 'light' ? .02 : .16);
15
15
  const selectedBg = (0, color_1.default)(colors.primary.main).alpha(mode === 'light' ? .05 : .1).string();
16
16
  return (0, react_1.css) `
17
17
  @layer reset {
@@ -1,3 +1,5 @@
1
1
  export * from './themeContext';
2
+ export * from './themeMethods';
3
+ export * from './themeRegistry';
2
4
  export * from './themeTypes';
3
5
  export * from './themeVariables';
@@ -2,5 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./themeContext"), exports);
5
+ tslib_1.__exportStar(require("./themeMethods"), exports);
6
+ tslib_1.__exportStar(require("./themeRegistry"), exports);
5
7
  tslib_1.__exportStar(require("./themeTypes"), exports);
6
8
  tslib_1.__exportStar(require("./themeVariables"), exports);
@@ -7,24 +7,30 @@ const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
7
7
  const react_1 = require("react");
8
8
  const themeVariables_1 = require("./themeVariables");
9
9
  const utils_1 = require("../../utils");
10
- exports.ThemeContext = (0, react_1.createContext)((0, themeVariables_1.defineTheme)(themeVariables_1.defaultLightTheme));
10
+ const themeMethods_1 = require("./themeMethods");
11
+ const themeRegistry_1 = require("./themeRegistry");
12
+ exports.ThemeContext = (0, react_1.createContext)((0, themeMethods_1.defineTheme)(themeVariables_1.defaultLightTheme));
11
13
  function useTheme() {
12
14
  return (0, react_1.useContext)(exports.ThemeContext);
13
15
  }
14
16
  function ThemeProvider({ theme, children }) {
15
17
  const parentTheme = useTheme();
16
- const [currentTheme, setCurrentTheme] = (0, utils_1.useDerivedState)(theme);
18
+ const resolvedThemeDefinition = (0, react_1.useMemo)(() => {
19
+ return theme?.name
20
+ ? (0, utils_1.mergeDeep)({}, (0, themeRegistry_1.getTheme)(theme.name), theme)
21
+ : theme;
22
+ }, [theme]);
23
+ const [currentTheme, setCurrentTheme] = (0, utils_1.useDerivedState)(resolvedThemeDefinition);
17
24
  const mergedThemeDefinition = (0, react_1.useMemo)(() => {
18
- return (0, utils_1.mergeDeep)({}, (0, themeVariables_1.restoreThemeDefinition)(parentTheme), parentTheme.mode === 'light' && currentTheme.current?.mode === 'dark' ? themeVariables_1.defaultDarkTheme : void 0, parentTheme.mode === 'dark' && currentTheme.current?.mode === 'light' ? themeVariables_1.defaultLightTheme : void 0, currentTheme.current);
25
+ return (0, utils_1.mergeDeep)({}, (0, themeMethods_1.restoreThemeDefinition)(parentTheme), parentTheme.mode === 'light' && currentTheme.current?.mode === 'dark' ? themeVariables_1.defaultDarkTheme : void 0, parentTheme.mode === 'dark' && currentTheme.current?.mode === 'light' ? themeVariables_1.defaultLightTheme : void 0, currentTheme.current);
19
26
  }, [currentTheme.current, parentTheme]);
20
27
  const themeContextValue = (0, react_1.useMemo)(() => {
21
- const value = (0, themeVariables_1.defineTheme)(mergedThemeDefinition);
22
- value._sub = true;
28
+ const value = (0, themeMethods_1.defineTheme)(mergedThemeDefinition);
23
29
  value.update = theme => {
24
- const newThemeDefinition = typeof theme === 'function' ? theme(value) : theme;
25
- setCurrentTheme(prev => {
26
- return (0, utils_1.mergeDeep)({ ...prev }, newThemeDefinition);
27
- });
30
+ setCurrentTheme(typeof theme === 'function' ? theme(value) : theme);
31
+ };
32
+ value.set = name => {
33
+ value.update((0, themeRegistry_1.getTheme)(name));
28
34
  };
29
35
  return value;
30
36
  }, [mergedThemeDefinition]);
@@ -0,0 +1,11 @@
1
+ import { PartialTheme, ThemeDefinition } from './themeTypes';
2
+ /**
3
+ * 将主题定义对象转换成使用对象
4
+ * @param themeDefinition
5
+ */
6
+ export declare function defineTheme(themeDefinition: ThemeDefinition): PartialTheme;
7
+ /**
8
+ * 将主题使用对象还原成定义对象
9
+ * @param theme
10
+ */
11
+ export declare function restoreThemeDefinition(theme: PartialTheme): ThemeDefinition;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineTheme = defineTheme;
4
+ exports.restoreThemeDefinition = restoreThemeDefinition;
5
+ const tslib_1 = require("tslib");
6
+ const color_1 = tslib_1.__importDefault(require("color"));
7
+ /**
8
+ * ---------------------------------------------------------------------
9
+ * 生成单个颜色的其他明亮度配色,0 至 10,数字越小颜色越淡(亮),数字越大颜色越深(暗)
10
+ */
11
+ function defineColorMembers(color) {
12
+ const member = Array();
13
+ member.toString = () => color;
14
+ const colorObj = (0, color_1.default)(color);
15
+ for (let i = 0; i <= 4; i++) {
16
+ Object.defineProperty(member, i, {
17
+ get: () => colorObj.lighten(1 - (i + 1) / 6).hex()
18
+ });
19
+ }
20
+ member[5] = color;
21
+ for (let i = 6; i <= 10; i++) {
22
+ Object.defineProperty(member, i, {
23
+ get: () => colorObj.darken((i - 5) / 6).hex()
24
+ });
25
+ }
26
+ member.main = member[5];
27
+ Object.defineProperties(member, {
28
+ light: {
29
+ get: () => member[3]
30
+ },
31
+ dark: {
32
+ get: () => member[7]
33
+ }
34
+ });
35
+ return member;
36
+ }
37
+ /**
38
+ * 将主题定义对象转换成使用对象
39
+ * @param themeDefinition
40
+ */
41
+ function defineTheme(themeDefinition) {
42
+ if (!themeDefinition.colors) {
43
+ return themeDefinition;
44
+ }
45
+ const colors = {};
46
+ for (const k in themeDefinition.colors) {
47
+ const color = themeDefinition.colors[k];
48
+ if (color) {
49
+ colors[k] = defineColorMembers(color);
50
+ }
51
+ }
52
+ return { ...themeDefinition, colors };
53
+ }
54
+ /**
55
+ * 将主题使用对象还原成定义对象
56
+ * @param theme
57
+ */
58
+ function restoreThemeDefinition(theme) {
59
+ if (!theme.colors) {
60
+ return theme;
61
+ }
62
+ const colors = {};
63
+ for (const k in theme.colors) {
64
+ const colorMembers = theme.colors[k];
65
+ if (colorMembers) {
66
+ colors[k] = colorMembers.main;
67
+ }
68
+ }
69
+ return { ...theme, colors };
70
+ }
@@ -0,0 +1,5 @@
1
+ import { NamedThemeDefinition, ThemeDefinition } from './themeTypes';
2
+ export declare const themeMap: Map<string, NamedThemeDefinition>;
3
+ export declare function getTheme(name: string): NamedThemeDefinition;
4
+ export declare function registerTheme(name: string, theme: ThemeDefinition): void;
5
+ export declare function registerTheme(theme: NamedThemeDefinition): void;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.themeMap = void 0;
4
+ exports.getTheme = getTheme;
5
+ exports.registerTheme = registerTheme;
6
+ const themeVariables_1 = require("./themeVariables");
7
+ exports.themeMap = new Map();
8
+ function getTheme(name) {
9
+ const registeredTheme = exports.themeMap.get(name);
10
+ if (!registeredTheme) {
11
+ throw Error(`Cannot find theme "${name}", call "registerTheme()" first.`);
12
+ }
13
+ return registeredTheme;
14
+ }
15
+ function registerTheme(a, b) {
16
+ const theme = b ? { ...b, name: a } : { ...a };
17
+ exports.themeMap.set(theme.name, theme);
18
+ }
19
+ registerTheme(themeVariables_1.defaultLightTheme);
20
+ registerTheme(themeVariables_1.defaultDarkTheme);
@@ -21,6 +21,7 @@ export type ThemeEasing = {
21
21
  };
22
22
  /** 主题的使用对象 */
23
23
  export type Theme = {
24
+ name: string;
24
25
  mode: ThemeMode;
25
26
  fontSize: number;
26
27
  fontFamily: string;
@@ -42,10 +43,9 @@ export type Theme = {
42
43
  breakpoints: ResponsiveValue;
43
44
  zoom: number;
44
45
  update: (themeDefinition: ThemeDefinition | ((currentTheme: Theme) => ThemeDefinition)) => void;
45
- /** @private */
46
- _sub?: boolean;
46
+ set: (name: string) => void;
47
47
  };
48
- export interface PartialTheme extends Partial<Omit<Theme, 'colors' | 'text' | 'background' | 'easing' | 'breakpoints' | 'update'>> {
48
+ export interface PartialTheme extends Partial<Omit<Theme, 'colors' | 'text' | 'background' | 'easing' | 'breakpoints' | 'update' | 'set'>> {
49
49
  colors?: Partial<ThemeColors>;
50
50
  text?: Partial<ThemeTextColors>;
51
51
  background?: Partial<ThemeBackgroundColor>;
@@ -58,3 +58,6 @@ export interface ThemeDefinition extends Omit<PartialTheme, 'colors'> {
58
58
  [P in ColorPresets]?: string;
59
59
  };
60
60
  }
61
+ export type NamedThemeDefinition = Omit<ThemeDefinition, 'name'> & {
62
+ name: string;
63
+ };
@@ -1,15 +1,5 @@
1
1
  import { ResponsiveValue } from '../../types';
2
- import { PartialTheme, ThemeDefinition } from './themeTypes';
3
- /**
4
- * 将主题定义对象转换成使用对象
5
- * @param themeDefinition
6
- */
7
- export declare function defineTheme(themeDefinition: ThemeDefinition): PartialTheme;
8
- /**
9
- * 将主题使用对象还原成定义对象
10
- * @param theme
11
- */
12
- export declare function restoreThemeDefinition(theme: PartialTheme): ThemeDefinition;
2
+ import { NamedThemeDefinition } from './themeTypes';
13
3
  /**
14
4
  * ---------------------------------------------------------------------
15
5
  * 统一全局zIndex
@@ -30,9 +20,11 @@ export declare const defaultMonospaceFontFamily = "'Consolas', 'SF Mono', 'Casca
30
20
  * ---------------------------------------------------------------------
31
21
  * 默认的明亮主题配置
32
22
  */
33
- export declare const defaultLightTheme: ThemeDefinition;
23
+ export declare const DEFAULT_LIGHT: "default-light";
24
+ export declare const defaultLightTheme: NamedThemeDefinition;
34
25
  /**
35
26
  * ---------------------------------------------------------------------
36
27
  * 默认的黑暗主题配置
37
28
  */
38
- export declare const defaultDarkTheme: ThemeDefinition;
29
+ export declare const DEFAULT_DARK: "default-dark";
30
+ export declare const defaultDarkTheme: NamedThemeDefinition;
@@ -1,8 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defaultDarkTheme = exports.defaultLightTheme = exports.defaultMonospaceFontFamily = exports.defaultFontFamily = exports.defaultBreakpoints = exports.zIndex = void 0;
4
- exports.defineTheme = defineTheme;
5
- exports.restoreThemeDefinition = restoreThemeDefinition;
3
+ exports.defaultDarkTheme = exports.DEFAULT_DARK = exports.defaultLightTheme = exports.DEFAULT_LIGHT = exports.defaultMonospaceFontFamily = exports.defaultFontFamily = exports.defaultBreakpoints = exports.zIndex = void 0;
6
4
  const tslib_1 = require("tslib");
7
5
  const color_1 = tslib_1.__importDefault(require("color"));
8
6
  /**
@@ -28,70 +26,6 @@ function generateSpacing() {
28
26
  }
29
27
  return spacing;
30
28
  }
31
- /**
32
- * ---------------------------------------------------------------------
33
- * 生成单个颜色的其他明亮度配色,0 至 10,数字越小颜色越淡(亮),数字越大颜色越深(暗)
34
- */
35
- function defineColorMembers(color) {
36
- const member = Array();
37
- member.toString = () => color;
38
- const colorObj = (0, color_1.default)(color);
39
- for (let i = 0; i <= 4; i++) {
40
- Object.defineProperty(member, i, {
41
- get: () => colorObj.lighten(1 - (i + 1) / 6).hex()
42
- });
43
- }
44
- member[5] = color;
45
- for (let i = 6; i <= 10; i++) {
46
- Object.defineProperty(member, i, {
47
- get: () => colorObj.darken((i - 5) / 6).hex()
48
- });
49
- }
50
- member.main = member[5];
51
- Object.defineProperties(member, {
52
- light: {
53
- get: () => member[3]
54
- },
55
- dark: {
56
- get: () => member[7]
57
- }
58
- });
59
- return member;
60
- }
61
- /**
62
- * 将主题定义对象转换成使用对象
63
- * @param themeDefinition
64
- */
65
- function defineTheme(themeDefinition) {
66
- if (!themeDefinition.colors) {
67
- return themeDefinition;
68
- }
69
- const colors = {};
70
- for (const k in themeDefinition.colors) {
71
- const color = themeDefinition.colors[k];
72
- if (color) {
73
- colors[k] = defineColorMembers(color);
74
- }
75
- }
76
- return { ...themeDefinition, colors };
77
- }
78
- /**
79
- * 将主题使用对象还原成定义对象
80
- * @param theme
81
- */
82
- function restoreThemeDefinition(theme) {
83
- if (!theme.colors) {
84
- return theme;
85
- }
86
- const colors = {};
87
- for (const k in theme.colors) {
88
- const colorMembers = theme.colors[k];
89
- if (colorMembers) {
90
- colors[k] = colorMembers.main;
91
- }
92
- }
93
- return { ...theme, colors };
94
- }
95
29
  /**
96
30
  * ---------------------------------------------------------------------
97
31
  * 统一全局zIndex
@@ -121,7 +55,9 @@ exports.defaultMonospaceFontFamily = `'Consolas', 'SF Mono', 'Cascadia Code', 'M
121
55
  * ---------------------------------------------------------------------
122
56
  * 默认的明亮主题配置
123
57
  */
58
+ exports.DEFAULT_LIGHT = 'default-light';
124
59
  exports.defaultLightTheme = {
60
+ name: exports.DEFAULT_LIGHT,
125
61
  mode: 'light',
126
62
  fontSize: 14,
127
63
  fontFamily: exports.defaultFontFamily,
@@ -185,7 +121,9 @@ exports.defaultLightTheme = {
185
121
  * ---------------------------------------------------------------------
186
122
  * 默认的黑暗主题配置
187
123
  */
124
+ exports.DEFAULT_DARK = 'default-dark';
188
125
  exports.defaultDarkTheme = {
126
+ name: exports.DEFAULT_DARK,
189
127
  mode: 'dark',
190
128
  background: {
191
129
  /* content: rGray(.14), */
@@ -23,8 +23,8 @@ function useStyle({ indent }) {
23
23
  return [
24
24
  (0, utils_1.useCss)(({ spacing, mode, borderRadius, text, easing, gray, divider, colors }) => {
25
25
  const c = (0, color_1.default)(colors.primary.main);
26
- const hover = gray(mode === 'light' ? .05 : .2);
27
- const active = gray(mode === 'light' ? .1 : .12);
26
+ const hover = gray(mode === 'light' ? .05 : .18);
27
+ const active = gray(mode === 'light' ? .1 : .22);
28
28
  const selectedBg = c.alpha(mode === 'light' ? .1 : .2).string();
29
29
  const selectedHover = c.alpha(mode === 'light' ? .07 : .17).string();
30
30
  const selectedActive = c.alpha(mode === 'light' ? .13 : .23).string();
@@ -98,7 +98,6 @@ function useStyle({ indent }) {
98
98
  }
99
99
 
100
100
  &:not(:has([data-dragging=true])) {
101
- {
102
101
  .${exports.classes.node} {
103
102
  &[data-selected=true] {
104
103
  background-color: ${selectedBg};
@@ -123,7 +122,6 @@ function useStyle({ indent }) {
123
122
  }
124
123
  }
125
124
  }
126
- }
127
125
 
128
126
  &[data-show-line=true] {
129
127
  .${exports.classes.indent}::after {
@@ -36,7 +36,7 @@ function useStyle({ indent }) {
36
36
  width: 20px;
37
37
  margin-right: ${spacing[3]}px;
38
38
  text-align: center;
39
- color: ${gray(.12)};
39
+ color: ${mode === 'light' ? gray(.16) : gray(.32)};
40
40
  cursor: grab;
41
41
  }
42
42
 
@@ -4,7 +4,7 @@ export interface CardProps extends FlexProps {
4
4
  flexable?: boolean;
5
5
  /** 是否显示边框,默认为`false` */
6
6
  bordered?: boolean;
7
- /** @ 支持0-5,明亮主题表示阴影的程度,默认为`0`; 暗黑主题表示背景色,默认为`2` */
7
+ /** 支持0-5,明亮主题表示阴影的程度, 暗黑主题表示背景色,默认为`0` */
8
8
  elevation?: number;
9
9
  /** 默认为{@link Theme.borderRadius} */
10
10
  borderRadius?: number;
@@ -3,10 +3,9 @@ import { classes, style } from './card.style';
3
3
  import { clsx } from '../../utils';
4
4
  import { useTheme } from '../theme';
5
5
  import { Flex } from '../flex';
6
- export function Card({ flexable, bordered, elevation, borderRadius, ...props }) {
6
+ export function Card({ flexable, bordered, elevation = 0, borderRadius, ...props }) {
7
7
  const theme = useTheme();
8
8
  borderRadius ??= theme.borderRadius;
9
- elevation ??= theme.mode === 'light' ? 0 : 2;
10
9
  return (_jsx(Flex, { direction: "column", ...props, css: style, className: clsx(classes.root, props.className), style: {
11
10
  display: flexable ? 'flex' : void 0,
12
11
  borderRadius,