@canlooks/can-ui 0.0.102 → 0.0.104

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 (85) 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/curd/curd.d.ts +3 -0
  5. package/dist/cjs/components/curd/curd.js +9 -0
  6. package/dist/cjs/components/dataGrid/dataGrid.d.ts +14 -0
  7. package/dist/cjs/components/dataGrid/dataGrid.style.js +2 -2
  8. package/dist/cjs/components/dataGrid/dataGridHead.js +5 -1
  9. package/dist/cjs/components/dataGrid/filterBubbleContent.d.ts +1 -1
  10. package/dist/cjs/components/dataGrid/filterBubbleContent.js +4 -4
  11. package/dist/cjs/components/inputBase/inputBase.d.ts +2 -2
  12. package/dist/cjs/components/pagination/jumper.d.ts +2 -1
  13. package/dist/cjs/components/serialInput/serialInput.js +21 -7
  14. package/dist/cjs/components/table/table.style.js +2 -2
  15. package/dist/cjs/components/theme/index.d.ts +2 -0
  16. package/dist/cjs/components/theme/index.js +2 -0
  17. package/dist/cjs/components/theme/themeContext.js +15 -9
  18. package/dist/cjs/components/theme/themeMethods.d.ts +11 -0
  19. package/dist/cjs/components/theme/themeMethods.js +70 -0
  20. package/dist/cjs/components/theme/themeRegistry.d.ts +5 -0
  21. package/dist/cjs/components/theme/themeRegistry.js +20 -0
  22. package/dist/cjs/components/theme/themeTypes.d.ts +6 -3
  23. package/dist/cjs/components/theme/themeVariables.d.ts +5 -13
  24. package/dist/cjs/components/theme/themeVariables.js +5 -67
  25. package/dist/cjs/components/tree/tree.style.js +2 -4
  26. package/dist/cjs/components/tree/treeDnd.style.js +1 -1
  27. package/dist/esm/components/card/card.d.ts +1 -1
  28. package/dist/esm/components/card/card.js +1 -2
  29. package/dist/esm/components/card/card.style.js +9 -5
  30. package/dist/esm/components/curd/curd.d.ts +3 -0
  31. package/dist/esm/components/curd/curd.js +9 -0
  32. package/dist/esm/components/dataGrid/dataGrid.d.ts +14 -0
  33. package/dist/esm/components/dataGrid/dataGrid.style.js +2 -2
  34. package/dist/esm/components/dataGrid/dataGridHead.js +5 -1
  35. package/dist/esm/components/dataGrid/filterBubbleContent.d.ts +1 -1
  36. package/dist/esm/components/dataGrid/filterBubbleContent.js +5 -5
  37. package/dist/esm/components/inputBase/inputBase.d.ts +2 -2
  38. package/dist/esm/components/pagination/jumper.d.ts +2 -1
  39. package/dist/esm/components/serialInput/serialInput.js +21 -7
  40. package/dist/esm/components/table/table.style.js +2 -2
  41. package/dist/esm/components/theme/index.d.ts +2 -0
  42. package/dist/esm/components/theme/index.js +2 -0
  43. package/dist/esm/components/theme/themeContext.js +13 -7
  44. package/dist/esm/components/theme/themeMethods.d.ts +11 -0
  45. package/dist/esm/components/theme/themeMethods.js +65 -0
  46. package/dist/esm/components/theme/themeRegistry.d.ts +5 -0
  47. package/dist/esm/components/theme/themeRegistry.js +15 -0
  48. package/dist/esm/components/theme/themeTypes.d.ts +6 -3
  49. package/dist/esm/components/theme/themeVariables.d.ts +5 -13
  50. package/dist/esm/components/theme/themeVariables.js +4 -64
  51. package/dist/esm/components/tree/tree.style.js +2 -4
  52. package/dist/esm/components/tree/treeDnd.style.js +1 -1
  53. package/documentation/bootstrap.mjs +8 -0
  54. package/documentation/dist/assets/{index-DvrKS6Tv.js → index-UNtoAKsZ.js} +5326 -4849
  55. package/documentation/dist/index.html +1 -1
  56. package/documentation/vite.config.mjs +22 -0
  57. package/extensions/curd/index.d.ts +1 -0
  58. package/extensions/{curd.cjs → curd/index.js} +4 -5
  59. package/extensions/curd/index.mjs +1 -0
  60. package/extensions/curd/package.json +12 -0
  61. package/extensions/documentViewer/index.d.ts +1 -0
  62. package/extensions/{textFormatter.cjs → documentViewer/index.js} +4 -5
  63. package/extensions/documentViewer/index.mjs +1 -0
  64. package/extensions/documentViewer/package.json +12 -0
  65. package/extensions/reactiveForm/index.d.ts +1 -0
  66. package/extensions/{documentViewer.cjs → reactiveForm/index.js} +4 -5
  67. package/extensions/reactiveForm/index.mjs +1 -0
  68. package/extensions/reactiveForm/package.json +12 -0
  69. package/extensions/textFormatter/index.d.ts +1 -0
  70. package/extensions/{reactiveForm.cjs → textFormatter/index.js} +1 -2
  71. package/extensions/textFormatter/index.mjs +1 -0
  72. package/extensions/textFormatter/package.json +12 -0
  73. package/package.json +1 -1
  74. package/dist/cjs/components/transportStyle/transportStyle.style.d.ts +0 -1
  75. package/dist/cjs/components/transportStyle/transportStyle.style.js +0 -57
  76. package/dist/esm/components/transportStyle/transportStyle.style.d.ts +0 -1
  77. package/dist/esm/components/transportStyle/transportStyle.style.js +0 -54
  78. package/extensions/curd.d.ts +0 -1
  79. package/extensions/curd.js +0 -1
  80. package/extensions/documentViewer.d.ts +0 -1
  81. package/extensions/documentViewer.js +0 -1
  82. package/extensions/reactiveForm.d.ts +0 -1
  83. package/extensions/reactiveForm.js +0 -1
  84. package/extensions/textFormatter.d.ts +0 -1
  85. package/extensions/textFormatter.js +0 -1
@@ -37,16 +37,20 @@ export const style = defineCss(({ spacing, mode, background, divider, boxShadow,
37
37
  @layer reset {
38
38
  padding: ${spacing[8]}px;
39
39
 
40
+ &[data-bordered=true] {
41
+ border: 1px solid ${divider};
42
+ }
43
+
40
44
  &[data-elevation="0"] {
41
- background-color: ${gray(.1)};
45
+ background-color: ${gray(.14)};
42
46
  }
43
47
 
44
48
  &[data-elevation="1"] {
45
- background-color: ${gray(.14)};
49
+ background-color: ${gray(.18)};
46
50
  }
47
51
 
48
52
  &[data-elevation="2"] {
49
- background-color: ${gray(.2)};
53
+ background-color: ${gray(.22)};
50
54
  }
51
55
 
52
56
  &[data-elevation="3"] {
@@ -54,11 +58,11 @@ export const style = defineCss(({ spacing, mode, background, divider, boxShadow,
54
58
  }
55
59
 
56
60
  &[data-elevation="4"] {
57
- background-color: ${gray(.34)};
61
+ background-color: ${gray(.30)};
58
62
  }
59
63
 
60
64
  &[data-elevation="5"] {
61
- background-color: ${gray(.45)};
65
+ background-color: ${gray(.34)};
62
66
  }
63
67
  }
64
68
  `
@@ -26,6 +26,9 @@ export type LoadRowsReturn<R extends RowType = RowType> = {
26
26
  };
27
27
  type EachRowType<R extends RowType, T> = T | ((row: R) => T);
28
28
  export type CurdRef<R extends RowType = RowType, F extends FormValue = FormValue> = {
29
+ reload(): Promise<void>;
30
+ setPage(page: number): void;
31
+ setPageSize(size: number): void;
29
32
  openCreateDialog(defaultValue?: F): Promise<F> | undefined;
30
33
  selectSingle(): Promise<R> | undefined;
31
34
  selectMultiple(selected?: Id[]): Promise<Id[]> | undefined;
@@ -27,6 +27,15 @@ export const Curd = memo((props) => {
27
27
  * ref
28
28
  */
29
29
  useImperativeHandle(ref, () => ({
30
+ reload() {
31
+ return innerLoadRows();
32
+ },
33
+ setPage(page) {
34
+ setInnerPage(page);
35
+ },
36
+ setPageSize(size) {
37
+ setInnerPageSize(size);
38
+ },
30
39
  openCreateDialog(defaultValue) {
31
40
  return curdDialogRef.current?.open(void 0, defaultValue);
32
41
  },
@@ -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}内赋值 */
@@ -59,12 +59,12 @@ export const style = defineCss(({ spacing, mode, gray, text, colors, easing }) =
59
59
  -webkit-tap-highlight-color: transparent;
60
60
 
61
61
  &:hover {
62
- background-color: ${gray(mode === 'light' ? .05 : .26)};
62
+ background-color: ${gray(mode === 'light' ? .05 : .2)};
63
63
  }
64
64
 
65
65
  &:active {
66
66
  transition: background-color 0s;
67
- background-color: ${gray(mode === 'light' ? .01 : .22)};
67
+ background-color: ${gray(mode === 'light' ? .09 : .24)};
68
68
  }
69
69
 
70
70
  &[data-ordering=true] {
@@ -13,6 +13,8 @@ import { Button } from '../button';
13
13
  import { faFilter } from '@fortawesome/free-solid-svg-icons/faFilter';
14
14
  import { Bubble } from '../bubble';
15
15
  import { FilterBubbleContent } from './filterBubbleContent';
16
+ import { useFormValueContext } from '../form';
17
+ import { isUnset } from '../../utils';
16
18
  export const DataGridHead = memo(({ allowSelectAll, columnResizable, flattedColumns, completedColumns, rows, primaryKey, orderColumn, orderType, onOrderChange, onFilterClick }) => {
17
19
  const { multiple, setValue, selectionStatus } = useSelectionContext();
18
20
  const allSelectionStatus = useMemo(() => {
@@ -30,6 +32,7 @@ export const DataGridHead = memo(({ allowSelectAll, columnResizable, flattedColu
30
32
  ? setValue(rows?.flatMap(r => r[primaryKey] ?? []) || [])
31
33
  : setValue([]);
32
34
  };
35
+ const { formValue } = useFormValueContext();
33
36
  const renderedHead = useRenderHead(Column => {
34
37
  const columnDefinitions = columnResizable ? flattedColumns : completedColumns;
35
38
  if (!columnDefinitions) {
@@ -80,7 +83,8 @@ export const DataGridHead = memo(({ allowSelectAll, columnResizable, flattedColu
80
83
  const sortable = sorter && !children?.length;
81
84
  const isOrderingColumn = orderColumn === _key;
82
85
  const currentOrderType = isOrderingColumn ? orderType : 'descend';
83
- const filterButton = (_jsx(Button, { className: classes.filterButton, variant: "plain", color: "text.placeholder", onClick: e => {
86
+ const isFilteredColumn = !isUnset(formValue?.[_key]);
87
+ const filterButton = (_jsx(Button, { className: classes.filterButton, variant: "plain", color: isFilteredColumn ? 'primary' : 'text.placeholder', onClick: e => {
84
88
  e.stopPropagation();
85
89
  onFilterClick?.(_key, e);
86
90
  }, children: _jsx(Icon, { icon: 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> {
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@emotion/react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
2
  import { OptionsBase } from '../optionsBase';
3
3
  import { useFlatSelection } from '../selectionContext';
4
4
  import { Flex } from '../flex';
@@ -19,10 +19,10 @@ export const FilterBubbleContent = memo(({ columnKey, columnFilterProps }) => {
19
19
  return (_jsxs(_Fragment, { children: [_jsx(FormItem, { field: columnKey, children: 'control' in columnFilterProps
20
20
  ? columnFilterProps.control
21
21
  : _jsx(FilterOptions, { ...columnFilterProps }) }), columnFilterProps.showButton !== false
22
- ? _jsxs(Flex, { gap: 6, justifyContent: "flex-end", marginTop: 6, children: [_jsx(Button, { variant: "text", onClick: () => {
23
- formRef.current.setFieldValue(columnKey, null);
24
- setOpen(false);
25
- }, children: "\u91CD\u7F6E" }), _jsx(Button, { onClick: () => setOpen(false), children: "\u786E\u5B9A" })] })
22
+ ? _jsx(Flex, { gap: 6, justifyContent: "center", marginTop: 6, children: _jsx(Button, { variant: "text", onClick: () => {
23
+ formRef.current.setFieldValue(columnKey, null);
24
+ setOpen(false);
25
+ }, children: "\u91CD\u7F6E" }) })
26
26
  : _jsx(TriggerFilterOnChange, {})] }));
27
27
  });
28
28
  const FilterOptions = 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>;
@@ -33,14 +33,28 @@ export const SerialInput = memo(({ separator, count = 1, defaultValue, value, on
33
33
  onFinish?.(newValue);
34
34
  }
35
35
  }
36
- else if (0 < index && prevLength === 1 && curr.length === 0) {
37
- // 聚焦前一个输入框
38
- inputRefs.current[index - 1].focus();
39
- }
40
36
  },
41
- onKeyDown: ({ key }) => {
42
- if (key === 'Backspace' && innerValue.current[index].length === 0 && 0 < index) {
43
- inputRefs.current[index - 1].focus();
37
+ onKeyDown: (e) => {
38
+ switch (e.key) {
39
+ case 'Backspace':
40
+ if (innerValue.current[index].length === 0 && index > 0) {
41
+ const prevInput = inputRefs.current[index - 1];
42
+ prevInput.focus();
43
+ const selectionIndex = innerValue.current[index - 1].length;
44
+ prevInput.setSelectionRange(selectionIndex, selectionIndex);
45
+ }
46
+ break;
47
+ case 'ArrowRight':
48
+ if (index < count - 1) {
49
+ e.preventDefault();
50
+ inputRefs.current[index + 1].focus();
51
+ }
52
+ break;
53
+ case 'ArrowLeft':
54
+ if (index > 0) {
55
+ e.preventDefault();
56
+ inputRefs.current[index - 1].focus();
57
+ }
44
58
  }
45
59
  }
46
60
  });
@@ -6,8 +6,8 @@ export const classes = defineInnerClasses('table', [
6
6
  'cell'
7
7
  ]);
8
8
  export const style = defineCss(({ mode, spacing, gray, divider, background, easing, colors }) => {
9
- const headerBg = gray(mode === 'light' ? .03 : .22);
10
- const stripedBg = gray(mode === 'light' ? .02 : .21);
9
+ const headerBg = gray(mode === 'light' ? .03 : .18);
10
+ const stripedBg = gray(mode === 'light' ? .02 : .16);
11
11
  const selectedBg = Color(colors.primary.main).alpha(mode === 'light' ? .05 : .1).string();
12
12
  return css `
13
13
  @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';
@@ -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';
@@ -1,25 +1,31 @@
1
1
  import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
2
  import { createContext, useContext, useMemo } from 'react';
3
- import { defaultDarkTheme, defaultLightTheme, defineTheme, restoreThemeDefinition } from './themeVariables';
3
+ import { defaultDarkTheme, defaultLightTheme } from './themeVariables';
4
4
  import { mergeDeep, useDerivedState } from '../../utils';
5
+ import { defineTheme, restoreThemeDefinition } from './themeMethods';
6
+ import { getTheme } from './themeRegistry';
5
7
  export const ThemeContext = createContext(defineTheme(defaultLightTheme));
6
8
  export function useTheme() {
7
9
  return useContext(ThemeContext);
8
10
  }
9
11
  export function ThemeProvider({ theme, children }) {
10
12
  const parentTheme = useTheme();
11
- const [currentTheme, setCurrentTheme] = useDerivedState(theme);
13
+ const resolvedThemeDefinition = useMemo(() => {
14
+ return theme?.name
15
+ ? mergeDeep({}, getTheme(theme.name), theme)
16
+ : theme;
17
+ }, [theme]);
18
+ const [currentTheme, setCurrentTheme] = useDerivedState(resolvedThemeDefinition);
12
19
  const mergedThemeDefinition = useMemo(() => {
13
20
  return mergeDeep({}, restoreThemeDefinition(parentTheme), parentTheme.mode === 'light' && currentTheme.current?.mode === 'dark' ? defaultDarkTheme : void 0, parentTheme.mode === 'dark' && currentTheme.current?.mode === 'light' ? defaultLightTheme : void 0, currentTheme.current);
14
21
  }, [currentTheme.current, parentTheme]);
15
22
  const themeContextValue = useMemo(() => {
16
23
  const value = defineTheme(mergedThemeDefinition);
17
- value._sub = true;
18
24
  value.update = theme => {
19
- const newThemeDefinition = typeof theme === 'function' ? theme(value) : theme;
20
- setCurrentTheme(prev => {
21
- return mergeDeep({ ...prev }, newThemeDefinition);
22
- });
25
+ setCurrentTheme(typeof theme === 'function' ? theme(value) : theme);
26
+ };
27
+ value.set = name => {
28
+ value.update(getTheme(name));
23
29
  };
24
30
  return value;
25
31
  }, [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,65 @@
1
+ import Color from 'color';
2
+ /**
3
+ * ---------------------------------------------------------------------
4
+ * 生成单个颜色的其他明亮度配色,0 至 10,数字越小颜色越淡(亮),数字越大颜色越深(暗)
5
+ */
6
+ function defineColorMembers(color) {
7
+ const member = Array();
8
+ member.toString = () => color;
9
+ const colorObj = Color(color);
10
+ for (let i = 0; i <= 4; i++) {
11
+ Object.defineProperty(member, i, {
12
+ get: () => colorObj.lighten(1 - (i + 1) / 6).hex()
13
+ });
14
+ }
15
+ member[5] = color;
16
+ for (let i = 6; i <= 10; i++) {
17
+ Object.defineProperty(member, i, {
18
+ get: () => colorObj.darken((i - 5) / 6).hex()
19
+ });
20
+ }
21
+ member.main = member[5];
22
+ Object.defineProperties(member, {
23
+ light: {
24
+ get: () => member[3]
25
+ },
26
+ dark: {
27
+ get: () => member[7]
28
+ }
29
+ });
30
+ return member;
31
+ }
32
+ /**
33
+ * 将主题定义对象转换成使用对象
34
+ * @param themeDefinition
35
+ */
36
+ export function defineTheme(themeDefinition) {
37
+ if (!themeDefinition.colors) {
38
+ return themeDefinition;
39
+ }
40
+ const colors = {};
41
+ for (const k in themeDefinition.colors) {
42
+ const color = themeDefinition.colors[k];
43
+ if (color) {
44
+ colors[k] = defineColorMembers(color);
45
+ }
46
+ }
47
+ return { ...themeDefinition, colors };
48
+ }
49
+ /**
50
+ * 将主题使用对象还原成定义对象
51
+ * @param theme
52
+ */
53
+ export function restoreThemeDefinition(theme) {
54
+ if (!theme.colors) {
55
+ return theme;
56
+ }
57
+ const colors = {};
58
+ for (const k in theme.colors) {
59
+ const colorMembers = theme.colors[k];
60
+ if (colorMembers) {
61
+ colors[k] = colorMembers.main;
62
+ }
63
+ }
64
+ return { ...theme, colors };
65
+ }
@@ -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,15 @@
1
+ import { defaultDarkTheme, defaultLightTheme } from './themeVariables';
2
+ export const themeMap = new Map();
3
+ export function getTheme(name) {
4
+ const registeredTheme = themeMap.get(name);
5
+ if (!registeredTheme) {
6
+ throw Error(`Cannot find theme "${name}", call "registerTheme()" first.`);
7
+ }
8
+ return registeredTheme;
9
+ }
10
+ export function registerTheme(a, b) {
11
+ const theme = b ? { ...b, name: a } : { ...a };
12
+ themeMap.set(theme.name, theme);
13
+ }
14
+ registerTheme(defaultLightTheme);
15
+ registerTheme(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;
@@ -22,70 +22,6 @@ function generateSpacing() {
22
22
  }
23
23
  return spacing;
24
24
  }
25
- /**
26
- * ---------------------------------------------------------------------
27
- * 生成单个颜色的其他明亮度配色,0 至 10,数字越小颜色越淡(亮),数字越大颜色越深(暗)
28
- */
29
- function defineColorMembers(color) {
30
- const member = Array();
31
- member.toString = () => color;
32
- const colorObj = Color(color);
33
- for (let i = 0; i <= 4; i++) {
34
- Object.defineProperty(member, i, {
35
- get: () => colorObj.lighten(1 - (i + 1) / 6).hex()
36
- });
37
- }
38
- member[5] = color;
39
- for (let i = 6; i <= 10; i++) {
40
- Object.defineProperty(member, i, {
41
- get: () => colorObj.darken((i - 5) / 6).hex()
42
- });
43
- }
44
- member.main = member[5];
45
- Object.defineProperties(member, {
46
- light: {
47
- get: () => member[3]
48
- },
49
- dark: {
50
- get: () => member[7]
51
- }
52
- });
53
- return member;
54
- }
55
- /**
56
- * 将主题定义对象转换成使用对象
57
- * @param themeDefinition
58
- */
59
- export function defineTheme(themeDefinition) {
60
- if (!themeDefinition.colors) {
61
- return themeDefinition;
62
- }
63
- const colors = {};
64
- for (const k in themeDefinition.colors) {
65
- const color = themeDefinition.colors[k];
66
- if (color) {
67
- colors[k] = defineColorMembers(color);
68
- }
69
- }
70
- return { ...themeDefinition, colors };
71
- }
72
- /**
73
- * 将主题使用对象还原成定义对象
74
- * @param theme
75
- */
76
- export function restoreThemeDefinition(theme) {
77
- if (!theme.colors) {
78
- return theme;
79
- }
80
- const colors = {};
81
- for (const k in theme.colors) {
82
- const colorMembers = theme.colors[k];
83
- if (colorMembers) {
84
- colors[k] = colorMembers.main;
85
- }
86
- }
87
- return { ...theme, colors };
88
- }
89
25
  /**
90
26
  * ---------------------------------------------------------------------
91
27
  * 统一全局zIndex
@@ -115,7 +51,9 @@ export const defaultMonospaceFontFamily = `'Consolas', 'SF Mono', 'Cascadia Code
115
51
  * ---------------------------------------------------------------------
116
52
  * 默认的明亮主题配置
117
53
  */
54
+ export const DEFAULT_LIGHT = 'default-light';
118
55
  export const defaultLightTheme = {
56
+ name: DEFAULT_LIGHT,
119
57
  mode: 'light',
120
58
  fontSize: 14,
121
59
  fontFamily: defaultFontFamily,
@@ -179,7 +117,9 @@ export const defaultLightTheme = {
179
117
  * ---------------------------------------------------------------------
180
118
  * 默认的黑暗主题配置
181
119
  */
120
+ export const DEFAULT_DARK = 'default-dark';
182
121
  export const defaultDarkTheme = {
122
+ name: DEFAULT_DARK,
183
123
  mode: 'dark',
184
124
  background: {
185
125
  /* content: rGray(.14), */
@@ -18,8 +18,8 @@ export function useStyle({ indent }) {
18
18
  return [
19
19
  useCss(({ spacing, mode, borderRadius, text, easing, gray, divider, colors }) => {
20
20
  const c = Color(colors.primary.main);
21
- const hover = gray(mode === 'light' ? .05 : .2);
22
- const active = gray(mode === 'light' ? .1 : .12);
21
+ const hover = gray(mode === 'light' ? .05 : .18);
22
+ const active = gray(mode === 'light' ? .1 : .22);
23
23
  const selectedBg = c.alpha(mode === 'light' ? .1 : .2).string();
24
24
  const selectedHover = c.alpha(mode === 'light' ? .07 : .17).string();
25
25
  const selectedActive = c.alpha(mode === 'light' ? .13 : .23).string();
@@ -93,7 +93,6 @@ export function useStyle({ indent }) {
93
93
  }
94
94
 
95
95
  &:not(:has([data-dragging=true])) {
96
- {
97
96
  .${classes.node} {
98
97
  &[data-selected=true] {
99
98
  background-color: ${selectedBg};
@@ -118,7 +117,6 @@ export function useStyle({ indent }) {
118
117
  }
119
118
  }
120
119
  }
121
- }
122
120
 
123
121
  &[data-show-line=true] {
124
122
  .${classes.indent}::after {
@@ -31,7 +31,7 @@ export function useStyle({ indent }) {
31
31
  width: 20px;
32
32
  margin-right: ${spacing[3]}px;
33
33
  text-align: center;
34
- color: ${gray(.12)};
34
+ color: ${mode === 'light' ? gray(.16) : gray(.32)};
35
35
  cursor: grab;
36
36
  }
37
37
 
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { preview } from 'vite';
3
+ import inlineConfig from './vite.config.mjs';
4
+ (async () => {
5
+ const server = await preview(inlineConfig);
6
+ server.printUrls();
7
+ server.bindCLIShortcuts({ print: true });
8
+ })();