@veltra/desktop 1.0.13 → 1.0.14

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 (180) hide show
  1. package/dist/components/action/action-group.js +110 -3
  2. package/dist/components/action/action-group.js.map +1 -1
  3. package/dist/components/action/action-group.vue.d.ts +16 -3
  4. package/dist/components/action/action.js +26 -13
  5. package/dist/components/action/action.js.map +1 -1
  6. package/dist/components/action/action.vue.d.ts +2 -2
  7. package/dist/components/action/style.js +2 -1
  8. package/dist/components/action/style2.css +35 -7
  9. package/dist/components/auto-complete/auto-complete.vue.d.ts +2 -2
  10. package/dist/components/batch-edit/batch-edit-form.js +106 -42
  11. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  12. package/dist/components/batch-edit/batch-edit-list.js +84 -47
  13. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  14. package/dist/components/batch-edit/batch-edit.js +42 -10
  15. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  16. package/dist/components/batch-edit/style.js +2 -4
  17. package/dist/components/batch-edit/style2.css +202 -30
  18. package/dist/components/batch-edit/use-edit.js +45 -9
  19. package/dist/components/batch-edit/use-edit.js.map +1 -1
  20. package/dist/components/cascade/cascade.js +3 -1
  21. package/dist/components/cascade/cascade.js.map +1 -1
  22. package/dist/components/cascade/cascade.vue.d.ts +2 -2
  23. package/dist/components/checkbox/checkbox-button.vue.d.ts +1 -1
  24. package/dist/components/checkbox-group/checkbox-group.vue.d.ts +2 -2
  25. package/dist/components/code-editor/code-editor.js +145 -49
  26. package/dist/components/code-editor/code-editor.js.map +1 -1
  27. package/dist/components/code-editor/code-editor.vue.d.ts +2 -0
  28. package/dist/components/code-editor/style2.css +87 -19
  29. package/dist/components/date-panel/date-panel.vue.d.ts +1 -1
  30. package/dist/components/date-picker/date-picker.vue.d.ts +2 -2
  31. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +2 -2
  32. package/dist/components/dialog/dialog.js +6 -2
  33. package/dist/components/dialog/dialog.js.map +1 -1
  34. package/dist/components/dialog/style2.css +2 -3
  35. package/dist/components/expression-editor/components/path-preview.js +27 -0
  36. package/dist/components/expression-editor/components/path-preview.js.map +1 -0
  37. package/dist/components/expression-editor/components/variable-picker.js +199 -153
  38. package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
  39. package/dist/components/expression-editor/core/chip.js +54 -0
  40. package/dist/components/expression-editor/core/chip.js.map +1 -0
  41. package/dist/components/expression-editor/core/editor.js +424 -0
  42. package/dist/components/expression-editor/core/editor.js.map +1 -0
  43. package/dist/components/expression-editor/core/mention.js +91 -0
  44. package/dist/components/expression-editor/core/mention.js.map +1 -0
  45. package/dist/components/expression-editor/core/model.js +64 -0
  46. package/dist/components/expression-editor/core/model.js.map +1 -0
  47. package/dist/components/expression-editor/di.js +4 -10
  48. package/dist/components/expression-editor/di.js.map +1 -1
  49. package/dist/components/expression-editor/expression-editor.js +168 -114
  50. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  51. package/dist/components/expression-editor/expression-editor.vue.d.ts +2 -1
  52. package/dist/components/expression-editor/style.js +0 -2
  53. package/dist/components/expression-editor/style2.css +145 -219
  54. package/dist/components/index.js +54 -54
  55. package/dist/components/input/input.vue.d.ts +2 -2
  56. package/dist/components/layout/layout.js +12 -11
  57. package/dist/components/layout/layout.js.map +1 -1
  58. package/dist/components/multi-select/multi-select.vue.d.ts +3 -3
  59. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +3 -3
  60. package/dist/components/notification/notification.vue.d.ts +1 -1
  61. package/dist/components/number/number.vue.d.ts +1 -1
  62. package/dist/components/number-input/number-input.js +4 -4
  63. package/dist/components/number-input/number-input.js.map +1 -1
  64. package/dist/components/number-input/number-input.vue.d.ts +2 -2
  65. package/dist/components/number-range-input/number-range-input.vue.d.ts +1 -1
  66. package/dist/components/password-input/password-input.vue.d.ts +1 -1
  67. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +1 -1
  68. package/dist/components/radio-group/radio-group.vue.d.ts +2 -2
  69. package/dist/components/rich-text-editor/rich-text-editor.js +1 -1
  70. package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +1 -1
  71. package/dist/components/rich-text-editor/toolbar.js +2 -2
  72. package/dist/components/select/select.vue.d.ts +2 -2
  73. package/dist/components/steps/steps.vue.d.ts +1 -1
  74. package/dist/components/table/use-table.js +16 -0
  75. package/dist/components/table/use-table.js.map +1 -1
  76. package/dist/components/tabs/tabs-horizontal.vue.d.ts +1 -1
  77. package/dist/components/tabs/tabs-vertical.vue.d.ts +1 -1
  78. package/dist/components/tabs/tabs.vue.d.ts +1 -1
  79. package/dist/components/textarea/textarea.vue.d.ts +2 -2
  80. package/dist/components/tip/tip.vue.d.ts +1 -1
  81. package/dist/components/tree/style2.css +18 -12
  82. package/dist/components/tree/tree-node.js +7 -4
  83. package/dist/components/tree/tree-node.js.map +1 -1
  84. package/dist/components/tree-select/tree-select.vue.d.ts +3 -3
  85. package/dist/index.d.ts +3 -3
  86. package/dist/index.js +83 -83
  87. package/dist/style.js +3 -3
  88. package/dist/types/action.d.ts +38 -4
  89. package/dist/types/cascade.d.ts +2 -3
  90. package/dist/types/code-editor.d.ts +9 -2
  91. package/dist/types/expression-editor.d.ts +9 -1
  92. package/dist/types/index.d.ts +2 -2
  93. package/package.json +11 -12
  94. package/src/components/action/action-group.vue +126 -56
  95. package/src/components/action/action.vue +35 -12
  96. package/src/components/action/style.scss +46 -10
  97. package/src/components/action/style.ts +2 -1
  98. package/src/components/batch-edit/batch-edit-form.vue +121 -45
  99. package/src/components/batch-edit/batch-edit-list.vue +56 -39
  100. package/src/components/batch-edit/batch-edit.vue +57 -6
  101. package/src/components/batch-edit/style.scss +251 -37
  102. package/src/components/batch-edit/style.ts +5 -8
  103. package/src/components/batch-edit/use-edit.ts +58 -11
  104. package/src/components/cascade/cascade.vue +3 -1
  105. package/src/components/code-editor/code-editor.vue +198 -63
  106. package/src/components/code-editor/style.scss +110 -12
  107. package/src/components/dialog/dialog.vue +6 -2
  108. package/src/components/dialog/style.scss +4 -4
  109. package/src/components/expression-editor/__test__/chip.test.ts +86 -0
  110. package/src/components/expression-editor/__test__/mention.test.ts +122 -0
  111. package/src/components/expression-editor/__test__/model.test.ts +127 -0
  112. package/src/components/expression-editor/components/path-preview.vue +32 -0
  113. package/src/components/expression-editor/components/variable-picker.vue +224 -219
  114. package/src/components/expression-editor/core/chip.ts +101 -0
  115. package/src/components/expression-editor/core/editor.ts +513 -0
  116. package/src/components/expression-editor/core/mention.ts +121 -0
  117. package/src/components/expression-editor/core/model.ts +109 -0
  118. package/src/components/expression-editor/di.ts +4 -32
  119. package/src/components/expression-editor/expression-editor.vue +184 -151
  120. package/src/components/expression-editor/style.scss +148 -220
  121. package/src/components/expression-editor/style.ts +0 -2
  122. package/src/components/layout/layout.vue +17 -19
  123. package/src/components/number-input/number-input.vue +4 -4
  124. package/src/components/table/use-table.ts +16 -0
  125. package/src/components/tree/style.scss +30 -33
  126. package/src/components/tree/tree-node.vue +4 -2
  127. package/src/types/action.ts +42 -4
  128. package/src/types/cascade.ts +4 -3
  129. package/src/types/code-editor.ts +9 -2
  130. package/src/types/expression-editor.ts +9 -0
  131. package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js +0 -65
  132. package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js.map +0 -1
  133. package/dist/components/expression-editor/constants.js +0 -9
  134. package/dist/components/expression-editor/constants.js.map +0 -1
  135. package/dist/components/expression-editor/internal/editor-runtime/create-runtime.js +0 -47
  136. package/dist/components/expression-editor/internal/editor-runtime/create-runtime.js.map +0 -1
  137. package/dist/components/expression-editor/internal/editor-runtime/model-sync.js +0 -49
  138. package/dist/components/expression-editor/internal/editor-runtime/model-sync.js.map +0 -1
  139. package/dist/components/expression-editor/internal/features/commands/register-command-packs.js +0 -215
  140. package/dist/components/expression-editor/internal/features/commands/register-command-packs.js.map +0 -1
  141. package/dist/components/expression-editor/internal/features/drag-drop/drag-drop-service.js +0 -33
  142. package/dist/components/expression-editor/internal/features/drag-drop/drag-drop-service.js.map +0 -1
  143. package/dist/components/expression-editor/internal/features/insertion/insertion-service.js +0 -33
  144. package/dist/components/expression-editor/internal/features/insertion/insertion-service.js.map +0 -1
  145. package/dist/components/expression-editor/nodes/variable-node.js +0 -94
  146. package/dist/components/expression-editor/nodes/variable-node.js.map +0 -1
  147. package/dist/components/expression-editor/parser.js +0 -32
  148. package/dist/components/expression-editor/parser.js.map +0 -1
  149. package/dist/components/expression-editor/plain-text.js +0 -19
  150. package/dist/components/expression-editor/plain-text.js.map +0 -1
  151. package/dist/components/expression-editor/use-context.js +0 -69
  152. package/dist/components/expression-editor/use-context.js.map +0 -1
  153. package/dist/components/expression-editor/use-decorators.js +0 -27
  154. package/dist/components/expression-editor/use-decorators.js.map +0 -1
  155. package/dist/components/expression-editor/use-expression-drag-drop.js +0 -275
  156. package/dist/components/expression-editor/use-expression-drag-drop.js.map +0 -1
  157. package/src/components/batch-edit/batch-edit-new.vue +0 -168
  158. package/src/components/batch-edit/style-new.scss +0 -35
  159. package/src/components/batch-edit/use-edit-new.ts +0 -68
  160. package/src/components/batch-edit/use-tip.ts +0 -47
  161. package/src/components/expression-editor/__test__/architecture-boundaries.test.ts +0 -103
  162. package/src/components/expression-editor/__test__/architecture-compatibility.test.ts +0 -52
  163. package/src/components/expression-editor/__test__/drag-drop.test.ts +0 -171
  164. package/src/components/expression-editor/__test__/parser.test.ts +0 -62
  165. package/src/components/expression-editor/constants.ts +0 -6
  166. package/src/components/expression-editor/internal/contracts/editor-runtime.ts +0 -11
  167. package/src/components/expression-editor/internal/editor-runtime/create-runtime.ts +0 -64
  168. package/src/components/expression-editor/internal/editor-runtime/index.ts +0 -1
  169. package/src/components/expression-editor/internal/editor-runtime/model-sync.ts +0 -68
  170. package/src/components/expression-editor/internal/features/commands/register-command-packs.ts +0 -517
  171. package/src/components/expression-editor/internal/features/drag-drop/drag-drop-service.ts +0 -51
  172. package/src/components/expression-editor/internal/features/insertion/insertion-service.ts +0 -56
  173. package/src/components/expression-editor/nodes/variable-node.tsx +0 -118
  174. package/src/components/expression-editor/parser.ts +0 -46
  175. package/src/components/expression-editor/plain-text.ts +0 -25
  176. package/src/components/expression-editor/plan.md +0 -22
  177. package/src/components/expression-editor/use-context.ts +0 -134
  178. package/src/components/expression-editor/use-decorators.tsx +0 -29
  179. package/src/components/expression-editor/use-editor.ts +0 -12
  180. package/src/components/expression-editor/use-expression-drag-drop.ts +0 -396
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","names":[],"sources":["../../../src/components/layout/layout.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :class=\"cls.b\" :style=\"style\" ref=\"containerRef\">\n <slot />\n\n <!-- 竖向调节 -->\n <ULayoutResizer\n v-for=\"(offset, index) of resizerOffsets\"\n :offset=\"offset\"\n :key=\"index\"\n ref=\"resizerRefs\"\n direction=\"vertical\"\n @resize=\"handleResize($event, index)\"\n @resize-start=\"handleStartResize(index)\"\n >\n </ULayoutResizer>\n\n <!-- 横向调节 -->\n <!-- <ULayoutResizer\n v-for=\"item in horizontalResizerList\"\n :key=\"item\"\n direction=\"horizontal\"\n /> -->\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useResizeObserver } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport {\n computed,\n shallowRef,\n type CSSProperties,\n provide,\n watchEffect,\n ref,\n watch,\n nextTick\n} from 'vue'\n\nimport type { LayoutProps } from '../../types'\nimport { LayoutDIKey } from './di'\nimport ULayoutResizer from './layout-resizer.vue'\n\ndefineOptions({\n name: 'Layout'\n})\n\nconst props = withDefaults(defineProps<LayoutProps>(), {\n tag: 'div'\n})\n\nconst cls = bem('layout')\n\nconst templateCols = ref<string[]>([])\n\nwatchEffect(() => {\n const { cols } = props\n if (!cols) {\n templateCols.value = []\n return\n }\n templateCols.value = typeof cols === 'string' ? cols.split(' ') : cols\n})\n\nconst style = computed<CSSProperties>(() => {\n const { rows, gap, resizable } = props\n return {\n gridTemplateColumns: templateCols.value.join(' '),\n gridTemplateRows: rows ? (typeof rows === 'string' ? rows : rows.join(' ')) : '',\n columnGap: resizable ? '10px' : withUnit(gap, 'px')\n }\n})\n\nconst containerRef = shallowRef<HTMLElement>()\nconst resizerRefs = shallowRef<InstanceType<typeof ULayoutResizer>[]>([])\n\nconst resizerOffsets = ref<number[]>([])\n\nfunction getResizeOffsets() {\n const container = containerRef.value\n if (!props.resizable || !container || !props.cols) {\n return (resizerOffsets.value = [])\n }\n\n resizerOffsets.value = templateCols.value.slice(0, -1).map((_, index) => {\n const dom = container.children[index] as HTMLElement\n if (!dom) return 0\n return dom.offsetLeft + dom.offsetWidth\n })\n}\n\nwatch([() => props.resizable, containerRef, () => props.cols], () => {\n nextTick(() => {\n getResizeOffsets()\n })\n})\n\nuseResizeObserver({\n targets: containerRef,\n onResize() {\n getResizeOffsets()\n resizerRefs.value.forEach((r, i) => {\n r.update(resizerOffsets.value![i]!)\n })\n }\n})\n\n// const horizontalResizerList = []\n\n// const resizing = shallowRef(false)\n\nlet prevSize = '0'\nlet nextSize = '0'\nconst handleStartResize = (index: number) => {\n prevSize = templateCols.value[index]!\n nextSize = templateCols.value[index + 1]!\n\n if (!prevSize.endsWith('px') && !nextSize.endsWith('px')) {\n const rect = containerRef.value?.children[index + 1]?.getBoundingClientRect()\n if (rect) {\n nextSize = rect.width + 'px'\n }\n }\n // resizing.value = true\n}\nconst handleResize = (offset: number, index: number) => {\n if (prevSize?.endsWith('px')) {\n templateCols.value[index] = `${parseInt(prevSize) + offset}px`\n }\n if (nextSize?.endsWith('px')) {\n templateCols.value[index + 1] = `${parseInt(nextSize) - offset}px`\n }\n}\n\nprovide(LayoutDIKey, {\n cls\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAId,MAAM,MAAM,IAAI,SAAQ;EAExB,MAAM,eAAe,IAAc,EAAE,CAAA;AAErC,oBAAkB;GAChB,MAAM,EAAE,SAAS;AACjB,OAAI,CAAC,MAAM;AACT,iBAAa,QAAQ,EAAC;AACtB;;AAEF,gBAAa,QAAQ,OAAO,SAAS,WAAW,KAAK,MAAM,IAAI,GAAG;IACnE;EAED,MAAM,QAAQ,eAA8B;GAC1C,MAAM,EAAE,MAAM,KAAK,cAAc;AACjC,UAAO;IACL,qBAAqB,aAAa,MAAM,KAAK,IAAI;IACjD,kBAAkB,OAAQ,OAAO,SAAS,WAAW,OAAO,KAAK,KAAK,IAAI,GAAI;IAC9E,WAAW,YAAY,SAAS,SAAS,KAAK,KAAI;IACpD;IACD;EAED,MAAM,eAAe,YAAwB;EAC7C,MAAM,cAAc,WAAkD,EAAE,CAAA;EAExE,MAAM,iBAAiB,IAAc,EAAE,CAAA;EAEvC,SAAS,mBAAmB;GAC1B,MAAM,YAAY,aAAa;AAC/B,OAAI,CAAC,MAAM,aAAa,CAAC,aAAa,CAAC,MAAM,KAC3C,QAAQ,eAAe,QAAQ,EAAE;AAGnC,kBAAe,QAAQ,aAAa,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,UAAU;IACvE,MAAM,MAAM,UAAU,SAAS;AAC/B,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,IAAI,aAAa,IAAI;KAC7B;;AAGH,QAAM;SAAO,MAAM;GAAW;SAAoB,MAAM;GAAK,QAAQ;AACnE,kBAAe;AACb,sBAAiB;KAClB;IACF;AAED,oBAAkB;GAChB,SAAS;GACT,WAAW;AACT,sBAAiB;AACjB,gBAAY,MAAM,SAAS,GAAG,MAAM;AAClC,OAAE,OAAO,eAAe,MAAO,GAAG;MACnC;;GAEJ,CAAA;EAMD,IAAI,WAAW;EACf,IAAI,WAAW;EACf,MAAM,qBAAqB,UAAkB;AAC3C,cAAW,aAAa,MAAM;AAC9B,cAAW,aAAa,MAAM,QAAQ;AAEtC,OAAI,CAAC,SAAS,SAAS,KAAK,IAAI,CAAC,SAAS,SAAS,KAAK,EAAE;IACxD,MAAM,OAAO,aAAa,OAAO,SAAS,QAAQ,IAAI,uBAAsB;AAC5E,QAAI,KACF,YAAW,KAAK,QAAQ;;;EAK9B,MAAM,gBAAgB,QAAgB,UAAkB;AACtD,OAAI,UAAU,SAAS,KAAK,CAC1B,cAAa,MAAM,SAAS,GAAG,SAAS,SAAS,GAAG,OAAO;AAE7D,OAAI,UAAU,SAAS,KAAK,CAC1B,cAAa,MAAM,QAAQ,KAAK,GAAG,SAAS,SAAS,GAAG,OAAO;;AAInE,UAAQ,aAAa,EACnB,KACD,CAAA;;uBAvIC,YAqBY,wBArBI,QAAA,IAAG,EAAA;IAAG,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC;IAAG,OAAK,eAAE,MAAA,MAAK;aAAM;IAAJ,KAAI;;2BAC7C;KAAR,WAAQ,KAAA,QAAA,UAAA;KAER,mBAAA,SAAa;uBACb,mBASiB,UAAA,MAAA,WARW,eAAA,QAAlB,QAAQ,UAAK;0BADvB,YASiB,aAAA;OAPN;OACR,KAAK;;gBACF;OAAJ,KAAI;OACJ,WAAU;OACT,WAAM,WAAE,aAAa,QAAQ,MAAK;OAClC,gBAAY,WAAE,kBAAkB,MAAK;;;;;;;KAIxC,mBAAA,SAAa;KACb,mBAAA,gIAIM"}
1
+ {"version":3,"file":"layout.js","names":[],"sources":["../../../src/components/layout/layout.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :class=\"cls.b\" :style=\"style\" ref=\"containerRef\">\n <slot />\n\n <!-- 竖向调节 -->\n <ULayoutResizer\n v-for=\"(offset, index) of resizerOffsets\"\n :offset=\"offset\"\n :key=\"index\"\n ref=\"resizerRefs\"\n direction=\"vertical\"\n @resize=\"handleResize($event, index)\"\n @resize-start=\"handleStartResize(index)\"\n >\n </ULayoutResizer>\n\n <!-- 横向调节 -->\n <!-- <ULayoutResizer\n v-for=\"item in horizontalResizerList\"\n :key=\"item\"\n direction=\"horizontal\"\n /> -->\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useResizeObserver } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport {\n computed,\n shallowRef,\n type CSSProperties,\n provide,\n watchEffect,\n ref,\n watch,\n nextTick\n} from 'vue'\n\nimport type { LayoutProps } from '../../types'\nimport { LayoutDIKey } from './di'\nimport ULayoutResizer from './layout-resizer.vue'\n\ndefineOptions({\n name: 'Layout'\n})\n\nconst props = withDefaults(defineProps<LayoutProps>(), {\n tag: 'div'\n})\n\nconst cls = bem('layout')\n\nconst templateCols = ref<string[]>([])\n\nwatchEffect(() => {\n const { cols } = props\n if (!cols) {\n templateCols.value = []\n return\n }\n templateCols.value = typeof cols === 'string' ? cols.split(' ') : [...cols]\n})\n\nconst style = computed<CSSProperties>(() => {\n const { rows, gap, resizable } = props\n return {\n gridTemplateColumns: templateCols.value.join(' '),\n gridTemplateRows: rows ? (typeof rows === 'string' ? rows : rows.join(' ')) : '',\n columnGap: resizable ? '10px' : withUnit(gap, 'px')\n }\n})\n\nconst containerRef = shallowRef<HTMLElement>()\nconst resizerRefs = shallowRef<InstanceType<typeof ULayoutResizer>[]>([])\n\nconst resizerOffsets = ref<number[]>([])\n\nfunction getResizeOffsets() {\n const container = containerRef.value\n if (!props.resizable || !container || !props.cols) {\n return (resizerOffsets.value = [])\n }\n\n resizerOffsets.value = templateCols.value.slice(0, -1).map((_, index) => {\n const dom = container.children[index] as HTMLElement\n if (!dom) return 0\n return dom.offsetLeft + dom.offsetWidth\n })\n}\n\nwatch([() => props.resizable, containerRef, () => props.cols], () => {\n nextTick(() => {\n getResizeOffsets()\n })\n})\n\nuseResizeObserver({\n targets: containerRef,\n onResize() {\n getResizeOffsets()\n resizerRefs.value.forEach((r, i) => {\n r.update(resizerOffsets.value![i]!)\n })\n }\n})\n\n// const horizontalResizerList = []\n\n// const resizing = shallowRef(false)\n\nlet prevSize = 0\nlet nextSize = 0\nconst handleStartResize = (index: number) => {\n const container = containerRef.value\n if (!container) return\n\n // 拖拽前把相邻两列按实际渲染宽度固定成 px,\n // 这样拖拽时两列等量增减、容器整体宽度保持不变。\n const prevDom = container.children[index] as HTMLElement | undefined\n const nextDom = container.children[index + 1] as HTMLElement | undefined\n prevSize = prevDom ? prevDom.getBoundingClientRect().width : 0\n nextSize = nextDom ? nextDom.getBoundingClientRect().width : 0\n}\nconst handleResize = (offset: number, index: number) => {\n // 钳位到 [-prevSize, nextSize],避免轨道尺寸出现负值——\n // 一旦 grid-template-columns 中带负值,整条声明会被浏览器丢弃。\n const clamped = Math.max(-prevSize, Math.min(nextSize, offset))\n templateCols.value[index] = `${prevSize + clamped}px`\n templateCols.value[index + 1] = `${nextSize - clamped}px`\n}\n\nprovide(LayoutDIKey, {\n cls\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAId,MAAM,MAAM,IAAI,SAAQ;EAExB,MAAM,eAAe,IAAc,EAAE,CAAA;AAErC,oBAAkB;GAChB,MAAM,EAAE,SAAS;AACjB,OAAI,CAAC,MAAM;AACT,iBAAa,QAAQ,EAAC;AACtB;;AAEF,gBAAa,QAAQ,OAAO,SAAS,WAAW,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAI;IAC3E;EAED,MAAM,QAAQ,eAA8B;GAC1C,MAAM,EAAE,MAAM,KAAK,cAAc;AACjC,UAAO;IACL,qBAAqB,aAAa,MAAM,KAAK,IAAI;IACjD,kBAAkB,OAAQ,OAAO,SAAS,WAAW,OAAO,KAAK,KAAK,IAAI,GAAI;IAC9E,WAAW,YAAY,SAAS,SAAS,KAAK,KAAI;IACpD;IACD;EAED,MAAM,eAAe,YAAwB;EAC7C,MAAM,cAAc,WAAkD,EAAE,CAAA;EAExE,MAAM,iBAAiB,IAAc,EAAE,CAAA;EAEvC,SAAS,mBAAmB;GAC1B,MAAM,YAAY,aAAa;AAC/B,OAAI,CAAC,MAAM,aAAa,CAAC,aAAa,CAAC,MAAM,KAC3C,QAAQ,eAAe,QAAQ,EAAE;AAGnC,kBAAe,QAAQ,aAAa,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,UAAU;IACvE,MAAM,MAAM,UAAU,SAAS;AAC/B,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,IAAI,aAAa,IAAI;KAC7B;;AAGH,QAAM;SAAO,MAAM;GAAW;SAAoB,MAAM;GAAK,QAAQ;AACnE,kBAAe;AACb,sBAAiB;KAClB;IACF;AAED,oBAAkB;GAChB,SAAS;GACT,WAAW;AACT,sBAAiB;AACjB,gBAAY,MAAM,SAAS,GAAG,MAAM;AAClC,OAAE,OAAO,eAAe,MAAO,GAAG;MACnC;;GAEJ,CAAA;EAMD,IAAI,WAAW;EACf,IAAI,WAAW;EACf,MAAM,qBAAqB,UAAkB;GAC3C,MAAM,YAAY,aAAa;AAC/B,OAAI,CAAC,UAAW;GAIhB,MAAM,UAAU,UAAU,SAAS;GACnC,MAAM,UAAU,UAAU,SAAS,QAAQ;AAC3C,cAAW,UAAU,QAAQ,uBAAuB,CAAC,QAAQ;AAC7D,cAAW,UAAU,QAAQ,uBAAuB,CAAC,QAAQ;;EAE/D,MAAM,gBAAgB,QAAgB,UAAkB;GAGtD,MAAM,UAAU,KAAK,IAAI,CAAC,UAAU,KAAK,IAAI,UAAU,OAAO,CAAA;AAC9D,gBAAa,MAAM,SAAS,GAAG,WAAW,QAAQ;AAClD,gBAAa,MAAM,QAAQ,KAAK,GAAG,WAAW,QAAQ;;AAGxD,UAAQ,aAAa,EACnB,KACD,CAAA;;uBArIC,YAqBY,wBArBI,QAAA,IAAG,EAAA;IAAG,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC;IAAG,OAAK,eAAE,MAAA,MAAK;aAAM;IAAJ,KAAI;;2BAC7C;KAAR,WAAQ,KAAA,QAAA,UAAA;KAER,mBAAA,SAAa;uBACb,mBASiB,UAAA,MAAA,WARW,eAAA,QAAlB,QAAQ,UAAK;0BADvB,YASiB,aAAA;OAPN;OACR,KAAK;;gBACF;OAAJ,KAAI;OACJ,WAAU;OACT,WAAM,WAAE,aAAa,QAAQ,MAAK;OAClC,gBAAY,WAAE,kBAAkB,MAAK;;;;;;;KAIxC,mBAAA,SAAa;KACb,mBAAA,gIAIM"}
@@ -28,13 +28,13 @@ declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {
28
28
  "onUpdate:modelValue"?: ((value: any[]) => any) | undefined;
29
29
  onChange?: ((options: Record<string, any>[]) => any) | undefined;
30
30
  }>, {
31
- disabled: boolean;
32
- readonly: boolean;
33
- minWidth: string;
34
31
  labelKey: string;
35
32
  valueKey: string;
36
33
  placeholder: string;
37
34
  clearable: boolean;
35
+ minWidth: string;
36
+ disabled: boolean;
37
+ readonly: boolean;
38
38
  visibilityLimit: number;
39
39
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
40
40
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -22,15 +22,15 @@ declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {
22
22
  onClear?: (() => any) | undefined;
23
23
  onChange?: ((checked: Record<string, any>[]) => any) | undefined;
24
24
  }>, {
25
- disabled: boolean;
26
- readonly: boolean;
27
- minWidth: string;
28
25
  expandAll: boolean;
29
26
  labelKey: string;
30
27
  valueKey: string;
31
28
  placeholder: string;
32
29
  clearable: boolean;
33
30
  filterable: boolean;
31
+ minWidth: string;
32
+ disabled: boolean;
33
+ readonly: boolean;
34
34
  visibilityLimit: number;
35
35
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
36
36
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -5,10 +5,10 @@ import * as _$_veltra_utils0 from "@veltra/utils";
5
5
  //#region src/components/notification/notification.vue.d.ts
6
6
  declare const __VLS_export: _$vue.DefineComponent<NotificationProps, _$_veltra_utils0.DeconstructValue<_NotificationExposed>, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<NotificationProps> & Readonly<{}>, {
7
7
  closable: boolean;
8
- position: "top-left" | "top-right" | "bottom-left" | "bottom-right";
9
8
  duration: number;
10
9
  offset: number;
11
10
  buttonText: string;
11
+ position: "top-left" | "top-right" | "bottom-left" | "bottom-right";
12
12
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
13
13
  declare const _default: typeof __VLS_export;
14
14
  //#endregion
@@ -3,8 +3,8 @@ import * as _$vue from "vue";
3
3
 
4
4
  //#region src/components/number/number.vue.d.ts
5
5
  declare const __VLS_export: _$vue.DefineComponent<NumberProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<NumberProps> & Readonly<{}>, {
6
- format: "currency" | "percent" | "decimal";
7
6
  duration: number;
7
+ format: "currency" | "percent" | "decimal";
8
8
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
9
9
  declare const _default: typeof __VLS_export;
10
10
  //#endregion
@@ -125,9 +125,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
125
125
  model,
126
126
  focused,
127
127
  () => props.currency
128
- ], ([model, focused]) => {
129
- if (focused) return;
130
- displayed.value = getDisplayed(model);
128
+ ], ([modelValue, inputFocused]) => {
129
+ if (inputFocused) return;
130
+ displayed.value = getDisplayed(modelValue);
131
131
  }, { immediate: true });
132
132
  /**
133
133
  * 解析展示值
@@ -169,7 +169,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
169
169
  return val;
170
170
  }
171
171
  function handleUpdateModelValue(input) {
172
- model.value = getValidValue(parseDisplayed(input)) ?? 0;
172
+ model.value = getValidValue(parseDisplayed(input));
173
173
  displayed.value = input;
174
174
  }
175
175
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"number-input.js","names":[],"sources":["../../../src/components/number-input/number-input.vue"],"sourcesContent":["<template>\n <u-input\n v-if=\"!readonly\"\n ref=\"inputRef\"\n :class=\"className\"\n :model-value=\"displayed\"\n v-bind=\"inputProps\"\n @update:model-value=\"handleUpdateModelValue\"\n @change=\"handleChange\"\n @keydown.stop=\"handleKeydown\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n :size=\"size\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n >\n <template #suffix v-if=\"step !== undefined && step !== false\">\n <slot name=\"suffix\" />\n <div :class=\"cls.e('step')\">\n <u-icon\n @click=\"increase\"\n v-ripple=\"!disabled && increasable\"\n :class=\"bem.is('disabled', disabled || !increasable)\"\n >\n <ArrowUp />\n </u-icon>\n <u-icon\n @click=\"decrease\"\n v-ripple=\"!disabled && reducible\"\n :class=\"bem.is('disabled', disabled || !reducible)\"\n >\n <ArrowDown />\n </u-icon>\n </div>\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n\n <template v-else>\n {{ generateDisplayed || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n, n, o, isUndef } from '@cat-kit/core'\nimport { useFormComponent, useFormFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { ArrowDown, ArrowUp } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT, Tween } from '@veltra/utils'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport type { NumberInputEmits, NumberInputProps, InputExposed } from '../../types'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\n\ndefineOptions({\n name: 'NumberInput'\n})\n\nconst props = withDefaults(defineProps<NumberInputProps>(), {\n placeholder: '请输入',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\nconst emit = defineEmits<NumberInputEmits>()\n\nconst slots = defineSlots<{\n prefix?: () => any\n suffix?: () => any\n}>()\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst inputProps = computed(() => {\n return o(props).pick(['clearable', 'disabled', 'placeholder', 'size', 'prefix', 'suffix'])\n})\n\nconst inputRef = shallowRef<InputExposed>()\n\nconst inputDom = computed(() => inputRef.value?.el)\n\nconst cls = bem('number-input')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value)]\n})\n\n/** 实际值 */\nconst model = defineModel<NumberInputProps['modelValue']>()\n\n// 展示值\nconst displayed = shallowRef('')\n\nconst focused = shallowRef(false)\n\nconst generateDisplayed = computed(() => {\n if (!displayed.value) return ''\n\n return `${props.prefix ?? ''}${displayed.value}${props.suffix ?? ''}`\n})\n\n/** 步长 */\nconst stepVal = computed<number>(() => {\n const { step } = props\n if (step === undefined) return 1\n return typeof step === 'boolean' ? 1 : step\n})\n\n/** 是否可增 */\nconst increasable = computed(() => {\n const { max, multiple } = props\n if (isUndef(max) || isUndef(model.value)) return true\n // 如果存在倍数,先将 model.value 除以倍数得到原始值再比较\n const rawValue = multiple ? $n.div(model.value, multiple) : model.value\n return rawValue < max\n})\n\n/** 是否可减 */\nconst reducible = computed(() => {\n const { min, multiple } = props\n if (isUndef(min) || isUndef(model.value)) return true\n // 如果存在倍数,先将 model.value 除以倍数得到原始值再比较\n const rawValue = multiple ? $n.div(model.value, multiple) : model.value\n return rawValue > min\n})\n\n// 通过值和步长值计算默认的最大精度\nconst defaultMaxPrecision = computed(() => {\n const { multiple } = props\n // 如果存在倍数,基于原始值计算精度\n const rawValue =\n multiple && model.value !== undefined ? $n.div(model.value, multiple) : model.value\n return Math.max(\n String(rawValue).split('.')[1]?.length ?? 0,\n String(stepVal.value).split('.')[1]?.length ?? 0\n )\n})\n\n/**\n * 获取展示值\n * @param num 实际值\n */\nfunction getDisplayed(num?: number): string {\n if (!num && num !== 0) return ''\n\n const {\n currency,\n precision,\n minPrecision,\n // 如果没有指定最大精度那么设置默认为值和步长值中的较大值\n maxPrecision = defaultMaxPrecision.value,\n multiple\n } = props\n\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const displayValue = multiple ? $n.div(num, multiple) : num\n\n return currency\n ? n(displayValue).currency('CNY', {\n precision,\n minPrecision,\n maxPrecision\n })\n : n(displayValue).fixed(\n precision ?? {\n minPrecision,\n maxPrecision\n }\n )\n}\n\nwatch(\n [model, focused, () => props.currency],\n ([model, focused]) => {\n if (focused) return\n displayed.value = getDisplayed(model)\n },\n { immediate: true }\n)\n\n/**\n * 解析展示值\n * @param str 展示值\n */\nfunction parseDisplayed(str: string): number | undefined {\n if (!str) return undefined\n\n // 将货币格式去掉再转化为数字\n const number = +str.replace(/,/g, '')\n const { multiple } = props\n\n // 如果解析失败,使用当前值作为回退\n // 如果存在倍数,需要先将 model.value 除以倍数得到原始值\n let result: number | undefined\n if (isNaN(number)) {\n if (model.value === undefined) return undefined\n result = multiple ? $n.div(model.value, multiple) : model.value\n } else {\n result = number\n }\n\n if (result === undefined) return undefined\n\n const { precision, maxPrecision, minPrecision } = props\n\n const fixedResult = +n(result).fixed(\n precision ?? {\n minPrecision,\n maxPrecision\n }\n )\n\n // 如果存在倍数,将原始值乘以倍数返回实际值\n return multiple ? $n.mul(fixedResult, multiple) : fixedResult\n}\n\n/**\n * 获取有效值\n * @param val 值\n */\nfunction getValidValue<T extends undefined | number>(val: T): T {\n if (val === undefined) return val\n const { min, max, multiple } = props\n\n // 如果存在倍数,先将值除以倍数得到原始值进行验证,验证后再乘以倍数\n if (multiple) {\n const rawVal = $n.div(val, multiple)\n let validRawVal = rawVal\n if (min !== undefined && rawVal < min) validRawVal = min\n if (max !== undefined && rawVal > max) validRawVal = max\n return $n.mul(validRawVal, multiple) as T\n }\n\n if (min !== undefined && val < min) return min as T\n if (max !== undefined && val > max) return max as T\n return val\n}\n\nfunction handleUpdateModelValue(input: string): void {\n const newVal = parseDisplayed(input)\n model.value = getValidValue(newVal) ?? 0\n displayed.value = input\n}\n\n/**\n * 处理输入值变化的函数, 该函数仅在输入框失去焦点时触发,\n * 主要用于在输入非数字的情况下的修正处理\n * @param input 输入的值\n */\nfunction handleChange() {\n emit('change', model.value)\n}\n\nconst tween = new Tween(\n { n: model.value ?? 0 },\n {\n onUpdate(state) {\n const _rawInput = inputDom.value\n if (!_rawInput) return\n const { multiple } = props\n // 如果存在倍数,tween.state.n 存储的是原始值,需要乘以倍数后传给 getDisplayed\n const actualValue = multiple ? $n.mul(state.n, multiple) : state.n\n _rawInput.value = getDisplayed(actualValue)\n },\n // 动画进行的过程值有可能被改变, 因此在onComplete中确保还原的是原本的值\n onComplete() {\n const _rawInput = inputDom.value\n if (!_rawInput) return\n _rawInput.value = getDisplayed(model.value)\n }\n }\n)\n\n/** 增 */\nfunction increase(): void {\n if (disabled.value) return\n const { multiple } = props\n const val = model.value ?? 0\n\n if (multiple) {\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const rawVal = $n.div(val, multiple)\n // 在原始值基础上加步长\n const newRawVal = $n.plus(rawVal, stepVal.value)\n // 乘以倍数得到新的实际值\n const newVal = $n.mul(newRawVal, multiple)\n const target = getValidValue(newVal)\n model.value = target\n // tween 动画在原始值上进行\n tween.state.n = $n.div(target, multiple)\n tween.to({ n: $n.div(target, multiple) })\n } else {\n tween.state.n = val\n const target = getValidValue($n.plus(val, stepVal.value))\n model.value = target\n tween.to({ n: target })\n }\n}\n\n/** 减 */\nfunction decrease(): void {\n if (disabled.value) return\n const { multiple } = props\n const val = model.value ?? 0\n\n if (multiple) {\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const rawVal = $n.div(val, multiple)\n // 在原始值基础上减步长\n const newRawVal = $n.minus(rawVal, stepVal.value)\n // 乘以倍数得到新的实际值\n const newVal = $n.mul(newRawVal, multiple)\n const target = getValidValue(newVal)\n model.value = target\n // tween 动画在原始值上进行\n tween.state.n = $n.div(target, multiple)\n tween.to({ n: $n.div(target, multiple) })\n } else {\n tween.state.n = val\n const target = getValidValue($n.minus(val, stepVal.value))\n model.value = target\n tween.to({ n: target })\n }\n}\n\nfunction handleKeydown(e: KeyboardEvent): void {\n if (!props.step) return\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n return increase()\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n return decrease()\n }\n}\n\nfunction handleFocus(): void {\n focused.value = true\n\n // 如果初始值和当前设置的精度不匹配则进行精度修正\n if (model.value === undefined) return\n const { precision, maxPrecision, minPrecision, multiple } = props\n\n if (multiple) {\n // 如果存在倍数,先除以倍数得到原始值进行精度修正,再乘以倍数\n const rawVal = $n.div(model.value, multiple)\n const fixedRawVal = +n(rawVal).fixed(\n precision ?? {\n maxPrecision,\n minPrecision\n }\n )\n model.value = $n.mul(fixedRawVal, multiple)\n } else {\n model.value = +n(model.value).fixed(\n precision ?? {\n maxPrecision,\n minPrecision\n }\n )\n }\n}\n\nfunction handleBlur(): void {\n focused.value = false\n model.value = props.modelValue\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"number-input.js","names":[],"sources":["../../../src/components/number-input/number-input.vue"],"sourcesContent":["<template>\n <u-input\n v-if=\"!readonly\"\n ref=\"inputRef\"\n :class=\"className\"\n :model-value=\"displayed\"\n v-bind=\"inputProps\"\n @update:model-value=\"handleUpdateModelValue\"\n @change=\"handleChange\"\n @keydown.stop=\"handleKeydown\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n :size=\"size\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n >\n <template #suffix v-if=\"step !== undefined && step !== false\">\n <slot name=\"suffix\" />\n <div :class=\"cls.e('step')\">\n <u-icon\n @click=\"increase\"\n v-ripple=\"!disabled && increasable\"\n :class=\"bem.is('disabled', disabled || !increasable)\"\n >\n <ArrowUp />\n </u-icon>\n <u-icon\n @click=\"decrease\"\n v-ripple=\"!disabled && reducible\"\n :class=\"bem.is('disabled', disabled || !reducible)\"\n >\n <ArrowDown />\n </u-icon>\n </div>\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n\n <template v-else>\n {{ generateDisplayed || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n, n, o, isUndef } from '@cat-kit/core'\nimport { useFormComponent, useFormFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { ArrowDown, ArrowUp } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT, Tween } from '@veltra/utils'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport type { NumberInputEmits, NumberInputProps, InputExposed } from '../../types'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\n\ndefineOptions({\n name: 'NumberInput'\n})\n\nconst props = withDefaults(defineProps<NumberInputProps>(), {\n placeholder: '请输入',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\nconst emit = defineEmits<NumberInputEmits>()\n\nconst slots = defineSlots<{\n prefix?: () => any\n suffix?: () => any\n}>()\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst inputProps = computed(() => {\n return o(props).pick(['clearable', 'disabled', 'placeholder', 'size', 'prefix', 'suffix'])\n})\n\nconst inputRef = shallowRef<InputExposed>()\n\nconst inputDom = computed(() => inputRef.value?.el)\n\nconst cls = bem('number-input')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value)]\n})\n\n/** 实际值 */\nconst model = defineModel<NumberInputProps['modelValue']>()\n\n// 展示值\nconst displayed = shallowRef('')\n\nconst focused = shallowRef(false)\n\nconst generateDisplayed = computed(() => {\n if (!displayed.value) return ''\n\n return `${props.prefix ?? ''}${displayed.value}${props.suffix ?? ''}`\n})\n\n/** 步长 */\nconst stepVal = computed<number>(() => {\n const { step } = props\n if (step === undefined) return 1\n return typeof step === 'boolean' ? 1 : step\n})\n\n/** 是否可增 */\nconst increasable = computed(() => {\n const { max, multiple } = props\n if (isUndef(max) || isUndef(model.value)) return true\n // 如果存在倍数,先将 model.value 除以倍数得到原始值再比较\n const rawValue = multiple ? $n.div(model.value, multiple) : model.value\n return rawValue < max\n})\n\n/** 是否可减 */\nconst reducible = computed(() => {\n const { min, multiple } = props\n if (isUndef(min) || isUndef(model.value)) return true\n // 如果存在倍数,先将 model.value 除以倍数得到原始值再比较\n const rawValue = multiple ? $n.div(model.value, multiple) : model.value\n return rawValue > min\n})\n\n// 通过值和步长值计算默认的最大精度\nconst defaultMaxPrecision = computed(() => {\n const { multiple } = props\n // 如果存在倍数,基于原始值计算精度\n const rawValue =\n multiple && model.value !== undefined ? $n.div(model.value, multiple) : model.value\n return Math.max(\n String(rawValue).split('.')[1]?.length ?? 0,\n String(stepVal.value).split('.')[1]?.length ?? 0\n )\n})\n\n/**\n * 获取展示值\n * @param num 实际值\n */\nfunction getDisplayed(num?: number): string {\n if (!num && num !== 0) return ''\n\n const {\n currency,\n precision,\n minPrecision,\n // 如果没有指定最大精度那么设置默认为值和步长值中的较大值\n maxPrecision = defaultMaxPrecision.value,\n multiple\n } = props\n\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const displayValue = multiple ? $n.div(num, multiple) : num\n\n return currency\n ? n(displayValue).currency('CNY', {\n precision,\n minPrecision,\n maxPrecision\n })\n : n(displayValue).fixed(\n precision ?? {\n minPrecision,\n maxPrecision\n }\n )\n}\n\nwatch(\n [model, focused, () => props.currency],\n ([modelValue, inputFocused]) => {\n if (inputFocused) return\n displayed.value = getDisplayed(modelValue)\n },\n { immediate: true }\n)\n\n/**\n * 解析展示值\n * @param str 展示值\n */\nfunction parseDisplayed(str: string): number | undefined {\n if (!str) return undefined\n\n // 将货币格式去掉再转化为数字\n const number = +str.replace(/,/g, '')\n const { multiple } = props\n\n // 如果解析失败,使用当前值作为回退\n // 如果存在倍数,需要先将 model.value 除以倍数得到原始值\n let result: number | undefined\n if (isNaN(number)) {\n if (model.value === undefined) return undefined\n result = multiple ? $n.div(model.value, multiple) : model.value\n } else {\n result = number\n }\n\n if (result === undefined) return undefined\n\n const { precision, maxPrecision, minPrecision } = props\n\n const fixedResult = +n(result).fixed(\n precision ?? {\n minPrecision,\n maxPrecision\n }\n )\n\n // 如果存在倍数,将原始值乘以倍数返回实际值\n return multiple ? $n.mul(fixedResult, multiple) : fixedResult\n}\n\n/**\n * 获取有效值\n * @param val 值\n */\nfunction getValidValue<T extends undefined | number>(val: T): T {\n if (val === undefined) return val\n const { min, max, multiple } = props\n\n // 如果存在倍数,先将值除以倍数得到原始值进行验证,验证后再乘以倍数\n if (multiple) {\n const rawVal = $n.div(val, multiple)\n let validRawVal = rawVal\n if (min !== undefined && rawVal < min) validRawVal = min\n if (max !== undefined && rawVal > max) validRawVal = max\n return $n.mul(validRawVal, multiple) as T\n }\n\n if (min !== undefined && val < min) return min as T\n if (max !== undefined && val > max) return max as T\n return val\n}\n\nfunction handleUpdateModelValue(input: string): void {\n const newVal = parseDisplayed(input)\n model.value = getValidValue(newVal)\n displayed.value = input\n}\n\n/**\n * 处理输入值变化的函数, 该函数仅在输入框失去焦点时触发,\n * 主要用于在输入非数字的情况下的修正处理\n * @param input 输入的值\n */\nfunction handleChange() {\n emit('change', model.value)\n}\n\nconst tween = new Tween(\n { n: model.value ?? 0 },\n {\n onUpdate(state) {\n const _rawInput = inputDom.value\n if (!_rawInput) return\n const { multiple } = props\n // 如果存在倍数,tween.state.n 存储的是原始值,需要乘以倍数后传给 getDisplayed\n const actualValue = multiple ? $n.mul(state.n, multiple) : state.n\n _rawInput.value = getDisplayed(actualValue)\n },\n // 动画进行的过程值有可能被改变, 因此在onComplete中确保还原的是原本的值\n onComplete() {\n const _rawInput = inputDom.value\n if (!_rawInput) return\n _rawInput.value = getDisplayed(model.value)\n }\n }\n)\n\n/** 增 */\nfunction increase(): void {\n if (disabled.value) return\n const { multiple } = props\n const val = model.value ?? 0\n\n if (multiple) {\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const rawVal = $n.div(val, multiple)\n // 在原始值基础上加步长\n const newRawVal = $n.plus(rawVal, stepVal.value)\n // 乘以倍数得到新的实际值\n const newVal = $n.mul(newRawVal, multiple)\n const target = getValidValue(newVal)\n model.value = target\n // tween 动画在原始值上进行\n tween.state.n = $n.div(target, multiple)\n tween.to({ n: $n.div(target, multiple) })\n } else {\n tween.state.n = val\n const target = getValidValue($n.plus(val, stepVal.value))\n model.value = target\n tween.to({ n: target })\n }\n}\n\n/** 减 */\nfunction decrease(): void {\n if (disabled.value) return\n const { multiple } = props\n const val = model.value ?? 0\n\n if (multiple) {\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const rawVal = $n.div(val, multiple)\n // 在原始值基础上减步长\n const newRawVal = $n.minus(rawVal, stepVal.value)\n // 乘以倍数得到新的实际值\n const newVal = $n.mul(newRawVal, multiple)\n const target = getValidValue(newVal)\n model.value = target\n // tween 动画在原始值上进行\n tween.state.n = $n.div(target, multiple)\n tween.to({ n: $n.div(target, multiple) })\n } else {\n tween.state.n = val\n const target = getValidValue($n.minus(val, stepVal.value))\n model.value = target\n tween.to({ n: target })\n }\n}\n\nfunction handleKeydown(e: KeyboardEvent): void {\n if (!props.step) return\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n return increase()\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n return decrease()\n }\n}\n\nfunction handleFocus(): void {\n focused.value = true\n\n // 如果初始值和当前设置的精度不匹配则进行精度修正\n if (model.value === undefined) return\n const { precision, maxPrecision, minPrecision, multiple } = props\n\n if (multiple) {\n // 如果存在倍数,先除以倍数得到原始值进行精度修正,再乘以倍数\n const rawVal = $n.div(model.value, multiple)\n const fixedRawVal = +n(rawVal).fixed(\n precision ?? {\n maxPrecision,\n minPrecision\n }\n )\n model.value = $n.mul(fixedRawVal, multiple)\n } else {\n model.value = +n(model.value).fixed(\n precision ?? {\n maxPrecision,\n minPrecision\n }\n )\n }\n}\n\nfunction handleBlur(): void {\n focused.value = false\n model.value = props.modelValue\n}\n</script>\n"],"mappings":"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"}
@@ -20,10 +20,10 @@ declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {
20
20
  "onUpdate:modelValue"?: ((value?: number | undefined) => any) | undefined;
21
21
  onChange?: ((value?: number | undefined) => any) | undefined;
22
22
  }>, {
23
- disabled: boolean;
24
- readonly: boolean;
25
23
  placeholder: string;
26
24
  clearable: boolean;
25
+ disabled: boolean;
26
+ readonly: boolean;
27
27
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
28
28
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
29
29
  declare const _default: typeof __VLS_export;
@@ -24,9 +24,9 @@ declare const __VLS_export: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {},
24
24
  "onUpdate:start"?: ((value: number | undefined) => any) | undefined;
25
25
  "onUpdate:end"?: ((value: number | undefined) => any) | undefined;
26
26
  }>, {
27
+ clearable: boolean;
27
28
  disabled: boolean;
28
29
  readonly: boolean;
29
- clearable: boolean;
30
30
  startPlaceholder: string;
31
31
  endPlaceholder: string;
32
32
  separator: string;
@@ -15,9 +15,9 @@ declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {
15
15
  }, string, _$vue.PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
16
16
  "onUpdate:modelValue"?: ((value: string | undefined) => any) | undefined;
17
17
  }>, {
18
+ clearable: boolean;
18
19
  disabled: boolean;
19
20
  readonly: boolean;
20
- clearable: boolean;
21
21
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
22
22
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
23
23
  declare const _default: typeof __VLS_export;
@@ -14,8 +14,8 @@ declare const __VLS_base: _$vue.DefineComponent<PopConfirmProps, {}, {}, {}, {},
14
14
  onConfirm?: (() => any) | undefined;
15
15
  onCancel?: (() => any) | undefined;
16
16
  }>, {
17
- direction: TipDirection;
18
17
  trigger: "hover" | "click";
18
+ direction: TipDirection;
19
19
  icon: _$vue.Component;
20
20
  iconColor: string;
21
21
  confirmText: string;
@@ -16,10 +16,10 @@ declare const __VLS_export: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {},
16
16
  "onUpdate:modelValue"?: ((value: any) => any) | undefined;
17
17
  onChange?: ((item: Record<string, any>) => any) | undefined;
18
18
  }>, {
19
- disabled: boolean;
20
- readonly: boolean;
21
19
  labelKey: string;
22
20
  valueKey: string;
21
+ disabled: boolean;
22
+ readonly: boolean;
23
23
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
24
24
  declare const _default: typeof __VLS_export;
25
25
  //#endregion
@@ -2,12 +2,12 @@ import _sfc_main$1 from "./toolbar.js";
2
2
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeModels, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, shallowRef, toDisplayString, unref, useModel, useTemplateRef, watch } from "vue";
3
3
  import { bem } from "@veltra/utils";
4
4
  import { useFormComponent, useFormFallbackProps } from "@veltra/compositions";
5
- import { $createParagraphNode, $getRoot, createEditor } from "lexical";
6
5
  import { createEmptyHistoryState, registerHistory } from "@lexical/history";
7
6
  import { $generateHtmlFromNodes, $generateNodesFromDOM } from "@lexical/html";
8
7
  import { AutoLinkNode, LinkNode } from "@lexical/link";
9
8
  import { ListItemNode, ListNode, registerList } from "@lexical/list";
10
9
  import { HeadingNode, QuoteNode, registerRichText } from "@lexical/rich-text";
10
+ import { $createParagraphNode, $getRoot, createEditor } from "lexical";
11
11
  //#region src/components/rich-text-editor/rich-text-editor.vue
12
12
  const _hoisted_1 = ["contenteditable"];
13
13
  const LEXICAL_THEME = {
@@ -12,9 +12,9 @@ declare const __VLS_export: _$vue.DefineComponent<RichTextEditorProps & {
12
12
  }> & Readonly<{
13
13
  "onUpdate:modelValue"?: ((value: string | undefined) => any) | undefined;
14
14
  }>, {
15
+ placeholder: string;
15
16
  disabled: boolean;
16
17
  readonly: boolean;
17
- placeholder: string;
18
18
  format: RichTextFormat;
19
19
  toolbar: ToolbarItem[];
20
20
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
@@ -1,11 +1,11 @@
1
1
  import { Fragment, createElementBlock, createElementVNode, createStaticVNode, defineComponent, normalizeClass, onBeforeUnmount, openBlock, ref, renderList, unref, watch } from "vue";
2
2
  import { bem } from "@veltra/utils";
3
- import { $createParagraphNode, $getSelection, $isRangeSelection, FORMAT_TEXT_COMMAND, REDO_COMMAND, UNDO_COMMAND } from "lexical";
4
- import { $getNearestNodeOfType } from "@lexical/utils";
5
3
  import { $isLinkNode, TOGGLE_LINK_COMMAND } from "@lexical/link";
6
4
  import { INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, ListNode } from "@lexical/list";
7
5
  import { $createHeadingNode, $createQuoteNode, $isHeadingNode, $isQuoteNode } from "@lexical/rich-text";
6
+ import { $createParagraphNode, $getSelection, $isRangeSelection, FORMAT_TEXT_COMMAND, REDO_COMMAND, UNDO_COMMAND } from "lexical";
8
7
  import { $setBlocksType } from "@lexical/selection";
8
+ import { $getNearestNodeOfType } from "@lexical/utils";
9
9
  //#region src/components/rich-text-editor/toolbar.vue
10
10
  const _hoisted_1 = ["value", "disabled"];
11
11
  const _hoisted_2 = [
@@ -26,12 +26,12 @@ declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {
26
26
  "onUpdate:text"?: ((value: any) => any) | undefined;
27
27
  "onUpdate:label"?: ((label?: string | undefined) => any) | undefined;
28
28
  }>, {
29
- disabled: boolean;
30
- readonly: boolean;
31
29
  labelKey: string;
32
30
  valueKey: string;
33
31
  placeholder: string;
34
32
  clearable: boolean;
33
+ disabled: boolean;
34
+ readonly: boolean;
35
35
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
36
36
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
37
37
  declare const _default: typeof __VLS_export;
@@ -15,8 +15,8 @@ declare const __VLS_base: _$vue.DefineComponent<StepsProps, {}, {}, {}, {}, _$vu
15
15
  "onUpdate:current"?: ((value?: string | number | undefined) => any) | undefined;
16
16
  "onItem-click"?: ((item: Record<string, any>, index: number) => any) | undefined;
17
17
  }>, {
18
- direction: "horizontal" | "vertical";
19
18
  labelKey: string;
19
+ direction: "horizontal" | "vertical";
20
20
  finishedStepType: _$_veltra_utils0.ColorType;
21
21
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
22
22
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -47,7 +47,21 @@ function useTable(options) {
47
47
  cellClassCache = /* @__PURE__ */ new WeakMap();
48
48
  headerCellClassCache = /* @__PURE__ */ new WeakMap();
49
49
  });
50
+ /**
51
+ * B2: 即便缓存命中也需读取 `leftFixed` / `rightFixed`,将其登记为调用方
52
+ * render effect 的响应式依赖。
53
+ *
54
+ * 否则横向滚动时虽然 `watch` 已经清空缓存,但已渲染的单元格没有任何依赖
55
+ * 把这两个 ref 串联到自己的 render,导致 `is-last-fixed` / `is-first-fixed`
56
+ * 阴影 class 不会被刷新——只有垂直滚动让虚拟列表新挂载行时(render 首次
57
+ * 命中空缓存读到最新值)才能看到阴影。
58
+ *
59
+ * 父级 `useTable` 的 watch effect id 早于子 `TableRow` 的 render effect,
60
+ * 同一 flush 周期中缓存会先被清空,再轮到 render 重跑读到最新值。
61
+ */
50
62
  const getCellClass = (column) => {
63
+ leftFixed.value;
64
+ rightFixed.value;
51
65
  const cached = cellClassCache.get(column);
52
66
  if (cached !== void 0) return cached;
53
67
  const result = getCommonClassName(column) + ` ${bem.is(column.align)}`;
@@ -55,6 +69,8 @@ function useTable(options) {
55
69
  return result;
56
70
  };
57
71
  const getHeaderCellClass = (column) => {
72
+ leftFixed.value;
73
+ rightFixed.value;
58
74
  const cached = headerCellClassCache.get(column);
59
75
  if (cached !== void 0) return cached;
60
76
  const result = getCommonClassName(column) + ` ${bem.is(column.headerAlign)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"use-table.js","names":[],"sources":["../../../src/components/table/use-table.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { bem, type BEM } from '@veltra/utils'\nimport { useSlots, watch, type Ref } from 'vue'\n\nimport type {\n TableColumnRenderContext,\n TableColumnSlotsScope,\n TableProps,\n TableRow,\n RenderReturn,\n TableRowSlotsScope\n} from '../../types'\nimport type { ColumnNode } from './node/col'\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n leftFixed: Ref<boolean>\n rightFixed: Ref<boolean>\n}\n\ninterface UseTableReturn {\n getColumnSlotsNode: (ctx: TableColumnSlotsScope | TableColumnRenderContext) => RenderReturn\n getHeaderSlotsNode: (ctx: { column: ColumnNode }) => RenderReturn\n getExpandRowSlotsNode: (ctx: TableRowSlotsScope) => RenderReturn\n getCellClass: (column: ColumnNode) => string\n getHeaderCellClass: (column: ColumnNode) => string\n getCellCtx: (\n row: TableRow,\n column: ColumnNode\n ) => TableColumnSlotsScope | TableColumnRenderContext\n}\n\nexport function useTable(options: Options): UseTableReturn {\n const { props, cls, leftFixed, rightFixed } = options\n\n const slots = useSlots()\n\n const getColumnSlotsNode = (\n ctx: TableColumnSlotsScope | TableColumnRenderContext\n ): RenderReturn => {\n const column = ctx.column.data\n\n const { render, key } = column\n\n if (render) return render(ctx)\n\n const slotsRender = props.slots?.[`column:${key}`] ?? slots[`column:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return ctx.val\n }\n\n const getHeaderSlotsNode = (ctx: { column: ColumnNode }): RenderReturn => {\n const column = ctx.column.data\n const { nameRender, key } = column\n\n if (nameRender) return nameRender(ctx)\n\n const slotsRender = props.slots?.[`header:${key}`] ?? slots[`header:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return column.name\n }\n\n const getExpandRowSlotsNode = (ctx: TableRowSlotsScope): RenderReturn => {\n const slotsRender = props.slots?.['row:expand'] ?? slots['row:expand']\n\n if (slotsRender) return slotsRender(ctx)\n return null\n }\n\n const cellCls = cls.e('cell')\n\n const getCommonClassName = (column: ColumnNode): string => {\n const classList: string[] = [cellCls]\n\n leftFixed.value && column.isLastFixed && classList.push(bem.is('last-fixed'))\n\n rightFixed.value && column.isFirstFixed && classList.push(bem.is('first-fixed'))\n\n if (column.fixed) {\n classList.push(bem.is('fixed-' + column.fixed))\n }\n return classList.join(' ')\n }\n\n /**\n * B1: 单元格类名按 ColumnNode 身份缓存。\n *\n * 对同一列,类名只取决于 (column.fixed, column.isLastFixed, column.isFirstFixed,\n * column.align, leftFixed, rightFixed)。其中前四个绑定在 ColumnNode 实例上,\n * 后两个在 leftFixed/rightFixed 变化时失效缓存即可。用 WeakMap 以 ColumnNode\n * 为键可避免字符串 key 的拼接/哈希开销,且列树重建时节点随 GC 自动释放。\n */\n let cellClassCache = new WeakMap<ColumnNode, string>()\n let headerCellClassCache = new WeakMap<ColumnNode, string>()\n\n watch([leftFixed, rightFixed], () => {\n cellClassCache = new WeakMap()\n headerCellClassCache = new WeakMap()\n })\n\n const getCellClass = (column: ColumnNode): string => {\n const cached = cellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.align)}`\n cellClassCache.set(column, result)\n return result\n }\n\n const getHeaderCellClass = (column: ColumnNode): string => {\n const cached = headerCellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.headerAlign)}`\n headerCellClassCache.set(column, result)\n return result\n }\n\n const getCellCtx = (\n row: TableRow,\n column: ColumnNode\n ): TableColumnSlotsScope | TableColumnRenderContext => {\n const rowData = row.data\n const val = column.key ? o(rowData).get(column.key) : undefined\n\n const ctx = {\n row,\n column,\n rowData,\n val,\n model: {\n modelValue: val,\n 'onUpdate:modelValue': (val: any) => {\n rowData[column.key] = val\n }\n }\n }\n\n return ctx\n }\n\n return {\n /**\n * 获取列插槽VNode\n * @param ctx 列渲染上下文\n */\n getColumnSlotsNode,\n /**\n * 获取表头插槽VNode\n * @param ctx 表头渲染上下文\n */\n getHeaderSlotsNode,\n /**\n * 获取展开行插槽VNode\n * @param ctx 展开行渲染上下文\n */\n getExpandRowSlotsNode,\n /**\n * 获取单元格类名\n * @param column 列\n */\n getCellClass,\n /**\n * 获取表头单元格类名\n * @param column 列\n */\n getHeaderCellClass,\n /**\n * 获取单元格上下文\n * @param row 行\n * @param column 列\n */\n getCellCtx\n }\n}\n"],"mappings":";;;;AAiCA,SAAgB,SAAS,SAAkC;CACzD,MAAM,EAAE,OAAO,KAAK,WAAW,eAAe;CAE9C,MAAM,QAAQ,UAAU;CAExB,MAAM,sBACJ,QACiB;EAGjB,MAAM,EAAE,QAAQ,QAFD,IAAI,OAAO;AAI1B,MAAI,OAAQ,QAAO,OAAO,IAAI;EAE9B,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;AAEtE,MAAI,YAAa,QAAO,YAAY,IAAI;AAExC,SAAO,IAAI;;CAGb,MAAM,sBAAsB,QAA8C;EACxE,MAAM,SAAS,IAAI,OAAO;EAC1B,MAAM,EAAE,YAAY,QAAQ;AAE5B,MAAI,WAAY,QAAO,WAAW,IAAI;EAEtC,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;AAEtE,MAAI,YAAa,QAAO,YAAY,IAAI;AAExC,SAAO,OAAO;;CAGhB,MAAM,yBAAyB,QAA0C;EACvE,MAAM,cAAc,MAAM,QAAQ,iBAAiB,MAAM;AAEzD,MAAI,YAAa,QAAO,YAAY,IAAI;AACxC,SAAO;;CAGT,MAAM,UAAU,IAAI,EAAE,OAAO;CAE7B,MAAM,sBAAsB,WAA+B;EACzD,MAAM,YAAsB,CAAC,QAAQ;AAErC,YAAU,SAAS,OAAO,eAAe,UAAU,KAAK,IAAI,GAAG,aAAa,CAAC;AAE7E,aAAW,SAAS,OAAO,gBAAgB,UAAU,KAAK,IAAI,GAAG,cAAc,CAAC;AAEhF,MAAI,OAAO,MACT,WAAU,KAAK,IAAI,GAAG,WAAW,OAAO,MAAM,CAAC;AAEjD,SAAO,UAAU,KAAK,IAAI;;;;;;;;;;CAW5B,IAAI,iCAAiB,IAAI,SAA6B;CACtD,IAAI,uCAAuB,IAAI,SAA6B;AAE5D,OAAM,CAAC,WAAW,WAAW,QAAQ;AACnC,mCAAiB,IAAI,SAAS;AAC9B,yCAAuB,IAAI,SAAS;GACpC;CAEF,MAAM,gBAAgB,WAA+B;EACnD,MAAM,SAAS,eAAe,IAAI,OAAO;AACzC,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,SAAS,mBAAmB,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,MAAM;AACpE,iBAAe,IAAI,QAAQ,OAAO;AAClC,SAAO;;CAGT,MAAM,sBAAsB,WAA+B;EACzD,MAAM,SAAS,qBAAqB,IAAI,OAAO;AAC/C,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,SAAS,mBAAmB,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,YAAY;AAC1E,uBAAqB,IAAI,QAAQ,OAAO;AACxC,SAAO;;CAGT,MAAM,cACJ,KACA,WACqD;EACrD,MAAM,UAAU,IAAI;EACpB,MAAM,MAAM,OAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,OAAO,IAAI,GAAG,KAAA;AAetD,SAAO;GAZL;GACA;GACA;GACA;GACA,OAAO;IACL,YAAY;IACZ,wBAAwB,QAAa;AACnC,aAAQ,OAAO,OAAO;;IAEzB;GAGO;;AAGZ,QAAO;;;;;EAKL;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;;EAMA;EACD"}
1
+ {"version":3,"file":"use-table.js","names":[],"sources":["../../../src/components/table/use-table.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { bem, type BEM } from '@veltra/utils'\nimport { useSlots, watch, type Ref } from 'vue'\n\nimport type {\n TableColumnRenderContext,\n TableColumnSlotsScope,\n TableProps,\n TableRow,\n RenderReturn,\n TableRowSlotsScope\n} from '../../types'\nimport type { ColumnNode } from './node/col'\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n leftFixed: Ref<boolean>\n rightFixed: Ref<boolean>\n}\n\ninterface UseTableReturn {\n getColumnSlotsNode: (ctx: TableColumnSlotsScope | TableColumnRenderContext) => RenderReturn\n getHeaderSlotsNode: (ctx: { column: ColumnNode }) => RenderReturn\n getExpandRowSlotsNode: (ctx: TableRowSlotsScope) => RenderReturn\n getCellClass: (column: ColumnNode) => string\n getHeaderCellClass: (column: ColumnNode) => string\n getCellCtx: (\n row: TableRow,\n column: ColumnNode\n ) => TableColumnSlotsScope | TableColumnRenderContext\n}\n\nexport function useTable(options: Options): UseTableReturn {\n const { props, cls, leftFixed, rightFixed } = options\n\n const slots = useSlots()\n\n const getColumnSlotsNode = (\n ctx: TableColumnSlotsScope | TableColumnRenderContext\n ): RenderReturn => {\n const column = ctx.column.data\n\n const { render, key } = column\n\n if (render) return render(ctx)\n\n const slotsRender = props.slots?.[`column:${key}`] ?? slots[`column:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return ctx.val\n }\n\n const getHeaderSlotsNode = (ctx: { column: ColumnNode }): RenderReturn => {\n const column = ctx.column.data\n const { nameRender, key } = column\n\n if (nameRender) return nameRender(ctx)\n\n const slotsRender = props.slots?.[`header:${key}`] ?? slots[`header:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return column.name\n }\n\n const getExpandRowSlotsNode = (ctx: TableRowSlotsScope): RenderReturn => {\n const slotsRender = props.slots?.['row:expand'] ?? slots['row:expand']\n\n if (slotsRender) return slotsRender(ctx)\n return null\n }\n\n const cellCls = cls.e('cell')\n\n const getCommonClassName = (column: ColumnNode): string => {\n const classList: string[] = [cellCls]\n\n leftFixed.value && column.isLastFixed && classList.push(bem.is('last-fixed'))\n\n rightFixed.value && column.isFirstFixed && classList.push(bem.is('first-fixed'))\n\n if (column.fixed) {\n classList.push(bem.is('fixed-' + column.fixed))\n }\n return classList.join(' ')\n }\n\n /**\n * B1: 单元格类名按 ColumnNode 身份缓存。\n *\n * 对同一列,类名只取决于 (column.fixed, column.isLastFixed, column.isFirstFixed,\n * column.align, leftFixed, rightFixed)。其中前四个绑定在 ColumnNode 实例上,\n * 后两个在 leftFixed/rightFixed 变化时失效缓存即可。用 WeakMap 以 ColumnNode\n * 为键可避免字符串 key 的拼接/哈希开销,且列树重建时节点随 GC 自动释放。\n */\n let cellClassCache = new WeakMap<ColumnNode, string>()\n let headerCellClassCache = new WeakMap<ColumnNode, string>()\n\n watch([leftFixed, rightFixed], () => {\n cellClassCache = new WeakMap()\n headerCellClassCache = new WeakMap()\n })\n\n /**\n * B2: 即便缓存命中也需读取 `leftFixed` / `rightFixed`,将其登记为调用方\n * render effect 的响应式依赖。\n *\n * 否则横向滚动时虽然 `watch` 已经清空缓存,但已渲染的单元格没有任何依赖\n * 把这两个 ref 串联到自己的 render,导致 `is-last-fixed` / `is-first-fixed`\n * 阴影 class 不会被刷新——只有垂直滚动让虚拟列表新挂载行时(render 首次\n * 命中空缓存读到最新值)才能看到阴影。\n *\n * 父级 `useTable` 的 watch effect id 早于子 `TableRow` 的 render effect,\n * 同一 flush 周期中缓存会先被清空,再轮到 render 重跑读到最新值。\n */\n const getCellClass = (column: ColumnNode): string => {\n void leftFixed.value\n void rightFixed.value\n const cached = cellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.align)}`\n cellClassCache.set(column, result)\n return result\n }\n\n const getHeaderCellClass = (column: ColumnNode): string => {\n void leftFixed.value\n void rightFixed.value\n const cached = headerCellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.headerAlign)}`\n headerCellClassCache.set(column, result)\n return result\n }\n\n const getCellCtx = (\n row: TableRow,\n column: ColumnNode\n ): TableColumnSlotsScope | TableColumnRenderContext => {\n const rowData = row.data\n const val = column.key ? o(rowData).get(column.key) : undefined\n\n const ctx = {\n row,\n column,\n rowData,\n val,\n model: {\n modelValue: val,\n 'onUpdate:modelValue': (val: any) => {\n rowData[column.key] = val\n }\n }\n }\n\n return ctx\n }\n\n return {\n /**\n * 获取列插槽VNode\n * @param ctx 列渲染上下文\n */\n getColumnSlotsNode,\n /**\n * 获取表头插槽VNode\n * @param ctx 表头渲染上下文\n */\n getHeaderSlotsNode,\n /**\n * 获取展开行插槽VNode\n * @param ctx 展开行渲染上下文\n */\n getExpandRowSlotsNode,\n /**\n * 获取单元格类名\n * @param column 列\n */\n getCellClass,\n /**\n * 获取表头单元格类名\n * @param column 列\n */\n getHeaderCellClass,\n /**\n * 获取单元格上下文\n * @param row 行\n * @param column 列\n */\n getCellCtx\n }\n}\n"],"mappings":";;;;AAiCA,SAAgB,SAAS,SAAkC;CACzD,MAAM,EAAE,OAAO,KAAK,WAAW,eAAe;CAE9C,MAAM,QAAQ,UAAU;CAExB,MAAM,sBACJ,QACiB;EAGjB,MAAM,EAAE,QAAQ,QAFD,IAAI,OAAO;AAI1B,MAAI,OAAQ,QAAO,OAAO,IAAI;EAE9B,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;AAEtE,MAAI,YAAa,QAAO,YAAY,IAAI;AAExC,SAAO,IAAI;;CAGb,MAAM,sBAAsB,QAA8C;EACxE,MAAM,SAAS,IAAI,OAAO;EAC1B,MAAM,EAAE,YAAY,QAAQ;AAE5B,MAAI,WAAY,QAAO,WAAW,IAAI;EAEtC,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;AAEtE,MAAI,YAAa,QAAO,YAAY,IAAI;AAExC,SAAO,OAAO;;CAGhB,MAAM,yBAAyB,QAA0C;EACvE,MAAM,cAAc,MAAM,QAAQ,iBAAiB,MAAM;AAEzD,MAAI,YAAa,QAAO,YAAY,IAAI;AACxC,SAAO;;CAGT,MAAM,UAAU,IAAI,EAAE,OAAO;CAE7B,MAAM,sBAAsB,WAA+B;EACzD,MAAM,YAAsB,CAAC,QAAQ;AAErC,YAAU,SAAS,OAAO,eAAe,UAAU,KAAK,IAAI,GAAG,aAAa,CAAC;AAE7E,aAAW,SAAS,OAAO,gBAAgB,UAAU,KAAK,IAAI,GAAG,cAAc,CAAC;AAEhF,MAAI,OAAO,MACT,WAAU,KAAK,IAAI,GAAG,WAAW,OAAO,MAAM,CAAC;AAEjD,SAAO,UAAU,KAAK,IAAI;;;;;;;;;;CAW5B,IAAI,iCAAiB,IAAI,SAA6B;CACtD,IAAI,uCAAuB,IAAI,SAA6B;AAE5D,OAAM,CAAC,WAAW,WAAW,QAAQ;AACnC,mCAAiB,IAAI,SAAS;AAC9B,yCAAuB,IAAI,SAAS;GACpC;;;;;;;;;;;;;CAcF,MAAM,gBAAgB,WAA+B;AAC9C,YAAU;AACV,aAAW;EAChB,MAAM,SAAS,eAAe,IAAI,OAAO;AACzC,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,SAAS,mBAAmB,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,MAAM;AACpE,iBAAe,IAAI,QAAQ,OAAO;AAClC,SAAO;;CAGT,MAAM,sBAAsB,WAA+B;AACpD,YAAU;AACV,aAAW;EAChB,MAAM,SAAS,qBAAqB,IAAI,OAAO;AAC/C,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,SAAS,mBAAmB,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,YAAY;AAC1E,uBAAqB,IAAI,QAAQ,OAAO;AACxC,SAAO;;CAGT,MAAM,cACJ,KACA,WACqD;EACrD,MAAM,UAAU,IAAI;EACpB,MAAM,MAAM,OAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,OAAO,IAAI,GAAG,KAAA;AAetD,SAAO;GAZL;GACA;GACA;GACA;GACA,OAAO;IACL,YAAY;IACZ,wBAAwB,QAAa;AACnC,aAAQ,OAAO,OAAO;;IAEzB;GAGO;;AAGZ,QAAO;;;;;EAKL;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;;EAMA;EACD"}
@@ -24,8 +24,8 @@ declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {
24
24
  onClick?: ((item: TabItem, index: number) => any) | undefined;
25
25
  }>, {
26
26
  closable: boolean;
27
- rounded: boolean;
28
27
  position: "top" | "bottom";
28
+ rounded: boolean;
29
29
  block: boolean;
30
30
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
31
31
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -23,8 +23,8 @@ declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {
23
23
  onClick?: ((item: TabItem, index: number) => any) | undefined;
24
24
  }>, {
25
25
  closable: boolean;
26
- rounded: boolean;
27
26
  position: "left" | "right";
27
+ rounded: boolean;
28
28
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
29
29
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
30
30
  declare const _default: typeof __VLS_export;
@@ -19,8 +19,8 @@ declare const __VLS_export: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {},
19
19
  onClick?: ((item: TabItem, index: number) => any) | undefined;
20
20
  }>, {
21
21
  closable: boolean;
22
- rounded: boolean;
23
22
  position: "left" | "right" | "top" | "bottom";
23
+ rounded: boolean;
24
24
  block: boolean;
25
25
  keepAlive: boolean;
26
26
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
@@ -22,10 +22,10 @@ declare const __VLS_export: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {},
22
22
  onFocus?: (() => any) | undefined;
23
23
  onBlur?: (() => any) | undefined;
24
24
  }>, {
25
- disabled: boolean;
26
- readonly: boolean;
27
25
  placeholder: string;
28
26
  clearable: boolean;
27
+ disabled: boolean;
28
+ readonly: boolean;
29
29
  resize: boolean;
30
30
  autosize: boolean;
31
31
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
@@ -11,10 +11,10 @@ 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;
17
+ direction: TipDirection;
18
18
  content: string;
19
19
  alignment: TipAlign;
20
20
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
@@ -25,7 +25,7 @@
25
25
  margin-right: var(--u-gap-small);
26
26
  }
27
27
  .u-tree--small .u-tree__node {
28
- min-height: 28px;
28
+ min-height: var(--u-form-component-height-small);
29
29
  }
30
30
  .u-tree--default .u-tree__node-content {
31
31
  border-radius: var(--u-radius-default);
@@ -37,7 +37,7 @@
37
37
  margin-right: var(--u-gap-default);
38
38
  }
39
39
  .u-tree--default .u-tree__node {
40
- min-height: 32px;
40
+ min-height: var(--u-form-component-height-default);
41
41
  }
42
42
  .u-tree--large .u-tree__node-content {
43
43
  border-radius: var(--u-radius-large);
@@ -49,7 +49,7 @@
49
49
  margin-right: var(--u-gap-large);
50
50
  }
51
51
  .u-tree--large .u-tree__node {
52
- min-height: 40px;
52
+ min-height: var(--u-form-component-height-large);
53
53
  }
54
54
  .u-tree__checkbox {
55
55
  height: fit-content;
@@ -81,7 +81,12 @@
81
81
  align-items: center;
82
82
  flex-wrap: nowrap;
83
83
  }
84
- .u-tree__node.is-selected::before {
84
+ .u-tree__node.is-selected .u-tree__node-content {
85
+ background-color: var(--u-color-primary-light-9);
86
+ color: var(--u-color-primary);
87
+ font-weight: 500;
88
+ }
89
+ .u-tree__node.is-selected .u-tree__node-content::before {
85
90
  content: "";
86
91
  position: absolute;
87
92
  left: 0;
@@ -91,11 +96,6 @@
91
96
  border-radius: 3px;
92
97
  background-color: var(--u-color-primary);
93
98
  }
94
- .u-tree__node.is-selected .u-tree__node-content {
95
- background-color: var(--u-color-primary-light-9);
96
- color: var(--u-color-primary);
97
- font-weight: 500;
98
- }
99
99
  .u-tree__node.is-expanded .u-tree__expand-icon {
100
100
  transform: rotate(90deg);
101
101
  }
@@ -112,9 +112,6 @@
112
112
  flex-shrink: 0;
113
113
  width: 20px;
114
114
  }
115
- .u-tree__indent__indent--leaf {
116
- width: 20px;
117
- }
118
115
  .u-tree__expand-icon {
119
116
  cursor: pointer;
120
117
  flex-shrink: 0;
@@ -127,7 +124,16 @@
127
124
  .u-tree__expand-icon:hover {
128
125
  background-color: var(--u-bg-color-hover);
129
126
  }
127
+ .u-tree__leaf-icon {
128
+ flex-shrink: 0;
129
+ width: 20px;
130
+ height: 20px;
131
+ font-size: 20px;
132
+ color: var(--u-text-color-placeholder);
133
+ pointer-events: none;
134
+ }
130
135
  .u-tree__node-content {
136
+ position: relative;
131
137
  flex-grow: 1;
132
138
  overflow: hidden;
133
139
  user-select: none;
@@ -4,7 +4,7 @@ import _sfc_main$2 from "../checkbox/checkbox.js";
4
4
  import NodeRender from "../node-render/node-render.js";
5
5
  import { Fragment, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, inject, normalizeClass, openBlock, renderList, unref, withCtx, withDirectives, withModifiers } from "vue";
6
6
  import { bem } from "@veltra/utils";
7
- import { ArrowRight } from "@veltra/icons/normal";
7
+ import { ArrowRight, Dot } from "@veltra/icons/normal";
8
8
  import { vRipple } from "@veltra/directives";
9
9
  //#region src/components/tree/tree-node.vue
10
10
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -61,11 +61,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
61
61
  }, {
62
62
  default: withCtx(() => [createVNode(unref(ArrowRight))]),
63
63
  _: 1
64
- }, 8, ["class"])) : (openBlock(), createElementBlock("i", {
64
+ }, 8, ["class"])) : (openBlock(), createBlock(unref(_sfc_main$1), {
65
65
  key: 1,
66
- class: normalizeClass([unref(cls).e("indent"), unref(cls).em("indent", "leaf")]),
66
+ class: normalizeClass(unref(cls).e("leaf-icon")),
67
67
  "aria-hidden": "true"
68
- }, null, 2)),
68
+ }, {
69
+ default: withCtx(() => [createVNode(unref(Dot))]),
70
+ _: 1
71
+ }, 8, ["class"])),
69
72
  withDirectives((openBlock(), createElementBlock("div", {
70
73
  class: normalizeClass(unref(cls).e("node-content")),
71
74
  onClick: handleClick,
@@ -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 :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
+ {"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 <u-icon v-else :class=\"cls.e('leaf-icon')\" aria-hidden=\"true\">\n <Dot />\n </u-icon>\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, Dot } 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":";;;;;;;;;;;;;;;;;;EAqDA,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;;;uBAnF5C,mBAiCM,OAAA;IAhCH,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,YAES,MAAA,YAAA,EAAA;;KAFO,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,YAAA,CAAA;KAAe,eAAY;;4BAC9C,CAAP,YAAO,MAAA,IAAA,CAAA,CAAA,CAAA;;;iCAGT,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"}
@@ -24,15 +24,15 @@ declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {
24
24
  onChange?: ((value?: string | number | undefined, selectedData?: Record<string, any> | undefined) => any) | undefined;
25
25
  "onUpdate:text"?: ((text?: string | undefined) => any) | undefined;
26
26
  }>, {
27
- disabled: boolean;
28
- readonly: boolean;
29
- minWidth: string;
30
27
  expandAll: boolean;
31
28
  labelKey: string;
32
29
  valueKey: string;
33
30
  placeholder: string;
34
31
  clearable: boolean;
35
32
  filterable: boolean;
33
+ minWidth: string;
34
+ disabled: boolean;
35
+ readonly: boolean;
36
36
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
37
37
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
38
38
  declare const _default: typeof __VLS_export;