@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":"use-rows.js","names":["useModel"],"sources":["../../../src/components/table/use-rows.ts"],"sourcesContent":["import { Forest, o } from '@cat-kit/core'\nimport { useModel } from '@veltra/compositions'\nimport { shallowRef, watch, type Ref, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableEmits, TableProps, TableRow } from '../../types'\nimport { TableRowNode } from './node/row'\n\ninterface Options {\n props: TableProps\n emit: TableEmits\n /**\n * D2:滚动中 (`true`) 跳过 `currentRow` 高亮写入。\n *\n * 行点击处理会通过 `currentRow` watcher 把 `isCurrent` 切换到新行 / 旧行上,\n * 触发对应 `<tr>` 的 class 重绘。在滚动期间 (移动端/触控板惯性滚动常见)\n * 意外点击不应改变高亮,因此直接跳过;滚动结束后的正常点击仍会生效。\n */\n isScrolling?: Ref<boolean>\n}\n\ninterface UseRowsReturned {\n /** 所有的行森林(树形数据) */\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n /** 当前可见的展平行列表 */\n rows: ShallowRef<TableRowNode[]>\n /** 切换树形行节点的展开/折叠 */\n toggleTreeRowExpand: (node: TableRow) => void\n /** 是否全部展开 */\n allExpanded: ShallowRef<boolean>\n /** 切换全部展开/折叠 */\n toggleAllTreeRowExpand: () => void\n /** 行点击处理 */\n handleRowClick: (row: TableRow, e: MouseEvent) => void\n /** 单元格点击处理 */\n handleCellClick: (row: TableRow, column: TableColumn, e: MouseEvent) => void\n /** 根据原始数据对象获取对应的 TableRow */\n getRowByData: (data: Record<string, any>) => TableRow | undefined\n}\n\nexport function useRows(options: Options): UseRowsReturned {\n const { props, emit, isScrolling } = options\n\n // --- 状态定义 ---\n\n /** 所有可见的行 */\n const rows = shallowRef<TableRowNode[]>([])\n /** 数据行, 不包括展开和折叠的行 */\n const dataRows = shallowRef<TableRowNode[]>([])\n /** 行森林(数据结构树) */\n const rowForest = shallowRef<Forest<Record<string, unknown>, any>>()\n /** 树形节点是否全部展开 */\n const allExpanded = shallowRef(props.defaultExpandAll ?? false)\n\n /** 当前高亮的行 */\n const currentRow = useModel({\n props,\n emit,\n propName: 'current',\n shallow: true,\n local: () => !!props.highlightCurrent\n })\n\n // --- 行字典维护 (性能优化) ---\n\n /**\n * 用于优化增删改时的性能。\n * 原理:Vue 的组件在属性发生改变时会重新渲染,通过 WeakMap 缓存 data -> TableRow 的映射,\n * 可以在数据更新时复用已有的 TableRowNode 实例,避免重复创建和 DOM 抖动。\n */\n let rowDicts = new WeakMap<Record<string, any>, TableRowNode>()\n let tempRowDicts: null | WeakMap<Record<string, any>, TableRowNode> = null\n let uidSeed = 0\n\n /** 获取行唯一标识 */\n const getRowUID = props.rowKey\n ? (rowData: Record<string, any>) => rowData && o(rowData).get(props.rowKey!)\n : () => uidSeed++\n\n /** 创建或复用 TableRow 实例 */\n const createRow = (\n data: Record<string, any>,\n index: number,\n depth = 0,\n parent?: TableRowNode\n ) => {\n const existRow = data ? rowDicts.get(data) : undefined\n if (existRow) {\n existRow.index = index\n existRow.depth = depth\n existRow.parent = parent\n return existRow\n }\n return new TableRowNode({ data, index, depth, parent, uid: getRowUID(data) })\n }\n\n // --- 行处理逻辑 ---\n\n /** 处理常规扁平列表 */\n function getDataRows(data: Record<string, any>[]): TableRowNode[] {\n let i = data.length\n const result = Array.from({ length: i }) as TableRowNode[]\n tempRowDicts = new WeakMap()\n\n while (i--) {\n const dataItem = data[i]!\n const row = createRow(dataItem, i)\n result[i] = row\n tempRowDicts.set(dataItem, row)\n }\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return result\n }\n\n function expandDataRows(): void {\n const result: TableRowNode[] = []\n let i = -1\n while (++i < dataRows.value.length) {\n const row = dataRows.value[i]!\n result.push(row)\n if (row.expanded) {\n result.push(row.copy())\n }\n }\n rows.value = result\n }\n\n /** 处理树形森林结构 */\n function getRowForest(data: Record<string, any>[]): Forest<Record<string, unknown>, any> {\n tempRowDicts = new WeakMap()\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n const ret = new Forest<Record<string, unknown>, any>({\n data,\n childrenKey,\n createNode(val, index, depth, _forest, parent) {\n const row = createRow(val, index, depth, parent)\n if (props.defaultExpandAll) {\n row.expanded = true\n }\n val && tempRowDicts!.set(val, row)\n return row\n }\n })\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return ret\n }\n\n /** 展平树形结构为可见行列表 */\n function updateFlattedRows(): void {\n if (!rowForest.value) return\n rows.value = rowForest.value.flattenVisible((n) => n.expanded)\n }\n\n // --- 副作用监听 ---\n\n // 监听当前行切换,维护 isCurrent 状态\n watch(\n () => currentRow.value,\n (row, oldRow) => {\n if (oldRow) oldRow.isCurrent = false\n if (row) row.isCurrent = true\n }\n )\n\n // 同步状态给外部\n watch(rows, (rows) => emit('update:rows', rows))\n watch(rowForest, (forest) => emit('update:forest', forest))\n\n // 核心:监听原始数据变化,重新构建行列表或树\n watch(\n [() => props.data, () => props.tree, () => props.defaultExpandAll],\n ([data, tree]) => {\n if (!data?.length) {\n rows.value = []\n rowDicts = new WeakMap()\n rowForest.value = undefined\n return\n }\n\n if (!tree) {\n rowForest.value = undefined\n dataRows.value = getDataRows(data)\n rows.value = dataRows.value\n } else {\n dataRows.value = []\n rowForest.value = getRowForest(data)\n updateFlattedRows()\n }\n },\n { immediate: true }\n )\n\n // --- 交互方法 ---\n\n function toggleTreeRowExpand(node: TableRow): void {\n node.expanded = !node.expanded\n\n if (props.tree) {\n return updateFlattedRows()\n }\n if (props.expandable) {\n expandDataRows()\n }\n }\n\n function toggleAllTreeRowExpand(): void {\n allExpanded.value = !allExpanded.value\n if (props.tree) {\n rowForest.value?.dfs((node) => {\n node.expanded = allExpanded.value\n })\n updateFlattedRows()\n return\n }\n if (props.expandable) {\n dataRows.value.forEach((row) => {\n row.expanded = allExpanded.value\n })\n expandDataRows()\n return\n }\n }\n\n function handleRowClick(row: TableRow, e: MouseEvent): void {\n // D2:滚动中的点击(多为惯性滚动误触)不应改变 currentRow 高亮。\n if (!isScrolling?.value) {\n currentRow.value = currentRow.value === row ? undefined : row\n }\n emit('row-click', row, e)\n }\n\n function handleCellClick(row: TableRow, column: TableColumn, e: MouseEvent): void {\n emit('cell-click', row, column, e)\n }\n\n function getRowByData(data: Record<string, any>): TableRow | undefined {\n return rowDicts.get(data)\n }\n\n return {\n rowForest,\n rows,\n allExpanded,\n toggleTreeRowExpand,\n toggleAllTreeRowExpand,\n handleRowClick,\n handleCellClick,\n getRowByData\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-rows.js","names":["useModel"],"sources":["../../../src/components/table/use-rows.ts"],"sourcesContent":["import { Forest, o } from '@cat-kit/core'\nimport { useModel } from '@veltra/compositions'\nimport { shallowRef, watch, type Ref, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableEmits, TableProps, TableRow } from '../../types'\nimport { TableRowNode } from './node/row'\n\ninterface Options {\n props: TableProps\n emit: TableEmits\n /**\n * D2:滚动中 (`true`) 跳过 `currentRow` 高亮写入。\n *\n * 行点击处理会通过 `currentRow` watcher 把 `isCurrent` 切换到新行 / 旧行上,\n * 触发对应 `<tr>` 的 class 重绘。在滚动期间 (移动端/触控板惯性滚动常见)\n * 意外点击不应改变高亮,因此直接跳过;滚动结束后的正常点击仍会生效。\n */\n isScrolling?: Ref<boolean>\n}\n\ninterface UseRowsReturned {\n /** 所有的行森林(树形数据) */\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n /** 当前可见的展平行列表 */\n rows: ShallowRef<TableRowNode[]>\n /** 切换树形行节点的展开/折叠 */\n toggleTreeRowExpand: (node: TableRow) => void\n /** 是否全部展开 */\n allExpanded: ShallowRef<boolean>\n /** 切换全部展开/折叠 */\n toggleAllTreeRowExpand: () => void\n /** 行点击处理 */\n handleRowClick: (row: TableRow, e: MouseEvent) => void\n /** 单元格点击处理 */\n handleCellClick: (row: TableRow, column: TableColumn, e: MouseEvent) => void\n /** 根据原始数据对象获取对应的 TableRow */\n getRowByData: (data: Record<string, any>) => TableRow | undefined\n}\n\nexport function useRows(options: Options): UseRowsReturned {\n const { props, emit, isScrolling } = options\n\n // --- 状态定义 ---\n\n /** 所有可见的行 */\n const rows = shallowRef<TableRowNode[]>([])\n /** 数据行, 不包括展开和折叠的行 */\n const dataRows = shallowRef<TableRowNode[]>([])\n /** 行森林(数据结构树) */\n const rowForest = shallowRef<Forest<Record<string, unknown>, any>>()\n /** 树形节点是否全部展开 */\n const allExpanded = shallowRef(props.defaultExpandAll ?? false)\n\n /** 当前高亮的行 */\n const currentRow = useModel({\n props,\n emit,\n propName: 'current',\n shallow: true,\n local: () => !!props.highlightCurrent\n })\n\n // --- 行字典维护 (性能优化) ---\n\n /**\n * 用于优化增删改时的性能。\n * 原理:Vue 的组件在属性发生改变时会重新渲染,通过 WeakMap 缓存 data -> TableRow 的映射,\n * 可以在数据更新时复用已有的 TableRowNode 实例,避免重复创建和 DOM 抖动。\n */\n let rowDicts = new WeakMap<Record<string, any>, TableRowNode>()\n let tempRowDicts: null | WeakMap<Record<string, any>, TableRowNode> = null\n let uidSeed = 0\n\n /** 获取行唯一标识 */\n const getRowUID = props.rowKey\n ? (rowData: Record<string, any>) => rowData && o(rowData).get(props.rowKey!)\n : () => uidSeed++\n\n /** 创建或复用 TableRow 实例 */\n const createRow = (\n data: Record<string, any>,\n index: number,\n depth = 0,\n parent?: TableRowNode\n ) => {\n const existRow = data ? rowDicts.get(data) : undefined\n if (existRow) {\n existRow.index = index\n existRow.depth = depth\n existRow.parent = parent\n return existRow\n }\n return new TableRowNode({ data, index, depth, parent, uid: getRowUID(data) })\n }\n\n // --- 行处理逻辑 ---\n\n /** 处理常规扁平列表 */\n function getDataRows(data: Record<string, any>[]): TableRowNode[] {\n let i = data.length\n const result = Array.from({ length: i }) as TableRowNode[]\n tempRowDicts = new WeakMap()\n\n while (i--) {\n const dataItem = data[i]!\n const row = createRow(dataItem, i)\n result[i] = row\n tempRowDicts.set(dataItem, row)\n }\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return result\n }\n\n function expandDataRows(): void {\n const result: TableRowNode[] = []\n let i = -1\n while (++i < dataRows.value.length) {\n const row = dataRows.value[i]!\n result.push(row)\n if (row.expanded) {\n result.push(row.copy())\n }\n }\n rows.value = result\n }\n\n /** 处理树形森林结构 */\n function getRowForest(data: Record<string, any>[]): Forest<Record<string, unknown>, any> {\n tempRowDicts = new WeakMap()\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n const ret = new Forest<Record<string, unknown>, any>({\n data,\n childrenKey,\n createNode(val, index, depth, _forest, parent) {\n const row = createRow(val, index, depth, parent)\n if (props.defaultExpandAll) {\n row.expanded = true\n }\n val && tempRowDicts!.set(val, row)\n return row\n }\n })\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return ret\n }\n\n /** 展平树形结构为可见行列表 */\n function updateFlattedRows(): void {\n if (!rowForest.value) return\n rows.value = rowForest.value.flattenVisible((n) => n.expanded)\n }\n\n // --- 副作用监听 ---\n\n // 监听当前行切换,维护 isCurrent 状态\n watch(\n () => currentRow.value,\n (row, oldRow) => {\n if (oldRow) oldRow.isCurrent = false\n if (row) row.isCurrent = true\n }\n )\n\n // 同步状态给外部\n watch(rows, (rows) => emit('update:rows', rows))\n watch(rowForest, (forest) => emit('update:forest', forest))\n\n // 核心:监听原始数据变化,重新构建行列表或树\n watch(\n [() => props.data, () => props.tree, () => props.defaultExpandAll],\n ([data, tree]) => {\n if (!data?.length) {\n rows.value = []\n rowDicts = new WeakMap()\n rowForest.value = undefined\n return\n }\n\n if (!tree) {\n rowForest.value = undefined\n dataRows.value = getDataRows(data)\n rows.value = dataRows.value\n } else {\n dataRows.value = []\n rowForest.value = getRowForest(data)\n updateFlattedRows()\n }\n },\n { immediate: true }\n )\n\n // --- 交互方法 ---\n\n function toggleTreeRowExpand(node: TableRow): void {\n node.expanded = !node.expanded\n\n if (props.tree) {\n return updateFlattedRows()\n }\n if (props.expandable) {\n expandDataRows()\n }\n }\n\n function toggleAllTreeRowExpand(): void {\n allExpanded.value = !allExpanded.value\n if (props.tree) {\n rowForest.value?.dfs((node) => {\n node.expanded = allExpanded.value\n })\n updateFlattedRows()\n return\n }\n if (props.expandable) {\n dataRows.value.forEach((row) => {\n row.expanded = allExpanded.value\n })\n expandDataRows()\n return\n }\n }\n\n function handleRowClick(row: TableRow, e: MouseEvent): void {\n // D2:滚动中的点击(多为惯性滚动误触)不应改变 currentRow 高亮。\n if (!isScrolling?.value) {\n currentRow.value = currentRow.value === row ? undefined : row\n }\n emit('row-click', row, e)\n }\n\n function handleCellClick(row: TableRow, column: TableColumn, e: MouseEvent): void {\n emit('cell-click', row, column, e)\n }\n\n function getRowByData(data: Record<string, any>): TableRow | undefined {\n return rowDicts.get(data)\n }\n\n return {\n rowForest,\n rows,\n allExpanded,\n toggleTreeRowExpand,\n toggleAllTreeRowExpand,\n handleRowClick,\n handleCellClick,\n getRowByData\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-table.js","names":[],"sources":["../../../src/components/table/use-table.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { bem, type BEM } from '@veltra/utils'\nimport { useSlots, watch, type Ref } from 'vue'\n\nimport type {\n TableColumnRenderContext,\n TableColumnSlotsScope,\n TableProps,\n TableRow,\n RenderReturn,\n TableRowSlotsScope\n} from '../../types'\nimport type { ColumnNode } from './node/col'\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n leftFixed: Ref<boolean>\n rightFixed: Ref<boolean>\n}\n\ninterface UseTableReturn {\n getColumnSlotsNode: (ctx: TableColumnSlotsScope | TableColumnRenderContext) => RenderReturn\n getHeaderSlotsNode: (ctx: { column: ColumnNode }) => RenderReturn\n getExpandRowSlotsNode: (ctx: TableRowSlotsScope) => RenderReturn\n getCellClass: (column: ColumnNode) => string\n getHeaderCellClass: (column: ColumnNode) => string\n getCellCtx: (\n row: TableRow,\n column: ColumnNode\n ) => TableColumnSlotsScope | TableColumnRenderContext\n}\n\nexport function useTable(options: Options): UseTableReturn {\n const { props, cls, leftFixed, rightFixed } = options\n\n const slots = useSlots()\n\n const getColumnSlotsNode = (\n ctx: TableColumnSlotsScope | TableColumnRenderContext\n ): RenderReturn => {\n const column = ctx.column.data\n\n const { render, key } = column\n\n if (render) return render(ctx)\n\n const slotsRender = props.slots?.[`column:${key}`] ?? slots[`column:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return ctx.val\n }\n\n const getHeaderSlotsNode = (ctx: { column: ColumnNode }): RenderReturn => {\n const column = ctx.column.data\n const { nameRender, key } = column\n\n if (nameRender) return nameRender(ctx)\n\n const slotsRender = props.slots?.[`header:${key}`] ?? slots[`header:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return column.name\n }\n\n const getExpandRowSlotsNode = (ctx: TableRowSlotsScope): RenderReturn => {\n const slotsRender = props.slots?.['row:expand'] ?? slots['row:expand']\n\n if (slotsRender) return slotsRender(ctx)\n return null\n }\n\n const cellCls = cls.e('cell')\n\n const getCommonClassName = (column: ColumnNode): string => {\n const classList: string[] = [cellCls]\n\n leftFixed.value && column.isLastFixed && classList.push(bem.is('last-fixed'))\n\n rightFixed.value && column.isFirstFixed && classList.push(bem.is('first-fixed'))\n\n if (column.fixed) {\n classList.push(bem.is('fixed-' + column.fixed))\n }\n return classList.join(' ')\n }\n\n /**\n * B1: 单元格类名按 ColumnNode 身份缓存。\n *\n * 对同一列,类名只取决于 (column.fixed, column.isLastFixed, column.isFirstFixed,\n * column.align, leftFixed, rightFixed)。其中前四个绑定在 ColumnNode 实例上,\n * 后两个在 leftFixed/rightFixed 变化时失效缓存即可。用 WeakMap 以 ColumnNode\n * 为键可避免字符串 key 的拼接/哈希开销,且列树重建时节点随 GC 自动释放。\n */\n let cellClassCache = new WeakMap<ColumnNode, string>()\n let headerCellClassCache = new WeakMap<ColumnNode, string>()\n\n watch([leftFixed, rightFixed], () => {\n cellClassCache = new WeakMap()\n headerCellClassCache = new WeakMap()\n })\n\n /**\n * B2: 即便缓存命中也需读取 `leftFixed` / `rightFixed`,将其登记为调用方\n * render effect 的响应式依赖。\n *\n * 否则横向滚动时虽然 `watch` 已经清空缓存,但已渲染的单元格没有任何依赖\n * 把这两个 ref 串联到自己的 render,导致 `is-last-fixed` / `is-first-fixed`\n * 阴影 class 不会被刷新——只有垂直滚动让虚拟列表新挂载行时(render 首次\n * 命中空缓存读到最新值)才能看到阴影。\n *\n * 父级 `useTable` 的 watch effect id 早于子 `TableRow` 的 render effect,\n * 同一 flush 周期中缓存会先被清空,再轮到 render 重跑读到最新值。\n */\n const getCellClass = (column: ColumnNode): string => {\n void leftFixed.value\n void rightFixed.value\n const cached = cellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.align)}`\n cellClassCache.set(column, result)\n return result\n }\n\n const getHeaderCellClass = (column: ColumnNode): string => {\n void leftFixed.value\n void rightFixed.value\n const cached = headerCellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.headerAlign)}`\n headerCellClassCache.set(column, result)\n return result\n }\n\n const getCellCtx = (\n row: TableRow,\n column: ColumnNode\n ): TableColumnSlotsScope | TableColumnRenderContext => {\n const rowData = row.data\n const val = column.key ? o(rowData).get(column.key) : undefined\n\n const ctx = {\n row,\n column,\n rowData,\n val,\n model: {\n modelValue: val,\n 'onUpdate:modelValue': (val: any) => {\n rowData[column.key] = val\n }\n }\n }\n\n return ctx\n }\n\n return {\n /**\n * 获取列插槽VNode\n * @param ctx 列渲染上下文\n */\n getColumnSlotsNode,\n /**\n * 获取表头插槽VNode\n * @param ctx 表头渲染上下文\n */\n getHeaderSlotsNode,\n /**\n * 获取展开行插槽VNode\n * @param ctx 展开行渲染上下文\n */\n getExpandRowSlotsNode,\n /**\n * 获取单元格类名\n * @param column 列\n */\n getCellClass,\n /**\n * 获取表头单元格类名\n * @param column 列\n */\n getHeaderCellClass,\n /**\n * 获取单元格上下文\n * @param row 行\n * @param column 列\n */\n getCellCtx\n }\n}\n"],"mappings":";;;;AAiCA,SAAgB,SAAS,SAAkC;CACzD,MAAM,EAAE,OAAO,KAAK,WAAW,eAAe;CAE9C,MAAM,QAAQ,SAAS;CAEvB,MAAM,sBACJ,QACiB;EAGjB,MAAM,EAAE,QAAQ,QAFD,IAAI,OAAO;EAI1B,IAAI,QAAQ,OAAO,OAAO,GAAG;EAE7B,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;EAEtE,IAAI,aAAa,OAAO,YAAY,GAAG;EAEvC,OAAO,IAAI;CACb;CAEA,MAAM,sBAAsB,QAA8C;EACxE,MAAM,SAAS,IAAI,OAAO;EAC1B,MAAM,EAAE,YAAY,QAAQ;EAE5B,IAAI,YAAY,OAAO,WAAW,GAAG;EAErC,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;EAEtE,IAAI,aAAa,OAAO,YAAY,GAAG;EAEvC,OAAO,OAAO;CAChB;CAEA,MAAM,yBAAyB,QAA0C;EACvE,MAAM,cAAc,MAAM,QAAQ,iBAAiB,MAAM;EAEzD,IAAI,aAAa,OAAO,YAAY,GAAG;EACvC,OAAO;CACT;CAEA,MAAM,UAAU,IAAI,EAAE,MAAM;CAE5B,MAAM,sBAAsB,WAA+B;EACzD,MAAM,YAAsB,CAAC,OAAO;EAEpC,UAAU,SAAS,OAAO,eAAe,UAAU,KAAK,IAAI,GAAG,YAAY,CAAC;EAE5E,WAAW,SAAS,OAAO,gBAAgB,UAAU,KAAK,IAAI,GAAG,aAAa,CAAC;EAE/E,IAAI,OAAO,OACT,UAAU,KAAK,IAAI,GAAG,WAAW,OAAO,KAAK,CAAC;EAEhD,OAAO,UAAU,KAAK,GAAG;CAC3B;;;;;;;;;CAUA,IAAI,iCAAiB,IAAI,QAA4B;CACrD,IAAI,uCAAuB,IAAI,QAA4B;CAE3D,MAAM,CAAC,WAAW,UAAU,SAAS;EACnC,iCAAiB,IAAI,QAAQ;EAC7B,uCAAuB,IAAI,QAAQ;CACrC,CAAC;;;;;;;;;;;;;CAcD,MAAM,gBAAgB,WAA+B;EACnD,UAAe;EACf,WAAgB;EAChB,MAAM,SAAS,eAAe,IAAI,MAAM;EACxC,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,MAAM,SAAS,mBAAmB,MAAM,IAAI,IAAI,IAAI,GAAG,OAAO,KAAK;EACnE,eAAe,IAAI,QAAQ,MAAM;EACjC,OAAO;CACT;CAEA,MAAM,sBAAsB,WAA+B;EACzD,UAAe;EACf,WAAgB;EAChB,MAAM,SAAS,qBAAqB,IAAI,MAAM;EAC9C,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,MAAM,SAAS,mBAAmB,MAAM,IAAI,IAAI,IAAI,GAAG,OAAO,WAAW;EACzE,qBAAqB,IAAI,QAAQ,MAAM;EACvC,OAAO;CACT;CAEA,MAAM,cACJ,KACA,WACqD;EACrD,MAAM,UAAU,IAAI;EACpB,MAAM,MAAM,OAAO,MAAM,EAAE,OAAO,EAAE,IAAI,OAAO,GAAG,IAAI,KAAA;EAetD,OAAO;GAZL;GACA;GACA;GACA;GACA,OAAO;IACL,YAAY;IACZ,wBAAwB,QAAa;KACnC,QAAQ,OAAO,OAAO;IACxB;GACF;EAGO;CACX;CAEA,OAAO;;;;;EAKL;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;;EAMA;CACF;AACF"}
1
+ {"version":3,"file":"use-table.js","names":[],"sources":["../../../src/components/table/use-table.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { bem, type BEM } from '@veltra/utils'\nimport { useSlots, watch, type Ref } from 'vue'\n\nimport type {\n TableColumnRenderContext,\n TableColumnSlotsScope,\n TableProps,\n TableRow,\n RenderReturn,\n TableRowSlotsScope\n} from '../../types'\nimport type { ColumnNode } from './node/col'\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n leftFixed: Ref<boolean>\n rightFixed: Ref<boolean>\n}\n\ninterface UseTableReturn {\n getColumnSlotsNode: (ctx: TableColumnSlotsScope | TableColumnRenderContext) => RenderReturn\n getHeaderSlotsNode: (ctx: { column: ColumnNode }) => RenderReturn\n getExpandRowSlotsNode: (ctx: TableRowSlotsScope) => RenderReturn\n getCellClass: (column: ColumnNode) => string\n getHeaderCellClass: (column: ColumnNode) => string\n getCellCtx: (\n row: TableRow,\n column: ColumnNode\n ) => TableColumnSlotsScope | TableColumnRenderContext\n}\n\nexport function useTable(options: Options): UseTableReturn {\n const { props, cls, leftFixed, rightFixed } = options\n\n const slots = useSlots()\n\n const getColumnSlotsNode = (\n ctx: TableColumnSlotsScope | TableColumnRenderContext\n ): RenderReturn => {\n const column = ctx.column.data\n\n const { render, key } = column\n\n if (render) return render(ctx)\n\n const slotsRender = props.slots?.[`column:${key}`] ?? slots[`column:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return ctx.val\n }\n\n const getHeaderSlotsNode = (ctx: { column: ColumnNode }): RenderReturn => {\n const column = ctx.column.data\n const { nameRender, key } = column\n\n if (nameRender) return nameRender(ctx)\n\n const slotsRender = props.slots?.[`header:${key}`] ?? slots[`header:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return column.name\n }\n\n const getExpandRowSlotsNode = (ctx: TableRowSlotsScope): RenderReturn => {\n const slotsRender = props.slots?.['row:expand'] ?? slots['row:expand']\n\n if (slotsRender) return slotsRender(ctx)\n return null\n }\n\n const cellCls = cls.e('cell')\n\n const getCommonClassName = (column: ColumnNode): string => {\n const classList: string[] = [cellCls]\n\n leftFixed.value && column.isLastFixed && classList.push(bem.is('last-fixed'))\n\n rightFixed.value && column.isFirstFixed && classList.push(bem.is('first-fixed'))\n\n if (column.fixed) {\n classList.push(bem.is('fixed-' + column.fixed))\n }\n return classList.join(' ')\n }\n\n /**\n * B1: 单元格类名按 ColumnNode 身份缓存。\n *\n * 对同一列,类名只取决于 (column.fixed, column.isLastFixed, column.isFirstFixed,\n * column.align, leftFixed, rightFixed)。其中前四个绑定在 ColumnNode 实例上,\n * 后两个在 leftFixed/rightFixed 变化时失效缓存即可。用 WeakMap 以 ColumnNode\n * 为键可避免字符串 key 的拼接/哈希开销,且列树重建时节点随 GC 自动释放。\n */\n let cellClassCache = new WeakMap<ColumnNode, string>()\n let headerCellClassCache = new WeakMap<ColumnNode, string>()\n\n watch([leftFixed, rightFixed], () => {\n cellClassCache = new WeakMap()\n headerCellClassCache = new WeakMap()\n })\n\n /**\n * B2: 即便缓存命中也需读取 `leftFixed` / `rightFixed`,将其登记为调用方\n * render effect 的响应式依赖。\n *\n * 否则横向滚动时虽然 `watch` 已经清空缓存,但已渲染的单元格没有任何依赖\n * 把这两个 ref 串联到自己的 render,导致 `is-last-fixed` / `is-first-fixed`\n * 阴影 class 不会被刷新——只有垂直滚动让虚拟列表新挂载行时(render 首次\n * 命中空缓存读到最新值)才能看到阴影。\n *\n * 父级 `useTable` 的 watch effect id 早于子 `TableRow` 的 render effect,\n * 同一 flush 周期中缓存会先被清空,再轮到 render 重跑读到最新值。\n */\n const getCellClass = (column: ColumnNode): string => {\n void leftFixed.value\n void rightFixed.value\n const cached = cellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.align)}`\n cellClassCache.set(column, result)\n return result\n }\n\n const getHeaderCellClass = (column: ColumnNode): string => {\n void leftFixed.value\n void rightFixed.value\n const cached = headerCellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.headerAlign)}`\n headerCellClassCache.set(column, result)\n return result\n }\n\n const getCellCtx = (\n row: TableRow,\n column: ColumnNode\n ): TableColumnSlotsScope | TableColumnRenderContext => {\n const rowData = row.data\n const val = column.key ? o(rowData).get(column.key) : undefined\n\n const ctx = {\n row,\n column,\n rowData,\n val,\n model: {\n modelValue: val,\n 'onUpdate:modelValue': (val: any) => {\n rowData[column.key] = val\n }\n }\n }\n\n return ctx\n }\n\n return {\n /**\n * 获取列插槽VNode\n * @param ctx 列渲染上下文\n */\n getColumnSlotsNode,\n /**\n * 获取表头插槽VNode\n * @param ctx 表头渲染上下文\n */\n getHeaderSlotsNode,\n /**\n * 获取展开行插槽VNode\n * @param ctx 展开行渲染上下文\n */\n getExpandRowSlotsNode,\n /**\n * 获取单元格类名\n * @param column 列\n */\n getCellClass,\n /**\n * 获取表头单元格类名\n * @param column 列\n */\n getHeaderCellClass,\n /**\n * 获取单元格上下文\n * @param row 行\n * @param column 列\n */\n getCellCtx\n }\n}\n"],"mappings":";;;;AAiCA,SAAgB,SAAS,SAAkC;CACzD,MAAM,EAAE,OAAO,KAAK,WAAW,eAAe;CAE9C,MAAM,QAAQ,SAAS;CAEvB,MAAM,sBACJ,QACiB;EAGjB,MAAM,EAAE,QAAQ,QAFD,IAAI,OAAO;EAI1B,IAAI,QAAQ,OAAO,OAAO,GAAG;EAE7B,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;EAEtE,IAAI,aAAa,OAAO,YAAY,GAAG;EAEvC,OAAO,IAAI;CACb;CAEA,MAAM,sBAAsB,QAA8C;EACxE,MAAM,SAAS,IAAI,OAAO;EAC1B,MAAM,EAAE,YAAY,QAAQ;EAE5B,IAAI,YAAY,OAAO,WAAW,GAAG;EAErC,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;EAEtE,IAAI,aAAa,OAAO,YAAY,GAAG;EAEvC,OAAO,OAAO;CAChB;CAEA,MAAM,yBAAyB,QAA0C;EACvE,MAAM,cAAc,MAAM,QAAQ,iBAAiB,MAAM;EAEzD,IAAI,aAAa,OAAO,YAAY,GAAG;EACvC,OAAO;CACT;CAEA,MAAM,UAAU,IAAI,EAAE,MAAM;CAE5B,MAAM,sBAAsB,WAA+B;EACzD,MAAM,YAAsB,CAAC,OAAO;EAEpC,UAAU,SAAS,OAAO,eAAe,UAAU,KAAK,IAAI,GAAG,YAAY,CAAC;EAE5E,WAAW,SAAS,OAAO,gBAAgB,UAAU,KAAK,IAAI,GAAG,aAAa,CAAC;EAE/E,IAAI,OAAO,OACT,UAAU,KAAK,IAAI,GAAG,WAAW,OAAO,KAAK,CAAC;EAEhD,OAAO,UAAU,KAAK,GAAG;CAC3B;;;;;;;;;CAUA,IAAI,iCAAiB,IAAI,QAA4B;CACrD,IAAI,uCAAuB,IAAI,QAA4B;CAE3D,MAAM,CAAC,WAAW,UAAU,SAAS;EACnC,iCAAiB,IAAI,QAAQ;EAC7B,uCAAuB,IAAI,QAAQ;CACrC,CAAC;;;;;;;;;;;;;CAcD,MAAM,gBAAgB,WAA+B;EACnD,UAAe;EACf,WAAgB;EAChB,MAAM,SAAS,eAAe,IAAI,MAAM;EACxC,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,MAAM,SAAS,mBAAmB,MAAM,IAAI,IAAI,IAAI,GAAG,OAAO,KAAK;EACnE,eAAe,IAAI,QAAQ,MAAM;EACjC,OAAO;CACT;CAEA,MAAM,sBAAsB,WAA+B;EACzD,UAAe;EACf,WAAgB;EAChB,MAAM,SAAS,qBAAqB,IAAI,MAAM;EAC9C,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,MAAM,SAAS,mBAAmB,MAAM,IAAI,IAAI,IAAI,GAAG,OAAO,WAAW;EACzE,qBAAqB,IAAI,QAAQ,MAAM;EACvC,OAAO;CACT;CAEA,MAAM,cACJ,KACA,WACqD;EACrD,MAAM,UAAU,IAAI;EACpB,MAAM,MAAM,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,OAAO,GAAG,IAAI,KAAA;EAetD,OAAO;GAZL;GACA;GACA;GACA;GACA,OAAO;IACL,YAAY;IACZ,wBAAwB,QAAa;KACnC,QAAQ,OAAO,OAAO;IACxB;GACF;EAGO;CACX;CAEA,OAAO;;;;;EAKL;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;;EAMA;CACF;AACF"}
@@ -9,8 +9,8 @@ const _hoisted_1 = { style: {
9
9
  "text-align": "center",
10
10
  "padding": "4px 0"
11
11
  } };
12
- const _sfc_main = /* @__PURE__ */ defineComponent({
13
- name: "TableEditor",
12
+ const _sfc_main = /*@__PURE__*/ defineComponent({
13
+ name: "UTableEditor",
14
14
  __name: "table-editor",
15
15
  props: {
16
16
  modelValue: { default: () => [] },
@@ -1 +1 @@
1
- {"version":3,"file":"table-editor.js","names":["$slots"],"sources":["../../../src/components/table-editor/table-editor.vue"],"sourcesContent":["<template>\n <u-table\n :columns=\"internalColumns\"\n :data=\"modelValue || []\"\n :class=\"cls.b\"\n :stripe=\"false\"\n show-index\n :slots=\"$slots\"\n >\n <template #column:__operation=\"{ row }\">\n <ButtonCommonProps tag=\"div\" style=\"display: flex; justify-content: center; gap: 8px\">\n <u-button type=\"danger\" @click=\"handleDelete(row.index)\" :icon=\"Minus\" title=\"移除\" />\n <u-button :icon=\"Plus\" @click=\"handleCreate(row.index)\" title=\"新增到下一行\" />\n <u-button :icon=\"Copy\" @click=\"handleCopy(row)\" title=\"复制到下一行\" />\n </ButtonCommonProps>\n </template>\n\n <!-- <template #header:__operation> </template> -->\n\n <template #empty>\n <div style=\"text-align: center; padding: 4px 0\">\n <u-button\n text\n size=\"small\"\n type=\"primary\"\n v-if=\"!modelValue.length\"\n :icon=\"Plus\"\n @click=\"handleCreate()\"\n >添加</u-button\n >\n </div>\n </template>\n </u-table>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useComponentProps } from '@veltra/compositions'\nimport { Copy, Minus, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TableEditorProps, TableEditorEmits, TableColumn } from '../../types'\nimport { UButton } from '../button'\nimport { UTable } from '../table'\nimport type { TableRowNode } from '../table/node/row'\n\ndefineOptions({ name: 'TableEditor' })\n\nconst { columns = [], modelValue = [] } = defineProps<TableEditorProps>()\nconst emit = defineEmits<TableEditorEmits>()\n\nconst cls = bem('table-editor')\n\nconst ButtonCommonProps = useComponentProps({\n size: 'small',\n circle: true,\n text: true,\n type: 'primary'\n})\n\nconst actionColumn: TableColumn = {\n key: '__operation',\n name: '操作', // 使用name而不是title\n width: 120,\n align: 'center',\n fixed: 'right',\n resizable: false\n}\n\n// 内部列定义,添加编辑和删除操作列\nconst internalColumns = computed(() => {\n return [...columns, actionColumn]\n})\n\nfunction handleCreate(index?: number) {\n if (index !== undefined) {\n emit('update:modelValue', [\n ...modelValue.slice(0, index + 1),\n {},\n ...modelValue.slice(index + 1)\n ])\n } else {\n emit('update:modelValue', [...modelValue, {}])\n }\n}\n\nfunction handleCopy(row: TableRowNode) {\n emit('update:modelValue', [\n ...modelValue.slice(0, row.index + 1),\n JSON.parse(JSON.stringify(row.data)),\n ...modelValue.slice(row.index + 1)\n ])\n}\n\nfunction handleDelete(index: number) {\n emit(\n 'update:modelValue',\n modelValue.filter((_, i) => i !== index)\n )\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAc;EAE9B,MAAM,oBAAoB,kBAAkB;GAC1C,MAAM;GACN,QAAQ;GACR,MAAM;GACN,MAAM;EACR,CAAC;EAED,MAAM,eAA4B;GAChC,KAAK;GACL,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,WAAW;EACb;EAGA,MAAM,kBAAkB,eAAe;GACrC,OAAO,CAAC,GAAG,QAAA,SAAS,YAAY;EAClC,CAAC;EAED,SAAS,aAAa,OAAgB;GACpC,IAAI,UAAU,KAAA,GACZ,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,QAAQ,CAAC;IAChC,CAAC;IACD,GAAG,QAAA,WAAW,MAAM,QAAQ,CAAC;GAC/B,CAAC;QAED,KAAK,qBAAqB,CAAC,GAAG,QAAA,YAAY,CAAC,CAAC,CAAC;EAEjD;EAEA,SAAS,WAAW,KAAmB;GACrC,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,IAAI,QAAQ,CAAC;IACpC,KAAK,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC;IACnC,GAAG,QAAA,WAAW,MAAM,IAAI,QAAQ,CAAC;GACnC,CAAC;EACH;EAEA,SAAS,aAAa,OAAe;GACnC,KACE,qBACA,QAAA,WAAW,QAAQ,GAAG,MAAM,MAAM,KAAK,CACzC;EACF;;uBAlGE,YA+BU,MAAA,WAAA,GAAA;IA9BP,SAAS,gBAAA;IACT,MAAM,QAAA,cAAU,CAAA;IAChB,OAAK,eAAE,MAAA,GAAA,EAAI,CAAC;IACZ,QAAQ;IACT,cAAA;IACC,OAAOA,KAAAA;;IAEG,sBAAkB,SAKP,EALW,UAAG,CAClC,YAIoB,MAAA,iBAAA,GAAA;KAJD,KAAI;KAAM,OAAA;MAAA,WAAA;MAAA,mBAAA;MAAA,OAAA;KAAA;;4BACyD;MAApF,YAAoF,MAAA,WAAA,GAAA;OAA1E,MAAK;OAAU,UAAK,WAAE,aAAa,IAAI,KAAK;OAAI,MAAM,MAAA,KAAA;OAAO,OAAM;;MAC7E,YAAyE,MAAA,WAAA,GAAA;OAA9D,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,aAAa,IAAI,KAAK;OAAG,OAAM;;MAC9D,YAAiE,MAAA,WAAA,GAAA;OAAtD,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,WAAW,GAAG;OAAG,OAAM;;;;;IAM/C,OAAK,cAWR,CAVN,mBAUM,OAVN,YAUM,CAAA,CALK,QAAA,WAAW,UAAA,UAAA,GAJpB,YAQC,MAAA,WAAA,GAAA;;KAPC,MAAA;KACA,MAAK;KACL,MAAK;KAEJ,MAAM,MAAA,IAAA;KACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,aAAY;;4BACjB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAF,MAAE,EAAA,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"table-editor.js","names":["$slots"],"sources":["../../../src/components/table-editor/table-editor.vue"],"sourcesContent":["<template>\n <u-table\n :columns=\"internalColumns\"\n :data=\"modelValue || []\"\n :class=\"cls.b\"\n :stripe=\"false\"\n show-index\n :slots=\"$slots\"\n >\n <template #column:__operation=\"{ row }\">\n <ButtonCommonProps tag=\"div\" style=\"display: flex; justify-content: center; gap: 8px\">\n <u-button type=\"danger\" @click=\"handleDelete(row.index)\" :icon=\"Minus\" title=\"移除\" />\n <u-button :icon=\"Plus\" @click=\"handleCreate(row.index)\" title=\"新增到下一行\" />\n <u-button :icon=\"Copy\" @click=\"handleCopy(row)\" title=\"复制到下一行\" />\n </ButtonCommonProps>\n </template>\n\n <!-- <template #header:__operation> </template> -->\n\n <template #empty>\n <div style=\"text-align: center; padding: 4px 0\">\n <u-button\n text\n size=\"small\"\n type=\"primary\"\n v-if=\"!modelValue.length\"\n :icon=\"Plus\"\n @click=\"handleCreate()\"\n >添加</u-button\n >\n </div>\n </template>\n </u-table>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useComponentProps } from '@veltra/compositions'\nimport { Copy, Minus, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TableEditorProps, TableEditorEmits, TableColumn } from '../../types'\nimport { UButton } from '../button'\nimport { UTable } from '../table'\nimport type { TableRowNode } from '../table/node/row'\n\ndefineOptions({ name: 'UTableEditor' })\n\nconst { columns = [], modelValue = [] } = defineProps<TableEditorProps>()\nconst emit = defineEmits<TableEditorEmits>()\n\nconst cls = bem('table-editor')\n\nconst ButtonCommonProps = useComponentProps({\n size: 'small',\n circle: true,\n text: true,\n type: 'primary'\n})\n\nconst actionColumn: TableColumn = {\n key: '__operation',\n name: '操作', // 使用name而不是title\n width: 120,\n align: 'center',\n fixed: 'right',\n resizable: false\n}\n\n// 内部列定义,添加编辑和删除操作列\nconst internalColumns = computed(() => {\n return [...columns, actionColumn]\n})\n\nfunction handleCreate(index?: number) {\n if (index !== undefined) {\n emit('update:modelValue', [\n ...modelValue.slice(0, index + 1),\n {},\n ...modelValue.slice(index + 1)\n ])\n } else {\n emit('update:modelValue', [...modelValue, {}])\n }\n}\n\nfunction handleCopy(row: TableRowNode) {\n emit('update:modelValue', [\n ...modelValue.slice(0, row.index + 1),\n JSON.parse(JSON.stringify(row.data)),\n ...modelValue.slice(row.index + 1)\n ])\n}\n\nfunction handleDelete(index: number) {\n emit(\n 'update:modelValue',\n modelValue.filter((_, i) => i !== index)\n )\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAc;EAE9B,MAAM,oBAAoB,kBAAkB;GAC1C,MAAM;GACN,QAAQ;GACR,MAAM;GACN,MAAM;EACR,CAAC;EAED,MAAM,eAA4B;GAChC,KAAK;GACL,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,WAAW;EACb;EAGA,MAAM,kBAAkB,eAAe;GACrC,OAAO,CAAC,GAAG,QAAA,SAAS,YAAY;EAClC,CAAC;EAED,SAAS,aAAa,OAAgB;GACpC,IAAI,UAAU,KAAA,GACZ,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,QAAQ,CAAC;IAChC,CAAC;IACD,GAAG,QAAA,WAAW,MAAM,QAAQ,CAAC;GAC/B,CAAC;QAED,KAAK,qBAAqB,CAAC,GAAG,QAAA,YAAY,CAAC,CAAC,CAAC;EAEjD;EAEA,SAAS,WAAW,KAAmB;GACrC,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,IAAI,QAAQ,CAAC;IACpC,KAAK,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC;IACnC,GAAG,QAAA,WAAW,MAAM,IAAI,QAAQ,CAAC;GACnC,CAAC;EACH;EAEA,SAAS,aAAa,OAAe;GACnC,KACE,qBACA,QAAA,WAAW,QAAQ,GAAG,MAAM,MAAM,KAAK,CACzC;EACF;;uBAlGE,YA+BU,MAAA,WAAA,GAAA;IA9BP,SAAS,gBAAA;IACT,MAAM,QAAA,cAAU,CAAA;IAChB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IACZ,QAAQ;IACT,cAAA;IACC,OAAOA,KAAAA;;IAEG,sBAAkB,SAKP,EALW,UAAG,CAClC,YAIoB,MAAA,iBAAA,GAAA;KAJD,KAAI;KAAM,OAAA;MAAA,WAAA;MAAA,mBAAA;MAAA,OAAA;KAAA;;4BACyD;MAApF,YAAoF,MAAA,WAAA,GAAA;OAA1E,MAAK;OAAU,UAAK,WAAE,aAAa,IAAI,KAAK;OAAI,MAAM,MAAA,KAAA;OAAO,OAAM;;MAC7E,YAAyE,MAAA,WAAA,GAAA;OAA9D,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,aAAa,IAAI,KAAK;OAAG,OAAM;;MAC9D,YAAiE,MAAA,WAAA,GAAA;OAAtD,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,WAAW,GAAG;OAAG,OAAM;;;;;IAM/C,OAAK,cAWR,CAVN,mBAUM,OAVN,YAUM,CAAA,CALK,QAAA,WAAW,UAAA,UAAA,GAJpB,YAQC,MAAA,WAAA,GAAA;;KAPC,MAAA;KACA,MAAK;KACL,MAAK;KAEJ,MAAM,MAAA,IAAA;KACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,aAAY;;4BACjB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAF,MAAE,EAAA,CAAA,EAAA,CAAA"}
@@ -9,10 +9,10 @@ const _hoisted_1 = ["disabled"];
9
9
  const _hoisted_2 = ["onClick"];
10
10
  const _hoisted_3 = ["aria-label", "onClick"];
11
11
  const _hoisted_4 = ["disabled"];
12
- const _sfc_main = /* @__PURE__ */ defineComponent({
13
- name: "TabsHorizontal",
12
+ const _sfc_main = /*@__PURE__*/ defineComponent({
13
+ name: "UTabsHorizontal",
14
14
  __name: "tabs-horizontal",
15
- props: /* @__PURE__ */ mergeModels({
15
+ props: /*@__PURE__*/ mergeModels({
16
16
  size: {},
17
17
  modelValue: {},
18
18
  items: {},
@@ -33,7 +33,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
33
33
  "modelValue": {},
34
34
  "modelModifiers": {}
35
35
  }),
36
- emits: /* @__PURE__ */ mergeModels([
36
+ emits: /*@__PURE__*/ mergeModels([
37
37
  "update:modelValue",
38
38
  "click",
39
39
  "close"
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-horizontal.js","names":[],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon> <ArrowLeft /> </u-icon>\n </button>\n\n <div ref=\"viewportRef\" :class=\"cls.e('viewport')\">\n <div ref=\"listRef\" :class=\"cls.e('list')\">\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n </div>\n\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'next')]\"\n :disabled=\"!canNext\"\n @click=\"scrollByStep(1)\"\n >\n <u-icon> <ArrowRight /> </u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { ArrowLeft, ArrowRight, Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsHorizontalEmits, TabsHorizontalProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { useTabsBar } from './use-tabs-bar'\n\ndefineOptions({ name: 'TabsHorizontal' })\n\nconst props = withDefaults(defineProps<TabsHorizontalProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsHorizontalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst viewportRef = shallowRef<HTMLElement>()\nconst listRef = shallowRef<HTMLElement>()\n\nconst itemsRef = computed(() => props.items)\n\nconst { showNav, canPrev, canNext, scrollByStep } = useTabsBar({\n viewportRef,\n listRef,\n items: itemsRef,\n model\n})\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+EA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,cAAc,WAAwB;EAC5C,MAAM,UAAU,WAAwB;EAIxC,MAAM,EAAE,SAAS,SAAS,SAAS,iBAAiB,WAAW;GAC7D;GACA;GACA,OALe,eAAe,MAAM,KAK7B;GACP;EACF,CAAC;EAED,MAAM,kBAAkB,SAAkB;GACxC,IAAI,KAAK,UAAU,OAAO;GAC1B,OAAO,KAAK,YAAY,MAAM;EAChC;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,MAAM,QAAQ,KAAK;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;;uBAzHE,mBA+DM,OAAA,EA9DH,OAAK,eAAA;IAAU,MAAA,GAAA,EAAI;IAAS,MAAA,GAAA,EAAI,EAAC,YAAA;IAAsB,MAAA,GAAA,EAAI,EAAE,QAAA,QAAQ;IAAS,MAAA,GAAA,EAAI,EAAE,MAAA,IAAA,CAAI;IAAS,MAAA,GAAA,EAAI,GAAE,SAAU,QAAA,KAAK;IAAS,MAAA,GAAA,EAAI,GAAE,WAAY,QAAA,OAAO;;mBASzJ,mBAQS,UAAA;KANP,MAAK;KACJ,OAAK,eAAA,CAAG,MAAA,GAAA,EAAI,EAAC,KAAA,GAAS,MAAA,GAAA,EAAI,GAAE,OAAA,MAAA,CAAA,CAAA;KAC5B,UAAQ,CAAG,MAAA,OAAA;KACX,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,YAAA,EAAY,EAAA;QAEpB,YAAgC,MAAA,WAAA,GAAA,MAAA;4BAAV,CAAb,YAAa,MAAA,SAAA,CAAA,CAAA,CAAA;;mCANd,MAAA,OAAA,CAAO,CAAA,CAAA;IASjB,mBAgCM,OAAA;cAhCG;KAAJ,KAAI;KAAe,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,UAAA,CAAA;QAClC,mBA8BM,OAAA;cA9BG;KAAJ,KAAI;KAAW,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,MAAA,CAAA;0BAC9B,mBA4BS,UAAA,MAAA,WAzBiB,QAAA,QAAhB,MAAM,UAAK;yBAHrB,mBA4BS,UAAA;MA3BP,MAAK;MACL,MAAK;MAEJ,KAAK,KAAK;MACV,OAAK,eAAA;OAAgB,MAAA,GAAA,EAAI,EAAC,MAAA;OAAsB,MAAA,GAAA,EAAI,GAAE,UAAW,MAAA,UAAU,KAAK,GAAG;OAAe,MAAA,GAAA,EAAI,GAAE,YAAa,KAAK,aAAQ,IAAA;;MAKlI,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;SAEpC,WAEO,KAAA,QAAA,WAFP,WAEO,EAAA,SAAA,KAAA,GAAA;MAFS;MAAM;KAAK,CAAA,SAEpB,CADL,mBAAqE,QAAA,EAA9D,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,YAAA,CAAA,EAAA,GAAA,gBAAmB,KAAK,QAAQ,KAAK,GAAG,GAAA,CAAA,CAAA,CAAA,GAIrD,eAAe,IAAI,KAAA,UAAA,GAD3B,mBAWO,QAAA;;MATL,MAAK;MACL,UAAS;MACR,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,OAAA,CAAA;MACZ,cAAU,SAAW,KAAK,QAAQ,KAAK;MACvC,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;SAEpC,YAES,MAAA,WAAA,GAAA,MAAA;6BADE,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA;;;;mBAOnB,mBAQS,UAAA;KANP,MAAK;KACJ,OAAK,eAAA,CAAG,MAAA,GAAA,EAAI,EAAC,KAAA,GAAS,MAAA,GAAA,EAAI,GAAE,OAAA,MAAA,CAAA,CAAA;KAC5B,UAAQ,CAAG,MAAA,OAAA;KACX,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,YAAA,EAAY,CAAA;QAEpB,YAAiC,MAAA,WAAA,GAAA,MAAA;4BAAV,CAAd,YAAc,MAAA,UAAA,CAAA,CAAA,CAAA;;mCANf,MAAA,OAAA,CAAO,CAAA,CAAA"}
1
+ {"version":3,"file":"tabs-horizontal.js","names":[],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon> <ArrowLeft /> </u-icon>\n </button>\n\n <div ref=\"viewportRef\" :class=\"cls.e('viewport')\">\n <div ref=\"listRef\" :class=\"cls.e('list')\">\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n </div>\n\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'next')]\"\n :disabled=\"!canNext\"\n @click=\"scrollByStep(1)\"\n >\n <u-icon> <ArrowRight /> </u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { ArrowLeft, ArrowRight, Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsHorizontalEmits, TabsHorizontalProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { useTabsBar } from './use-tabs-bar'\n\ndefineOptions({ name: 'UTabsHorizontal' })\n\nconst props = withDefaults(defineProps<TabsHorizontalProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsHorizontalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst viewportRef = shallowRef<HTMLElement>()\nconst listRef = shallowRef<HTMLElement>()\n\nconst itemsRef = computed(() => props.items)\n\nconst { showNav, canPrev, canNext, scrollByStep } = useTabsBar({\n viewportRef,\n listRef,\n items: itemsRef,\n model\n})\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":"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"}
@@ -15,12 +15,12 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
15
15
  "update:modelValue": (value: string | undefined) => any;
16
16
  } & {
17
17
  "update:modelValue": (value: string) => any;
18
- close: (item: TabItem, index: number) => any;
19
18
  click: (item: TabItem, index: number) => any;
19
+ close: (item: TabItem, index: number) => any;
20
20
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
21
21
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
22
- onClose?: ((item: TabItem, index: number) => any) | undefined;
23
22
  onClick?: ((item: TabItem, index: number) => any) | undefined;
23
+ onClose?: ((item: TabItem, index: number) => any) | undefined;
24
24
  }>, {
25
25
  closable: boolean;
26
26
  position: "top" | "bottom";
@@ -6,10 +6,10 @@ import { Close } from "@veltra/icons/normal";
6
6
  //#region src/components/tabs/tabs-vertical.vue
7
7
  const _hoisted_1 = ["onClick"];
8
8
  const _hoisted_2 = ["aria-label", "onClick"];
9
- const _sfc_main = /* @__PURE__ */ defineComponent({
10
- name: "TabsVertical",
9
+ const _sfc_main = /*@__PURE__*/ defineComponent({
10
+ name: "UTabsVertical",
11
11
  __name: "tabs-vertical",
12
- props: /* @__PURE__ */ mergeModels({
12
+ props: /*@__PURE__*/ mergeModels({
13
13
  size: {},
14
14
  modelValue: {},
15
15
  items: {},
@@ -26,7 +26,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
26
26
  "modelValue": {},
27
27
  "modelModifiers": {}
28
28
  }),
29
- emits: /* @__PURE__ */ mergeModels([
29
+ emits: /*@__PURE__*/ mergeModels([
30
30
  "update:modelValue",
31
31
  "click",
32
32
  "close"
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-vertical.js","names":[],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'TabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,kBAAkB,SAAkB;GACxC,IAAI,KAAK,UAAU,OAAO;GAC1B,OAAO,KAAK,YAAY,MAAM;EAChC;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,MAAM,QAAQ,KAAK;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;;uBA1EE,mBA+BM,OAAA,EA9BH,OAAK,eAAA;IAAG,MAAA,GAAA,EAAI;IAAG,MAAA,GAAA,EAAI,EAAC,UAAA;IAAc,MAAA,GAAA,EAAI,EAAE,QAAA,QAAQ;IAAG,MAAA,GAAA,EAAI,EAAE,MAAA,IAAA,CAAI;IAAG,MAAA,GAAA,EAAI,GAAE,WAAY,QAAA,OAAO;GAAA,CAAA,EAAA,GAAA,EAAA,UAAA,IAAA,GAE1F,mBA2BS,UAAA,MAAA,WAxBiB,QAAA,QAAhB,MAAM,UAAK;wBAHrB,mBA2BS,UAAA;KA1BP,MAAK;KACL,MAAK;KAEJ,KAAK,KAAK;KACV,OAAK,eAAA;MAAY,MAAA,GAAA,EAAI,EAAC,MAAA;MAAkB,MAAA,GAAA,EAAI,GAAE,UAAW,MAAA,UAAU,KAAK,GAAG;MAAW,MAAA,GAAA,EAAI,GAAE,YAAa,KAAK,aAAQ,IAAA;;KAKtH,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;QAEpC,WAEO,KAAA,QAAA,WAFP,WAEO,EAAA,SAAA,KAAA,GAAA;KAFS;KAAM;IAAK,CAAA,SAEpB,CADL,mBAAqE,QAAA,EAA9D,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,YAAA,CAAA,EAAA,GAAA,gBAAmB,KAAK,QAAQ,KAAK,GAAG,GAAA,CAAA,CAAA,CAAA,GAGrD,eAAe,IAAI,KAAA,UAAA,GAD3B,mBAWO,QAAA;;KATL,MAAK;KACL,UAAS;KACR,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,OAAA,CAAA;KACZ,cAAU,SAAW,KAAK,QAAQ,KAAK;KACvC,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;QAEpC,YAES,MAAA,WAAA,GAAA,MAAA;4BADE,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"tabs-vertical.js","names":[],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,kBAAkB,SAAkB;GACxC,IAAI,KAAK,UAAU,OAAO;GAC1B,OAAO,KAAK,YAAY,MAAM;EAChC;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,MAAM,QAAQ,KAAK;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;;uBA1EE,mBA+BM,OAAA,EA9BH,OAAK,eAAA;IAAG,MAAA,GAAA,CAAG,CAAC;IAAG,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA;IAAc,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ;IAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI;IAAG,MAAA,GAAA,CAAG,CAAC,GAAE,WAAY,QAAA,OAAO;GAAA,CAAA,EAAA,GAAA,EAAA,UAAA,IAAA,GAE1F,mBA2BS,UAAA,MAAA,WAxBiB,QAAA,QAAhB,MAAM,UAAK;wBAHrB,mBA2BS,UAAA;KA1BP,MAAK;KACL,MAAK;KAEJ,KAAK,KAAK;KACV,OAAK,eAAA;MAAY,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;MAAkB,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,MAAA,UAAU,KAAK,GAAG;MAAW,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,KAAK,aAAQ,IAAA;;KAKtH,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;QAEpC,WAEO,KAAA,QAAA,WAFP,WAEO,EAAA,SAAA,KAAA,GAAA;KAFS;KAAM;IAAK,CAAA,SAEpB,CADL,mBAAqE,QAAA,EAA9D,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EAAA,GAAA,gBAAmB,KAAK,QAAQ,KAAK,GAAG,GAAA,CAAA,CAAA,CAAA,GAGrD,eAAe,IAAI,KAAA,UAAA,GAD3B,mBAWO,QAAA;;KATL,MAAK;KACL,UAAS;KACR,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KACZ,cAAU,SAAW,KAAK,QAAQ,KAAK;KACvC,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;QAEpC,YAES,MAAA,WAAA,GAAA,MAAA;4BADE,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
@@ -15,12 +15,12 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
15
15
  "update:modelValue": (value: string | undefined) => any;
16
16
  } & {
17
17
  "update:modelValue": (value: string) => any;
18
- close: (item: TabItem, index: number) => any;
19
18
  click: (item: TabItem, index: number) => any;
19
+ close: (item: TabItem, index: number) => any;
20
20
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
21
21
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
22
- onClose?: ((item: TabItem, index: number) => any) | undefined;
23
22
  onClick?: ((item: TabItem, index: number) => any) | undefined;
23
+ onClose?: ((item: TabItem, index: number) => any) | undefined;
24
24
  }>, {
25
25
  closable: boolean;
26
26
  position: "left" | "right";
@@ -5,10 +5,10 @@ import { KeepAlive, Transition, computed, createBlock, createElementBlock, creat
5
5
  import { useFallbackProps } from "@veltra/compositions";
6
6
  import { bem } from "@veltra/utils";
7
7
  //#region src/components/tabs/tabs.vue
8
- const _sfc_main = /* @__PURE__ */ defineComponent({
9
- name: "Tabs",
8
+ const _sfc_main = /*@__PURE__*/ defineComponent({
9
+ name: "UTabs",
10
10
  __name: "tabs",
11
- props: /* @__PURE__ */ mergeModels({
11
+ props: /*@__PURE__*/ mergeModels({
12
12
  modelValue: {},
13
13
  items: {},
14
14
  closable: {
@@ -33,7 +33,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
33
33
  "modelValue": {},
34
34
  "modelModifiers": {}
35
35
  }),
36
- emits: /* @__PURE__ */ mergeModels([
36
+ emits: /*@__PURE__*/ mergeModels([
37
37
  "update:modelValue",
38
38
  "click",
39
39
  "close"
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.js","names":[],"sources":["../../../src/components/tabs/tabs.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(position!)]\">\n <u-tabs-horizontal\n v-if=\"isHorizontal\"\n v-model=\"model\"\n :items=\"items\"\n :position=\"horizontalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :block=\"block\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n <u-tabs-vertical\n v-else\n v-model=\"model\"\n :items=\"items\"\n :position=\"verticalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n\n <transition name=\"fade\" mode=\"out-in\">\n <KeepAlive v-if=\"keepAlive\">\n <component :key=\"model\" :is=\"renderSlots()\" />\n </KeepAlive>\n <component v-else :key=\"model\" :is=\"renderSlots()\" />\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, createVNode } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsEmits, TabsProps } from '../../types'\nimport { UScroll } from '../scroll'\nimport UTabsHorizontal from './tabs-horizontal.vue'\nimport UTabsVertical from './tabs-vertical.vue'\n\ndefineOptions({ name: 'Tabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false,\n keepAlive: false\n})\n\nconst emit = defineEmits<TabsEmits>()\n\nconst slots = defineSlots<Record<string, (props: any) => any>>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs')\n\nconst model = defineModel<string>()\n\nconst isHorizontal = computed(() => props.position === 'top' || props.position === 'bottom')\n\n/** 避免模板中使用类型断言:收敛 position 到水平 / 垂直子组件所需的子集。 */\nconst horizontalPosition = computed<'top' | 'bottom'>(() =>\n props.position === 'bottom' ? 'bottom' : 'top'\n)\n\nconst verticalPosition = computed<'left' | 'right'>(() =>\n props.position === 'right' ? 'right' : 'left'\n)\n\nconst onClick = (item: TabItem, index: number) => emit('click', item, index)\nconst onClose = (item: TabItem, index: number) => emit('close', item, index)\n\nconst renderSlots = () => {\n const key = model.value\n if (!key) return null\n const nodes = slots[key]?.({ key })\n if (Array.isArray(nodes)) {\n return createVNode(UScroll, { class: cls.e('content') }, { default: () => nodes })\n }\n return nodes\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAA;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,eAAe,eAAe,MAAM,aAAa,SAAS,MAAM,aAAa,QAAQ;;EAG3F,MAAM,qBAAqB,eACzB,MAAM,aAAa,WAAW,WAAW,KAC3C;EAEA,MAAM,mBAAmB,eACvB,MAAM,aAAa,UAAU,UAAU,MACzC;EAEA,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAC3E,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAE3E,MAAM,oBAAoB;GACxB,MAAM,MAAM,MAAM;GAClB,IAAI,CAAC,KAAK,OAAO;GACjB,MAAM,QAAQ,MAAM,OAAO,EAAE,IAAI,CAAC;GAClC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,YAAY,aAAS,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,MAAM,CAAC;GAEnF,OAAO;EACT;;uBAtFE,mBA+BM,OAAA,EA/BA,OAAK,eAAA,CAAG,MAAA,GAAA,EAAI,GAAG,MAAA,GAAA,EAAI,EAAE,QAAA,QAAQ,CAAA,CAAA,EAAA,GAAA,CAEzB,aAAA,SAAA,UAAA,GADR,YAWE,aAAA;;gBATS,MAAA;iEAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,mBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,OAAO,QAAA;IACP,SAAS,QAAA;IACF;IACA;;;;;;;;;uBAEV,YAUE,aAAA;;gBARS,MAAA;iEAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,iBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,SAAS,QAAA;IACF;IACA;;;;;;;;QAGV,YAKa,YAAA;IALD,MAAK;IAAO,MAAK;;2BAGf,CAFK,QAAA,aAAA,UAAA,GAAjB,YAEY,WAAA,EAAA,KAAA,EAAA,GAAA,EAAA,UAAA,GADV,YAA8C,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,GAAA,IAAA,MAAA,UAAA,GAExB,YAAqD,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"tabs.js","names":[],"sources":["../../../src/components/tabs/tabs.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(position!)]\">\n <u-tabs-horizontal\n v-if=\"isHorizontal\"\n v-model=\"model\"\n :items=\"items\"\n :position=\"horizontalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :block=\"block\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n <u-tabs-vertical\n v-else\n v-model=\"model\"\n :items=\"items\"\n :position=\"verticalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n\n <transition name=\"fade\" mode=\"out-in\">\n <KeepAlive v-if=\"keepAlive\">\n <component :key=\"model\" :is=\"renderSlots()\" />\n </KeepAlive>\n <component v-else :key=\"model\" :is=\"renderSlots()\" />\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, createVNode } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsEmits, TabsProps } from '../../types'\nimport { UScroll } from '../scroll'\nimport UTabsHorizontal from './tabs-horizontal.vue'\nimport UTabsVertical from './tabs-vertical.vue'\n\ndefineOptions({ name: 'UTabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false,\n keepAlive: false\n})\n\nconst emit = defineEmits<TabsEmits>()\n\nconst slots = defineSlots<Record<string, (props: any) => any>>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs')\n\nconst model = defineModel<string>()\n\nconst isHorizontal = computed(() => props.position === 'top' || props.position === 'bottom')\n\n/** 避免模板中使用类型断言:收敛 position 到水平 / 垂直子组件所需的子集。 */\nconst horizontalPosition = computed<'top' | 'bottom'>(() =>\n props.position === 'bottom' ? 'bottom' : 'top'\n)\n\nconst verticalPosition = computed<'left' | 'right'>(() =>\n props.position === 'right' ? 'right' : 'left'\n)\n\nconst onClick = (item: TabItem, index: number) => emit('click', item, index)\nconst onClose = (item: TabItem, index: number) => emit('close', item, index)\n\nconst renderSlots = () => {\n const key = model.value\n if (!key) return null\n const nodes = slots[key]?.({ key })\n if (Array.isArray(nodes)) {\n return createVNode(UScroll, { class: cls.e('content') }, { default: () => nodes })\n }\n return nodes\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAA;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,eAAe,eAAe,MAAM,aAAa,SAAS,MAAM,aAAa,QAAQ;;EAG3F,MAAM,qBAAqB,eACzB,MAAM,aAAa,WAAW,WAAW,KAC3C;EAEA,MAAM,mBAAmB,eACvB,MAAM,aAAa,UAAU,UAAU,MACzC;EAEA,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAC3E,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAE3E,MAAM,oBAAoB;GACxB,MAAM,MAAM,MAAM;GAClB,IAAI,CAAC,KAAK,OAAO;GACjB,MAAM,QAAQ,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC;GAClC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,YAAY,aAAS,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,MAAM,CAAC;GAEnF,OAAO;EACT;;uBAtFE,mBA+BM,OAAA,EA/BA,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,GAAG,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ,CAAA,CAAA,EAAA,GAAA,CAEzB,aAAA,SAAA,UAAA,GADR,YAWE,aAAA;;gBATS,MAAA;iEAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,mBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,OAAO,QAAA;IACP,SAAS,QAAA;IACF;IACA;;;;;;;;;uBAEV,YAUE,aAAA;;gBARS,MAAA;iEAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,iBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,SAAS,QAAA;IACF;IACA;;;;;;;;QAGV,YAKa,YAAA;IALD,MAAK;IAAO,MAAK;;2BAGf,CAFK,QAAA,aAAA,UAAA,GAAjB,YAEY,WAAA,EAAA,KAAA,EAAA,GAAA,EAAA,UAAA,GADV,YAA8C,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,GAAA,IAAA,MAAA,UAAA,GAExB,YAAqD,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,CAAA"}
@@ -10,12 +10,12 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
10
10
  "update:modelValue": (value: string | undefined) => any;
11
11
  } & {
12
12
  "update:modelValue": (value: string) => any;
13
- close: (item: TabItem, index: number) => any;
14
13
  click: (item: TabItem, index: number) => any;
14
+ close: (item: TabItem, index: number) => any;
15
15
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
16
16
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
17
- onClose?: ((item: TabItem, index: number) => any) | undefined;
18
17
  onClick?: ((item: TabItem, index: number) => any) | undefined;
18
+ onClose?: ((item: TabItem, index: number) => any) | undefined;
19
19
  }>, {
20
20
  closable: boolean;
21
21
  position: "left" | "right" | "top" | "bottom";
@@ -4,8 +4,8 @@ import { useFormFallbackProps } from "@veltra/compositions";
4
4
  import { bem, injectFormContext } from "@veltra/utils";
5
5
  import { Close } from "@veltra/icons/normal";
6
6
  //#region src/components/tag/tag.vue
7
- const _sfc_main = /* @__PURE__ */ defineComponent({
8
- name: "Tag",
7
+ const _sfc_main = /*@__PURE__*/ defineComponent({
8
+ name: "UTag",
9
9
  __name: "tag",
10
10
  props: {
11
11
  type: {},
@@ -1 +1 @@
1
- {"version":3,"file":"tag.js","names":[],"sources":["../../../src/components/tag/tag.vue"],"sourcesContent":["<template>\n <span :class=\"className\">\n <span :class=\"cls.e('content')\">\n <slot />\n </span>\n\n <u-icon v-if=\"closable\" @click.stop=\"handleClose\" :class=\"cls.e('icon-close')\">\n <Close />\n </u-icon>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TagEmits, TagProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'Tag' })\n\nconst cls = bem('tag')\n\nconst props = defineProps<TagProps>()\n\nconst emit = defineEmits<TagEmits>()\n\nconst { formProps } = injectFormContext()\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst handleClose = () => {\n emit('close')\n}\n\nconst className = computed(() => {\n const { type } = props\n return [\n cls.b,\n cls.m(size.value),\n type && cls.m('color-' + type),\n bem.is('round', props.round),\n bem.is('dark', props.dark)\n ]\n})\n\n// const classRound = computed(() => {\n// return [bem.is('round', props.round)]\n// })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,MAAM,IAAI,KAAK;EAErB,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,SAAS,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAEnF,MAAM,oBAAoB;GACxB,KAAK,OAAO;EACd;EAEA,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,SAAS;GACjB,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,QAAQ,IAAI,EAAE,WAAW,IAAI;IAC7B,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,QAAQ,MAAM,IAAI;GAC3B;EACF,CAAC;;uBA7CC,mBAQO,QAAA,EARA,OAAK,eAAE,UAAA,KAAS,EAAA,GAAA,CACrB,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,SAAA,CAAA,EAAA,GAAA,CACjB,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,GAGI,QAAA,YAAA,UAAA,GAAd,YAES,MAAA,WAAA,GAAA;;IAFgB,SAAK,cAAO,aAAW,CAAA,MAAA,CAAA;IAAG,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,YAAA,CAAA;;2BACpD,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"tag.js","names":[],"sources":["../../../src/components/tag/tag.vue"],"sourcesContent":["<template>\n <span :class=\"className\">\n <span :class=\"cls.e('content')\">\n <slot />\n </span>\n\n <u-icon v-if=\"closable\" @click.stop=\"handleClose\" :class=\"cls.e('icon-close')\">\n <Close />\n </u-icon>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TagEmits, TagProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTag' })\n\nconst cls = bem('tag')\n\nconst props = defineProps<TagProps>()\n\nconst emit = defineEmits<TagEmits>()\n\nconst { formProps } = injectFormContext()\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst handleClose = () => {\n emit('close')\n}\n\nconst className = computed(() => {\n const { type } = props\n return [\n cls.b,\n cls.m(size.value),\n type && cls.m('color-' + type),\n bem.is('round', props.round),\n bem.is('dark', props.dark)\n ]\n})\n\n// const classRound = computed(() => {\n// return [bem.is('round', props.round)]\n// })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,MAAM,IAAI,KAAK;EAErB,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,SAAS,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAEnF,MAAM,oBAAoB;GACxB,KAAK,OAAO;EACd;EAEA,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,SAAS;GACjB,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,QAAQ,IAAI,EAAE,WAAW,IAAI;IAC7B,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,QAAQ,MAAM,IAAI;GAC3B;EACF,CAAC;;uBA7CC,mBAQO,QAAA,EARA,OAAK,eAAE,UAAA,KAAS,EAAA,GAAA,CACrB,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAA,GAAA,CACjB,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,GAGI,QAAA,YAAA,UAAA,GAAd,YAES,MAAA,WAAA,GAAA;;IAFgB,SAAK,cAAO,aAAW,CAAA,MAAA,CAAA;IAAG,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;;2BACpD,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
@@ -2,8 +2,8 @@ import NodeRender from "../node-render/node-render.js";
2
2
  import { computed, createElementBlock, createTextVNode, createVNode, defineComponent, h, normalizeClass, normalizeStyle, openBlock, unref, useSlots } from "vue";
3
3
  import { bem, getHighlightChunks, isTextNode, withUnit } from "@veltra/utils";
4
4
  //#region src/components/text/text.vue
5
- const _sfc_main = /* @__PURE__ */ defineComponent({
6
- name: "Text",
5
+ const _sfc_main = /*@__PURE__*/ defineComponent({
6
+ name: "UText",
7
7
  __name: "text",
8
8
  props: {
9
9
  as: { default: "content" },
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","names":[],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({ name: 'Text' })\n\nconst props = withDefaults(defineProps<TextProps>(), { as: 'content' })\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = { fontSize: withUnit(props.fontSize, 'px') }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,EAAE;IAAG,IAAI,GAAG,QAAQ,MAAM,IAAI;IAAG,IAAI,GAAG,UAAU,MAAM,MAAM;GAAC;EAC7F,CAAC;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAAE,UAAU,SAAS,MAAM,UAAU,IAAI,EAAE;GACxE,MAAM,EAAE,SAAS,cAAc;GAC/B,IAAI,SACF,MAAM,iBAAiB;GAEzB,IAAI,WACF,MAAM,iBAAiB;GAGzB,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,SAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,UAAU;GAC9B,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,IAAI,CAAC;GAEzD,MAAM,EAAE,cAAc;GAEtB,IAAI,CAAC,WACH,OAAO;GAGT,OAAO,UAAU,QAAQ,OAAO,aAAa;IAM3C,mBAJE,SAAS,UACT,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS,CAGnD,EAAO,SAAS,UAAU;KACxB,IAAI,MAAM,WACR,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;UAEhC,MAAM,KAAK,gBAAgB,MAAM,IAAI,CAAC;IAE1C,CAAC;IAED,OAAO;GACT,GAAG,CAAC,CAAY;EAClB;;uBAjEE,mBAEI,KAAA;IAFA,OAAK,eAAE,UAAA,KAAS;IAAG,OAAK,eAAE,MAAA,KAAK;OACjC,YAAkD,MAAA,UAAA,GAAA;IAApC,SAAS,aAAY;IAAI,KAAI"}
1
+ {"version":3,"file":"text.js","names":[],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({ name: 'UText' })\n\nconst props = withDefaults(defineProps<TextProps>(), { as: 'content' })\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = { fontSize: withUnit(props.fontSize, 'px') }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,EAAE;IAAG,IAAI,GAAG,QAAQ,MAAM,IAAI;IAAG,IAAI,GAAG,UAAU,MAAM,MAAM;GAAC;EAC7F,CAAC;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAAE,UAAU,SAAS,MAAM,UAAU,IAAI,EAAE;GACxE,MAAM,EAAE,SAAS,cAAc;GAC/B,IAAI,SACF,MAAM,iBAAiB;GAEzB,IAAI,WACF,MAAM,iBAAiB;GAGzB,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,SAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,UAAU;GAC9B,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,IAAI,CAAC;GAEzD,MAAM,EAAE,cAAc;GAEtB,IAAI,CAAC,WACH,OAAO;GAGT,OAAO,UAAU,QAAQ,OAAO,aAAa;IAM3C,mBAJE,SAAS,UACT,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS,CAGnD,CAAA,CAAO,SAAS,UAAU;KACxB,IAAI,MAAM,WACR,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;UAEhC,MAAM,KAAK,gBAAgB,MAAM,IAAI,CAAC;IAE1C,CAAC;IAED,OAAO;GACT,GAAG,CAAC,CAAY;EAClB;;uBAjEE,mBAEI,KAAA;IAFA,OAAK,eAAE,UAAA,KAAS;IAAG,OAAK,eAAE,MAAA,KAAK;OACjC,YAAkD,MAAA,UAAA,GAAA;IAApC,SAAS,aAAY;IAAI,KAAI"}
@@ -17,10 +17,10 @@ const _hoisted_2 = {
17
17
  key: 1,
18
18
  style: { "white-space": "pre-wrap" }
19
19
  };
20
- const _sfc_main = /* @__PURE__ */ defineComponent({
21
- name: "Textarea",
20
+ const _sfc_main = /*@__PURE__*/ defineComponent({
21
+ name: "UTextarea",
22
22
  __name: "textarea",
23
- props: /* @__PURE__ */ mergeModels({
23
+ props: /*@__PURE__*/ mergeModels({
24
24
  modelValue: {},
25
25
  height: {},
26
26
  placeholder: { default: "请输入" },
@@ -59,7 +59,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
59
59
  "modelValue": {},
60
60
  "modelModifiers": {}
61
61
  }),
62
- emits: /* @__PURE__ */ mergeModels([
62
+ emits: /*@__PURE__*/ mergeModels([
63
63
  "update:modelValue",
64
64
  "change",
65
65
  "focus",
@@ -1 +1 @@
1
- {"version":3,"file":"textarea.js","names":[],"sources":["../../../src/components/textarea/textarea.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n :class=\"textareaClass\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n >\n <textarea\n :class=\"cls.e('native')\"\n :placeholder=\"placeholder\"\n v-model=\"model\"\n :maxlength=\"maxlength\"\n :rows=\"rows\"\n :cols=\"cols\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @change=\"handleChange\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n ref=\"textareaRef\"\n />\n <span v-if=\"props.maxlength && props.showCount\" :class=\"cls.m('count')\">\n {{ initNum }}/{{ props.maxlength }}\n </span>\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"props.clearable && model! && hovered && !disabled && !readonly\"\n :class=\"cls.m('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n </Transition>\n </div>\n\n <span v-else style=\"white-space: pre-wrap\">\n {{ model || FORM_EMPTY_CONTENT }}\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFocus, useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, ref, shallowRef, watch } from 'vue'\n\nimport type { TextareaProps, TextareaEmits, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { calcTextareaHeight } from './utils'\n\ndefineOptions({ name: 'Textarea' })\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '请输入',\n resize: true,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n autosize: false\n})\n\nconst cls = bem('textarea')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n disabled: false,\n readonly: false\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\nconst model = defineModel<string>()\n\nconst hovered = shallowRef(false)\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n focused ? emit('focus') : emit('blur')\n})\n\nconst textareaClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('resize-none', !props.resize),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value),\n cls.m('more')\n ]\n})\n\nconst handleInput = (e: Event) => {\n const value = (e.target as HTMLTextAreaElement).value\n if (value.length > props.maxlength!) {\n // 如果输入的字符数超过了最大长度,截取字符串到最大长度\n const truncatedValue = value.slice(0, props.maxlength)\n emit('update:modelValue', truncatedValue)\n } else {\n // 如果没有超过最大长度,则正常更新模型值\n emit('update:modelValue', value)\n }\n}\n\nconst initNum = computed(() => {\n if (!props.maxlength) return 0\n return props.maxlength - (model.value?.length ?? 0)\n})\n\nconst handleClear = () => {\n model.value = ''\n emit('clear')\n}\n\nconst handleChange = (e: Event) => {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nwatch(\n [model, textareaRef],\n ([model, textareaRef]) => {\n if (!textareaRef) return\n if (!props.autosize) return\n calcTextareaHeight(textareaRef)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../../../src/components/textarea/textarea.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n :class=\"textareaClass\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n >\n <textarea\n :class=\"cls.e('native')\"\n :placeholder=\"placeholder\"\n v-model=\"model\"\n :maxlength=\"maxlength\"\n :rows=\"rows\"\n :cols=\"cols\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @change=\"handleChange\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n ref=\"textareaRef\"\n />\n <span v-if=\"props.maxlength && props.showCount\" :class=\"cls.m('count')\">\n {{ initNum }}/{{ props.maxlength }}\n </span>\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"props.clearable && model! && hovered && !disabled && !readonly\"\n :class=\"cls.m('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n </Transition>\n </div>\n\n <span v-else style=\"white-space: pre-wrap\">\n {{ model || FORM_EMPTY_CONTENT }}\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFocus, useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, ref, shallowRef, watch } from 'vue'\n\nimport type { TextareaProps, TextareaEmits, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { calcTextareaHeight } from './utils'\n\ndefineOptions({ name: 'UTextarea' })\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '请输入',\n resize: true,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n autosize: false\n})\n\nconst cls = bem('textarea')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n disabled: false,\n readonly: false\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\nconst model = defineModel<string>()\n\nconst hovered = shallowRef(false)\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n focused ? emit('focus') : emit('blur')\n})\n\nconst textareaClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('resize-none', !props.resize),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value),\n cls.m('more')\n ]\n})\n\nconst handleInput = (e: Event) => {\n const value = (e.target as HTMLTextAreaElement).value\n if (value.length > props.maxlength!) {\n // 如果输入的字符数超过了最大长度,截取字符串到最大长度\n const truncatedValue = value.slice(0, props.maxlength)\n emit('update:modelValue', truncatedValue)\n } else {\n // 如果没有超过最大长度,则正常更新模型值\n emit('update:modelValue', value)\n }\n}\n\nconst initNum = computed(() => {\n if (!props.maxlength) return 0\n return props.maxlength - (model.value?.length ?? 0)\n})\n\nconst handleClear = () => {\n model.value = ''\n emit('clear')\n}\n\nconst handleChange = (e: Event) => {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nwatch(\n [model, textareaRef],\n ([model, textareaRef]) => {\n if (!textareaRef) return\n if (!props.autosize) return\n calcTextareaHeight(textareaRef)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":"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"}
@@ -9,21 +9,21 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
9
9
  "update:modelValue": (value: string | undefined) => any;
10
10
  } & {
11
11
  "update:modelValue": (value: string) => any;
12
- change: (value: string) => any;
13
12
  clear: () => any;
13
+ change: (value: string) => any;
14
14
  focus: () => any;
15
15
  blur: () => any;
16
16
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
17
17
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
18
- onChange?: ((value: string) => any) | undefined;
19
18
  onClear?: (() => any) | undefined;
19
+ onChange?: ((value: string) => any) | undefined;
20
20
  onFocus?: (() => any) | undefined;
21
21
  onBlur?: (() => any) | undefined;
22
22
  }>, {
23
- readonly: boolean;
24
- disabled: boolean;
25
23
  placeholder: string;
26
24
  clearable: boolean;
25
+ disabled: boolean;
26
+ readonly: boolean;
27
27
  resize: boolean;
28
28
  autosize: boolean;
29
29
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -15,7 +15,7 @@ const _hoisted_2 = { style: {
15
15
  "gap": "8px"
16
16
  } };
17
17
  const _hoisted_3 = { style: { "font-size": "13px" } };
18
- const _sfc_main = /* @__PURE__ */ defineComponent({
18
+ const _sfc_main = /*@__PURE__*/ defineComponent({
19
19
  name: "UTheme",
20
20
  __name: "theme",
21
21
  props: { theme: {} },