@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
@@ -65,8 +65,8 @@ const classList = computed(() => {
65
65
  })
66
66
 
67
67
  const ripple = computed(() => {
68
- if (props.disabled || props.loading) return false
69
- if ((props.plain || props.text) && props.type) {
68
+ if (props.disabled || props.loading || props.text) return false
69
+ if (props.plain && props.type) {
70
70
  return bem.is(`ripple-${props.type}`)
71
71
  }
72
72
  return true
@@ -47,17 +47,8 @@ $root-name: button;
47
47
  }
48
48
 
49
49
  @include m.is(plain) {
50
- background-color: fn.use-var(bg-color, top);
51
- border-color: fn.use-var(color, default, 'dark-1');
50
+ border-color: transparent;
52
51
  box-shadow: none;
53
-
54
- &:hover {
55
- border-color: fn.use-var(color, default, 'dark-1');
56
- }
57
-
58
- &.is-disabled {
59
- color: fn.use-var(text-color, second);
60
- }
61
52
  }
62
53
 
63
54
  // 尺寸
@@ -122,12 +113,9 @@ $root-name: button;
122
113
 
123
114
  @include m.is(text) {
124
115
  color: fn.use-var(color, $type);
116
+ border-color: transparent;
125
117
  box-shadow: none;
126
118
 
127
- &:hover {
128
- box-shadow: 0px 0px 0px 1px fn.use-var(color, $type);
129
- }
130
-
131
119
  @include m.is-not(disabled, loading) {
132
120
  &:hover,
133
121
  &:focus {
@@ -140,39 +128,30 @@ $root-name: button;
140
128
  }
141
129
 
142
130
  @include m.is(disabled, loading) {
131
+ border-color: transparent;
143
132
  color: fn.use-var(color, $type, 'light-5');
144
133
  }
145
134
  }
146
135
 
147
136
  @include m.is(plain) {
137
+ border-color: transparent;
148
138
  color: fn.component-var(button, #{$type}-plain-color, fn.use-var(color, $type));
149
139
  background-color: fn.component-var(
150
140
  button,
151
141
  #{$type}-plain-bg,
152
142
  fn.use-var(color, $type, light-9)
153
143
  );
154
- border-color: fn.component-var(
155
- button,
156
- #{$type}-plain-border,
157
- fn.use-var(color, $type, light-5)
158
- );
159
- box-shadow: none;
160
144
 
161
145
  @include m.is-not(disabled, loading) {
162
146
  &:hover {
163
- color: fn.use-var(color, $type);
164
- border-color: fn.use-var(color, $type);
165
- background-color: fn.use-var(color, $type, light-9);
147
+ background-color: fn.use-var(color, $type, light-7);
166
148
  }
167
149
  }
168
150
 
169
- &:active {
170
- box-shadow: none;
171
- }
172
-
173
- &.is-disabled {
151
+ @include m.is(disabled, loading) {
152
+ border-color: transparent;
174
153
  color: fn.use-var(color, $type, light-5);
175
- border-color: fn.use-var(color, $type, light-8);
154
+ background-color: fn.use-var(color, $type, light-9);
176
155
  }
177
156
  }
178
157
  }
@@ -353,3 +353,62 @@ describe('CollapseItem standalone', () => {
353
353
  }
354
354
  })
355
355
  })
356
+
357
+ describe('CollapseItem destroyOnCollapse', () => {
358
+ it('keeps content mounted by default even when collapsed', async () => {
359
+ const { host, unmount } = mountStandaloneItem({ title: 'Standalone' })
360
+
361
+ try {
362
+ await nextTick()
363
+ expect(host.querySelector('.u-collapse__item.is-active')).toBeFalsy()
364
+ expect(host.querySelector('.u-collapse__content')?.textContent).toBe('Standalone content')
365
+ } finally {
366
+ unmount()
367
+ }
368
+ })
369
+
370
+ it('does not mount content when initially collapsed', async () => {
371
+ const { host, unmount } = mountStandaloneItem({ title: 'Standalone', destroyOnCollapse: true })
372
+
373
+ try {
374
+ await nextTick()
375
+ expect(host.querySelector('.u-collapse__item.is-active')).toBeFalsy()
376
+ // 内容未挂载,但包装容器仍在(承载高度动画与 aria-hidden)
377
+ expect(host.querySelector('.u-collapse__content')).toBeFalsy()
378
+ expect(host.querySelector('.u-collapse__content-wrapper')).toBeTruthy()
379
+ } finally {
380
+ unmount()
381
+ }
382
+ })
383
+
384
+ it('unmounts content after collapse and remounts on expand', async () => {
385
+ const { host, model, unmount } = mountStandaloneItem({
386
+ title: 'Standalone',
387
+ modelValue: true,
388
+ destroyOnCollapse: true
389
+ })
390
+
391
+ try {
392
+ await nextTick()
393
+ expect(host.querySelector('.u-collapse__content')?.textContent).toBe('Standalone content')
394
+
395
+ const header = host.querySelector('.u-collapse__header') as HTMLElement
396
+ header.click()
397
+ await nextTick()
398
+
399
+ expect(model.value).toBe(false)
400
+ // happy-dom 无真实布局,收起动画直接落定,内容随即卸载
401
+ await nextTick()
402
+ expect(host.querySelector('.u-collapse__content')).toBeFalsy()
403
+
404
+ header.click()
405
+ await nextTick()
406
+ await nextTick()
407
+
408
+ expect(model.value).toBe(true)
409
+ expect(host.querySelector('.u-collapse__content')?.textContent).toBe('Standalone content')
410
+ } finally {
411
+ unmount()
412
+ }
413
+ })
414
+ })
@@ -10,18 +10,16 @@
10
10
  @keydown.enter.prevent="handleClick"
11
11
  @keydown.space.prevent="handleClick"
12
12
  >
13
- <span :class="cls.e('title')">
14
- <slot name="title">{{ title }}</slot>
15
- </span>
13
+ <slot name="header" :is-active="isActive">
14
+ <span :class="cls.e('title')">{{ title }}</span>
16
15
 
17
- <span :class="cls.e('icon')">
18
- <slot name="icon" :is-active="isActive">
16
+ <span :class="cls.e('icon')">
19
17
  <UIcon><component :is="iconComponent" /></UIcon>
20
- </slot>
21
- </span>
18
+ </span>
19
+ </slot>
22
20
  </div>
23
21
  <div ref="wrapperEl" :class="cls.e('content-wrapper')" :aria-hidden="!isActive">
24
- <div :class="cls.e('content')">
22
+ <div v-if="contentMounted" :class="cls.e('content')">
25
23
  <slot />
26
24
  </div>
27
25
  </div>
@@ -32,7 +30,7 @@
32
30
  import { useModel } from '@veltra/compositions'
33
31
  import { ArrowDown } from '@veltra/icons/normal'
34
32
  import { bem, ExpandTransition } from '@veltra/utils'
35
- import { computed, inject, onBeforeUnmount, onMounted, ref, watch } from 'vue'
33
+ import { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'
36
34
 
37
35
  import type { CollapseItemEmits, CollapseItemProps } from '../../types'
38
36
  import { UIcon } from '../icon'
@@ -43,6 +41,13 @@ defineOptions({ name: 'UCollapseItem' })
43
41
  const props = withDefaults(defineProps<CollapseItemProps>(), { modelValue: false })
44
42
  const emit = defineEmits<CollapseItemEmits>()
45
43
 
44
+ defineSlots<{
45
+ /** 自定义整个头部,作用域参数 `isActive` 指示展开状态;缺省渲染 title + 展开图标 */
46
+ header?: (scope: { isActive: boolean }) => any
47
+ /** 折叠面板内容 */
48
+ default?: () => any
49
+ }>()
50
+
46
51
  const context = inject(CollapseDIKey, undefined)
47
52
 
48
53
  const cls = context?.cls ?? bem('collapse')
@@ -94,6 +99,9 @@ const handleClick = () => {
94
99
 
95
100
  const wrapperEl = ref<HTMLElement>()
96
101
 
102
+ /** 内容是否挂载:destroyOnCollapse 时折叠态卸载内容 DOM,展开前重新挂载 */
103
+ const contentMounted = ref(isActive.value || !props.destroyOnCollapse)
104
+
97
105
  onMounted(() => {
98
106
  if (context && props.value !== undefined) {
99
107
  context.register(props.value)
@@ -102,9 +110,22 @@ onMounted(() => {
102
110
  expandTransition.setExpanded(wrapperEl.value, isActive.value)
103
111
  })
104
112
 
105
- watch(isActive, (active) => {
113
+ watch(isActive, async (active) => {
114
+ if (active) {
115
+ // 展开前先挂载内容,待 DOM 更新后再测量高度驱动展开动画
116
+ if (!contentMounted.value) {
117
+ contentMounted.value = true
118
+ await nextTick()
119
+ }
120
+ if (!wrapperEl.value || !isActive.value) return
121
+ expandTransition.expand(wrapperEl.value)
122
+ return
123
+ }
106
124
  if (!wrapperEl.value) return
107
- active ? expandTransition.expand(wrapperEl.value) : expandTransition.collapse(wrapperEl.value)
125
+ // 收起动画落定后再卸载内容 DOM;期间被重新展开则不卸载
126
+ expandTransition.collapse(wrapperEl.value, () => {
127
+ if (!isActive.value && props.destroyOnCollapse) contentMounted.value = false
128
+ })
108
129
  })
109
130
 
110
131
  onBeforeUnmount(() => {
@@ -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;
@@ -76,10 +76,14 @@ $root-name: dialog;
76
76
  }
77
77
 
78
78
  @include m.e(body) {
79
- padding: 8px;
80
79
  background-color: fn.use-var(bg-color, top);
81
80
  backdrop-filter: fn.use-var(bg-filter);
82
81
  flex-grow: 1;
82
+
83
+ // padding 加在滚动内容而非 body 本身:u-scroll 的 overflow 会裁切子元素 box-shadow
84
+ @include m.bem(scroll, content) {
85
+ padding: 8px;
86
+ }
83
87
  }
84
88
 
85
89
  @include m.e(footer) {
@@ -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`