@veltra/desktop 1.4.0 → 1.6.0

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 (460) hide show
  1. package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  2. package/dist/components/action/action.js.map +1 -1
  3. package/dist/components/auto-complete/auto-complete.js.map +1 -1
  4. package/dist/components/badge/badge.js.map +1 -1
  5. package/dist/components/badge/style.d.ts +1 -1
  6. package/dist/components/batch-edit/batch-edit-form.js +8 -12
  7. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  8. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  9. package/dist/components/batch-edit/batch-edit.js +2 -1
  10. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  11. package/dist/components/batch-edit/di.js.map +1 -1
  12. package/dist/components/batch-edit/index.d.ts +2 -2
  13. package/dist/components/batch-edit/use-edit-state.js +11 -9
  14. package/dist/components/batch-edit/use-edit-state.js.map +1 -1
  15. package/dist/components/batch-edit/use-handlers.js.map +1 -1
  16. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  17. package/dist/components/breadcrumb/style.d.ts +1 -1
  18. package/dist/components/button/button-group.js.map +1 -1
  19. package/dist/components/button/button.js +2 -2
  20. package/dist/components/button/button.js.map +1 -1
  21. package/dist/components/button/style2.css +85 -92
  22. package/dist/components/calendar/calendar.js.map +1 -1
  23. package/dist/components/calendar/style.d.ts +1 -1
  24. package/dist/components/card/card-action.js.map +1 -1
  25. package/dist/components/card/card-content.js.map +1 -1
  26. package/dist/components/card/card-cover.js.map +1 -1
  27. package/dist/components/card/card-header.js.map +1 -1
  28. package/dist/components/card/card.js.map +1 -1
  29. package/dist/components/card/style.d.ts +1 -1
  30. package/dist/components/cascade/cascade-panel-item.js.map +1 -1
  31. package/dist/components/cascade/cascade.js.map +1 -1
  32. package/dist/components/check-tag/check-tag.js.map +1 -1
  33. package/dist/components/check-tag/style.d.ts +1 -1
  34. package/dist/components/checkbox/checkbox-button.js.map +1 -1
  35. package/dist/components/checkbox/checkbox.js.map +1 -1
  36. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  37. package/dist/components/code-editor/basic-setup.js +2 -2
  38. package/dist/components/code-editor/code-editor.js +2 -2
  39. package/dist/components/code-editor/code-editor.js.map +1 -1
  40. package/dist/components/code-editor/lang-loaders.js +1 -1
  41. package/dist/components/code-editor/shell-extension.js +2 -2
  42. package/dist/components/collapse/collapse-item.js +24 -7
  43. package/dist/components/collapse/collapse-item.js.map +1 -1
  44. package/dist/components/collapse/collapse.js.map +1 -1
  45. package/dist/components/collapse/style.d.ts +1 -1
  46. package/dist/components/condition-editor/components/condition-group.js.map +1 -1
  47. package/dist/components/condition-editor/components/condition-row.js.map +1 -1
  48. package/dist/components/condition-editor/condition-editor.js.map +1 -1
  49. package/dist/components/condition-editor/index.d.ts +2 -2
  50. package/dist/components/contextmenu/contextmenu-item.js +13 -6
  51. package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
  52. package/dist/components/contextmenu/contextmenu-panel.js +12 -6
  53. package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
  54. package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
  55. package/dist/components/contextmenu/contextmenu.js.map +1 -1
  56. package/dist/components/contextmenu/di.d.ts +15 -0
  57. package/dist/components/contextmenu/index.d.ts +3 -2
  58. package/dist/components/contextmenu/style2.css +13 -0
  59. package/dist/components/date-panel/date-panel.js.map +1 -1
  60. package/dist/components/date-panel/headers/day.js.map +1 -1
  61. package/dist/components/date-panel/headers/month.js.map +1 -1
  62. package/dist/components/date-panel/headers/year.js.map +1 -1
  63. package/dist/components/date-panel/panels/day.js.map +1 -1
  64. package/dist/components/date-panel/panels/month.js.map +1 -1
  65. package/dist/components/date-panel/panels/year.js.map +1 -1
  66. package/dist/components/date-panel/style.d.ts +1 -1
  67. package/dist/components/date-picker/date-picker.js.map +1 -1
  68. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  69. package/dist/components/dialog/dialog.js.map +1 -1
  70. package/dist/components/dialog/style2.css +3 -1
  71. package/dist/components/drawer/drawer.js.map +1 -1
  72. package/dist/components/dropdown/dropdown.js.map +1 -1
  73. package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
  74. package/dist/components/dual-nav/dual-nav.js.map +1 -1
  75. package/dist/components/empty/empty.js.map +1 -1
  76. package/dist/components/empty/style.d.ts +1 -1
  77. package/dist/components/expression-editor/components/path-preview.js.map +1 -1
  78. package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
  79. package/dist/components/expression-editor/core/editor.js.map +1 -1
  80. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  81. package/dist/components/expression-editor/style.d.ts +1 -1
  82. package/dist/components/file-picker/file-picker.js.map +1 -1
  83. package/dist/components/file-picker/style.d.ts +1 -1
  84. package/dist/components/file-viewer/file-viewer.js.map +1 -1
  85. package/dist/components/file-viewer/helper.js +1 -38
  86. package/dist/components/file-viewer/helper.js.map +1 -1
  87. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
  88. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
  89. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
  90. package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
  91. package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
  92. package/dist/components/file-viewer/previewers/sheet-previewer.js +68 -37
  93. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
  94. package/dist/components/file-viewer/previewers/text-previewer.js +2 -2
  95. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
  96. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
  97. package/dist/components/file-viewer/style.d.ts +1 -1
  98. package/dist/components/float-button/float-button.js.map +1 -1
  99. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
  100. package/dist/components/form/style.d.ts +1 -1
  101. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  102. package/dist/components/form-item/style.d.ts +1 -1
  103. package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
  104. package/dist/components/gantt-chart/style.d.ts +1 -1
  105. package/dist/components/grid/grid-item.js.map +1 -1
  106. package/dist/components/grid/grid.js +3 -2
  107. package/dist/components/grid/grid.js.map +1 -1
  108. package/dist/components/grid/style.d.ts +1 -1
  109. package/dist/components/grid-input/grid-input.js.map +1 -1
  110. package/dist/components/grid-input/style.d.ts +1 -1
  111. package/dist/components/group-input/group-input.js.map +1 -1
  112. package/dist/components/group-nav/group-nav-item.js.map +1 -1
  113. package/dist/components/group-nav/group-nav.js.map +1 -1
  114. package/dist/components/group-nav/style.d.ts +1 -1
  115. package/dist/components/icon/icon.js.map +1 -1
  116. package/dist/components/icon/style.d.ts +1 -1
  117. package/dist/components/index.d.ts +91 -156
  118. package/dist/components/index.js +4 -1
  119. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  120. package/dist/components/kbd/kbd.js.map +1 -1
  121. package/dist/components/kbd/style.d.ts +1 -1
  122. package/dist/components/layout/layout-resizer.js.map +1 -1
  123. package/dist/components/layout/layout.js +22 -10
  124. package/dist/components/layout/layout.js.map +1 -1
  125. package/dist/components/layout/style.d.ts +1 -1
  126. package/dist/components/list/list-item.js.map +1 -1
  127. package/dist/components/list/list.js.map +1 -1
  128. package/dist/components/loading/directive.js +2 -1
  129. package/dist/components/loading/directive.js.map +1 -1
  130. package/dist/components/loading/index.d.ts +2 -2
  131. package/dist/components/loading/loading.js.map +1 -1
  132. package/dist/components/message/index.d.ts +2 -2
  133. package/dist/components/message/message-box.js.map +1 -1
  134. package/dist/components/message/message.js.map +1 -1
  135. package/dist/components/message/style.d.ts +1 -1
  136. package/dist/components/message-confirm/index.d.ts +2 -2
  137. package/dist/components/message-confirm/message-confirm-box.js.map +1 -1
  138. package/dist/components/message-confirm/message-confirm.js.map +1 -1
  139. package/dist/components/message-confirm/style.d.ts +1 -1
  140. package/dist/components/message-confirm/style2.css +18 -0
  141. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  142. package/dist/components/multi-select/multi-select.js +6 -3
  143. package/dist/components/multi-select/multi-select.js.map +1 -1
  144. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  145. package/dist/components/nav/nav-icon.js.map +1 -1
  146. package/dist/components/nav/nav-item-collapsed.js.map +1 -1
  147. package/dist/components/nav/nav-item.js +4 -2
  148. package/dist/components/nav/nav-item.js.map +1 -1
  149. package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
  150. package/dist/components/nav/nav-sub.js.map +1 -1
  151. package/dist/components/nav/nav.js.map +1 -1
  152. package/dist/components/nav/style.d.ts +1 -1
  153. package/dist/components/node-render/style.d.ts +1 -1
  154. package/dist/components/notification/index.d.ts +2 -2
  155. package/dist/components/notification/notification-box.js +2 -2
  156. package/dist/components/notification/notification-box.js.map +1 -1
  157. package/dist/components/notification/notification.js.map +1 -1
  158. package/dist/components/notification/style.d.ts +1 -1
  159. package/dist/components/number/number.js.map +1 -1
  160. package/dist/components/number/style.d.ts +1 -1
  161. package/dist/components/number-input/number-input.js +2 -1
  162. package/dist/components/number-input/number-input.js.map +1 -1
  163. package/dist/components/number-range-input/number-range-input.js.map +1 -1
  164. package/dist/components/paginator/paginator.js.map +1 -1
  165. package/dist/components/palette/palette-alpha.js.map +1 -1
  166. package/dist/components/palette/palette-color-switch.js.map +1 -1
  167. package/dist/components/palette/palette-hue.js.map +1 -1
  168. package/dist/components/palette/palette-sv.js.map +1 -1
  169. package/dist/components/palette/palette.js.map +1 -1
  170. package/dist/components/password-input/password-input.js.map +1 -1
  171. package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
  172. package/dist/components/progress/progress.js.map +1 -1
  173. package/dist/components/progress/style.d.ts +1 -1
  174. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  175. package/dist/components/progress-nodes/style.d.ts +1 -1
  176. package/dist/components/radio/radio.js.map +1 -1
  177. package/dist/components/radio-group/radio-group.js.map +1 -1
  178. package/dist/components/rich-text-editor/rich-text-editor.js +2 -1
  179. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  180. package/dist/components/rich-text-editor/style.d.ts +1 -1
  181. package/dist/components/rich-text-editor/toolbar.js +3 -4
  182. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  183. package/dist/components/scroll/scroll-bar.js.map +1 -1
  184. package/dist/components/scroll/scroll.js.map +1 -1
  185. package/dist/components/scroll/style.d.ts +1 -1
  186. package/dist/components/select/select.js.map +1 -1
  187. package/dist/components/slider/slider-thumb.js.map +1 -1
  188. package/dist/components/slider/slider.js.map +1 -1
  189. package/dist/components/slider/style.d.ts +1 -1
  190. package/dist/components/steps/steps.js.map +1 -1
  191. package/dist/components/steps/style.d.ts +1 -1
  192. package/dist/components/switch/style.d.ts +1 -1
  193. package/dist/components/switch/switch.js.map +1 -1
  194. package/dist/components/table/index.d.ts +2 -2
  195. package/dist/components/table/node/col.d.ts +1 -49
  196. package/dist/components/table/table-body.js.map +1 -1
  197. package/dist/components/table/table-cell.js.map +1 -1
  198. package/dist/components/table/table-foot.js.map +1 -1
  199. package/dist/components/table/table-row.js +2 -1
  200. package/dist/components/table/table-row.js.map +1 -1
  201. package/dist/components/table/table.js.map +1 -1
  202. package/dist/components/table/use-check.js +2 -1
  203. package/dist/components/table/use-check.js.map +1 -1
  204. package/dist/components/table/use-col-resize.js +9 -1
  205. package/dist/components/table/use-col-resize.js.map +1 -1
  206. package/dist/components/table/use-columns.d.ts +1 -1
  207. package/dist/components/table/use-rows.js +2 -1
  208. package/dist/components/table/use-rows.js.map +1 -1
  209. package/dist/components/table-editor/table-editor.js.map +1 -1
  210. package/dist/components/tabs/tabs-horizontal.js +2 -1
  211. package/dist/components/tabs/tabs-horizontal.js.map +1 -1
  212. package/dist/components/tabs/tabs-vertical.js.map +1 -1
  213. package/dist/components/tabs/tabs.js.map +1 -1
  214. package/dist/components/tabs/use-tabs-bar.js +10 -25
  215. package/dist/components/tabs/use-tabs-bar.js.map +1 -1
  216. package/dist/components/tag/style.d.ts +1 -1
  217. package/dist/components/tag/tag.js.map +1 -1
  218. package/dist/components/text/style.d.ts +1 -1
  219. package/dist/components/text/text.js.map +1 -1
  220. package/dist/components/textarea/textarea.js.map +1 -1
  221. package/dist/components/theme/theme.js +3 -2
  222. package/dist/components/theme/theme.js.map +1 -1
  223. package/dist/components/tip/style.d.ts +1 -1
  224. package/dist/components/tip/tip.js.map +1 -1
  225. package/dist/components/tree/tree-node.js.map +1 -1
  226. package/dist/components/tree/tree.js.map +1 -1
  227. package/dist/components/tree-select/tree-select.js.map +1 -1
  228. package/dist/components/watermark/style.d.ts +1 -1
  229. package/dist/components/watermark/watermark.js.map +1 -1
  230. package/dist/index.d.ts +92 -96
  231. package/dist/index.js +2 -1
  232. package/dist/node_modules/.bun/@codemirror_autocomplete@6.20.3/node_modules/@codemirror/autocomplete/dist/index.js +2 -2
  233. package/dist/node_modules/.bun/@codemirror_autocomplete@6.20.3/node_modules/@codemirror/autocomplete/dist/index.js.map +1 -1
  234. package/dist/node_modules/.bun/@codemirror_commands@6.10.4/node_modules/@codemirror/commands/dist/index.js +3 -3
  235. package/dist/node_modules/.bun/@codemirror_commands@6.10.4/node_modules/@codemirror/commands/dist/index.js.map +1 -1
  236. package/dist/node_modules/.bun/@codemirror_lang-css@6.3.1/node_modules/@codemirror/lang-css/dist/index.js.map +1 -1
  237. package/dist/node_modules/.bun/@codemirror_lang-html@6.4.11/node_modules/@codemirror/lang-html/dist/index.js +5 -4
  238. package/dist/node_modules/.bun/@codemirror_lang-html@6.4.11/node_modules/@codemirror/lang-html/dist/index.js.map +1 -1
  239. package/dist/node_modules/.bun/@codemirror_lang-javascript@6.2.5/node_modules/@codemirror/lang-javascript/dist/index.js +2 -2
  240. package/dist/node_modules/.bun/{@codemirror_lang-markdown@6.5.1 → @codemirror_lang-markdown@6.5.2}/node_modules/@codemirror/lang-markdown/dist/index.js +4 -3
  241. package/dist/node_modules/.bun/@codemirror_lang-markdown@6.5.2/node_modules/@codemirror/lang-markdown/dist/index.js.map +1 -0
  242. package/dist/node_modules/.bun/@codemirror_lang-sql@6.10.0/node_modules/@codemirror/lang-sql/dist/index.js +2 -1
  243. package/dist/node_modules/.bun/@codemirror_lang-sql@6.10.0/node_modules/@codemirror/lang-sql/dist/index.js.map +1 -1
  244. package/dist/node_modules/.bun/@codemirror_language@6.12.4/node_modules/@codemirror/language/dist/index.js +2 -2
  245. package/dist/node_modules/.bun/@codemirror_language@6.12.4/node_modules/@codemirror/language/dist/index.js.map +1 -1
  246. package/dist/node_modules/.bun/@codemirror_lint@6.9.7/node_modules/@codemirror/lint/dist/index.js +4 -3
  247. package/dist/node_modules/.bun/@codemirror_lint@6.9.7/node_modules/@codemirror/lint/dist/index.js.map +1 -1
  248. package/dist/node_modules/.bun/@codemirror_search@6.7.1/node_modules/@codemirror/search/dist/index.js +2 -2
  249. package/dist/node_modules/.bun/@codemirror_search@6.7.1/node_modules/@codemirror/search/dist/index.js.map +1 -1
  250. package/dist/node_modules/.bun/{@codemirror_state@6.7.0 → @codemirror_state@6.7.1}/node_modules/@codemirror/state/dist/index.js +13 -3
  251. package/dist/node_modules/.bun/@codemirror_state@6.7.1/node_modules/@codemirror/state/dist/index.js.map +1 -0
  252. package/dist/node_modules/.bun/@codemirror_theme-one-dark@6.1.3/node_modules/@codemirror/theme-one-dark/dist/index.js +1 -1
  253. package/dist/node_modules/.bun/@codemirror_theme-one-dark@6.1.3/node_modules/@codemirror/theme-one-dark/dist/index.js.map +1 -1
  254. package/dist/node_modules/.bun/{@codemirror_view@6.43.4 → @codemirror_view@6.43.8}/node_modules/@codemirror/view/dist/index.js +86 -64
  255. package/dist/node_modules/.bun/@codemirror_view@6.43.8/node_modules/@codemirror/view/dist/index.js.map +1 -0
  256. package/dist/node_modules/.bun/@lezer_common@1.5.2/node_modules/@lezer/common/dist/index.js.map +1 -1
  257. package/dist/node_modules/.bun/@lezer_css@1.3.4/node_modules/@lezer/css/dist/index.js.map +1 -1
  258. package/dist/node_modules/.bun/@lezer_highlight@1.2.3/node_modules/@lezer/highlight/dist/index.js.map +1 -1
  259. package/dist/node_modules/.bun/@lezer_html@1.3.13/node_modules/@lezer/html/dist/index.js.map +1 -1
  260. package/dist/node_modules/.bun/@lezer_javascript@1.5.4/node_modules/@lezer/javascript/dist/index.js.map +1 -1
  261. package/dist/node_modules/.bun/@lezer_lr@1.4.10/node_modules/@lezer/lr/dist/index.js.map +1 -1
  262. package/dist/node_modules/.bun/@lezer_markdown@1.7.2/node_modules/@lezer/markdown/dist/index.js +1 -1
  263. package/dist/node_modules/.bun/@lezer_markdown@1.7.2/node_modules/@lezer/markdown/dist/index.js.map +1 -1
  264. package/dist/node_modules/.bun/@marijn_find-cluster-break@1.0.2/node_modules/@marijn/find-cluster-break/src/index.js.map +1 -1
  265. package/dist/node_modules/.bun/style-mod@4.1.3/node_modules/style-mod/src/style-mod.js.map +1 -1
  266. package/dist/types/collapse.d.ts +7 -1
  267. package/dist/types/contextmenu.d.ts +10 -4
  268. package/dist/types/index.d.ts +1 -7
  269. package/dist/types/layout.d.ts +16 -1
  270. package/package.json +34 -30
  271. package/src/components/batch-edit/__test__/batch-edit.test.ts +199 -0
  272. package/src/components/batch-edit/batch-edit-form.vue +8 -8
  273. package/src/components/batch-edit/batch-edit.vue +2 -1
  274. package/src/components/batch-edit/di.ts +2 -0
  275. package/src/components/batch-edit/use-edit-state.ts +19 -12
  276. package/src/components/button/button.vue +2 -2
  277. package/src/components/button/style.scss +8 -29
  278. package/src/components/collapse/__test__/collapse.test.ts +59 -0
  279. package/src/components/collapse/collapse-item.vue +32 -11
  280. package/src/components/contextmenu/__test__/contextmenu.test.ts +165 -0
  281. package/src/components/contextmenu/contextmenu-item.vue +7 -4
  282. package/src/components/contextmenu/contextmenu-panel.vue +7 -4
  283. package/src/components/contextmenu/index.ts +1 -0
  284. package/src/components/contextmenu/style.scss +16 -0
  285. package/src/components/dialog/style.scss +5 -1
  286. package/src/components/file-viewer/helper.ts +0 -53
  287. package/src/components/file-viewer/previewers/sheet-previewer.vue +91 -46
  288. package/src/components/layout/layout.vue +19 -8
  289. package/src/components/message-confirm/style.scss +19 -0
  290. package/src/components/notification/style.scss +16 -4
  291. package/src/components/radio-group/style.scss +1 -1
  292. package/src/components/slider/style.scss +1 -1
  293. package/src/components/table/use-col-resize.ts +9 -1
  294. package/src/components/tabs/use-tabs-bar.ts +15 -20
  295. package/src/types/collapse.ts +8 -1
  296. package/src/types/contextmenu.ts +10 -4
  297. package/src/types/layout.ts +16 -1
  298. package/dist/components/action/action-group.vue.d.ts +0 -25
  299. package/dist/components/action/action.vue.d.ts +0 -33
  300. package/dist/components/action/index.d.ts +0 -3
  301. package/dist/components/auto-complete/auto-complete.vue.d.ts +0 -41
  302. package/dist/components/auto-complete/index.d.ts +0 -2
  303. package/dist/components/badge/badge.vue.d.ts +0 -20
  304. package/dist/components/badge/index.d.ts +0 -2
  305. package/dist/components/batch-edit/batch-edit.vue.d.ts +0 -45
  306. package/dist/components/breadcrumb/breadcrumb.vue.d.ts +0 -24
  307. package/dist/components/breadcrumb/index.d.ts +0 -2
  308. package/dist/components/button/button-group.vue.d.ts +0 -19
  309. package/dist/components/button/button.vue.d.ts +0 -27
  310. package/dist/components/button/index.d.ts +0 -3
  311. package/dist/components/calendar/calendar.vue.d.ts +0 -17
  312. package/dist/components/calendar/index.d.ts +0 -2
  313. package/dist/components/card/card-action.vue.d.ts +0 -18
  314. package/dist/components/card/card-content.vue.d.ts +0 -18
  315. package/dist/components/card/card-cover.vue.d.ts +0 -8
  316. package/dist/components/card/card-header.vue.d.ts +0 -16
  317. package/dist/components/card/card.vue.d.ts +0 -18
  318. package/dist/components/card/index.d.ts +0 -6
  319. package/dist/components/cascade/cascade.vue.d.ts +0 -31
  320. package/dist/components/cascade/index.d.ts +0 -2
  321. package/dist/components/check-tag/check-tag.vue.d.ts +0 -22
  322. package/dist/components/check-tag/index.d.ts +0 -2
  323. package/dist/components/checkbox/checkbox-button.vue.d.ts +0 -35
  324. package/dist/components/checkbox/checkbox.vue.d.ts +0 -34
  325. package/dist/components/checkbox/index.d.ts +0 -3
  326. package/dist/components/checkbox-group/checkbox-group.vue.d.ts +0 -24
  327. package/dist/components/checkbox-group/index.d.ts +0 -2
  328. package/dist/components/code-editor/code-editor.vue.d.ts +0 -30
  329. package/dist/components/code-editor/index.d.ts +0 -2
  330. package/dist/components/collapse/collapse-item.vue.d.ts +0 -32
  331. package/dist/components/collapse/collapse.vue.d.ts +0 -27
  332. package/dist/components/collapse/index.d.ts +0 -3
  333. package/dist/components/condition-editor/condition-editor.vue.d.ts +0 -15
  334. package/dist/components/contextmenu/contextmenu.vue.d.ts +0 -14
  335. package/dist/components/date-panel/date-panel.vue.d.ts +0 -17
  336. package/dist/components/date-panel/index.d.ts +0 -2
  337. package/dist/components/date-picker/date-picker.vue.d.ts +0 -18
  338. package/dist/components/date-picker/index.d.ts +0 -2
  339. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +0 -18
  340. package/dist/components/date-range-picker/index.d.ts +0 -2
  341. package/dist/components/dialog/dialog.vue.d.ts +0 -43
  342. package/dist/components/dialog/index.d.ts +0 -2
  343. package/dist/components/drawer/drawer.vue.d.ts +0 -36
  344. package/dist/components/drawer/index.d.ts +0 -2
  345. package/dist/components/dropdown/dropdown.vue.d.ts +0 -30
  346. package/dist/components/dropdown/index.d.ts +0 -2
  347. package/dist/components/dual-nav/dual-nav.vue.d.ts +0 -15
  348. package/dist/components/dual-nav/index.d.ts +0 -2
  349. package/dist/components/empty/empty.vue.d.ts +0 -11
  350. package/dist/components/empty/index.d.ts +0 -2
  351. package/dist/components/expression-editor/expression-editor.vue.d.ts +0 -16
  352. package/dist/components/expression-editor/index.d.ts +0 -2
  353. package/dist/components/file-picker/file-picker.vue.d.ts +0 -27
  354. package/dist/components/file-picker/index.d.ts +0 -2
  355. package/dist/components/file-viewer/file-viewer.vue.d.ts +0 -40
  356. package/dist/components/file-viewer/index.d.ts +0 -2
  357. package/dist/components/file-viewer/sheet-parser.js +0 -46
  358. package/dist/components/file-viewer/sheet-parser.js.map +0 -1
  359. package/dist/components/float-button/float-button.vue.d.ts +0 -12
  360. package/dist/components/float-button/index.d.ts +0 -2
  361. package/dist/components/form/form.vue.d.ts +0 -23
  362. package/dist/components/form/index.d.ts +0 -2
  363. package/dist/components/form-item/form-item.vue.d.ts +0 -21
  364. package/dist/components/form-item/index.d.ts +0 -2
  365. package/dist/components/gantt-chart/gantt-chart.vue.d.ts +0 -8
  366. package/dist/components/gantt-chart/index.d.ts +0 -2
  367. package/dist/components/grid/grid-item.vue.d.ts +0 -20
  368. package/dist/components/grid/grid.vue.d.ts +0 -27
  369. package/dist/components/grid/index.d.ts +0 -3
  370. package/dist/components/grid-input/grid-input.vue.d.ts +0 -19
  371. package/dist/components/grid-input/index.d.ts +0 -2
  372. package/dist/components/group-input/group-input.vue.d.ts +0 -26
  373. package/dist/components/group-input/index.d.ts +0 -2
  374. package/dist/components/group-nav/group-nav.vue.d.ts +0 -12
  375. package/dist/components/group-nav/index.d.ts +0 -2
  376. package/dist/components/icon/icon.vue.d.ts +0 -18
  377. package/dist/components/icon/index.d.ts +0 -2
  378. package/dist/components/input/index.d.ts +0 -2
  379. package/dist/components/input/input.vue.d.ts +0 -50
  380. package/dist/components/kbd/kbd.vue.d.ts +0 -16
  381. package/dist/components/layout/index.d.ts +0 -2
  382. package/dist/components/layout/layout.vue.d.ts +0 -20
  383. package/dist/components/list/index.d.ts +0 -3
  384. package/dist/components/list/list-item.vue.d.ts +0 -16
  385. package/dist/components/list/list.vue.d.ts +0 -21
  386. package/dist/components/loading/loading.vue.d.ts +0 -11
  387. package/dist/components/message/message.vue.d.ts +0 -16
  388. package/dist/components/message-confirm/message-confirm.vue.d.ts +0 -19
  389. package/dist/components/multi-select/index.d.ts +0 -2
  390. package/dist/components/multi-select/multi-select.vue.d.ts +0 -48
  391. package/dist/components/multi-tree-select/index.d.ts +0 -2
  392. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +0 -44
  393. package/dist/components/nav/index.d.ts +0 -4
  394. package/dist/components/nav/nav-item.vue.d.ts +0 -12
  395. package/dist/components/nav/nav-sub.vue.d.ts +0 -13
  396. package/dist/components/nav/nav.vue.d.ts +0 -19
  397. package/dist/components/notification/notification.vue.d.ts +0 -18
  398. package/dist/components/number/index.d.ts +0 -2
  399. package/dist/components/number/number.vue.d.ts +0 -11
  400. package/dist/components/number-input/index.d.ts +0 -2
  401. package/dist/components/number-input/number-input.vue.d.ts +0 -39
  402. package/dist/components/number-range-input/index.d.ts +0 -2
  403. package/dist/components/number-range-input/number-range-input.vue.d.ts +0 -36
  404. package/dist/components/paginator/index.d.ts +0 -2
  405. package/dist/components/paginator/paginator.vue.d.ts +0 -29
  406. package/dist/components/palette/index.d.ts +0 -2
  407. package/dist/components/palette/palette.vue.d.ts +0 -20
  408. package/dist/components/password-input/index.d.ts +0 -2
  409. package/dist/components/password-input/password-input.vue.d.ts +0 -30
  410. package/dist/components/pop-confirm/index.d.ts +0 -2
  411. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +0 -33
  412. package/dist/components/progress/index.d.ts +0 -2
  413. package/dist/components/progress/progress.vue.d.ts +0 -25
  414. package/dist/components/progress-nodes/index.d.ts +0 -2
  415. package/dist/components/progress-nodes/progress-nodes.vue.d.ts +0 -36
  416. package/dist/components/radio/index.d.ts +0 -2
  417. package/dist/components/radio/radio.vue.d.ts +0 -31
  418. package/dist/components/radio-group/index.d.ts +0 -2
  419. package/dist/components/radio-group/radio-group.vue.d.ts +0 -26
  420. package/dist/components/rich-text-editor/index.d.ts +0 -2
  421. package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +0 -23
  422. package/dist/components/scroll/index.d.ts +0 -2
  423. package/dist/components/scroll/scroll.vue.d.ts +0 -28
  424. package/dist/components/select/index.d.ts +0 -2
  425. package/dist/components/select/select.vue.d.ts +0 -38
  426. package/dist/components/slider/index.d.ts +0 -2
  427. package/dist/components/slider/slider.vue.d.ts +0 -21
  428. package/dist/components/steps/index.d.ts +0 -2
  429. package/dist/components/steps/steps.vue.d.ts +0 -29
  430. package/dist/components/switch/index.d.ts +0 -2
  431. package/dist/components/switch/switch.vue.d.ts +0 -24
  432. package/dist/components/table/node/row.d.ts +0 -49
  433. package/dist/components/table/table.vue.d.ts +0 -54
  434. package/dist/components/table-editor/index.d.ts +0 -2
  435. package/dist/components/table-editor/table-editor.vue.d.ts +0 -12
  436. package/dist/components/tabs/index.d.ts +0 -4
  437. package/dist/components/tabs/tabs-horizontal.vue.d.ts +0 -40
  438. package/dist/components/tabs/tabs-vertical.vue.d.ts +0 -39
  439. package/dist/components/tabs/tabs.vue.d.ts +0 -36
  440. package/dist/components/tag/index.d.ts +0 -2
  441. package/dist/components/tag/tag.vue.d.ts +0 -22
  442. package/dist/components/text/index.d.ts +0 -2
  443. package/dist/components/text/text.vue.d.ts +0 -10
  444. package/dist/components/textarea/index.d.ts +0 -2
  445. package/dist/components/textarea/textarea.vue.d.ts +0 -34
  446. package/dist/components/theme/index.d.ts +0 -2
  447. package/dist/components/theme/theme.vue.d.ts +0 -8
  448. package/dist/components/tip/index.d.ts +0 -2
  449. package/dist/components/tip/tip.vue.d.ts +0 -31
  450. package/dist/components/tree/di.d.ts +0 -12
  451. package/dist/components/tree/index.d.ts +0 -2
  452. package/dist/components/tree/tree.vue.d.ts +0 -40
  453. package/dist/components/tree-select/index.d.ts +0 -2
  454. package/dist/components/tree-select/tree-select.vue.d.ts +0 -48
  455. package/dist/components/watermark/index.d.ts +0 -2
  456. package/dist/components/watermark/watermark.vue.d.ts +0 -21
  457. package/dist/node_modules/.bun/@codemirror_lang-markdown@6.5.1/node_modules/@codemirror/lang-markdown/dist/index.js.map +0 -1
  458. package/dist/node_modules/.bun/@codemirror_state@6.7.0/node_modules/@codemirror/state/dist/index.js.map +0 -1
  459. package/dist/node_modules/.bun/@codemirror_view@6.43.4/node_modules/@codemirror/view/dist/index.js.map +0 -1
  460. package/src/components/file-viewer/sheet-parser.ts +0 -52
@@ -1 +1 @@
1
- {"version":3,"file":"table-row.js","names":[],"sources":["../../../src/components/table/table-row.tsx"],"sourcesContent":["import { ArrowRight } from '@veltra/icons/normal'\nimport { defineComponent, type DefineComponent } from 'vue'\nimport { inject, onUnmounted } from 'vue'\nimport type { JSX } from 'vue/jsx-runtime'\n\nimport type { TableRow as ITableRow } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { TableDIKey } from './di'\nimport UTabelCell from './table-cell.vue'\n\n/**\n * A3:行修饰类组合静态查找表。\n *\n * 位模式:bit2 = isCurrent, bit1 = checked, bit0 = expanded。\n * 与 `bem.is('...')` 对于 `'current' | 'checked' | 'expanded'` 的输出完全等价,\n * 直接从 index 读字符串,消除每行渲染期间的字符串拼接和 3 次 bem.is 调用。\n *\n * 放在模块顶层使所有 TableRow 实例共享一份引用(不会随 setup 重建)。\n */\nconst ROW_MOD_CLASS: readonly string[] = [\n '',\n 'is-expanded',\n 'is-checked',\n 'is-checked is-expanded',\n 'is-current',\n 'is-current is-expanded',\n 'is-current is-checked',\n 'is-current is-checked is-expanded'\n] as const\n\nfunction rowModCls(row: ITableRow): string {\n const i = (row.isCurrent ? 4 : 0) | (row.checked ? 2 : 0) | (row.expanded ? 1 : 0)\n return ROW_MOD_CLASS[i]!\n}\n\nexport const UTableRow: DefineComponent<{ row: ITableRow; index: number }> = defineComponent({\n name: 'TableRow',\n\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n\n setup(props) {\n const {\n cls,\n columnConfig,\n getColumnSlotsNode,\n toggleTreeRowExpand,\n getCellCtx,\n handleRowClick,\n handleCellClick,\n tableProps,\n measureElement,\n getCellClass\n } = inject(TableDIKey)!\n\n // A1:把 cls.e('row') / cls.e('expand-toggle') 等静态字符串提升到 setup 一次性计算,\n // 避免每次 render 重新走 `cls.e` 拼接。\n const rowBaseCls = cls.e('row')\n const expandToggleCls = cls.e('expand-toggle')\n const expandSpaceCls = cls.e('expand-space')\n\n // A2:measureRef 按 index 缓存闭包。\n // 行虚拟化下,同一 TableRow 实例的 props.index 大多稳定,但在虚拟化重排或展开行切换时\n // 仍会发生变化;把 (index) → refFn 缓存起来,既保证引用稳定(利于 Vue 的 ref diff),\n // 又避免在未来可能的\"同实例跨 index 复用\"情形下重复分配闭包。\n const measureRefCache = new Map<number, (el: unknown) => void>()\n const getMeasureRef = (index: number): ((el: unknown) => void) => {\n let ref = measureRefCache.get(index)\n if (ref === undefined) {\n ref = (el: unknown) => {\n measureElement(index, el as Element | null)\n }\n measureRefCache.set(index, ref)\n }\n return ref\n }\n onUnmounted(() => {\n measureRefCache.clear()\n })\n\n const { columns, expandColumn } = columnConfig\n\n return () => {\n const { row } = props\n const _expandColumn = expandColumn.value\n\n let expandCell: JSX.Element | null = null\n if (_expandColumn) {\n const expandCtx = getCellCtx(row, _expandColumn)\n const cellSpan = tableProps.mergeCell?.(expandCtx)\n\n if (!cellSpan || (cellSpan.colspan && cellSpan.rowspan)) {\n const marginLeft = tableProps.tree ? row.depth * 14 : 0\n expandCell = (\n <UTabelCell\n cellClass={getCellClass(_expandColumn)}\n left={_expandColumn.style.left}\n right={_expandColumn.style.right}\n key={row.uid + _expandColumn.key}\n {...tableProps.mergeCell?.(expandCtx)}\n >\n {!row.isLeaf || (tableProps.expandable && !row.isExpandRow) ? (\n <UButton\n text\n class={expandToggleCls}\n type='primary'\n size='small'\n circle\n onClick={(e) => {\n e.stopPropagation()\n toggleTreeRowExpand(row)\n }}\n style={`margin-left: ${marginLeft}px`}\n >\n <UIcon>\n <ArrowRight />\n </UIcon>\n </UButton>\n ) : (\n <i class={expandSpaceCls} style={`margin-left: ${marginLeft}px`}></i>\n )}\n\n {getColumnSlotsNode(expandCtx)}\n </UTabelCell>\n )\n }\n }\n\n // A3:行 class 由 base + 3-bit 组合查找产出,避免 Vue 的 class 数组归一化开销。\n const mod = rowModCls(row)\n const rowCls = mod ? rowBaseCls + ' ' + mod : rowBaseCls\n\n return (\n <tr\n class={rowCls}\n onClick={(e) => handleRowClick(row, e)}\n ref={getMeasureRef(props.index)}\n key={row.uid}\n >\n {expandCell}\n\n {columns.value.map((column) => {\n const cellCtx = getCellCtx(row, column)\n const cellSpan = tableProps.mergeCell?.(cellCtx)\n if (cellSpan && (!cellSpan.colspan || !cellSpan.rowspan)) {\n return null\n }\n\n const cellNode = getColumnSlotsNode(cellCtx)\n\n return (\n <UTabelCell\n cellClass={getCellClass(column)}\n left={column.style.left}\n right={column.style.right}\n key={row.uid + column.key}\n // @ts-ignore\n onClick={(e) => handleCellClick(row, column, e)}\n {...cellSpan}\n >\n {cellNode}\n </UTabelCell>\n )\n })}\n </tr>\n )\n }\n }\n})\n\nexport const UExpandTableRow = defineComponent({\n name: 'ExpandTableRow',\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n setup(props) {\n const { getExpandRowSlotsNode, cls, measureElement, columnConfig } = inject(TableDIKey)!\n const { leafColumns } = columnConfig\n\n const rowBaseCls = cls.e('row')\n const cellCls = cls.e('cell')\n\n const measureRef = (el: unknown) => {\n measureElement(props.index, el as Element | null)\n }\n\n return () => {\n const { row } = props\n const node = getExpandRowSlotsNode({\n row,\n index: row.index,\n columns: leafColumns.value,\n rowData: row.data\n })\n return (\n <tr class={rowBaseCls} ref={measureRef}>\n <td colspan={leafColumns.value.length} class={cellCls}>\n {node}\n </td>\n </tr>\n )\n }\n }\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"table-row.js","names":[],"sources":["../../../src/components/table/table-row.tsx"],"sourcesContent":["import { ArrowRight } from '@veltra/icons/normal'\nimport { defineComponent, type DefineComponent } from 'vue'\nimport { inject, onUnmounted } from 'vue'\nimport type { JSX } from 'vue/jsx-runtime'\n\nimport type { TableRow as ITableRow } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { TableDIKey } from './di'\nimport UTabelCell from './table-cell.vue'\n\n/**\n * A3:行修饰类组合静态查找表。\n *\n * 位模式:bit2 = isCurrent, bit1 = checked, bit0 = expanded。\n * 与 `bem.is('...')` 对于 `'current' | 'checked' | 'expanded'` 的输出完全等价,\n * 直接从 index 读字符串,消除每行渲染期间的字符串拼接和 3 次 bem.is 调用。\n *\n * 放在模块顶层使所有 TableRow 实例共享一份引用(不会随 setup 重建)。\n */\nconst ROW_MOD_CLASS: readonly string[] = [\n '',\n 'is-expanded',\n 'is-checked',\n 'is-checked is-expanded',\n 'is-current',\n 'is-current is-expanded',\n 'is-current is-checked',\n 'is-current is-checked is-expanded'\n] as const\n\nfunction rowModCls(row: ITableRow): string {\n const i = (row.isCurrent ? 4 : 0) | (row.checked ? 2 : 0) | (row.expanded ? 1 : 0)\n return ROW_MOD_CLASS[i]!\n}\n\nexport const UTableRow: DefineComponent<{ row: ITableRow; index: number }> = defineComponent({\n name: 'TableRow',\n\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n\n setup(props) {\n const {\n cls,\n columnConfig,\n getColumnSlotsNode,\n toggleTreeRowExpand,\n getCellCtx,\n handleRowClick,\n handleCellClick,\n tableProps,\n measureElement,\n getCellClass\n } = inject(TableDIKey)!\n\n // A1:把 cls.e('row') / cls.e('expand-toggle') 等静态字符串提升到 setup 一次性计算,\n // 避免每次 render 重新走 `cls.e` 拼接。\n const rowBaseCls = cls.e('row')\n const expandToggleCls = cls.e('expand-toggle')\n const expandSpaceCls = cls.e('expand-space')\n\n // A2:measureRef 按 index 缓存闭包。\n // 行虚拟化下,同一 TableRow 实例的 props.index 大多稳定,但在虚拟化重排或展开行切换时\n // 仍会发生变化;把 (index) → refFn 缓存起来,既保证引用稳定(利于 Vue 的 ref diff),\n // 又避免在未来可能的\"同实例跨 index 复用\"情形下重复分配闭包。\n const measureRefCache = new Map<number, (el: unknown) => void>()\n const getMeasureRef = (index: number): ((el: unknown) => void) => {\n let ref = measureRefCache.get(index)\n if (ref === undefined) {\n ref = (el: unknown) => {\n measureElement(index, el as Element | null)\n }\n measureRefCache.set(index, ref)\n }\n return ref\n }\n onUnmounted(() => {\n measureRefCache.clear()\n })\n\n const { columns, expandColumn } = columnConfig\n\n return () => {\n const { row } = props\n const _expandColumn = expandColumn.value\n\n let expandCell: JSX.Element | null = null\n if (_expandColumn) {\n const expandCtx = getCellCtx(row, _expandColumn)\n const cellSpan = tableProps.mergeCell?.(expandCtx)\n\n if (!cellSpan || (cellSpan.colspan && cellSpan.rowspan)) {\n const marginLeft = tableProps.tree ? row.depth * 14 : 0\n expandCell = (\n <UTabelCell\n cellClass={getCellClass(_expandColumn)}\n left={_expandColumn.style.left}\n right={_expandColumn.style.right}\n key={row.uid + _expandColumn.key}\n {...tableProps.mergeCell?.(expandCtx)}\n >\n {!row.isLeaf || (tableProps.expandable && !row.isExpandRow) ? (\n <UButton\n text\n class={expandToggleCls}\n type='primary'\n size='small'\n circle\n onClick={(e) => {\n e.stopPropagation()\n toggleTreeRowExpand(row)\n }}\n style={`margin-left: ${marginLeft}px`}\n >\n <UIcon>\n <ArrowRight />\n </UIcon>\n </UButton>\n ) : (\n <i class={expandSpaceCls} style={`margin-left: ${marginLeft}px`}></i>\n )}\n\n {getColumnSlotsNode(expandCtx)}\n </UTabelCell>\n )\n }\n }\n\n // A3:行 class 由 base + 3-bit 组合查找产出,避免 Vue 的 class 数组归一化开销。\n const mod = rowModCls(row)\n const rowCls = mod ? rowBaseCls + ' ' + mod : rowBaseCls\n\n return (\n <tr\n class={rowCls}\n onClick={(e) => handleRowClick(row, e)}\n ref={getMeasureRef(props.index)}\n key={row.uid}\n >\n {expandCell}\n\n {columns.value.map((column) => {\n const cellCtx = getCellCtx(row, column)\n const cellSpan = tableProps.mergeCell?.(cellCtx)\n if (cellSpan && (!cellSpan.colspan || !cellSpan.rowspan)) {\n return null\n }\n\n const cellNode = getColumnSlotsNode(cellCtx)\n\n return (\n <UTabelCell\n cellClass={getCellClass(column)}\n left={column.style.left}\n right={column.style.right}\n key={row.uid + column.key}\n // @ts-ignore\n onClick={(e) => handleCellClick(row, column, e)}\n {...cellSpan}\n >\n {cellNode}\n </UTabelCell>\n )\n })}\n </tr>\n )\n }\n }\n})\n\nexport const UExpandTableRow = defineComponent({\n name: 'ExpandTableRow',\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n setup(props) {\n const { getExpandRowSlotsNode, cls, measureElement, columnConfig } = inject(TableDIKey)!\n const { leafColumns } = columnConfig\n\n const rowBaseCls = cls.e('row')\n const cellCls = cls.e('cell')\n\n const measureRef = (el: unknown) => {\n measureElement(props.index, el as Element | null)\n }\n\n return () => {\n const { row } = props\n const node = getExpandRowSlotsNode({\n row,\n index: row.index,\n columns: leafColumns.value,\n rowData: row.data\n })\n return (\n <tr class={rowBaseCls} ref={measureRef}>\n <td colspan={leafColumns.value.length} class={cellCls}>\n {node}\n </td>\n </tr>\n )\n }\n }\n})\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"table.js","names":[],"sources":["../../../src/components/table/table.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"[\n cls.b,\n cls.m(size),\n bem.is('border', border),\n bem.is('all-expanded', allExpanded),\n bem.is('text-ellipsis', textEllipsis)\n ]\"\n ref=\"scrollRef\"\n :content-class=\"cls.e('content')\"\n @scroll=\"handleScroll\"\n >\n <table :class=\"cls.e('wrap')\">\n <colgroup ref=\"colgroupRef\">\n <col\n v-for=\"column of leafColumns\"\n :key=\"column.key\"\n :class=\"column.fixed\"\n :style=\"{\n width: withUnit(column.width, 'px'),\n minWidth: withUnit(column.minWidth, 'px')\n }\"\n />\n </colgroup>\n <UTableHead />\n\n <!--\n 虚拟滚动上占位:替代 tbody transform,避免 table-layout: fixed 下列宽抖动。\n 高度由 useVirtualizer 命令式写入 `style.height`,不经过模板响应式绑定,\n 因此滚动窗口变化不会引起表格模板重渲染。\n -->\n <tbody v-if=\"virtualEnabled\" aria-hidden=\"true\">\n <tr ref=\"beforeSpacerRef\">\n <td :colspan=\"leafColumns.length\" style=\"padding: 0; border: none\"></td>\n </tr>\n </tbody>\n\n <u-table-body>\n <slot name=\"body\" :columns=\"leafColumns\" :rows=\"rows\" />\n\n <template #empty v-if=\"slots.empty\">\n <slot name=\"empty\" />\n </template>\n </u-table-body>\n\n <!-- 虚拟滚动下占位(高度由 useVirtualizer 命令式写入) -->\n <tbody v-if=\"virtualEnabled\" aria-hidden=\"true\">\n <tr ref=\"afterSpacerRef\">\n <td :colspan=\"leafColumns.length\" style=\"padding: 0; border: none\"></td>\n </tr>\n </tbody>\n\n <u-table-foot ref=\"tableFoot\">\n <slot name=\"foot\" :columns=\"leafColumns\" :rows=\"rows\" />\n </u-table-foot>\n </table>\n\n <slot name=\"append\" />\n\n <div v-if=\"showResizeLine\" :class=\"cls.e('resize-line')\" ref=\"resizeLineRef\"></div>\n\n <!-- <u-tip v-if=\"textEllipsis\" ref=\"tip\"> </u-tip> -->\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { computed, provide, shallowRef, toRef, useTemplateRef, watch } from 'vue'\n\nimport type {\n TableProps,\n TableEmits,\n _TableExposed,\n TableColumnSlotsScope,\n ComponentSize,\n ScrollExposed,\n TableRowSlotsScope\n} from '../../types'\nimport { UScroll } from '../scroll'\nimport { TableDIKey } from './di'\nimport type { ColumnNode } from './node/col'\nimport type { TableRowNode } from './node/row'\nimport UTableBody from './table-body.vue'\nimport UTableFoot from './table-foot.vue'\n// import { UTip } from '../tip'\nimport UTableHead from './table-head'\nimport { useCheck } from './use-check'\nimport { useColResize } from './use-col-resize'\nimport { useColumns } from './use-columns'\nimport { useFixedColumns } from './use-fixed-columns'\nimport { useRows } from './use-rows'\nimport { useTable } from './use-table'\n\ndefineOptions({ name: 'UTable' })\n\nconst props = withDefaults(defineProps<TableProps>(), {\n tree: false,\n stripe: true,\n textOverflow: 'line-break',\n virtualThreshold: 80\n})\nconst emit = defineEmits<TableEmits>()\n\nconst slots = defineSlots<{\n [key: `column:${string}`]: (props: TableColumnSlotsScope) => any\n [key: `header:${string}`]: (props: { column: ColumnNode }) => any\n 'row:expand'?: (props: TableRowSlotsScope) => any\n foot?: (props: { columns: ColumnNode[]; rows: TableRowNode[] }) => any\n body?: (props: { columns: ColumnNode[]; rows: TableRowNode[] }) => any\n empty?: () => any\n append?: () => any\n}>()\n\nconst cls = bem('table')\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\n// 占位 tr 的 DOM 句柄;交给 useVirtualizer 直接命令式写 style.height。\nconst beforeSpacerRef = useTemplateRef<HTMLElement>('beforeSpacerRef')\nconst afterSpacerRef = useTemplateRef<HTMLElement>('afterSpacerRef')\n\n// 行(useRows / useFixedColumns 需要 isScrolling,而虚拟化 hook 又依赖 rows.length;\n// 先用中继占位,下方 isScrolling 到位后 watch 回灌)。\nconst isScrollingRelay = shallowRef(false)\n\nconst {\n rows,\n toggleTreeRowExpand,\n allExpanded,\n toggleAllTreeRowExpand,\n rowForest,\n handleRowClick,\n handleCellClick,\n getRowByData\n} = useRows({ props, emit, isScrolling: isScrollingRelay })\n\nconst { createCheckColumn, createSelectColumn, clearChecked, clearSelected, checkedRows } =\n useCheck({ size, props, rows, rowForest, emit, cls })\n\nconst columnConfig = useColumns({\n props,\n createCheckColumn,\n createSelectColumn,\n toggleAllTreeRowExpand,\n cls\n})\n\nconst { leafColumns } = columnConfig\n\nconst { handleScroll, leftFixed, rightFixed } = useFixedColumns()\n\nconst {\n getColumnSlotsNode,\n getExpandRowSlotsNode,\n getHeaderSlotsNode,\n getCellClass,\n getCellCtx,\n getHeaderCellClass\n} = useTable({ props, cls, leftFixed, rightFixed })\n\nconst { showResizeLine, resizeLineRef, colgroupRef } = useColResize({ scrollRef, leafColumns })\n\nconst { virtualizer, items, isScrolling } = useVirtualizer({\n count: computed(() => rows.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n beforeEl: beforeSpacerRef,\n afterEl: afterSpacerRef,\n estimateSize: () => 41,\n // 注意:getItemKey 在构造期一次性写入底层 Virtualizer;闭包每次读的是当前 rows.value,\n // rows 引用整体替换后 key 仍有效(无需再 setOptions)。\n getItemKey: (i) => rows.value[i]?.uid ?? i\n})\n\nconst virtualEnabled = computed(() => {\n const t = props.virtualThreshold\n return t ? rows.value.length > t : true\n})\n\n// 把虚拟化 isScrolling 回灌到中继,供 useRows / useFixedColumns 读取。\nwatch(isScrolling, (v) => {\n isScrollingRelay.value = v\n})\n\n/**\n * E1:数据替换时的条件置顶。\n *\n * 旧实现无差别地 `scrollTo({ y: 0 })`,在「行内增删 / 排序 / 单行更新」等\n * 场景会把用户当前阅读位置跳走;仅在「翻页 / 显著数据集替换」时才需要复位。\n *\n * 判定阈值:|Δlen| / max(newLen, oldLen) ≥ 0.5,即行数变化量超过更大侧的一半时视为显著变化。\n * 选择 0.5 是因为典型的分页/搜索场景会带来 50% 以上的行数差(通常完全替换数据集),\n * 而行内追加 / 删除个位数通常只带来 <5% 的变化;两者区分度足够宽。\n */\nconst LENGTH_DELTA_RATIO_TO_RESET_SCROLL = 0.5\n\nwatch(\n () => props.data,\n (next, prev) => {\n const nextLen = next?.length ?? 0\n const prevLen = prev?.length ?? 0\n const denom = Math.max(nextLen, prevLen, 1)\n const ratio = Math.abs(nextLen - prevLen) / denom\n if (ratio >= LENGTH_DELTA_RATIO_TO_RESET_SCROLL) {\n scrollRef.value?.scrollTo({ y: 0 })\n }\n }\n)\n\n// const tipRef = useTemplateRef('tip')\n\nprovide(TableDIKey, {\n tableProps: props,\n tableSlots: slots,\n cls,\n rows,\n checkedRows,\n columnConfig,\n handleRowClick,\n handleCellClick,\n getColumnSlotsNode,\n getExpandRowSlotsNode,\n getHeaderSlotsNode,\n getCellClass,\n getCellCtx,\n getHeaderCellClass,\n // tipRef,\n toggleTreeRowExpand,\n virtualList: items,\n virtualEnabled,\n measureElement: (index, el) => virtualizer.measureElement(index, el)\n})\n\nconst tableFootRef = useTemplateRef('tableFoot')\n\ndefineExpose<_TableExposed>({\n el: toRef(() => scrollRef.value?.el),\n clearChecked,\n clearSelected,\n getRowByData,\n getSummaryRow: () => tableFootRef.value!.getSummaryRow()\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAqMA,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EApG3C,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAA;EAUd,MAAM,MAAM,IAAI,OAAO;EAEvB,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,YAAY,WAA0B;EAG5C,MAAM,kBAAkB,eAA4B,iBAAiB;EACrE,MAAM,iBAAiB,eAA4B,gBAAgB;EAInE,MAAM,mBAAmB,WAAW,KAAK;EAEzC,MAAM,EACJ,MACA,qBACA,aACA,wBACA,WACA,gBACA,iBACA,iBACE,QAAQ;GAAE;GAAO;GAAM,aAAa;EAAiB,CAAC;EAE1D,MAAM,EAAE,mBAAmB,oBAAoB,cAAc,eAAe,gBAC1E,SAAS;GAAE;GAAM;GAAO;GAAM;GAAW;GAAM;EAAI,CAAC;EAEtD,MAAM,eAAe,WAAW;GAC9B;GACA;GACA;GACA;GACA;EACF,CAAC;EAED,MAAM,EAAE,gBAAgB;EAExB,MAAM,EAAE,cAAc,WAAW,eAAe,gBAAgB;EAEhE,MAAM,EACJ,oBACA,uBACA,oBACA,cACA,YACA,uBACE,SAAS;GAAE;GAAO;GAAK;GAAW;EAAW,CAAC;EAElD,MAAM,EAAE,gBAAgB,eAAe,gBAAgB,aAAa;GAAE;GAAW;EAAY,CAAC;EAE9F,MAAM,EAAE,aAAa,OAAO,gBAAgB,eAAe;GACzD,OAAO,eAAe,KAAK,MAAM,MAAM;GACvC,gBAAgB,UAAU,OAAO,gBAAgB;GACjD,UAAU;GACV,SAAS;GACT,oBAAoB;GAGpB,aAAa,MAAM,KAAK,MAAM,EAAE,EAAE,OAAO;EAC3C,CAAC;EAED,MAAM,iBAAiB,eAAe;GACpC,MAAM,IAAI,MAAM;GAChB,OAAO,IAAI,KAAK,MAAM,SAAS,IAAI;EACrC,CAAC;EAGD,MAAM,cAAc,MAAM;GACxB,iBAAiB,QAAQ;EAC3B,CAAC;;;;;;;;;;;EAcD,YACQ,MAAM,OACX,MAAM,SAAS;GACd,MAAM,UAAU,MAAM,UAAU;GAChC,MAAM,UAAU,MAAM,UAAU;GAChC,MAAM,QAAQ,KAAK,IAAI,SAAS,SAAS,CAAC;GAE1C,IADc,KAAK,IAAI,UAAU,OAAO,IAAI,SAC/B,oCACX,UAAU,OAAO,SAAS,EAAE,GAAG,EAAE,CAAC;EAEtC,CACF;EAIA,QAAQ,YAAY;GAClB,YAAY;GACZ,YAAY;GACZ;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GAEA;GACA,aAAa;GACb;GACA,iBAAiB,OAAO,OAAO,YAAY,eAAe,OAAO,EAAE;EACrE,CAAC;EAED,MAAM,eAAe,eAAe,WAAW;EAE/C,SAA4B;GAC1B,IAAI,YAAY,UAAU,OAAO,EAAE;GACnC;GACA;GACA;GACA,qBAAqB,aAAa,MAAO,cAAc;EACzD,CAAC;;uBAnPC,YA8DW,MAAA,WAAA,GAAA;IA7DR,OAAK,eAAA;KAAU,MAAA,GAAA,CAAG,CAAC;KAAS,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI;KAAS,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,QAAA,MAAM;KAAS,MAAA,GAAA,CAAG,CAAC,GAAE,gBAAiB,MAAA,WAAA,CAAW;KAAS,MAAA,GAAA,CAAG,CAAC,GAAE,iBAAkB,QAAA,YAAY;;aAO3J;IAAJ,KAAI;IACH,iBAAe,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA;IACpB,UAAQ,MAAA,YAAA;;2BA6CD;KA3CR,mBA2CQ,SAAA,EA3CA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAAA;MAClB,mBAUW,YAAA;gBAVG;OAAJ,KAAI;4BACZ,mBAQE,UAAA,MAAA,WAPiB,MAAA,WAAA,IAAV,WAAM;2BADf,mBAQE,OAAA;QANC,KAAK,OAAO;QACZ,OAAK,eAAE,OAAO,KAAK;QACnB,OAAK,eAAA;gBAAuB,MAAA,QAAA,CAAQ,CAAC,OAAO,OAAK,IAAA;mBAA+B,MAAA,QAAA,CAAQ,CAAC,OAAO,UAAQ,IAAA;;;;MAM7G,YAAc,MAAA,SAAA,CAAA;MAEd,mBAAA,uKAAA;MAKa,eAAA,SAAA,UAAA,GAAb,mBAIQ,SAJR,YAIQ,CAHN,mBAEK,MAAA;gBAFG;OAAJ,KAAI;UACN,mBAAwE,MAAA;OAAnE,SAAS,MAAA,WAAA,CAAW,CAAC;OAAQ,OAAA;QAAA,WAAA;QAAA,UAAA;OAAA;;MAItC,YAMe,aAAA,MAAA,YAAA;8BAL2C,CAAxD,WAAwD,KAAA,QAAA,QAAA;QAArC,SAAS,MAAA,WAAA;QAAc,MAAM,MAAA,IAAA;;;UAEzB,MAAM,QAAA;aAAlB;yBACY,CAArB,WAAqB,KAAA,QAAA,OAAA,CAAA,CAAA;;;MAIzB,mBAAA,qCAAA;MACa,eAAA,SAAA,UAAA,GAAb,mBAIQ,SAJR,YAIQ,CAHN,mBAEK,MAAA;gBAFG;OAAJ,KAAI;UACN,mBAAwE,MAAA;OAAnE,SAAS,MAAA,WAAA,CAAW,CAAC;OAAQ,OAAA;QAAA,WAAA;QAAA,UAAA;OAAA;;MAItC,YAEe,aAAA,EAFD,KAAI,YAAW,GAAA;8BAC6B,CAAxD,WAAwD,KAAA,QAAA,QAAA;QAArC,SAAS,MAAA,WAAA;QAAc,MAAM,MAAA,IAAA;;;;;KAIpD,WAAsB,KAAA,QAAA,QAAA;KAEX,MAAA,cAAA,KAAA,UAAA,GAAX,mBAAmF,OAAA;;MAAvD,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA;eAAqB;MAAJ,KAAI;;KAE7D,mBAAA,sDAAA"}
1
+ {"version":3,"file":"table.js","names":[],"sources":["../../../src/components/table/table.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"[\n cls.b,\n cls.m(size),\n bem.is('border', border),\n bem.is('all-expanded', allExpanded),\n bem.is('text-ellipsis', textEllipsis)\n ]\"\n ref=\"scrollRef\"\n :content-class=\"cls.e('content')\"\n @scroll=\"handleScroll\"\n >\n <table :class=\"cls.e('wrap')\">\n <colgroup ref=\"colgroupRef\">\n <col\n v-for=\"column of leafColumns\"\n :key=\"column.key\"\n :class=\"column.fixed\"\n :style=\"{\n width: withUnit(column.width, 'px'),\n minWidth: withUnit(column.minWidth, 'px')\n }\"\n />\n </colgroup>\n <UTableHead />\n\n <!--\n 虚拟滚动上占位:替代 tbody transform,避免 table-layout: fixed 下列宽抖动。\n 高度由 useVirtualizer 命令式写入 `style.height`,不经过模板响应式绑定,\n 因此滚动窗口变化不会引起表格模板重渲染。\n -->\n <tbody v-if=\"virtualEnabled\" aria-hidden=\"true\">\n <tr ref=\"beforeSpacerRef\">\n <td :colspan=\"leafColumns.length\" style=\"padding: 0; border: none\"></td>\n </tr>\n </tbody>\n\n <u-table-body>\n <slot name=\"body\" :columns=\"leafColumns\" :rows=\"rows\" />\n\n <template #empty v-if=\"slots.empty\">\n <slot name=\"empty\" />\n </template>\n </u-table-body>\n\n <!-- 虚拟滚动下占位(高度由 useVirtualizer 命令式写入) -->\n <tbody v-if=\"virtualEnabled\" aria-hidden=\"true\">\n <tr ref=\"afterSpacerRef\">\n <td :colspan=\"leafColumns.length\" style=\"padding: 0; border: none\"></td>\n </tr>\n </tbody>\n\n <u-table-foot ref=\"tableFoot\">\n <slot name=\"foot\" :columns=\"leafColumns\" :rows=\"rows\" />\n </u-table-foot>\n </table>\n\n <slot name=\"append\" />\n\n <div v-if=\"showResizeLine\" :class=\"cls.e('resize-line')\" ref=\"resizeLineRef\"></div>\n\n <!-- <u-tip v-if=\"textEllipsis\" ref=\"tip\"> </u-tip> -->\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { computed, provide, shallowRef, toRef, useTemplateRef, watch } from 'vue'\n\nimport type {\n TableProps,\n TableEmits,\n _TableExposed,\n TableColumnSlotsScope,\n ComponentSize,\n ScrollExposed,\n TableRowSlotsScope\n} from '../../types'\nimport { UScroll } from '../scroll'\nimport { TableDIKey } from './di'\nimport type { ColumnNode } from './node/col'\nimport type { TableRowNode } from './node/row'\nimport UTableBody from './table-body.vue'\nimport UTableFoot from './table-foot.vue'\n// import { UTip } from '../tip'\nimport UTableHead from './table-head'\nimport { useCheck } from './use-check'\nimport { useColResize } from './use-col-resize'\nimport { useColumns } from './use-columns'\nimport { useFixedColumns } from './use-fixed-columns'\nimport { useRows } from './use-rows'\nimport { useTable } from './use-table'\n\ndefineOptions({ name: 'UTable' })\n\nconst props = withDefaults(defineProps<TableProps>(), {\n tree: false,\n stripe: true,\n textOverflow: 'line-break',\n virtualThreshold: 80\n})\nconst emit = defineEmits<TableEmits>()\n\nconst slots = defineSlots<{\n [key: `column:${string}`]: (props: TableColumnSlotsScope) => any\n [key: `header:${string}`]: (props: { column: ColumnNode }) => any\n 'row:expand'?: (props: TableRowSlotsScope) => any\n foot?: (props: { columns: ColumnNode[]; rows: TableRowNode[] }) => any\n body?: (props: { columns: ColumnNode[]; rows: TableRowNode[] }) => any\n empty?: () => any\n append?: () => any\n}>()\n\nconst cls = bem('table')\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\n// 占位 tr 的 DOM 句柄;交给 useVirtualizer 直接命令式写 style.height。\nconst beforeSpacerRef = useTemplateRef<HTMLElement>('beforeSpacerRef')\nconst afterSpacerRef = useTemplateRef<HTMLElement>('afterSpacerRef')\n\n// 行(useRows / useFixedColumns 需要 isScrolling,而虚拟化 hook 又依赖 rows.length;\n// 先用中继占位,下方 isScrolling 到位后 watch 回灌)。\nconst isScrollingRelay = shallowRef(false)\n\nconst {\n rows,\n toggleTreeRowExpand,\n allExpanded,\n toggleAllTreeRowExpand,\n rowForest,\n handleRowClick,\n handleCellClick,\n getRowByData\n} = useRows({ props, emit, isScrolling: isScrollingRelay })\n\nconst { createCheckColumn, createSelectColumn, clearChecked, clearSelected, checkedRows } =\n useCheck({ size, props, rows, rowForest, emit, cls })\n\nconst columnConfig = useColumns({\n props,\n createCheckColumn,\n createSelectColumn,\n toggleAllTreeRowExpand,\n cls\n})\n\nconst { leafColumns } = columnConfig\n\nconst { handleScroll, leftFixed, rightFixed } = useFixedColumns()\n\nconst {\n getColumnSlotsNode,\n getExpandRowSlotsNode,\n getHeaderSlotsNode,\n getCellClass,\n getCellCtx,\n getHeaderCellClass\n} = useTable({ props, cls, leftFixed, rightFixed })\n\nconst { showResizeLine, resizeLineRef, colgroupRef } = useColResize({ scrollRef, leafColumns })\n\nconst { virtualizer, items, isScrolling } = useVirtualizer({\n count: computed(() => rows.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n beforeEl: beforeSpacerRef,\n afterEl: afterSpacerRef,\n estimateSize: () => 41,\n // 注意:getItemKey 在构造期一次性写入底层 Virtualizer;闭包每次读的是当前 rows.value,\n // rows 引用整体替换后 key 仍有效(无需再 setOptions)。\n getItemKey: (i) => rows.value[i]?.uid ?? i\n})\n\nconst virtualEnabled = computed(() => {\n const t = props.virtualThreshold\n return t ? rows.value.length > t : true\n})\n\n// 把虚拟化 isScrolling 回灌到中继,供 useRows / useFixedColumns 读取。\nwatch(isScrolling, (v) => {\n isScrollingRelay.value = v\n})\n\n/**\n * E1:数据替换时的条件置顶。\n *\n * 旧实现无差别地 `scrollTo({ y: 0 })`,在「行内增删 / 排序 / 单行更新」等\n * 场景会把用户当前阅读位置跳走;仅在「翻页 / 显著数据集替换」时才需要复位。\n *\n * 判定阈值:|Δlen| / max(newLen, oldLen) ≥ 0.5,即行数变化量超过更大侧的一半时视为显著变化。\n * 选择 0.5 是因为典型的分页/搜索场景会带来 50% 以上的行数差(通常完全替换数据集),\n * 而行内追加 / 删除个位数通常只带来 <5% 的变化;两者区分度足够宽。\n */\nconst LENGTH_DELTA_RATIO_TO_RESET_SCROLL = 0.5\n\nwatch(\n () => props.data,\n (next, prev) => {\n const nextLen = next?.length ?? 0\n const prevLen = prev?.length ?? 0\n const denom = Math.max(nextLen, prevLen, 1)\n const ratio = Math.abs(nextLen - prevLen) / denom\n if (ratio >= LENGTH_DELTA_RATIO_TO_RESET_SCROLL) {\n scrollRef.value?.scrollTo({ y: 0 })\n }\n }\n)\n\n// const tipRef = useTemplateRef('tip')\n\nprovide(TableDIKey, {\n tableProps: props,\n tableSlots: slots,\n cls,\n rows,\n checkedRows,\n columnConfig,\n handleRowClick,\n handleCellClick,\n getColumnSlotsNode,\n getExpandRowSlotsNode,\n getHeaderSlotsNode,\n getCellClass,\n getCellCtx,\n getHeaderCellClass,\n // tipRef,\n toggleTreeRowExpand,\n virtualList: items,\n virtualEnabled,\n measureElement: (index, el) => virtualizer.measureElement(index, el)\n})\n\nconst tableFootRef = useTemplateRef('tableFoot')\n\ndefineExpose<_TableExposed>({\n el: toRef(() => scrollRef.value?.el),\n clearChecked,\n clearSelected,\n getRowByData,\n getSummaryRow: () => tableFootRef.value!.getSummaryRow()\n})\n</script>\n"],"mappings":"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"}
@@ -144,11 +144,12 @@ function useCheck(options) {
144
144
  }
145
145
  function handleCheckRow(row, check) {
146
146
  const cb = check ? (row) => checkedRows.value.add(row) : (row) => checkedRows.value.delete(row);
147
+ const childrenKey = typeof props.tree === "string" ? props.tree : "children";
147
148
  dfs(row, (node) => {
148
149
  const r = node;
149
150
  r.checked = check;
150
151
  cb(r);
151
- }, typeof props.tree === "string" ? props.tree : "children");
152
+ }, childrenKey);
152
153
  triggerCheckedRows();
153
154
  }
154
155
  const getCheckboxColumnWidth = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"use-check.js","names":["UCheckbox"],"sources":["../../../src/components/table/use-check.ts"],"sourcesContent":["import { dfs, o, type Forest } from '@cat-kit/core'\nimport type { BEM } from '@veltra/utils'\nimport {\n computed,\n createTextVNode,\n createVNode,\n nextTick,\n shallowRef,\n toRaw,\n triggerRef,\n watch,\n type ComputedRef,\n type ShallowRef\n} from 'vue'\n\nimport type { TableRow, TableColumn, TableEmits, TableProps, ComponentSize } from '../../types'\nimport { UCheckbox } from '../checkbox'\n\ninterface Options {\n rows: ShallowRef<TableRow[] | undefined>\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n props: TableProps\n emit: TableEmits<any>\n size: ComputedRef<ComponentSize>\n cls: BEM<'table'>\n}\n\ninterface UseCheckReturned {\n checkedRows: ShallowRef<Set<TableRow>>\n clearChecked: () => void\n clearSelected: () => void\n createCheckColumn: () => TableColumn\n createSelectColumn: () => TableColumn\n}\n\nexport function useCheck(options: Options): UseCheckReturned {\n const { rows, rowForest, props, emit, size, cls } = options\n\n const checkedRows = shallowRef(new Set<TableRow>())\n const selectedRow = shallowRef<TableRow>()\n\n /** 触发checkedRows的更新 */\n function triggerCheckedRows() {\n triggerRef(checkedRows)\n }\n\n function clearChecked() {\n checkedRows.value.forEach((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n triggerCheckedRows()\n }\n\n function clearSelected() {\n if (selectedRow.value) {\n selectedRow.value.checked = false\n selectedRow.value = undefined\n }\n }\n\n watch([() => props.checkable, () => props.selectable, () => rows.value], () => {\n clearChecked()\n clearSelected()\n })\n\n watch(selectedRow, (selectedRow) => {\n if (changedByModel) return\n changedByEvent = true\n emit('update:selected', selectedRow?.data ? toRaw(selectedRow.data) : undefined)\n nextTick(() => {\n changedByEvent = false\n })\n })\n\n let changedByEvent = false\n let changedByModel = false\n watch(checkedRows, (checkedRows) => {\n if (changedByModel) return\n changedByEvent = true\n emit(\n 'update:checked',\n Array.from(checkedRows).map((row) => toRaw(row.data))\n )\n nextTick(() => {\n changedByEvent = false\n })\n })\n\n let dicts: Map<string | number, TableRow> | undefined = undefined\n\n // 设置uid -> row 字典,以便于数据重复使用\n function setDicts() {\n if (dicts || !rows.value || !props.rowKey) return\n\n let mapEntries: [string | number, TableRow][] = []\n let i = 0\n while (i < rows.value.length) {\n const row = rows.value[i]!\n\n mapEntries.push([row.uid, row])\n i++\n }\n dicts = new Map(mapEntries)\n }\n\n watch(rows, () => {\n dicts = undefined\n })\n\n watch(\n [() => props.checked, () => props.rowKey, () => props.checkable, rows],\n ([checked, rowKey, checkable, rows], [_, __, ___, oRows]) => {\n if (changedByEvent || !checkable || !rowKey) return\n\n changedByModel = true\n\n // 如果没有字典,先建立字典\n rows !== oRows && setDicts()\n\n clearChecked()\n\n checked?.forEach((item) => {\n const uid = o(item).get(rowKey)\n if (uid === undefined || uid === null) return\n const row = dicts?.get(uid as string | number)\n if (!row) return\n\n row.checked = true\n checkedRows.value.add(row)\n })\n triggerCheckedRows()\n\n nextTick(() => {\n changedByModel = false\n })\n },\n { immediate: true }\n )\n\n watch(\n [() => props.selected, () => props.rowKey, () => props.selectable, rows],\n ([selected, rowKey, selectable, rows], [_, __, ___, oRows]) => {\n if (changedByEvent || !selectable || !rowKey) return\n\n changedByModel = true\n\n // 如果没有字典,先建立字典(懒建立)\n rows !== oRows && setDicts()\n\n if (selected) {\n const uid = o(selected).get(rowKey)\n const row =\n uid === undefined || uid === null ? undefined : dicts?.get(uid as string | number)\n if (row) {\n row.checked = true\n selectedRow.value = row\n }\n } else {\n clearSelected()\n }\n\n nextTick(() => {\n changedByModel = false\n })\n },\n { immediate: true }\n )\n\n const allChecked = computed(() => {\n const rowSize = props.tree ? rowForest.value?.size : rows.value?.length\n return !!rowSize && rowSize === checkedRows.value.size\n })\n\n function handleCheckAllTree(check: boolean) {\n if (check) {\n rowForest.value?.dfs((row) => {\n row.checked = true\n checkedRows.value.add(row)\n })\n } else {\n rowForest.value?.dfs((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n }\n triggerCheckedRows()\n }\n\n function handleCheckAllRows(check: boolean) {\n if (check) {\n rows.value?.forEach((row) => {\n row.checked = true\n checkedRows.value.add(row)\n })\n } else {\n rows.value?.forEach((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n }\n triggerCheckedRows()\n }\n\n function handleCheckAll(check: boolean) {\n if (props.tree) {\n handleCheckAllTree(check as boolean)\n } else {\n handleCheckAllRows(check as boolean)\n }\n }\n\n function handleCheckRow(row: TableRow, check: boolean) {\n const cb = check\n ? (row: TableRow) => checkedRows.value.add(row)\n : (row: TableRow) => checkedRows.value.delete(row)\n\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n dfs(\n row as unknown as Record<string, unknown>,\n (node) => {\n const r = node as unknown as TableRow\n r.checked = check\n cb(r)\n },\n childrenKey\n )\n\n triggerCheckedRows()\n }\n\n const getCheckboxColumnWidth = () => {\n return size.value === 'large' ? 80 : 60\n }\n\n const checkboxClass = cls.e('checkbox')\n const checkboxClick = (e: Event) => e.stopPropagation()\n\n function createCheckColumn(): TableColumn {\n const width = getCheckboxColumnWidth()\n return {\n key: '__is_check_column__',\n name: '',\n width,\n minWidth: width,\n align: 'center',\n fixed: 'left',\n resizable: false,\n nameRender() {\n const checkboxNode = createVNode(UCheckbox, {\n modelValue: allChecked.value,\n 'onUpdate:modelValue': handleCheckAll\n })\n if (!props.tree) {\n return checkboxNode\n }\n\n // const expandNode = createVNode('i', {\n // text: true,\n // class: cls.e('expand-space')\n // })\n return [checkboxNode]\n },\n render(ctx) {\n const { row } = ctx\n\n // @ts-ignore\n return createVNode(UCheckbox, {\n class: checkboxClass,\n modelValue: row.checked,\n 'onUpdate:modelValue': (val: boolean) => {\n handleCheckRow(row, val)\n },\n onClick: checkboxClick\n })\n }\n }\n }\n\n function handleSelect(row: TableRow, check: boolean) {\n row.checked = check\n if (check) {\n if (selectedRow.value) {\n selectedRow.value.checked = false\n }\n selectedRow.value = row\n } else {\n selectedRow.value = undefined\n }\n }\n\n function createSelectColumn(): TableColumn {\n const width = getCheckboxColumnWidth()\n return {\n key: '__is_select_column__',\n name: '单选',\n minWidth: width,\n resizable: false,\n width,\n align: 'center',\n fixed: 'left',\n nameRender(_ctx) {\n if (!props.tree) {\n return '单选'\n }\n\n // const expandNode = createVNode('i', {\n // text: true,\n // class: cls.e('expand-space')\n // })\n return [createTextVNode('单选')]\n },\n\n render({ row }) {\n // @ts-ignore\n return createVNode(UCheckbox, {\n class: checkboxClass,\n modelValue: row.checked,\n 'onUpdate:modelValue': (val: boolean) => {\n handleSelect(row, val)\n },\n onClick: checkboxClick\n })\n }\n }\n }\n\n return { checkedRows, createCheckColumn, createSelectColumn, clearChecked, clearSelected }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-check.js","names":["UCheckbox"],"sources":["../../../src/components/table/use-check.ts"],"sourcesContent":["import { dfs, o, type Forest } from '@cat-kit/core'\nimport type { BEM } from '@veltra/utils'\nimport {\n computed,\n createTextVNode,\n createVNode,\n nextTick,\n shallowRef,\n toRaw,\n triggerRef,\n watch,\n type ComputedRef,\n type ShallowRef\n} from 'vue'\n\nimport type { TableRow, TableColumn, TableEmits, TableProps, ComponentSize } from '../../types'\nimport { UCheckbox } from '../checkbox'\n\ninterface Options {\n rows: ShallowRef<TableRow[] | undefined>\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n props: TableProps\n emit: TableEmits<any>\n size: ComputedRef<ComponentSize>\n cls: BEM<'table'>\n}\n\ninterface UseCheckReturned {\n checkedRows: ShallowRef<Set<TableRow>>\n clearChecked: () => void\n clearSelected: () => void\n createCheckColumn: () => TableColumn\n createSelectColumn: () => TableColumn\n}\n\nexport function useCheck(options: Options): UseCheckReturned {\n const { rows, rowForest, props, emit, size, cls } = options\n\n const checkedRows = shallowRef(new Set<TableRow>())\n const selectedRow = shallowRef<TableRow>()\n\n /** 触发checkedRows的更新 */\n function triggerCheckedRows() {\n triggerRef(checkedRows)\n }\n\n function clearChecked() {\n checkedRows.value.forEach((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n triggerCheckedRows()\n }\n\n function clearSelected() {\n if (selectedRow.value) {\n selectedRow.value.checked = false\n selectedRow.value = undefined\n }\n }\n\n watch([() => props.checkable, () => props.selectable, () => rows.value], () => {\n clearChecked()\n clearSelected()\n })\n\n watch(selectedRow, (selectedRow) => {\n if (changedByModel) return\n changedByEvent = true\n emit('update:selected', selectedRow?.data ? toRaw(selectedRow.data) : undefined)\n nextTick(() => {\n changedByEvent = false\n })\n })\n\n let changedByEvent = false\n let changedByModel = false\n watch(checkedRows, (checkedRows) => {\n if (changedByModel) return\n changedByEvent = true\n emit(\n 'update:checked',\n Array.from(checkedRows).map((row) => toRaw(row.data))\n )\n nextTick(() => {\n changedByEvent = false\n })\n })\n\n let dicts: Map<string | number, TableRow> | undefined = undefined\n\n // 设置uid -> row 字典,以便于数据重复使用\n function setDicts() {\n if (dicts || !rows.value || !props.rowKey) return\n\n let mapEntries: [string | number, TableRow][] = []\n let i = 0\n while (i < rows.value.length) {\n const row = rows.value[i]!\n\n mapEntries.push([row.uid, row])\n i++\n }\n dicts = new Map(mapEntries)\n }\n\n watch(rows, () => {\n dicts = undefined\n })\n\n watch(\n [() => props.checked, () => props.rowKey, () => props.checkable, rows],\n ([checked, rowKey, checkable, rows], [_, __, ___, oRows]) => {\n if (changedByEvent || !checkable || !rowKey) return\n\n changedByModel = true\n\n // 如果没有字典,先建立字典\n rows !== oRows && setDicts()\n\n clearChecked()\n\n checked?.forEach((item) => {\n const uid = o(item).get(rowKey)\n if (uid === undefined || uid === null) return\n const row = dicts?.get(uid as string | number)\n if (!row) return\n\n row.checked = true\n checkedRows.value.add(row)\n })\n triggerCheckedRows()\n\n nextTick(() => {\n changedByModel = false\n })\n },\n { immediate: true }\n )\n\n watch(\n [() => props.selected, () => props.rowKey, () => props.selectable, rows],\n ([selected, rowKey, selectable, rows], [_, __, ___, oRows]) => {\n if (changedByEvent || !selectable || !rowKey) return\n\n changedByModel = true\n\n // 如果没有字典,先建立字典(懒建立)\n rows !== oRows && setDicts()\n\n if (selected) {\n const uid = o(selected).get(rowKey)\n const row =\n uid === undefined || uid === null ? undefined : dicts?.get(uid as string | number)\n if (row) {\n row.checked = true\n selectedRow.value = row\n }\n } else {\n clearSelected()\n }\n\n nextTick(() => {\n changedByModel = false\n })\n },\n { immediate: true }\n )\n\n const allChecked = computed(() => {\n const rowSize = props.tree ? rowForest.value?.size : rows.value?.length\n return !!rowSize && rowSize === checkedRows.value.size\n })\n\n function handleCheckAllTree(check: boolean) {\n if (check) {\n rowForest.value?.dfs((row) => {\n row.checked = true\n checkedRows.value.add(row)\n })\n } else {\n rowForest.value?.dfs((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n }\n triggerCheckedRows()\n }\n\n function handleCheckAllRows(check: boolean) {\n if (check) {\n rows.value?.forEach((row) => {\n row.checked = true\n checkedRows.value.add(row)\n })\n } else {\n rows.value?.forEach((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n }\n triggerCheckedRows()\n }\n\n function handleCheckAll(check: boolean) {\n if (props.tree) {\n handleCheckAllTree(check as boolean)\n } else {\n handleCheckAllRows(check as boolean)\n }\n }\n\n function handleCheckRow(row: TableRow, check: boolean) {\n const cb = check\n ? (row: TableRow) => checkedRows.value.add(row)\n : (row: TableRow) => checkedRows.value.delete(row)\n\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n dfs(\n row as unknown as Record<string, unknown>,\n (node) => {\n const r = node as unknown as TableRow\n r.checked = check\n cb(r)\n },\n childrenKey\n )\n\n triggerCheckedRows()\n }\n\n const getCheckboxColumnWidth = () => {\n return size.value === 'large' ? 80 : 60\n }\n\n const checkboxClass = cls.e('checkbox')\n const checkboxClick = (e: Event) => e.stopPropagation()\n\n function createCheckColumn(): TableColumn {\n const width = getCheckboxColumnWidth()\n return {\n key: '__is_check_column__',\n name: '',\n width,\n minWidth: width,\n align: 'center',\n fixed: 'left',\n resizable: false,\n nameRender() {\n const checkboxNode = createVNode(UCheckbox, {\n modelValue: allChecked.value,\n 'onUpdate:modelValue': handleCheckAll\n })\n if (!props.tree) {\n return checkboxNode\n }\n\n // const expandNode = createVNode('i', {\n // text: true,\n // class: cls.e('expand-space')\n // })\n return [checkboxNode]\n },\n render(ctx) {\n const { row } = ctx\n\n // @ts-ignore\n return createVNode(UCheckbox, {\n class: checkboxClass,\n modelValue: row.checked,\n 'onUpdate:modelValue': (val: boolean) => {\n handleCheckRow(row, val)\n },\n onClick: checkboxClick\n })\n }\n }\n }\n\n function handleSelect(row: TableRow, check: boolean) {\n row.checked = check\n if (check) {\n if (selectedRow.value) {\n selectedRow.value.checked = false\n }\n selectedRow.value = row\n } else {\n selectedRow.value = undefined\n }\n }\n\n function createSelectColumn(): TableColumn {\n const width = getCheckboxColumnWidth()\n return {\n key: '__is_select_column__',\n name: '单选',\n minWidth: width,\n resizable: false,\n width,\n align: 'center',\n fixed: 'left',\n nameRender(_ctx) {\n if (!props.tree) {\n return '单选'\n }\n\n // const expandNode = createVNode('i', {\n // text: true,\n // class: cls.e('expand-space')\n // })\n return [createTextVNode('单选')]\n },\n\n render({ row }) {\n // @ts-ignore\n return createVNode(UCheckbox, {\n class: checkboxClass,\n modelValue: row.checked,\n 'onUpdate:modelValue': (val: boolean) => {\n handleSelect(row, val)\n },\n onClick: checkboxClick\n })\n }\n }\n }\n\n return { checkedRows, createCheckColumn, createSelectColumn, clearChecked, clearSelected }\n}\n"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { TableResizeKey } from "./di.js";
2
2
  import { allocateLeafColumnWidths } from "./allocate-column-widths.js";
3
- import { nextTick, provide, shallowRef, watchEffect } from "vue";
3
+ import { computed, nextTick, provide, shallowRef, watchEffect } from "vue";
4
+ import { useResizeObserver } from "@veltra/compositions";
5
+ import { debounce } from "@cat-kit/core";
4
6
  //#region src/components/table/use-col-resize.ts
5
7
  function useColResize(options) {
6
8
  const { scrollRef, leafColumns } = options;
@@ -27,6 +29,12 @@ function useColResize(options) {
27
29
  }, 0);
28
30
  }
29
31
  watchEffect(correctColumnStyle);
32
+ const debouncedCorrectColumnStyle = debounce(correctColumnStyle);
33
+ const containerRef = computed(() => scrollRef.value?.containerRef ?? null);
34
+ useResizeObserver({
35
+ targets: containerRef,
36
+ onResize: debouncedCorrectColumnStyle
37
+ });
30
38
  function updateResizeLine(transformX) {
31
39
  if (!resizeLineRef.value) return;
32
40
  resizeLineRef.value.style.transform = `translateX(${transformX}px)`;
@@ -1 +1 @@
1
- {"version":3,"file":"use-col-resize.js","names":[],"sources":["../../../src/components/table/use-col-resize.ts"],"sourcesContent":["import { nextTick, provide, shallowRef, watchEffect, type ShallowRef } from 'vue'\n\nimport type { ScrollExposed } from '../../types'\nimport { allocateLeafColumnWidths } from './allocate-column-widths'\nimport { TableResizeKey } from './di'\nimport type { ColumnNode } from './node/col'\n\ninterface Options {\n scrollRef: ShallowRef<ScrollExposed | undefined>\n leafColumns: ShallowRef<ColumnNode[]>\n}\n\ninterface UseColResizeReturned {\n resizeLineRef: ShallowRef<HTMLElement | undefined>\n colgroupRef: ShallowRef<HTMLElement | undefined>\n showResizeLine: ShallowRef<boolean>\n handleResizeMousedown: (e: MouseEvent, resizeColumn: ColumnNode) => void\n}\n\nexport function useColResize(options: Options): UseColResizeReturned {\n const { scrollRef, leafColumns } = options\n\n const showResizeLine = shallowRef(false)\n\n const resizeLineRef = shallowRef<HTMLElement>()\n const colgroupRef = shallowRef<HTMLElement>()\n const headerRef = shallowRef<HTMLElement>()\n\n /**\n * 修正列样式\n */\n function correctColumnStyle() {\n // 获取表格容器宽度\n const containerWidth = scrollRef.value?.containerRef?.clientWidth\n\n if (!containerWidth || !leafColumns.value.length) return\n\n allocateLeafColumnWidths(leafColumns.value, containerWidth)\n\n const fixedLeft = leafColumns.value.filter((column) => column.fixed === 'left')\n const fixedRight = leafColumns.value.filter((column) => column.fixed === 'right')\n\n fixedLeft.reduce((acc, cur) => {\n cur.style.left = acc\n return acc + (cur.width ?? cur.minWidth!)\n }, 0)\n\n fixedRight.reduceRight((acc, cur) => {\n cur.style.right = acc\n return acc + (cur.width ?? cur.minWidth!)\n }, 0)\n }\n\n watchEffect(correctColumnStyle)\n\n function updateResizeLine(transformX: number): void {\n if (!resizeLineRef.value) return\n resizeLineRef.value.style.transform = `translateX(${transformX}px)`\n }\n\n // 表格相对于页面左边缘的偏移量,\n // 此处作为缓存以减少频繁地调用 getBoundingClientRect 方法\n let containerLeft = 0\n let originX = 0\n let originWidth = 0\n let currentResizeColumn: ColumnNode | null = null\n\n function handleResizeMousedown(e: MouseEvent, resizeColumn: ColumnNode): void {\n const tableEl = scrollRef.value?.el\n if (!tableEl) return\n\n showResizeLine.value = true\n currentResizeColumn = resizeColumn\n originX = e.pageX\n originWidth = resizeColumn.width ?? 0\n\n const { left } = tableEl.getBoundingClientRect()\n containerLeft = left\n\n nextTick(() => {\n updateResizeLine(e.pageX - left)\n })\n\n document.addEventListener('mousemove', handleResizeMousemove)\n document.addEventListener('mouseup', handleResizeMouseup)\n }\n\n function handleResizeMousemove(e: MouseEvent): void {\n updateResizeLine(e.pageX - containerLeft)\n }\n\n function handleResizeMouseup(e: MouseEvent): void {\n currentResizeColumn!.width = Math.max(\n originWidth + e.pageX - originX,\n currentResizeColumn!.minWidth!\n )\n currentResizeColumn!.explicitWidth = true\n\n showResizeLine.value = false\n currentResizeColumn = null\n correctColumnStyle()\n\n document.removeEventListener('mouseup', handleResizeMouseup)\n document.removeEventListener('mousemove', handleResizeMousemove)\n }\n\n provide(TableResizeKey, { handleResizeMousedown, headerRef })\n\n return { resizeLineRef, colgroupRef, showResizeLine, handleResizeMousedown }\n}\n"],"mappings":";;;;AAmBA,SAAgB,aAAa,SAAwC;CACnE,MAAM,EAAE,WAAW,gBAAgB;CAEnC,MAAM,iBAAiB,WAAW,KAAK;CAEvC,MAAM,gBAAgB,WAAwB;CAC9C,MAAM,cAAc,WAAwB;CAC5C,MAAM,YAAY,WAAwB;;;;CAK1C,SAAS,qBAAqB;EAE5B,MAAM,iBAAiB,UAAU,OAAO,cAAc;EAEtD,IAAI,CAAC,kBAAkB,CAAC,YAAY,MAAM,QAAQ;EAElD,yBAAyB,YAAY,OAAO,cAAc;EAE1D,MAAM,YAAY,YAAY,MAAM,QAAQ,WAAW,OAAO,UAAU,MAAM;EAC9E,MAAM,aAAa,YAAY,MAAM,QAAQ,WAAW,OAAO,UAAU,OAAO;EAEhF,UAAU,QAAQ,KAAK,QAAQ;GAC7B,IAAI,MAAM,OAAO;GACjB,OAAO,OAAO,IAAI,SAAS,IAAI;EACjC,GAAG,CAAC;EAEJ,WAAW,aAAa,KAAK,QAAQ;GACnC,IAAI,MAAM,QAAQ;GAClB,OAAO,OAAO,IAAI,SAAS,IAAI;EACjC,GAAG,CAAC;CACN;CAEA,YAAY,kBAAkB;CAE9B,SAAS,iBAAiB,YAA0B;EAClD,IAAI,CAAC,cAAc,OAAO;EAC1B,cAAc,MAAM,MAAM,YAAY,cAAc,WAAW;CACjE;CAIA,IAAI,gBAAgB;CACpB,IAAI,UAAU;CACd,IAAI,cAAc;CAClB,IAAI,sBAAyC;CAE7C,SAAS,sBAAsB,GAAe,cAAgC;EAC5E,MAAM,UAAU,UAAU,OAAO;EACjC,IAAI,CAAC,SAAS;EAEd,eAAe,QAAQ;EACvB,sBAAsB;EACtB,UAAU,EAAE;EACZ,cAAc,aAAa,SAAS;EAEpC,MAAM,EAAE,SAAS,QAAQ,sBAAsB;EAC/C,gBAAgB;EAEhB,eAAe;GACb,iBAAiB,EAAE,QAAQ,IAAI;EACjC,CAAC;EAED,SAAS,iBAAiB,aAAa,qBAAqB;EAC5D,SAAS,iBAAiB,WAAW,mBAAmB;CAC1D;CAEA,SAAS,sBAAsB,GAAqB;EAClD,iBAAiB,EAAE,QAAQ,aAAa;CAC1C;CAEA,SAAS,oBAAoB,GAAqB;EAChD,oBAAqB,QAAQ,KAAK,IAChC,cAAc,EAAE,QAAQ,SACxB,oBAAqB,QACvB;EACA,oBAAqB,gBAAgB;EAErC,eAAe,QAAQ;EACvB,sBAAsB;EACtB,mBAAmB;EAEnB,SAAS,oBAAoB,WAAW,mBAAmB;EAC3D,SAAS,oBAAoB,aAAa,qBAAqB;CACjE;CAEA,QAAQ,gBAAgB;EAAE;EAAuB;CAAU,CAAC;CAE5D,OAAO;EAAE;EAAe;EAAa;EAAgB;CAAsB;AAC7E"}
1
+ {"version":3,"file":"use-col-resize.js","names":[],"sources":["../../../src/components/table/use-col-resize.ts"],"sourcesContent":["import { debounce } from '@cat-kit/core'\nimport { useResizeObserver } from '@veltra/compositions'\nimport { computed, nextTick, provide, shallowRef, watchEffect, type ShallowRef } from 'vue'\n\nimport type { ScrollExposed } from '../../types'\nimport { allocateLeafColumnWidths } from './allocate-column-widths'\nimport { TableResizeKey } from './di'\nimport type { ColumnNode } from './node/col'\n\ninterface Options {\n scrollRef: ShallowRef<ScrollExposed | undefined>\n leafColumns: ShallowRef<ColumnNode[]>\n}\n\ninterface UseColResizeReturned {\n resizeLineRef: ShallowRef<HTMLElement | undefined>\n colgroupRef: ShallowRef<HTMLElement | undefined>\n showResizeLine: ShallowRef<boolean>\n handleResizeMousedown: (e: MouseEvent, resizeColumn: ColumnNode) => void\n}\n\nexport function useColResize(options: Options): UseColResizeReturned {\n const { scrollRef, leafColumns } = options\n\n const showResizeLine = shallowRef(false)\n\n const resizeLineRef = shallowRef<HTMLElement>()\n const colgroupRef = shallowRef<HTMLElement>()\n const headerRef = shallowRef<HTMLElement>()\n\n /**\n * 修正列样式\n */\n function correctColumnStyle() {\n // 获取表格容器宽度\n const containerWidth = scrollRef.value?.containerRef?.clientWidth\n\n if (!containerWidth || !leafColumns.value.length) return\n\n allocateLeafColumnWidths(leafColumns.value, containerWidth)\n\n const fixedLeft = leafColumns.value.filter((column) => column.fixed === 'left')\n const fixedRight = leafColumns.value.filter((column) => column.fixed === 'right')\n\n fixedLeft.reduce((acc, cur) => {\n cur.style.left = acc\n return acc + (cur.width ?? cur.minWidth!)\n }, 0)\n\n fixedRight.reduceRight((acc, cur) => {\n cur.style.right = acc\n return acc + (cur.width ?? cur.minWidth!)\n }, 0)\n }\n\n watchEffect(correctColumnStyle)\n\n // 容器宽度变化(窗口缩放、父布局变化、纵向滚动条出现/消失等)时重新分配列宽,\n // 直到所有未显式设宽的列回落到 minWidth。计算开销较大,用防抖合并连续的 resize 触发。\n const debouncedCorrectColumnStyle = debounce(correctColumnStyle)\n const containerRef = computed(() => scrollRef.value?.containerRef ?? null)\n useResizeObserver({ targets: containerRef, onResize: debouncedCorrectColumnStyle })\n\n function updateResizeLine(transformX: number): void {\n if (!resizeLineRef.value) return\n resizeLineRef.value.style.transform = `translateX(${transformX}px)`\n }\n\n // 表格相对于页面左边缘的偏移量,\n // 此处作为缓存以减少频繁地调用 getBoundingClientRect 方法\n let containerLeft = 0\n let originX = 0\n let originWidth = 0\n let currentResizeColumn: ColumnNode | null = null\n\n function handleResizeMousedown(e: MouseEvent, resizeColumn: ColumnNode): void {\n const tableEl = scrollRef.value?.el\n if (!tableEl) return\n\n showResizeLine.value = true\n currentResizeColumn = resizeColumn\n originX = e.pageX\n originWidth = resizeColumn.width ?? 0\n\n const { left } = tableEl.getBoundingClientRect()\n containerLeft = left\n\n nextTick(() => {\n updateResizeLine(e.pageX - left)\n })\n\n document.addEventListener('mousemove', handleResizeMousemove)\n document.addEventListener('mouseup', handleResizeMouseup)\n }\n\n function handleResizeMousemove(e: MouseEvent): void {\n updateResizeLine(e.pageX - containerLeft)\n }\n\n function handleResizeMouseup(e: MouseEvent): void {\n currentResizeColumn!.width = Math.max(\n originWidth + e.pageX - originX,\n currentResizeColumn!.minWidth!\n )\n currentResizeColumn!.explicitWidth = true\n\n showResizeLine.value = false\n currentResizeColumn = null\n correctColumnStyle()\n\n document.removeEventListener('mouseup', handleResizeMouseup)\n document.removeEventListener('mousemove', handleResizeMousemove)\n }\n\n provide(TableResizeKey, { handleResizeMousedown, headerRef })\n\n return { resizeLineRef, colgroupRef, showResizeLine, handleResizeMousedown }\n}\n"],"mappings":";;;;;;AAqBA,SAAgB,aAAa,SAAwC;CACnE,MAAM,EAAE,WAAW,gBAAgB;CAEnC,MAAM,iBAAiB,WAAW,KAAK;CAEvC,MAAM,gBAAgB,WAAwB;CAC9C,MAAM,cAAc,WAAwB;CAC5C,MAAM,YAAY,WAAwB;;;;CAK1C,SAAS,qBAAqB;EAE5B,MAAM,iBAAiB,UAAU,OAAO,cAAc;EAEtD,IAAI,CAAC,kBAAkB,CAAC,YAAY,MAAM,QAAQ;EAElD,yBAAyB,YAAY,OAAO,cAAc;EAE1D,MAAM,YAAY,YAAY,MAAM,QAAQ,WAAW,OAAO,UAAU,MAAM;EAC9E,MAAM,aAAa,YAAY,MAAM,QAAQ,WAAW,OAAO,UAAU,OAAO;EAEhF,UAAU,QAAQ,KAAK,QAAQ;GAC7B,IAAI,MAAM,OAAO;GACjB,OAAO,OAAO,IAAI,SAAS,IAAI;EACjC,GAAG,CAAC;EAEJ,WAAW,aAAa,KAAK,QAAQ;GACnC,IAAI,MAAM,QAAQ;GAClB,OAAO,OAAO,IAAI,SAAS,IAAI;EACjC,GAAG,CAAC;CACN;CAEA,YAAY,kBAAkB;CAI9B,MAAM,8BAA8B,SAAS,kBAAkB;CAC/D,MAAM,eAAe,eAAe,UAAU,OAAO,gBAAgB,IAAI;CACzE,kBAAkB;EAAE,SAAS;EAAc,UAAU;CAA4B,CAAC;CAElF,SAAS,iBAAiB,YAA0B;EAClD,IAAI,CAAC,cAAc,OAAO;EAC1B,cAAc,MAAM,MAAM,YAAY,cAAc,WAAW;CACjE;CAIA,IAAI,gBAAgB;CACpB,IAAI,UAAU;CACd,IAAI,cAAc;CAClB,IAAI,sBAAyC;CAE7C,SAAS,sBAAsB,GAAe,cAAgC;EAC5E,MAAM,UAAU,UAAU,OAAO;EACjC,IAAI,CAAC,SAAS;EAEd,eAAe,QAAQ;EACvB,sBAAsB;EACtB,UAAU,EAAE;EACZ,cAAc,aAAa,SAAS;EAEpC,MAAM,EAAE,SAAS,QAAQ,sBAAsB;EAC/C,gBAAgB;EAEhB,eAAe;GACb,iBAAiB,EAAE,QAAQ,IAAI;EACjC,CAAC;EAED,SAAS,iBAAiB,aAAa,qBAAqB;EAC5D,SAAS,iBAAiB,WAAW,mBAAmB;CAC1D;CAEA,SAAS,sBAAsB,GAAqB;EAClD,iBAAiB,EAAE,QAAQ,aAAa;CAC1C;CAEA,SAAS,oBAAoB,GAAqB;EAChD,oBAAqB,QAAQ,KAAK,IAChC,cAAc,EAAE,QAAQ,SACxB,oBAAqB,QACvB;EACA,oBAAqB,gBAAgB;EAErC,eAAe,QAAQ;EACvB,sBAAsB;EACtB,mBAAmB;EAEnB,SAAS,oBAAoB,WAAW,mBAAmB;EAC3D,SAAS,oBAAoB,aAAa,qBAAqB;CACjE;CAEA,QAAQ,gBAAgB;EAAE;EAAuB;CAAU,CAAC;CAE5D,OAAO;EAAE;EAAe;EAAa;EAAgB;CAAsB;AAC7E"}
@@ -2,7 +2,7 @@ import { TableColumn } from "../../types/table.js";
2
2
  import "../../types/index.js";
3
3
  import "./node/col.js";
4
4
  import { ComputedRef, ShallowRef } from "vue";
5
- import "@veltra/utils";
5
+ import { BEM } from "@veltra/utils";
6
6
  //#region src/components/table/use-columns.d.ts
7
7
  /**
8
8
  * 定义表格列
@@ -76,9 +76,10 @@ function useRows(options) {
76
76
  /** 处理树形森林结构 */
77
77
  function getRowForest(data) {
78
78
  tempRowDicts = /* @__PURE__ */ new WeakMap();
79
+ const childrenKey = typeof props.tree === "string" ? props.tree : "children";
79
80
  const ret = new Forest({
80
81
  data,
81
- childrenKey: typeof props.tree === "string" ? props.tree : "children",
82
+ childrenKey,
82
83
  createNode(val, index, depth, _forest, parent) {
83
84
  const row = createRow(val, index, depth, parent);
84
85
  if (props.defaultExpandAll) row.expanded = true;
@@ -1 +1 @@
1
- {"version":3,"file":"use-rows.js","names":["useModel"],"sources":["../../../src/components/table/use-rows.ts"],"sourcesContent":["import { Forest, o } from '@cat-kit/core'\nimport { useModel } from '@veltra/compositions'\nimport { shallowRef, watch, type Ref, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableEmits, TableProps, TableRow } from '../../types'\nimport { TableRowNode } from './node/row'\n\ninterface Options {\n props: TableProps\n emit: TableEmits\n /**\n * D2:滚动中 (`true`) 跳过 `currentRow` 高亮写入。\n *\n * 行点击处理会通过 `currentRow` watcher 把 `isCurrent` 切换到新行 / 旧行上,\n * 触发对应 `<tr>` 的 class 重绘。在滚动期间 (移动端/触控板惯性滚动常见)\n * 意外点击不应改变高亮,因此直接跳过;滚动结束后的正常点击仍会生效。\n */\n isScrolling?: Ref<boolean>\n}\n\ninterface UseRowsReturned {\n /** 所有的行森林(树形数据) */\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n /** 当前可见的展平行列表 */\n rows: ShallowRef<TableRowNode[]>\n /** 切换树形行节点的展开/折叠 */\n toggleTreeRowExpand: (node: TableRow) => void\n /** 是否全部展开 */\n allExpanded: ShallowRef<boolean>\n /** 切换全部展开/折叠 */\n toggleAllTreeRowExpand: () => void\n /** 行点击处理 */\n handleRowClick: (row: TableRow, e: MouseEvent) => void\n /** 单元格点击处理 */\n handleCellClick: (row: TableRow, column: TableColumn, e: MouseEvent) => void\n /** 根据原始数据对象获取对应的 TableRow */\n getRowByData: (data: Record<string, any>) => TableRow | undefined\n}\n\nexport function useRows(options: Options): UseRowsReturned {\n const { props, emit, isScrolling } = options\n\n // --- 状态定义 ---\n\n /** 所有可见的行 */\n const rows = shallowRef<TableRowNode[]>([])\n /** 数据行, 不包括展开和折叠的行 */\n const dataRows = shallowRef<TableRowNode[]>([])\n /** 行森林(数据结构树) */\n const rowForest = shallowRef<Forest<Record<string, unknown>, any>>()\n /** 树形节点是否全部展开 */\n const allExpanded = shallowRef(props.defaultExpandAll ?? false)\n\n /** 当前高亮的行 */\n const currentRow = useModel({\n props,\n emit,\n propName: 'current',\n shallow: true,\n local: () => !!props.highlightCurrent\n })\n\n // --- 行字典维护 (性能优化) ---\n\n /**\n * 用于优化增删改时的性能。\n * 原理:Vue 的组件在属性发生改变时会重新渲染,通过 WeakMap 缓存 data -> TableRow 的映射,\n * 可以在数据更新时复用已有的 TableRowNode 实例,避免重复创建和 DOM 抖动。\n */\n let rowDicts = new WeakMap<Record<string, any>, TableRowNode>()\n let tempRowDicts: null | WeakMap<Record<string, any>, TableRowNode> = null\n let uidSeed = 0\n\n /** 获取行唯一标识 */\n const getRowUID = props.rowKey\n ? (rowData: Record<string, any>) => rowData && o(rowData).get(props.rowKey!)\n : () => uidSeed++\n\n /** 创建或复用 TableRow 实例 */\n const createRow = (\n data: Record<string, any>,\n index: number,\n depth = 0,\n parent?: TableRowNode\n ) => {\n const existRow = data ? rowDicts.get(data) : undefined\n if (existRow) {\n existRow.index = index\n existRow.depth = depth\n existRow.parent = parent\n return existRow\n }\n return new TableRowNode({ data, index, depth, parent, uid: getRowUID(data) })\n }\n\n // --- 行处理逻辑 ---\n\n /** 处理常规扁平列表 */\n function getDataRows(data: Record<string, any>[]): TableRowNode[] {\n let i = data.length\n const result = Array.from({ length: i }) as TableRowNode[]\n tempRowDicts = new WeakMap()\n\n while (i--) {\n const dataItem = data[i]!\n const row = createRow(dataItem, i)\n result[i] = row\n tempRowDicts.set(dataItem, row)\n }\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return result\n }\n\n function expandDataRows(): void {\n const result: TableRowNode[] = []\n let i = -1\n while (++i < dataRows.value.length) {\n const row = dataRows.value[i]!\n result.push(row)\n if (row.expanded) {\n result.push(row.copy())\n }\n }\n rows.value = result\n }\n\n /** 处理树形森林结构 */\n function getRowForest(data: Record<string, any>[]): Forest<Record<string, unknown>, any> {\n tempRowDicts = new WeakMap()\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n const ret = new Forest<Record<string, unknown>, any>({\n data,\n childrenKey,\n createNode(val, index, depth, _forest, parent) {\n const row = createRow(val, index, depth, parent)\n if (props.defaultExpandAll) {\n row.expanded = true\n }\n val && tempRowDicts!.set(val, row)\n return row\n }\n })\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return ret\n }\n\n /** 展平树形结构为可见行列表 */\n function updateFlattedRows(): void {\n if (!rowForest.value) return\n rows.value = rowForest.value.flattenVisible((n) => n.expanded)\n }\n\n // --- 副作用监听 ---\n\n // 监听当前行切换,维护 isCurrent 状态\n watch(\n () => currentRow.value,\n (row, oldRow) => {\n if (oldRow) oldRow.isCurrent = false\n if (row) row.isCurrent = true\n }\n )\n\n // 同步状态给外部\n watch(rows, (rows) => emit('update:rows', rows))\n watch(rowForest, (forest) => emit('update:forest', forest))\n\n // 核心:监听原始数据变化,重新构建行列表或树\n watch(\n [() => props.data, () => props.tree, () => props.defaultExpandAll],\n ([data, tree]) => {\n if (!data?.length) {\n rows.value = []\n rowDicts = new WeakMap()\n rowForest.value = undefined\n return\n }\n\n if (!tree) {\n rowForest.value = undefined\n dataRows.value = getDataRows(data)\n rows.value = dataRows.value\n } else {\n dataRows.value = []\n rowForest.value = getRowForest(data)\n updateFlattedRows()\n }\n },\n { immediate: true }\n )\n\n // --- 交互方法 ---\n\n function toggleTreeRowExpand(node: TableRow): void {\n node.expanded = !node.expanded\n\n if (props.tree) {\n return updateFlattedRows()\n }\n if (props.expandable) {\n expandDataRows()\n }\n }\n\n function toggleAllTreeRowExpand(): void {\n allExpanded.value = !allExpanded.value\n if (props.tree) {\n rowForest.value?.dfs((node) => {\n node.expanded = allExpanded.value\n })\n updateFlattedRows()\n return\n }\n if (props.expandable) {\n dataRows.value.forEach((row) => {\n row.expanded = allExpanded.value\n })\n expandDataRows()\n return\n }\n }\n\n function handleRowClick(row: TableRow, e: MouseEvent): void {\n // D2:滚动中的点击(多为惯性滚动误触)不应改变 currentRow 高亮。\n if (!isScrolling?.value) {\n currentRow.value = currentRow.value === row ? undefined : row\n }\n emit('row-click', row, e)\n }\n\n function handleCellClick(row: TableRow, column: TableColumn, e: MouseEvent): void {\n emit('cell-click', row, column, e)\n }\n\n function getRowByData(data: Record<string, any>): TableRow | undefined {\n return rowDicts.get(data)\n }\n\n return {\n rowForest,\n rows,\n allExpanded,\n toggleTreeRowExpand,\n toggleAllTreeRowExpand,\n handleRowClick,\n handleCellClick,\n getRowByData\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-rows.js","names":["useModel"],"sources":["../../../src/components/table/use-rows.ts"],"sourcesContent":["import { Forest, o } from '@cat-kit/core'\nimport { useModel } from '@veltra/compositions'\nimport { shallowRef, watch, type Ref, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableEmits, TableProps, TableRow } from '../../types'\nimport { TableRowNode } from './node/row'\n\ninterface Options {\n props: TableProps\n emit: TableEmits\n /**\n * D2:滚动中 (`true`) 跳过 `currentRow` 高亮写入。\n *\n * 行点击处理会通过 `currentRow` watcher 把 `isCurrent` 切换到新行 / 旧行上,\n * 触发对应 `<tr>` 的 class 重绘。在滚动期间 (移动端/触控板惯性滚动常见)\n * 意外点击不应改变高亮,因此直接跳过;滚动结束后的正常点击仍会生效。\n */\n isScrolling?: Ref<boolean>\n}\n\ninterface UseRowsReturned {\n /** 所有的行森林(树形数据) */\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n /** 当前可见的展平行列表 */\n rows: ShallowRef<TableRowNode[]>\n /** 切换树形行节点的展开/折叠 */\n toggleTreeRowExpand: (node: TableRow) => void\n /** 是否全部展开 */\n allExpanded: ShallowRef<boolean>\n /** 切换全部展开/折叠 */\n toggleAllTreeRowExpand: () => void\n /** 行点击处理 */\n handleRowClick: (row: TableRow, e: MouseEvent) => void\n /** 单元格点击处理 */\n handleCellClick: (row: TableRow, column: TableColumn, e: MouseEvent) => void\n /** 根据原始数据对象获取对应的 TableRow */\n getRowByData: (data: Record<string, any>) => TableRow | undefined\n}\n\nexport function useRows(options: Options): UseRowsReturned {\n const { props, emit, isScrolling } = options\n\n // --- 状态定义 ---\n\n /** 所有可见的行 */\n const rows = shallowRef<TableRowNode[]>([])\n /** 数据行, 不包括展开和折叠的行 */\n const dataRows = shallowRef<TableRowNode[]>([])\n /** 行森林(数据结构树) */\n const rowForest = shallowRef<Forest<Record<string, unknown>, any>>()\n /** 树形节点是否全部展开 */\n const allExpanded = shallowRef(props.defaultExpandAll ?? false)\n\n /** 当前高亮的行 */\n const currentRow = useModel({\n props,\n emit,\n propName: 'current',\n shallow: true,\n local: () => !!props.highlightCurrent\n })\n\n // --- 行字典维护 (性能优化) ---\n\n /**\n * 用于优化增删改时的性能。\n * 原理:Vue 的组件在属性发生改变时会重新渲染,通过 WeakMap 缓存 data -> TableRow 的映射,\n * 可以在数据更新时复用已有的 TableRowNode 实例,避免重复创建和 DOM 抖动。\n */\n let rowDicts = new WeakMap<Record<string, any>, TableRowNode>()\n let tempRowDicts: null | WeakMap<Record<string, any>, TableRowNode> = null\n let uidSeed = 0\n\n /** 获取行唯一标识 */\n const getRowUID = props.rowKey\n ? (rowData: Record<string, any>) => rowData && o(rowData).get(props.rowKey!)\n : () => uidSeed++\n\n /** 创建或复用 TableRow 实例 */\n const createRow = (\n data: Record<string, any>,\n index: number,\n depth = 0,\n parent?: TableRowNode\n ) => {\n const existRow = data ? rowDicts.get(data) : undefined\n if (existRow) {\n existRow.index = index\n existRow.depth = depth\n existRow.parent = parent\n return existRow\n }\n return new TableRowNode({ data, index, depth, parent, uid: getRowUID(data) })\n }\n\n // --- 行处理逻辑 ---\n\n /** 处理常规扁平列表 */\n function getDataRows(data: Record<string, any>[]): TableRowNode[] {\n let i = data.length\n const result = Array.from({ length: i }) as TableRowNode[]\n tempRowDicts = new WeakMap()\n\n while (i--) {\n const dataItem = data[i]!\n const row = createRow(dataItem, i)\n result[i] = row\n tempRowDicts.set(dataItem, row)\n }\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return result\n }\n\n function expandDataRows(): void {\n const result: TableRowNode[] = []\n let i = -1\n while (++i < dataRows.value.length) {\n const row = dataRows.value[i]!\n result.push(row)\n if (row.expanded) {\n result.push(row.copy())\n }\n }\n rows.value = result\n }\n\n /** 处理树形森林结构 */\n function getRowForest(data: Record<string, any>[]): Forest<Record<string, unknown>, any> {\n tempRowDicts = new WeakMap()\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n const ret = new Forest<Record<string, unknown>, any>({\n data,\n childrenKey,\n createNode(val, index, depth, _forest, parent) {\n const row = createRow(val, index, depth, parent)\n if (props.defaultExpandAll) {\n row.expanded = true\n }\n val && tempRowDicts!.set(val, row)\n return row\n }\n })\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return ret\n }\n\n /** 展平树形结构为可见行列表 */\n function updateFlattedRows(): void {\n if (!rowForest.value) return\n rows.value = rowForest.value.flattenVisible((n) => n.expanded)\n }\n\n // --- 副作用监听 ---\n\n // 监听当前行切换,维护 isCurrent 状态\n watch(\n () => currentRow.value,\n (row, oldRow) => {\n if (oldRow) oldRow.isCurrent = false\n if (row) row.isCurrent = true\n }\n )\n\n // 同步状态给外部\n watch(rows, (rows) => emit('update:rows', rows))\n watch(rowForest, (forest) => emit('update:forest', forest))\n\n // 核心:监听原始数据变化,重新构建行列表或树\n watch(\n [() => props.data, () => props.tree, () => props.defaultExpandAll],\n ([data, tree]) => {\n if (!data?.length) {\n rows.value = []\n rowDicts = new WeakMap()\n rowForest.value = undefined\n return\n }\n\n if (!tree) {\n rowForest.value = undefined\n dataRows.value = getDataRows(data)\n rows.value = dataRows.value\n } else {\n dataRows.value = []\n rowForest.value = getRowForest(data)\n updateFlattedRows()\n }\n },\n { immediate: true }\n )\n\n // --- 交互方法 ---\n\n function toggleTreeRowExpand(node: TableRow): void {\n node.expanded = !node.expanded\n\n if (props.tree) {\n return updateFlattedRows()\n }\n if (props.expandable) {\n expandDataRows()\n }\n }\n\n function toggleAllTreeRowExpand(): void {\n allExpanded.value = !allExpanded.value\n if (props.tree) {\n rowForest.value?.dfs((node) => {\n node.expanded = allExpanded.value\n })\n updateFlattedRows()\n return\n }\n if (props.expandable) {\n dataRows.value.forEach((row) => {\n row.expanded = allExpanded.value\n })\n expandDataRows()\n return\n }\n }\n\n function handleRowClick(row: TableRow, e: MouseEvent): void {\n // D2:滚动中的点击(多为惯性滚动误触)不应改变 currentRow 高亮。\n if (!isScrolling?.value) {\n currentRow.value = currentRow.value === row ? undefined : row\n }\n emit('row-click', row, e)\n }\n\n function handleCellClick(row: TableRow, column: TableColumn, e: MouseEvent): void {\n emit('cell-click', row, column, e)\n }\n\n function getRowByData(data: Record<string, any>): TableRow | undefined {\n return rowDicts.get(data)\n }\n\n return {\n rowForest,\n rows,\n allExpanded,\n toggleTreeRowExpand,\n toggleAllTreeRowExpand,\n handleRowClick,\n handleCellClick,\n getRowByData\n }\n}\n"],"mappings":";;;;;AAuCA,SAAgB,QAAQ,SAAmC;CACzD,MAAM,EAAE,OAAO,MAAM,gBAAgB;;CAKrC,MAAM,OAAO,WAA2B,CAAC,CAAC;;CAE1C,MAAM,WAAW,WAA2B,CAAC,CAAC;;CAE9C,MAAM,YAAY,WAAiD;;CAEnE,MAAM,cAAc,WAAW,MAAM,oBAAoB,KAAK;;CAG9D,MAAM,aAAaA,WAAS;EAC1B;EACA;EACA,UAAU;EACV,SAAS;EACT,aAAa,CAAC,CAAC,MAAM;CACvB,CAAC;;;;;;CASD,IAAI,2BAAW,IAAI,QAA2C;CAC9D,IAAI,eAAkE;CACtE,IAAI,UAAU;;CAGd,MAAM,YAAY,MAAM,UACnB,YAAiC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,MAAO,UACnE;;CAGV,MAAM,aACJ,MACA,OACA,QAAQ,GACR,WACG;EACH,MAAM,WAAW,OAAO,SAAS,IAAI,IAAI,IAAI,KAAA;EAC7C,IAAI,UAAU;GACZ,SAAS,QAAQ;GACjB,SAAS,QAAQ;GACjB,SAAS,SAAS;GAClB,OAAO;EACT;EACA,OAAO,IAAI,aAAa;GAAE;GAAM;GAAO;GAAO;GAAQ,KAAK,UAAU,IAAI;EAAE,CAAC;CAC9E;;CAKA,SAAS,YAAY,MAA6C;EAChE,IAAI,IAAI,KAAK;EACb,MAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC;EACvC,+BAAe,IAAI,QAAQ;EAE3B,OAAO,KAAK;GACV,MAAM,WAAW,KAAK;GACtB,MAAM,MAAM,UAAU,UAAU,CAAC;GACjC,OAAO,KAAK;GACZ,aAAa,IAAI,UAAU,GAAG;EAChC;EAEA,WAAW;EACX,eAAe;EACf,OAAO;CACT;CAEA,SAAS,iBAAuB;EAC9B,MAAM,SAAyB,CAAC;EAChC,IAAI,IAAI;EACR,OAAO,EAAE,IAAI,SAAS,MAAM,QAAQ;GAClC,MAAM,MAAM,SAAS,MAAM;GAC3B,OAAO,KAAK,GAAG;GACf,IAAI,IAAI,UACN,OAAO,KAAK,IAAI,KAAK,CAAC;EAE1B;EACA,KAAK,QAAQ;CACf;;CAGA,SAAS,aAAa,MAAmE;EACvF,+BAAe,IAAI,QAAQ;EAC3B,MAAM,cAAc,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;EAClE,MAAM,MAAM,IAAI,OAAqC;GACnD;GACA;GACA,WAAW,KAAK,OAAO,OAAO,SAAS,QAAQ;IAC7C,MAAM,MAAM,UAAU,KAAK,OAAO,OAAO,MAAM;IAC/C,IAAI,MAAM,kBACR,IAAI,WAAW;IAEjB,OAAO,aAAc,IAAI,KAAK,GAAG;IACjC,OAAO;GACT;EACF,CAAC;EAED,WAAW;EACX,eAAe;EACf,OAAO;CACT;;CAGA,SAAS,oBAA0B;EACjC,IAAI,CAAC,UAAU,OAAO;EACtB,KAAK,QAAQ,UAAU,MAAM,gBAAgB,MAAM,EAAE,QAAQ;CAC/D;CAKA,YACQ,WAAW,QAChB,KAAK,WAAW;EACf,IAAI,QAAQ,OAAO,YAAY;EAC/B,IAAI,KAAK,IAAI,YAAY;CAC3B,CACF;CAGA,MAAM,OAAO,SAAS,KAAK,eAAe,IAAI,CAAC;CAC/C,MAAM,YAAY,WAAW,KAAK,iBAAiB,MAAM,CAAC;CAG1D,MACE;QAAO,MAAM;QAAY,MAAM;QAAY,MAAM;CAAgB,IAChE,CAAC,MAAM,UAAU;EAChB,IAAI,CAAC,MAAM,QAAQ;GACjB,KAAK,QAAQ,CAAC;GACd,2BAAW,IAAI,QAAQ;GACvB,UAAU,QAAQ,KAAA;GAClB;EACF;EAEA,IAAI,CAAC,MAAM;GACT,UAAU,QAAQ,KAAA;GAClB,SAAS,QAAQ,YAAY,IAAI;GACjC,KAAK,QAAQ,SAAS;EACxB,OAAO;GACL,SAAS,QAAQ,CAAC;GAClB,UAAU,QAAQ,aAAa,IAAI;GACnC,kBAAkB;EACpB;CACF,GACA,EAAE,WAAW,KAAK,CACpB;CAIA,SAAS,oBAAoB,MAAsB;EACjD,KAAK,WAAW,CAAC,KAAK;EAEtB,IAAI,MAAM,MACR,OAAO,kBAAkB;EAE3B,IAAI,MAAM,YACR,eAAe;CAEnB;CAEA,SAAS,yBAA+B;EACtC,YAAY,QAAQ,CAAC,YAAY;EACjC,IAAI,MAAM,MAAM;GACd,UAAU,OAAO,KAAK,SAAS;IAC7B,KAAK,WAAW,YAAY;GAC9B,CAAC;GACD,kBAAkB;GAClB;EACF;EACA,IAAI,MAAM,YAAY;GACpB,SAAS,MAAM,SAAS,QAAQ;IAC9B,IAAI,WAAW,YAAY;GAC7B,CAAC;GACD,eAAe;GACf;EACF;CACF;CAEA,SAAS,eAAe,KAAe,GAAqB;EAE1D,IAAI,CAAC,aAAa,OAChB,WAAW,QAAQ,WAAW,UAAU,MAAM,KAAA,IAAY;EAE5D,KAAK,aAAa,KAAK,CAAC;CAC1B;CAEA,SAAS,gBAAgB,KAAe,QAAqB,GAAqB;EAChF,KAAK,cAAc,KAAK,QAAQ,CAAC;CACnC;CAEA,SAAS,aAAa,MAAiD;EACrE,OAAO,SAAS,IAAI,IAAI;CAC1B;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"table-editor.js","names":["$slots"],"sources":["../../../src/components/table-editor/table-editor.vue"],"sourcesContent":["<template>\n <u-table\n :columns=\"internalColumns\"\n :data=\"modelValue || []\"\n :class=\"cls.b\"\n :stripe=\"false\"\n show-index\n :slots=\"$slots\"\n >\n <template #column:__operation=\"{ row }\">\n <ButtonCommonProps tag=\"div\" style=\"display: flex; justify-content: center; gap: 8px\">\n <u-button type=\"danger\" @click=\"handleDelete(row.index)\" :icon=\"Minus\" title=\"移除\" />\n <u-button :icon=\"Plus\" @click=\"handleCreate(row.index)\" title=\"新增到下一行\" />\n <u-button :icon=\"Copy\" @click=\"handleCopy(row)\" title=\"复制到下一行\" />\n </ButtonCommonProps>\n </template>\n\n <!-- <template #header:__operation> </template> -->\n\n <template #empty>\n <div style=\"text-align: center; padding: 4px 0\">\n <u-button\n text\n size=\"small\"\n type=\"primary\"\n v-if=\"!modelValue.length\"\n :icon=\"Plus\"\n @click=\"handleCreate()\"\n >添加</u-button\n >\n </div>\n </template>\n </u-table>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useComponentProps } from '@veltra/compositions'\nimport { Copy, Minus, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TableEditorProps, TableEditorEmits, TableColumn } from '../../types'\nimport { UButton } from '../button'\nimport { UTable } from '../table'\nimport type { TableRowNode } from '../table/node/row'\n\ndefineOptions({ name: 'UTableEditor' })\n\nconst { columns = [], modelValue = [] } = defineProps<TableEditorProps>()\nconst emit = defineEmits<TableEditorEmits>()\n\nconst cls = bem('table-editor')\n\nconst ButtonCommonProps = useComponentProps({\n size: 'small',\n circle: true,\n text: true,\n type: 'primary'\n})\n\nconst actionColumn: TableColumn = {\n key: '__operation',\n name: '操作', // 使用name而不是title\n width: 120,\n align: 'center',\n fixed: 'right',\n resizable: false\n}\n\n// 内部列定义,添加编辑和删除操作列\nconst internalColumns = computed(() => {\n return [...columns, actionColumn]\n})\n\nfunction handleCreate(index?: number) {\n if (index !== undefined) {\n emit('update:modelValue', [\n ...modelValue.slice(0, index + 1),\n {},\n ...modelValue.slice(index + 1)\n ])\n } else {\n emit('update:modelValue', [...modelValue, {}])\n }\n}\n\nfunction handleCopy(row: TableRowNode) {\n emit('update:modelValue', [\n ...modelValue.slice(0, row.index + 1),\n JSON.parse(JSON.stringify(row.data)),\n ...modelValue.slice(row.index + 1)\n ])\n}\n\nfunction handleDelete(index: number) {\n emit(\n 'update:modelValue',\n modelValue.filter((_, i) => i !== index)\n )\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAc;EAE9B,MAAM,oBAAoB,kBAAkB;GAC1C,MAAM;GACN,QAAQ;GACR,MAAM;GACN,MAAM;EACR,CAAC;EAED,MAAM,eAA4B;GAChC,KAAK;GACL,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,WAAW;EACb;EAGA,MAAM,kBAAkB,eAAe;GACrC,OAAO,CAAC,GAAG,QAAA,SAAS,YAAY;EAClC,CAAC;EAED,SAAS,aAAa,OAAgB;GACpC,IAAI,UAAU,KAAA,GACZ,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,QAAQ,CAAC;IAChC,CAAC;IACD,GAAG,QAAA,WAAW,MAAM,QAAQ,CAAC;GAC/B,CAAC;QAED,KAAK,qBAAqB,CAAC,GAAG,QAAA,YAAY,CAAC,CAAC,CAAC;EAEjD;EAEA,SAAS,WAAW,KAAmB;GACrC,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,IAAI,QAAQ,CAAC;IACpC,KAAK,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC;IACnC,GAAG,QAAA,WAAW,MAAM,IAAI,QAAQ,CAAC;GACnC,CAAC;EACH;EAEA,SAAS,aAAa,OAAe;GACnC,KACE,qBACA,QAAA,WAAW,QAAQ,GAAG,MAAM,MAAM,KAAK,CACzC;EACF;;uBAlGE,YA+BU,MAAA,WAAA,GAAA;IA9BP,SAAS,gBAAA;IACT,MAAM,QAAA,cAAU,CAAA;IAChB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IACZ,QAAQ;IACT,cAAA;IACC,OAAOA,KAAAA;;IAEG,sBAAkB,SAKP,EALW,UAAG,CAClC,YAIoB,MAAA,iBAAA,GAAA;KAJD,KAAI;KAAM,OAAA;MAAA,WAAA;MAAA,mBAAA;MAAA,OAAA;KAAA;;4BACyD;MAApF,YAAoF,MAAA,WAAA,GAAA;OAA1E,MAAK;OAAU,UAAK,WAAE,aAAa,IAAI,KAAK;OAAI,MAAM,MAAA,KAAA;OAAO,OAAM;;MAC7E,YAAyE,MAAA,WAAA,GAAA;OAA9D,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,aAAa,IAAI,KAAK;OAAG,OAAM;;MAC9D,YAAiE,MAAA,WAAA,GAAA;OAAtD,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,WAAW,GAAG;OAAG,OAAM;;;;;IAM/C,OAAK,cAWR,CAVN,mBAUM,OAVN,YAUM,CAAA,CALK,QAAA,WAAW,UAAA,UAAA,GAJpB,YAQC,MAAA,WAAA,GAAA;;KAPC,MAAA;KACA,MAAK;KACL,MAAK;KAEJ,MAAM,MAAA,IAAA;KACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,aAAY;;4BACjB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAF,MAAE,EAAA,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"table-editor.js","names":["$slots"],"sources":["../../../src/components/table-editor/table-editor.vue"],"sourcesContent":["<template>\n <u-table\n :columns=\"internalColumns\"\n :data=\"modelValue || []\"\n :class=\"cls.b\"\n :stripe=\"false\"\n show-index\n :slots=\"$slots\"\n >\n <template #column:__operation=\"{ row }\">\n <ButtonCommonProps tag=\"div\" style=\"display: flex; justify-content: center; gap: 8px\">\n <u-button type=\"danger\" @click=\"handleDelete(row.index)\" :icon=\"Minus\" title=\"移除\" />\n <u-button :icon=\"Plus\" @click=\"handleCreate(row.index)\" title=\"新增到下一行\" />\n <u-button :icon=\"Copy\" @click=\"handleCopy(row)\" title=\"复制到下一行\" />\n </ButtonCommonProps>\n </template>\n\n <!-- <template #header:__operation> </template> -->\n\n <template #empty>\n <div style=\"text-align: center; padding: 4px 0\">\n <u-button\n text\n size=\"small\"\n type=\"primary\"\n v-if=\"!modelValue.length\"\n :icon=\"Plus\"\n @click=\"handleCreate()\"\n >添加</u-button\n >\n </div>\n </template>\n </u-table>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useComponentProps } from '@veltra/compositions'\nimport { Copy, Minus, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TableEditorProps, TableEditorEmits, TableColumn } from '../../types'\nimport { UButton } from '../button'\nimport { UTable } from '../table'\nimport type { TableRowNode } from '../table/node/row'\n\ndefineOptions({ name: 'UTableEditor' })\n\nconst { columns = [], modelValue = [] } = defineProps<TableEditorProps>()\nconst emit = defineEmits<TableEditorEmits>()\n\nconst cls = bem('table-editor')\n\nconst ButtonCommonProps = useComponentProps({\n size: 'small',\n circle: true,\n text: true,\n type: 'primary'\n})\n\nconst actionColumn: TableColumn = {\n key: '__operation',\n name: '操作', // 使用name而不是title\n width: 120,\n align: 'center',\n fixed: 'right',\n resizable: false\n}\n\n// 内部列定义,添加编辑和删除操作列\nconst internalColumns = computed(() => {\n return [...columns, actionColumn]\n})\n\nfunction handleCreate(index?: number) {\n if (index !== undefined) {\n emit('update:modelValue', [\n ...modelValue.slice(0, index + 1),\n {},\n ...modelValue.slice(index + 1)\n ])\n } else {\n emit('update:modelValue', [...modelValue, {}])\n }\n}\n\nfunction handleCopy(row: TableRowNode) {\n emit('update:modelValue', [\n ...modelValue.slice(0, row.index + 1),\n JSON.parse(JSON.stringify(row.data)),\n ...modelValue.slice(row.index + 1)\n ])\n}\n\nfunction handleDelete(index: number) {\n emit(\n 'update:modelValue',\n modelValue.filter((_, i) => i !== index)\n )\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAc;EAE9B,MAAM,oBAAoB,kBAAkB;GAC1C,MAAM;GACN,QAAQ;GACR,MAAM;GACN,MAAM;EACR,CAAC;EAED,MAAM,eAA4B;GAChC,KAAK;GACL,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,WAAW;EACb;EAGA,MAAM,kBAAkB,eAAe;GACrC,OAAO,CAAC,GAAG,QAAA,SAAS,YAAY;EAClC,CAAC;EAED,SAAS,aAAa,OAAgB;GACpC,IAAI,UAAU,KAAA,GACZ,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,QAAQ,CAAC;IAChC,CAAC;IACD,GAAG,QAAA,WAAW,MAAM,QAAQ,CAAC;GAC/B,CAAC;QAED,KAAK,qBAAqB,CAAC,GAAG,QAAA,YAAY,CAAC,CAAC,CAAC;EAEjD;EAEA,SAAS,WAAW,KAAmB;GACrC,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,IAAI,QAAQ,CAAC;IACpC,KAAK,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC;IACnC,GAAG,QAAA,WAAW,MAAM,IAAI,QAAQ,CAAC;GACnC,CAAC;EACH;EAEA,SAAS,aAAa,OAAe;GACnC,KACE,qBACA,QAAA,WAAW,QAAQ,GAAG,MAAM,MAAM,KAAK,CACzC;EACF;;GAlGE,OAAA,UAAA,GAAA,YA+BU,MAAA,WAAA,GAAA;IA9BP,SAAS,gBAAA;IACT,MAAM,QAAA,cAAU,CAAA;IAChB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IACZ,QAAQ;IACT,cAAA;IACC,OAAOA,KAAAA;;IAEG,sBAAkB,SAKP,EALW,UAAG,CAClC,YAIoB,MAAA,iBAAA,GAAA;KAJD,KAAI;KAAM,OAAA;MAAA,WAAA;MAAA,mBAAA;MAAA,OAAA;KAAA;;KACyD,SAAA,cAAA;MAApF,YAAoF,MAAA,WAAA,GAAA;OAA1E,MAAK;OAAU,UAAK,WAAE,aAAa,IAAI,KAAK;OAAI,MAAM,MAAA,KAAA;OAAO,OAAM;;MAC7E,YAAyE,MAAA,WAAA,GAAA;OAA9D,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,aAAa,IAAI,KAAK;OAAG,OAAM;;MAC9D,YAAiE,MAAA,WAAA,GAAA;OAAtD,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,WAAW,GAAG;OAAG,OAAM;;;;;IAM/C,OAAK,cAWR,CAVN,mBAUM,OAVN,YAUM,CAAA,CALK,QAAA,WAAW,UAAA,UAAA,GAJpB,YAQC,MAAA,WAAA,GAAA;;KAPC,MAAA;KACA,MAAK;KACL,MAAK;KAEJ,MAAM,MAAA,IAAA;KACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,aAAY;;KACjB,SAAA,cAAA,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAF,MAAE,EAAA,CAAA,EAAA,CAAA"}
@@ -46,10 +46,11 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
46
46
  const model = useModel(__props, "modelValue");
47
47
  const viewportRef = shallowRef();
48
48
  const listRef = shallowRef();
49
+ const itemsRef = computed(() => props.items);
49
50
  const { showNav, canPrev, canNext, scrollByStep } = useTabsBar({
50
51
  viewportRef,
51
52
  listRef,
52
- items: computed(() => props.items),
53
+ items: itemsRef,
53
54
  model
54
55
  });
55
56
  const isItemClosable = (item) => {
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-horizontal.js","names":[],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon> <ArrowLeft /> </u-icon>\n </button>\n\n <div ref=\"viewportRef\" :class=\"cls.e('viewport')\">\n <div ref=\"listRef\" :class=\"cls.e('list')\">\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n </div>\n\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'next')]\"\n :disabled=\"!canNext\"\n @click=\"scrollByStep(1)\"\n >\n <u-icon> <ArrowRight /> </u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { ArrowLeft, ArrowRight, Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsHorizontalEmits, TabsHorizontalProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { useTabsBar } from './use-tabs-bar'\n\ndefineOptions({ name: 'UTabsHorizontal' })\n\nconst props = withDefaults(defineProps<TabsHorizontalProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsHorizontalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst viewportRef = shallowRef<HTMLElement>()\nconst listRef = shallowRef<HTMLElement>()\n\nconst itemsRef = computed(() => props.items)\n\nconst { showNav, canPrev, canNext, scrollByStep } = useTabsBar({\n viewportRef,\n listRef,\n items: itemsRef,\n model\n})\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"tabs-horizontal.js","names":[],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon> <ArrowLeft /> </u-icon>\n </button>\n\n <div ref=\"viewportRef\" :class=\"cls.e('viewport')\">\n <div ref=\"listRef\" :class=\"cls.e('list')\">\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n </div>\n\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'next')]\"\n :disabled=\"!canNext\"\n @click=\"scrollByStep(1)\"\n >\n <u-icon> <ArrowRight /> </u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { ArrowLeft, ArrowRight, Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsHorizontalEmits, TabsHorizontalProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { useTabsBar } from './use-tabs-bar'\n\ndefineOptions({ name: 'UTabsHorizontal' })\n\nconst props = withDefaults(defineProps<TabsHorizontalProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsHorizontalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst viewportRef = shallowRef<HTMLElement>()\nconst listRef = shallowRef<HTMLElement>()\n\nconst itemsRef = computed(() => props.items)\n\nconst { showNav, canPrev, canNext, scrollByStep } = useTabsBar({\n viewportRef,\n listRef,\n items: itemsRef,\n model\n})\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-vertical.js","names":[],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,kBAAkB,SAAkB;GACxC,IAAI,KAAK,UAAU,OAAO;GAC1B,OAAO,KAAK,YAAY,MAAM;EAChC;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,MAAM,QAAQ,KAAK;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;;uBA1EE,mBA+BM,OAAA,EA9BH,OAAK,eAAA;IAAG,MAAA,GAAA,CAAG,CAAC;IAAG,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA;IAAc,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ;IAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI;IAAG,MAAA,GAAA,CAAG,CAAC,GAAE,WAAY,QAAA,OAAO;GAAA,CAAA,EAAA,GAAA,EAAA,UAAA,IAAA,GAE1F,mBA2BS,UAAA,MAAA,WAxBiB,QAAA,QAAhB,MAAM,UAAK;wBAHrB,mBA2BS,UAAA;KA1BP,MAAK;KACL,MAAK;KAEJ,KAAK,KAAK;KACV,OAAK,eAAA;MAAY,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;MAAkB,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,MAAA,UAAU,KAAK,GAAG;MAAW,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,KAAK,aAAQ,IAAA;;KAKtH,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;QAEpC,WAEO,KAAA,QAAA,WAFP,WAEO,EAAA,SAAA,KAAA,GAAA;KAFS;KAAM;IAAK,CAAA,SAEpB,CADL,mBAAqE,QAAA,EAA9D,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EAAA,GAAA,gBAAmB,KAAK,QAAQ,KAAK,GAAG,GAAA,CAAA,CAAA,CAAA,GAGrD,eAAe,IAAI,KAAA,UAAA,GAD3B,mBAWO,QAAA;;KATL,MAAK;KACL,UAAS;KACR,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KACZ,cAAU,SAAW,KAAK,QAAQ,KAAK;KACvC,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;QAEpC,YAES,MAAA,WAAA,GAAA,MAAA;4BADE,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"tabs-vertical.js","names":[],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,kBAAkB,SAAkB;GACxC,IAAI,KAAK,UAAU,OAAO;GAC1B,OAAO,KAAK,YAAY,MAAM;EAChC;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,MAAM,QAAQ,KAAK;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;;GA1EE,OAAA,UAAA,GAAA,mBA+BM,OAAA,EA9BH,OAAK,eAAA;IAAG,MAAA,GAAA,CAAG,CAAC;IAAG,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA;IAAc,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ;IAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI;IAAG,MAAA,GAAA,CAAG,CAAC,GAAE,WAAY,QAAA,OAAO;GAAA,CAAA,EAAA,GAE1F,EAAA,UAAA,IAAA,GAAA,mBA2BS,UAAA,MAAA,WAxBiB,QAAA,QAAhB,MAAM,UAAK;IAHrB,OAAA,UAAA,GAAA,mBA2BS,UAAA;KA1BP,MAAK;KACL,MAAK;KAEJ,KAAK,KAAK;KACV,OAAK,eAAA;MAAY,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;MAAkB,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,MAAA,UAAU,KAAK,GAAG;MAAW,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,KAAK,aAAQ,IAAA;;KAKtH,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;IAEpC,GAAA,CAAA,WAEO,KAAA,QAAA,WAFP,WAEO,EAAA,SAAA,KAAA,GAAA;KAFS;KAAM;IAAK,CAAA,SAEpB,CADL,mBAAqE,QAAA,EAA9D,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EAAA,GAAmB,gBAAA,KAAK,QAAQ,KAAK,GAAG,GAAA,CAAA,CAAA,CAAA,GAGrD,eAAe,IAAI,KAAA,UAAA,GAD3B,mBAWO,QAAA;;KATL,MAAK;KACL,UAAS;KACR,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KACZ,cAAU,SAAW,KAAK,QAAQ,KAAK;KACvC,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;IAEpC,GAAA,CAAA,YAES,MAAA,WAAA,GAAA,MAAA;KADE,SAAA,cAAA,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.js","names":[],"sources":["../../../src/components/tabs/tabs.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(position!)]\">\n <u-tabs-horizontal\n v-if=\"isHorizontal\"\n v-model=\"model\"\n :items=\"items\"\n :position=\"horizontalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :block=\"block\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n <u-tabs-vertical\n v-else\n v-model=\"model\"\n :items=\"items\"\n :position=\"verticalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n\n <transition name=\"fade\" mode=\"out-in\">\n <KeepAlive v-if=\"keepAlive\">\n <component :key=\"model\" :is=\"renderSlots()\" />\n </KeepAlive>\n <component v-else :key=\"model\" :is=\"renderSlots()\" />\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, createVNode } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsEmits, TabsProps } from '../../types'\nimport { UScroll } from '../scroll'\nimport UTabsHorizontal from './tabs-horizontal.vue'\nimport UTabsVertical from './tabs-vertical.vue'\n\ndefineOptions({ name: 'UTabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false,\n keepAlive: false\n})\n\nconst emit = defineEmits<TabsEmits>()\n\nconst slots = defineSlots<Record<string, (props: any) => any>>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs')\n\nconst model = defineModel<string>()\n\nconst isHorizontal = computed(() => props.position === 'top' || props.position === 'bottom')\n\n/** 避免模板中使用类型断言:收敛 position 到水平 / 垂直子组件所需的子集。 */\nconst horizontalPosition = computed<'top' | 'bottom'>(() =>\n props.position === 'bottom' ? 'bottom' : 'top'\n)\n\nconst verticalPosition = computed<'left' | 'right'>(() =>\n props.position === 'right' ? 'right' : 'left'\n)\n\nconst onClick = (item: TabItem, index: number) => emit('click', item, index)\nconst onClose = (item: TabItem, index: number) => emit('close', item, index)\n\nconst renderSlots = () => {\n const key = model.value\n if (!key) return null\n const nodes = slots[key]?.({ key })\n if (Array.isArray(nodes)) {\n return createVNode(UScroll, { class: cls.e('content') }, { default: () => nodes })\n }\n return nodes\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAA;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,eAAe,eAAe,MAAM,aAAa,SAAS,MAAM,aAAa,QAAQ;;EAG3F,MAAM,qBAAqB,eACzB,MAAM,aAAa,WAAW,WAAW,KAC3C;EAEA,MAAM,mBAAmB,eACvB,MAAM,aAAa,UAAU,UAAU,MACzC;EAEA,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAC3E,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAE3E,MAAM,oBAAoB;GACxB,MAAM,MAAM,MAAM;GAClB,IAAI,CAAC,KAAK,OAAO;GACjB,MAAM,QAAQ,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC;GAClC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,YAAY,aAAS,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,MAAM,CAAC;GAEnF,OAAO;EACT;;uBAtFE,mBA+BM,OAAA,EA/BA,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,GAAG,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ,CAAA,CAAA,EAAA,GAAA,CAEzB,aAAA,SAAA,UAAA,GADR,YAWE,aAAA;;gBATS,MAAA;iEAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,mBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,OAAO,QAAA;IACP,SAAS,QAAA;IACF;IACA;;;;;;;;;uBAEV,YAUE,aAAA;;gBARS,MAAA;iEAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,iBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,SAAS,QAAA;IACF;IACA;;;;;;;;QAGV,YAKa,YAAA;IALD,MAAK;IAAO,MAAK;;2BAGf,CAFK,QAAA,aAAA,UAAA,GAAjB,YAEY,WAAA,EAAA,KAAA,EAAA,GAAA,EAAA,UAAA,GADV,YAA8C,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,GAAA,IAAA,MAAA,UAAA,GAExB,YAAqD,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"tabs.js","names":[],"sources":["../../../src/components/tabs/tabs.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(position!)]\">\n <u-tabs-horizontal\n v-if=\"isHorizontal\"\n v-model=\"model\"\n :items=\"items\"\n :position=\"horizontalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :block=\"block\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n <u-tabs-vertical\n v-else\n v-model=\"model\"\n :items=\"items\"\n :position=\"verticalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n\n <transition name=\"fade\" mode=\"out-in\">\n <KeepAlive v-if=\"keepAlive\">\n <component :key=\"model\" :is=\"renderSlots()\" />\n </KeepAlive>\n <component v-else :key=\"model\" :is=\"renderSlots()\" />\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, createVNode } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsEmits, TabsProps } from '../../types'\nimport { UScroll } from '../scroll'\nimport UTabsHorizontal from './tabs-horizontal.vue'\nimport UTabsVertical from './tabs-vertical.vue'\n\ndefineOptions({ name: 'UTabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false,\n keepAlive: false\n})\n\nconst emit = defineEmits<TabsEmits>()\n\nconst slots = defineSlots<Record<string, (props: any) => any>>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs')\n\nconst model = defineModel<string>()\n\nconst isHorizontal = computed(() => props.position === 'top' || props.position === 'bottom')\n\n/** 避免模板中使用类型断言:收敛 position 到水平 / 垂直子组件所需的子集。 */\nconst horizontalPosition = computed<'top' | 'bottom'>(() =>\n props.position === 'bottom' ? 'bottom' : 'top'\n)\n\nconst verticalPosition = computed<'left' | 'right'>(() =>\n props.position === 'right' ? 'right' : 'left'\n)\n\nconst onClick = (item: TabItem, index: number) => emit('click', item, index)\nconst onClose = (item: TabItem, index: number) => emit('close', item, index)\n\nconst renderSlots = () => {\n const key = model.value\n if (!key) return null\n const nodes = slots[key]?.({ key })\n if (Array.isArray(nodes)) {\n return createVNode(UScroll, { class: cls.e('content') }, { default: () => nodes })\n }\n return nodes\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAA;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,eAAe,eAAe,MAAM,aAAa,SAAS,MAAM,aAAa,QAAQ;;EAG3F,MAAM,qBAAqB,eACzB,MAAM,aAAa,WAAW,WAAW,KAC3C;EAEA,MAAM,mBAAmB,eACvB,MAAM,aAAa,UAAU,UAAU,MACzC;EAEA,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAC3E,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAE3E,MAAM,oBAAoB;GACxB,MAAM,MAAM,MAAM;GAClB,IAAI,CAAC,KAAK,OAAO;GACjB,MAAM,QAAQ,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC;GAClC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,YAAY,aAAS,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,MAAM,CAAC;GAEnF,OAAO;EACT;;GAtFE,OAAA,UAAA,GAAA,mBA+BM,OAAA,EA/BA,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,GAAG,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ,CAAA,CAAA,EAAA,GAEzB,CAAA,aAAA,SAAA,UAAA,GADR,YAWE,aAAA;;IATS,YAAA,MAAA;IAAA,uBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,mBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,OAAO,QAAA;IACP,SAAS,QAAA;IACF;IACA;;;;;;;;;GAEV,CAAA,MAAA,UAAA,GAAA,YAUE,aAAA;;IARS,YAAA,MAAA;IAAA,uBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,iBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,SAAS,QAAA;IACF;IACA;;;;;;;;GAGV,CAAA,IAAA,YAKa,YAAA;IALD,MAAK;IAAO,MAAK;;IAGf,SAAA,cAAA,CAFK,QAAA,aAAA,UAAA,GAAjB,YAEY,WAAA,EAAA,KAAA,EAAA,GAAA,EAAA,UAAA,GADV,YAA8C,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,GAAA,IAExB,MAAA,UAAA,GAAA,YAAqD,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,CAAA"}
@@ -1,8 +1,10 @@
1
1
  import { nextTick, onBeforeUnmount, onMounted, shallowRef, watch } from "vue";
2
2
  import { useResizeObserver } from "@veltra/compositions";
3
+ import { applyWheelHorizontalScroll, computeOverflowNavState, scrollElementIntoView, scrollViewportByStep } from "@veltra/utils";
3
4
  //#region src/components/tabs/use-tabs-bar.ts
4
5
  /**
5
- * 水平标签栏的溢出滚动逻辑:
6
+ * 水平标签栏的溢出滚动逻辑(滚动几何/滚轮转横滚/元素滚入视野共享
7
+ * @veltra/utils overflow-nav,见 #17;此处保留 useResizeObserver 与 watch 差异):
6
8
  * - 计算 nav 按钮显隐与可用状态
7
9
  * - 提供按步滚动与活动标签自动滚入视野的方法
8
10
  * - 绑定 wheel / scroll / resize 事件
@@ -16,20 +18,16 @@ function useTabsBar(options) {
16
18
  const updateNavState = () => {
17
19
  const vp = viewportRef.value;
18
20
  if (!vp) return;
19
- const { scrollLeft, scrollWidth, clientWidth } = vp;
20
- const overflowing = scrollWidth - clientWidth > 1;
21
- showNav.value = overflowing;
22
- canPrev.value = overflowing && scrollLeft > 0;
23
- canNext.value = overflowing && scrollLeft + clientWidth < scrollWidth - 1;
21
+ const state = computeOverflowNavState(vp);
22
+ showNav.value = state.overflowing;
23
+ canPrev.value = state.canPrev;
24
+ canNext.value = state.canNext;
24
25
  };
25
26
  /** 箭头按钮:按视口宽度 80% 的步长平滑滚动 */
26
27
  const scrollByStep = (dir) => {
27
28
  const vp = viewportRef.value;
28
29
  if (!vp) return;
29
- vp.scrollTo({
30
- left: vp.scrollLeft + dir * vp.clientWidth * .8,
31
- behavior: "smooth"
32
- });
30
+ scrollViewportByStep(vp, dir);
33
31
  };
34
32
  /** 活动标签自动滚入视野 */
35
33
  const ensureActiveVisible = () => {
@@ -42,26 +40,13 @@ function useTabsBar(options) {
42
40
  if (activeIndex < 0) return;
43
41
  const el = list.children[activeIndex];
44
42
  if (!el) return;
45
- const vpRect = vp.getBoundingClientRect();
46
- const elRect = el.getBoundingClientRect();
47
- if (elRect.left < vpRect.left) vp.scrollTo({
48
- left: vp.scrollLeft + (elRect.left - vpRect.left) - 8,
49
- behavior: "smooth"
50
- });
51
- else if (elRect.right > vpRect.right) vp.scrollTo({
52
- left: vp.scrollLeft + (elRect.right - vpRect.right) + 8,
53
- behavior: "smooth"
54
- });
43
+ scrollElementIntoView(vp, el);
55
44
  };
56
45
  /** 鼠标滚轮(纵向)驱动水平滚动;触控板横滑(已有 deltaX)不拦截 */
57
46
  const handleWheel = (e) => {
58
- if (!showNav.value) return;
59
47
  const vp = viewportRef.value;
60
48
  if (!vp) return;
61
- if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return;
62
- if (e.deltaY === 0) return;
63
- e.preventDefault();
64
- vp.scrollLeft += e.deltaY;
49
+ applyWheelHorizontalScroll(e, vp, showNav.value);
65
50
  };
66
51
  useResizeObserver({
67
52
  targets: [viewportRef, listRef],
@@ -1 +1 @@
1
- {"version":3,"file":"use-tabs-bar.js","names":[],"sources":["../../../src/components/tabs/use-tabs-bar.ts"],"sourcesContent":["import { useResizeObserver } from '@veltra/compositions'\nimport {\n type ModelRef,\n type Ref,\n type ShallowRef,\n nextTick,\n onBeforeUnmount,\n onMounted,\n shallowRef,\n watch\n} from 'vue'\n\nimport type { TabItem } from '../../types'\n\ninterface UseTabsBarOptions {\n viewportRef: ShallowRef<HTMLElement | undefined>\n listRef: ShallowRef<HTMLElement | undefined>\n items: Ref<TabItem[]>\n model: ModelRef<string | undefined>\n}\n\n/**\n * 水平标签栏的溢出滚动逻辑:\n * - 计算 nav 按钮显隐与可用状态\n * - 提供按步滚动与活动标签自动滚入视野的方法\n * - 绑定 wheel / scroll / resize 事件\n */\nexport function useTabsBar(options: UseTabsBarOptions) {\n const { viewportRef, listRef, items, model } = options\n\n const showNav = shallowRef(false)\n const canPrev = shallowRef(false)\n const canNext = shallowRef(false)\n\n /** 依据 viewport 与内容尺寸推导滚动按钮可用状态 */\n const updateNavState = () => {\n const vp = viewportRef.value\n if (!vp) return\n const { scrollLeft, scrollWidth, clientWidth } = vp\n const overflowing = scrollWidth - clientWidth > 1\n showNav.value = overflowing\n canPrev.value = overflowing && scrollLeft > 0\n canNext.value = overflowing && scrollLeft + clientWidth < scrollWidth - 1\n }\n\n /** 箭头按钮:按视口宽度 80% 的步长平滑滚动 */\n const scrollByStep = (dir: 1 | -1) => {\n const vp = viewportRef.value\n if (!vp) return\n vp.scrollTo({ left: vp.scrollLeft + dir * vp.clientWidth * 0.8, behavior: 'smooth' })\n }\n\n /** 活动标签自动滚入视野 */\n const ensureActiveVisible = () => {\n const vp = viewportRef.value\n const list = listRef.value\n if (!vp || !list) return\n const activeKey = model.value\n if (!activeKey) return\n const activeIndex = items.value.findIndex((i) => i.key === activeKey)\n if (activeIndex < 0) return\n const el = list.children[activeIndex] as HTMLElement | undefined\n if (!el) return\n\n const vpRect = vp.getBoundingClientRect()\n const elRect = el.getBoundingClientRect()\n if (elRect.left < vpRect.left) {\n vp.scrollTo({ left: vp.scrollLeft + (elRect.left - vpRect.left) - 8, behavior: 'smooth' })\n } else if (elRect.right > vpRect.right) {\n vp.scrollTo({ left: vp.scrollLeft + (elRect.right - vpRect.right) + 8, behavior: 'smooth' })\n }\n }\n\n /** 鼠标滚轮(纵向)驱动水平滚动;触控板横滑(已有 deltaX)不拦截 */\n const handleWheel = (e: WheelEvent) => {\n if (!showNav.value) return\n const vp = viewportRef.value\n if (!vp) return\n if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return\n if (e.deltaY === 0) return\n e.preventDefault()\n vp.scrollLeft += e.deltaY\n }\n\n useResizeObserver({ targets: [viewportRef, listRef], onResize: () => updateNavState() })\n\n watch(model, async () => {\n await nextTick()\n ensureActiveVisible()\n })\n\n watch(\n items,\n async () => {\n await nextTick()\n updateNavState()\n ensureActiveVisible()\n },\n { deep: false }\n )\n\n onMounted(() => {\n const vp = viewportRef.value\n if (!vp) return\n vp.addEventListener('wheel', handleWheel, { passive: false })\n vp.addEventListener('scroll', updateNavState, { passive: true })\n updateNavState()\n nextTick(ensureActiveVisible)\n })\n\n onBeforeUnmount(() => {\n const vp = viewportRef.value\n if (!vp) return\n vp.removeEventListener('wheel', handleWheel)\n vp.removeEventListener('scroll', updateNavState)\n })\n\n return { showNav, canPrev, canNext, updateNavState, scrollByStep, ensureActiveVisible }\n}\n"],"mappings":";;;;;;;;;AA2BA,SAAgB,WAAW,SAA4B;CACrD,MAAM,EAAE,aAAa,SAAS,OAAO,UAAU;CAE/C,MAAM,UAAU,WAAW,KAAK;CAChC,MAAM,UAAU,WAAW,KAAK;CAChC,MAAM,UAAU,WAAW,KAAK;;CAGhC,MAAM,uBAAuB;EAC3B,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,MAAM,EAAE,YAAY,aAAa,gBAAgB;EACjD,MAAM,cAAc,cAAc,cAAc;EAChD,QAAQ,QAAQ;EAChB,QAAQ,QAAQ,eAAe,aAAa;EAC5C,QAAQ,QAAQ,eAAe,aAAa,cAAc,cAAc;CAC1E;;CAGA,MAAM,gBAAgB,QAAgB;EACpC,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,GAAG,SAAS;GAAE,MAAM,GAAG,aAAa,MAAM,GAAG,cAAc;GAAK,UAAU;EAAS,CAAC;CACtF;;CAGA,MAAM,4BAA4B;EAChC,MAAM,KAAK,YAAY;EACvB,MAAM,OAAO,QAAQ;EACrB,IAAI,CAAC,MAAM,CAAC,MAAM;EAClB,MAAM,YAAY,MAAM;EACxB,IAAI,CAAC,WAAW;EAChB,MAAM,cAAc,MAAM,MAAM,WAAW,MAAM,EAAE,QAAQ,SAAS;EACpE,IAAI,cAAc,GAAG;EACrB,MAAM,KAAK,KAAK,SAAS;EACzB,IAAI,CAAC,IAAI;EAET,MAAM,SAAS,GAAG,sBAAsB;EACxC,MAAM,SAAS,GAAG,sBAAsB;EACxC,IAAI,OAAO,OAAO,OAAO,MACvB,GAAG,SAAS;GAAE,MAAM,GAAG,cAAc,OAAO,OAAO,OAAO,QAAQ;GAAG,UAAU;EAAS,CAAC;OACpF,IAAI,OAAO,QAAQ,OAAO,OAC/B,GAAG,SAAS;GAAE,MAAM,GAAG,cAAc,OAAO,QAAQ,OAAO,SAAS;GAAG,UAAU;EAAS,CAAC;CAE/F;;CAGA,MAAM,eAAe,MAAkB;EACrC,IAAI,CAAC,QAAQ,OAAO;EACpB,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,IAAI,KAAK,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG;EAC7C,IAAI,EAAE,WAAW,GAAG;EACpB,EAAE,eAAe;EACjB,GAAG,cAAc,EAAE;CACrB;CAEA,kBAAkB;EAAE,SAAS,CAAC,aAAa,OAAO;EAAG,gBAAgB,eAAe;CAAE,CAAC;CAEvF,MAAM,OAAO,YAAY;EACvB,MAAM,SAAS;EACf,oBAAoB;CACtB,CAAC;CAED,MACE,OACA,YAAY;EACV,MAAM,SAAS;EACf,eAAe;EACf,oBAAoB;CACtB,GACA,EAAE,MAAM,MAAM,CAChB;CAEA,gBAAgB;EACd,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,GAAG,iBAAiB,SAAS,aAAa,EAAE,SAAS,MAAM,CAAC;EAC5D,GAAG,iBAAiB,UAAU,gBAAgB,EAAE,SAAS,KAAK,CAAC;EAC/D,eAAe;EACf,SAAS,mBAAmB;CAC9B,CAAC;CAED,sBAAsB;EACpB,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,GAAG,oBAAoB,SAAS,WAAW;EAC3C,GAAG,oBAAoB,UAAU,cAAc;CACjD,CAAC;CAED,OAAO;EAAE;EAAS;EAAS;EAAS;EAAgB;EAAc;CAAoB;AACxF"}
1
+ {"version":3,"file":"use-tabs-bar.js","names":[],"sources":["../../../src/components/tabs/use-tabs-bar.ts"],"sourcesContent":["import { useResizeObserver } from '@veltra/compositions'\nimport {\n applyWheelHorizontalScroll,\n computeOverflowNavState,\n scrollElementIntoView,\n scrollViewportByStep\n} from '@veltra/utils'\nimport {\n type ModelRef,\n type Ref,\n type ShallowRef,\n nextTick,\n onBeforeUnmount,\n onMounted,\n shallowRef,\n watch\n} from 'vue'\n\nimport type { TabItem } from '../../types'\n\ninterface UseTabsBarOptions {\n viewportRef: ShallowRef<HTMLElement | undefined>\n listRef: ShallowRef<HTMLElement | undefined>\n items: Ref<TabItem[]>\n model: ModelRef<string | undefined>\n}\n\n/**\n * 水平标签栏的溢出滚动逻辑(滚动几何/滚轮转横滚/元素滚入视野共享\n * @veltra/utils overflow-nav,见 #17;此处保留 useResizeObserver 与 watch 差异):\n * - 计算 nav 按钮显隐与可用状态\n * - 提供按步滚动与活动标签自动滚入视野的方法\n * - 绑定 wheel / scroll / resize 事件\n */\nexport function useTabsBar(options: UseTabsBarOptions) {\n const { viewportRef, listRef, items, model } = options\n\n const showNav = shallowRef(false)\n const canPrev = shallowRef(false)\n const canNext = shallowRef(false)\n\n /** 依据 viewport 与内容尺寸推导滚动按钮可用状态 */\n const updateNavState = () => {\n const vp = viewportRef.value\n if (!vp) return\n const state = computeOverflowNavState(vp)\n showNav.value = state.overflowing\n canPrev.value = state.canPrev\n canNext.value = state.canNext\n }\n\n /** 箭头按钮:按视口宽度 80% 的步长平滑滚动 */\n const scrollByStep = (dir: 1 | -1) => {\n const vp = viewportRef.value\n if (!vp) return\n scrollViewportByStep(vp, dir)\n }\n\n /** 活动标签自动滚入视野 */\n const ensureActiveVisible = () => {\n const vp = viewportRef.value\n const list = listRef.value\n if (!vp || !list) return\n const activeKey = model.value\n if (!activeKey) return\n const activeIndex = items.value.findIndex((i) => i.key === activeKey)\n if (activeIndex < 0) return\n const el = list.children[activeIndex] as HTMLElement | undefined\n if (!el) return\n scrollElementIntoView(vp, el)\n }\n\n /** 鼠标滚轮(纵向)驱动水平滚动;触控板横滑(已有 deltaX)不拦截 */\n const handleWheel = (e: WheelEvent) => {\n const vp = viewportRef.value\n if (!vp) return\n applyWheelHorizontalScroll(e, vp, showNav.value)\n }\n\n useResizeObserver({ targets: [viewportRef, listRef], onResize: () => updateNavState() })\n\n watch(model, async () => {\n await nextTick()\n ensureActiveVisible()\n })\n\n watch(\n items,\n async () => {\n await nextTick()\n updateNavState()\n ensureActiveVisible()\n },\n { deep: false }\n )\n\n onMounted(() => {\n const vp = viewportRef.value\n if (!vp) return\n vp.addEventListener('wheel', handleWheel, { passive: false })\n vp.addEventListener('scroll', updateNavState, { passive: true })\n updateNavState()\n nextTick(ensureActiveVisible)\n })\n\n onBeforeUnmount(() => {\n const vp = viewportRef.value\n if (!vp) return\n vp.removeEventListener('wheel', handleWheel)\n vp.removeEventListener('scroll', updateNavState)\n })\n\n return { showNav, canPrev, canNext, updateNavState, scrollByStep, ensureActiveVisible }\n}\n"],"mappings":";;;;;;;;;;;AAkCA,SAAgB,WAAW,SAA4B;CACrD,MAAM,EAAE,aAAa,SAAS,OAAO,UAAU;CAE/C,MAAM,UAAU,WAAW,KAAK;CAChC,MAAM,UAAU,WAAW,KAAK;CAChC,MAAM,UAAU,WAAW,KAAK;;CAGhC,MAAM,uBAAuB;EAC3B,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,MAAM,QAAQ,wBAAwB,EAAE;EACxC,QAAQ,QAAQ,MAAM;EACtB,QAAQ,QAAQ,MAAM;EACtB,QAAQ,QAAQ,MAAM;CACxB;;CAGA,MAAM,gBAAgB,QAAgB;EACpC,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,qBAAqB,IAAI,GAAG;CAC9B;;CAGA,MAAM,4BAA4B;EAChC,MAAM,KAAK,YAAY;EACvB,MAAM,OAAO,QAAQ;EACrB,IAAI,CAAC,MAAM,CAAC,MAAM;EAClB,MAAM,YAAY,MAAM;EACxB,IAAI,CAAC,WAAW;EAChB,MAAM,cAAc,MAAM,MAAM,WAAW,MAAM,EAAE,QAAQ,SAAS;EACpE,IAAI,cAAc,GAAG;EACrB,MAAM,KAAK,KAAK,SAAS;EACzB,IAAI,CAAC,IAAI;EACT,sBAAsB,IAAI,EAAE;CAC9B;;CAGA,MAAM,eAAe,MAAkB;EACrC,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,2BAA2B,GAAG,IAAI,QAAQ,KAAK;CACjD;CAEA,kBAAkB;EAAE,SAAS,CAAC,aAAa,OAAO;EAAG,gBAAgB,eAAe;CAAE,CAAC;CAEvF,MAAM,OAAO,YAAY;EACvB,MAAM,SAAS;EACf,oBAAoB;CACtB,CAAC;CAED,MACE,OACA,YAAY;EACV,MAAM,SAAS;EACf,eAAe;EACf,oBAAoB;CACtB,GACA,EAAE,MAAM,MAAM,CAChB;CAEA,gBAAgB;EACd,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,GAAG,iBAAiB,SAAS,aAAa,EAAE,SAAS,MAAM,CAAC;EAC5D,GAAG,iBAAiB,UAAU,gBAAgB,EAAE,SAAS,KAAK,CAAC;EAC/D,eAAe;EACf,SAAS,mBAAmB;CAC9B,CAAC;CAED,sBAAsB;EACpB,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,GAAG,oBAAoB,SAAS,WAAW;EAC3C,GAAG,oBAAoB,UAAU,cAAc;CACjD,CAAC;CAED,OAAO;EAAE;EAAS;EAAS;EAAS;EAAgB;EAAc;CAAoB;AACxF"}
@@ -1 +1 @@
1
- export { };
1
+ export {}
@@ -1 +1 @@
1
- {"version":3,"file":"tag.js","names":[],"sources":["../../../src/components/tag/tag.vue"],"sourcesContent":["<template>\n <span :class=\"className\">\n <span :class=\"cls.e('content')\">\n <slot />\n </span>\n\n <u-icon v-if=\"closable\" @click.stop=\"handleClose\" :class=\"cls.e('icon-close')\">\n <Close />\n </u-icon>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TagEmits, TagProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTag' })\n\nconst cls = bem('tag')\n\nconst props = defineProps<TagProps>()\n\nconst emit = defineEmits<TagEmits>()\n\nconst { formProps } = injectFormContext()\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst handleClose = () => {\n emit('close')\n}\n\nconst className = computed(() => {\n const { type } = props\n return [\n cls.b,\n cls.m(size.value),\n type && cls.m('color-' + type),\n bem.is('round', props.round),\n bem.is('dark', props.dark)\n ]\n})\n\n// const classRound = computed(() => {\n// return [bem.is('round', props.round)]\n// })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,MAAM,IAAI,KAAK;EAErB,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,SAAS,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAEnF,MAAM,oBAAoB;GACxB,KAAK,OAAO;EACd;EAEA,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,SAAS;GACjB,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,QAAQ,IAAI,EAAE,WAAW,IAAI;IAC7B,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,QAAQ,MAAM,IAAI;GAC3B;EACF,CAAC;;uBA7CC,mBAQO,QAAA,EARA,OAAK,eAAE,UAAA,KAAS,EAAA,GAAA,CACrB,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAA,GAAA,CACjB,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,GAGI,QAAA,YAAA,UAAA,GAAd,YAES,MAAA,WAAA,GAAA;;IAFgB,SAAK,cAAO,aAAW,CAAA,MAAA,CAAA;IAAG,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;;2BACpD,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"tag.js","names":[],"sources":["../../../src/components/tag/tag.vue"],"sourcesContent":["<template>\n <span :class=\"className\">\n <span :class=\"cls.e('content')\">\n <slot />\n </span>\n\n <u-icon v-if=\"closable\" @click.stop=\"handleClose\" :class=\"cls.e('icon-close')\">\n <Close />\n </u-icon>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TagEmits, TagProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTag' })\n\nconst cls = bem('tag')\n\nconst props = defineProps<TagProps>()\n\nconst emit = defineEmits<TagEmits>()\n\nconst { formProps } = injectFormContext()\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst handleClose = () => {\n emit('close')\n}\n\nconst className = computed(() => {\n const { type } = props\n return [\n cls.b,\n cls.m(size.value),\n type && cls.m('color-' + type),\n bem.is('round', props.round),\n bem.is('dark', props.dark)\n ]\n})\n\n// const classRound = computed(() => {\n// return [bem.is('round', props.round)]\n// })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,MAAM,IAAI,KAAK;EAErB,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,SAAS,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAEnF,MAAM,oBAAoB;GACxB,KAAK,OAAO;EACd;EAEA,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,SAAS;GACjB,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,QAAQ,IAAI,EAAE,WAAW,IAAI;IAC7B,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,QAAQ,MAAM,IAAI;GAC3B;EACF,CAAC;;GA7CC,OAAA,UAAA,GAAA,mBAQO,QAAA,EARA,OAAK,eAAE,UAAA,KAAS,EAAA,GACrB,CAAA,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAA,GACjB,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAGI,GAAA,QAAA,YAAA,UAAA,GAAd,YAES,MAAA,WAAA,GAAA;;IAFgB,SAAK,cAAO,aAAW,CAAA,MAAA,CAAA;IAAG,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;;IACpD,SAAA,cAAA,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- export { };
1
+ export {}
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","names":[],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({ name: 'UText' })\n\nconst props = withDefaults(defineProps<TextProps>(), { as: 'content' })\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = { fontSize: withUnit(props.fontSize, 'px') }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,EAAE;IAAG,IAAI,GAAG,QAAQ,MAAM,IAAI;IAAG,IAAI,GAAG,UAAU,MAAM,MAAM;GAAC;EAC7F,CAAC;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAAE,UAAU,SAAS,MAAM,UAAU,IAAI,EAAE;GACxE,MAAM,EAAE,SAAS,cAAc;GAC/B,IAAI,SACF,MAAM,iBAAiB;GAEzB,IAAI,WACF,MAAM,iBAAiB;GAGzB,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,SAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,UAAU;GAC9B,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,IAAI,CAAC;GAEzD,MAAM,EAAE,cAAc;GAEtB,IAAI,CAAC,WACH,OAAO;GAGT,OAAO,UAAU,QAAQ,OAAO,aAAa;IAM3C,mBAJE,SAAS,UACT,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS,CAGnD,CAAA,CAAO,SAAS,UAAU;KACxB,IAAI,MAAM,WACR,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;UAEhC,MAAM,KAAK,gBAAgB,MAAM,IAAI,CAAC;IAE1C,CAAC;IAED,OAAO;GACT,GAAG,CAAC,CAAY;EAClB;;uBAjEE,mBAEI,KAAA;IAFA,OAAK,eAAE,UAAA,KAAS;IAAG,OAAK,eAAE,MAAA,KAAK;OACjC,YAAkD,MAAA,UAAA,GAAA;IAApC,SAAS,aAAY;IAAI,KAAI"}
1
+ {"version":3,"file":"text.js","names":[],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({ name: 'UText' })\n\nconst props = withDefaults(defineProps<TextProps>(), { as: 'content' })\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = { fontSize: withUnit(props.fontSize, 'px') }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,EAAE;IAAG,IAAI,GAAG,QAAQ,MAAM,IAAI;IAAG,IAAI,GAAG,UAAU,MAAM,MAAM;GAAC;EAC7F,CAAC;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAAE,UAAU,SAAS,MAAM,UAAU,IAAI,EAAE;GACxE,MAAM,EAAE,SAAS,cAAc;GAC/B,IAAI,SACF,MAAM,iBAAiB;GAEzB,IAAI,WACF,MAAM,iBAAiB;GAGzB,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,SAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,UAAU;GAC9B,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,IAAI,CAAC;GAEzD,MAAM,EAAE,cAAc;GAEtB,IAAI,CAAC,WACH,OAAO;GAGT,OAAO,UAAU,QAAQ,OAAO,aAAa;IAM3C,mBAJE,SAAS,UACT,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS,CAGnD,CAAA,CAAO,SAAS,UAAU;KACxB,IAAI,MAAM,WACR,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;UAEhC,MAAM,KAAK,gBAAgB,MAAM,IAAI,CAAC;IAE1C,CAAC;IAED,OAAO;GACT,GAAG,CAAC,CAAY;EAClB;;GAjEE,OAAA,UAAA,GAAA,mBAEI,KAAA;IAFA,OAAK,eAAE,UAAA,KAAS;IAAG,OAAK,eAAE,MAAA,KAAK;GACjC,GAAA,CAAA,YAAkD,MAAA,UAAA,GAAA;IAApC,SAAS,aAAY;IAAI,KAAI"}