@veltra/desktop 1.0.8 → 1.0.10

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 (220) hide show
  1. package/dist/components/action/action-group.vue.d.ts +2 -2
  2. package/dist/components/action/action.vue.d.ts +3 -3
  3. package/dist/components/auto-complete/auto-complete.vue.d.ts +1 -1
  4. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  5. package/dist/components/batch-edit/batch-edit.vue.d.ts +2 -2
  6. package/dist/components/batch-edit/use-edit.js.map +1 -1
  7. package/dist/components/button/button.js.map +1 -1
  8. package/dist/components/button/button.vue.d.ts +1 -1
  9. package/dist/components/cascade/cascade.js +15 -13
  10. package/dist/components/cascade/cascade.js.map +1 -1
  11. package/dist/components/cascade/cascade.vue.d.ts +7 -7
  12. package/dist/components/cascade/node.js.map +1 -1
  13. package/dist/components/cascade/use-check.js +3 -2
  14. package/dist/components/cascade/use-check.js.map +1 -1
  15. package/dist/components/cascade/use-select.js +3 -3
  16. package/dist/components/cascade/use-select.js.map +1 -1
  17. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  18. package/dist/components/checkbox-group/checkbox-group.vue.d.ts +2 -2
  19. package/dist/components/date-panel/date-panel.js.map +1 -1
  20. package/dist/components/date-panel/date-panel.vue.d.ts +1 -1
  21. package/dist/components/date-picker/date-picker.js +9 -9
  22. package/dist/components/date-picker/date-picker.js.map +1 -1
  23. package/dist/components/date-picker/date-picker.vue.d.ts +1 -1
  24. package/dist/components/date-range-picker/date-range-picker.js +9 -9
  25. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  26. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +1 -1
  27. package/dist/components/drawer/drawer.js.map +1 -1
  28. package/dist/components/empty/empty.vue.d.ts +1 -1
  29. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  30. package/dist/components/expression-editor/internal/editor-runtime/create-runtime.js.map +1 -1
  31. package/dist/components/expression-editor/internal/features/commands/register-command-packs.js.map +1 -1
  32. package/dist/components/expression-editor/internal/features/insertion/insertion-service.js.map +1 -1
  33. package/dist/components/expression-editor/use-decorators.js.map +1 -1
  34. package/dist/components/expression-editor/use-expression-drag-drop.js.map +1 -1
  35. package/dist/components/file-picker/file-picker.js.map +1 -1
  36. package/dist/components/file-picker/file-picker.vue.d.ts +1 -1
  37. package/dist/components/file-picker/helper.js +19 -7
  38. package/dist/components/file-picker/helper.js.map +1 -1
  39. package/dist/components/file-viewer/file-viewer.js +294 -0
  40. package/dist/components/file-viewer/file-viewer.js.map +1 -0
  41. package/dist/components/file-viewer/file-viewer.vue.d.ts +42 -0
  42. package/dist/components/file-viewer/helper.js +185 -0
  43. package/dist/components/file-viewer/helper.js.map +1 -0
  44. package/dist/components/file-viewer/index.d.ts +1 -0
  45. package/dist/components/file-viewer/previewers/docx-previewer.js +76 -0
  46. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -0
  47. package/dist/components/file-viewer/previewers/image-previewer.js +64 -0
  48. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -0
  49. package/dist/components/file-viewer/previewers/pdf-previewer.js +90 -0
  50. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -0
  51. package/dist/components/file-viewer/previewers/sheet-previewer.js +175 -0
  52. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -0
  53. package/dist/components/file-viewer/previewers/text-previewer.js +74 -0
  54. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -0
  55. package/dist/components/file-viewer/previewers/video-previewer.js +62 -0
  56. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -0
  57. package/dist/components/file-viewer/style.d.ts +1 -0
  58. package/dist/components/file-viewer/style.js +4 -0
  59. package/dist/components/file-viewer/style2.css +445 -0
  60. package/dist/components/form/form-model.js +2 -1
  61. package/dist/components/form/form-model.js.map +1 -1
  62. package/dist/components/grid/grid.js.map +1 -1
  63. package/dist/components/grid/use-responsive.js.map +1 -1
  64. package/dist/components/grid-input/grid-input.vue.d.ts +1 -1
  65. package/dist/components/index.d.ts +12 -9
  66. package/dist/components/input/input.vue.d.ts +3 -3
  67. package/dist/components/list/list.js.map +1 -1
  68. package/dist/components/loading/directive.js.map +1 -1
  69. package/dist/components/menu/menu-item.js.map +1 -1
  70. package/dist/components/message/message2.js.map +1 -1
  71. package/dist/components/multi-select/multi-select-option.js +14 -10
  72. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  73. package/dist/components/multi-select/multi-select.js +16 -19
  74. package/dist/components/multi-select/multi-select.js.map +1 -1
  75. package/dist/components/multi-select/multi-select.vue.d.ts +4 -4
  76. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +7 -7
  77. package/dist/components/notification/index.js.map +1 -1
  78. package/dist/components/notification/notification.vue.d.ts +1 -1
  79. package/dist/components/number-input/number-input.js.map +1 -1
  80. package/dist/components/number-input/number-input.vue.d.ts +1 -1
  81. package/dist/components/number-range-input/number-range-input.vue.d.ts +1 -1
  82. package/dist/components/palette/color-transform.js.map +1 -1
  83. package/dist/components/palette/di.js.map +1 -1
  84. package/dist/components/palette/palette-alpha.js +7 -10
  85. package/dist/components/palette/palette-alpha.js.map +1 -1
  86. package/dist/components/palette/palette-hue.js +5 -7
  87. package/dist/components/palette/palette-hue.js.map +1 -1
  88. package/dist/components/palette/palette-sv.js +8 -10
  89. package/dist/components/palette/palette-sv.js.map +1 -1
  90. package/dist/components/palette/palette.js +22 -24
  91. package/dist/components/palette/palette.js.map +1 -1
  92. package/dist/components/password-input/password-input.vue.d.ts +1 -1
  93. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +2 -2
  94. package/dist/components/progress/progress.js +1 -1
  95. package/dist/components/progress/progress.js.map +1 -1
  96. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  97. package/dist/components/radio-group/radio-group.vue.d.ts +2 -2
  98. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  99. package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +1 -1
  100. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  101. package/dist/components/scroll/scroll.js.map +1 -1
  102. package/dist/components/select/select.js +14 -12
  103. package/dist/components/select/select.js.map +1 -1
  104. package/dist/components/select/select.vue.d.ts +3 -3
  105. package/dist/components/slider/slider-thumb.js +10 -13
  106. package/dist/components/slider/slider-thumb.js.map +1 -1
  107. package/dist/components/slider/slider.js +12 -15
  108. package/dist/components/slider/slider.js.map +1 -1
  109. package/dist/components/table/di.js.map +1 -1
  110. package/dist/components/table/node/row.d.ts +10 -1
  111. package/dist/components/table/node/row.js +9 -0
  112. package/dist/components/table/node/row.js.map +1 -1
  113. package/dist/components/table/table-body.js +25 -26
  114. package/dist/components/table/table-body.js.map +1 -1
  115. package/dist/components/table/table-cell.js +16 -9
  116. package/dist/components/table/table-cell.js.map +1 -1
  117. package/dist/components/table/table-row.js +77 -19
  118. package/dist/components/table/table-row.js.map +1 -1
  119. package/dist/components/table/table.js +75 -34
  120. package/dist/components/table/table.js.map +1 -1
  121. package/dist/components/table/table.vue.d.ts +2 -2
  122. package/dist/components/table/use-columns.js +4 -0
  123. package/dist/components/table/use-columns.js.map +1 -1
  124. package/dist/components/table/use-fixed-columns.js +27 -8
  125. package/dist/components/table/use-fixed-columns.js.map +1 -1
  126. package/dist/components/table/use-rows.js +2 -2
  127. package/dist/components/table/use-rows.js.map +1 -1
  128. package/dist/components/table/use-table.js +50 -3
  129. package/dist/components/table/use-table.js.map +1 -1
  130. package/dist/components/tabs/index.d.ts +3 -1
  131. package/dist/components/tabs/style2.css +170 -107
  132. package/dist/components/tabs/tabs-horizontal.js +133 -0
  133. package/dist/components/tabs/tabs-horizontal.js.map +1 -0
  134. package/dist/components/tabs/tabs-horizontal.vue.d.ts +40 -0
  135. package/dist/components/tabs/tabs-vertical.js +89 -0
  136. package/dist/components/tabs/tabs-vertical.js.map +1 -0
  137. package/dist/components/tabs/tabs-vertical.vue.d.ts +38 -0
  138. package/dist/components/tabs/tabs.js +75 -105
  139. package/dist/components/tabs/tabs.js.map +1 -1
  140. package/dist/components/tabs/tabs.vue.d.ts +9 -23
  141. package/dist/components/tabs/use-tabs-bar.js +105 -0
  142. package/dist/components/tabs/use-tabs-bar.js.map +1 -0
  143. package/dist/components/text/text.js.map +1 -1
  144. package/dist/components/textarea/textarea.js.map +1 -1
  145. package/dist/components/textarea/textarea.vue.d.ts +4 -4
  146. package/dist/components/theme/theme.js.map +1 -1
  147. package/dist/components/tip/tip.vue.d.ts +1 -1
  148. package/dist/components/tree/style2.css +45 -23
  149. package/dist/components/tree/tree-node.js +50 -35
  150. package/dist/components/tree/tree-node.js.map +1 -1
  151. package/dist/components/tree/tree-node2.js.map +1 -1
  152. package/dist/components/tree/tree.js +27 -20
  153. package/dist/components/tree/tree.js.map +1 -1
  154. package/dist/components/tree/tree.vue.d.ts +5 -5
  155. package/dist/components/tree/use-check.js +52 -14
  156. package/dist/components/tree/use-check.js.map +1 -1
  157. package/dist/components/tree/use-tree-nodes.js +51 -24
  158. package/dist/components/tree/use-tree-nodes.js.map +1 -1
  159. package/dist/components/tree-select/tree-select.vue.d.ts +7 -7
  160. package/dist/index.d.ts +57 -53
  161. package/dist/index.js +51 -48
  162. package/dist/types/file-viewer.d.ts +71 -0
  163. package/dist/types/index.d.ts +3 -2
  164. package/dist/types/tabs.d.ts +106 -14
  165. package/dist/types/tree.d.ts +6 -1
  166. package/package.json +32 -31
  167. package/src/components/cascade/cascade.vue +18 -18
  168. package/src/components/cascade/node.ts +4 -1
  169. package/src/components/cascade/use-check.ts +5 -4
  170. package/src/components/cascade/use-select.ts +4 -5
  171. package/src/components/date-picker/date-picker.vue +10 -9
  172. package/src/components/date-range-picker/date-range-picker.vue +12 -12
  173. package/src/components/file-picker/helper.ts +21 -10
  174. package/src/components/file-viewer/file-viewer.vue +311 -0
  175. package/src/components/file-viewer/helper.ts +193 -0
  176. package/src/components/file-viewer/index.ts +1 -0
  177. package/src/components/file-viewer/previewers/docx-previewer.vue +78 -0
  178. package/src/components/file-viewer/previewers/image-previewer.vue +64 -0
  179. package/src/components/file-viewer/previewers/pdf-previewer.vue +90 -0
  180. package/src/components/file-viewer/previewers/sheet-previewer.vue +210 -0
  181. package/src/components/file-viewer/previewers/text-previewer.vue +76 -0
  182. package/src/components/file-viewer/previewers/video-previewer.vue +72 -0
  183. package/src/components/file-viewer/style.scss +504 -0
  184. package/src/components/file-viewer/style.ts +4 -0
  185. package/src/components/index.ts +2 -0
  186. package/src/components/multi-select/multi-select-option.vue +16 -3
  187. package/src/components/multi-select/multi-select.vue +17 -9
  188. package/src/components/palette/di.ts +5 -3
  189. package/src/components/palette/palette-alpha.vue +7 -10
  190. package/src/components/palette/palette-hue.vue +5 -7
  191. package/src/components/palette/palette-sv.vue +12 -14
  192. package/src/components/palette/palette.vue +19 -21
  193. package/src/components/progress/progress.vue +1 -1
  194. package/src/components/select/select.vue +21 -19
  195. package/src/components/slider/slider-thumb.vue +11 -14
  196. package/src/components/slider/slider.vue +15 -15
  197. package/src/components/table/di.ts +58 -43
  198. package/src/components/table/node/row.ts +10 -1
  199. package/src/components/table/table-body.vue +28 -33
  200. package/src/components/table/table-cell.vue +17 -9
  201. package/src/components/table/table-row.tsx +83 -17
  202. package/src/components/table/table.vue +72 -45
  203. package/src/components/table/use-fixed-columns.ts +46 -12
  204. package/src/components/table/use-rows.ts +14 -3
  205. package/src/components/table/use-table.ts +27 -3
  206. package/src/components/tabs/index.ts +2 -0
  207. package/src/components/tabs/style.scss +219 -133
  208. package/src/components/tabs/tabs-horizontal.vue +128 -0
  209. package/src/components/tabs/tabs-vertical.vue +77 -0
  210. package/src/components/tabs/tabs.vue +56 -127
  211. package/src/components/tabs/use-tabs-bar.ts +119 -0
  212. package/src/components/tree/style.scss +74 -29
  213. package/src/components/tree/tree-node.vue +10 -4
  214. package/src/components/tree/tree.vue +39 -12
  215. package/src/components/tree/use-check.ts +79 -23
  216. package/src/components/tree/use-tree-nodes.ts +85 -34
  217. package/src/types/file-viewer.ts +69 -0
  218. package/src/types/index.ts +1 -0
  219. package/src/types/tabs.ts +113 -19
  220. package/src/types/tree.ts +6 -1
@@ -1 +1 @@
1
- {"version":3,"file":"textarea.js","names":[],"sources":["../../../src/components/textarea/textarea.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n :class=\"textareaClass\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n >\n <textarea\n :class=\"cls.e('native')\"\n :placeholder=\"placeholder\"\n v-model=\"model\"\n :maxlength=\"maxlength\"\n :rows=\"rows\"\n :cols=\"cols\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @change=\"handleChange\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n ref=\"textareaRef\"\n />\n <span v-if=\"props.maxlength && props.showCount\" :class=\"cls.m('count')\">\n {{ initNum }}/{{ props.maxlength }}\n </span>\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"props.clearable && model! && hovered && !disabled && !readonly\"\n :class=\"cls.m('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n </Transition>\n </div>\n\n <span v-else style=\"white-space: pre-wrap\">\n {{ model || FORM_EMPTY_CONTENT }}\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFocus, useFormComponent, useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, ref, shallowRef, watch } from 'vue'\n\nimport type { TextareaProps, TextareaEmits, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { calcTextareaHeight } from './utils'\n\ndefineOptions({\n name: 'Textarea'\n})\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '请输入',\n resize: true,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n autosize: false\n})\n\nconst cls = bem('textarea')\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n disabled: false,\n readonly: false\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\nconst model = defineModel<string>()\n\nconst hovered = shallowRef(false)\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n focused ? emit('focus') : emit('blur')\n})\n\nconst textareaClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('resize-none', !props.resize),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value),\n cls.m('more')\n ]\n})\n\nconst handleInput = (e: Event) => {\n const value = (e.target as HTMLTextAreaElement).value\n if (value.length > props.maxlength!) {\n // 如果输入的字符数超过了最大长度,截取字符串到最大长度\n const truncatedValue = value.slice(0, props.maxlength)\n emit('update:modelValue', truncatedValue)\n } else {\n // 如果没有超过最大长度,则正常更新模型值\n emit('update:modelValue', value)\n }\n}\n\nconst initNum = computed(() => {\n if (!props.maxlength) return 0\n return props.maxlength - (model.value?.length ?? 0)\n})\n\nconst handleClear = () => {\n model.value = ''\n emit('clear')\n}\n\nconst handleChange = (e: Event) => {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nwatch(\n [model, textareaRef],\n ([model, textareaRef]) => {\n if (!textareaRef) return\n if (!props.autosize) return\n calcTextareaHeight(textareaRef)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../../../src/components/textarea/textarea.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n :class=\"textareaClass\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n >\n <textarea\n :class=\"cls.e('native')\"\n :placeholder=\"placeholder\"\n v-model=\"model\"\n :maxlength=\"maxlength\"\n :rows=\"rows\"\n :cols=\"cols\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @change=\"handleChange\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n ref=\"textareaRef\"\n />\n <span v-if=\"props.maxlength && props.showCount\" :class=\"cls.m('count')\">\n {{ initNum }}/{{ props.maxlength }}\n </span>\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"props.clearable && model! && hovered && !disabled && !readonly\"\n :class=\"cls.m('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n </Transition>\n </div>\n\n <span v-else style=\"white-space: pre-wrap\">\n {{ model || FORM_EMPTY_CONTENT }}\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFocus, useFormComponent, useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, ref, shallowRef, watch } from 'vue'\n\nimport type { TextareaProps, TextareaEmits, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { calcTextareaHeight } from './utils'\n\ndefineOptions({\n name: 'Textarea'\n})\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '请输入',\n resize: true,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n autosize: false\n})\n\nconst cls = bem('textarea')\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n disabled: false,\n readonly: false\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\nconst model = defineModel<string>()\n\nconst hovered = shallowRef(false)\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n focused ? emit('focus') : emit('blur')\n})\n\nconst textareaClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('resize-none', !props.resize),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value),\n cls.m('more')\n ]\n})\n\nconst handleInput = (e: Event) => {\n const value = (e.target as HTMLTextAreaElement).value\n if (value.length > props.maxlength!) {\n // 如果输入的字符数超过了最大长度,截取字符串到最大长度\n const truncatedValue = value.slice(0, props.maxlength)\n emit('update:modelValue', truncatedValue)\n } else {\n // 如果没有超过最大长度,则正常更新模型值\n emit('update:modelValue', value)\n }\n}\n\nconst initNum = computed(() => {\n if (!props.maxlength) return 0\n return props.maxlength - (model.value?.length ?? 0)\n})\n\nconst handleClear = () => {\n model.value = ''\n emit('clear')\n}\n\nconst handleChange = (e: Event) => {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nwatch(\n [model, textareaRef],\n ([model, textareaRef]) => {\n if (!textareaRef) return\n if (!props.autosize) return\n calcTextareaHeight(textareaRef)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":"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"}
@@ -11,22 +11,22 @@ declare const __VLS_export: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {},
11
11
  "update:modelValue": (value: string | undefined) => any;
12
12
  } & {
13
13
  "update:modelValue": (value: string) => any;
14
- clear: () => any;
15
14
  change: (value: string) => any;
15
+ clear: () => any;
16
16
  focus: () => any;
17
17
  blur: () => any;
18
18
  }, string, _$vue.PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
19
19
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
20
- onClear?: (() => any) | undefined;
21
20
  onChange?: ((value: string) => any) | undefined;
21
+ onClear?: (() => any) | undefined;
22
22
  onFocus?: (() => any) | undefined;
23
23
  onBlur?: (() => any) | undefined;
24
24
  }>, {
25
25
  disabled: boolean;
26
- placeholder: string;
27
- clearable: boolean;
28
26
  readonly: boolean;
29
27
  resize: boolean;
28
+ placeholder: string;
29
+ clearable: boolean;
30
30
  autosize: boolean;
31
31
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
32
32
  declare const _default: typeof __VLS_export;
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","names":[],"sources":["../../../src/components/theme/theme.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <div :class=\"cls.e('header')\">\n <div :class=\"cls.e('header-copy')\">\n <strong>主题变量配置</strong>\n </div>\n <div :class=\"cls.e('tags')\">\n <span :class=\"cls.e('tag')\">基线 {{ baselineLabel }}</span>\n <span :class=\"cls.e('tag')\">{{ changedFieldKeys.size }} 改动</span>\n </div>\n </div>\n\n <div :class=\"cls.e('toolbar')\">\n <u-input\n v-model=\"keyword\"\n :class=\"cls.e('search')\"\n placeholder=\"搜索变量名、中文标签或分组\"\n />\n\n <button\n type=\"button\"\n :class=\"[cls.e('toggle'), bem.is('active', changedOnly)]\"\n @click=\"changedOnly = !changedOnly\"\n >\n {{ changedOnly ? '查看全部' : '仅看改动' }}\n </button>\n </div>\n\n <div :class=\"cls.e('body')\">\n <div :class=\"cls.e('nav')\">\n <button\n v-for=\"section in sectionStates\"\n :key=\"section.key\"\n type=\"button\"\n :class=\"[\n cls.e('nav-item'),\n bem.is('active', activeSection === section.key),\n bem.is('disabled', !section.visibleFields.length)\n ]\"\n @click=\"activeSection = section.key\"\n >\n <span :class=\"cls.e('nav-main')\">{{ section.title }}</span>\n <span :class=\"cls.e('nav-meta')\">\n {{ section.visibleFields.length }}/{{ section.fields.length }}\n <template v-if=\"section.changedCount\"> · {{ section.changedCount }} 改动 </template>\n </span>\n </button>\n </div>\n\n <div :class=\"cls.e('panel')\">\n <div v-if=\"activeState\" :class=\"cls.e('panel-head')\">\n <div>\n <h4 :class=\"cls.e('panel-title')\">{{ activeState.title }}</h4>\n <p :class=\"cls.e('panel-desc')\">{{ activeState.description }}</p>\n </div>\n\n <div :class=\"cls.e('panel-count')\">{{ activeState.visibleFields.length }} 项</div>\n </div>\n\n <div v-if=\"activeState?.visibleFields.length\" :class=\"cls.e('list')\">\n <div\n v-for=\"field in activeState.visibleFields\"\n :key=\"field.key\"\n :class=\"[cls.e('item'), bem.is('changed', isFieldChanged(field))]\"\n >\n <div :class=\"cls.e('item-head')\">\n <div :class=\"cls.e('item-copy')\">\n <label :class=\"cls.e('item-label')\">{{ field.label }}</label>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">Theme</span>\n <code :class=\"cls.e('item-code')\">{{ getThemePath(field.path) }}</code>\n </div>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">CSS</span>\n <code :class=\"cls.e('item-code')\">{{ getCssVarName(field.path) }}</code>\n </div>\n </div>\n\n <span v-if=\"isFieldChanged(field)\" :class=\"cls.e('item-badge')\"> 已修改 </span>\n </div>\n\n <div v-if=\"field.kind === 'palette'\" :class=\"cls.e('palette-field')\">\n <template v-if=\"field.path[0] === 'color'\">\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"String(getFieldValue(field) ?? '')\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"例如:#1E88E5\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n </template>\n <template v-else>\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? ''\n : String(getFieldValue(field) ?? '')\n \"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"输入颜色或变量\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n <div :class=\"cls.e('palette-var')\">\n <span :class=\"cls.e('palette-var-label')\">或选择变量</span>\n <u-select\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? String(getFieldValue(field) ?? '')\n : ''\n \"\n :options=\"colorVarOptions\"\n clearable\n placeholder=\"选择预设变量\"\n @update:model-value=\"(value) => updateField(field, value ?? '')\"\n >\n <template #default=\"{ option }\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n :style=\"`width: 14px; height: 14px; border-radius: 4px; background: ${option.value}`\"\n />\n <span style=\"font-size: 13px\">{{ option.label }}</span>\n </div>\n </template>\n </u-select>\n </div>\n </template>\n </div>\n\n <component\n v-else\n :is=\"getFieldComponent(field)\"\n :model-value=\"getFieldValue(field)\"\n v-bind=\"getFieldProps(field)\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n\n <p v-if=\"field.hint || field.placeholder\" :class=\"cls.e('item-hint')\">\n {{ field.hint ?? field.placeholder }}\n </p>\n </div>\n </div>\n\n <div v-else :class=\"cls.e('empty')\">\n <strong>没有匹配项</strong>\n <p>换一个关键字,或关闭“仅看改动”后再继续筛选。</p>\n </div>\n </div>\n </div>\n\n <div :class=\"cls.e('actions')\">\n <div :class=\"cls.e('preset-group')\">\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('light')\">\n 浅色预设\n </button>\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('dark')\">\n 深色预设\n </button>\n </div>\n\n <u-button :class=\"cls.e('action-btn')\" @click=\"handleResetTheme\"> 重置 </u-button>\n <u-button :class=\"cls.e('action-btn')\" type=\"primary\" @click=\"handleExportTheme\">\n 导出\n </u-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n type Theme,\n UITheme,\n currentTheme,\n darkTheme,\n lightTheme,\n loadTheme\n} from '@veltra/styles/theme'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef, watch, watchEffect } from 'vue'\n\nimport type { ThemeProps, _ThemeExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { UNumberInput } from '../number-input'\nimport { UPalette } from '../palette'\nimport { USelect } from '../select'\nimport { THEME_SECTIONS } from './schema'\nimport type { ThemeField } from './schema'\n\ndefineOptions({\n name: 'UTheme'\n})\n\nconst props = defineProps<ThemeProps>()\n\nconst cls = bem('theme')\n\nconst keyword = shallowRef('')\nconst changedOnly = shallowRef(false)\nconst activeSection = shallowRef(THEME_SECTIONS[0]!.key)\n\nconst colorVarOptions = computed(() => {\n const options: { label: string; value: string }[] = []\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (field.kind === 'palette') {\n const varName = `var(${getCssVarName(field.path)})`\n options.push({\n label: `${field.label}`,\n value: varName\n })\n }\n })\n })\n return options\n})\n\nconst editorTheme = shallowRef<UITheme>()\nconst baselineTheme = shallowRef<Theme>(createThemeSnapshot(lightTheme.theme))\nconst baselineLabel = shallowRef('浅色预设')\n\nconst lightPreset = createThemeSnapshot(lightTheme.theme)\nconst darkPreset = createThemeSnapshot(darkTheme.theme)\n\nconst sourceTheme = computed(() => {\n return props.theme ?? currentTheme.value ?? lightTheme\n})\n\nwatch(\n sourceTheme,\n (theme) => {\n if (!props.theme && theme === editorTheme.value) return\n\n const nextTheme = props.theme ? theme : new UITheme(createThemeSnapshot(theme.theme))\n\n editorTheme.value = nextTheme\n baselineTheme.value = createThemeSnapshot(nextTheme.theme)\n baselineLabel.value =\n theme === darkTheme\n ? '深色预设'\n : theme === lightTheme\n ? '浅色预设'\n : props.theme\n ? '外部主题'\n : '当前主题'\n\n if (!props.theme && currentTheme.value !== nextTheme) {\n loadTheme(nextTheme)\n }\n },\n { immediate: true }\n)\n\nconst changedFieldKeys = computed(() => {\n const keys = new Set<string>()\n\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (\n getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path) !==\n getByPath(baselineTheme.value, field.path)\n ) {\n keys.add(field.key)\n }\n })\n })\n\n return keys\n})\n\nconst sectionStates = computed(() => {\n const normalizedKeyword = keyword.value.trim().toLowerCase()\n\n return THEME_SECTIONS.map((section) => {\n const sectionMatched = `${section.title} ${section.description}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n const visibleFields = section.fields.filter((field) => {\n const matchesKeyword =\n !normalizedKeyword ||\n sectionMatched ||\n `${field.label} ${field.key} ${getThemePath(field.path)} ${getCssVarName(field.path)}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n if (!matchesKeyword) return false\n\n if (changedOnly.value && !changedFieldKeys.value.has(field.key)) {\n return false\n }\n\n return true\n })\n\n const changedCount = section.fields.filter((field) => {\n return changedFieldKeys.value.has(field.key)\n }).length\n\n return {\n ...section,\n visibleFields,\n changedCount\n }\n })\n})\n\nwatchEffect(() => {\n const current = sectionStates.value.find((section) => {\n return section.key === activeSection.value && section.visibleFields.length\n })\n\n if (current) return\n\n activeSection.value =\n sectionStates.value.find((section) => section.visibleFields.length)?.key ??\n THEME_SECTIONS[0]!.key\n})\n\nconst activeState = computed(() => {\n return (\n sectionStates.value.find((section) => section.key === activeSection.value) ??\n sectionStates.value[0]\n )\n})\n\nfunction createThemeSnapshot(theme: Theme): Theme {\n return JSON.parse(JSON.stringify(theme)) as Theme\n}\n\nfunction getByPath(source: Record<string, any>, path: string[]) {\n return path.reduce((current, key) => current?.[key], source)\n}\n\nfunction setByPath(source: Record<string, any>, path: string[], value: any) {\n let current = source\n\n path.slice(0, -1).forEach((key) => {\n current = current[key]\n })\n\n current[path[path.length - 1]!] = value\n}\n\nfunction getCssVarName(path: string[]) {\n return `--u-${path.join('-')}`\n}\n\nfunction getThemePath(path: string[]) {\n return path.reduce((expression, key) => {\n if (/^[A-Za-z_$][\\w$]*$/.test(key)) {\n return `${expression}.${key}`\n }\n\n return `${expression}['${key}']`\n }, 'theme')\n}\n\nfunction getFieldComponent(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return UNumberInput\n case 'select':\n return USelect\n default:\n return UInput\n }\n}\n\nfunction getFieldValue(field: ThemeField) {\n return getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path)\n}\n\nfunction getFieldProps(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return {\n min: field.min,\n max: field.max,\n step: field.step,\n suffix: field.suffix\n }\n case 'select':\n return {\n options: field.options,\n clearable: false,\n placeholder: '请选择'\n }\n case 'input':\n return {\n placeholder: field.placeholder\n }\n default:\n return {}\n }\n}\n\nfunction updateField(field: ThemeField, value: string | number | undefined) {\n if (!editorTheme.value) return\n\n const normalizedValue =\n field.kind === 'number'\n ? typeof value === 'number'\n ? value\n : Number(value || 0)\n : String(value ?? '')\n\n setByPath(editorTheme.value.theme, field.path, normalizedValue)\n editorTheme.value.render()\n}\n\nfunction isFieldChanged(field: ThemeField) {\n return changedFieldKeys.value.has(field.key)\n}\n\nfunction applySnapshot(snapshot: Theme, label?: string) {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(snapshot))\n baselineTheme.value = createThemeSnapshot(editorTheme.value.theme)\n\n if (label) {\n baselineLabel.value = label\n }\n\n editorTheme.value.render()\n}\n\nfunction applyPreset(type: 'light' | 'dark') {\n applySnapshot(\n type === 'dark' ? darkPreset : lightPreset,\n type === 'dark' ? '深色预设' : '浅色预设'\n )\n}\n\nfunction handleResetTheme() {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(baselineTheme.value))\n editorTheme.value.render()\n}\n\nfunction handleExportTheme() {\n if (!editorTheme.value) return\n\n const themeConfig = JSON.stringify(createThemeSnapshot(editorTheme.value.theme), null, 2)\n const blob = new Blob([themeConfig], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'theme-config.json'\n a.click()\n URL.revokeObjectURL(url)\n}\n\ndefineExpose<_ThemeExposed>({\n reset: handleResetTheme,\n exportTheme: handleExportTheme,\n applyLightPreset: () => applyPreset('light'),\n applyDarkPreset: () => applyPreset('dark')\n})\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"theme.js","names":[],"sources":["../../../src/components/theme/theme.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <div :class=\"cls.e('header')\">\n <div :class=\"cls.e('header-copy')\">\n <strong>主题变量配置</strong>\n </div>\n <div :class=\"cls.e('tags')\">\n <span :class=\"cls.e('tag')\">基线 {{ baselineLabel }}</span>\n <span :class=\"cls.e('tag')\">{{ changedFieldKeys.size }} 改动</span>\n </div>\n </div>\n\n <div :class=\"cls.e('toolbar')\">\n <u-input\n v-model=\"keyword\"\n :class=\"cls.e('search')\"\n placeholder=\"搜索变量名、中文标签或分组\"\n />\n\n <button\n type=\"button\"\n :class=\"[cls.e('toggle'), bem.is('active', changedOnly)]\"\n @click=\"changedOnly = !changedOnly\"\n >\n {{ changedOnly ? '查看全部' : '仅看改动' }}\n </button>\n </div>\n\n <div :class=\"cls.e('body')\">\n <div :class=\"cls.e('nav')\">\n <button\n v-for=\"section in sectionStates\"\n :key=\"section.key\"\n type=\"button\"\n :class=\"[\n cls.e('nav-item'),\n bem.is('active', activeSection === section.key),\n bem.is('disabled', !section.visibleFields.length)\n ]\"\n @click=\"activeSection = section.key\"\n >\n <span :class=\"cls.e('nav-main')\">{{ section.title }}</span>\n <span :class=\"cls.e('nav-meta')\">\n {{ section.visibleFields.length }}/{{ section.fields.length }}\n <template v-if=\"section.changedCount\"> · {{ section.changedCount }} 改动 </template>\n </span>\n </button>\n </div>\n\n <div :class=\"cls.e('panel')\">\n <div v-if=\"activeState\" :class=\"cls.e('panel-head')\">\n <div>\n <h4 :class=\"cls.e('panel-title')\">{{ activeState.title }}</h4>\n <p :class=\"cls.e('panel-desc')\">{{ activeState.description }}</p>\n </div>\n\n <div :class=\"cls.e('panel-count')\">{{ activeState.visibleFields.length }} 项</div>\n </div>\n\n <div v-if=\"activeState?.visibleFields.length\" :class=\"cls.e('list')\">\n <div\n v-for=\"field in activeState.visibleFields\"\n :key=\"field.key\"\n :class=\"[cls.e('item'), bem.is('changed', isFieldChanged(field))]\"\n >\n <div :class=\"cls.e('item-head')\">\n <div :class=\"cls.e('item-copy')\">\n <label :class=\"cls.e('item-label')\">{{ field.label }}</label>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">Theme</span>\n <code :class=\"cls.e('item-code')\">{{ getThemePath(field.path) }}</code>\n </div>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">CSS</span>\n <code :class=\"cls.e('item-code')\">{{ getCssVarName(field.path) }}</code>\n </div>\n </div>\n\n <span v-if=\"isFieldChanged(field)\" :class=\"cls.e('item-badge')\"> 已修改 </span>\n </div>\n\n <div v-if=\"field.kind === 'palette'\" :class=\"cls.e('palette-field')\">\n <template v-if=\"field.path[0] === 'color'\">\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"String(getFieldValue(field) ?? '')\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"例如:#1E88E5\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n </template>\n <template v-else>\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? ''\n : String(getFieldValue(field) ?? '')\n \"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"输入颜色或变量\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n <div :class=\"cls.e('palette-var')\">\n <span :class=\"cls.e('palette-var-label')\">或选择变量</span>\n <u-select\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? String(getFieldValue(field) ?? '')\n : ''\n \"\n :options=\"colorVarOptions\"\n clearable\n placeholder=\"选择预设变量\"\n @update:model-value=\"(value) => updateField(field, value ?? '')\"\n >\n <template #default=\"{ option }\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n :style=\"`width: 14px; height: 14px; border-radius: 4px; background: ${option.value}`\"\n />\n <span style=\"font-size: 13px\">{{ option.label }}</span>\n </div>\n </template>\n </u-select>\n </div>\n </template>\n </div>\n\n <component\n v-else\n :is=\"getFieldComponent(field)\"\n :model-value=\"getFieldValue(field)\"\n v-bind=\"getFieldProps(field)\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n\n <p v-if=\"field.hint || field.placeholder\" :class=\"cls.e('item-hint')\">\n {{ field.hint ?? field.placeholder }}\n </p>\n </div>\n </div>\n\n <div v-else :class=\"cls.e('empty')\">\n <strong>没有匹配项</strong>\n <p>换一个关键字,或关闭“仅看改动”后再继续筛选。</p>\n </div>\n </div>\n </div>\n\n <div :class=\"cls.e('actions')\">\n <div :class=\"cls.e('preset-group')\">\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('light')\">\n 浅色预设\n </button>\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('dark')\">\n 深色预设\n </button>\n </div>\n\n <u-button :class=\"cls.e('action-btn')\" @click=\"handleResetTheme\"> 重置 </u-button>\n <u-button :class=\"cls.e('action-btn')\" type=\"primary\" @click=\"handleExportTheme\">\n 导出\n </u-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n type Theme,\n UITheme,\n currentTheme,\n darkTheme,\n lightTheme,\n loadTheme\n} from '@veltra/styles/theme'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef, watch, watchEffect } from 'vue'\n\nimport type { ThemeProps, _ThemeExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { UNumberInput } from '../number-input'\nimport { UPalette } from '../palette'\nimport { USelect } from '../select'\nimport { THEME_SECTIONS } from './schema'\nimport type { ThemeField } from './schema'\n\ndefineOptions({\n name: 'UTheme'\n})\n\nconst props = defineProps<ThemeProps>()\n\nconst cls = bem('theme')\n\nconst keyword = shallowRef('')\nconst changedOnly = shallowRef(false)\nconst activeSection = shallowRef(THEME_SECTIONS[0]!.key)\n\nconst colorVarOptions = computed(() => {\n const options: { label: string; value: string }[] = []\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (field.kind === 'palette') {\n const varName = `var(${getCssVarName(field.path)})`\n options.push({\n label: `${field.label}`,\n value: varName\n })\n }\n })\n })\n return options\n})\n\nconst editorTheme = shallowRef<UITheme>()\nconst baselineTheme = shallowRef<Theme>(createThemeSnapshot(lightTheme.theme))\nconst baselineLabel = shallowRef('浅色预设')\n\nconst lightPreset = createThemeSnapshot(lightTheme.theme)\nconst darkPreset = createThemeSnapshot(darkTheme.theme)\n\nconst sourceTheme = computed(() => {\n return props.theme ?? currentTheme.value ?? lightTheme\n})\n\nwatch(\n sourceTheme,\n (theme) => {\n if (!props.theme && theme === editorTheme.value) return\n\n const nextTheme = props.theme ? theme : new UITheme(createThemeSnapshot(theme.theme))\n\n editorTheme.value = nextTheme\n baselineTheme.value = createThemeSnapshot(nextTheme.theme)\n baselineLabel.value =\n theme === darkTheme\n ? '深色预设'\n : theme === lightTheme\n ? '浅色预设'\n : props.theme\n ? '外部主题'\n : '当前主题'\n\n if (!props.theme && currentTheme.value !== nextTheme) {\n loadTheme(nextTheme)\n }\n },\n { immediate: true }\n)\n\nconst changedFieldKeys = computed(() => {\n const keys = new Set<string>()\n\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (\n getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path) !==\n getByPath(baselineTheme.value, field.path)\n ) {\n keys.add(field.key)\n }\n })\n })\n\n return keys\n})\n\nconst sectionStates = computed(() => {\n const normalizedKeyword = keyword.value.trim().toLowerCase()\n\n return THEME_SECTIONS.map((section) => {\n const sectionMatched = `${section.title} ${section.description}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n const visibleFields = section.fields.filter((field) => {\n const matchesKeyword =\n !normalizedKeyword ||\n sectionMatched ||\n `${field.label} ${field.key} ${getThemePath(field.path)} ${getCssVarName(field.path)}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n if (!matchesKeyword) return false\n\n if (changedOnly.value && !changedFieldKeys.value.has(field.key)) {\n return false\n }\n\n return true\n })\n\n const changedCount = section.fields.filter((field) => {\n return changedFieldKeys.value.has(field.key)\n }).length\n\n return {\n ...section,\n visibleFields,\n changedCount\n }\n })\n})\n\nwatchEffect(() => {\n const current = sectionStates.value.find((section) => {\n return section.key === activeSection.value && section.visibleFields.length\n })\n\n if (current) return\n\n activeSection.value =\n sectionStates.value.find((section) => section.visibleFields.length)?.key ??\n THEME_SECTIONS[0]!.key\n})\n\nconst activeState = computed(() => {\n return (\n sectionStates.value.find((section) => section.key === activeSection.value) ??\n sectionStates.value[0]\n )\n})\n\nfunction createThemeSnapshot(theme: Theme): Theme {\n return JSON.parse(JSON.stringify(theme)) as Theme\n}\n\nfunction getByPath(source: Record<string, any>, path: string[]) {\n return path.reduce((current, key) => current?.[key], source)\n}\n\nfunction setByPath(source: Record<string, any>, path: string[], value: any) {\n let current = source\n\n path.slice(0, -1).forEach((key) => {\n current = current[key]\n })\n\n current[path[path.length - 1]!] = value\n}\n\nfunction getCssVarName(path: string[]) {\n return `--u-${path.join('-')}`\n}\n\nfunction getThemePath(path: string[]) {\n return path.reduce((expression, key) => {\n if (/^[A-Za-z_$][\\w$]*$/.test(key)) {\n return `${expression}.${key}`\n }\n\n return `${expression}['${key}']`\n }, 'theme')\n}\n\nfunction getFieldComponent(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return UNumberInput\n case 'select':\n return USelect\n default:\n return UInput\n }\n}\n\nfunction getFieldValue(field: ThemeField) {\n return getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path)\n}\n\nfunction getFieldProps(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return {\n min: field.min,\n max: field.max,\n step: field.step,\n suffix: field.suffix\n }\n case 'select':\n return {\n options: field.options,\n clearable: false,\n placeholder: '请选择'\n }\n case 'input':\n return {\n placeholder: field.placeholder\n }\n default:\n return {}\n }\n}\n\nfunction updateField(field: ThemeField, value: string | number | undefined) {\n if (!editorTheme.value) return\n\n const normalizedValue =\n field.kind === 'number'\n ? typeof value === 'number'\n ? value\n : Number(value || 0)\n : String(value ?? '')\n\n setByPath(editorTheme.value.theme, field.path, normalizedValue)\n editorTheme.value.render()\n}\n\nfunction isFieldChanged(field: ThemeField) {\n return changedFieldKeys.value.has(field.key)\n}\n\nfunction applySnapshot(snapshot: Theme, label?: string) {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(snapshot))\n baselineTheme.value = createThemeSnapshot(editorTheme.value.theme)\n\n if (label) {\n baselineLabel.value = label\n }\n\n editorTheme.value.render()\n}\n\nfunction applyPreset(type: 'light' | 'dark') {\n applySnapshot(\n type === 'dark' ? darkPreset : lightPreset,\n type === 'dark' ? '深色预设' : '浅色预设'\n )\n}\n\nfunction handleResetTheme() {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(baselineTheme.value))\n editorTheme.value.render()\n}\n\nfunction handleExportTheme() {\n if (!editorTheme.value) return\n\n const themeConfig = JSON.stringify(createThemeSnapshot(editorTheme.value.theme), null, 2)\n const blob = new Blob([themeConfig], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'theme-config.json'\n a.click()\n URL.revokeObjectURL(url)\n}\n\ndefineExpose<_ThemeExposed>({\n reset: handleResetTheme,\n exportTheme: handleExportTheme,\n applyLightPreset: () => applyPreset('light'),\n applyDarkPreset: () => applyPreset('dark')\n})\n</script>\n"],"mappings":"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"}
@@ -11,11 +11,11 @@ declare const __VLS_base: _$vue.DefineComponent<TipProps, {}, {}, {}, {}, _$vue.
11
11
  }, string, _$vue.PublicProps, Readonly<TipProps> & Readonly<{
12
12
  "onUpdate:visible"?: ((value: boolean) => any) | undefined;
13
13
  }>, {
14
- direction: TipDirection;
15
14
  trigger: "hover" | "click";
16
15
  contentTag: string;
17
16
  visible: boolean;
18
17
  content: string;
18
+ direction: TipDirection;
19
19
  alignment: TipAlign;
20
20
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
21
21
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -19,26 +19,38 @@
19
19
  border-radius: var(--u-radius-small);
20
20
  padding: var(--u-gap-small);
21
21
  line-height: 1;
22
+ gap: var(--u-gap-small);
22
23
  }
23
24
  .u-tree--small .u-tree__checkbox {
24
25
  margin-right: var(--u-gap-small);
25
26
  }
27
+ .u-tree--small .u-tree__node {
28
+ min-height: 28px;
29
+ }
26
30
  .u-tree--default .u-tree__node-content {
27
31
  border-radius: var(--u-radius-default);
28
32
  padding: var(--u-gap-default);
29
33
  line-height: 1;
34
+ gap: var(--u-gap-default);
30
35
  }
31
36
  .u-tree--default .u-tree__checkbox {
32
37
  margin-right: var(--u-gap-default);
33
38
  }
39
+ .u-tree--default .u-tree__node {
40
+ min-height: 32px;
41
+ }
34
42
  .u-tree--large .u-tree__node-content {
35
43
  border-radius: var(--u-radius-large);
36
44
  padding: var(--u-gap-large);
37
45
  line-height: 1;
46
+ gap: var(--u-gap-large);
38
47
  }
39
48
  .u-tree--large .u-tree__checkbox {
40
49
  margin-right: var(--u-gap-large);
41
50
  }
51
+ .u-tree--large .u-tree__node {
52
+ min-height: 40px;
53
+ }
42
54
  .u-tree__checkbox {
43
55
  height: fit-content;
44
56
  flex-shrink: 0;
@@ -52,6 +64,9 @@
52
64
  left: 0;
53
65
  width: 100%;
54
66
  }
67
+ .u-tree__wrap:not(.is-virtual) .u-tree__node + .u-tree__wrap:not(.is-virtual) .u-tree__node {
68
+ margin-top: 2px;
69
+ }
55
70
  .u-tree.is-selectable .u-tree__node:not(.is-disabled) .u-tree__node-content:hover {
56
71
  background-color: var(--u-bg-color-hover);
57
72
  }
@@ -59,17 +74,27 @@
59
74
  background-color: var(--u-bg-color-hover);
60
75
  }
61
76
  .u-tree__node {
77
+ position: relative;
62
78
  cursor: pointer;
63
- margin-bottom: 0.2rem;
64
79
  display: flex;
65
80
  justify-content: flex-start;
66
81
  align-items: center;
67
82
  flex-wrap: nowrap;
68
83
  }
84
+ .u-tree__node.is-selected::before {
85
+ content: "";
86
+ position: absolute;
87
+ left: 0;
88
+ top: 4px;
89
+ bottom: 4px;
90
+ width: 3px;
91
+ border-radius: 3px;
92
+ background-color: var(--u-color-primary);
93
+ }
69
94
  .u-tree__node.is-selected .u-tree__node-content {
70
- background-color: var(--u-color-primary-light-9) !important;
95
+ background-color: var(--u-color-primary-light-9);
71
96
  color: var(--u-color-primary);
72
- font-weight: bold;
97
+ font-weight: 500;
73
98
  }
74
99
  .u-tree__node.is-expanded .u-tree__expand-icon {
75
100
  transform: rotate(90deg);
@@ -80,48 +105,45 @@
80
105
  .u-tree__node.is-disabled .u-tree__node-content {
81
106
  color: var(--u-text-color-disabled);
82
107
  }
83
- .u-tree__expand-icon, .u-tree__icon-placeholder {
108
+ .u-tree__node.is-disabled .u-tree__node-content:hover {
109
+ background-color: transparent;
110
+ }
111
+ .u-tree__indent {
84
112
  flex-shrink: 0;
85
113
  width: 20px;
86
- height: 20px;
114
+ }
115
+ .u-tree__indent__indent--leaf {
116
+ width: 20px;
87
117
  }
88
118
  .u-tree__expand-icon {
89
119
  cursor: pointer;
90
- transition: transform 0.2s, background-color 0.2s;
91
120
  flex-shrink: 0;
121
+ width: 20px;
122
+ height: 20px;
92
123
  font-size: 20px;
93
124
  border-radius: 50%;
125
+ transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
94
126
  }
95
127
  .u-tree__expand-icon:hover {
96
- background-color: var(--u-color-primary-light-9);
97
- }
98
- .u-tree__icon-placeholder {
99
- padding: 5px;
100
- }
101
- .u-tree__icon-placeholder::before {
102
- content: "";
103
- box-sizing: border-box;
104
- width: 100%;
105
- height: 100%;
106
- display: block;
107
- border-radius: 50%;
108
- border: 2px solid var(--u-text-color-main);
128
+ background-color: var(--u-bg-color-hover);
109
129
  }
110
130
  .u-tree__node-content {
111
131
  flex-grow: 1;
112
132
  overflow: hidden;
113
133
  user-select: none;
114
- word-break: break-all;
115
- transition: background-color 0.25s;
134
+ word-break: break-word;
135
+ transition: background-color 0.2s ease;
116
136
  display: flex;
117
137
  justify-content: flex-start;
118
138
  align-items: center;
119
139
  flex-wrap: nowrap;
120
140
  }
121
141
  .u-tree__ripple {
122
- background-color: var(--u-color-primary-light-7);
123
- opacity: 0.5;
142
+ background-color: var(--u-color-primary-light-5);
143
+ opacity: 0.25;
124
144
  }
125
145
  .u-tree__empty {
126
146
  text-align: center;
147
+ padding: var(--u-gap-default) 0;
148
+ color: var(--u-text-color-secondary);
127
149
  }
@@ -2,8 +2,8 @@ import _sfc_main$1 from "../icon/icon.js";
2
2
  import NodeRender from "../node-render/node-render.js";
3
3
  import _sfc_main$2 from "../checkbox/checkbox.js";
4
4
  import { TreeDIKey } from "./di.js";
5
- import { createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, inject, normalizeClass, normalizeStyle, openBlock, unref, withCtx, withDirectives, withModifiers } from "vue";
6
- import { bem, withUnit } from "@veltra/utils";
5
+ import { Fragment, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, inject, normalizeClass, openBlock, renderList, unref, withCtx, withDirectives, withModifiers } from "vue";
6
+ import { bem } from "@veltra/utils";
7
7
  import { vRipple } from "@veltra/directives";
8
8
  import { ArrowRight } from "@veltra/icons/normal";
9
9
  //#region src/components/tree/tree-node.vue
@@ -12,11 +12,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
12
12
  __name: "tree-node",
13
13
  props: {
14
14
  node: {},
15
+ index: {},
15
16
  measureElement: { type: Function }
16
17
  },
17
18
  setup(__props) {
18
19
  const props = __props;
19
20
  const { treeProps, treeEmit, cls, getTreeSlotsNode, getFlattedNodes, toggleCheck, handleSelect } = inject(TreeDIKey);
21
+ function measureRef(el) {
22
+ if (typeof props.index !== "number" || !props.measureElement) return;
23
+ props.measureElement(props.index, el);
24
+ }
20
25
  function toggleExpand() {
21
26
  const { node } = props;
22
27
  node.expanded = !node.expanded;
@@ -40,39 +45,49 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
40
45
  unref(bem).is("expanded", __props.node.expanded),
41
46
  unref(bem).is("disabled", __props.node.disabled)
42
47
  ]),
43
- style: normalizeStyle({ paddingLeft: unref(withUnit)(__props.node.depth * 20 - 20, "px") }),
44
- ref: __props.measureElement
45
- }, [!__props.node.isLeaf ? (openBlock(), createBlock(unref(_sfc_main$1), {
46
- key: 0,
47
- class: normalizeClass(unref(cls).e("expand-icon")),
48
- onClick: withModifiers(toggleExpand, ["stop"])
49
- }, {
50
- default: withCtx(() => [createVNode(unref(ArrowRight))]),
51
- _: 1
52
- }, 8, ["class"])) : (openBlock(), createElementBlock("i", {
53
- key: 1,
54
- class: normalizeClass(unref(cls).e("icon-placeholder"))
55
- }, null, 2)), withDirectives((openBlock(), createElementBlock("div", {
56
- class: normalizeClass(unref(cls).e("node-content")),
57
- onClick: handleClick,
58
- onContextmenu: _cache[1] || (_cache[1] = ($event) => unref(treeEmit)("node-contextmenu", $event, __props.node))
59
- }, [unref(treeProps).checkable ? (openBlock(), createBlock(_sfc_main$2, {
60
- key: 0,
61
- class: normalizeClass(unref(cls).e("checkbox")),
62
- "model-value": __props.node.checked,
63
- indeterminate: __props.node.indeterminate,
64
- disabled: __props.node.disabled,
65
- onChange: handleChange,
66
- onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"]))
67
- }, null, 8, [
68
- "class",
69
- "model-value",
70
- "indeterminate",
71
- "disabled"
72
- ])) : createCommentVNode("v-if", true), createVNode(unref(NodeRender), { content: unref(getTreeSlotsNode)({
73
- node: __props.node,
74
- data: __props.node.data
75
- }) }, null, 8, ["content"])], 34)), [[unref(vRipple), (unref(treeProps).checkable || unref(treeProps).selectable) && !__props.node.disabled ? unref(cls).e("ripple") : false]])], 6);
48
+ ref: measureRef
49
+ }, [
50
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.node.depth, (i) => {
51
+ return openBlock(), createElementBlock("span", {
52
+ key: i,
53
+ class: normalizeClass(unref(cls).e("indent")),
54
+ "aria-hidden": "true"
55
+ }, null, 2);
56
+ }), 128)),
57
+ !__props.node.isLeaf ? (openBlock(), createBlock(unref(_sfc_main$1), {
58
+ key: 0,
59
+ class: normalizeClass(unref(cls).e("expand-icon")),
60
+ onClick: withModifiers(toggleExpand, ["stop"])
61
+ }, {
62
+ default: withCtx(() => [createVNode(unref(ArrowRight))]),
63
+ _: 1
64
+ }, 8, ["class"])) : (openBlock(), createElementBlock("i", {
65
+ key: 1,
66
+ class: normalizeClass([unref(cls).e("indent"), unref(cls).em("indent", "leaf")]),
67
+ "aria-hidden": "true"
68
+ }, null, 2)),
69
+ withDirectives((openBlock(), createElementBlock("div", {
70
+ class: normalizeClass(unref(cls).e("node-content")),
71
+ onClick: handleClick,
72
+ onContextmenu: _cache[1] || (_cache[1] = ($event) => unref(treeEmit)("node-contextmenu", $event, __props.node))
73
+ }, [unref(treeProps).checkable ? (openBlock(), createBlock(_sfc_main$2, {
74
+ key: 0,
75
+ class: normalizeClass(unref(cls).e("checkbox")),
76
+ "model-value": __props.node.checked,
77
+ indeterminate: __props.node.indeterminate,
78
+ disabled: __props.node.disabled,
79
+ onChange: handleChange,
80
+ onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"]))
81
+ }, null, 8, [
82
+ "class",
83
+ "model-value",
84
+ "indeterminate",
85
+ "disabled"
86
+ ])) : createCommentVNode("v-if", true), createVNode(unref(NodeRender), { content: unref(getTreeSlotsNode)({
87
+ node: __props.node,
88
+ data: __props.node.data
89
+ }) }, null, 8, ["content"])], 34)), [[unref(vRipple), (unref(treeProps).checkable || unref(treeProps).selectable) && !__props.node.disabled ? unref(cls).e("ripple") : false]])
90
+ ], 2);
76
91
  };
77
92
  }
78
93
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tree-node.js","names":[],"sources":["../../../src/components/tree/tree-node.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('node'), bem.is('expanded', node.expanded), bem.is('disabled', node.disabled)]\"\n :style=\"{ paddingLeft: withUnit(node.depth * 20 - 20, 'px') }\"\n :ref=\"measureElement\"\n >\n <u-icon v-if=\"!node.isLeaf\" :class=\"cls.e('expand-icon')\" @click.stop=\"toggleExpand\">\n <ArrowRight />\n </u-icon>\n <i v-else :class=\"cls.e('icon-placeholder')\"> </i>\n\n <div\n :class=\"cls.e('node-content')\"\n @click=\"handleClick\"\n @contextmenu=\"treeEmit('node-contextmenu', $event, node)\"\n v-ripple=\"\n (treeProps.checkable || treeProps.selectable) && !node.disabled ? cls.e('ripple') : false\n \"\n >\n <u-checkbox\n v-if=\"treeProps.checkable\"\n :class=\"cls.e('checkbox')\"\n :model-value=\"node.checked\"\n :indeterminate=\"node.indeterminate\"\n :disabled=\"node.disabled\"\n @change=\"handleChange\"\n @click.stop\n />\n\n <u-node-render :content=\"getTreeSlotsNode({ node, data: node.data })\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { vRipple } from '@veltra/directives'\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem, withUnit } from '@veltra/utils'\nimport { inject } from 'vue'\n\nimport type { TreeNodeProps } from '../../types'\nimport UCheckbox from '../checkbox/checkbox.vue'\nimport { UIcon } from '../icon'\nimport { UNodeRender } from '../node-render'\nimport { TreeDIKey } from './di'\n\ndefineOptions({\n name: 'TreeNode'\n})\n\nconst props = defineProps<TreeNodeProps>()\n\nconst { treeProps, treeEmit, cls, getTreeSlotsNode, getFlattedNodes, toggleCheck, handleSelect } =\n inject(TreeDIKey)!\n\nfunction toggleExpand() {\n const { node } = props\n node.expanded = !node.expanded\n getFlattedNodes()\n\n treeEmit('expand', node)\n}\n\nfunction handleChange(checked: boolean, e: MouseEvent) {\n toggleCheck(props.node, checked, e.ctrlKey)\n}\n\nfunction handleClick(e: MouseEvent) {\n const { node } = props\n treeEmit('node-click', node)\n\n treeProps.selectable && handleSelect(node)\n treeProps.expandOnClickNode && toggleExpand()\n treeProps.checkable &&\n !node.disabled &&\n !treeProps.expandOnClickNode &&\n toggleCheck(node, !node.checked, e.ctrlKey)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAkDA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,UAAU,KAAK,kBAAkB,iBAAiB,aAAa,iBAChF,OAAO,UAAU;EAEnB,SAAS,eAAe;GACtB,MAAM,EAAE,SAAS;AACjB,QAAK,WAAW,CAAC,KAAK;AACtB,oBAAgB;AAEhB,YAAS,UAAU,KAAI;;EAGzB,SAAS,aAAa,SAAkB,GAAe;AACrD,eAAY,MAAM,MAAM,SAAS,EAAE,QAAO;;EAG5C,SAAS,YAAY,GAAe;GAClC,MAAM,EAAE,SAAS;AACjB,YAAS,cAAc,KAAI;AAE3B,aAAU,cAAc,aAAa,KAAI;AACzC,aAAU,qBAAqB,cAAa;AAC5C,aAAU,aACR,CAAC,KAAK,YACN,CAAC,UAAU,qBACX,YAAY,MAAM,CAAC,KAAK,SAAS,EAAE,QAAO;;;uBA3E5C,mBA8BM,OAAA;IA7BH,OAAK,eAAA;KAAG,MAAA,IAAG,CAAC,EAAC,OAAA;KAAU,MAAA,IAAG,CAAC,GAAE,YAAa,QAAA,KAAK,SAAQ;KAAG,MAAA,IAAG,CAAC,GAAE,YAAa,QAAA,KAAK,SAAQ;KAAA,CAAA;IAC1F,OAAK,eAAA,EAAA,aAAiB,MAAA,SAAQ,CAAC,QAAA,KAAK,QAAK,KAAA,IAAA,KAAA,EAAA,CAAA;IACzC,KAAK,QAAA;QAES,QAAA,KAAK,UAAA,WAAA,EAApB,YAES,MAAA,YAAA,EAAA;;IAFoB,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,cAAA,CAAA;IAAkB,SAAK,cAAO,cAAY,CAAA,OAAA,CAAA;;2BACnE,CAAd,YAAc,MAAA,WAAA,CAAA,CAAA,CAAA;;qCAEhB,mBAAkD,KAAA;;IAAvC,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,mBAAA,CAAA;8CAEvB,mBAmBM,OAAA;IAlBH,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,eAAA,CAAA;IACZ,SAAO;IACP,eAAW,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,SAAQ,CAAA,oBAAqB,QAAQ,QAAA,KAAI;OAM/C,MAAA,UAAS,CAAC,aAAA,WAAA,EADlB,YAQE,aAAA;;IANC,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,WAAA,CAAA;IACZ,eAAa,QAAA,KAAK;IAClB,eAAe,QAAA,KAAK;IACpB,UAAU,QAAA,KAAK;IACf,UAAQ;IACR,SAAK,OAAA,OAAA,OAAA,KAAA,oBAAN,IAAW,CAAA,OAAA,CAAA;;;;;;2CAGb,YAAwE,MAAA,WAAA,EAAA,EAAxD,SAAS,MAAA,iBAAgB,CAAA;IAAA,MAAG,QAAA;IAAI,MAAQ,QAAA,KAAK;IAAI,CAAA,EAAA,EAAA,MAAA,GAAA,CAAA,UAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAA,CAAA,MAAA,QAAA,GAd7C,MAAA,UAAS,CAAC,aAAa,MAAA,UAAS,CAAC,eAAU,CAAM,QAAA,KAAK,WAAW,MAAA,IAAG,CAAC,EAAC,SAAA,GAAA,MAAA,CAAA,CAAA,CAAA,EAAA,EAAA"}
1
+ {"version":3,"file":"tree-node.js","names":[],"sources":["../../../src/components/tree/tree-node.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('node'), bem.is('expanded', node.expanded), bem.is('disabled', node.disabled)]\"\n :ref=\"measureRef\"\n >\n <span v-for=\"i in node.depth\" :key=\"i\" :class=\"cls.e('indent')\" aria-hidden=\"true\"></span>\n\n <u-icon v-if=\"!node.isLeaf\" :class=\"cls.e('expand-icon')\" @click.stop=\"toggleExpand\">\n <ArrowRight />\n </u-icon>\n <i v-else :class=\"[cls.e('indent'), cls.em('indent', 'leaf')]\" aria-hidden=\"true\"></i>\n\n <div\n :class=\"cls.e('node-content')\"\n @click=\"handleClick\"\n @contextmenu=\"treeEmit('node-contextmenu', $event, node)\"\n v-ripple=\"\n (treeProps.checkable || treeProps.selectable) && !node.disabled ? cls.e('ripple') : false\n \"\n >\n <u-checkbox\n v-if=\"treeProps.checkable\"\n :class=\"cls.e('checkbox')\"\n :model-value=\"node.checked\"\n :indeterminate=\"node.indeterminate\"\n :disabled=\"node.disabled\"\n @change=\"handleChange\"\n @click.stop\n />\n\n <u-node-render :content=\"getTreeSlotsNode({ node, data: node.data })\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { vRipple } from '@veltra/directives'\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { inject } from 'vue'\n\nimport type { TreeNodeProps } from '../../types'\nimport UCheckbox from '../checkbox/checkbox.vue'\nimport { UIcon } from '../icon'\nimport { UNodeRender } from '../node-render'\nimport { TreeDIKey } from './di'\n\ndefineOptions({\n name: 'TreeNode'\n})\n\nconst props = defineProps<TreeNodeProps>()\n\nconst { treeProps, treeEmit, cls, getTreeSlotsNode, getFlattedNodes, toggleCheck, handleSelect } =\n inject(TreeDIKey)!\n\nfunction measureRef(el: unknown) {\n if (typeof props.index !== 'number' || !props.measureElement) return\n props.measureElement(props.index, el as Element | null)\n}\n\nfunction toggleExpand() {\n const { node } = props\n node.expanded = !node.expanded\n getFlattedNodes()\n\n treeEmit('expand', node)\n}\n\nfunction handleChange(checked: boolean, e: MouseEvent) {\n toggleCheck(props.node, checked, e.ctrlKey)\n}\n\nfunction handleClick(e: MouseEvent) {\n const { node } = props\n treeEmit('node-click', node)\n\n treeProps.selectable && handleSelect(node)\n treeProps.expandOnClickNode && toggleExpand()\n treeProps.checkable &&\n !node.disabled &&\n !treeProps.expandOnClickNode &&\n toggleCheck(node, !node.checked, e.ctrlKey)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAmDA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,UAAU,KAAK,kBAAkB,iBAAiB,aAAa,iBAChF,OAAO,UAAU;EAEnB,SAAS,WAAW,IAAa;AAC/B,OAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,eAAgB;AAC9D,SAAM,eAAe,MAAM,OAAO,GAAoB;;EAGxD,SAAS,eAAe;GACtB,MAAM,EAAE,SAAS;AACjB,QAAK,WAAW,CAAC,KAAK;AACtB,oBAAgB;AAEhB,YAAS,UAAU,KAAI;;EAGzB,SAAS,aAAa,SAAkB,GAAe;AACrD,eAAY,MAAM,MAAM,SAAS,EAAE,QAAO;;EAG5C,SAAS,YAAY,GAAe;GAClC,MAAM,EAAE,SAAS;AACjB,YAAS,cAAc,KAAI;AAE3B,aAAU,cAAc,aAAa,KAAI;AACzC,aAAU,qBAAqB,cAAa;AAC5C,aAAU,aACR,CAAC,KAAK,YACN,CAAC,UAAU,qBACX,YAAY,MAAM,CAAC,KAAK,SAAS,EAAE,QAAO;;;uBAjF5C,mBA+BM,OAAA;IA9BH,OAAK,eAAA;KAAG,MAAA,IAAG,CAAC,EAAC,OAAA;KAAU,MAAA,IAAG,CAAC,GAAE,YAAa,QAAA,KAAK,SAAQ;KAAG,MAAA,IAAG,CAAC,GAAE,YAAa,QAAA,KAAK,SAAQ;KAAA,CAAA;IAC1F,KAAK;;sBAEN,mBAA0F,UAAA,MAAA,WAAxE,QAAA,KAAK,QAAV,MAAC;yBAAd,mBAA0F,QAAA;MAA3D,KAAK;MAAI,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,SAAA,CAAA;MAAY,eAAY;;;KAE7D,QAAA,KAAK,UAAA,WAAA,EAApB,YAES,MAAA,YAAA,EAAA;;KAFoB,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,cAAA,CAAA;KAAkB,SAAK,cAAO,cAAY,CAAA,OAAA,CAAA;;4BACnE,CAAd,YAAc,MAAA,WAAA,CAAA,CAAA,CAAA;;sCAEhB,mBAAsF,KAAA;;KAA3E,OAAK,eAAA,CAAG,MAAA,IAAG,CAAC,EAAC,SAAA,EAAY,MAAA,IAAG,CAAC,GAAE,UAAA,OAAA,CAAA,CAAA;KAAqB,eAAY;;iCAE3E,mBAmBM,OAAA;KAlBH,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,eAAA,CAAA;KACZ,SAAO;KACP,eAAW,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,SAAQ,CAAA,oBAAqB,QAAQ,QAAA,KAAI;QAM/C,MAAA,UAAS,CAAC,aAAA,WAAA,EADlB,YAQE,aAAA;;KANC,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,WAAA,CAAA;KACZ,eAAa,QAAA,KAAK;KAClB,eAAe,QAAA,KAAK;KACpB,UAAU,QAAA,KAAK;KACf,UAAQ;KACR,SAAK,OAAA,OAAA,OAAA,KAAA,oBAAN,IAAW,CAAA,OAAA,CAAA;;;;;;4CAGb,YAAwE,MAAA,WAAA,EAAA,EAAxD,SAAS,MAAA,iBAAgB,CAAA;KAAA,MAAG,QAAA;KAAI,MAAQ,QAAA,KAAK;KAAI,CAAA,EAAA,EAAA,MAAA,GAAA,CAAA,UAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAA,CAAA,MAAA,QAAA,GAd7C,MAAA,UAAS,CAAC,aAAa,MAAA,UAAS,CAAC,eAAU,CAAM,QAAA,KAAK,WAAW,MAAA,IAAG,CAAC,EAAC,SAAA,GAAA,MAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tree-node2.js","names":["TreeNode","CoreTreeNode"],"sources":["../../../src/components/tree/tree-node.ts"],"sourcesContent":["import { TreeNode as CoreTreeNode, o } from '@cat-kit/core'\nimport { shallowReactive } from 'vue'\n\nexport class TreeNode<Val extends Record<string, any> = Record<string, any>> extends CoreTreeNode<\n Val,\n TreeNode<Val>\n> {\n declare parent?: TreeNode<Val>\n\n declare children?: TreeNode<Val>[]\n\n expanded = false\n loading = false\n loaded = false\n /** 多选是否选中 */\n checked = false\n disabled = false\n visible = true\n /** 子节点选中数量 */\n childrenCheckCount = 0\n\n get indeterminate(): boolean {\n if (!this.children) return false\n return (\n this.childrenCheckCount > 0\n // && this.childrenCheckCount < this.children.length\n )\n }\n\n labelKey: string\n valueKey: string\n\n constructor(params: {\n data: Val\n index: number\n depth: number\n parent?: TreeNode<Val>\n labelKey: string\n valueKey: string\n }) {\n const { data, index, depth, parent, labelKey, valueKey } = params\n super(data, index, depth, parent)\n this.labelKey = labelKey\n this.valueKey = valueKey\n\n return shallowReactive(this)\n }\n\n get label(): string {\n return String(o(this.data).get(this.labelKey))\n }\n\n get key(): string | number {\n return o(this.data).get(this.valueKey) as string | number\n }\n\n /**\n * 向上冒泡设置\n * @param setter 设置函数, 返回 false 则停止冒泡\n */\n bubbleSet(setter: (node: TreeNode<Val>) => boolean | void): void {\n const ret = setter(this)\n ret !== false && this.parent?.bubbleSet(setter)\n }\n}\n"],"mappings":";;;AAGA,IAAaA,aAAb,cAAqFC,SAGnF;CAKA,WAAW;CACX,UAAU;CACV,SAAS;;CAET,UAAU;CACV,WAAW;CACX,UAAU;;CAEV,qBAAqB;CAErB,IAAI,gBAAyB;AAC3B,MAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,SACE,KAAK,qBAAqB;;CAK9B;CACA;CAEA,YAAY,QAOT;EACD,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,aAAa;AAC3D,QAAM,MAAM,OAAO,OAAO,OAAO;AACjC,OAAK,WAAW;AAChB,OAAK,WAAW;AAEhB,SAAO,gBAAgB,KAAK;;CAG9B,IAAI,QAAgB;AAClB,SAAO,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;;CAGhD,IAAI,MAAuB;AACzB,SAAO,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS;;;;;;CAOxC,UAAU,QAAuD;AACnD,SAAO,KAAK,KAChB,SAAS,KAAK,QAAQ,UAAU,OAAO"}
1
+ {"version":3,"file":"tree-node2.js","names":["TreeNode","CoreTreeNode"],"sources":["../../../src/components/tree/tree-node.ts"],"sourcesContent":["import { TreeNode as CoreTreeNode, o } from '@cat-kit/core'\nimport { shallowReactive } from 'vue'\n\nexport class TreeNode<Val extends Record<string, any> = Record<string, any>> extends CoreTreeNode<\n Val,\n TreeNode<Val>\n> {\n declare parent?: TreeNode<Val>\n\n declare children?: TreeNode<Val>[]\n\n expanded = false\n loading = false\n loaded = false\n /** 多选是否选中 */\n checked = false\n disabled = false\n visible = true\n /** 子节点选中数量 */\n childrenCheckCount = 0\n\n get indeterminate(): boolean {\n if (!this.children) return false\n return (\n this.childrenCheckCount > 0\n // && this.childrenCheckCount < this.children.length\n )\n }\n\n labelKey: string\n valueKey: string\n\n constructor(params: {\n data: Val\n index: number\n depth: number\n parent?: TreeNode<Val>\n labelKey: string\n valueKey: string\n }) {\n const { data, index, depth, parent, labelKey, valueKey } = params\n super(data, index, depth, parent)\n this.labelKey = labelKey\n this.valueKey = valueKey\n\n return shallowReactive(this)\n }\n\n get label(): string {\n return String(o(this.data).get(this.labelKey))\n }\n\n get key(): string | number {\n return o(this.data).get(this.valueKey) as string | number\n }\n\n /**\n * 向上冒泡设置\n * @param setter 设置函数, 返回 false 则停止冒泡\n */\n bubbleSet(setter: (node: TreeNode<Val>) => boolean | void): void {\n const ret = setter(this)\n ret !== false && this.parent?.bubbleSet(setter)\n }\n}\n"],"mappings":";;;AAGA,IAAaA,aAAb,cAAqFC,SAGnF;CAKA,WAAW;CACX,UAAU;CACV,SAAS;;CAET,UAAU;CACV,WAAW;CACX,UAAU;;CAEV,qBAAqB;CAErB,IAAI,gBAAyB;AAC3B,MAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,SACE,KAAK,qBAAqB;;CAK9B;CACA;CAEA,YAAY,QAOT;EACD,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,aAAa;AAC3D,QAAM,MAAM,OAAO,OAAO,OAAO;AACjC,OAAK,WAAW;AAChB,OAAK,WAAW;AAEhB,SAAO,gBAAgB,KAAK;;CAG9B,IAAI,QAAgB;AAClB,SAAO,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;;CAGhD,IAAI,MAAuB;AACzB,SAAO,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS;;;;;;CAOxC,UAAU,QAAuD;AACnD,SAAO,KAChB,KAAK,SAAS,KAAK,QAAQ,UAAU,OAAO"}
@@ -7,8 +7,8 @@ import { useFilter } from "./use-filter.js";
7
7
  import { useSelect } from "./use-select.js";
8
8
  import { useTreeNodes } from "./use-tree-nodes.js";
9
9
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, provide, renderList, shallowRef, unref, useSlots, watch, watchEffect, withCtx } from "vue";
10
- import { bem, nextFrame, scrollIntoContainerView, withUnit } from "@veltra/utils";
11
- import { useFormComponent, useFormFallbackProps, useVirtual } from "@veltra/compositions";
10
+ import { bem, nextFrame, scrollIntoContainerView } from "@veltra/utils";
11
+ import { useFormComponent, useFormFallbackProps, useVirtualizer } from "@veltra/compositions";
12
12
  //#region src/components/tree/tree.vue
13
13
  const _sfc_main = /* @__PURE__ */ defineComponent({
14
14
  name: "Tree",
@@ -87,25 +87,38 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
87
87
  nodeDict,
88
88
  getFlattedNodes
89
89
  });
90
- const { totalHeight, virtualList, scrollTo, virtualEnabled, measureElement } = useVirtual({
90
+ const estimateSize = () => {
91
+ switch (size.value) {
92
+ case "small": return 32;
93
+ case "large": return 44;
94
+ default: return 36;
95
+ }
96
+ };
97
+ const virtualEnabled = computed(() => nodes.value.length > 80);
98
+ const { virtualizer, items } = useVirtualizer({
91
99
  count: computed(() => nodes.value.length),
92
- estimateSize: () => 40,
100
+ scrollEl: () => scrollRef.value?.containerRef ?? null,
101
+ contentEl: () => virtualEnabled.value ? scrollRef.value?.contentRef ?? null : null,
102
+ estimateSize,
93
103
  gap: 2,
94
- virtualThreshold: 80,
95
- scrollEl: computed(() => scrollRef.value?.containerRef ?? null)
104
+ getItemKey: (i) => nodes.value[i]?.key ?? i
96
105
  });
97
106
  const virtualNodes = computed(() => {
98
107
  const _nodes = nodes.value;
99
- return virtualList.value.map((item) => {
108
+ return items.value.map((item) => {
100
109
  const node = _nodes[item.index];
101
110
  return {
102
111
  node,
103
- key: node.key || item.key,
112
+ key: node?.key ?? item.index,
104
113
  offset: item.start,
105
114
  index: item.index
106
115
  };
107
116
  });
108
117
  });
118
+ const measureElement = (index, el) => virtualizer.measureElement(index, el);
119
+ function scrollTo(index) {
120
+ virtualizer.scrollToIndex(index, { align: "center" });
121
+ }
109
122
  function scrollIntoView() {
110
123
  const { selectable, checkable, scrollToView } = props;
111
124
  if (!scrollToView || !selectable && !checkable || !nodes.value) return;
@@ -176,22 +189,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
176
189
  class: normalizeClass(className.value),
177
190
  ref_key: "scrollRef",
178
191
  ref: scrollRef,
179
- "content-style": { height: unref(virtualEnabled) ? unref(withUnit)(unref(totalHeight), "px") : void 0 },
180
- "content-class": [unref(cls).e("wrap"), unref(bem).is("virtual", unref(virtualEnabled))]
192
+ "content-class": [unref(cls).e("wrap"), unref(bem).is("virtual", virtualEnabled.value)]
181
193
  }, {
182
- default: withCtx(() => [unref(virtualEnabled) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(virtualNodes.value, ({ node, key, offset, index }) => {
194
+ default: withCtx(() => [virtualEnabled.value ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(virtualNodes.value, ({ node, key, offset, index }) => {
183
195
  return openBlock(), createBlock(_sfc_main$3, {
184
196
  node,
185
197
  key,
186
198
  class: normalizeClass(unref(bem).is("selected", node.data === unref(selectedData))),
187
- "data-index": index,
188
- "measure-element": unref(measureElement),
199
+ index,
200
+ "measure-element": measureElement,
189
201
  style: normalizeStyle({ transform: `translateY(${offset}px)` })
190
202
  }, null, 8, [
191
203
  "node",
192
204
  "class",
193
- "data-index",
194
- "measure-element",
205
+ "index",
195
206
  "style"
196
207
  ]);
197
208
  }), 128)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(unref(nodes), (node) => {
@@ -205,11 +216,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
205
216
  class: normalizeClass(unref(cls).e("empty"))
206
217
  }, [createVNode(unref(_sfc_main$2))], 2)) : createCommentVNode("v-if", true)]),
207
218
  _: 1
208
- }, 8, [
209
- "class",
210
- "content-style",
211
- "content-class"
212
- ]);
219
+ }, 8, ["class", "content-class"]);
213
220
  };
214
221
  }
215
222
  });