@veltra/desktop 1.2.9 → 1.2.12

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 (470) hide show
  1. package/dist/components/action/action-group.js.map +1 -1
  2. package/dist/components/action/action-group.vue.d.ts +2 -2
  3. package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js +1 -1
  4. package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  5. package/dist/components/action/action.js +2 -2
  6. package/dist/components/action/action.js.map +1 -1
  7. package/dist/components/action/action.vue.d.ts +1 -1
  8. package/dist/components/auto-complete/auto-complete.js +4 -4
  9. package/dist/components/auto-complete/auto-complete.js.map +1 -1
  10. package/dist/components/auto-complete/auto-complete.vue.d.ts +2 -2
  11. package/dist/components/auto-complete/use-keyboard.js.map +1 -1
  12. package/dist/components/badge/badge.js +2 -2
  13. package/dist/components/badge/badge.js.map +1 -1
  14. package/dist/components/batch-edit/batch-edit-form.js +2 -2
  15. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  16. package/dist/components/batch-edit/batch-edit-list.js +2 -2
  17. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  18. package/dist/components/batch-edit/batch-edit.js +6 -3
  19. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  20. package/dist/components/batch-edit/use-edit-state.js +7 -3
  21. package/dist/components/batch-edit/use-edit-state.js.map +1 -1
  22. package/dist/components/batch-edit/use-features.js.map +1 -1
  23. package/dist/components/batch-edit/use-handlers.js.map +1 -1
  24. package/dist/components/breadcrumb/breadcrumb.js +2 -2
  25. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  26. package/dist/components/button/button-group.js +2 -2
  27. package/dist/components/button/button-group.js.map +1 -1
  28. package/dist/components/button/button.js +2 -2
  29. package/dist/components/button/button.js.map +1 -1
  30. package/dist/components/calendar/calendar.js +3 -3
  31. package/dist/components/calendar/calendar.js.map +1 -1
  32. package/dist/components/calendar/utils.js.map +1 -1
  33. package/dist/components/card/card-action.js +2 -2
  34. package/dist/components/card/card-action.js.map +1 -1
  35. package/dist/components/card/card-content.js +2 -2
  36. package/dist/components/card/card-content.js.map +1 -1
  37. package/dist/components/card/card-cover.js +2 -2
  38. package/dist/components/card/card-cover.js.map +1 -1
  39. package/dist/components/card/card-header.js +2 -2
  40. package/dist/components/card/card-header.js.map +1 -1
  41. package/dist/components/card/card.js +2 -2
  42. package/dist/components/card/card.js.map +1 -1
  43. package/dist/components/cascade/cascade-panel-item.js +1 -1
  44. package/dist/components/cascade/cascade-panel-item.js.map +1 -1
  45. package/dist/components/cascade/cascade.js +7 -3
  46. package/dist/components/cascade/cascade.js.map +1 -1
  47. package/dist/components/cascade/cascade.vue.d.ts +7 -4
  48. package/dist/components/cascade/use-check.js +3 -1
  49. package/dist/components/cascade/use-check.js.map +1 -1
  50. package/dist/components/cascade/use-data-map.js.map +1 -1
  51. package/dist/components/cascade/use-select.js +30 -14
  52. package/dist/components/cascade/use-select.js.map +1 -1
  53. package/dist/components/check-tag/check-tag.js +2 -2
  54. package/dist/components/check-tag/check-tag.js.map +1 -1
  55. package/dist/components/checkbox/checkbox-button.js +4 -4
  56. package/dist/components/checkbox/checkbox-button.js.map +1 -1
  57. package/dist/components/checkbox/checkbox-button.vue.d.ts +2 -2
  58. package/dist/components/checkbox/checkbox.js +4 -4
  59. package/dist/components/checkbox/checkbox.js.map +1 -1
  60. package/dist/components/checkbox/checkbox.vue.d.ts +1 -1
  61. package/dist/components/checkbox-group/checkbox-group.js +4 -4
  62. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  63. package/dist/components/checkbox-group/checkbox-group.vue.d.ts +2 -2
  64. package/dist/components/code-editor/basic-setup.js +44 -0
  65. package/dist/components/code-editor/basic-setup.js.map +1 -0
  66. package/dist/components/code-editor/code-editor.js +5 -5
  67. package/dist/components/code-editor/code-editor.js.map +1 -1
  68. package/dist/components/code-editor/code-editor.vue.d.ts +1 -1
  69. package/dist/components/collapse/collapse-item.js +2 -2
  70. package/dist/components/collapse/collapse-item.js.map +1 -1
  71. package/dist/components/collapse/collapse.js +2 -2
  72. package/dist/components/collapse/collapse.js.map +1 -1
  73. package/dist/components/condition-editor/components/condition-group.js +2 -2
  74. package/dist/components/condition-editor/components/condition-group.js.map +1 -1
  75. package/dist/components/condition-editor/components/condition-row.js +2 -2
  76. package/dist/components/condition-editor/components/condition-row.js.map +1 -1
  77. package/dist/components/condition-editor/condition-editor.js +2 -2
  78. package/dist/components/condition-editor/condition-editor.js.map +1 -1
  79. package/dist/components/condition-editor/core/evaluator.js.map +1 -1
  80. package/dist/components/contextmenu/contextmenu-item.js +2 -2
  81. package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
  82. package/dist/components/contextmenu/contextmenu-panel.js +2 -2
  83. package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
  84. package/dist/components/contextmenu/contextmenu-sub.js +2 -2
  85. package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
  86. package/dist/components/contextmenu/contextmenu.js +2 -2
  87. package/dist/components/contextmenu/contextmenu.js.map +1 -1
  88. package/dist/components/date-panel/date-panel.js +2 -2
  89. package/dist/components/date-panel/date-panel.js.map +1 -1
  90. package/dist/components/date-panel/date-panel.vue.d.ts +1 -1
  91. package/dist/components/date-panel/headers/day.js +2 -2
  92. package/dist/components/date-panel/headers/day.js.map +1 -1
  93. package/dist/components/date-panel/headers/month.js +2 -2
  94. package/dist/components/date-panel/headers/month.js.map +1 -1
  95. package/dist/components/date-panel/headers/year.js +2 -2
  96. package/dist/components/date-panel/headers/year.js.map +1 -1
  97. package/dist/components/date-panel/panels/day.js +2 -2
  98. package/dist/components/date-panel/panels/day.js.map +1 -1
  99. package/dist/components/date-panel/panels/month.js +2 -2
  100. package/dist/components/date-panel/panels/month.js.map +1 -1
  101. package/dist/components/date-panel/panels/year.js +2 -2
  102. package/dist/components/date-panel/panels/year.js.map +1 -1
  103. package/dist/components/date-panel/use-panel-date.js.map +1 -1
  104. package/dist/components/date-picker/date-picker.js +2 -2
  105. package/dist/components/date-picker/date-picker.js.map +1 -1
  106. package/dist/components/date-picker/date-picker.vue.d.ts +2 -2
  107. package/dist/components/date-range-picker/date-range-picker.js +2 -2
  108. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  109. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +2 -2
  110. package/dist/components/dialog/dialog.js +4 -4
  111. package/dist/components/dialog/dialog.js.map +1 -1
  112. package/dist/components/drawer/drawer.js +4 -4
  113. package/dist/components/drawer/drawer.js.map +1 -1
  114. package/dist/components/dropdown/dropdown.js +2 -2
  115. package/dist/components/dropdown/dropdown.js.map +1 -1
  116. package/dist/components/dual-nav/dual-nav-app.js +2 -2
  117. package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
  118. package/dist/components/dual-nav/dual-nav.js +2 -2
  119. package/dist/components/dual-nav/dual-nav.js.map +1 -1
  120. package/dist/components/empty/empty.js +2 -2
  121. package/dist/components/empty/empty.js.map +1 -1
  122. package/dist/components/empty/empty.vue.d.ts +1 -1
  123. package/dist/components/expression-editor/components/path-preview.js +2 -2
  124. package/dist/components/expression-editor/components/path-preview.js.map +1 -1
  125. package/dist/components/expression-editor/components/variable-picker.js +2 -2
  126. package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
  127. package/dist/components/expression-editor/core/editor.js.map +1 -1
  128. package/dist/components/expression-editor/core/model.js.map +1 -1
  129. package/dist/components/expression-editor/expression-editor.js +2 -2
  130. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  131. package/dist/components/file-picker/file-picker.js +2 -2
  132. package/dist/components/file-picker/file-picker.js.map +1 -1
  133. package/dist/components/file-picker/file-picker.vue.d.ts +1 -1
  134. package/dist/components/file-picker/helper.js.map +1 -1
  135. package/dist/components/file-viewer/file-viewer.js +4 -4
  136. package/dist/components/file-viewer/file-viewer.js.map +1 -1
  137. package/dist/components/file-viewer/helper.js.map +1 -1
  138. package/dist/components/file-viewer/previewers/docx-previewer.js +2 -2
  139. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
  140. package/dist/components/file-viewer/previewers/image-previewer.js +2 -2
  141. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
  142. package/dist/components/file-viewer/previewers/pdf-previewer.js +2 -2
  143. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
  144. package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js +2 -2
  145. package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
  146. package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js +2 -2
  147. package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
  148. package/dist/components/file-viewer/previewers/sheet-previewer.js +2 -2
  149. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
  150. package/dist/components/file-viewer/previewers/text-previewer.js +2 -2
  151. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
  152. package/dist/components/file-viewer/previewers/video-previewer.js +2 -2
  153. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
  154. package/dist/components/file-viewer/sheet-parser.js.map +1 -1
  155. package/dist/components/float-button/float-button.js +2 -2
  156. package/dist/components/float-button/float-button.js.map +1 -1
  157. package/dist/components/form/form.js.map +1 -1
  158. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js +1 -1
  159. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
  160. package/dist/components/form/use-form-fields.js.map +1 -1
  161. package/dist/components/form/use-node-interceptor.js.map +1 -1
  162. package/dist/components/form-item/form-item.js.map +1 -1
  163. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js +1 -1
  164. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  165. package/dist/components/form-item/validate.js.map +1 -1
  166. package/dist/components/gantt-chart/gantt-chart.js +2 -2
  167. package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
  168. package/dist/components/grid/breakpoint.js.map +1 -1
  169. package/dist/components/grid/grid-item.js +2 -2
  170. package/dist/components/grid/grid-item.js.map +1 -1
  171. package/dist/components/grid/grid.js +2 -2
  172. package/dist/components/grid/grid.js.map +1 -1
  173. package/dist/components/grid-input/grid-input.js +2 -2
  174. package/dist/components/grid-input/grid-input.js.map +1 -1
  175. package/dist/components/group-input/group-input.js +2 -2
  176. package/dist/components/group-input/group-input.js.map +1 -1
  177. package/dist/components/icon/icon.js +2 -2
  178. package/dist/components/icon/icon.js.map +1 -1
  179. package/dist/components/input/input.js.map +1 -1
  180. package/dist/components/input/input.vue.d.ts +4 -4
  181. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js +1 -1
  182. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  183. package/dist/components/kbd/kbd.js +2 -2
  184. package/dist/components/kbd/kbd.js.map +1 -1
  185. package/dist/components/layout/layout-resizer.js +2 -2
  186. package/dist/components/layout/layout-resizer.js.map +1 -1
  187. package/dist/components/layout/layout.js +2 -2
  188. package/dist/components/layout/layout.js.map +1 -1
  189. package/dist/components/list/list-item.js +2 -2
  190. package/dist/components/list/list-item.js.map +1 -1
  191. package/dist/components/list/list.js +2 -2
  192. package/dist/components/list/list.js.map +1 -1
  193. package/dist/components/loading/directive.js.map +1 -1
  194. package/dist/components/loading/loading.js +2 -2
  195. package/dist/components/loading/loading.js.map +1 -1
  196. package/dist/components/message/message-box.js +2 -2
  197. package/dist/components/message/message-box.js.map +1 -1
  198. package/dist/components/message/message.js +2 -2
  199. package/dist/components/message/message.js.map +1 -1
  200. package/dist/components/message/message2.js.map +1 -1
  201. package/dist/components/message-confirm/message-confirm.js +2 -2
  202. package/dist/components/message-confirm/message-confirm.js.map +1 -1
  203. package/dist/components/multi-select/multi-select-option.js +2 -2
  204. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  205. package/dist/components/multi-select/multi-select.js +4 -4
  206. package/dist/components/multi-select/multi-select.js.map +1 -1
  207. package/dist/components/multi-select/multi-select.vue.d.ts +3 -3
  208. package/dist/components/multi-tree-select/multi-tree-select.js +4 -4
  209. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  210. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +5 -5
  211. package/dist/components/nav/nav-icon.js +2 -2
  212. package/dist/components/nav/nav-icon.js.map +1 -1
  213. package/dist/components/nav/nav-item-collapsed.js +2 -2
  214. package/dist/components/nav/nav-item-collapsed.js.map +1 -1
  215. package/dist/components/nav/nav-item.js +2 -2
  216. package/dist/components/nav/nav-item.js.map +1 -1
  217. package/dist/components/nav/nav-sub-collapsed.js +2 -2
  218. package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
  219. package/dist/components/nav/nav-sub.js +2 -2
  220. package/dist/components/nav/nav-sub.js.map +1 -1
  221. package/dist/components/nav/nav.js +2 -2
  222. package/dist/components/nav/nav.js.map +1 -1
  223. package/dist/components/notification/index.js.map +1 -1
  224. package/dist/components/notification/notification.js +2 -2
  225. package/dist/components/notification/notification.js.map +1 -1
  226. package/dist/components/number/number.js +2 -2
  227. package/dist/components/number/number.js.map +1 -1
  228. package/dist/components/number-input/number-input.js +4 -4
  229. package/dist/components/number-input/number-input.js.map +1 -1
  230. package/dist/components/number-input/number-input.vue.d.ts +4 -4
  231. package/dist/components/number-range-input/number-range-input.js +4 -4
  232. package/dist/components/number-range-input/number-range-input.js.map +1 -1
  233. package/dist/components/number-range-input/number-range-input.vue.d.ts +2 -2
  234. package/dist/components/paginator/paginator.js +4 -4
  235. package/dist/components/paginator/paginator.js.map +1 -1
  236. package/dist/components/palette/color-transform.js.map +1 -1
  237. package/dist/components/palette/palette-alpha.js +2 -2
  238. package/dist/components/palette/palette-alpha.js.map +1 -1
  239. package/dist/components/palette/palette-color-switch.js +1 -1
  240. package/dist/components/palette/palette-color-switch.js.map +1 -1
  241. package/dist/components/palette/palette-hue.js +2 -2
  242. package/dist/components/palette/palette-hue.js.map +1 -1
  243. package/dist/components/palette/palette-sv.js +2 -2
  244. package/dist/components/palette/palette-sv.js.map +1 -1
  245. package/dist/components/palette/palette.js +3 -3
  246. package/dist/components/palette/palette.js.map +1 -1
  247. package/dist/components/palette/palette.vue.d.ts +1 -1
  248. package/dist/components/palette/use-hsv.js.map +1 -1
  249. package/dist/components/password-input/password-input.js +3 -3
  250. package/dist/components/password-input/password-input.js.map +1 -1
  251. package/dist/components/password-input/password-input.vue.d.ts +2 -2
  252. package/dist/components/pop-confirm/pop-confirm.js +2 -2
  253. package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
  254. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +1 -1
  255. package/dist/components/progress/progress.js +2 -2
  256. package/dist/components/progress/progress.js.map +1 -1
  257. package/dist/components/progress-nodes/progress-nodes.js +2 -2
  258. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  259. package/dist/components/radio/radio.js +4 -4
  260. package/dist/components/radio/radio.js.map +1 -1
  261. package/dist/components/radio-group/radio-group.js +4 -4
  262. package/dist/components/radio-group/radio-group.js.map +1 -1
  263. package/dist/components/radio-group/radio-group.vue.d.ts +2 -2
  264. package/dist/components/rich-text-editor/rich-text-editor.js +2 -2
  265. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  266. package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +2 -2
  267. package/dist/components/rich-text-editor/toolbar.js +1 -1
  268. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  269. package/dist/components/scroll/scroll-bar.js +2 -2
  270. package/dist/components/scroll/scroll-bar.js.map +1 -1
  271. package/dist/components/scroll/scroll.js +2 -2
  272. package/dist/components/scroll/scroll.js.map +1 -1
  273. package/dist/components/select/select.js +4 -4
  274. package/dist/components/select/select.js.map +1 -1
  275. package/dist/components/select/select.vue.d.ts +2 -2
  276. package/dist/components/select/use-keyboard.js.map +1 -1
  277. package/dist/components/select/use-options.js.map +1 -1
  278. package/dist/components/slider/slider-thumb.js +1 -1
  279. package/dist/components/slider/slider-thumb.js.map +1 -1
  280. package/dist/components/slider/slider.js +2 -2
  281. package/dist/components/slider/slider.js.map +1 -1
  282. package/dist/components/steps/steps.js +2 -2
  283. package/dist/components/steps/steps.js.map +1 -1
  284. package/dist/components/steps/steps.vue.d.ts +3 -3
  285. package/dist/components/switch/switch.js +4 -4
  286. package/dist/components/switch/switch.js.map +1 -1
  287. package/dist/components/switch/switch.vue.d.ts +1 -1
  288. package/dist/components/table/table-body.js +2 -2
  289. package/dist/components/table/table-body.js.map +1 -1
  290. package/dist/components/table/table-cell.js +2 -2
  291. package/dist/components/table/table-cell.js.map +1 -1
  292. package/dist/components/table/table-foot.js +2 -2
  293. package/dist/components/table/table-foot.js.map +1 -1
  294. package/dist/components/table/table-head.js.map +1 -1
  295. package/dist/components/table/table-row.js.map +1 -1
  296. package/dist/components/table/table.js +2 -2
  297. package/dist/components/table/table.js.map +1 -1
  298. package/dist/components/table/use-check.js.map +1 -1
  299. package/dist/components/table/use-col-resize.js.map +1 -1
  300. package/dist/components/table/use-columns.js.map +1 -1
  301. package/dist/components/table/use-rows.js.map +1 -1
  302. package/dist/components/table/use-table.js.map +1 -1
  303. package/dist/components/table-editor/table-editor.js +2 -2
  304. package/dist/components/table-editor/table-editor.js.map +1 -1
  305. package/dist/components/tabs/tabs-horizontal.js +4 -4
  306. package/dist/components/tabs/tabs-horizontal.js.map +1 -1
  307. package/dist/components/tabs/tabs-horizontal.vue.d.ts +2 -2
  308. package/dist/components/tabs/tabs-vertical.js +4 -4
  309. package/dist/components/tabs/tabs-vertical.js.map +1 -1
  310. package/dist/components/tabs/tabs-vertical.vue.d.ts +2 -2
  311. package/dist/components/tabs/tabs.js +4 -4
  312. package/dist/components/tabs/tabs.js.map +1 -1
  313. package/dist/components/tabs/tabs.vue.d.ts +2 -2
  314. package/dist/components/tag/tag.js +2 -2
  315. package/dist/components/tag/tag.js.map +1 -1
  316. package/dist/components/text/text.js +2 -2
  317. package/dist/components/text/text.js.map +1 -1
  318. package/dist/components/textarea/textarea.js +4 -4
  319. package/dist/components/textarea/textarea.js.map +1 -1
  320. package/dist/components/textarea/textarea.vue.d.ts +4 -4
  321. package/dist/components/theme/theme.js +1 -1
  322. package/dist/components/theme/theme.js.map +1 -1
  323. package/dist/components/tip/tip.js +2 -2
  324. package/dist/components/tip/tip.js.map +1 -1
  325. package/dist/components/tip/tip.vue.d.ts +1 -1
  326. package/dist/components/tip/use-nest.js.map +1 -1
  327. package/dist/components/tree/tree-node.js +2 -2
  328. package/dist/components/tree/tree-node.js.map +1 -1
  329. package/dist/components/tree/tree-node2.js.map +1 -1
  330. package/dist/components/tree/tree.js +2 -2
  331. package/dist/components/tree/tree.js.map +1 -1
  332. package/dist/components/tree/use-check.js.map +1 -1
  333. package/dist/components/tree-select/tree-select.js +7 -6
  334. package/dist/components/tree-select/tree-select.js.map +1 -1
  335. package/dist/components/tree-select/tree-select.vue.d.ts +7 -6
  336. package/dist/components/watermark/watermark.js +2 -2
  337. package/dist/components/watermark/watermark.js.map +1 -1
  338. package/dist/types/cascade.d.ts +10 -6
  339. package/dist/types/tree-select.d.ts +2 -1
  340. package/package.json +24 -20
  341. package/src/components/action/action-group.vue +1 -1
  342. package/src/components/action/action.vue +1 -1
  343. package/src/components/auto-complete/auto-complete.vue +1 -1
  344. package/src/components/badge/badge.vue +1 -1
  345. package/src/components/batch-edit/batch-edit-form.vue +1 -2
  346. package/src/components/batch-edit/batch-edit-list.vue +1 -1
  347. package/src/components/batch-edit/batch-edit.vue +2 -2
  348. package/src/components/batch-edit/use-edit-state.ts +12 -6
  349. package/src/components/breadcrumb/breadcrumb.vue +1 -1
  350. package/src/components/button/button-group.vue +1 -1
  351. package/src/components/button/button.vue +1 -1
  352. package/src/components/calendar/calendar.vue +1 -1
  353. package/src/components/card/card-action.vue +1 -1
  354. package/src/components/card/card-content.vue +1 -1
  355. package/src/components/card/card-cover.vue +1 -1
  356. package/src/components/card/card-header.vue +1 -1
  357. package/src/components/card/card.vue +1 -1
  358. package/src/components/cascade/cascade.vue +3 -2
  359. package/src/components/cascade/use-check.ts +3 -1
  360. package/src/components/cascade/use-select.ts +43 -29
  361. package/src/components/check-tag/check-tag.vue +1 -1
  362. package/src/components/checkbox/checkbox-button.vue +1 -1
  363. package/src/components/checkbox/checkbox.vue +1 -1
  364. package/src/components/checkbox-group/checkbox-group.vue +1 -1
  365. package/src/components/code-editor/basic-setup.ts +63 -0
  366. package/src/components/code-editor/code-editor.vue +3 -3
  367. package/src/components/collapse/collapse-item.vue +1 -1
  368. package/src/components/collapse/collapse.vue +1 -1
  369. package/src/components/condition-editor/components/condition-group.vue +1 -1
  370. package/src/components/condition-editor/components/condition-row.vue +1 -1
  371. package/src/components/condition-editor/condition-editor.vue +1 -1
  372. package/src/components/contextmenu/contextmenu-item.vue +1 -1
  373. package/src/components/contextmenu/contextmenu-panel.vue +1 -1
  374. package/src/components/contextmenu/contextmenu-sub.vue +1 -1
  375. package/src/components/contextmenu/contextmenu.vue +1 -1
  376. package/src/components/date-panel/date-panel.vue +1 -1
  377. package/src/components/date-panel/headers/day.vue +1 -1
  378. package/src/components/date-panel/headers/month.vue +1 -1
  379. package/src/components/date-panel/headers/year.vue +1 -1
  380. package/src/components/date-panel/panels/day.vue +1 -1
  381. package/src/components/date-panel/panels/month.vue +1 -1
  382. package/src/components/date-panel/panels/year.vue +1 -1
  383. package/src/components/date-picker/date-picker.vue +1 -1
  384. package/src/components/date-range-picker/date-range-picker.vue +1 -1
  385. package/src/components/dialog/dialog.vue +1 -1
  386. package/src/components/drawer/drawer.vue +1 -1
  387. package/src/components/dropdown/dropdown.vue +1 -1
  388. package/src/components/dual-nav/dual-nav-app.vue +1 -1
  389. package/src/components/dual-nav/dual-nav.vue +1 -1
  390. package/src/components/empty/empty.vue +1 -1
  391. package/src/components/expression-editor/components/path-preview.vue +1 -1
  392. package/src/components/expression-editor/components/variable-picker.vue +1 -1
  393. package/src/components/expression-editor/expression-editor.vue +1 -1
  394. package/src/components/file-picker/file-picker.vue +1 -1
  395. package/src/components/file-viewer/file-viewer.vue +1 -1
  396. package/src/components/file-viewer/previewers/docx-previewer.vue +1 -1
  397. package/src/components/file-viewer/previewers/image-previewer.vue +1 -1
  398. package/src/components/file-viewer/previewers/pdf-previewer.vue +1 -1
  399. package/src/components/file-viewer/previewers/pdf-viewport-scroll.vue +1 -1
  400. package/src/components/file-viewer/previewers/pdf-zoom-bridge.vue +1 -1
  401. package/src/components/file-viewer/previewers/sheet-previewer.vue +1 -1
  402. package/src/components/file-viewer/previewers/text-previewer.vue +1 -1
  403. package/src/components/file-viewer/previewers/video-previewer.vue +1 -1
  404. package/src/components/float-button/float-button.vue +1 -1
  405. package/src/components/form/form.vue +1 -1
  406. package/src/components/form-item/form-item.vue +1 -1
  407. package/src/components/gantt-chart/gantt-chart.vue +1 -1
  408. package/src/components/grid/grid-item.vue +1 -1
  409. package/src/components/grid/grid.vue +1 -1
  410. package/src/components/grid-input/grid-input.vue +1 -1
  411. package/src/components/group-input/group-input.vue +1 -1
  412. package/src/components/icon/icon.vue +1 -1
  413. package/src/components/input/input.vue +1 -1
  414. package/src/components/kbd/kbd.vue +1 -1
  415. package/src/components/layout/layout-resizer.vue +1 -1
  416. package/src/components/layout/layout.vue +1 -1
  417. package/src/components/list/list-item.vue +1 -1
  418. package/src/components/list/list.vue +1 -1
  419. package/src/components/loading/loading.vue +1 -1
  420. package/src/components/message/message-box.vue +1 -1
  421. package/src/components/message/message.vue +1 -1
  422. package/src/components/message-confirm/message-confirm.vue +1 -1
  423. package/src/components/multi-select/multi-select-option.vue +1 -1
  424. package/src/components/multi-select/multi-select.vue +1 -1
  425. package/src/components/multi-tree-select/multi-tree-select.vue +1 -1
  426. package/src/components/nav/nav-icon.vue +1 -1
  427. package/src/components/nav/nav-item-collapsed.vue +1 -1
  428. package/src/components/nav/nav-item.vue +1 -1
  429. package/src/components/nav/nav-sub-collapsed.vue +1 -1
  430. package/src/components/nav/nav-sub.vue +1 -1
  431. package/src/components/nav/nav.vue +1 -1
  432. package/src/components/notification/notification.vue +1 -1
  433. package/src/components/number/number.vue +1 -1
  434. package/src/components/number-input/number-input.vue +1 -1
  435. package/src/components/number-range-input/number-range-input.vue +1 -1
  436. package/src/components/paginator/paginator.vue +1 -1
  437. package/src/components/palette/palette-alpha.vue +1 -1
  438. package/src/components/palette/palette-hue.vue +1 -1
  439. package/src/components/palette/palette-sv.vue +1 -1
  440. package/src/components/palette/palette.vue +1 -1
  441. package/src/components/password-input/password-input.vue +1 -1
  442. package/src/components/pop-confirm/pop-confirm.vue +1 -1
  443. package/src/components/progress/progress.vue +1 -1
  444. package/src/components/progress-nodes/progress-nodes.vue +1 -1
  445. package/src/components/radio/radio.vue +1 -1
  446. package/src/components/radio-group/radio-group.vue +1 -1
  447. package/src/components/scroll/scroll-bar.vue +1 -1
  448. package/src/components/scroll/scroll.vue +1 -1
  449. package/src/components/select/select.vue +1 -1
  450. package/src/components/slider/slider.vue +1 -1
  451. package/src/components/steps/steps.vue +1 -1
  452. package/src/components/switch/switch.vue +1 -1
  453. package/src/components/table/table-body.vue +1 -1
  454. package/src/components/table/table-cell.vue +1 -1
  455. package/src/components/table/table-foot.vue +1 -1
  456. package/src/components/table/table.vue +1 -1
  457. package/src/components/table-editor/table-editor.vue +1 -1
  458. package/src/components/tabs/tabs-horizontal.vue +1 -1
  459. package/src/components/tabs/tabs-vertical.vue +1 -1
  460. package/src/components/tabs/tabs.vue +1 -1
  461. package/src/components/tag/tag.vue +1 -1
  462. package/src/components/text/text.vue +1 -1
  463. package/src/components/textarea/textarea.vue +1 -1
  464. package/src/components/tip/tip.vue +1 -1
  465. package/src/components/tree/tree-node.vue +1 -1
  466. package/src/components/tree/tree.vue +1 -1
  467. package/src/components/tree-select/tree-select.vue +3 -3
  468. package/src/components/watermark/watermark.vue +1 -1
  469. package/src/types/cascade.ts +10 -6
  470. package/src/types/tree-select.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","names":[],"sources":["../../../src/components/theme/theme.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <div :class=\"cls.e('header')\">\n <div :class=\"cls.e('header-copy')\">\n <strong>主题变量配置</strong>\n </div>\n <div :class=\"cls.e('tags')\">\n <span :class=\"cls.e('tag')\">基线 {{ baselineLabel }}</span>\n <span :class=\"cls.e('tag')\">{{ changedFieldKeys.size }} 改动</span>\n </div>\n </div>\n\n <div :class=\"cls.e('toolbar')\">\n <u-input\n v-model=\"keyword\"\n :class=\"cls.e('search')\"\n placeholder=\"搜索变量名、中文标签或分组\"\n />\n\n <button\n type=\"button\"\n :class=\"[cls.e('toggle'), bem.is('active', changedOnly)]\"\n @click=\"changedOnly = !changedOnly\"\n >\n {{ changedOnly ? '查看全部' : '仅看改动' }}\n </button>\n </div>\n\n <div :class=\"cls.e('body')\">\n <div :class=\"cls.e('nav')\">\n <button\n v-for=\"section in sectionStates\"\n :key=\"section.key\"\n type=\"button\"\n :class=\"[\n cls.e('nav-item'),\n bem.is('active', activeSection === section.key),\n bem.is('disabled', !section.visibleFields.length)\n ]\"\n @click=\"activeSection = section.key\"\n >\n <span :class=\"cls.e('nav-main')\">{{ section.title }}</span>\n <span :class=\"cls.e('nav-meta')\">\n {{ section.visibleFields.length }}/{{ section.fields.length }}\n <template v-if=\"section.changedCount\"> · {{ section.changedCount }} 改动 </template>\n </span>\n </button>\n </div>\n\n <div :class=\"cls.e('panel')\">\n <div v-if=\"activeState\" :class=\"cls.e('panel-head')\">\n <div>\n <h4 :class=\"cls.e('panel-title')\">{{ activeState.title }}</h4>\n <p :class=\"cls.e('panel-desc')\">{{ activeState.description }}</p>\n </div>\n\n <div :class=\"cls.e('panel-count')\">{{ activeState.visibleFields.length }} 项</div>\n </div>\n\n <div v-if=\"activeState?.visibleFields.length\" :class=\"cls.e('list')\">\n <div\n v-for=\"field in activeState.visibleFields\"\n :key=\"field.key\"\n :class=\"[cls.e('item'), bem.is('changed', isFieldChanged(field))]\"\n >\n <div :class=\"cls.e('item-head')\">\n <div :class=\"cls.e('item-copy')\">\n <label :class=\"cls.e('item-label')\">{{ field.label }}</label>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">Theme</span>\n <code :class=\"cls.e('item-code')\">{{ getThemePath(field.path) }}</code>\n </div>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">CSS</span>\n <code :class=\"cls.e('item-code')\">{{ getCssVarName(field.path) }}</code>\n </div>\n </div>\n\n <span v-if=\"isFieldChanged(field)\" :class=\"cls.e('item-badge')\"> 已修改 </span>\n </div>\n\n <div v-if=\"field.kind === 'palette'\" :class=\"cls.e('palette-field')\">\n <template v-if=\"field.path[0] === 'color'\">\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"String(getFieldValue(field) ?? '')\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"例如:#1E88E5\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n </template>\n <template v-else>\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? ''\n : String(getFieldValue(field) ?? '')\n \"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"输入颜色或变量\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n <div :class=\"cls.e('palette-var')\">\n <span :class=\"cls.e('palette-var-label')\">或选择变量</span>\n <u-select\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? String(getFieldValue(field) ?? '')\n : ''\n \"\n :options=\"colorVarOptions\"\n clearable\n placeholder=\"选择预设变量\"\n @update:model-value=\"(value) => updateField(field, value ?? '')\"\n >\n <template #default=\"{ option }\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n :style=\"`width: 14px; height: 14px; border-radius: 4px; background: ${option.value}`\"\n />\n <span style=\"font-size: 13px\">{{ option.label }}</span>\n </div>\n </template>\n </u-select>\n </div>\n </template>\n </div>\n\n <component\n v-else\n :is=\"getFieldComponent(field)\"\n :model-value=\"getFieldValue(field)\"\n v-bind=\"getFieldProps(field)\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n\n <p v-if=\"field.hint || field.placeholder\" :class=\"cls.e('item-hint')\">\n {{ field.hint ?? field.placeholder }}\n </p>\n </div>\n </div>\n\n <div v-else :class=\"cls.e('empty')\">\n <strong>没有匹配项</strong>\n <p>换一个关键字,或关闭“仅看改动”后再继续筛选。</p>\n </div>\n </div>\n </div>\n\n <div :class=\"cls.e('actions')\">\n <div :class=\"cls.e('preset-group')\">\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('light')\">\n 浅色预设\n </button>\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('dark')\">\n 深色预设\n </button>\n </div>\n\n <u-button :class=\"cls.e('action-btn')\" @click=\"handleResetTheme\"> 重置 </u-button>\n <u-button :class=\"cls.e('action-btn')\" type=\"primary\" @click=\"handleExportTheme\">\n 导出\n </u-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n type Theme,\n UITheme,\n currentTheme,\n darkTheme,\n lightTheme,\n loadTheme\n} from '@veltra/styles/theme'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef, watch, watchEffect } from 'vue'\n\nimport type { ThemeProps, _ThemeExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { UNumberInput } from '../number-input'\nimport { UPalette } from '../palette'\nimport { USelect } from '../select'\nimport { THEME_SECTIONS } from './schema'\nimport type { ThemeField } from './schema'\n\ndefineOptions({ name: 'UTheme' })\n\nconst props = defineProps<ThemeProps>()\n\nconst cls = bem('theme')\n\nconst keyword = shallowRef('')\nconst changedOnly = shallowRef(false)\nconst activeSection = shallowRef(THEME_SECTIONS[0]!.key)\n\nconst colorVarOptions = computed(() => {\n const options: { label: string; value: string }[] = []\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (field.kind === 'palette') {\n const varName = `var(${getCssVarName(field.path)})`\n options.push({ label: `${field.label}`, value: varName })\n }\n })\n })\n return options\n})\n\nconst editorTheme = shallowRef<UITheme>()\nconst baselineTheme = shallowRef<Theme>(createThemeSnapshot(lightTheme.theme))\nconst baselineLabel = shallowRef('浅色预设')\n\nconst lightPreset = createThemeSnapshot(lightTheme.theme)\nconst darkPreset = createThemeSnapshot(darkTheme.theme)\n\nconst sourceTheme = computed(() => {\n return props.theme ?? currentTheme.value ?? lightTheme\n})\n\nwatch(\n sourceTheme,\n (theme) => {\n if (!props.theme && theme === editorTheme.value) return\n\n const nextTheme = props.theme ? theme : new UITheme(createThemeSnapshot(theme.theme))\n\n editorTheme.value = nextTheme\n baselineTheme.value = createThemeSnapshot(nextTheme.theme)\n baselineLabel.value =\n theme === darkTheme\n ? '深色预设'\n : theme === lightTheme\n ? '浅色预设'\n : props.theme\n ? '外部主题'\n : '当前主题'\n\n if (!props.theme && currentTheme.value !== nextTheme) {\n loadTheme(nextTheme)\n }\n },\n { immediate: true }\n)\n\nconst changedFieldKeys = computed(() => {\n const keys = new Set<string>()\n\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (\n getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path) !==\n getByPath(baselineTheme.value, field.path)\n ) {\n keys.add(field.key)\n }\n })\n })\n\n return keys\n})\n\nconst sectionStates = computed(() => {\n const normalizedKeyword = keyword.value.trim().toLowerCase()\n\n return THEME_SECTIONS.map((section) => {\n const sectionMatched = `${section.title} ${section.description}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n const visibleFields = section.fields.filter((field) => {\n const matchesKeyword =\n !normalizedKeyword ||\n sectionMatched ||\n `${field.label} ${field.key} ${getThemePath(field.path)} ${getCssVarName(field.path)}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n if (!matchesKeyword) return false\n\n if (changedOnly.value && !changedFieldKeys.value.has(field.key)) {\n return false\n }\n\n return true\n })\n\n const changedCount = section.fields.filter((field) => {\n return changedFieldKeys.value.has(field.key)\n }).length\n\n return { ...section, visibleFields, changedCount }\n })\n})\n\nwatchEffect(() => {\n const current = sectionStates.value.find((section) => {\n return section.key === activeSection.value && section.visibleFields.length\n })\n\n if (current) return\n\n activeSection.value =\n sectionStates.value.find((section) => section.visibleFields.length)?.key ??\n THEME_SECTIONS[0]!.key\n})\n\nconst activeState = computed(() => {\n return (\n sectionStates.value.find((section) => section.key === activeSection.value) ??\n sectionStates.value[0]\n )\n})\n\nfunction createThemeSnapshot(theme: Theme): Theme {\n return JSON.parse(JSON.stringify(theme)) as Theme\n}\n\nfunction getByPath(source: Record<string, any>, path: string[]) {\n return path.reduce((current, key) => current?.[key], source)\n}\n\nfunction setByPath(source: Record<string, any>, path: string[], value: any) {\n let current = source\n\n path.slice(0, -1).forEach((key) => {\n current = current[key]\n })\n\n current[path[path.length - 1]!] = value\n}\n\nfunction getCssVarName(path: string[]) {\n return `--u-${path.join('-')}`\n}\n\nfunction getThemePath(path: string[]) {\n return path.reduce((expression, key) => {\n if (/^[A-Za-z_$][\\w$]*$/.test(key)) {\n return `${expression}.${key}`\n }\n\n return `${expression}['${key}']`\n }, 'theme')\n}\n\nfunction getFieldComponent(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return UNumberInput\n case 'select':\n return USelect\n default:\n return UInput\n }\n}\n\nfunction getFieldValue(field: ThemeField) {\n return getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path)\n}\n\nfunction getFieldProps(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return { min: field.min, max: field.max, step: field.step, suffix: field.suffix }\n case 'select':\n return { options: field.options, clearable: false, placeholder: '请选择' }\n case 'input':\n return { placeholder: field.placeholder }\n default:\n return {}\n }\n}\n\nfunction updateField(field: ThemeField, value: string | number | undefined) {\n if (!editorTheme.value) return\n\n const normalizedValue =\n field.kind === 'number'\n ? typeof value === 'number'\n ? value\n : Number(value || 0)\n : String(value ?? '')\n\n setByPath(editorTheme.value.theme, field.path, normalizedValue)\n editorTheme.value.render()\n}\n\nfunction isFieldChanged(field: ThemeField) {\n return changedFieldKeys.value.has(field.key)\n}\n\nfunction applySnapshot(snapshot: Theme, label?: string) {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(snapshot))\n baselineTheme.value = createThemeSnapshot(editorTheme.value.theme)\n\n if (label) {\n baselineLabel.value = label\n }\n\n editorTheme.value.render()\n}\n\nfunction applyPreset(type: 'light' | 'dark') {\n applySnapshot(\n type === 'dark' ? darkPreset : lightPreset,\n type === 'dark' ? '深色预设' : '浅色预设'\n )\n}\n\nfunction handleResetTheme() {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(baselineTheme.value))\n editorTheme.value.render()\n}\n\nfunction handleExportTheme() {\n if (!editorTheme.value) return\n\n const themeConfig = JSON.stringify(createThemeSnapshot(editorTheme.value.theme), null, 2)\n const blob = new Blob([themeConfig], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'theme-config.json'\n a.click()\n URL.revokeObjectURL(url)\n}\n\ndefineExpose<_ThemeExposed>({\n reset: handleResetTheme,\n exportTheme: handleExportTheme,\n applyLightPreset: () => applyPreset('light'),\n applyDarkPreset: () => applyPreset('dark')\n})\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"theme.js","names":[],"sources":["../../../src/components/theme/theme.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <div :class=\"cls.e('header')\">\n <div :class=\"cls.e('header-copy')\">\n <strong>主题变量配置</strong>\n </div>\n <div :class=\"cls.e('tags')\">\n <span :class=\"cls.e('tag')\">基线 {{ baselineLabel }}</span>\n <span :class=\"cls.e('tag')\">{{ changedFieldKeys.size }} 改动</span>\n </div>\n </div>\n\n <div :class=\"cls.e('toolbar')\">\n <u-input\n v-model=\"keyword\"\n :class=\"cls.e('search')\"\n placeholder=\"搜索变量名、中文标签或分组\"\n />\n\n <button\n type=\"button\"\n :class=\"[cls.e('toggle'), bem.is('active', changedOnly)]\"\n @click=\"changedOnly = !changedOnly\"\n >\n {{ changedOnly ? '查看全部' : '仅看改动' }}\n </button>\n </div>\n\n <div :class=\"cls.e('body')\">\n <div :class=\"cls.e('nav')\">\n <button\n v-for=\"section in sectionStates\"\n :key=\"section.key\"\n type=\"button\"\n :class=\"[\n cls.e('nav-item'),\n bem.is('active', activeSection === section.key),\n bem.is('disabled', !section.visibleFields.length)\n ]\"\n @click=\"activeSection = section.key\"\n >\n <span :class=\"cls.e('nav-main')\">{{ section.title }}</span>\n <span :class=\"cls.e('nav-meta')\">\n {{ section.visibleFields.length }}/{{ section.fields.length }}\n <template v-if=\"section.changedCount\"> · {{ section.changedCount }} 改动 </template>\n </span>\n </button>\n </div>\n\n <div :class=\"cls.e('panel')\">\n <div v-if=\"activeState\" :class=\"cls.e('panel-head')\">\n <div>\n <h4 :class=\"cls.e('panel-title')\">{{ activeState.title }}</h4>\n <p :class=\"cls.e('panel-desc')\">{{ activeState.description }}</p>\n </div>\n\n <div :class=\"cls.e('panel-count')\">{{ activeState.visibleFields.length }} 项</div>\n </div>\n\n <div v-if=\"activeState?.visibleFields.length\" :class=\"cls.e('list')\">\n <div\n v-for=\"field in activeState.visibleFields\"\n :key=\"field.key\"\n :class=\"[cls.e('item'), bem.is('changed', isFieldChanged(field))]\"\n >\n <div :class=\"cls.e('item-head')\">\n <div :class=\"cls.e('item-copy')\">\n <label :class=\"cls.e('item-label')\">{{ field.label }}</label>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">Theme</span>\n <code :class=\"cls.e('item-code')\">{{ getThemePath(field.path) }}</code>\n </div>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">CSS</span>\n <code :class=\"cls.e('item-code')\">{{ getCssVarName(field.path) }}</code>\n </div>\n </div>\n\n <span v-if=\"isFieldChanged(field)\" :class=\"cls.e('item-badge')\"> 已修改 </span>\n </div>\n\n <div v-if=\"field.kind === 'palette'\" :class=\"cls.e('palette-field')\">\n <template v-if=\"field.path[0] === 'color'\">\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"String(getFieldValue(field) ?? '')\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"例如:#1E88E5\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n </template>\n <template v-else>\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? ''\n : String(getFieldValue(field) ?? '')\n \"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"输入颜色或变量\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n <div :class=\"cls.e('palette-var')\">\n <span :class=\"cls.e('palette-var-label')\">或选择变量</span>\n <u-select\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? String(getFieldValue(field) ?? '')\n : ''\n \"\n :options=\"colorVarOptions\"\n clearable\n placeholder=\"选择预设变量\"\n @update:model-value=\"(value) => updateField(field, value ?? '')\"\n >\n <template #default=\"{ option }\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n :style=\"`width: 14px; height: 14px; border-radius: 4px; background: ${option.value}`\"\n />\n <span style=\"font-size: 13px\">{{ option.label }}</span>\n </div>\n </template>\n </u-select>\n </div>\n </template>\n </div>\n\n <component\n v-else\n :is=\"getFieldComponent(field)\"\n :model-value=\"getFieldValue(field)\"\n v-bind=\"getFieldProps(field)\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n\n <p v-if=\"field.hint || field.placeholder\" :class=\"cls.e('item-hint')\">\n {{ field.hint ?? field.placeholder }}\n </p>\n </div>\n </div>\n\n <div v-else :class=\"cls.e('empty')\">\n <strong>没有匹配项</strong>\n <p>换一个关键字,或关闭“仅看改动”后再继续筛选。</p>\n </div>\n </div>\n </div>\n\n <div :class=\"cls.e('actions')\">\n <div :class=\"cls.e('preset-group')\">\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('light')\">\n 浅色预设\n </button>\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('dark')\">\n 深色预设\n </button>\n </div>\n\n <u-button :class=\"cls.e('action-btn')\" @click=\"handleResetTheme\"> 重置 </u-button>\n <u-button :class=\"cls.e('action-btn')\" type=\"primary\" @click=\"handleExportTheme\">\n 导出\n </u-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n type Theme,\n UITheme,\n currentTheme,\n darkTheme,\n lightTheme,\n loadTheme\n} from '@veltra/styles/theme'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef, watch, watchEffect } from 'vue'\n\nimport type { ThemeProps, _ThemeExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { UNumberInput } from '../number-input'\nimport { UPalette } from '../palette'\nimport { USelect } from '../select'\nimport { THEME_SECTIONS } from './schema'\nimport type { ThemeField } from './schema'\n\ndefineOptions({ name: 'UTheme' })\n\nconst props = defineProps<ThemeProps>()\n\nconst cls = bem('theme')\n\nconst keyword = shallowRef('')\nconst changedOnly = shallowRef(false)\nconst activeSection = shallowRef(THEME_SECTIONS[0]!.key)\n\nconst colorVarOptions = computed(() => {\n const options: { label: string; value: string }[] = []\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (field.kind === 'palette') {\n const varName = `var(${getCssVarName(field.path)})`\n options.push({ label: `${field.label}`, value: varName })\n }\n })\n })\n return options\n})\n\nconst editorTheme = shallowRef<UITheme>()\nconst baselineTheme = shallowRef<Theme>(createThemeSnapshot(lightTheme.theme))\nconst baselineLabel = shallowRef('浅色预设')\n\nconst lightPreset = createThemeSnapshot(lightTheme.theme)\nconst darkPreset = createThemeSnapshot(darkTheme.theme)\n\nconst sourceTheme = computed(() => {\n return props.theme ?? currentTheme.value ?? lightTheme\n})\n\nwatch(\n sourceTheme,\n (theme) => {\n if (!props.theme && theme === editorTheme.value) return\n\n const nextTheme = props.theme ? theme : new UITheme(createThemeSnapshot(theme.theme))\n\n editorTheme.value = nextTheme\n baselineTheme.value = createThemeSnapshot(nextTheme.theme)\n baselineLabel.value =\n theme === darkTheme\n ? '深色预设'\n : theme === lightTheme\n ? '浅色预设'\n : props.theme\n ? '外部主题'\n : '当前主题'\n\n if (!props.theme && currentTheme.value !== nextTheme) {\n loadTheme(nextTheme)\n }\n },\n { immediate: true }\n)\n\nconst changedFieldKeys = computed(() => {\n const keys = new Set<string>()\n\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (\n getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path) !==\n getByPath(baselineTheme.value, field.path)\n ) {\n keys.add(field.key)\n }\n })\n })\n\n return keys\n})\n\nconst sectionStates = computed(() => {\n const normalizedKeyword = keyword.value.trim().toLowerCase()\n\n return THEME_SECTIONS.map((section) => {\n const sectionMatched = `${section.title} ${section.description}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n const visibleFields = section.fields.filter((field) => {\n const matchesKeyword =\n !normalizedKeyword ||\n sectionMatched ||\n `${field.label} ${field.key} ${getThemePath(field.path)} ${getCssVarName(field.path)}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n if (!matchesKeyword) return false\n\n if (changedOnly.value && !changedFieldKeys.value.has(field.key)) {\n return false\n }\n\n return true\n })\n\n const changedCount = section.fields.filter((field) => {\n return changedFieldKeys.value.has(field.key)\n }).length\n\n return { ...section, visibleFields, changedCount }\n })\n})\n\nwatchEffect(() => {\n const current = sectionStates.value.find((section) => {\n return section.key === activeSection.value && section.visibleFields.length\n })\n\n if (current) return\n\n activeSection.value =\n sectionStates.value.find((section) => section.visibleFields.length)?.key ??\n THEME_SECTIONS[0]!.key\n})\n\nconst activeState = computed(() => {\n return (\n sectionStates.value.find((section) => section.key === activeSection.value) ??\n sectionStates.value[0]\n )\n})\n\nfunction createThemeSnapshot(theme: Theme): Theme {\n return JSON.parse(JSON.stringify(theme)) as Theme\n}\n\nfunction getByPath(source: Record<string, any>, path: string[]) {\n return path.reduce((current, key) => current?.[key], source)\n}\n\nfunction setByPath(source: Record<string, any>, path: string[], value: any) {\n let current = source\n\n path.slice(0, -1).forEach((key) => {\n current = current[key]\n })\n\n current[path[path.length - 1]!] = value\n}\n\nfunction getCssVarName(path: string[]) {\n return `--u-${path.join('-')}`\n}\n\nfunction getThemePath(path: string[]) {\n return path.reduce((expression, key) => {\n if (/^[A-Za-z_$][\\w$]*$/.test(key)) {\n return `${expression}.${key}`\n }\n\n return `${expression}['${key}']`\n }, 'theme')\n}\n\nfunction getFieldComponent(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return UNumberInput\n case 'select':\n return USelect\n default:\n return UInput\n }\n}\n\nfunction getFieldValue(field: ThemeField) {\n return getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path)\n}\n\nfunction getFieldProps(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return { min: field.min, max: field.max, step: field.step, suffix: field.suffix }\n case 'select':\n return { options: field.options, clearable: false, placeholder: '请选择' }\n case 'input':\n return { placeholder: field.placeholder }\n default:\n return {}\n }\n}\n\nfunction updateField(field: ThemeField, value: string | number | undefined) {\n if (!editorTheme.value) return\n\n const normalizedValue =\n field.kind === 'number'\n ? typeof value === 'number'\n ? value\n : Number(value || 0)\n : String(value ?? '')\n\n setByPath(editorTheme.value.theme, field.path, normalizedValue)\n editorTheme.value.render()\n}\n\nfunction isFieldChanged(field: ThemeField) {\n return changedFieldKeys.value.has(field.key)\n}\n\nfunction applySnapshot(snapshot: Theme, label?: string) {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(snapshot))\n baselineTheme.value = createThemeSnapshot(editorTheme.value.theme)\n\n if (label) {\n baselineLabel.value = label\n }\n\n editorTheme.value.render()\n}\n\nfunction applyPreset(type: 'light' | 'dark') {\n applySnapshot(\n type === 'dark' ? darkPreset : lightPreset,\n type === 'dark' ? '深色预设' : '浅色预设'\n )\n}\n\nfunction handleResetTheme() {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(baselineTheme.value))\n editorTheme.value.render()\n}\n\nfunction handleExportTheme() {\n if (!editorTheme.value) return\n\n const themeConfig = JSON.stringify(createThemeSnapshot(editorTheme.value.theme), null, 2)\n const blob = new Blob([themeConfig], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'theme-config.json'\n a.click()\n URL.revokeObjectURL(url)\n}\n\ndefineExpose<_ThemeExposed>({\n reset: handleResetTheme,\n exportTheme: handleExportTheme,\n applyLightPreset: () => applyPreset('light'),\n applyDarkPreset: () => applyPreset('dark')\n})\n</script>\n"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { useFallbackProps, usePop } from "@veltra/compositions";
5
5
  import { bem, extractNormalVNodes, zIndex } from "@veltra/utils";
6
6
  import { vClickOutside } from "@veltra/directives";
7
7
  //#region src/components/tip/tip.vue
8
- const _sfc_main = /* @__PURE__ */ defineComponent({
9
- name: "Tip",
8
+ const _sfc_main = /*@__PURE__*/ defineComponent({
9
+ name: "UTip",
10
10
  __name: "tip",
11
11
  props: {
12
12
  visible: {
@@ -1 +1 @@
1
- {"version":3,"file":"tip.js","names":[],"sources":["../../../src/components/tip/tip.vue"],"sourcesContent":["<template>\n <!-- 触发 -->\n <UNodeRender v-bind=\"eventsHandlers\" :content=\"renderDefaultSlotTrigger()\" ref=\"triggerRef\" />\n\n <!-- 弹出内容 -->\n <teleport :to=\"`#${popperContainerId}`\">\n <transition name=\"tip\">\n <component\n v-if=\"tipVisible\"\n :is=\"contentTag\"\n :class=\"contentClass\"\n :style=\"[style, { zIndex: zIndex() }]\"\n ref=\"contentRef\"\n @mouseenter=\"eventsHandlers.onMouseenter\"\n @mouseleave=\"eventsHandlers.onMouseleave\"\n @click.stop\n v-click-outside=\"handleClickOutside\"\n >\n <UNodeRender v-if=\"externalNode\" :content=\"externalNode\" />\n\n <slot name=\"content\">{{ content }}</slot>\n\n <div :class=\"cls.e('arrow')\" v-if=\"!hideArrow\" ref=\"arrowRef\"></div>\n </component>\n </transition>\n </teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps, usePop } from '@veltra/compositions'\nimport { vClickOutside } from '@veltra/directives'\nimport { bem, extractNormalVNodes, zIndex } from '@veltra/utils'\nimport { shallowRef, computed, useSlots, onBeforeUnmount, toRef, watch, nextTick } from 'vue'\n\nimport type { TipProps, ComponentSize, TipEmits } from '../../types'\nimport { UNodeRender } from '../node-render'\nimport { useNest } from './use-nest'\n\ndefineOptions({ name: 'Tip' })\n\nconst props = withDefaults(defineProps<TipProps>(), {\n content: '',\n trigger: 'hover',\n direction: 'top',\n alignment: 'center',\n contentTag: 'div',\n visible: undefined\n})\n\nconst emit = defineEmits<TipEmits>()\n\nconst cls = bem('tip')\nconst slots = useSlots()\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst contentClass = computed(() => {\n const fixed = [cls.e('content'), cls.m(size.value)]\n const className = props.class\n if (!Array.isArray(className)) {\n return [...fixed, className]\n }\n return [...fixed, ...className]\n})\n\nconst triggerRef = shallowRef<InstanceType<typeof UNodeRender>>()\nconst contentRef = shallowRef<HTMLElement>()\nconst arrowRef = shallowRef<HTMLElement>()\n\nconst _visible = shallowRef(false)\n\nconst visible = computed(() => {\n return props.visible !== undefined ? props.visible : _visible.value\n})\n\nfunction updateVisible(v: boolean) {\n if (props.visible === undefined) {\n _visible.value = v\n } else {\n emit('update:visible', v)\n }\n}\n\nconst tipVisible = useNest(visible)\n\nfunction renderDefaultSlotTrigger() {\n const nodes = slots.default?.()\n if (!nodes?.length) return null\n return extractNormalVNodes(nodes)[0]\n}\n\nconst eventsHandlers = computed(() => {\n const { trigger, disabled } = props\n\n const handlers: Record<string, Function> = {}\n\n if (disabled) return handlers\n\n if (trigger === 'click') {\n handlers.onClick = open\n } else if (trigger === 'hover') {\n handlers.onMouseenter = open\n handlers.onMouseleave = close\n }\n\n return handlers\n})\n\nconst handleClickOutside = (e: MouseEvent) => {\n if (props.trigger === 'hover') return\n\n // 点击的元素在触发元素中则啥也\n if (props.trigger === 'click' && triggerDom.value.contains(e.target as Node)) {\n return\n }\n close()\n}\n\nlet closeTimer: number | undefined = undefined\n\n/** 弹出 */\nconst open = (e?: PointerEvent) => {\n e?.stopPropagation()\n closeTimer !== undefined && clearTimeout(closeTimer)\n\n updateVisible(true)\n}\n/** 关闭 */\nconst close = () => {\n if (props.trigger === 'hover') {\n closeTimer = setTimeout(() => {\n updateVisible(false)\n }, 250)\n } else {\n updateVisible(false)\n }\n}\n\nconst triggerDom = computed(() => {\n return props.triggerDom || triggerRef.value?.$el\n})\n\nconst { update, popperContainerId } = usePop({\n triggerRef: triggerDom,\n contentRef,\n arrowRef,\n direction: toRef(() => props.direction),\n alignment: toRef(() => props.alignment),\n onTriggerPositionChange() {\n close()\n }\n})\n\nwatch(triggerDom, (dom) => {\n // TODO: 看起来不是很优雅\n if (dom?.nodeType === Node.ELEMENT_NODE && visible.value) {\n nextTick(() => {\n void update()\n })\n }\n})\n\n/** 外部节点 */\nconst externalNode = shallowRef<any>()\n\nonBeforeUnmount(() => {\n clearTimeout(closeTimer)\n})\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"tip.js","names":[],"sources":["../../../src/components/tip/tip.vue"],"sourcesContent":["<template>\n <!-- 触发 -->\n <UNodeRender v-bind=\"eventsHandlers\" :content=\"renderDefaultSlotTrigger()\" ref=\"triggerRef\" />\n\n <!-- 弹出内容 -->\n <teleport :to=\"`#${popperContainerId}`\">\n <transition name=\"tip\">\n <component\n v-if=\"tipVisible\"\n :is=\"contentTag\"\n :class=\"contentClass\"\n :style=\"[style, { zIndex: zIndex() }]\"\n ref=\"contentRef\"\n @mouseenter=\"eventsHandlers.onMouseenter\"\n @mouseleave=\"eventsHandlers.onMouseleave\"\n @click.stop\n v-click-outside=\"handleClickOutside\"\n >\n <UNodeRender v-if=\"externalNode\" :content=\"externalNode\" />\n\n <slot name=\"content\">{{ content }}</slot>\n\n <div :class=\"cls.e('arrow')\" v-if=\"!hideArrow\" ref=\"arrowRef\"></div>\n </component>\n </transition>\n </teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps, usePop } from '@veltra/compositions'\nimport { vClickOutside } from '@veltra/directives'\nimport { bem, extractNormalVNodes, zIndex } from '@veltra/utils'\nimport { shallowRef, computed, useSlots, onBeforeUnmount, toRef, watch, nextTick } from 'vue'\n\nimport type { TipProps, ComponentSize, TipEmits } from '../../types'\nimport { UNodeRender } from '../node-render'\nimport { useNest } from './use-nest'\n\ndefineOptions({ name: 'UTip' })\n\nconst props = withDefaults(defineProps<TipProps>(), {\n content: '',\n trigger: 'hover',\n direction: 'top',\n alignment: 'center',\n contentTag: 'div',\n visible: undefined\n})\n\nconst emit = defineEmits<TipEmits>()\n\nconst cls = bem('tip')\nconst slots = useSlots()\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst contentClass = computed(() => {\n const fixed = [cls.e('content'), cls.m(size.value)]\n const className = props.class\n if (!Array.isArray(className)) {\n return [...fixed, className]\n }\n return [...fixed, ...className]\n})\n\nconst triggerRef = shallowRef<InstanceType<typeof UNodeRender>>()\nconst contentRef = shallowRef<HTMLElement>()\nconst arrowRef = shallowRef<HTMLElement>()\n\nconst _visible = shallowRef(false)\n\nconst visible = computed(() => {\n return props.visible !== undefined ? props.visible : _visible.value\n})\n\nfunction updateVisible(v: boolean) {\n if (props.visible === undefined) {\n _visible.value = v\n } else {\n emit('update:visible', v)\n }\n}\n\nconst tipVisible = useNest(visible)\n\nfunction renderDefaultSlotTrigger() {\n const nodes = slots.default?.()\n if (!nodes?.length) return null\n return extractNormalVNodes(nodes)[0]\n}\n\nconst eventsHandlers = computed(() => {\n const { trigger, disabled } = props\n\n const handlers: Record<string, Function> = {}\n\n if (disabled) return handlers\n\n if (trigger === 'click') {\n handlers.onClick = open\n } else if (trigger === 'hover') {\n handlers.onMouseenter = open\n handlers.onMouseleave = close\n }\n\n return handlers\n})\n\nconst handleClickOutside = (e: MouseEvent) => {\n if (props.trigger === 'hover') return\n\n // 点击的元素在触发元素中则啥也\n if (props.trigger === 'click' && triggerDom.value.contains(e.target as Node)) {\n return\n }\n close()\n}\n\nlet closeTimer: number | undefined = undefined\n\n/** 弹出 */\nconst open = (e?: PointerEvent) => {\n e?.stopPropagation()\n closeTimer !== undefined && clearTimeout(closeTimer)\n\n updateVisible(true)\n}\n/** 关闭 */\nconst close = () => {\n if (props.trigger === 'hover') {\n closeTimer = setTimeout(() => {\n updateVisible(false)\n }, 250)\n } else {\n updateVisible(false)\n }\n}\n\nconst triggerDom = computed(() => {\n return props.triggerDom || triggerRef.value?.$el\n})\n\nconst { update, popperContainerId } = usePop({\n triggerRef: triggerDom,\n contentRef,\n arrowRef,\n direction: toRef(() => props.direction),\n alignment: toRef(() => props.alignment),\n onTriggerPositionChange() {\n close()\n }\n})\n\nwatch(triggerDom, (dom) => {\n // TODO: 看起来不是很优雅\n if (dom?.nodeType === Node.ELEMENT_NODE && visible.value) {\n nextTick(() => {\n void update()\n })\n }\n})\n\n/** 外部节点 */\nconst externalNode = shallowRef<any>()\n\nonBeforeUnmount(() => {\n clearTimeout(closeTimer)\n})\n</script>\n"],"mappings":"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"}
@@ -9,10 +9,10 @@ declare const __VLS_base: import("vue").DefineComponent<TipProps, {}, {}, {}, {}
9
9
  }, string, import("vue").PublicProps, Readonly<TipProps> & Readonly<{
10
10
  "onUpdate:visible"?: ((value: boolean) => any) | undefined;
11
11
  }>, {
12
- direction: TipDirection;
13
12
  trigger: "hover" | "click";
14
13
  contentTag: string;
15
14
  visible: boolean;
15
+ direction: TipDirection;
16
16
  content: string;
17
17
  alignment: TipAlign;
18
18
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"use-nest.js","names":[],"sources":["../../../src/components/tip/use-nest.ts"],"sourcesContent":["import type { InjectionKey, Ref, ShallowRef } from 'vue'\nimport { shallowReactive, computed, provide, inject, onBeforeUnmount } from 'vue'\n\nconst TipNestDIKey: InjectionKey<{\n addChild(visible: ShallowRef<boolean>): void\n removeChild(visible: ShallowRef<boolean>): void\n}> = Symbol('TipNestDIKey')\n\n/**\n * tip嵌套\n * @param visible 当前tip显示变量\n * @returns\n */\nexport function useNest(\n visible: Ref<boolean | undefined> | { __v_isRef: boolean; value: boolean }\n): Ref<boolean> {\n /**\n * 子级提示框\n */\n const childrenTips = shallowReactive(new Set<ShallowRef<boolean>>())\n /**\n * 是否有子级提示框正在显示中\n */\n const anyChildrenVisible = computed(() => {\n return Array.from(childrenTips).some((tip) => tip.value)\n })\n\n const tipVisible = computed(() => {\n return visible.value || anyChildrenVisible.value\n })\n\n provide(TipNestDIKey, {\n addChild(v) {\n childrenTips.add(v)\n },\n removeChild(v) {\n childrenTips.delete(v)\n }\n })\n\n const { addChild, removeChild } = inject(TipNestDIKey, undefined) || {}\n addChild?.(tipVisible)\n\n onBeforeUnmount(() => {\n removeChild?.(tipVisible)\n })\n\n return tipVisible\n}\n"],"mappings":";;AAGA,MAAM,eAGD,OAAO,cAAc;;;;;;AAO1B,SAAgB,QACd,SACc;;;;CAId,MAAM,eAAe,gCAAgB,IAAI,IAAyB,CAAC;;;;CAInE,MAAM,qBAAqB,eAAe;EACxC,OAAO,MAAM,KAAK,YAAY,EAAE,MAAM,QAAQ,IAAI,KAAK;CACzD,CAAC;CAED,MAAM,aAAa,eAAe;EAChC,OAAO,QAAQ,SAAS,mBAAmB;CAC7C,CAAC;CAED,QAAQ,cAAc;EACpB,SAAS,GAAG;GACV,aAAa,IAAI,CAAC;EACpB;EACA,YAAY,GAAG;GACb,aAAa,OAAO,CAAC;EACvB;CACF,CAAC;CAED,MAAM,EAAE,UAAU,gBAAgB,OAAO,cAAc,KAAA,CAAS,KAAK,CAAC;CACtE,WAAW,UAAU;CAErB,sBAAsB;EACpB,cAAc,UAAU;CAC1B,CAAC;CAED,OAAO;AACT"}
1
+ {"version":3,"file":"use-nest.js","names":[],"sources":["../../../src/components/tip/use-nest.ts"],"sourcesContent":["import type { InjectionKey, Ref, ShallowRef } from 'vue'\nimport { shallowReactive, computed, provide, inject, onBeforeUnmount } from 'vue'\n\nconst TipNestDIKey: InjectionKey<{\n addChild(visible: ShallowRef<boolean>): void\n removeChild(visible: ShallowRef<boolean>): void\n}> = Symbol('TipNestDIKey')\n\n/**\n * tip嵌套\n * @param visible 当前tip显示变量\n * @returns\n */\nexport function useNest(\n visible: Ref<boolean | undefined> | { __v_isRef: boolean; value: boolean }\n): Ref<boolean> {\n /**\n * 子级提示框\n */\n const childrenTips = shallowReactive(new Set<ShallowRef<boolean>>())\n /**\n * 是否有子级提示框正在显示中\n */\n const anyChildrenVisible = computed(() => {\n return Array.from(childrenTips).some((tip) => tip.value)\n })\n\n const tipVisible = computed(() => {\n return visible.value || anyChildrenVisible.value\n })\n\n provide(TipNestDIKey, {\n addChild(v) {\n childrenTips.add(v)\n },\n removeChild(v) {\n childrenTips.delete(v)\n }\n })\n\n const { addChild, removeChild } = inject(TipNestDIKey, undefined) || {}\n addChild?.(tipVisible)\n\n onBeforeUnmount(() => {\n removeChild?.(tipVisible)\n })\n\n return tipVisible\n}\n"],"mappings":";;AAGA,MAAM,eAGD,OAAO,cAAc;;;;;;AAO1B,SAAgB,QACd,SACc;;;;CAId,MAAM,eAAe,gCAAgB,IAAI,IAAyB,CAAC;;;;CAInE,MAAM,qBAAqB,eAAe;EACxC,OAAO,MAAM,KAAK,YAAY,CAAC,CAAC,MAAM,QAAQ,IAAI,KAAK;CACzD,CAAC;CAED,MAAM,aAAa,eAAe;EAChC,OAAO,QAAQ,SAAS,mBAAmB;CAC7C,CAAC;CAED,QAAQ,cAAc;EACpB,SAAS,GAAG;GACV,aAAa,IAAI,CAAC;EACpB;EACA,YAAY,GAAG;GACb,aAAa,OAAO,CAAC;EACvB;CACF,CAAC;CAED,MAAM,EAAE,UAAU,gBAAgB,OAAO,cAAc,KAAA,CAAS,KAAK,CAAC;CACtE,WAAW,UAAU;CAErB,sBAAsB;EACpB,cAAc,UAAU;CAC1B,CAAC;CAED,OAAO;AACT"}
@@ -7,8 +7,8 @@ import { bem } from "@veltra/utils";
7
7
  import { ArrowRight, Dot } from "@veltra/icons/normal";
8
8
  import { vRipple } from "@veltra/directives";
9
9
  //#region src/components/tree/tree-node.vue
10
- const _sfc_main = /* @__PURE__ */ defineComponent({
11
- name: "TreeNode",
10
+ const _sfc_main = /*@__PURE__*/ defineComponent({
11
+ name: "UTreeNode",
12
12
  __name: "tree-node",
13
13
  props: {
14
14
  node: {},
@@ -1 +1 @@
1
- {"version":3,"file":"tree-node.js","names":[],"sources":["../../../src/components/tree/tree-node.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('node'), bem.is('expanded', node.expanded), bem.is('disabled', node.disabled)]\"\n :ref=\"measureRef\"\n >\n <span v-for=\"i in node.depth\" :key=\"i\" :class=\"cls.e('indent')\" aria-hidden=\"true\"></span>\n\n <u-icon v-if=\"!node.isLeaf\" :class=\"cls.e('expand-icon')\" @click.stop=\"toggleExpand\">\n <ArrowRight />\n </u-icon>\n <u-icon v-else :class=\"cls.e('leaf-icon')\" aria-hidden=\"true\">\n <Dot />\n </u-icon>\n\n <div\n :class=\"cls.e('node-content')\"\n @click=\"handleClick\"\n @contextmenu=\"treeEmit('node-contextmenu', $event, node)\"\n v-ripple=\"\n (treeProps.checkable || treeProps.selectable) && !node.disabled ? cls.e('ripple') : false\n \"\n >\n <u-checkbox\n v-if=\"treeProps.checkable\"\n :class=\"cls.e('checkbox')\"\n :model-value=\"node.checked\"\n :indeterminate=\"node.indeterminate\"\n :disabled=\"node.disabled\"\n @change=\"handleChange\"\n @click.stop\n />\n\n <u-node-render :content=\"getTreeSlotsNode({ node, data: node.data })\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { vRipple } from '@veltra/directives'\nimport { ArrowRight, Dot } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { inject } from 'vue'\n\nimport type { TreeNodeProps } from '../../types'\nimport UCheckbox from '../checkbox/checkbox.vue'\nimport { UIcon } from '../icon'\nimport { UNodeRender } from '../node-render'\nimport { TreeDIKey } from './di'\n\ndefineOptions({ name: 'TreeNode' })\n\nconst props = defineProps<TreeNodeProps>()\n\nconst { treeProps, treeEmit, cls, getTreeSlotsNode, getFlattedNodes, toggleCheck, handleSelect } =\n inject(TreeDIKey)!\n\nfunction measureRef(el: unknown) {\n if (typeof props.index !== 'number' || !props.measureElement) return\n props.measureElement(props.index, el as Element | null)\n}\n\nfunction toggleExpand() {\n const { node } = props\n node.expanded = !node.expanded\n getFlattedNodes()\n\n treeEmit('expand', node)\n}\n\nfunction handleChange(checked: boolean, e: MouseEvent) {\n toggleCheck(props.node, checked, e.ctrlKey)\n}\n\nfunction handleClick(e: MouseEvent) {\n const { node } = props\n treeEmit('node-click', node)\n\n treeProps.selectable && handleSelect(node)\n treeProps.expandOnClickNode && toggleExpand()\n treeProps.checkable &&\n !node.disabled &&\n !treeProps.expandOnClickNode &&\n toggleCheck(node, !node.checked, e.ctrlKey)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAmDA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,UAAU,KAAK,kBAAkB,iBAAiB,aAAa,iBAChF,OAAO,SAAS;EAElB,SAAS,WAAW,IAAa;GAC/B,IAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,gBAAgB;GAC9D,MAAM,eAAe,MAAM,OAAO,EAAoB;EACxD;EAEA,SAAS,eAAe;GACtB,MAAM,EAAE,SAAS;GACjB,KAAK,WAAW,CAAC,KAAK;GACtB,gBAAgB;GAEhB,SAAS,UAAU,IAAI;EACzB;EAEA,SAAS,aAAa,SAAkB,GAAe;GACrD,YAAY,MAAM,MAAM,SAAS,EAAE,OAAO;EAC5C;EAEA,SAAS,YAAY,GAAe;GAClC,MAAM,EAAE,SAAS;GACjB,SAAS,cAAc,IAAI;GAE3B,UAAU,cAAc,aAAa,IAAI;GACzC,UAAU,qBAAqB,aAAa;GAC5C,UAAU,aACR,CAAC,KAAK,YACN,CAAC,UAAU,qBACX,YAAY,MAAM,CAAC,KAAK,SAAS,EAAE,OAAO;EAC9C;;uBAlFE,mBAiCM,OAAA;IAhCH,OAAK,eAAA;KAAG,MAAA,GAAA,EAAI,EAAC,MAAA;KAAU,MAAA,GAAA,EAAI,GAAE,YAAa,QAAA,KAAK,QAAQ;KAAG,MAAA,GAAA,EAAI,GAAE,YAAa,QAAA,KAAK,QAAQ;IAAA,CAAA;IAC1F,KAAK;;sBAEN,mBAA0F,UAAA,MAAA,WAAxE,QAAA,KAAK,QAAV,MAAC;yBAAd,mBAA0F,QAAA;MAA3D,KAAK;MAAI,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,QAAA,CAAA;MAAY,eAAY;;;KAE7D,QAAA,KAAK,UAAA,UAAA,GAApB,YAES,MAAA,WAAA,GAAA;;KAFoB,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,aAAA,CAAA;KAAkB,SAAK,cAAO,cAAY,CAAA,MAAA,CAAA;;4BACnE,CAAd,YAAc,MAAA,UAAA,CAAA,CAAA,CAAA;;sCAEhB,YAES,MAAA,WAAA,GAAA;;KAFO,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,WAAA,CAAA;KAAe,eAAY;;4BAC9C,CAAP,YAAO,MAAA,GAAA,CAAA,CAAA,CAAA;;;iCAGT,mBAmBM,OAAA;KAlBH,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,cAAA,CAAA;KACZ,SAAO;KACP,eAAW,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,QAAA,EAAQ,oBAAqB,QAAQ,QAAA,IAAI;QAM/C,MAAA,SAAA,EAAU,aAAA,UAAA,GADlB,YAQE,aAAA;;KANC,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,UAAA,CAAA;KACZ,eAAa,QAAA,KAAK;KAClB,eAAe,QAAA,KAAK;KACpB,UAAU,QAAA,KAAK;KACf,UAAQ;KACR,SAAK,OAAA,OAAA,OAAA,KAAA,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;;;;;;4CAGb,YAAwE,MAAA,UAAA,GAAA,EAAxD,SAAS,MAAA,gBAAA,EAAgB;KAAA,MAAG,QAAA;KAAI,MAAQ,QAAA,KAAK;IAAI,CAAA,EAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,CAAA,GAAA,EAAA,IAAA,CAAA,CAAA,MAAA,OAAA,IAd7C,MAAA,SAAA,EAAU,aAAa,MAAA,SAAA,EAAU,eAAU,CAAM,QAAA,KAAK,WAAW,MAAA,GAAA,EAAI,EAAC,QAAA,IAAA,KAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"tree-node.js","names":[],"sources":["../../../src/components/tree/tree-node.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('node'), bem.is('expanded', node.expanded), bem.is('disabled', node.disabled)]\"\n :ref=\"measureRef\"\n >\n <span v-for=\"i in node.depth\" :key=\"i\" :class=\"cls.e('indent')\" aria-hidden=\"true\"></span>\n\n <u-icon v-if=\"!node.isLeaf\" :class=\"cls.e('expand-icon')\" @click.stop=\"toggleExpand\">\n <ArrowRight />\n </u-icon>\n <u-icon v-else :class=\"cls.e('leaf-icon')\" aria-hidden=\"true\">\n <Dot />\n </u-icon>\n\n <div\n :class=\"cls.e('node-content')\"\n @click=\"handleClick\"\n @contextmenu=\"treeEmit('node-contextmenu', $event, node)\"\n v-ripple=\"\n (treeProps.checkable || treeProps.selectable) && !node.disabled ? cls.e('ripple') : false\n \"\n >\n <u-checkbox\n v-if=\"treeProps.checkable\"\n :class=\"cls.e('checkbox')\"\n :model-value=\"node.checked\"\n :indeterminate=\"node.indeterminate\"\n :disabled=\"node.disabled\"\n @change=\"handleChange\"\n @click.stop\n />\n\n <u-node-render :content=\"getTreeSlotsNode({ node, data: node.data })\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { vRipple } from '@veltra/directives'\nimport { ArrowRight, Dot } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { inject } from 'vue'\n\nimport type { TreeNodeProps } from '../../types'\nimport UCheckbox from '../checkbox/checkbox.vue'\nimport { UIcon } from '../icon'\nimport { UNodeRender } from '../node-render'\nimport { TreeDIKey } from './di'\n\ndefineOptions({ name: 'UTreeNode' })\n\nconst props = defineProps<TreeNodeProps>()\n\nconst { treeProps, treeEmit, cls, getTreeSlotsNode, getFlattedNodes, toggleCheck, handleSelect } =\n inject(TreeDIKey)!\n\nfunction measureRef(el: unknown) {\n if (typeof props.index !== 'number' || !props.measureElement) return\n props.measureElement(props.index, el as Element | null)\n}\n\nfunction toggleExpand() {\n const { node } = props\n node.expanded = !node.expanded\n getFlattedNodes()\n\n treeEmit('expand', node)\n}\n\nfunction handleChange(checked: boolean, e: MouseEvent) {\n toggleCheck(props.node, checked, e.ctrlKey)\n}\n\nfunction handleClick(e: MouseEvent) {\n const { node } = props\n treeEmit('node-click', node)\n\n treeProps.selectable && handleSelect(node)\n treeProps.expandOnClickNode && toggleExpand()\n treeProps.checkable &&\n !node.disabled &&\n !treeProps.expandOnClickNode &&\n toggleCheck(node, !node.checked, e.ctrlKey)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAmDA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,UAAU,KAAK,kBAAkB,iBAAiB,aAAa,iBAChF,OAAO,SAAS;EAElB,SAAS,WAAW,IAAa;GAC/B,IAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,gBAAgB;GAC9D,MAAM,eAAe,MAAM,OAAO,EAAoB;EACxD;EAEA,SAAS,eAAe;GACtB,MAAM,EAAE,SAAS;GACjB,KAAK,WAAW,CAAC,KAAK;GACtB,gBAAgB;GAEhB,SAAS,UAAU,IAAI;EACzB;EAEA,SAAS,aAAa,SAAkB,GAAe;GACrD,YAAY,MAAM,MAAM,SAAS,EAAE,OAAO;EAC5C;EAEA,SAAS,YAAY,GAAe;GAClC,MAAM,EAAE,SAAS;GACjB,SAAS,cAAc,IAAI;GAE3B,UAAU,cAAc,aAAa,IAAI;GACzC,UAAU,qBAAqB,aAAa;GAC5C,UAAU,aACR,CAAC,KAAK,YACN,CAAC,UAAU,qBACX,YAAY,MAAM,CAAC,KAAK,SAAS,EAAE,OAAO;EAC9C;;uBAlFE,mBAiCM,OAAA;IAhCH,OAAK,eAAA;KAAG,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;KAAU,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,QAAA,KAAK,QAAQ;KAAG,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,QAAA,KAAK,QAAQ;IAAA,CAAA;IAC1F,KAAK;;sBAEN,mBAA0F,UAAA,MAAA,WAAxE,QAAA,KAAK,QAAV,MAAC;yBAAd,mBAA0F,QAAA;MAA3D,KAAK;MAAI,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA;MAAY,eAAY;;;KAE7D,QAAA,KAAK,UAAA,UAAA,GAApB,YAES,MAAA,WAAA,GAAA;;KAFoB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA;KAAkB,SAAK,cAAO,cAAY,CAAA,MAAA,CAAA;;4BACnE,CAAd,YAAc,MAAA,UAAA,CAAA,CAAA,CAAA;;sCAEhB,YAES,MAAA,WAAA,GAAA;;KAFO,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,WAAA,CAAA;KAAe,eAAY;;4BAC9C,CAAP,YAAO,MAAA,GAAA,CAAA,CAAA,CAAA;;;iCAGT,mBAmBM,OAAA;KAlBH,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,cAAA,CAAA;KACZ,SAAO;KACP,eAAW,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,QAAA,CAAQ,CAAA,oBAAqB,QAAQ,QAAA,IAAI;QAM/C,MAAA,SAAA,CAAS,CAAC,aAAA,UAAA,GADlB,YAQE,aAAA;;KANC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA,CAAA;KACZ,eAAa,QAAA,KAAK;KAClB,eAAe,QAAA,KAAK;KACpB,UAAU,QAAA,KAAK;KACf,UAAQ;KACR,SAAK,OAAA,OAAA,OAAA,KAAA,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;;;;;;4CAGb,YAAwE,MAAA,UAAA,GAAA,EAAxD,SAAS,MAAA,gBAAA,CAAgB,CAAA;KAAA,MAAG,QAAA;KAAI,MAAQ,QAAA,KAAK;IAAI,CAAA,EAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,CAAA,GAAA,EAAA,IAAA,CAAA,CAAA,MAAA,OAAA,IAd7C,MAAA,SAAA,CAAS,CAAC,aAAa,MAAA,SAAA,CAAS,CAAC,eAAU,CAAM,QAAA,KAAK,WAAW,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,IAAA,KAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tree-node2.js","names":["TreeNode","CoreTreeNode"],"sources":["../../../src/components/tree/tree-node.ts"],"sourcesContent":["import { TreeNode as CoreTreeNode, o } from '@cat-kit/core'\nimport { shallowReactive } from 'vue'\n\nexport class TreeNode<Val extends Record<string, any> = Record<string, any>> extends CoreTreeNode<\n Val,\n TreeNode<Val>\n> {\n declare parent?: TreeNode<Val>\n\n declare children?: TreeNode<Val>[]\n\n expanded = false\n loading = false\n loaded = false\n /** 多选是否选中 */\n checked = false\n disabled = false\n visible = true\n /** 子节点选中数量 */\n childrenCheckCount = 0\n\n get indeterminate(): boolean {\n if (!this.children) return false\n return (\n this.childrenCheckCount > 0\n // && this.childrenCheckCount < this.children.length\n )\n }\n\n labelKey: string\n valueKey: string\n\n constructor(params: {\n data: Val\n index: number\n depth: number\n parent?: TreeNode<Val>\n labelKey: string\n valueKey: string\n }) {\n const { data, index, depth, parent, labelKey, valueKey } = params\n super(data, index, depth, parent)\n this.labelKey = labelKey\n this.valueKey = valueKey\n\n return shallowReactive(this)\n }\n\n get label(): string {\n return String(o(this.data).get(this.labelKey))\n }\n\n get key(): string | number {\n return o(this.data).get(this.valueKey) as string | number\n }\n\n /**\n * 向上冒泡设置\n * @param setter 设置函数, 返回 false 则停止冒泡\n */\n bubbleSet(setter: (node: TreeNode<Val>) => boolean | void): void {\n const ret = setter(this)\n ret !== false && this.parent?.bubbleSet(setter)\n }\n}\n"],"mappings":";;;AAGA,IAAaA,aAAb,cAAqFC,SAGnF;CAKA,WAAW;CACX,UAAU;CACV,SAAS;;CAET,UAAU;CACV,WAAW;CACX,UAAU;;CAEV,qBAAqB;CAErB,IAAI,gBAAyB;EAC3B,IAAI,CAAC,KAAK,UAAU,OAAO;EAC3B,OACE,KAAK,qBAAqB;CAG9B;CAEA;CACA;CAEA,YAAY,QAOT;EACD,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,aAAa;EAC3D,MAAM,MAAM,OAAO,OAAO,MAAM;EAChC,KAAK,WAAW;EAChB,KAAK,WAAW;EAEhB,OAAO,gBAAgB,IAAI;CAC7B;CAEA,IAAI,QAAgB;EAClB,OAAO,OAAO,EAAE,KAAK,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC;CAC/C;CAEA,IAAI,MAAuB;EACzB,OAAO,EAAE,KAAK,IAAI,EAAE,IAAI,KAAK,QAAQ;CACvC;;;;;CAMA,UAAU,QAAuD;EAE/D,OADmB,IACjB,MAAM,SAAS,KAAK,QAAQ,UAAU,MAAM;CAChD;AACF"}
1
+ {"version":3,"file":"tree-node2.js","names":["TreeNode","CoreTreeNode"],"sources":["../../../src/components/tree/tree-node.ts"],"sourcesContent":["import { TreeNode as CoreTreeNode, o } from '@cat-kit/core'\nimport { shallowReactive } from 'vue'\n\nexport class TreeNode<Val extends Record<string, any> = Record<string, any>> extends CoreTreeNode<\n Val,\n TreeNode<Val>\n> {\n declare parent?: TreeNode<Val>\n\n declare children?: TreeNode<Val>[]\n\n expanded = false\n loading = false\n loaded = false\n /** 多选是否选中 */\n checked = false\n disabled = false\n visible = true\n /** 子节点选中数量 */\n childrenCheckCount = 0\n\n get indeterminate(): boolean {\n if (!this.children) return false\n return (\n this.childrenCheckCount > 0\n // && this.childrenCheckCount < this.children.length\n )\n }\n\n labelKey: string\n valueKey: string\n\n constructor(params: {\n data: Val\n index: number\n depth: number\n parent?: TreeNode<Val>\n labelKey: string\n valueKey: string\n }) {\n const { data, index, depth, parent, labelKey, valueKey } = params\n super(data, index, depth, parent)\n this.labelKey = labelKey\n this.valueKey = valueKey\n\n return shallowReactive(this)\n }\n\n get label(): string {\n return String(o(this.data).get(this.labelKey))\n }\n\n get key(): string | number {\n return o(this.data).get(this.valueKey) as string | number\n }\n\n /**\n * 向上冒泡设置\n * @param setter 设置函数, 返回 false 则停止冒泡\n */\n bubbleSet(setter: (node: TreeNode<Val>) => boolean | void): void {\n const ret = setter(this)\n ret !== false && this.parent?.bubbleSet(setter)\n }\n}\n"],"mappings":";;;AAGA,IAAaA,aAAb,cAAqFC,SAGnF;CAKA,WAAW;CACX,UAAU;CACV,SAAS;;CAET,UAAU;CACV,WAAW;CACX,UAAU;;CAEV,qBAAqB;CAErB,IAAI,gBAAyB;EAC3B,IAAI,CAAC,KAAK,UAAU,OAAO;EAC3B,OACE,KAAK,qBAAqB;CAG9B;CAEA;CACA;CAEA,YAAY,QAOT;EACD,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,aAAa;EAC3D,MAAM,MAAM,OAAO,OAAO,MAAM;EAChC,KAAK,WAAW;EAChB,KAAK,WAAW;EAEhB,OAAO,gBAAgB,IAAI;CAC7B;CAEA,IAAI,QAAgB;EAClB,OAAO,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;CAC/C;CAEA,IAAI,MAAuB;EACzB,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;CACvC;;;;;CAMA,UAAU,QAAuD;EAE/D,OADmB,IACjB,MAAM,SAAS,KAAK,QAAQ,UAAU,MAAM;CAChD;AACF"}
@@ -10,8 +10,8 @@ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock
10
10
  import { useFormFallbackProps, useVirtualizer } from "@veltra/compositions";
11
11
  import { bem, injectFormContext, nextFrame, scrollIntoContainerView } from "@veltra/utils";
12
12
  //#region src/components/tree/tree.vue
13
- const _sfc_main = /* @__PURE__ */ defineComponent({
14
- name: "Tree",
13
+ const _sfc_main = /*@__PURE__*/ defineComponent({
14
+ name: "UTree",
15
15
  __name: "tree",
16
16
  props: {
17
17
  expandAll: { type: Boolean },
@@ -1 +1 @@
1
- {"version":3,"file":"tree.js","names":[],"sources":["../../../src/components/tree/tree.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"className\"\n ref=\"scrollRef\"\n :content-class=\"[cls.e('wrap'), bem.is('virtual', virtualEnabled)]\"\n >\n <template v-if=\"virtualEnabled\">\n <UTreeNode\n v-for=\"{ node, key, offset, index } of virtualNodes\"\n :node=\"node\"\n :key=\"key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n :index=\"index\"\n :measure-element=\"measureElement\"\n :style=\"{ transform: `translateY(${offset}px)` }\"\n />\n </template>\n <template v-else>\n <UTreeNode\n v-for=\"node of nodes\"\n :node=\"node\"\n :key=\"node.key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n />\n </template>\n\n <div :class=\"cls.e('empty')\" v-if=\"!nodes.length\">\n <UEmpty />\n </div>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { bem, nextFrame, scrollIntoContainerView } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, provide, shallowRef, useSlots, watch, watchEffect, type VNode } from 'vue'\n\nimport type { TreeProps, TreeEmit, _TreeExposed } from '../../types'\nimport type { ScrollExposed } from '../../types'\nimport { UEmpty } from '../empty'\nimport { UScroll } from '../scroll'\nimport { TreeDIKey, type TreeConText, type TreeSlotsScope } from './di'\nimport UTreeNode from './tree-node.vue'\nimport { useCheck } from './use-check'\nimport { useFilter } from './use-filter'\nimport { useSelect } from './use-select'\nimport { useTreeNodes } from './use-tree-nodes'\n\ndefineOptions({ name: 'Tree' })\n\nconst props = withDefaults(defineProps<TreeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n childrenKey: 'children',\n expandOnClickNode: false,\n checkStrictly: false,\n data: () => []\n})\n\nconst emit = defineEmits<TreeEmit>()\n\nconst cls = bem('tree')\n\nconst { formProps } = injectFormContext()\n\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('selectable', props.selectable),\n bem.is('checkable', props.checkable)\n ]\n})\n\ndefineSlots<{ default: (props: TreeSlotsScope) => any }>()\n\nconst slots = useSlots()\n\nfunction getTreeSlotsNode(ctx: TreeSlotsScope): VNode[] | string | undefined {\n return (props.slots?.default ?? slots.default)?.(ctx) ?? ctx.node.label\n}\n\nconst { nodes, forest, getFlattedNodes, nodeDict } = useTreeNodes({ props })\n\nwatch(\n [() => props.selectable, () => props.checkable, forest],\n ([s, c]) => {\n // 如果选择或勾选,则不更新节点\n if (s || c) return\n getFlattedNodes()\n },\n { immediate: true }\n)\n\nconst { filter } = useFilter({ forest, getFlattedNodes })\n\nconst { handleSelect, selectedData } = useSelect({ props, emit, nodeDict, getFlattedNodes })\n\nconst { checkedData, toggleCheck } = useCheck({ props, emit, nodeDict, getFlattedNodes })\n\nconst estimateSize = (): number => {\n // 基于 style.scss 中节点稳态高度推算的默认值;\n // 实际高度仍由 `measureElement` 通过 ResizeObserver 回填覆盖。\n switch (size.value) {\n case 'small':\n return 32\n case 'large':\n return 44\n default:\n return 36\n }\n}\n\n// 80 阈值内化为消费者侧语义;低于此值时不启用虚拟化。\nconst virtualEnabled = computed(() => nodes.value.length > 80)\n\nconst { virtualizer, items } = useVirtualizer({\n count: computed(() => nodes.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n // 仅在虚拟化启用时把内容容器的 height 撑开到 totalSize;\n // 关闭时传 null,hook 会清除此前写入的内联 height,回到 CSS 默认。\n contentEl: () => (virtualEnabled.value ? (scrollRef.value?.contentRef ?? null) : null),\n estimateSize,\n gap: 2,\n // 以节点稳定 key 作为虚拟项身份,展开 / 收起 / 过滤引起的 nodes 数组变更\n // 保留未移动节点的真实测量值,避免再次滚动首屏抖动。\n getItemKey: (i) => nodes.value[i]?.key ?? i\n})\n\n// 身份稳定性已由底层 `getItemKey` 保证;直接以 `node.key` 作为 Vue 层 key。\n// `item.index` 仅作为 nodes / snapshot 竞态边缘的 fallback。\nconst virtualNodes = computed(() => {\n const _nodes = nodes.value\n return items.value.map((item) => {\n const node = _nodes[item.index]!\n return { node, key: node?.key ?? item.index, offset: item.start, index: item.index }\n })\n})\n\nconst measureElement: (index: number, el: Element | null) => void = (index, el) =>\n virtualizer.measureElement(index, el)\n\nfunction scrollTo(index: number): void {\n virtualizer.scrollToIndex(index, { align: 'center' })\n}\n\nfunction scrollIntoView() {\n const { selectable, checkable, scrollToView } = props\n if (!scrollToView || (!selectable && !checkable) || !nodes.value) return\n let index = -1\n\n if (selectable) {\n if (!selectedData.value) return\n index = nodes.value.findIndex((node) => node.data === selectedData.value)\n } else if (checkable) {\n if (!checkedData.size) return\n index = nodes.value.findIndex((node) => checkedData.has(node.data))\n }\n\n if (virtualEnabled.value) {\n scrollTo(index)\n } else {\n const { contentRef, containerRef } = scrollRef.value ?? {}\n const el = contentRef?.children[index]\n el && scrollIntoContainerView(el as HTMLElement, containerRef ?? null)\n }\n}\n\nwatchEffect(() => {\n nextFrame(() => {\n scrollIntoView()\n })\n})\n\nprovide(TreeDIKey, {\n cls,\n selectedData,\n checkedData,\n getFlattedNodes,\n getTreeSlotsNode,\n treeEmit: emit as TreeEmit,\n treeProps: props as TreeProps,\n toggleCheck: toggleCheck as TreeConText['toggleCheck'],\n handleSelect: handleSelect as TreeConText['handleSelect']\n})\n\ndefineExpose<_TreeExposed>({\n filter,\n forest,\n nodes,\n checkNode: toggleCheck,\n selectNode: handleSelect,\n checkAll(check: boolean) {\n forest.value.roots.forEach((node) => {\n toggleCheck(node, check)\n })\n },\n getSelected() {\n return selectedData\n },\n getChecked() {\n return Array.from(checkedData)\n },\n scrollTo,\n\n expandAll() {\n forest.value.dfs((node) => {\n node.expanded = true\n })\n getFlattedNodes()\n },\n collapseAll() {\n forest.value.dfs((node) => {\n node.expanded = false\n })\n getFlattedNodes()\n }\n})\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"tree.js","names":[],"sources":["../../../src/components/tree/tree.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"className\"\n ref=\"scrollRef\"\n :content-class=\"[cls.e('wrap'), bem.is('virtual', virtualEnabled)]\"\n >\n <template v-if=\"virtualEnabled\">\n <UTreeNode\n v-for=\"{ node, key, offset, index } of virtualNodes\"\n :node=\"node\"\n :key=\"key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n :index=\"index\"\n :measure-element=\"measureElement\"\n :style=\"{ transform: `translateY(${offset}px)` }\"\n />\n </template>\n <template v-else>\n <UTreeNode\n v-for=\"node of nodes\"\n :node=\"node\"\n :key=\"node.key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n />\n </template>\n\n <div :class=\"cls.e('empty')\" v-if=\"!nodes.length\">\n <UEmpty />\n </div>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { bem, nextFrame, scrollIntoContainerView } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, provide, shallowRef, useSlots, watch, watchEffect, type VNode } from 'vue'\n\nimport type { TreeProps, TreeEmit, _TreeExposed } from '../../types'\nimport type { ScrollExposed } from '../../types'\nimport { UEmpty } from '../empty'\nimport { UScroll } from '../scroll'\nimport { TreeDIKey, type TreeConText, type TreeSlotsScope } from './di'\nimport UTreeNode from './tree-node.vue'\nimport { useCheck } from './use-check'\nimport { useFilter } from './use-filter'\nimport { useSelect } from './use-select'\nimport { useTreeNodes } from './use-tree-nodes'\n\ndefineOptions({ name: 'UTree' })\n\nconst props = withDefaults(defineProps<TreeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n childrenKey: 'children',\n expandOnClickNode: false,\n checkStrictly: false,\n data: () => []\n})\n\nconst emit = defineEmits<TreeEmit>()\n\nconst cls = bem('tree')\n\nconst { formProps } = injectFormContext()\n\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('selectable', props.selectable),\n bem.is('checkable', props.checkable)\n ]\n})\n\ndefineSlots<{ default: (props: TreeSlotsScope) => any }>()\n\nconst slots = useSlots()\n\nfunction getTreeSlotsNode(ctx: TreeSlotsScope): VNode[] | string | undefined {\n return (props.slots?.default ?? slots.default)?.(ctx) ?? ctx.node.label\n}\n\nconst { nodes, forest, getFlattedNodes, nodeDict } = useTreeNodes({ props })\n\nwatch(\n [() => props.selectable, () => props.checkable, forest],\n ([s, c]) => {\n // 如果选择或勾选,则不更新节点\n if (s || c) return\n getFlattedNodes()\n },\n { immediate: true }\n)\n\nconst { filter } = useFilter({ forest, getFlattedNodes })\n\nconst { handleSelect, selectedData } = useSelect({ props, emit, nodeDict, getFlattedNodes })\n\nconst { checkedData, toggleCheck } = useCheck({ props, emit, nodeDict, getFlattedNodes })\n\nconst estimateSize = (): number => {\n // 基于 style.scss 中节点稳态高度推算的默认值;\n // 实际高度仍由 `measureElement` 通过 ResizeObserver 回填覆盖。\n switch (size.value) {\n case 'small':\n return 32\n case 'large':\n return 44\n default:\n return 36\n }\n}\n\n// 80 阈值内化为消费者侧语义;低于此值时不启用虚拟化。\nconst virtualEnabled = computed(() => nodes.value.length > 80)\n\nconst { virtualizer, items } = useVirtualizer({\n count: computed(() => nodes.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n // 仅在虚拟化启用时把内容容器的 height 撑开到 totalSize;\n // 关闭时传 null,hook 会清除此前写入的内联 height,回到 CSS 默认。\n contentEl: () => (virtualEnabled.value ? (scrollRef.value?.contentRef ?? null) : null),\n estimateSize,\n gap: 2,\n // 以节点稳定 key 作为虚拟项身份,展开 / 收起 / 过滤引起的 nodes 数组变更\n // 保留未移动节点的真实测量值,避免再次滚动首屏抖动。\n getItemKey: (i) => nodes.value[i]?.key ?? i\n})\n\n// 身份稳定性已由底层 `getItemKey` 保证;直接以 `node.key` 作为 Vue 层 key。\n// `item.index` 仅作为 nodes / snapshot 竞态边缘的 fallback。\nconst virtualNodes = computed(() => {\n const _nodes = nodes.value\n return items.value.map((item) => {\n const node = _nodes[item.index]!\n return { node, key: node?.key ?? item.index, offset: item.start, index: item.index }\n })\n})\n\nconst measureElement: (index: number, el: Element | null) => void = (index, el) =>\n virtualizer.measureElement(index, el)\n\nfunction scrollTo(index: number): void {\n virtualizer.scrollToIndex(index, { align: 'center' })\n}\n\nfunction scrollIntoView() {\n const { selectable, checkable, scrollToView } = props\n if (!scrollToView || (!selectable && !checkable) || !nodes.value) return\n let index = -1\n\n if (selectable) {\n if (!selectedData.value) return\n index = nodes.value.findIndex((node) => node.data === selectedData.value)\n } else if (checkable) {\n if (!checkedData.size) return\n index = nodes.value.findIndex((node) => checkedData.has(node.data))\n }\n\n if (virtualEnabled.value) {\n scrollTo(index)\n } else {\n const { contentRef, containerRef } = scrollRef.value ?? {}\n const el = contentRef?.children[index]\n el && scrollIntoContainerView(el as HTMLElement, containerRef ?? null)\n }\n}\n\nwatchEffect(() => {\n nextFrame(() => {\n scrollIntoView()\n })\n})\n\nprovide(TreeDIKey, {\n cls,\n selectedData,\n checkedData,\n getFlattedNodes,\n getTreeSlotsNode,\n treeEmit: emit as TreeEmit,\n treeProps: props as TreeProps,\n toggleCheck: toggleCheck as TreeConText['toggleCheck'],\n handleSelect: handleSelect as TreeConText['handleSelect']\n})\n\ndefineExpose<_TreeExposed>({\n filter,\n forest,\n nodes,\n checkNode: toggleCheck,\n selectNode: handleSelect,\n checkAll(check: boolean) {\n forest.value.roots.forEach((node) => {\n toggleCheck(node, check)\n })\n },\n getSelected() {\n return selectedData\n },\n getChecked() {\n return Array.from(checkedData)\n },\n scrollTo,\n\n expandAll() {\n forest.value.dfs((node) => {\n node.expanded = true\n })\n getFlattedNodes()\n },\n collapseAll() {\n forest.value.dfs((node) => {\n node.expanded = false\n })\n getFlattedNodes()\n }\n})\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-check.js","names":[],"sources":["../../../src/components/tree/use-check.ts"],"sourcesContent":["import { dfs, o } from '@cat-kit/core'\nimport { nextTick, watch, type ComputedRef } from 'vue'\n\nimport type { TreeEmit, TreeProps } from '../../types'\nimport type { TreeNode } from './tree-node'\n\ninterface Options {\n emit: TreeEmit\n props: TreeProps\n nodeDict: ComputedRef<Map<any, TreeNode>>\n getFlattedNodes: () => void\n}\n\ninterface UseCheckReturned {\n checkedData: Set<Record<string, any>>\n toggleCheck: (node: TreeNode, check: boolean, ctrlKey?: boolean) => void\n}\n\n/**\n * 展开目标节点的所有祖先。返回是否发生了实际展开。\n */\nfunction expandAncestors(node: TreeNode): boolean {\n let changed = false\n node.bubbleSet((n) => {\n if (n.parent) {\n if (n.parent.expanded) return false\n n.parent.expanded = true\n changed = true\n }\n })\n return changed\n}\n\nexport function useCheck(options: Options): UseCheckReturned {\n const { emit, props, nodeDict, getFlattedNodes } = options\n\n const checkedData = new Set<Record<string, any>>()\n\n /**\n * 上一次回显使用的 value 集合(仅限 props.checked)。\n * 用于在相同 `nodeDict` 下走差集回显,避免每次全量清空再重建。\n */\n let lastCheckedSet = new Set<unknown>()\n /** 最近一次参与差集比较的 nodeDict 引用;引用变化时视为整棵树重建。 */\n let lastDict: Map<any, TreeNode> | null = null\n\n function checkNode(node: TreeNode): void {\n if (node.checked) return\n node.checked = true\n if (node.parent) {\n node.parent.childrenCheckCount++\n }\n checkedData.add(node.data)\n }\n\n function uncheckNode(node: TreeNode): void {\n if (!node.checked) return\n node.checked = false\n if (node.parent) {\n node.parent.childrenCheckCount--\n }\n checkedData.delete(node.data)\n }\n\n /**\n * 模型值是否由事件触发\n */\n let checkedByEvent = false\n\n // 回显\n watch(\n [() => props.checked, nodeDict],\n ([c, dict]) => {\n // 事件已经触发模型变更了,所以不再进行下面的计算\n if (checkedByEvent || !props.checkable) return\n if (!dict.size) return\n\n const nextSet = new Set<unknown>(c ?? [])\n\n // 森林重建(dict 引用变化)→ 走全量清空重建路径,\n // 因为所有 TreeNode 实例都是新的,上一轮缓存的 lastCheckedSet 失效。\n const dictChanged = dict !== lastDict\n if (dictChanged) {\n checkedData.clear()\n lastCheckedSet = new Set()\n }\n\n let mutated = false\n\n // 取消:上一轮有但本轮没有的 value\n for (const v of lastCheckedSet) {\n if (!nextSet.has(v)) {\n const node = dict.get(v)\n if (node) {\n uncheckNode(node)\n mutated = true\n }\n }\n }\n\n // 新增:本轮有但上一轮没有的 value\n let ancestorsExpanded = false\n for (const v of nextSet) {\n if (!lastCheckedSet.has(v) || dictChanged) {\n const node = dict.get(v)\n if (node) {\n checkNode(node)\n mutated = true\n if (expandAncestors(node)) {\n ancestorsExpanded = true\n }\n }\n }\n }\n\n lastCheckedSet = nextSet\n lastDict = dict\n\n // 只在真实发生变化时才触发扁平化,避免空转。\n if (mutated || ancestorsExpanded) {\n getFlattedNodes()\n }\n },\n { immediate: true }\n )\n\n function handleCheck(node: TreeNode, ctrlKey?: boolean) {\n const { checkStrictly } = props\n\n if (ctrlKey) {\n checkNode(node)\n } else {\n dfs(\n node as unknown as Record<string, unknown>,\n (n) => {\n const tn = n as unknown as TreeNode\n !tn.disabled && checkNode(tn)\n },\n props.childrenKey ?? 'children'\n )\n }\n\n // 非严格选择时还需要更新祖先节点,\n // 一旦子节点全部选中,父节点也要设置为选中状态\n if (!checkStrictly) {\n node.bubbleSet((node) => {\n const { parent } = node\n\n if (parent) {\n const parentChecked = parent.childrenCheckCount === parent.children!.length\n\n parentChecked ? checkNode(parent) : uncheckNode(parent)\n }\n })\n }\n }\n\n function handleUncheck(node: TreeNode, ctrlKey?: boolean) {\n const { checkStrictly } = props\n if (ctrlKey) {\n uncheckNode(node)\n } else {\n dfs(\n node as unknown as Record<string, unknown>,\n (n) => {\n const tn = n as unknown as TreeNode\n !tn.disabled && uncheckNode(tn)\n },\n props.childrenKey ?? 'children'\n )\n }\n\n // 非严格模式下,取消选中时,需要更新父节点\n if (!checkStrictly) {\n node.bubbleSet((node) => {\n const { parent } = node\n if (parent) {\n uncheckNode(parent)\n }\n })\n }\n }\n\n function toggleCheck(node: TreeNode, check: boolean, ctrlKey?: boolean) {\n checkedByEvent = true\n\n check ? handleCheck(node, ctrlKey) : handleUncheck(node, ctrlKey)\n\n const checkedArr = Array.from(checkedData)\n\n const valueKey = props.valueKey!\n const nextValues = checkedArr.map((item) => o(item).get(valueKey) as unknown)\n\n // 与外部 checked 保持差集缓存同步,避免下一次 watch 回调把刚勾选的值又误判为“新增”。\n lastCheckedSet = new Set(nextValues)\n\n emit('update:checked', nextValues as any[], checkedArr)\n\n nextTick(() => {\n checkedByEvent = false\n })\n }\n\n return { checkedData, toggleCheck }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-check.js","names":[],"sources":["../../../src/components/tree/use-check.ts"],"sourcesContent":["import { dfs, o } from '@cat-kit/core'\nimport { nextTick, watch, type ComputedRef } from 'vue'\n\nimport type { TreeEmit, TreeProps } from '../../types'\nimport type { TreeNode } from './tree-node'\n\ninterface Options {\n emit: TreeEmit\n props: TreeProps\n nodeDict: ComputedRef<Map<any, TreeNode>>\n getFlattedNodes: () => void\n}\n\ninterface UseCheckReturned {\n checkedData: Set<Record<string, any>>\n toggleCheck: (node: TreeNode, check: boolean, ctrlKey?: boolean) => void\n}\n\n/**\n * 展开目标节点的所有祖先。返回是否发生了实际展开。\n */\nfunction expandAncestors(node: TreeNode): boolean {\n let changed = false\n node.bubbleSet((n) => {\n if (n.parent) {\n if (n.parent.expanded) return false\n n.parent.expanded = true\n changed = true\n }\n })\n return changed\n}\n\nexport function useCheck(options: Options): UseCheckReturned {\n const { emit, props, nodeDict, getFlattedNodes } = options\n\n const checkedData = new Set<Record<string, any>>()\n\n /**\n * 上一次回显使用的 value 集合(仅限 props.checked)。\n * 用于在相同 `nodeDict` 下走差集回显,避免每次全量清空再重建。\n */\n let lastCheckedSet = new Set<unknown>()\n /** 最近一次参与差集比较的 nodeDict 引用;引用变化时视为整棵树重建。 */\n let lastDict: Map<any, TreeNode> | null = null\n\n function checkNode(node: TreeNode): void {\n if (node.checked) return\n node.checked = true\n if (node.parent) {\n node.parent.childrenCheckCount++\n }\n checkedData.add(node.data)\n }\n\n function uncheckNode(node: TreeNode): void {\n if (!node.checked) return\n node.checked = false\n if (node.parent) {\n node.parent.childrenCheckCount--\n }\n checkedData.delete(node.data)\n }\n\n /**\n * 模型值是否由事件触发\n */\n let checkedByEvent = false\n\n // 回显\n watch(\n [() => props.checked, nodeDict],\n ([c, dict]) => {\n // 事件已经触发模型变更了,所以不再进行下面的计算\n if (checkedByEvent || !props.checkable) return\n if (!dict.size) return\n\n const nextSet = new Set<unknown>(c ?? [])\n\n // 森林重建(dict 引用变化)→ 走全量清空重建路径,\n // 因为所有 TreeNode 实例都是新的,上一轮缓存的 lastCheckedSet 失效。\n const dictChanged = dict !== lastDict\n if (dictChanged) {\n checkedData.clear()\n lastCheckedSet = new Set()\n }\n\n let mutated = false\n\n // 取消:上一轮有但本轮没有的 value\n for (const v of lastCheckedSet) {\n if (!nextSet.has(v)) {\n const node = dict.get(v)\n if (node) {\n uncheckNode(node)\n mutated = true\n }\n }\n }\n\n // 新增:本轮有但上一轮没有的 value\n let ancestorsExpanded = false\n for (const v of nextSet) {\n if (!lastCheckedSet.has(v) || dictChanged) {\n const node = dict.get(v)\n if (node) {\n checkNode(node)\n mutated = true\n if (expandAncestors(node)) {\n ancestorsExpanded = true\n }\n }\n }\n }\n\n lastCheckedSet = nextSet\n lastDict = dict\n\n // 只在真实发生变化时才触发扁平化,避免空转。\n if (mutated || ancestorsExpanded) {\n getFlattedNodes()\n }\n },\n { immediate: true }\n )\n\n function handleCheck(node: TreeNode, ctrlKey?: boolean) {\n const { checkStrictly } = props\n\n if (ctrlKey) {\n checkNode(node)\n } else {\n dfs(\n node as unknown as Record<string, unknown>,\n (n) => {\n const tn = n as unknown as TreeNode\n !tn.disabled && checkNode(tn)\n },\n props.childrenKey ?? 'children'\n )\n }\n\n // 非严格选择时还需要更新祖先节点,\n // 一旦子节点全部选中,父节点也要设置为选中状态\n if (!checkStrictly) {\n node.bubbleSet((node) => {\n const { parent } = node\n\n if (parent) {\n const parentChecked = parent.childrenCheckCount === parent.children!.length\n\n parentChecked ? checkNode(parent) : uncheckNode(parent)\n }\n })\n }\n }\n\n function handleUncheck(node: TreeNode, ctrlKey?: boolean) {\n const { checkStrictly } = props\n if (ctrlKey) {\n uncheckNode(node)\n } else {\n dfs(\n node as unknown as Record<string, unknown>,\n (n) => {\n const tn = n as unknown as TreeNode\n !tn.disabled && uncheckNode(tn)\n },\n props.childrenKey ?? 'children'\n )\n }\n\n // 非严格模式下,取消选中时,需要更新父节点\n if (!checkStrictly) {\n node.bubbleSet((node) => {\n const { parent } = node\n if (parent) {\n uncheckNode(parent)\n }\n })\n }\n }\n\n function toggleCheck(node: TreeNode, check: boolean, ctrlKey?: boolean) {\n checkedByEvent = true\n\n check ? handleCheck(node, ctrlKey) : handleUncheck(node, ctrlKey)\n\n const checkedArr = Array.from(checkedData)\n\n const valueKey = props.valueKey!\n const nextValues = checkedArr.map((item) => o(item).get(valueKey) as unknown)\n\n // 与外部 checked 保持差集缓存同步,避免下一次 watch 回调把刚勾选的值又误判为“新增”。\n lastCheckedSet = new Set(nextValues)\n\n emit('update:checked', nextValues as any[], checkedArr)\n\n nextTick(() => {\n checkedByEvent = false\n })\n }\n\n return { checkedData, toggleCheck }\n}\n"],"mappings":"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"}
@@ -8,10 +8,10 @@ import { FORM_EMPTY_CONTENT, bem, injectFormContext } from "@veltra/utils";
8
8
  import { ArrowDown, Search } from "@veltra/icons/normal";
9
9
  import { dfs, o } from "@cat-kit/core";
10
10
  //#region src/components/tree-select/tree-select.vue
11
- const _sfc_main = /* @__PURE__ */ defineComponent({
12
- name: "TreeSelect",
11
+ const _sfc_main = /*@__PURE__*/ defineComponent({
12
+ name: "UTreeSelect",
13
13
  __name: "tree-select",
14
- props: /* @__PURE__ */ mergeModels({
14
+ props: /*@__PURE__*/ mergeModels({
15
15
  modelValue: {},
16
16
  placeholder: { default: "请选择" },
17
17
  clearable: {
@@ -58,8 +58,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
58
58
  "modelValue": {},
59
59
  "modelModifiers": {}
60
60
  }),
61
- emits: /* @__PURE__ */ mergeModels([
61
+ emits: /*@__PURE__*/ mergeModels([
62
62
  "clear",
63
+ "update:modelValue",
63
64
  "change",
64
65
  "update:text"
65
66
  ], ["update:modelValue"]),
@@ -98,7 +99,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
98
99
  model.value = "";
99
100
  label.value = void 0;
100
101
  emit("clear");
101
- emit("change", "", void 0);
102
+ emit("change", void 0);
102
103
  emit("update:text", "");
103
104
  };
104
105
  let changedByEvent = false;
@@ -130,7 +131,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
130
131
  model.value = selected ?? "";
131
132
  if (selectedData) label.value = o(selectedData).get(props.labelKey);
132
133
  else label.value = "";
133
- emit("change", selected, selectedData);
134
+ emit("change", selectedData);
134
135
  emit("update:text", label.value);
135
136
  dropdownRef.value?.close();
136
137
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tree-select.js","names":["$slots"],"sources":["../../../src/components/tree-select/tree-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n :class=\"[cls.b, bem.is('disabled', disabled)]\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n ref=\"dropdownRef\"\n :min-width=\"minWidth\"\n :width=\"width\"\n :disabled=\"disabled\"\n @update:visible=\"handleDropdownVisible\"\n >\n <template #trigger>\n <u-input\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n :model-value=\"text ?? (model ? label : undefined)\"\n @clear=\"handleClear\"\n native-readonly\n >\n <template #prefix v-if=\"$slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n <template #suffix>\n <u-icon :class=\"cls.e('arrow')\"><ArrowDown /></u-icon>\n </template>\n </u-input>\n </template>\n <template #content>\n <!-- 过滤器 -->\n <div v-if=\"filterable\" :class=\"[cls.e('content-filter'), cls.m(size)]\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\">\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n <!-- 菜单列表 -->\n\n <u-tree\n v-bind=\"treeProps\"\n :selected=\"model\"\n @update:selected=\"handleSelect\"\n ref=\"treeRef\"\n selectable\n :class=\"cls.e('content-tree')\"\n :slots=\"slots\"\n scroll-to-view\n />\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ text || label || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { dfs, o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { ArrowDown, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, nextTick, shallowRef, watch } from 'vue'\n\nimport type { TreeSelectProps, TreeSelectEmits, TreeExposed } from '../../types'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTree } from '../tree'\nimport type { TreeSlotsScope } from '../tree/di'\n\ndefineOptions({ name: 'TreeSelect' })\n\nconst props = withDefaults(defineProps<TreeSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n expandAll: false,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n filterable: false,\n minWidth: '280px'\n})\n\nconst emit = defineEmits<TreeSelectEmits>()\n\nconst slots = defineSlots<{\n /** 默认插槽 */\n default?: (props: TreeSlotsScope) => any\n /** 前缀插槽 */\n prefix?: () => any\n}>()\n\nconst treeProps = computed(() => {\n return o(props as Record<string, any>).omit([\n 'tips',\n 'field',\n 'placeholder',\n 'disabled',\n 'label',\n 'readonly',\n 'contentClass',\n 'contentStyle',\n 'minWidth',\n 'width'\n ])\n})\n\nconst cls = bem('tree-select')\n\n/**过滤 */\nconst qs = shallowRef('')\nwatch(qs, (qs) => {\n treeRef.value?.filter(qs)\n})\n\nconst model = defineModel<string | number>()\n\nconst label = shallowRef<string>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst treeRef = shallowRef<TreeExposed>()\n\nconst dropdownRef = shallowRef<InstanceType<typeof UDropdown>>()\n\n/**清空 */\nconst handleClear = () => {\n model.value = ''\n label.value = undefined\n emit('clear')\n emit('change', '', undefined)\n emit('update:text', '')\n}\n\nlet changedByEvent = false\nwatch(\n [() => props.data, model],\n ([data, model]) => {\n if (changedByEvent) return\n if (!data?.length || model === undefined) {\n label.value = undefined\n model = undefined\n return\n }\n\n let founded = false\n const childrenKey = props.childrenKey ?? 'children'\n data.some((item) => {\n dfs(\n item,\n (v) => {\n if (v[props.valueKey] === model) {\n label.value = v[props.labelKey]\n founded = true\n return true\n }\n },\n childrenKey\n )\n\n return founded\n })\n },\n { immediate: true }\n)\n\nconst handleSelect = (selected?: string | number, selectedData?: Record<string, any>) => {\n changedByEvent = true\n nextTick(() => {\n changedByEvent = false\n })\n\n model.value = selected ?? ''\n\n if (selectedData) {\n label.value = o(selectedData).get(props.labelKey)\n } else {\n label.value = ''\n }\n\n emit('change', selected, selectedData)\n emit('update:text', label.value)\n dropdownRef.value?.close()\n}\n\nconst handleDropdownVisible = (visible: boolean) => {\n if (!visible) {\n qs.value = ''\n }\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"tree-select.js","names":["$slots"],"sources":["../../../src/components/tree-select/tree-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n :class=\"[cls.b, bem.is('disabled', disabled)]\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n ref=\"dropdownRef\"\n :min-width=\"minWidth\"\n :width=\"width\"\n :disabled=\"disabled\"\n @update:visible=\"handleDropdownVisible\"\n >\n <template #trigger>\n <u-input\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n :model-value=\"text ?? (model ? label : undefined)\"\n @clear=\"handleClear\"\n native-readonly\n >\n <template #prefix v-if=\"$slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n <template #suffix>\n <u-icon :class=\"cls.e('arrow')\"><ArrowDown /></u-icon>\n </template>\n </u-input>\n </template>\n <template #content>\n <!-- 过滤器 -->\n <div v-if=\"filterable\" :class=\"[cls.e('content-filter'), cls.m(size)]\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\">\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n <!-- 菜单列表 -->\n\n <u-tree\n v-bind=\"treeProps\"\n :selected=\"model\"\n @update:selected=\"handleSelect\"\n ref=\"treeRef\"\n selectable\n :class=\"cls.e('content-tree')\"\n :slots=\"slots\"\n scroll-to-view\n />\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ text || label || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { dfs, o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { ArrowDown, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, nextTick, shallowRef, watch } from 'vue'\n\nimport type { TreeSelectProps, TreeSelectEmits, TreeExposed } from '../../types'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTree } from '../tree'\nimport type { TreeSlotsScope } from '../tree/di'\n\ndefineOptions({ name: 'UTreeSelect' })\n\nconst props = withDefaults(defineProps<TreeSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n expandAll: false,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n filterable: false,\n minWidth: '280px'\n})\n\nconst emit = defineEmits<TreeSelectEmits>()\n\nconst slots = defineSlots<{\n /** 默认插槽 */\n default?: (props: TreeSlotsScope) => any\n /** 前缀插槽 */\n prefix?: () => any\n}>()\n\nconst treeProps = computed(() => {\n return o(props as Record<string, any>).omit([\n 'tips',\n 'field',\n 'placeholder',\n 'disabled',\n 'label',\n 'readonly',\n 'contentClass',\n 'contentStyle',\n 'minWidth',\n 'width'\n ])\n})\n\nconst cls = bem('tree-select')\n\n/**过滤 */\nconst qs = shallowRef('')\nwatch(qs, (qs) => {\n treeRef.value?.filter(qs)\n})\n\nconst model = defineModel<string | number>()\n\nconst label = shallowRef<string>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst treeRef = shallowRef<TreeExposed>()\n\nconst dropdownRef = shallowRef<InstanceType<typeof UDropdown>>()\n\n/**清空 */\nconst handleClear = () => {\n model.value = ''\n label.value = undefined\n emit('clear')\n emit('change', undefined)\n emit('update:text', '')\n}\n\nlet changedByEvent = false\nwatch(\n [() => props.data, model],\n ([data, model]) => {\n if (changedByEvent) return\n if (!data?.length || model === undefined) {\n label.value = undefined\n model = undefined\n return\n }\n\n let founded = false\n const childrenKey = props.childrenKey ?? 'children'\n data.some((item) => {\n dfs(\n item,\n (v) => {\n if (v[props.valueKey] === model) {\n label.value = v[props.labelKey]\n founded = true\n return true\n }\n },\n childrenKey\n )\n\n return founded\n })\n },\n { immediate: true }\n)\n\nconst handleSelect = (selected?: string | number, selectedData?: Record<string, any>) => {\n changedByEvent = true\n nextTick(() => {\n changedByEvent = false\n })\n\n model.value = selected ?? ''\n\n if (selectedData) {\n label.value = o(selectedData).get(props.labelKey)\n } else {\n label.value = ''\n }\n\n emit('change', selectedData)\n emit('update:text', label.value)\n dropdownRef.value?.close()\n}\n\nconst handleDropdownVisible = (visible: boolean) => {\n if (!visible) {\n qs.value = ''\n }\n}\n</script>\n"],"mappings":"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"}
@@ -14,24 +14,25 @@ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
14
14
  declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
15
15
  "update:modelValue": (value: string | number | undefined) => any;
16
16
  } & {
17
- change: (value?: string | number | undefined, selectedData?: Record<string, any> | undefined) => any;
17
+ "update:modelValue": (value?: string | number | undefined) => any;
18
18
  clear: () => any;
19
+ change: (selectedData?: Record<string, any> | undefined) => any;
19
20
  "update:text": (text?: string | undefined) => any;
20
21
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
21
- "onUpdate:modelValue"?: ((value: string | number | undefined) => any) | undefined;
22
- onChange?: ((value?: string | number | undefined, selectedData?: Record<string, any> | undefined) => any) | undefined;
22
+ "onUpdate:modelValue"?: ((value?: string | number | undefined) => any) | undefined;
23
23
  onClear?: (() => any) | undefined;
24
+ onChange?: ((selectedData?: Record<string, any> | undefined) => any) | undefined;
24
25
  "onUpdate:text"?: ((text?: string | undefined) => any) | undefined;
25
26
  }>, {
26
- readonly: boolean;
27
- disabled: boolean;
28
27
  expandAll: boolean;
29
28
  labelKey: string;
30
29
  valueKey: string;
31
- minWidth: string;
32
30
  placeholder: string;
33
31
  clearable: boolean;
34
32
  filterable: boolean;
33
+ minWidth: string;
34
+ disabled: boolean;
35
+ readonly: boolean;
35
36
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
36
37
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
37
38
  declare const _default: typeof __VLS_export;
@@ -2,8 +2,8 @@ import { Teleport, createBlock, createElementBlock, createElementVNode, defineCo
2
2
  import { bem, setStyles, zIndex } from "@veltra/utils";
3
3
  import { debounce } from "@cat-kit/core";
4
4
  //#region src/components/watermark/watermark.vue
5
- const _sfc_main = /* @__PURE__ */ defineComponent({
6
- name: "Watermark",
5
+ const _sfc_main = /*@__PURE__*/ defineComponent({
6
+ name: "UWatermark",
7
7
  __name: "watermark",
8
8
  props: {
9
9
  text: {},
@@ -1 +1 @@
1
- {"version":3,"file":"watermark.js","names":[],"sources":["../../../src/components/watermark/watermark.vue"],"sourcesContent":["<template>\n <Teleport v-if=\"appendToBody\" to=\"body\">\n <div :class=\"cls.b\" ref=\"watermark\" :style=\"{ zIndex: zIndex() }\"></div>\n </Teleport>\n\n <div v-else :class=\"cls.b\" ref=\"watermark\" :style=\"{ zIndex: zIndex() }\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { debounce } from '@cat-kit/core'\nimport { bem, setStyles, zIndex } from '@veltra/utils'\nimport { onBeforeUnmount, onMounted, reactive, useTemplateRef } from 'vue'\n\nimport type { WatermarkProps, WatermarkEmits } from '../../types'\n\ndefineOptions({ name: 'Watermark' })\nconst cls = bem('watermark')\nconst props = withDefaults(defineProps<WatermarkProps>(), { route: -30, fontSize: 60 })\ndefineEmits<WatermarkEmits>()\n\nconst watermarkRef = useTemplateRef('watermark')\n\nconst styles = reactive({ fontColor: 'rgba(0,0,0,.1)', fontFamily: 'Arial', image: props.image })\n\nconst setWatermark = debounce(async () => {\n const str = props.text\n const container = watermarkRef.value\n\n if (!container || !str) return\n\n // 创建canvas\n let canvas: HTMLCanvasElement | null = document.createElement('canvas')\n\n // 创建canvs画布\n let ctx = canvas.getContext('2d')!\n // 字体\n ctx.font = `${props.fontSize}px ${styles.fontFamily}`\n\n const textWidth = ctx.measureText(str).width\n canvas = document.createElement('canvas')\n canvas.width = textWidth\n canvas.height = textWidth\n ctx = canvas.getContext('2d')!\n // 字体\n ctx.font = `${props.fontSize}px ${styles.fontFamily}`\n ctx = canvas.getContext('2d')!\n // 字体颜色\n ctx.fillStyle = styles.fontColor\n // 对齐方式\n ctx.textAlign = 'left'\n // 文本基线\n ctx.textBaseline = 'top'\n\n // 逆时旋转\n ctx.translate(textWidth / 2, textWidth / 2)\n ctx.rotate((props.route * Math.PI) / 180)\n ctx.translate(-textWidth / 2, -textWidth / 2)\n // 编制文字\n ctx.fillText(str, 0, (textWidth - props.fontSize) / 2)\n\n setStyles(container, { background: `url(${canvas.toDataURL('image/png')}) repeat` })\n\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n canvas = null\n}, 150)\n\nwindow.addEventListener('resize', setWatermark)\n\nonBeforeUnmount(() => {\n window.removeEventListener('resize', setWatermark)\n})\n\nonMounted(() => {\n setWatermark()\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;EAkBA,MAAM,MAAM,IAAI,WAAW;EAC3B,MAAM,QAAQ;EAGd,MAAM,eAAe,eAAe,WAAW;EAE/C,MAAM,SAAS,SAAS;GAAE,WAAW;GAAkB,YAAY;GAAS,OAAO,MAAM;EAAM,CAAC;EAEhG,MAAM,eAAe,SAAS,YAAY;GACxC,MAAM,MAAM,MAAM;GAClB,MAAM,YAAY,aAAa;GAE/B,IAAI,CAAC,aAAa,CAAC,KAAK;GAGxB,IAAI,SAAmC,SAAS,cAAc,QAAQ;GAGtE,IAAI,MAAM,OAAO,WAAW,IAAI;GAEhC,IAAI,OAAO,GAAG,MAAM,SAAS,KAAK,OAAO;GAEzC,MAAM,YAAY,IAAI,YAAY,GAAG,EAAE;GACvC,SAAS,SAAS,cAAc,QAAQ;GACxC,OAAO,QAAQ;GACf,OAAO,SAAS;GAChB,MAAM,OAAO,WAAW,IAAI;GAE5B,IAAI,OAAO,GAAG,MAAM,SAAS,KAAK,OAAO;GACzC,MAAM,OAAO,WAAW,IAAI;GAE5B,IAAI,YAAY,OAAO;GAEvB,IAAI,YAAY;GAEhB,IAAI,eAAe;GAGnB,IAAI,UAAU,YAAY,GAAG,YAAY,CAAC;GAC1C,IAAI,OAAQ,MAAM,QAAQ,KAAK,KAAM,GAAG;GACxC,IAAI,UAAU,CAAC,YAAY,GAAG,CAAC,YAAY,CAAC;GAE5C,IAAI,SAAS,KAAK,IAAI,YAAY,MAAM,YAAY,CAAC;GAErD,UAAU,WAAW,EAAE,YAAY,OAAO,OAAO,UAAU,WAAW,EAAE,UAAU,CAAC;GAEnF,IAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;GAC/C,SAAS;EACX,GAAG,GAAG;EAEN,OAAO,iBAAiB,UAAU,YAAY;EAE9C,sBAAsB;GACpB,OAAO,oBAAoB,UAAU,YAAY;EACnD,CAAC;EAED,gBAAgB;GACd,aAAa;EACf,CAAC;;UA3EiB,QAAA,gBAAA,UAAA,GAAhB,YAEW,UAAA;;IAFmB,IAAG;OAC/B,mBAAwE,OAAA;IAAlE,OAAK,eAAE,MAAA,GAAA,EAAI,CAAC;IAAE,KAAI;IAAa,OAAK,eAAA,EAAA,QAAY,MAAA,MAAA,EAAM,EAAA,CAAA;kCAG9D,mBAEM,OAAA;;IAFO,OAAK,eAAE,MAAA,GAAA,EAAI,CAAC;IAAE,KAAI;IAAa,OAAK,eAAA,EAAA,QAAY,MAAA,MAAA,EAAM,EAAA,CAAA;OACjE,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"watermark.js","names":[],"sources":["../../../src/components/watermark/watermark.vue"],"sourcesContent":["<template>\n <Teleport v-if=\"appendToBody\" to=\"body\">\n <div :class=\"cls.b\" ref=\"watermark\" :style=\"{ zIndex: zIndex() }\"></div>\n </Teleport>\n\n <div v-else :class=\"cls.b\" ref=\"watermark\" :style=\"{ zIndex: zIndex() }\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { debounce } from '@cat-kit/core'\nimport { bem, setStyles, zIndex } from '@veltra/utils'\nimport { onBeforeUnmount, onMounted, reactive, useTemplateRef } from 'vue'\n\nimport type { WatermarkProps, WatermarkEmits } from '../../types'\n\ndefineOptions({ name: 'UWatermark' })\nconst cls = bem('watermark')\nconst props = withDefaults(defineProps<WatermarkProps>(), { route: -30, fontSize: 60 })\ndefineEmits<WatermarkEmits>()\n\nconst watermarkRef = useTemplateRef('watermark')\n\nconst styles = reactive({ fontColor: 'rgba(0,0,0,.1)', fontFamily: 'Arial', image: props.image })\n\nconst setWatermark = debounce(async () => {\n const str = props.text\n const container = watermarkRef.value\n\n if (!container || !str) return\n\n // 创建canvas\n let canvas: HTMLCanvasElement | null = document.createElement('canvas')\n\n // 创建canvs画布\n let ctx = canvas.getContext('2d')!\n // 字体\n ctx.font = `${props.fontSize}px ${styles.fontFamily}`\n\n const textWidth = ctx.measureText(str).width\n canvas = document.createElement('canvas')\n canvas.width = textWidth\n canvas.height = textWidth\n ctx = canvas.getContext('2d')!\n // 字体\n ctx.font = `${props.fontSize}px ${styles.fontFamily}`\n ctx = canvas.getContext('2d')!\n // 字体颜色\n ctx.fillStyle = styles.fontColor\n // 对齐方式\n ctx.textAlign = 'left'\n // 文本基线\n ctx.textBaseline = 'top'\n\n // 逆时旋转\n ctx.translate(textWidth / 2, textWidth / 2)\n ctx.rotate((props.route * Math.PI) / 180)\n ctx.translate(-textWidth / 2, -textWidth / 2)\n // 编制文字\n ctx.fillText(str, 0, (textWidth - props.fontSize) / 2)\n\n setStyles(container, { background: `url(${canvas.toDataURL('image/png')}) repeat` })\n\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n canvas = null\n}, 150)\n\nwindow.addEventListener('resize', setWatermark)\n\nonBeforeUnmount(() => {\n window.removeEventListener('resize', setWatermark)\n})\n\nonMounted(() => {\n setWatermark()\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;EAkBA,MAAM,MAAM,IAAI,WAAW;EAC3B,MAAM,QAAQ;EAGd,MAAM,eAAe,eAAe,WAAW;EAE/C,MAAM,SAAS,SAAS;GAAE,WAAW;GAAkB,YAAY;GAAS,OAAO,MAAM;EAAM,CAAC;EAEhG,MAAM,eAAe,SAAS,YAAY;GACxC,MAAM,MAAM,MAAM;GAClB,MAAM,YAAY,aAAa;GAE/B,IAAI,CAAC,aAAa,CAAC,KAAK;GAGxB,IAAI,SAAmC,SAAS,cAAc,QAAQ;GAGtE,IAAI,MAAM,OAAO,WAAW,IAAI;GAEhC,IAAI,OAAO,GAAG,MAAM,SAAS,KAAK,OAAO;GAEzC,MAAM,YAAY,IAAI,YAAY,GAAG,CAAC,CAAC;GACvC,SAAS,SAAS,cAAc,QAAQ;GACxC,OAAO,QAAQ;GACf,OAAO,SAAS;GAChB,MAAM,OAAO,WAAW,IAAI;GAE5B,IAAI,OAAO,GAAG,MAAM,SAAS,KAAK,OAAO;GACzC,MAAM,OAAO,WAAW,IAAI;GAE5B,IAAI,YAAY,OAAO;GAEvB,IAAI,YAAY;GAEhB,IAAI,eAAe;GAGnB,IAAI,UAAU,YAAY,GAAG,YAAY,CAAC;GAC1C,IAAI,OAAQ,MAAM,QAAQ,KAAK,KAAM,GAAG;GACxC,IAAI,UAAU,CAAC,YAAY,GAAG,CAAC,YAAY,CAAC;GAE5C,IAAI,SAAS,KAAK,IAAI,YAAY,MAAM,YAAY,CAAC;GAErD,UAAU,WAAW,EAAE,YAAY,OAAO,OAAO,UAAU,WAAW,EAAE,UAAU,CAAC;GAEnF,IAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;GAC/C,SAAS;EACX,GAAG,GAAG;EAEN,OAAO,iBAAiB,UAAU,YAAY;EAE9C,sBAAsB;GACpB,OAAO,oBAAoB,UAAU,YAAY;EACnD,CAAC;EAED,gBAAgB;GACd,aAAa;EACf,CAAC;;UA3EiB,QAAA,gBAAA,UAAA,GAAhB,YAEW,UAAA;;IAFmB,IAAG;OAC/B,mBAAwE,OAAA;IAAlE,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IAAE,KAAI;IAAa,OAAK,eAAA,EAAA,QAAY,MAAA,MAAA,CAAM,CAAA,EAAA,CAAA;kCAG9D,mBAEM,OAAA;;IAFO,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IAAE,KAAI;IAAa,OAAK,eAAA,EAAA,QAAY,MAAA,MAAA,CAAM,CAAA,EAAA,CAAA;OACjE,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
@@ -29,13 +29,15 @@ interface CascadeProps extends FormComponentProps {
29
29
  /** 严格模式 */
30
30
  strict?: boolean;
31
31
  /**
32
- * 数据项
32
+ * 是否展示/提交完整路径
33
+ * @default true
34
+ * false 时显示、modelValue、update:label 均只体现选中叶子节点
33
35
  */
34
- data?: Record<string, any>[];
36
+ showFullPath?: boolean;
35
37
  /**
36
- * 禁用项
38
+ * 数据项
37
39
  */
38
- disabledNode?: (item: Record<string, any>) => boolean;
40
+ data?: Record<string, any>[];
39
41
  /**
40
42
  * 多选
41
43
  */
@@ -52,9 +54,11 @@ interface PanelItem {
52
54
  }
53
55
  /** 级联选择器组件定义的事件 */
54
56
  interface CascadeEmits {
57
+ /** 触发更新 label 事件 */
58
+ (e: 'update:label', label?: string | string[]): void;
55
59
  (e: 'update:modelValue', value?: string | string[]): void;
56
- (e: 'change', value: string[], label: string[], data: Record<string, any>[]): void;
57
- (e: 'change', value?: string, label?: string, item?: Record<string, any>): void;
60
+ (e: 'change', items: Record<string, any>[]): void;
61
+ (e: 'change', item?: Record<string, any>): void;
58
62
  (e: 'clear'): void;
59
63
  }
60
64
  /** 级联选择器组件暴露的属性和方法(组件内部使用) */
@@ -36,7 +36,8 @@ interface TreeSelectProps extends FormComponentProps, Omit<TreeProps, 'selected'
36
36
  /** 树形选择器组件定义的事件 */
37
37
  interface TreeSelectEmits {
38
38
  (e: 'clear'): void;
39
- (e: 'change', value?: string | number, selectedData?: Record<string, any>): void;
39
+ (e: 'update:modelValue', value?: string | number): void;
40
+ (e: 'change', selectedData?: Record<string, any>): void;
40
41
  (e: 'update:text', text?: string): void;
41
42
  }
42
43
  /** 树形选择器组件暴露的属性和方法(组件内部使用) */