@veltra/desktop 1.3.10 → 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 (451) 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 +34 -11
  41. package/dist/components/collapse/collapse-item.js.map +1 -1
  42. package/dist/components/collapse/collapse.js.map +1 -1
  43. package/dist/components/collapse/style.d.ts +1 -1
  44. package/dist/components/collapse/style2.css +29 -51
  45. package/dist/components/condition-editor/components/condition-group.js.map +1 -1
  46. package/dist/components/condition-editor/components/condition-row.js.map +1 -1
  47. package/dist/components/condition-editor/condition-editor.js.map +1 -1
  48. package/dist/components/condition-editor/index.d.ts +2 -2
  49. package/dist/components/contextmenu/contextmenu-item.js +13 -6
  50. package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
  51. package/dist/components/contextmenu/contextmenu-panel.js +12 -6
  52. package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
  53. package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
  54. package/dist/components/contextmenu/contextmenu.js.map +1 -1
  55. package/dist/components/contextmenu/di.d.ts +15 -0
  56. package/dist/components/contextmenu/index.d.ts +3 -2
  57. package/dist/components/contextmenu/style2.css +13 -0
  58. package/dist/components/date-panel/date-panel.js.map +1 -1
  59. package/dist/components/date-panel/headers/day.js.map +1 -1
  60. package/dist/components/date-panel/headers/month.js.map +1 -1
  61. package/dist/components/date-panel/headers/year.js.map +1 -1
  62. package/dist/components/date-panel/panels/day.js.map +1 -1
  63. package/dist/components/date-panel/panels/month.js.map +1 -1
  64. package/dist/components/date-panel/panels/year.js.map +1 -1
  65. package/dist/components/date-panel/style.d.ts +1 -1
  66. package/dist/components/date-picker/date-picker.js.map +1 -1
  67. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  68. package/dist/components/dialog/dialog.js.map +1 -1
  69. package/dist/components/drawer/drawer.js.map +1 -1
  70. package/dist/components/dropdown/dropdown.js.map +1 -1
  71. package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
  72. package/dist/components/dual-nav/dual-nav.js.map +1 -1
  73. package/dist/components/empty/empty.js.map +1 -1
  74. package/dist/components/empty/style.d.ts +1 -1
  75. package/dist/components/expression-editor/components/path-preview.js.map +1 -1
  76. package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
  77. package/dist/components/expression-editor/core/editor.js.map +1 -1
  78. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  79. package/dist/components/expression-editor/style.d.ts +1 -1
  80. package/dist/components/file-picker/file-picker.js.map +1 -1
  81. package/dist/components/file-picker/style.d.ts +1 -1
  82. package/dist/components/file-viewer/file-viewer.js.map +1 -1
  83. package/dist/components/file-viewer/helper.js +1 -38
  84. package/dist/components/file-viewer/helper.js.map +1 -1
  85. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
  86. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
  87. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
  88. package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
  89. package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
  90. package/dist/components/file-viewer/previewers/sheet-previewer.js +68 -37
  91. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
  92. package/dist/components/file-viewer/previewers/text-previewer.js +2 -2
  93. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
  94. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
  95. package/dist/components/file-viewer/style.d.ts +1 -1
  96. package/dist/components/float-button/float-button.js.map +1 -1
  97. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/components/form/style.d.ts +1 -1
  99. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  100. package/dist/components/form-item/style.d.ts +1 -1
  101. package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
  102. package/dist/components/gantt-chart/style.d.ts +1 -1
  103. package/dist/components/grid/grid-item.js.map +1 -1
  104. package/dist/components/grid/grid.js +3 -2
  105. package/dist/components/grid/grid.js.map +1 -1
  106. package/dist/components/grid/style.d.ts +1 -1
  107. package/dist/components/grid-input/grid-input.js.map +1 -1
  108. package/dist/components/grid-input/style.d.ts +1 -1
  109. package/dist/components/group-input/group-input.js.map +1 -1
  110. package/dist/components/group-nav/group-nav-item.js.map +1 -1
  111. package/dist/components/group-nav/group-nav.js.map +1 -1
  112. package/dist/components/group-nav/style.d.ts +1 -1
  113. package/dist/components/icon/icon.js.map +1 -1
  114. package/dist/components/icon/style.d.ts +1 -1
  115. package/dist/components/index.d.ts +91 -156
  116. package/dist/components/index.js +4 -1
  117. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/components/kbd/kbd.js.map +1 -1
  119. package/dist/components/kbd/style.d.ts +1 -1
  120. package/dist/components/layout/layout-resizer.js.map +1 -1
  121. package/dist/components/layout/layout.js.map +1 -1
  122. package/dist/components/layout/style.d.ts +1 -1
  123. package/dist/components/list/list-item.js.map +1 -1
  124. package/dist/components/list/list.js.map +1 -1
  125. package/dist/components/loading/directive.js +2 -1
  126. package/dist/components/loading/directive.js.map +1 -1
  127. package/dist/components/loading/index.d.ts +2 -2
  128. package/dist/components/loading/loading.js.map +1 -1
  129. package/dist/components/message/index.d.ts +2 -2
  130. package/dist/components/message/message-box.js.map +1 -1
  131. package/dist/components/message/message.js.map +1 -1
  132. package/dist/components/message/style.d.ts +1 -1
  133. package/dist/components/message-confirm/index.d.ts +2 -2
  134. package/dist/components/message-confirm/message-confirm-box.js.map +1 -1
  135. package/dist/components/message-confirm/message-confirm.js.map +1 -1
  136. package/dist/components/message-confirm/style.d.ts +1 -1
  137. package/dist/components/message-confirm/style2.css +18 -0
  138. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  139. package/dist/components/multi-select/multi-select.js +6 -3
  140. package/dist/components/multi-select/multi-select.js.map +1 -1
  141. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  142. package/dist/components/nav/nav-icon.js.map +1 -1
  143. package/dist/components/nav/nav-item-collapsed.js.map +1 -1
  144. package/dist/components/nav/nav-item.js +4 -2
  145. package/dist/components/nav/nav-item.js.map +1 -1
  146. package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
  147. package/dist/components/nav/nav-sub.js.map +1 -1
  148. package/dist/components/nav/nav.js.map +1 -1
  149. package/dist/components/nav/style.d.ts +1 -1
  150. package/dist/components/node-render/style.d.ts +1 -1
  151. package/dist/components/notification/index.d.ts +2 -2
  152. package/dist/components/notification/notification-box.js +2 -2
  153. package/dist/components/notification/notification-box.js.map +1 -1
  154. package/dist/components/notification/notification.js.map +1 -1
  155. package/dist/components/notification/style.d.ts +1 -1
  156. package/dist/components/number/number.js.map +1 -1
  157. package/dist/components/number/style.d.ts +1 -1
  158. package/dist/components/number-input/number-input.js +2 -1
  159. package/dist/components/number-input/number-input.js.map +1 -1
  160. package/dist/components/number-range-input/number-range-input.js.map +1 -1
  161. package/dist/components/paginator/paginator.js.map +1 -1
  162. package/dist/components/palette/palette-alpha.js.map +1 -1
  163. package/dist/components/palette/palette-color-switch.js.map +1 -1
  164. package/dist/components/palette/palette-hue.js.map +1 -1
  165. package/dist/components/palette/palette-sv.js.map +1 -1
  166. package/dist/components/palette/palette.js.map +1 -1
  167. package/dist/components/password-input/password-input.js.map +1 -1
  168. package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
  169. package/dist/components/progress/progress.js.map +1 -1
  170. package/dist/components/progress/style.d.ts +1 -1
  171. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  172. package/dist/components/progress-nodes/style.d.ts +1 -1
  173. package/dist/components/radio/radio.js.map +1 -1
  174. package/dist/components/radio-group/radio-group.js.map +1 -1
  175. package/dist/components/rich-text-editor/rich-text-editor.js +2 -1
  176. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  177. package/dist/components/rich-text-editor/style.d.ts +1 -1
  178. package/dist/components/rich-text-editor/toolbar.js +3 -4
  179. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  180. package/dist/components/scroll/scroll-bar.js.map +1 -1
  181. package/dist/components/scroll/scroll.js.map +1 -1
  182. package/dist/components/scroll/style.d.ts +1 -1
  183. package/dist/components/select/select.js.map +1 -1
  184. package/dist/components/slider/slider-thumb.js.map +1 -1
  185. package/dist/components/slider/slider.js.map +1 -1
  186. package/dist/components/slider/style.d.ts +1 -1
  187. package/dist/components/steps/steps.js.map +1 -1
  188. package/dist/components/steps/style.d.ts +1 -1
  189. package/dist/components/steps/style2.css +14 -14
  190. package/dist/components/switch/style.d.ts +1 -1
  191. package/dist/components/switch/switch.js.map +1 -1
  192. package/dist/components/table/index.d.ts +2 -2
  193. package/dist/components/table/node/col.d.ts +1 -49
  194. package/dist/components/table/table-body.js.map +1 -1
  195. package/dist/components/table/table-cell.js.map +1 -1
  196. package/dist/components/table/table-foot.js.map +1 -1
  197. package/dist/components/table/table-row.js +2 -1
  198. package/dist/components/table/table-row.js.map +1 -1
  199. package/dist/components/table/table.js.map +1 -1
  200. package/dist/components/table/use-check.js +2 -1
  201. package/dist/components/table/use-check.js.map +1 -1
  202. package/dist/components/table/use-columns.d.ts +1 -1
  203. package/dist/components/table/use-rows.js +2 -1
  204. package/dist/components/table/use-rows.js.map +1 -1
  205. package/dist/components/table-editor/table-editor.js.map +1 -1
  206. package/dist/components/tabs/tabs-horizontal.js +2 -1
  207. package/dist/components/tabs/tabs-horizontal.js.map +1 -1
  208. package/dist/components/tabs/tabs-vertical.js.map +1 -1
  209. package/dist/components/tabs/tabs.js.map +1 -1
  210. package/dist/components/tabs/use-tabs-bar.js +10 -25
  211. package/dist/components/tabs/use-tabs-bar.js.map +1 -1
  212. package/dist/components/tag/style.d.ts +1 -1
  213. package/dist/components/tag/tag.js.map +1 -1
  214. package/dist/components/text/style.d.ts +1 -1
  215. package/dist/components/text/text.js.map +1 -1
  216. package/dist/components/textarea/textarea.js.map +1 -1
  217. package/dist/components/theme/theme.js +3 -2
  218. package/dist/components/theme/theme.js.map +1 -1
  219. package/dist/components/tip/style.d.ts +1 -1
  220. package/dist/components/tip/tip.js.map +1 -1
  221. package/dist/components/tree/tree-node.js.map +1 -1
  222. package/dist/components/tree/tree.js.map +1 -1
  223. package/dist/components/tree-select/tree-select.js.map +1 -1
  224. package/dist/components/watermark/style.d.ts +1 -1
  225. package/dist/components/watermark/watermark.js.map +1 -1
  226. package/dist/index.d.ts +93 -97
  227. package/dist/index.js +2 -1
  228. package/dist/node_modules/.bun/@codemirror_autocomplete@6.20.3/node_modules/@codemirror/autocomplete/dist/index.js +2 -2
  229. package/dist/node_modules/.bun/@codemirror_autocomplete@6.20.3/node_modules/@codemirror/autocomplete/dist/index.js.map +1 -1
  230. package/dist/node_modules/.bun/@codemirror_commands@6.10.4/node_modules/@codemirror/commands/dist/index.js +3 -3
  231. package/dist/node_modules/.bun/@codemirror_commands@6.10.4/node_modules/@codemirror/commands/dist/index.js.map +1 -1
  232. package/dist/node_modules/.bun/@codemirror_lang-css@6.3.1/node_modules/@codemirror/lang-css/dist/index.js.map +1 -1
  233. package/dist/node_modules/.bun/@codemirror_lang-html@6.4.11/node_modules/@codemirror/lang-html/dist/index.js +5 -4
  234. package/dist/node_modules/.bun/@codemirror_lang-html@6.4.11/node_modules/@codemirror/lang-html/dist/index.js.map +1 -1
  235. package/dist/node_modules/.bun/@codemirror_lang-javascript@6.2.5/node_modules/@codemirror/lang-javascript/dist/index.js +2 -2
  236. 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
  237. package/dist/node_modules/.bun/@codemirror_lang-markdown@6.5.2/node_modules/@codemirror/lang-markdown/dist/index.js.map +1 -0
  238. package/dist/node_modules/.bun/@codemirror_lang-sql@6.10.0/node_modules/@codemirror/lang-sql/dist/index.js +2 -1
  239. package/dist/node_modules/.bun/@codemirror_lang-sql@6.10.0/node_modules/@codemirror/lang-sql/dist/index.js.map +1 -1
  240. package/dist/node_modules/.bun/@codemirror_language@6.12.4/node_modules/@codemirror/language/dist/index.js +2 -2
  241. package/dist/node_modules/.bun/@codemirror_language@6.12.4/node_modules/@codemirror/language/dist/index.js.map +1 -1
  242. package/dist/node_modules/.bun/@codemirror_lint@6.9.7/node_modules/@codemirror/lint/dist/index.js +4 -3
  243. package/dist/node_modules/.bun/@codemirror_lint@6.9.7/node_modules/@codemirror/lint/dist/index.js.map +1 -1
  244. package/dist/node_modules/.bun/@codemirror_search@6.7.1/node_modules/@codemirror/search/dist/index.js +2 -2
  245. package/dist/node_modules/.bun/@codemirror_search@6.7.1/node_modules/@codemirror/search/dist/index.js.map +1 -1
  246. package/dist/node_modules/.bun/{@codemirror_state@6.7.0 → @codemirror_state@6.7.1}/node_modules/@codemirror/state/dist/index.js +13 -3
  247. package/dist/node_modules/.bun/@codemirror_state@6.7.1/node_modules/@codemirror/state/dist/index.js.map +1 -0
  248. package/dist/node_modules/.bun/@codemirror_theme-one-dark@6.1.3/node_modules/@codemirror/theme-one-dark/dist/index.js +1 -1
  249. package/dist/node_modules/.bun/@codemirror_theme-one-dark@6.1.3/node_modules/@codemirror/theme-one-dark/dist/index.js.map +1 -1
  250. package/dist/node_modules/.bun/{@codemirror_view@6.43.4 → @codemirror_view@6.43.8}/node_modules/@codemirror/view/dist/index.js +86 -64
  251. package/dist/node_modules/.bun/@codemirror_view@6.43.8/node_modules/@codemirror/view/dist/index.js.map +1 -0
  252. package/dist/node_modules/.bun/@lezer_common@1.5.2/node_modules/@lezer/common/dist/index.js.map +1 -1
  253. package/dist/node_modules/.bun/@lezer_css@1.3.4/node_modules/@lezer/css/dist/index.js.map +1 -1
  254. package/dist/node_modules/.bun/@lezer_highlight@1.2.3/node_modules/@lezer/highlight/dist/index.js.map +1 -1
  255. package/dist/node_modules/.bun/@lezer_html@1.3.13/node_modules/@lezer/html/dist/index.js.map +1 -1
  256. package/dist/node_modules/.bun/@lezer_javascript@1.5.4/node_modules/@lezer/javascript/dist/index.js.map +1 -1
  257. package/dist/node_modules/.bun/@lezer_lr@1.4.10/node_modules/@lezer/lr/dist/index.js.map +1 -1
  258. package/dist/node_modules/.bun/@lezer_markdown@1.7.2/node_modules/@lezer/markdown/dist/index.js +1 -1
  259. package/dist/node_modules/.bun/@lezer_markdown@1.7.2/node_modules/@lezer/markdown/dist/index.js.map +1 -1
  260. package/dist/node_modules/.bun/@marijn_find-cluster-break@1.0.2/node_modules/@marijn/find-cluster-break/src/index.js.map +1 -1
  261. package/dist/node_modules/.bun/style-mod@4.1.3/node_modules/style-mod/src/style-mod.js.map +1 -1
  262. package/dist/types/collapse.d.ts +23 -4
  263. package/dist/types/contextmenu.d.ts +10 -4
  264. package/dist/types/index.d.ts +2 -8
  265. package/package.json +34 -30
  266. package/src/components/batch-edit/__test__/batch-edit.test.ts +199 -0
  267. package/src/components/batch-edit/batch-edit-form.vue +8 -8
  268. package/src/components/batch-edit/batch-edit.vue +2 -1
  269. package/src/components/batch-edit/di.ts +2 -0
  270. package/src/components/batch-edit/use-edit-state.ts +19 -12
  271. package/src/components/collapse/__test__/collapse.test.ts +178 -1
  272. package/src/components/collapse/collapse-item.vue +40 -12
  273. package/src/components/collapse/style.scss +26 -62
  274. package/src/components/contextmenu/__test__/contextmenu.test.ts +165 -0
  275. package/src/components/contextmenu/contextmenu-item.vue +7 -4
  276. package/src/components/contextmenu/contextmenu-panel.vue +7 -4
  277. package/src/components/contextmenu/index.ts +1 -0
  278. package/src/components/contextmenu/style.scss +16 -0
  279. package/src/components/file-viewer/helper.ts +0 -53
  280. package/src/components/file-viewer/previewers/sheet-previewer.vue +91 -46
  281. package/src/components/message-confirm/style.scss +19 -0
  282. package/src/components/notification/style.scss +16 -4
  283. package/src/components/radio-group/style.scss +1 -1
  284. package/src/components/slider/style.scss +1 -1
  285. package/src/components/steps/style.scss +2 -2
  286. package/src/components/tabs/use-tabs-bar.ts +15 -20
  287. package/src/types/collapse.ts +25 -3
  288. package/src/types/contextmenu.ts +10 -4
  289. package/dist/components/action/action-group.vue.d.ts +0 -25
  290. package/dist/components/action/action.vue.d.ts +0 -33
  291. package/dist/components/action/index.d.ts +0 -3
  292. package/dist/components/auto-complete/auto-complete.vue.d.ts +0 -41
  293. package/dist/components/auto-complete/index.d.ts +0 -2
  294. package/dist/components/badge/badge.vue.d.ts +0 -20
  295. package/dist/components/badge/index.d.ts +0 -2
  296. package/dist/components/batch-edit/batch-edit.vue.d.ts +0 -45
  297. package/dist/components/breadcrumb/breadcrumb.vue.d.ts +0 -24
  298. package/dist/components/breadcrumb/index.d.ts +0 -2
  299. package/dist/components/button/button-group.vue.d.ts +0 -19
  300. package/dist/components/button/button.vue.d.ts +0 -27
  301. package/dist/components/button/index.d.ts +0 -3
  302. package/dist/components/calendar/calendar.vue.d.ts +0 -17
  303. package/dist/components/calendar/index.d.ts +0 -2
  304. package/dist/components/card/card-action.vue.d.ts +0 -18
  305. package/dist/components/card/card-content.vue.d.ts +0 -18
  306. package/dist/components/card/card-cover.vue.d.ts +0 -8
  307. package/dist/components/card/card-header.vue.d.ts +0 -16
  308. package/dist/components/card/card.vue.d.ts +0 -18
  309. package/dist/components/card/index.d.ts +0 -6
  310. package/dist/components/cascade/cascade.vue.d.ts +0 -31
  311. package/dist/components/cascade/index.d.ts +0 -2
  312. package/dist/components/check-tag/check-tag.vue.d.ts +0 -22
  313. package/dist/components/check-tag/index.d.ts +0 -2
  314. package/dist/components/checkbox/checkbox-button.vue.d.ts +0 -35
  315. package/dist/components/checkbox/checkbox.vue.d.ts +0 -34
  316. package/dist/components/checkbox/index.d.ts +0 -3
  317. package/dist/components/checkbox-group/checkbox-group.vue.d.ts +0 -24
  318. package/dist/components/checkbox-group/index.d.ts +0 -2
  319. package/dist/components/code-editor/code-editor.vue.d.ts +0 -30
  320. package/dist/components/code-editor/index.d.ts +0 -2
  321. package/dist/components/collapse/collapse-item.vue.d.ts +0 -24
  322. package/dist/components/collapse/collapse.vue.d.ts +0 -27
  323. package/dist/components/collapse/index.d.ts +0 -3
  324. package/dist/components/condition-editor/condition-editor.vue.d.ts +0 -15
  325. package/dist/components/contextmenu/contextmenu.vue.d.ts +0 -14
  326. package/dist/components/date-panel/date-panel.vue.d.ts +0 -17
  327. package/dist/components/date-panel/index.d.ts +0 -2
  328. package/dist/components/date-picker/date-picker.vue.d.ts +0 -18
  329. package/dist/components/date-picker/index.d.ts +0 -2
  330. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +0 -18
  331. package/dist/components/date-range-picker/index.d.ts +0 -2
  332. package/dist/components/dialog/dialog.vue.d.ts +0 -43
  333. package/dist/components/dialog/index.d.ts +0 -2
  334. package/dist/components/drawer/drawer.vue.d.ts +0 -36
  335. package/dist/components/drawer/index.d.ts +0 -2
  336. package/dist/components/dropdown/dropdown.vue.d.ts +0 -30
  337. package/dist/components/dropdown/index.d.ts +0 -2
  338. package/dist/components/dual-nav/dual-nav.vue.d.ts +0 -15
  339. package/dist/components/dual-nav/index.d.ts +0 -2
  340. package/dist/components/empty/empty.vue.d.ts +0 -11
  341. package/dist/components/empty/index.d.ts +0 -2
  342. package/dist/components/expression-editor/expression-editor.vue.d.ts +0 -16
  343. package/dist/components/expression-editor/index.d.ts +0 -2
  344. package/dist/components/file-picker/file-picker.vue.d.ts +0 -27
  345. package/dist/components/file-picker/index.d.ts +0 -2
  346. package/dist/components/file-viewer/file-viewer.vue.d.ts +0 -40
  347. package/dist/components/file-viewer/index.d.ts +0 -2
  348. package/dist/components/file-viewer/sheet-parser.js +0 -46
  349. package/dist/components/file-viewer/sheet-parser.js.map +0 -1
  350. package/dist/components/float-button/float-button.vue.d.ts +0 -12
  351. package/dist/components/float-button/index.d.ts +0 -2
  352. package/dist/components/form/form.vue.d.ts +0 -23
  353. package/dist/components/form/index.d.ts +0 -2
  354. package/dist/components/form-item/form-item.vue.d.ts +0 -21
  355. package/dist/components/form-item/index.d.ts +0 -2
  356. package/dist/components/gantt-chart/gantt-chart.vue.d.ts +0 -8
  357. package/dist/components/gantt-chart/index.d.ts +0 -2
  358. package/dist/components/grid/grid-item.vue.d.ts +0 -20
  359. package/dist/components/grid/grid.vue.d.ts +0 -27
  360. package/dist/components/grid/index.d.ts +0 -3
  361. package/dist/components/grid-input/grid-input.vue.d.ts +0 -19
  362. package/dist/components/grid-input/index.d.ts +0 -2
  363. package/dist/components/group-input/group-input.vue.d.ts +0 -26
  364. package/dist/components/group-input/index.d.ts +0 -2
  365. package/dist/components/group-nav/group-nav.vue.d.ts +0 -12
  366. package/dist/components/group-nav/index.d.ts +0 -2
  367. package/dist/components/icon/icon.vue.d.ts +0 -18
  368. package/dist/components/icon/index.d.ts +0 -2
  369. package/dist/components/input/index.d.ts +0 -2
  370. package/dist/components/input/input.vue.d.ts +0 -50
  371. package/dist/components/kbd/kbd.vue.d.ts +0 -16
  372. package/dist/components/layout/index.d.ts +0 -2
  373. package/dist/components/layout/layout.vue.d.ts +0 -20
  374. package/dist/components/list/index.d.ts +0 -3
  375. package/dist/components/list/list-item.vue.d.ts +0 -16
  376. package/dist/components/list/list.vue.d.ts +0 -21
  377. package/dist/components/loading/loading.vue.d.ts +0 -11
  378. package/dist/components/message/message.vue.d.ts +0 -16
  379. package/dist/components/message-confirm/message-confirm.vue.d.ts +0 -19
  380. package/dist/components/multi-select/index.d.ts +0 -2
  381. package/dist/components/multi-select/multi-select.vue.d.ts +0 -48
  382. package/dist/components/multi-tree-select/index.d.ts +0 -2
  383. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +0 -44
  384. package/dist/components/nav/index.d.ts +0 -4
  385. package/dist/components/nav/nav-item.vue.d.ts +0 -12
  386. package/dist/components/nav/nav-sub.vue.d.ts +0 -13
  387. package/dist/components/nav/nav.vue.d.ts +0 -19
  388. package/dist/components/notification/notification.vue.d.ts +0 -18
  389. package/dist/components/number/index.d.ts +0 -2
  390. package/dist/components/number/number.vue.d.ts +0 -11
  391. package/dist/components/number-input/index.d.ts +0 -2
  392. package/dist/components/number-input/number-input.vue.d.ts +0 -39
  393. package/dist/components/number-range-input/index.d.ts +0 -2
  394. package/dist/components/number-range-input/number-range-input.vue.d.ts +0 -36
  395. package/dist/components/paginator/index.d.ts +0 -2
  396. package/dist/components/paginator/paginator.vue.d.ts +0 -29
  397. package/dist/components/palette/index.d.ts +0 -2
  398. package/dist/components/palette/palette.vue.d.ts +0 -20
  399. package/dist/components/password-input/index.d.ts +0 -2
  400. package/dist/components/password-input/password-input.vue.d.ts +0 -30
  401. package/dist/components/pop-confirm/index.d.ts +0 -2
  402. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +0 -33
  403. package/dist/components/progress/index.d.ts +0 -2
  404. package/dist/components/progress/progress.vue.d.ts +0 -25
  405. package/dist/components/progress-nodes/index.d.ts +0 -2
  406. package/dist/components/progress-nodes/progress-nodes.vue.d.ts +0 -36
  407. package/dist/components/radio/index.d.ts +0 -2
  408. package/dist/components/radio/radio.vue.d.ts +0 -31
  409. package/dist/components/radio-group/index.d.ts +0 -2
  410. package/dist/components/radio-group/radio-group.vue.d.ts +0 -26
  411. package/dist/components/rich-text-editor/index.d.ts +0 -2
  412. package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +0 -23
  413. package/dist/components/scroll/index.d.ts +0 -2
  414. package/dist/components/scroll/scroll.vue.d.ts +0 -28
  415. package/dist/components/select/index.d.ts +0 -2
  416. package/dist/components/select/select.vue.d.ts +0 -38
  417. package/dist/components/slider/index.d.ts +0 -2
  418. package/dist/components/slider/slider.vue.d.ts +0 -21
  419. package/dist/components/steps/index.d.ts +0 -2
  420. package/dist/components/steps/steps.vue.d.ts +0 -29
  421. package/dist/components/switch/index.d.ts +0 -2
  422. package/dist/components/switch/switch.vue.d.ts +0 -24
  423. package/dist/components/table/node/row.d.ts +0 -49
  424. package/dist/components/table/table.vue.d.ts +0 -54
  425. package/dist/components/table-editor/index.d.ts +0 -2
  426. package/dist/components/table-editor/table-editor.vue.d.ts +0 -12
  427. package/dist/components/tabs/index.d.ts +0 -4
  428. package/dist/components/tabs/tabs-horizontal.vue.d.ts +0 -40
  429. package/dist/components/tabs/tabs-vertical.vue.d.ts +0 -39
  430. package/dist/components/tabs/tabs.vue.d.ts +0 -36
  431. package/dist/components/tag/index.d.ts +0 -2
  432. package/dist/components/tag/tag.vue.d.ts +0 -22
  433. package/dist/components/text/index.d.ts +0 -2
  434. package/dist/components/text/text.vue.d.ts +0 -10
  435. package/dist/components/textarea/index.d.ts +0 -2
  436. package/dist/components/textarea/textarea.vue.d.ts +0 -34
  437. package/dist/components/theme/index.d.ts +0 -2
  438. package/dist/components/theme/theme.vue.d.ts +0 -8
  439. package/dist/components/tip/index.d.ts +0 -2
  440. package/dist/components/tip/tip.vue.d.ts +0 -31
  441. package/dist/components/tree/di.d.ts +0 -12
  442. package/dist/components/tree/index.d.ts +0 -2
  443. package/dist/components/tree/tree.vue.d.ts +0 -40
  444. package/dist/components/tree-select/index.d.ts +0 -2
  445. package/dist/components/tree-select/tree-select.vue.d.ts +0 -48
  446. package/dist/components/watermark/index.d.ts +0 -2
  447. package/dist/components/watermark/watermark.vue.d.ts +0 -21
  448. package/dist/node_modules/.bun/@codemirror_lang-markdown@6.5.1/node_modules/@codemirror/lang-markdown/dist/index.js.map +0 -1
  449. package/dist/node_modules/.bun/@codemirror_state@6.7.0/node_modules/@codemirror/state/dist/index.js.map +0 -1
  450. package/dist/node_modules/.bun/@codemirror_view@6.43.4/node_modules/@codemirror/view/dist/index.js.map +0 -1
  451. package/src/components/file-viewer/sheet-parser.ts +0 -52
@@ -1,4 +1,4 @@
1
- import { describe, expect, it } from 'vitest'
1
+ import { describe, expect, it, vi } from 'vitest'
2
2
  import { createApp, h, nextTick, ref } from 'vue'
3
3
 
4
4
  import UCollapseItem from '../collapse-item.vue'
@@ -176,3 +176,180 @@ describe('Collapse', () => {
176
176
  }
177
177
  })
178
178
  })
179
+
180
+ function mountStandaloneItem(props: Record<string, unknown> = {}) {
181
+ const host = document.createElement('div')
182
+ document.body.appendChild(host)
183
+
184
+ const model = ref(props.modelValue ?? false)
185
+ const onChange = vi.fn()
186
+
187
+ const app = createApp({
188
+ render() {
189
+ return h(
190
+ UCollapseItem,
191
+ {
192
+ ...props,
193
+ modelValue: model.value,
194
+ 'onUpdate:modelValue': (value: boolean) => {
195
+ model.value = value
196
+ },
197
+ onChange
198
+ },
199
+ () => 'Standalone content'
200
+ )
201
+ }
202
+ })
203
+
204
+ app.mount(host)
205
+
206
+ return {
207
+ host,
208
+ model,
209
+ onChange,
210
+ unmount() {
211
+ app.unmount()
212
+ host.remove()
213
+ }
214
+ }
215
+ }
216
+
217
+ describe('CollapseItem standalone', () => {
218
+ it('renders bordered card styles without UCollapse parent', async () => {
219
+ const { host, unmount } = mountStandaloneItem({ title: 'Standalone' })
220
+
221
+ try {
222
+ await nextTick()
223
+ expect(host.querySelector('.u-collapse__item')).toBeTruthy()
224
+ expect(host.querySelector('.u-collapse__header')).toBeTruthy()
225
+ expect(host.querySelector('.u-collapse__title')?.textContent).toBe('Standalone')
226
+ } finally {
227
+ unmount()
228
+ }
229
+ })
230
+
231
+ it('defaults to collapsed when no v-model is provided', async () => {
232
+ const { host, model, unmount } = mountStandaloneItem({ title: 'Standalone' })
233
+
234
+ try {
235
+ await nextTick()
236
+ expect(model.value).toBe(false)
237
+ expect(host.querySelector('.u-collapse__item.is-active')).toBeFalsy()
238
+ expect(host.querySelector('.u-collapse__content-wrapper')?.getAttribute('aria-hidden')).toBe(
239
+ 'true'
240
+ )
241
+ } finally {
242
+ unmount()
243
+ }
244
+ })
245
+
246
+ it('respects v-model initial expanded state', async () => {
247
+ const { host, model, unmount } = mountStandaloneItem({ title: 'Standalone', modelValue: true })
248
+
249
+ try {
250
+ await nextTick()
251
+ expect(model.value).toBe(true)
252
+ expect(host.querySelector('.u-collapse__item.is-active')).toBeTruthy()
253
+ } finally {
254
+ unmount()
255
+ }
256
+ })
257
+
258
+ it('toggles via header click and emits update:modelValue / change', async () => {
259
+ const { host, model, onChange, unmount } = mountStandaloneItem({ title: 'Standalone' })
260
+
261
+ try {
262
+ await nextTick()
263
+ const header = host.querySelector('.u-collapse__header') as HTMLElement
264
+
265
+ header.click()
266
+ await nextTick()
267
+
268
+ expect(model.value).toBe(true)
269
+ expect(onChange).toHaveBeenCalledWith(true)
270
+ expect(host.querySelector('.u-collapse__item.is-active')).toBeTruthy()
271
+
272
+ header.click()
273
+ await nextTick()
274
+
275
+ expect(model.value).toBe(false)
276
+ expect(onChange).toHaveBeenLastCalledWith(false)
277
+ expect(host.querySelector('.u-collapse__item.is-active')).toBeFalsy()
278
+ } finally {
279
+ unmount()
280
+ }
281
+ })
282
+
283
+ it('does not toggle when disabled', async () => {
284
+ const { host, model, onChange, unmount } = mountStandaloneItem({
285
+ title: 'Standalone',
286
+ disabled: true
287
+ })
288
+
289
+ try {
290
+ await nextTick()
291
+ ;(host.querySelector('.u-collapse__header') as HTMLElement).click()
292
+ await nextTick()
293
+
294
+ expect(model.value).toBe(false)
295
+ expect(onChange).not.toHaveBeenCalled()
296
+ } finally {
297
+ unmount()
298
+ }
299
+ })
300
+
301
+ it('ignores v-model when nested inside UCollapse', async () => {
302
+ const host = document.createElement('div')
303
+ document.body.appendChild(host)
304
+
305
+ const standaloneModel = ref(true)
306
+ const collapseModel = ref<string[] | undefined>()
307
+
308
+ const app = createApp({
309
+ render() {
310
+ return h(
311
+ UCollapse,
312
+ {
313
+ modelValue: collapseModel.value,
314
+ defaultCollapseAll: true,
315
+ 'onUpdate:modelValue': (value: string[] | undefined) => {
316
+ collapseModel.value = value
317
+ }
318
+ },
319
+ () =>
320
+ h(
321
+ UCollapseItem,
322
+ {
323
+ value: 'a',
324
+ title: 'Nested',
325
+ modelValue: standaloneModel.value,
326
+ 'onUpdate:modelValue': (value: boolean) => {
327
+ standaloneModel.value = value
328
+ }
329
+ },
330
+ () => 'Nested content'
331
+ )
332
+ )
333
+ }
334
+ })
335
+
336
+ app.mount(host)
337
+
338
+ try {
339
+ await nextTick()
340
+ expect(collapseModel.value).toBeUndefined()
341
+ expect(standaloneModel.value).toBe(true)
342
+ expect(host.querySelector('.u-collapse__item.is-active')).toBeFalsy()
343
+
344
+ ;(host.querySelector('.u-collapse__header') as HTMLElement).click()
345
+ await nextTick()
346
+
347
+ expect(collapseModel.value).toEqual(['a'])
348
+ expect(standaloneModel.value).toBe(true)
349
+ expect(host.querySelector('.u-collapse__item.is-active')).toBeTruthy()
350
+ } finally {
351
+ app.unmount()
352
+ host.remove()
353
+ }
354
+ })
355
+ })
@@ -29,25 +29,38 @@
29
29
  </template>
30
30
 
31
31
  <script lang="ts" setup>
32
- import { ArrowRight } from '@veltra/icons/normal'
33
- import { bem } from '@veltra/utils'
32
+ import { useModel } from '@veltra/compositions'
33
+ import { ArrowDown } from '@veltra/icons/normal'
34
+ import { bem, ExpandTransition } from '@veltra/utils'
34
35
  import { computed, inject, onBeforeUnmount, onMounted, ref, watch } from 'vue'
35
36
 
36
- import type { CollapseItemProps } from '../../types'
37
+ import type { CollapseItemEmits, CollapseItemProps } from '../../types'
37
38
  import { UIcon } from '../icon'
38
39
  import { CollapseDIKey } from './di'
39
40
 
40
41
  defineOptions({ name: 'UCollapseItem' })
41
42
 
42
- const props = defineProps<CollapseItemProps>()
43
+ const props = withDefaults(defineProps<CollapseItemProps>(), { modelValue: false })
44
+ const emit = defineEmits<CollapseItemEmits>()
43
45
 
44
- const context = inject(CollapseDIKey)!
46
+ const context = inject(CollapseDIKey, undefined)
45
47
 
46
48
  const cls = context?.cls ?? bem('collapse')
47
49
 
48
- const isActive = computed(() => !!context?.activeValues.value.includes(props.value))
50
+ const standaloneModel = useModel<CollapseItemProps, 'modelValue'>({
51
+ props,
52
+ emit,
53
+ defaultValue: false
54
+ })
55
+
56
+ const isActive = computed(() => {
57
+ if (context) {
58
+ return props.value !== undefined && context.activeValues.value.includes(props.value)
59
+ }
60
+ return !!standaloneModel.value
61
+ })
49
62
 
50
- const iconComponent = computed(() => context?.expandIcon.value ?? ArrowRight)
63
+ const iconComponent = computed(() => context?.expandIcon.value ?? props.expandIcon ?? ArrowDown)
51
64
 
52
65
  const classList = computed(() => [
53
66
  cls.e('item'),
@@ -61,17 +74,30 @@ const headerClassList = computed(() => [
61
74
  bem.is('active', isActive.value)
62
75
  ])
63
76
 
77
+ const expandTransition =
78
+ context?.expandTransition ??
79
+ new ExpandTransition({ transition: 'height 0.24s cubic-bezier(0.4, 0, 0.2, 1)' })
80
+
64
81
  const handleClick = () => {
65
82
  if (props.disabled) return
66
- context?.toggle(props.value)
83
+
84
+ if (context) {
85
+ if (props.value === undefined) return
86
+ context.toggle(props.value)
87
+ return
88
+ }
89
+
90
+ const next = !standaloneModel.value
91
+ standaloneModel.value = next
92
+ emit('change', next)
67
93
  }
68
94
 
69
95
  const wrapperEl = ref<HTMLElement>()
70
96
 
71
- const { expandTransition } = context
72
-
73
97
  onMounted(() => {
74
- context?.register(props.value)
98
+ if (context && props.value !== undefined) {
99
+ context.register(props.value)
100
+ }
75
101
  if (!wrapperEl.value) return
76
102
  expandTransition.setExpanded(wrapperEl.value, isActive.value)
77
103
  })
@@ -82,7 +108,9 @@ watch(isActive, (active) => {
82
108
  })
83
109
 
84
110
  onBeforeUnmount(() => {
85
- context?.unregister(props.value)
111
+ if (context && props.value !== undefined) {
112
+ context.unregister(props.value)
113
+ }
86
114
  if (!wrapperEl.value) return
87
115
  expandTransition.cancel(wrapperEl.value)
88
116
  })
@@ -3,16 +3,9 @@
3
3
 
4
4
  $root-name: collapse;
5
5
 
6
- // 与 tabs/menu 一致的 Material standard 缓动
7
6
  $ease: cubic-bezier(0.4, 0, 0.2, 1);
8
7
  $transition-fast: 0.18s $ease;
9
8
  $transition-normal: 0.24s $ease;
10
- $item-bg: fn.component-var(collapse, item-bg);
11
- $item-hover-bg: fn.component-var(collapse, item-hover-bg);
12
- $item-active-bg: fn.component-var(collapse, item-active-bg);
13
- $header-active-bg: fn.component-var(collapse, header-active-bg);
14
- $content-bg: fn.component-var(collapse, content-bg);
15
- $active-title-color: fn.component-var(collapse, active-title-color, fn.use-var(color, primary));
16
9
 
17
10
  @include m.b($root-name) {
18
11
  width: 100%;
@@ -22,44 +15,15 @@ $active-title-color: fn.component-var(collapse, active-title-color, fn.use-var(c
22
15
 
23
16
  // ===== Item =====
24
17
  @include m.e(item) {
25
- position: relative;
26
- border-radius: calc(fn.use-var(radius, default) + 2px);
18
+ border: fn.use-var(border-muted);
19
+ border-radius: fn.use-var(radius, default);
20
+ background-color: fn.use-var(bg-color, middle);
27
21
  overflow: hidden;
28
- background-color: $item-bg;
29
- transition: background-color $transition-fast;
30
-
31
- &::before {
32
- content: '';
33
- position: absolute;
34
- top: 0;
35
- bottom: 0;
36
- left: 0;
37
- width: 3px;
38
- background-color: fn.use-var(color, primary);
39
- opacity: 0;
40
- pointer-events: none;
41
- transition: opacity $transition-fast;
42
- z-index: 1;
43
- }
44
22
 
45
23
  & + #{fn.bem($root-name, item)} {
46
24
  margin-top: fn.use-var(gap, default);
47
25
  }
48
26
 
49
- @include m.is-not(disabled) {
50
- &:hover {
51
- background-color: $item-hover-bg;
52
- }
53
- }
54
-
55
- @include m.is(active) {
56
- background-color: $item-active-bg;
57
-
58
- &::before {
59
- opacity: 1;
60
- }
61
- }
62
-
63
27
  @include m.is(disabled) {
64
28
  opacity: 0.55;
65
29
  }
@@ -70,43 +34,46 @@ $active-title-color: fn.component-var(collapse, active-title-color, fn.use-var(c
70
34
  position: relative;
71
35
  display: flex;
72
36
  align-items: center;
73
- gap: 10px;
37
+ gap: fn.use-var(gap, small);
38
+ padding: fn.use-var(gap, small) fn.use-var(gap, default);
74
39
  cursor: pointer;
75
40
  font-weight: 500;
76
41
  letter-spacing: 0.01em;
77
- color: fn.component-var(collapse, title-color, fn.use-var(text-color, main));
42
+ color: fn.use-var(text-color, main);
78
43
  user-select: none;
79
44
  outline: none;
80
- transition:
81
- color $transition-fast,
82
- background-color $transition-fast;
83
- border-radius: inherit;
45
+ transition: background-color $transition-fast;
46
+ border-radius: 0;
84
47
 
85
48
  &:focus-visible {
86
49
  box-shadow: inset 0 0 0 2px fn.use-var(color, primary);
87
50
  }
88
51
 
52
+ @include m.is-not(disabled) {
53
+ &:hover {
54
+ background-color: fn.use-var(bg-color, hover);
55
+ }
56
+ }
57
+
89
58
  @include m.is(disabled) {
90
59
  cursor: not-allowed;
91
60
  color: fn.use-var(text-color, placeholder);
92
61
  }
93
62
 
94
63
  @include m.is(active) {
95
- font-weight: 600;
96
- color: $active-title-color;
97
- background-color: $header-active-bg;
98
- border-bottom-right-radius: 0;
99
- border-bottom-left-radius: 0;
64
+ background-color: fn.use-var(bg-color, hover);
100
65
 
101
66
  #{fn.bem($root-name, icon)} {
102
- transform: rotate(90deg);
103
- color: $active-title-color;
67
+ transform: rotate(180deg);
104
68
  }
105
69
  }
106
70
  }
107
71
 
108
72
  // ===== Title =====
109
73
  @include m.e(title) {
74
+ display: flex;
75
+ align-items: center;
76
+ gap: fn.use-var(gap, small);
110
77
  flex: 1 1 auto;
111
78
  min-width: 0;
112
79
  line-height: 1.5;
@@ -118,10 +85,8 @@ $active-title-color: fn.component-var(collapse, active-title-color, fn.use-var(c
118
85
  align-items: center;
119
86
  justify-content: center;
120
87
  flex: 0 0 auto;
121
- color: fn.use-var(text-color, placeholder);
122
- transition:
123
- transform $transition-normal,
124
- color $transition-fast;
88
+ color: fn.use-var(text-color, assist);
89
+ transition: transform 0.2s $ease;
125
90
  will-change: transform;
126
91
  }
127
92
 
@@ -129,15 +94,14 @@ $active-title-color: fn.component-var(collapse, active-title-color, fn.use-var(c
129
94
  @include m.e(content-wrapper) {
130
95
  overflow: hidden;
131
96
  height: 0;
132
- border-bottom-right-radius: inherit;
133
- border-bottom-left-radius: inherit;
134
- background-color: $content-bg;
97
+ background-color: transparent;
135
98
  transition: height $transition-normal;
136
99
  }
137
100
 
138
101
  @include m.e(content) {
139
102
  color: fn.use-var(text-color, main);
140
103
  line-height: 1.7;
104
+ padding: fn.use-var(gap, small) fn.use-var(gap, default);
141
105
  }
142
106
 
143
107
  // ===== Sizes =====
@@ -145,17 +109,17 @@ $active-title-color: fn.component-var(collapse, active-title-color, fn.use-var(c
145
109
  font-size: fn.use-var(font-size-main, $size);
146
110
 
147
111
  @include m.bem($root-name, header) {
148
- padding: calc(fn.use-var(gap, $size) - 2px) fn.use-var(gap, $size);
112
+ padding: fn.use-var(gap, $size) fn.use-var(gap, $size);
149
113
  font-size: fn.use-var(font-size-main, $size);
150
114
  }
151
115
 
152
116
  @include m.bem($root-name, content) {
153
117
  font-size: fn.use-var(font-size-main, $size);
154
- padding: calc(fn.use-var(gap, $size) - 2px) fn.use-var(gap, $size) fn.use-var(gap, $size);
118
+ padding: fn.use-var(gap, $size);
155
119
  }
156
120
 
157
121
  #{fn.bem($root-name, item)} {
158
- border-radius: calc(fn.use-var(radius, $size) + 2px);
122
+ border-radius: fn.use-var(radius, $size);
159
123
 
160
124
  & + #{fn.bem($root-name, item)} {
161
125
  margin-top: fn.use-var(gap, $size);
@@ -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'