@veltra/desktop 1.4.0 → 1.5.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 (442) 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.map +1 -1
  20. package/dist/components/calendar/calendar.js.map +1 -1
  21. package/dist/components/calendar/style.d.ts +1 -1
  22. package/dist/components/card/card-action.js.map +1 -1
  23. package/dist/components/card/card-content.js.map +1 -1
  24. package/dist/components/card/card-cover.js.map +1 -1
  25. package/dist/components/card/card-header.js.map +1 -1
  26. package/dist/components/card/card.js.map +1 -1
  27. package/dist/components/card/style.d.ts +1 -1
  28. package/dist/components/cascade/cascade-panel-item.js.map +1 -1
  29. package/dist/components/cascade/cascade.js.map +1 -1
  30. package/dist/components/check-tag/check-tag.js.map +1 -1
  31. package/dist/components/check-tag/style.d.ts +1 -1
  32. package/dist/components/checkbox/checkbox-button.js.map +1 -1
  33. package/dist/components/checkbox/checkbox.js.map +1 -1
  34. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  35. package/dist/components/code-editor/basic-setup.js +2 -2
  36. package/dist/components/code-editor/code-editor.js +2 -2
  37. package/dist/components/code-editor/code-editor.js.map +1 -1
  38. package/dist/components/code-editor/lang-loaders.js +1 -1
  39. package/dist/components/code-editor/shell-extension.js +2 -2
  40. package/dist/components/collapse/collapse-item.js.map +1 -1
  41. package/dist/components/collapse/collapse.js.map +1 -1
  42. package/dist/components/collapse/style.d.ts +1 -1
  43. package/dist/components/condition-editor/components/condition-group.js.map +1 -1
  44. package/dist/components/condition-editor/components/condition-row.js.map +1 -1
  45. package/dist/components/condition-editor/condition-editor.js.map +1 -1
  46. package/dist/components/condition-editor/index.d.ts +2 -2
  47. package/dist/components/contextmenu/contextmenu-item.js +13 -6
  48. package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
  49. package/dist/components/contextmenu/contextmenu-panel.js +12 -6
  50. package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
  51. package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
  52. package/dist/components/contextmenu/contextmenu.js.map +1 -1
  53. package/dist/components/contextmenu/di.d.ts +15 -0
  54. package/dist/components/contextmenu/index.d.ts +3 -2
  55. package/dist/components/contextmenu/style2.css +13 -0
  56. package/dist/components/date-panel/date-panel.js.map +1 -1
  57. package/dist/components/date-panel/headers/day.js.map +1 -1
  58. package/dist/components/date-panel/headers/month.js.map +1 -1
  59. package/dist/components/date-panel/headers/year.js.map +1 -1
  60. package/dist/components/date-panel/panels/day.js.map +1 -1
  61. package/dist/components/date-panel/panels/month.js.map +1 -1
  62. package/dist/components/date-panel/panels/year.js.map +1 -1
  63. package/dist/components/date-panel/style.d.ts +1 -1
  64. package/dist/components/date-picker/date-picker.js.map +1 -1
  65. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  66. package/dist/components/dialog/dialog.js.map +1 -1
  67. package/dist/components/drawer/drawer.js.map +1 -1
  68. package/dist/components/dropdown/dropdown.js.map +1 -1
  69. package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
  70. package/dist/components/dual-nav/dual-nav.js.map +1 -1
  71. package/dist/components/empty/empty.js.map +1 -1
  72. package/dist/components/empty/style.d.ts +1 -1
  73. package/dist/components/expression-editor/components/path-preview.js.map +1 -1
  74. package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
  75. package/dist/components/expression-editor/core/editor.js.map +1 -1
  76. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  77. package/dist/components/expression-editor/style.d.ts +1 -1
  78. package/dist/components/file-picker/file-picker.js.map +1 -1
  79. package/dist/components/file-picker/style.d.ts +1 -1
  80. package/dist/components/file-viewer/file-viewer.js.map +1 -1
  81. package/dist/components/file-viewer/helper.js +1 -38
  82. package/dist/components/file-viewer/helper.js.map +1 -1
  83. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
  84. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
  85. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
  86. package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
  87. package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
  88. package/dist/components/file-viewer/previewers/sheet-previewer.js +68 -37
  89. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
  90. package/dist/components/file-viewer/previewers/text-previewer.js +2 -2
  91. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
  92. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
  93. package/dist/components/file-viewer/style.d.ts +1 -1
  94. package/dist/components/float-button/float-button.js.map +1 -1
  95. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
  96. package/dist/components/form/style.d.ts +1 -1
  97. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/components/form-item/style.d.ts +1 -1
  99. package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
  100. package/dist/components/gantt-chart/style.d.ts +1 -1
  101. package/dist/components/grid/grid-item.js.map +1 -1
  102. package/dist/components/grid/grid.js +3 -2
  103. package/dist/components/grid/grid.js.map +1 -1
  104. package/dist/components/grid/style.d.ts +1 -1
  105. package/dist/components/grid-input/grid-input.js.map +1 -1
  106. package/dist/components/grid-input/style.d.ts +1 -1
  107. package/dist/components/group-input/group-input.js.map +1 -1
  108. package/dist/components/group-nav/group-nav-item.js.map +1 -1
  109. package/dist/components/group-nav/group-nav.js.map +1 -1
  110. package/dist/components/group-nav/style.d.ts +1 -1
  111. package/dist/components/icon/icon.js.map +1 -1
  112. package/dist/components/icon/style.d.ts +1 -1
  113. package/dist/components/index.d.ts +91 -156
  114. package/dist/components/index.js +4 -1
  115. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  116. package/dist/components/kbd/kbd.js.map +1 -1
  117. package/dist/components/kbd/style.d.ts +1 -1
  118. package/dist/components/layout/layout-resizer.js.map +1 -1
  119. package/dist/components/layout/layout.js.map +1 -1
  120. package/dist/components/layout/style.d.ts +1 -1
  121. package/dist/components/list/list-item.js.map +1 -1
  122. package/dist/components/list/list.js.map +1 -1
  123. package/dist/components/loading/directive.js +2 -1
  124. package/dist/components/loading/directive.js.map +1 -1
  125. package/dist/components/loading/index.d.ts +2 -2
  126. package/dist/components/loading/loading.js.map +1 -1
  127. package/dist/components/message/index.d.ts +2 -2
  128. package/dist/components/message/message-box.js.map +1 -1
  129. package/dist/components/message/message.js.map +1 -1
  130. package/dist/components/message/style.d.ts +1 -1
  131. package/dist/components/message-confirm/index.d.ts +2 -2
  132. package/dist/components/message-confirm/message-confirm-box.js.map +1 -1
  133. package/dist/components/message-confirm/message-confirm.js.map +1 -1
  134. package/dist/components/message-confirm/style.d.ts +1 -1
  135. package/dist/components/message-confirm/style2.css +18 -0
  136. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  137. package/dist/components/multi-select/multi-select.js +6 -3
  138. package/dist/components/multi-select/multi-select.js.map +1 -1
  139. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  140. package/dist/components/nav/nav-icon.js.map +1 -1
  141. package/dist/components/nav/nav-item-collapsed.js.map +1 -1
  142. package/dist/components/nav/nav-item.js +4 -2
  143. package/dist/components/nav/nav-item.js.map +1 -1
  144. package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
  145. package/dist/components/nav/nav-sub.js.map +1 -1
  146. package/dist/components/nav/nav.js.map +1 -1
  147. package/dist/components/nav/style.d.ts +1 -1
  148. package/dist/components/node-render/style.d.ts +1 -1
  149. package/dist/components/notification/index.d.ts +2 -2
  150. package/dist/components/notification/notification-box.js +2 -2
  151. package/dist/components/notification/notification-box.js.map +1 -1
  152. package/dist/components/notification/notification.js.map +1 -1
  153. package/dist/components/notification/style.d.ts +1 -1
  154. package/dist/components/number/number.js.map +1 -1
  155. package/dist/components/number/style.d.ts +1 -1
  156. package/dist/components/number-input/number-input.js +2 -1
  157. package/dist/components/number-input/number-input.js.map +1 -1
  158. package/dist/components/number-range-input/number-range-input.js.map +1 -1
  159. package/dist/components/paginator/paginator.js.map +1 -1
  160. package/dist/components/palette/palette-alpha.js.map +1 -1
  161. package/dist/components/palette/palette-color-switch.js.map +1 -1
  162. package/dist/components/palette/palette-hue.js.map +1 -1
  163. package/dist/components/palette/palette-sv.js.map +1 -1
  164. package/dist/components/palette/palette.js.map +1 -1
  165. package/dist/components/password-input/password-input.js.map +1 -1
  166. package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
  167. package/dist/components/progress/progress.js.map +1 -1
  168. package/dist/components/progress/style.d.ts +1 -1
  169. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  170. package/dist/components/progress-nodes/style.d.ts +1 -1
  171. package/dist/components/radio/radio.js.map +1 -1
  172. package/dist/components/radio-group/radio-group.js.map +1 -1
  173. package/dist/components/rich-text-editor/rich-text-editor.js +2 -1
  174. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  175. package/dist/components/rich-text-editor/style.d.ts +1 -1
  176. package/dist/components/rich-text-editor/toolbar.js +3 -4
  177. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  178. package/dist/components/scroll/scroll-bar.js.map +1 -1
  179. package/dist/components/scroll/scroll.js.map +1 -1
  180. package/dist/components/scroll/style.d.ts +1 -1
  181. package/dist/components/select/select.js.map +1 -1
  182. package/dist/components/slider/slider-thumb.js.map +1 -1
  183. package/dist/components/slider/slider.js.map +1 -1
  184. package/dist/components/slider/style.d.ts +1 -1
  185. package/dist/components/steps/steps.js.map +1 -1
  186. package/dist/components/steps/style.d.ts +1 -1
  187. package/dist/components/switch/style.d.ts +1 -1
  188. package/dist/components/switch/switch.js.map +1 -1
  189. package/dist/components/table/index.d.ts +2 -2
  190. package/dist/components/table/node/col.d.ts +1 -49
  191. package/dist/components/table/table-body.js.map +1 -1
  192. package/dist/components/table/table-cell.js.map +1 -1
  193. package/dist/components/table/table-foot.js.map +1 -1
  194. package/dist/components/table/table-row.js +2 -1
  195. package/dist/components/table/table-row.js.map +1 -1
  196. package/dist/components/table/table.js.map +1 -1
  197. package/dist/components/table/use-check.js +2 -1
  198. package/dist/components/table/use-check.js.map +1 -1
  199. package/dist/components/table/use-columns.d.ts +1 -1
  200. package/dist/components/table/use-rows.js +2 -1
  201. package/dist/components/table/use-rows.js.map +1 -1
  202. package/dist/components/table-editor/table-editor.js.map +1 -1
  203. package/dist/components/tabs/tabs-horizontal.js +2 -1
  204. package/dist/components/tabs/tabs-horizontal.js.map +1 -1
  205. package/dist/components/tabs/tabs-vertical.js.map +1 -1
  206. package/dist/components/tabs/tabs.js.map +1 -1
  207. package/dist/components/tabs/use-tabs-bar.js +10 -25
  208. package/dist/components/tabs/use-tabs-bar.js.map +1 -1
  209. package/dist/components/tag/style.d.ts +1 -1
  210. package/dist/components/tag/tag.js.map +1 -1
  211. package/dist/components/text/style.d.ts +1 -1
  212. package/dist/components/text/text.js.map +1 -1
  213. package/dist/components/textarea/textarea.js.map +1 -1
  214. package/dist/components/theme/theme.js +3 -2
  215. package/dist/components/theme/theme.js.map +1 -1
  216. package/dist/components/tip/style.d.ts +1 -1
  217. package/dist/components/tip/tip.js.map +1 -1
  218. package/dist/components/tree/tree-node.js.map +1 -1
  219. package/dist/components/tree/tree.js.map +1 -1
  220. package/dist/components/tree-select/tree-select.js.map +1 -1
  221. package/dist/components/watermark/style.d.ts +1 -1
  222. package/dist/components/watermark/watermark.js.map +1 -1
  223. package/dist/index.d.ts +92 -96
  224. package/dist/index.js +2 -1
  225. package/dist/node_modules/.bun/@codemirror_autocomplete@6.20.3/node_modules/@codemirror/autocomplete/dist/index.js +2 -2
  226. package/dist/node_modules/.bun/@codemirror_autocomplete@6.20.3/node_modules/@codemirror/autocomplete/dist/index.js.map +1 -1
  227. package/dist/node_modules/.bun/@codemirror_commands@6.10.4/node_modules/@codemirror/commands/dist/index.js +3 -3
  228. package/dist/node_modules/.bun/@codemirror_commands@6.10.4/node_modules/@codemirror/commands/dist/index.js.map +1 -1
  229. package/dist/node_modules/.bun/@codemirror_lang-css@6.3.1/node_modules/@codemirror/lang-css/dist/index.js.map +1 -1
  230. package/dist/node_modules/.bun/@codemirror_lang-html@6.4.11/node_modules/@codemirror/lang-html/dist/index.js +5 -4
  231. package/dist/node_modules/.bun/@codemirror_lang-html@6.4.11/node_modules/@codemirror/lang-html/dist/index.js.map +1 -1
  232. package/dist/node_modules/.bun/@codemirror_lang-javascript@6.2.5/node_modules/@codemirror/lang-javascript/dist/index.js +2 -2
  233. 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
  234. package/dist/node_modules/.bun/@codemirror_lang-markdown@6.5.2/node_modules/@codemirror/lang-markdown/dist/index.js.map +1 -0
  235. package/dist/node_modules/.bun/@codemirror_lang-sql@6.10.0/node_modules/@codemirror/lang-sql/dist/index.js +2 -1
  236. package/dist/node_modules/.bun/@codemirror_lang-sql@6.10.0/node_modules/@codemirror/lang-sql/dist/index.js.map +1 -1
  237. package/dist/node_modules/.bun/@codemirror_language@6.12.4/node_modules/@codemirror/language/dist/index.js +2 -2
  238. package/dist/node_modules/.bun/@codemirror_language@6.12.4/node_modules/@codemirror/language/dist/index.js.map +1 -1
  239. package/dist/node_modules/.bun/@codemirror_lint@6.9.7/node_modules/@codemirror/lint/dist/index.js +4 -3
  240. package/dist/node_modules/.bun/@codemirror_lint@6.9.7/node_modules/@codemirror/lint/dist/index.js.map +1 -1
  241. package/dist/node_modules/.bun/@codemirror_search@6.7.1/node_modules/@codemirror/search/dist/index.js +2 -2
  242. package/dist/node_modules/.bun/@codemirror_search@6.7.1/node_modules/@codemirror/search/dist/index.js.map +1 -1
  243. package/dist/node_modules/.bun/{@codemirror_state@6.7.0 → @codemirror_state@6.7.1}/node_modules/@codemirror/state/dist/index.js +13 -3
  244. package/dist/node_modules/.bun/@codemirror_state@6.7.1/node_modules/@codemirror/state/dist/index.js.map +1 -0
  245. package/dist/node_modules/.bun/@codemirror_theme-one-dark@6.1.3/node_modules/@codemirror/theme-one-dark/dist/index.js +1 -1
  246. package/dist/node_modules/.bun/@codemirror_theme-one-dark@6.1.3/node_modules/@codemirror/theme-one-dark/dist/index.js.map +1 -1
  247. package/dist/node_modules/.bun/{@codemirror_view@6.43.4 → @codemirror_view@6.43.8}/node_modules/@codemirror/view/dist/index.js +86 -64
  248. package/dist/node_modules/.bun/@codemirror_view@6.43.8/node_modules/@codemirror/view/dist/index.js.map +1 -0
  249. package/dist/node_modules/.bun/@lezer_common@1.5.2/node_modules/@lezer/common/dist/index.js.map +1 -1
  250. package/dist/node_modules/.bun/@lezer_css@1.3.4/node_modules/@lezer/css/dist/index.js.map +1 -1
  251. package/dist/node_modules/.bun/@lezer_highlight@1.2.3/node_modules/@lezer/highlight/dist/index.js.map +1 -1
  252. package/dist/node_modules/.bun/@lezer_html@1.3.13/node_modules/@lezer/html/dist/index.js.map +1 -1
  253. package/dist/node_modules/.bun/@lezer_javascript@1.5.4/node_modules/@lezer/javascript/dist/index.js.map +1 -1
  254. package/dist/node_modules/.bun/@lezer_lr@1.4.10/node_modules/@lezer/lr/dist/index.js.map +1 -1
  255. package/dist/node_modules/.bun/@lezer_markdown@1.7.2/node_modules/@lezer/markdown/dist/index.js +1 -1
  256. package/dist/node_modules/.bun/@lezer_markdown@1.7.2/node_modules/@lezer/markdown/dist/index.js.map +1 -1
  257. package/dist/node_modules/.bun/@marijn_find-cluster-break@1.0.2/node_modules/@marijn/find-cluster-break/src/index.js.map +1 -1
  258. package/dist/node_modules/.bun/style-mod@4.1.3/node_modules/style-mod/src/style-mod.js.map +1 -1
  259. package/dist/types/contextmenu.d.ts +10 -4
  260. package/dist/types/index.d.ts +1 -7
  261. package/package.json +34 -30
  262. package/src/components/batch-edit/__test__/batch-edit.test.ts +199 -0
  263. package/src/components/batch-edit/batch-edit-form.vue +8 -8
  264. package/src/components/batch-edit/batch-edit.vue +2 -1
  265. package/src/components/batch-edit/di.ts +2 -0
  266. package/src/components/batch-edit/use-edit-state.ts +19 -12
  267. package/src/components/contextmenu/__test__/contextmenu.test.ts +165 -0
  268. package/src/components/contextmenu/contextmenu-item.vue +7 -4
  269. package/src/components/contextmenu/contextmenu-panel.vue +7 -4
  270. package/src/components/contextmenu/index.ts +1 -0
  271. package/src/components/contextmenu/style.scss +16 -0
  272. package/src/components/file-viewer/helper.ts +0 -53
  273. package/src/components/file-viewer/previewers/sheet-previewer.vue +91 -46
  274. package/src/components/message-confirm/style.scss +19 -0
  275. package/src/components/notification/style.scss +16 -4
  276. package/src/components/radio-group/style.scss +1 -1
  277. package/src/components/slider/style.scss +1 -1
  278. package/src/components/tabs/use-tabs-bar.ts +15 -20
  279. package/src/types/contextmenu.ts +10 -4
  280. package/dist/components/action/action-group.vue.d.ts +0 -25
  281. package/dist/components/action/action.vue.d.ts +0 -33
  282. package/dist/components/action/index.d.ts +0 -3
  283. package/dist/components/auto-complete/auto-complete.vue.d.ts +0 -41
  284. package/dist/components/auto-complete/index.d.ts +0 -2
  285. package/dist/components/badge/badge.vue.d.ts +0 -20
  286. package/dist/components/badge/index.d.ts +0 -2
  287. package/dist/components/batch-edit/batch-edit.vue.d.ts +0 -45
  288. package/dist/components/breadcrumb/breadcrumb.vue.d.ts +0 -24
  289. package/dist/components/breadcrumb/index.d.ts +0 -2
  290. package/dist/components/button/button-group.vue.d.ts +0 -19
  291. package/dist/components/button/button.vue.d.ts +0 -27
  292. package/dist/components/button/index.d.ts +0 -3
  293. package/dist/components/calendar/calendar.vue.d.ts +0 -17
  294. package/dist/components/calendar/index.d.ts +0 -2
  295. package/dist/components/card/card-action.vue.d.ts +0 -18
  296. package/dist/components/card/card-content.vue.d.ts +0 -18
  297. package/dist/components/card/card-cover.vue.d.ts +0 -8
  298. package/dist/components/card/card-header.vue.d.ts +0 -16
  299. package/dist/components/card/card.vue.d.ts +0 -18
  300. package/dist/components/card/index.d.ts +0 -6
  301. package/dist/components/cascade/cascade.vue.d.ts +0 -31
  302. package/dist/components/cascade/index.d.ts +0 -2
  303. package/dist/components/check-tag/check-tag.vue.d.ts +0 -22
  304. package/dist/components/check-tag/index.d.ts +0 -2
  305. package/dist/components/checkbox/checkbox-button.vue.d.ts +0 -35
  306. package/dist/components/checkbox/checkbox.vue.d.ts +0 -34
  307. package/dist/components/checkbox/index.d.ts +0 -3
  308. package/dist/components/checkbox-group/checkbox-group.vue.d.ts +0 -24
  309. package/dist/components/checkbox-group/index.d.ts +0 -2
  310. package/dist/components/code-editor/code-editor.vue.d.ts +0 -30
  311. package/dist/components/code-editor/index.d.ts +0 -2
  312. package/dist/components/collapse/collapse-item.vue.d.ts +0 -32
  313. package/dist/components/collapse/collapse.vue.d.ts +0 -27
  314. package/dist/components/collapse/index.d.ts +0 -3
  315. package/dist/components/condition-editor/condition-editor.vue.d.ts +0 -15
  316. package/dist/components/contextmenu/contextmenu.vue.d.ts +0 -14
  317. package/dist/components/date-panel/date-panel.vue.d.ts +0 -17
  318. package/dist/components/date-panel/index.d.ts +0 -2
  319. package/dist/components/date-picker/date-picker.vue.d.ts +0 -18
  320. package/dist/components/date-picker/index.d.ts +0 -2
  321. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +0 -18
  322. package/dist/components/date-range-picker/index.d.ts +0 -2
  323. package/dist/components/dialog/dialog.vue.d.ts +0 -43
  324. package/dist/components/dialog/index.d.ts +0 -2
  325. package/dist/components/drawer/drawer.vue.d.ts +0 -36
  326. package/dist/components/drawer/index.d.ts +0 -2
  327. package/dist/components/dropdown/dropdown.vue.d.ts +0 -30
  328. package/dist/components/dropdown/index.d.ts +0 -2
  329. package/dist/components/dual-nav/dual-nav.vue.d.ts +0 -15
  330. package/dist/components/dual-nav/index.d.ts +0 -2
  331. package/dist/components/empty/empty.vue.d.ts +0 -11
  332. package/dist/components/empty/index.d.ts +0 -2
  333. package/dist/components/expression-editor/expression-editor.vue.d.ts +0 -16
  334. package/dist/components/expression-editor/index.d.ts +0 -2
  335. package/dist/components/file-picker/file-picker.vue.d.ts +0 -27
  336. package/dist/components/file-picker/index.d.ts +0 -2
  337. package/dist/components/file-viewer/file-viewer.vue.d.ts +0 -40
  338. package/dist/components/file-viewer/index.d.ts +0 -2
  339. package/dist/components/file-viewer/sheet-parser.js +0 -46
  340. package/dist/components/file-viewer/sheet-parser.js.map +0 -1
  341. package/dist/components/float-button/float-button.vue.d.ts +0 -12
  342. package/dist/components/float-button/index.d.ts +0 -2
  343. package/dist/components/form/form.vue.d.ts +0 -23
  344. package/dist/components/form/index.d.ts +0 -2
  345. package/dist/components/form-item/form-item.vue.d.ts +0 -21
  346. package/dist/components/form-item/index.d.ts +0 -2
  347. package/dist/components/gantt-chart/gantt-chart.vue.d.ts +0 -8
  348. package/dist/components/gantt-chart/index.d.ts +0 -2
  349. package/dist/components/grid/grid-item.vue.d.ts +0 -20
  350. package/dist/components/grid/grid.vue.d.ts +0 -27
  351. package/dist/components/grid/index.d.ts +0 -3
  352. package/dist/components/grid-input/grid-input.vue.d.ts +0 -19
  353. package/dist/components/grid-input/index.d.ts +0 -2
  354. package/dist/components/group-input/group-input.vue.d.ts +0 -26
  355. package/dist/components/group-input/index.d.ts +0 -2
  356. package/dist/components/group-nav/group-nav.vue.d.ts +0 -12
  357. package/dist/components/group-nav/index.d.ts +0 -2
  358. package/dist/components/icon/icon.vue.d.ts +0 -18
  359. package/dist/components/icon/index.d.ts +0 -2
  360. package/dist/components/input/index.d.ts +0 -2
  361. package/dist/components/input/input.vue.d.ts +0 -50
  362. package/dist/components/kbd/kbd.vue.d.ts +0 -16
  363. package/dist/components/layout/index.d.ts +0 -2
  364. package/dist/components/layout/layout.vue.d.ts +0 -20
  365. package/dist/components/list/index.d.ts +0 -3
  366. package/dist/components/list/list-item.vue.d.ts +0 -16
  367. package/dist/components/list/list.vue.d.ts +0 -21
  368. package/dist/components/loading/loading.vue.d.ts +0 -11
  369. package/dist/components/message/message.vue.d.ts +0 -16
  370. package/dist/components/message-confirm/message-confirm.vue.d.ts +0 -19
  371. package/dist/components/multi-select/index.d.ts +0 -2
  372. package/dist/components/multi-select/multi-select.vue.d.ts +0 -48
  373. package/dist/components/multi-tree-select/index.d.ts +0 -2
  374. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +0 -44
  375. package/dist/components/nav/index.d.ts +0 -4
  376. package/dist/components/nav/nav-item.vue.d.ts +0 -12
  377. package/dist/components/nav/nav-sub.vue.d.ts +0 -13
  378. package/dist/components/nav/nav.vue.d.ts +0 -19
  379. package/dist/components/notification/notification.vue.d.ts +0 -18
  380. package/dist/components/number/index.d.ts +0 -2
  381. package/dist/components/number/number.vue.d.ts +0 -11
  382. package/dist/components/number-input/index.d.ts +0 -2
  383. package/dist/components/number-input/number-input.vue.d.ts +0 -39
  384. package/dist/components/number-range-input/index.d.ts +0 -2
  385. package/dist/components/number-range-input/number-range-input.vue.d.ts +0 -36
  386. package/dist/components/paginator/index.d.ts +0 -2
  387. package/dist/components/paginator/paginator.vue.d.ts +0 -29
  388. package/dist/components/palette/index.d.ts +0 -2
  389. package/dist/components/palette/palette.vue.d.ts +0 -20
  390. package/dist/components/password-input/index.d.ts +0 -2
  391. package/dist/components/password-input/password-input.vue.d.ts +0 -30
  392. package/dist/components/pop-confirm/index.d.ts +0 -2
  393. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +0 -33
  394. package/dist/components/progress/index.d.ts +0 -2
  395. package/dist/components/progress/progress.vue.d.ts +0 -25
  396. package/dist/components/progress-nodes/index.d.ts +0 -2
  397. package/dist/components/progress-nodes/progress-nodes.vue.d.ts +0 -36
  398. package/dist/components/radio/index.d.ts +0 -2
  399. package/dist/components/radio/radio.vue.d.ts +0 -31
  400. package/dist/components/radio-group/index.d.ts +0 -2
  401. package/dist/components/radio-group/radio-group.vue.d.ts +0 -26
  402. package/dist/components/rich-text-editor/index.d.ts +0 -2
  403. package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +0 -23
  404. package/dist/components/scroll/index.d.ts +0 -2
  405. package/dist/components/scroll/scroll.vue.d.ts +0 -28
  406. package/dist/components/select/index.d.ts +0 -2
  407. package/dist/components/select/select.vue.d.ts +0 -38
  408. package/dist/components/slider/index.d.ts +0 -2
  409. package/dist/components/slider/slider.vue.d.ts +0 -21
  410. package/dist/components/steps/index.d.ts +0 -2
  411. package/dist/components/steps/steps.vue.d.ts +0 -29
  412. package/dist/components/switch/index.d.ts +0 -2
  413. package/dist/components/switch/switch.vue.d.ts +0 -24
  414. package/dist/components/table/node/row.d.ts +0 -49
  415. package/dist/components/table/table.vue.d.ts +0 -54
  416. package/dist/components/table-editor/index.d.ts +0 -2
  417. package/dist/components/table-editor/table-editor.vue.d.ts +0 -12
  418. package/dist/components/tabs/index.d.ts +0 -4
  419. package/dist/components/tabs/tabs-horizontal.vue.d.ts +0 -40
  420. package/dist/components/tabs/tabs-vertical.vue.d.ts +0 -39
  421. package/dist/components/tabs/tabs.vue.d.ts +0 -36
  422. package/dist/components/tag/index.d.ts +0 -2
  423. package/dist/components/tag/tag.vue.d.ts +0 -22
  424. package/dist/components/text/index.d.ts +0 -2
  425. package/dist/components/text/text.vue.d.ts +0 -10
  426. package/dist/components/textarea/index.d.ts +0 -2
  427. package/dist/components/textarea/textarea.vue.d.ts +0 -34
  428. package/dist/components/theme/index.d.ts +0 -2
  429. package/dist/components/theme/theme.vue.d.ts +0 -8
  430. package/dist/components/tip/index.d.ts +0 -2
  431. package/dist/components/tip/tip.vue.d.ts +0 -31
  432. package/dist/components/tree/di.d.ts +0 -12
  433. package/dist/components/tree/index.d.ts +0 -2
  434. package/dist/components/tree/tree.vue.d.ts +0 -40
  435. package/dist/components/tree-select/index.d.ts +0 -2
  436. package/dist/components/tree-select/tree-select.vue.d.ts +0 -48
  437. package/dist/components/watermark/index.d.ts +0 -2
  438. package/dist/components/watermark/watermark.vue.d.ts +0 -21
  439. package/dist/node_modules/.bun/@codemirror_lang-markdown@6.5.1/node_modules/@codemirror/lang-markdown/dist/index.js.map +0 -1
  440. package/dist/node_modules/.bun/@codemirror_state@6.7.0/node_modules/@codemirror/state/dist/index.js.map +0 -1
  441. package/dist/node_modules/.bun/@codemirror_view@6.43.4/node_modules/@codemirror/view/dist/index.js.map +0 -1
  442. package/src/components/file-viewer/sheet-parser.ts +0 -52
@@ -0,0 +1,165 @@
1
+ import { describe, expect, it, vi } from 'vitest'
2
+ import { createApp, defineComponent, h, inject, nextTick } from 'vue'
3
+
4
+ import type { ContextmenuItem } from '../../../types'
5
+ import UContextmenu from '../contextmenu.vue'
6
+ import { ContextmenuRootDIKey } from '../di'
7
+
8
+ function cleanupPanels(): void {
9
+ document.querySelectorAll('.u-contextmenu').forEach((el) => el.remove())
10
+ }
11
+
12
+ function mountContextmenu(props: {
13
+ menus: ContextmenuItem[]
14
+ width?: number
15
+ mousePosition?: { x: number; y: number }
16
+ }) {
17
+ cleanupPanels()
18
+ const host = document.createElement('div')
19
+ document.body.appendChild(host)
20
+
21
+ const app = createApp({
22
+ render() {
23
+ return h(UContextmenu, {
24
+ mousePosition: props.mousePosition ?? { x: 10, y: 10 },
25
+ width: props.width ?? 180,
26
+ menus: props.menus
27
+ })
28
+ }
29
+ })
30
+ app.mount(host)
31
+
32
+ return {
33
+ host,
34
+ unmount() {
35
+ app.unmount()
36
+ host.remove()
37
+ cleanupPanels()
38
+ }
39
+ }
40
+ }
41
+
42
+ function panel(): HTMLElement | null {
43
+ // 取最后一个(避免 leave 过渡残留抢到 querySelector 首个)
44
+ const all = document.querySelectorAll<HTMLElement>('.u-contextmenu')
45
+ return all[all.length - 1] ?? null
46
+ }
47
+
48
+ describe('UContextmenu', () => {
49
+ it('divider 渲染为分割线', async () => {
50
+ const { unmount } = mountContextmenu({
51
+ menus: [
52
+ { label: 'A', callback: () => {} },
53
+ { divider: true },
54
+ { label: 'B', callback: () => {} }
55
+ ]
56
+ })
57
+ try {
58
+ await nextTick()
59
+ const el = panel()
60
+ expect(el).toBeTruthy()
61
+ expect(el!.querySelectorAll('.u-contextmenu__divider')).toHaveLength(1)
62
+ expect(el!.querySelectorAll('.u-contextmenu__item')).toHaveLength(2)
63
+ } finally {
64
+ unmount()
65
+ }
66
+ })
67
+
68
+ it('render 组件挂载替代 label', async () => {
69
+ const Custom = defineComponent({
70
+ name: 'CustomMenuContent',
71
+ setup() {
72
+ return () => h('span', { class: 'custom-render' }, '自定义内容')
73
+ }
74
+ })
75
+ const { unmount } = mountContextmenu({
76
+ menus: [{ label: 'fallback', keepOpen: true, render: Custom }]
77
+ })
78
+ try {
79
+ await nextTick()
80
+ const el = panel()!
81
+ expect(el.querySelector('.custom-render')?.textContent).toBe('自定义内容')
82
+ expect(el.textContent).not.toContain('fallback')
83
+ } finally {
84
+ unmount()
85
+ }
86
+ })
87
+
88
+ it('keepOpen 点击不关闭菜单', async () => {
89
+ const { unmount } = mountContextmenu({
90
+ menus: [
91
+ { label: '保持打开', keepOpen: true, callback: () => {} },
92
+ { label: '普通项', callback: () => {} }
93
+ ]
94
+ })
95
+ try {
96
+ await nextTick()
97
+ const items = panel()!.querySelectorAll<HTMLElement>('.u-contextmenu__item')
98
+ items[0]!.click()
99
+ await nextTick()
100
+ expect(panel()).toBeTruthy()
101
+ expect(panel()!.querySelectorAll('.u-contextmenu__item')).toHaveLength(2)
102
+ } finally {
103
+ unmount()
104
+ }
105
+ })
106
+
107
+ it('普通项点击仍关闭', async () => {
108
+ const callback = vi.fn()
109
+ const { unmount } = mountContextmenu({ menus: [{ label: '关闭我', callback }] })
110
+ try {
111
+ await nextTick()
112
+ panel()!.querySelector<HTMLElement>('.u-contextmenu__item')!.click()
113
+ await nextTick()
114
+ expect(callback).toHaveBeenCalledOnce()
115
+ // happy-dom 无真实 CSS transition,leave 可能停在 leave-active;断言已进入关闭流程
116
+ const el = panel()
117
+ expect(el === null || /leave/.test(el.className)).toBe(true)
118
+ } finally {
119
+ unmount()
120
+ }
121
+ })
122
+
123
+ it('内嵌组件 inject DI 可主动关闭', async () => {
124
+ const closerClick = vi.fn()
125
+ let injected = false
126
+ const Closer = defineComponent({
127
+ name: 'CloserMenuContent',
128
+ setup() {
129
+ const root = inject(ContextmenuRootDIKey)
130
+ injected = !!root
131
+ return () =>
132
+ h(
133
+ 'button',
134
+ {
135
+ class: 'close-via-di',
136
+ type: 'button',
137
+ onClick: () => {
138
+ closerClick()
139
+ root?.onItemClickEnd()
140
+ }
141
+ },
142
+ '关闭'
143
+ )
144
+ }
145
+ })
146
+ const { unmount } = mountContextmenu({
147
+ menus: [{ label: '自定义', keepOpen: true, render: Closer }]
148
+ })
149
+ try {
150
+ await nextTick()
151
+ const el = panel()
152
+ expect(el).toBeTruthy()
153
+ expect(injected).toBe(true)
154
+ const btn = el!.querySelector<HTMLButtonElement>('.close-via-di')
155
+ expect(btn, `menu html: ${el!.innerHTML}`).toBeTruthy()
156
+ btn!.click()
157
+ await nextTick()
158
+ expect(closerClick).toHaveBeenCalledOnce()
159
+ const after = panel()
160
+ expect(after === null || /leave/.test(after.className)).toBe(true)
161
+ } finally {
162
+ unmount()
163
+ }
164
+ })
165
+ })
@@ -1,11 +1,11 @@
1
1
  <template>
2
2
  <li
3
3
  :class="[cls.e('item'), bem.is('disabled', disabled), bem.is('loading', loading)]"
4
- v-ripple="!disabled && !loading"
4
+ v-ripple="!disabled && !loading && !menu.keepOpen"
5
5
  @click="handleClickMenu"
6
6
  >
7
7
  <div :class="cls.e('item-content')">
8
- <template v-if="showIconColumn">
8
+ <template v-if="showIconColumn && !menu.render">
9
9
  <u-icon v-if="loading" :class="bem.is('loading')">
10
10
  <Loading />
11
11
  </u-icon>
@@ -15,7 +15,10 @@
15
15
  <i v-else :class="cls.e('icon-place')"></i>
16
16
  </template>
17
17
 
18
- <span :class="cls.e('label')">{{ menu.label }}</span>
18
+ <div v-if="menu.render" :class="cls.e('custom')" @click.stop>
19
+ <component :is="menu.render" />
20
+ </div>
21
+ <span v-else :class="cls.e('label')">{{ menu.label }}</span>
19
22
 
20
23
  <i v-if="showArrowColumn" :class="cls.e('arrow-place')"></i>
21
24
  </div>
@@ -44,7 +47,7 @@ const loading = shallowRef(false)
44
47
  const disabled = computed(() => getMenuDisabled(menu))
45
48
 
46
49
  function handleClickMenu() {
47
- if (disabled.value || loading.value) return
50
+ if (disabled.value || loading.value || menu.keepOpen) return
48
51
  onItemClickStart()
49
52
  loading.value = true
50
53
 
@@ -1,7 +1,8 @@
1
1
  <template>
2
2
  <ul v-bind="$attrs">
3
3
  <template v-for="(menu, index) of menus" :key="index">
4
- <UContextmenuSub v-if="menu.children?.length" :menu="menu" />
4
+ <li v-if="menu.divider" :class="cls.e('divider')" role="separator" />
5
+ <UContextmenuSub v-else-if="menu.children?.length" :menu="menu" />
5
6
  <UContextmenuItem v-else :menu="menu" />
6
7
  </template>
7
8
  </ul>
@@ -19,10 +20,12 @@ defineOptions({ name: 'UContextmenuPanel', inheritAttrs: false })
19
20
 
20
21
  const { menus } = defineProps<{ menus: ContextmenuItem[] }>()
21
22
 
22
- inject(ContextmenuRootDIKey)
23
+ const { cls } = inject(ContextmenuRootDIKey)!
23
24
 
24
- const showIconColumn = computed(() => menus.some((menu) => !!menu.icon))
25
- const showArrowColumn = computed(() => menus.some((menu) => !!menu.children?.length))
25
+ const showIconColumn = computed(() => menus.some((menu) => !menu.divider && !!menu.icon))
26
+ const showArrowColumn = computed(() =>
27
+ menus.some((menu) => !menu.divider && !!menu.children?.length)
28
+ )
26
29
 
27
30
  provide(ContextmenuPanelDIKey, { showIconColumn, showArrowColumn })
28
31
  </script>
@@ -1,3 +1,4 @@
1
1
  export { default as UContextmenu } from './contextmenu.vue'
2
2
 
3
3
  export { contextmenu } from './api'
4
+ export { ContextmenuRootDIKey, ContextmenuPanelDIKey } from './di'
@@ -25,6 +25,8 @@ $arrow-size: 12px;
25
25
  $b: &;
26
26
 
27
27
  position: fixed;
28
+ // 与子菜单一致:最小宽度兜底,调用方可用 width: max-content 让内容撑开
29
+ min-width: 120px;
28
30
  @include panel-surface;
29
31
 
30
32
  @include m.e(label) {
@@ -33,6 +35,20 @@ $arrow-size: 12px;
33
35
  @include m.ellipsis;
34
36
  }
35
37
 
38
+ @include m.e(custom) {
39
+ flex: 1;
40
+ min-width: 0;
41
+ }
42
+
43
+ @include m.e(divider) {
44
+ height: 0;
45
+ margin: 4px 8px;
46
+ border: 0;
47
+ border-top: 1px solid fn.use-var(border, color);
48
+ list-style: none;
49
+ pointer-events: none;
50
+ }
51
+
36
52
  @include m.e(item) {
37
53
  position: relative;
38
54
  cursor: pointer;
@@ -104,59 +104,6 @@ export function toBlobUrl(
104
104
  return { url, revoke: () => URL.revokeObjectURL(url) }
105
105
  }
106
106
 
107
- /**
108
- * RFC-4180 子集 CSV 解析:支持 "" 转义、\r\n 与 \n 换行、, 分隔。
109
- * 为性能起见采用状态机而非 split。
110
- */
111
- export function parseCsv(text: string): string[][] {
112
- const rows: string[][] = []
113
- let row: string[] = []
114
- let field = ''
115
- let inQuotes = false
116
- const len = text.length
117
-
118
- for (let i = 0; i < len; i++) {
119
- const ch = text[i]
120
-
121
- if (inQuotes) {
122
- if (ch === '"') {
123
- if (text[i + 1] === '"') {
124
- field += '"'
125
- i++
126
- } else {
127
- inQuotes = false
128
- }
129
- } else {
130
- field += ch
131
- }
132
- continue
133
- }
134
-
135
- if (ch === '"') {
136
- inQuotes = true
137
- } else if (ch === ',') {
138
- row.push(field)
139
- field = ''
140
- } else if (ch === '\n') {
141
- row.push(field)
142
- rows.push(row)
143
- row = []
144
- field = ''
145
- } else if (ch === '\r') {
146
- // swallow CR; LF will commit the row
147
- } else {
148
- field += ch
149
- }
150
- }
151
-
152
- // 最后一行
153
- if (field.length > 0 || row.length > 0) {
154
- row.push(field)
155
- rows.push(row)
156
- }
157
- return rows
158
- }
159
-
160
107
  export function formatBytes(bytes?: number): string {
161
108
  if (bytes === undefined || bytes === null || Number.isNaN(bytes)) return '-'
162
109
  if (bytes < 1024) return `${bytes} B`
@@ -1,33 +1,44 @@
1
1
  <template>
2
2
  <div :class="cls.e('sheet')">
3
- <div v-if="truncated" :class="cls.e('sheet-note')">
4
- 仅展示前 {{ renderedRows.toLocaleString() }} 行(共 {{ totalRows.toLocaleString() }} 行)
3
+ <div v-if="unavailable" :class="cls.e('empty')">
4
+ <u-empty text="无法预览表格:未安装 @veltra/sheet-core" :size="32" />
5
5
  </div>
6
- <div v-if="sheets.length > 1" :class="cls.e('sheet-tabs')">
7
- <button
8
- v-for="(s, i) in sheets"
9
- :key="s.name"
10
- :class="[cls.e('sheet-tab'), bem.is('active', i === activeSheetIndex)]"
11
- @click="activeSheetIndex = i"
12
- >
13
- {{ s.name }}
14
- </button>
15
- </div>
16
- <div ref="container" :class="cls.e('sheet-stage')" />
17
- <div v-if="loading" :class="cls.e('loading')">加载中…</div>
6
+ <template v-else>
7
+ <div v-if="truncated" :class="cls.e('sheet-note')">
8
+ 共 {{ totalRows.toLocaleString() }} 行,超出预览上限
9
+ {{ maxRows.toLocaleString() }} 行,已全量加载
10
+ </div>
11
+ <div v-if="sheets.length > 1" :class="cls.e('sheet-tabs')">
12
+ <button
13
+ v-for="(s, i) in sheets"
14
+ :key="s.name"
15
+ :class="[cls.e('sheet-tab'), bem.is('active', i === activeSheetIndex)]"
16
+ @click="activeSheetIndex = i"
17
+ >
18
+ {{ s.name }}
19
+ </button>
20
+ </div>
21
+ <div ref="container" :class="cls.e('sheet-stage')" />
22
+ <div v-if="loading" :class="cls.e('loading')">加载中…</div>
23
+ </template>
18
24
  </div>
19
25
  </template>
20
26
 
21
27
  <script lang="ts" setup>
22
28
  import { bem } from '@veltra/utils'
23
- import { ListTable } from '@visactor/vtable'
24
29
  import { onBeforeUnmount, ref, shallowRef, useTemplateRef, watch } from 'vue'
25
30
 
26
31
  import type { FileViewerItem } from '../../../types/file-viewer'
27
- import { parseSheetFile, type SheetPreview } from '../sheet-parser'
32
+ import { UEmpty } from '../../empty'
33
+ import { getExtension, toArrayBuffer } from '../helper'
28
34
 
29
35
  defineOptions({ name: 'UFileViewerSheetPreviewer' })
30
36
 
37
+ /** 仅类型查询;运行时通过动态 import 加载,未安装时不炸主入口 */
38
+ type SheetCoreModule = typeof import('@veltra/sheet-core')
39
+ type Sheet = InstanceType<SheetCoreModule['Sheet']>
40
+ type SheetGrid = InstanceType<SheetCoreModule['SheetGrid']>
41
+
31
42
  const props = withDefaults(defineProps<{ file: FileViewerItem; maxRows?: number }>(), {
32
43
  maxRows: 50_000
33
44
  })
@@ -37,72 +48,106 @@ const emit = defineEmits<{ (e: 'error', err: unknown): void }>()
37
48
  const cls = bem('file-viewer')
38
49
  const container = useTemplateRef<HTMLDivElement>('container')
39
50
  const loading = ref(true)
51
+ const unavailable = ref(false)
40
52
  const truncated = ref(false)
41
53
  const totalRows = ref(0)
42
- const renderedRows = ref(0)
43
- const sheets = shallowRef<SheetPreview[]>([])
54
+ const sheets = shallowRef<Sheet[]>([])
44
55
  const activeSheetIndex = ref(0)
45
56
 
46
57
  let controller: AbortController | undefined
47
- let table: ListTable | undefined
48
- let resizeObserver: ResizeObserver | undefined
58
+ /** 递增 token:importXlsx 无 AbortSignal,靠它防止切文件后旧解析结果落地 */
59
+ let loadToken = 0
60
+ let grid: SheetGrid | undefined
61
+ let sheetCore: SheetCoreModule | undefined
62
+
63
+ function releaseGrid() {
64
+ grid?.release()
65
+ grid = undefined
66
+ }
67
+
68
+ /** 动态加载 sheet-core;未安装 optional peer 时返回 undefined */
69
+ async function resolveSheetCore(): Promise<SheetCoreModule | undefined> {
70
+ if (sheetCore) return sheetCore
71
+ try {
72
+ sheetCore = await import('@veltra/sheet-core')
73
+ return sheetCore
74
+ } catch {
75
+ return undefined
76
+ }
77
+ }
49
78
 
50
- function releaseTable() {
51
- table?.release()
52
- table = undefined
79
+ /** 解析文件为 Sheet 列表:xlsx 多表(importXlsx 建工作簿);csv 单表,表名取文件名 */
80
+ async function parseFile(
81
+ core: SheetCoreModule,
82
+ file: FileViewerItem,
83
+ signal?: AbortSignal
84
+ ): Promise<Sheet[]> {
85
+ const buf = await toArrayBuffer(file.src, signal)
86
+ if (getExtension(file.name) === 'csv') {
87
+ const text = new TextDecoder('utf-8', { fatal: false }).decode(buf)
88
+ const sheet = new core.Sheet(file.name)
89
+ core.importCsv(text, sheet)
90
+ return [sheet]
91
+ }
92
+ const workbook = await core.importXlsx(buf)
93
+ return workbook.getSheets()
53
94
  }
54
95
 
55
96
  function renderActive() {
56
97
  const sheet = sheets.value[activeSheetIndex.value]
57
98
  const el = container.value
58
- if (!sheet || !el) return
99
+ releaseGrid()
100
+ if (!sheet || !el || !sheetCore) return
59
101
 
60
- releaseTable()
102
+ // SheetGrid 的 rows 选项是渲染行数下限(构造时数据高水位恒并入渲染尺寸),
103
+ // 不能用作行数上限;deleteRows 硬裁又会让引用被裁区域的公式显示 #REF!,
104
+ // 故 maxRows 只驱动截断提示,不裁模型
105
+ const total = sheet.rowCount
106
+ totalRows.value = total
107
+ truncated.value = props.maxRows > 0 && total > props.maxRows
61
108
 
62
- const limit = props.maxRows > 0 ? Math.min(props.maxRows, sheet.rows.length) : sheet.rows.length
63
- totalRows.value = sheet.rows.length
64
- renderedRows.value = limit
65
- truncated.value = props.maxRows > 0 && sheet.rows.length > props.maxRows
66
-
67
- table = new ListTable(el, {
68
- records: sheet.rows.slice(0, limit),
69
- columns: sheet.headers.map((title, i) => ({ field: String(i), title, width: 'auto' })),
70
- widthMode: 'standard'
71
- })
109
+ grid = new sheetCore.SheetGrid({ container: el, sheet, readonly: true })
72
110
  }
73
111
 
74
112
  async function load() {
113
+ const token = ++loadToken
75
114
  controller?.abort()
76
115
  controller = new AbortController()
77
116
  loading.value = true
117
+ truncated.value = false
118
+ releaseGrid()
78
119
  sheets.value = []
79
120
  activeSheetIndex.value = 0
80
121
 
81
122
  try {
82
- sheets.value = await parseSheetFile(props.file, controller.signal)
83
- if (controller.signal.aborted) return
123
+ const core = await resolveSheetCore()
124
+ if (token !== loadToken) return
125
+ if (!core) {
126
+ unavailable.value = true
127
+ emit('error', new Error('未安装 @veltra/sheet-core,无法预览 Excel/CSV'))
128
+ return
129
+ }
130
+ unavailable.value = false
131
+
132
+ const parsed = await parseFile(core, props.file, controller.signal)
133
+ if (token !== loadToken) return
134
+ sheets.value = parsed
84
135
  renderActive()
85
136
  } catch (err) {
137
+ if (token !== loadToken) return
86
138
  if ((err as { name?: string })?.name === 'AbortError') return
87
139
  emit('error', err)
88
140
  } finally {
89
- loading.value = false
141
+ if (token === loadToken) loading.value = false
90
142
  }
91
143
  }
92
144
 
93
145
  watch(() => props.file, load, { immediate: true })
94
146
  watch(activeSheetIndex, renderActive)
95
- watch(container, (el) => {
96
- resizeObserver?.disconnect()
97
- if (!el) return
98
- resizeObserver = new ResizeObserver(() => table?.resize?.())
99
- resizeObserver.observe(el)
100
- })
101
147
 
102
148
  onBeforeUnmount(() => {
103
149
  controller?.abort()
104
- resizeObserver?.disconnect()
105
- releaseTable()
150
+ releaseGrid()
106
151
  sheets.value = []
107
152
  })
108
153
  </script>
@@ -7,6 +7,12 @@
7
7
  $root-name: message-confirm;
8
8
 
9
9
  @include m.b($root-name) {
10
+ // 根元素必须「平时」就有 transition:Vue transition-group 的 hasTransition 在
11
+ // 添加 leave-active 类之前检查元素当前 computed 样式,只在类上声明 transition
12
+ // 读不到 → 判定无过渡 → after-leave 同步触发(onClosed 在点击事件内同步执行,
13
+ // replaceWorkbook 长任务阻塞弹窗关闭)。与 message 组件对称(mask/box 同此)。
14
+ transition: opacity fn.use-var(transition, normal) fn.use-var(transition, ease);
15
+
10
16
  @include m.e(mask) {
11
17
  background-color: rgba(0, 0, 0, 0.32);
12
18
  position: fixed;
@@ -57,8 +63,21 @@ $root-name: message-confirm;
57
63
  }
58
64
  }
59
65
 
66
+ /* 根元素必须声明 transition:Vue transition-group 通过「被过渡元素自身」的
67
+ computed transition 判定是否走动画。此前动画只写在子元素 mask/box 上,
68
+ 根元素无 transition → Vue 判定无过渡 → after-leave 同步触发(onClosed 在
69
+ 点击事件内同步执行,长任务阻塞弹窗关闭)。与 message 组件对称。 */
70
+ .#{$root-name}-enter-active,
71
+ .#{$root-name}-leave-active {
72
+ transition-duration: fn.use-var(transition, normal);
73
+ transition-timing-function: fn.use-var(transition, ease);
74
+ transition-property: opacity;
75
+ }
76
+
60
77
  .#{$root-name}-enter-from,
61
78
  .#{$root-name}-leave-to {
79
+ opacity: 0;
80
+
62
81
  @include m.bem($root-name, mask) {
63
82
  opacity: 0;
64
83
  }
@@ -7,10 +7,22 @@
7
7
  $root-name: notification;
8
8
  // 方位 => (垂直锚边, 水平锚边)
9
9
  $stack-positions: (
10
- 'bottom-right': (bottom, right),
11
- 'bottom-left': (bottom, left),
12
- 'top-right': (top, right),
13
- 'top-left': (top, left)
10
+ 'bottom-right': (
11
+ bottom,
12
+ right
13
+ ),
14
+ 'bottom-left': (
15
+ bottom,
16
+ left
17
+ ),
18
+ 'top-right': (
19
+ top,
20
+ right
21
+ ),
22
+ 'top-left': (
23
+ top,
24
+ left
25
+ )
14
26
  );
15
27
 
16
28
  @include m.b($root-name) {
@@ -10,7 +10,7 @@
10
10
  margin: 0;
11
11
  }
12
12
 
13
- @include m.size using($size) {
13
+ @include m.size using ($size) {
14
14
  gap: 0 calc(fn.use-var(gap, $size) * 2);
15
15
  }
16
16
 
@@ -87,7 +87,7 @@ $track-size: (
87
87
  }
88
88
  }
89
89
 
90
- @include m.size using($size) {
90
+ @include m.size using ($size) {
91
91
  $slider-size: map.get($slider-size, $size);
92
92
  $track-size: map.get($track-size, $size);
93
93
  $padding-y: math.div($slider-size - $track-size, 2);
@@ -1,4 +1,10 @@
1
1
  import { useResizeObserver } from '@veltra/compositions'
2
+ import {
3
+ applyWheelHorizontalScroll,
4
+ computeOverflowNavState,
5
+ scrollElementIntoView,
6
+ scrollViewportByStep
7
+ } from '@veltra/utils'
2
8
  import {
3
9
  type ModelRef,
4
10
  type Ref,
@@ -20,7 +26,8 @@ interface UseTabsBarOptions {
20
26
  }
21
27
 
22
28
  /**
23
- * 水平标签栏的溢出滚动逻辑:
29
+ * 水平标签栏的溢出滚动逻辑(滚动几何/滚轮转横滚/元素滚入视野共享
30
+ * @veltra/utils overflow-nav,见 #17;此处保留 useResizeObserver 与 watch 差异):
24
31
  * - 计算 nav 按钮显隐与可用状态
25
32
  * - 提供按步滚动与活动标签自动滚入视野的方法
26
33
  * - 绑定 wheel / scroll / resize 事件
@@ -36,18 +43,17 @@ export function useTabsBar(options: UseTabsBarOptions) {
36
43
  const updateNavState = () => {
37
44
  const vp = viewportRef.value
38
45
  if (!vp) return
39
- const { scrollLeft, scrollWidth, clientWidth } = vp
40
- const overflowing = scrollWidth - clientWidth > 1
41
- showNav.value = overflowing
42
- canPrev.value = overflowing && scrollLeft > 0
43
- canNext.value = overflowing && scrollLeft + clientWidth < scrollWidth - 1
46
+ const state = computeOverflowNavState(vp)
47
+ showNav.value = state.overflowing
48
+ canPrev.value = state.canPrev
49
+ canNext.value = state.canNext
44
50
  }
45
51
 
46
52
  /** 箭头按钮:按视口宽度 80% 的步长平滑滚动 */
47
53
  const scrollByStep = (dir: 1 | -1) => {
48
54
  const vp = viewportRef.value
49
55
  if (!vp) return
50
- vp.scrollTo({ left: vp.scrollLeft + dir * vp.clientWidth * 0.8, behavior: 'smooth' })
56
+ scrollViewportByStep(vp, dir)
51
57
  }
52
58
 
53
59
  /** 活动标签自动滚入视野 */
@@ -61,25 +67,14 @@ export function useTabsBar(options: UseTabsBarOptions) {
61
67
  if (activeIndex < 0) return
62
68
  const el = list.children[activeIndex] as HTMLElement | undefined
63
69
  if (!el) return
64
-
65
- const vpRect = vp.getBoundingClientRect()
66
- const elRect = el.getBoundingClientRect()
67
- if (elRect.left < vpRect.left) {
68
- vp.scrollTo({ left: vp.scrollLeft + (elRect.left - vpRect.left) - 8, behavior: 'smooth' })
69
- } else if (elRect.right > vpRect.right) {
70
- vp.scrollTo({ left: vp.scrollLeft + (elRect.right - vpRect.right) + 8, behavior: 'smooth' })
71
- }
70
+ scrollElementIntoView(vp, el)
72
71
  }
73
72
 
74
73
  /** 鼠标滚轮(纵向)驱动水平滚动;触控板横滑(已有 deltaX)不拦截 */
75
74
  const handleWheel = (e: WheelEvent) => {
76
- if (!showNav.value) return
77
75
  const vp = viewportRef.value
78
76
  if (!vp) return
79
- if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return
80
- if (e.deltaY === 0) return
81
- e.preventDefault()
82
- vp.scrollLeft += e.deltaY
77
+ applyWheelHorizontalScroll(e, vp, showNav.value)
83
78
  }
84
79
 
85
80
  useResizeObserver({ targets: [viewportRef, listRef], onResize: () => updateNavState() })