@xihan-ui/vue 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (644) hide show
  1. package/CHANGELOG.md +1335 -0
  2. package/README.md +1 -1
  3. package/dist/components/accordion/accordion.d.ts +6 -0
  4. package/dist/components/accordion/accordion.d.ts.map +1 -1
  5. package/dist/components/accordion/accordion.js +4 -2
  6. package/dist/components/accordion/accordion.js.map +1 -1
  7. package/dist/components/alert/alert.d.ts +9 -0
  8. package/dist/components/alert/alert.d.ts.map +1 -1
  9. package/dist/components/alert/alert.js +4 -0
  10. package/dist/components/alert/alert.js.map +1 -1
  11. package/dist/components/anchor/anchor.d.ts +2 -2
  12. package/dist/components/anchor/anchor.d.ts.map +1 -1
  13. package/dist/components/anchor/anchor.js +2 -2
  14. package/dist/components/anchor/anchor.js.map +1 -1
  15. package/dist/components/anchor/use-anchor.d.ts +2 -2
  16. package/dist/components/anchor/use-anchor.js +3 -3
  17. package/dist/components/anchor/use-anchor.js.map +1 -1
  18. package/dist/components/approval/approval.d.ts +8 -1
  19. package/dist/components/approval/approval.d.ts.map +1 -1
  20. package/dist/components/approval/approval.js +10 -1
  21. package/dist/components/approval/approval.js.map +1 -1
  22. package/dist/components/avatar/avatar.d.ts +8 -0
  23. package/dist/components/avatar/avatar.d.ts.map +1 -1
  24. package/dist/components/avatar/avatar.js +3 -1
  25. package/dist/components/avatar/avatar.js.map +1 -1
  26. package/dist/components/avatar/use-avatar.d.ts.map +1 -1
  27. package/dist/components/avatar/use-avatar.js +3 -1
  28. package/dist/components/avatar/use-avatar.js.map +1 -1
  29. package/dist/components/back-top/use-back-top.d.ts.map +1 -1
  30. package/dist/components/back-top/use-back-top.js +3 -1
  31. package/dist/components/back-top/use-back-top.js.map +1 -1
  32. package/dist/components/badge/badge.d.ts +22 -0
  33. package/dist/components/badge/badge.d.ts.map +1 -1
  34. package/dist/components/badge/badge.js +11 -2
  35. package/dist/components/badge/badge.js.map +1 -1
  36. package/dist/components/breadcrumb/breadcrumb.d.ts +11 -1
  37. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
  38. package/dist/components/breadcrumb/breadcrumb.js +28 -9
  39. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  40. package/dist/components/calendar-picker/calendar-picker.d.ts +16 -0
  41. package/dist/components/calendar-picker/calendar-picker.d.ts.map +1 -1
  42. package/dist/components/calendar-picker/calendar-picker.js +4 -0
  43. package/dist/components/calendar-picker/calendar-picker.js.map +1 -1
  44. package/dist/components/calendar-range-picker/calendar-range-picker.d.ts +16 -0
  45. package/dist/components/calendar-range-picker/calendar-range-picker.d.ts.map +1 -1
  46. package/dist/components/calendar-range-picker/calendar-range-picker.js +4 -0
  47. package/dist/components/calendar-range-picker/calendar-range-picker.js.map +1 -1
  48. package/dist/components/card/card.d.ts +37 -2
  49. package/dist/components/card/card.d.ts.map +1 -1
  50. package/dist/components/card/card.js +40 -2
  51. package/dist/components/card/card.js.map +1 -1
  52. package/dist/components/carousel/carousel.d.ts +7 -1
  53. package/dist/components/carousel/carousel.d.ts.map +1 -1
  54. package/dist/components/carousel/carousel.js +1 -0
  55. package/dist/components/carousel/carousel.js.map +1 -1
  56. package/dist/components/carousel/use-carousel.d.ts.map +1 -1
  57. package/dist/components/carousel/use-carousel.js +3 -1
  58. package/dist/components/carousel/use-carousel.js.map +1 -1
  59. package/dist/components/cartesian-chart/cartesian-chart.d.ts +262 -0
  60. package/dist/components/cartesian-chart/cartesian-chart.d.ts.map +1 -0
  61. package/dist/components/cartesian-chart/cartesian-chart.js +293 -0
  62. package/dist/components/cartesian-chart/cartesian-chart.js.map +1 -0
  63. package/dist/components/cartesian-chart/context.js +15 -0
  64. package/dist/components/cartesian-chart/context.js.map +1 -0
  65. package/dist/components/cartesian-chart/use-cartesian-chart.d.ts +21 -0
  66. package/dist/components/cartesian-chart/use-cartesian-chart.d.ts.map +1 -0
  67. package/dist/components/cartesian-chart/use-cartesian-chart.js +29 -0
  68. package/dist/components/cartesian-chart/use-cartesian-chart.js.map +1 -0
  69. package/dist/components/cascader/cascader.d.ts +64 -3
  70. package/dist/components/cascader/cascader.d.ts.map +1 -1
  71. package/dist/components/cascader/cascader.js +107 -7
  72. package/dist/components/cascader/cascader.js.map +1 -1
  73. package/dist/components/cascader/context.js +10 -1
  74. package/dist/components/cascader/context.js.map +1 -1
  75. package/dist/components/cascader/use-cascader.d.ts +2 -1
  76. package/dist/components/cascader/use-cascader.d.ts.map +1 -1
  77. package/dist/components/cascader/use-cascader.js +4 -1
  78. package/dist/components/cascader/use-cascader.js.map +1 -1
  79. package/dist/components/checkbox/checkbox.js +1 -1
  80. package/dist/components/checkbox-group/checkbox-group.d.ts +24 -3
  81. package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
  82. package/dist/components/checkbox-group/checkbox-group.js +20 -3
  83. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  84. package/dist/components/citation/citation.d.ts +211 -0
  85. package/dist/components/citation/citation.d.ts.map +1 -0
  86. package/dist/components/citation/citation.js +222 -0
  87. package/dist/components/citation/citation.js.map +1 -0
  88. package/dist/components/citation/context.d.ts +11 -0
  89. package/dist/components/citation/context.d.ts.map +1 -0
  90. package/dist/components/citation/context.js +24 -0
  91. package/dist/components/citation/context.js.map +1 -0
  92. package/dist/components/citation/use-citation.d.ts +19 -0
  93. package/dist/components/citation/use-citation.d.ts.map +1 -0
  94. package/dist/components/citation/use-citation.js +51 -0
  95. package/dist/components/citation/use-citation.js.map +1 -0
  96. package/dist/components/code-view/code-view.d.ts +21 -0
  97. package/dist/components/code-view/code-view.d.ts.map +1 -1
  98. package/dist/components/code-view/code-view.js +23 -4
  99. package/dist/components/code-view/code-view.js.map +1 -1
  100. package/dist/components/collapsible/collapsible.d.ts +6 -0
  101. package/dist/components/collapsible/collapsible.d.ts.map +1 -1
  102. package/dist/components/collapsible/collapsible.js +4 -2
  103. package/dist/components/collapsible/collapsible.js.map +1 -1
  104. package/dist/components/color-field/color-field.d.ts +2 -2
  105. package/dist/components/color-field/color-field.js +1 -1
  106. package/dist/components/color-field/color-field.js.map +1 -1
  107. package/dist/components/color-picker/color-picker.d.ts +41 -3
  108. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  109. package/dist/components/color-picker/color-picker.js +33 -4
  110. package/dist/components/color-picker/color-picker.js.map +1 -1
  111. package/dist/components/color-picker/use-color-picker.d.ts +3 -1
  112. package/dist/components/color-picker/use-color-picker.d.ts.map +1 -1
  113. package/dist/components/color-picker/use-color-picker.js +8 -2
  114. package/dist/components/color-picker/use-color-picker.js.map +1 -1
  115. package/dist/components/color-slider/color-slider.d.ts +2 -2
  116. package/dist/components/color-slider/color-slider.js +1 -1
  117. package/dist/components/color-slider/color-slider.js.map +1 -1
  118. package/dist/components/combobox/combobox.d.ts +49 -4
  119. package/dist/components/combobox/combobox.d.ts.map +1 -1
  120. package/dist/components/combobox/combobox.js +73 -5
  121. package/dist/components/combobox/combobox.js.map +1 -1
  122. package/dist/components/combobox/context.js +10 -1
  123. package/dist/components/combobox/context.js.map +1 -1
  124. package/dist/components/command/command.js +2 -2
  125. package/dist/components/command/use-command.d.ts.map +1 -1
  126. package/dist/components/command/use-command.js +9 -30
  127. package/dist/components/command/use-command.js.map +1 -1
  128. package/dist/components/context-menu/context-menu.d.ts +50 -18
  129. package/dist/components/context-menu/context-menu.d.ts.map +1 -1
  130. package/dist/components/context-menu/context-menu.js +101 -47
  131. package/dist/components/context-menu/context-menu.js.map +1 -1
  132. package/dist/components/context-menu/context.js +1 -1
  133. package/dist/components/context-menu/context.js.map +1 -1
  134. package/dist/components/context-menu/use-context-menu.d.ts +1 -1
  135. package/dist/components/context-menu/use-context-menu.d.ts.map +1 -1
  136. package/dist/components/context-menu/use-context-menu.js +4 -2
  137. package/dist/components/context-menu/use-context-menu.js.map +1 -1
  138. package/dist/components/date-field/date-field.d.ts +9 -1
  139. package/dist/components/date-field/date-field.d.ts.map +1 -1
  140. package/dist/components/date-field/date-field.js +2 -0
  141. package/dist/components/date-field/date-field.js.map +1 -1
  142. package/dist/components/date-picker/date-picker.d.ts +41 -1
  143. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  144. package/dist/components/date-picker/date-picker.js +16 -3
  145. package/dist/components/date-picker/date-picker.js.map +1 -1
  146. package/dist/components/date-range-picker/date-range-picker.d.ts +77 -2
  147. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  148. package/dist/components/date-range-picker/date-range-picker.js +102 -5
  149. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  150. package/dist/components/date-range-picker/use-date-range-picker.d.ts +1 -1
  151. package/dist/components/date-range-picker/use-date-range-picker.js.map +1 -1
  152. package/dist/components/descriptions/descriptions.d.ts +38 -7
  153. package/dist/components/descriptions/descriptions.d.ts.map +1 -1
  154. package/dist/components/descriptions/descriptions.js +38 -4
  155. package/dist/components/descriptions/descriptions.js.map +1 -1
  156. package/dist/components/dialog/dialog.d.ts +16 -1
  157. package/dist/components/dialog/dialog.d.ts.map +1 -1
  158. package/dist/components/dialog/dialog.js +15 -2
  159. package/dist/components/dialog/dialog.js.map +1 -1
  160. package/dist/components/dialog/use-dialog.d.ts.map +1 -1
  161. package/dist/components/dialog/use-dialog.js +9 -27
  162. package/dist/components/dialog/use-dialog.js.map +1 -1
  163. package/dist/components/diff-view/diff-view.d.ts +22 -2
  164. package/dist/components/diff-view/diff-view.d.ts.map +1 -1
  165. package/dist/components/diff-view/diff-view.js +37 -14
  166. package/dist/components/diff-view/diff-view.js.map +1 -1
  167. package/dist/components/diff-view/use-diff-view.d.ts +7 -2
  168. package/dist/components/diff-view/use-diff-view.d.ts.map +1 -1
  169. package/dist/components/diff-view/use-diff-view.js +12 -5
  170. package/dist/components/diff-view/use-diff-view.js.map +1 -1
  171. package/dist/components/drawer/drawer.d.ts +46 -1
  172. package/dist/components/drawer/drawer.d.ts.map +1 -1
  173. package/dist/components/drawer/drawer.js +28 -4
  174. package/dist/components/drawer/drawer.js.map +1 -1
  175. package/dist/components/drawer/use-drawer.d.ts +1 -1
  176. package/dist/components/drawer/use-drawer.d.ts.map +1 -1
  177. package/dist/components/drawer/use-drawer.js +12 -29
  178. package/dist/components/drawer/use-drawer.js.map +1 -1
  179. package/dist/components/empty-state/empty-state.js +4 -1
  180. package/dist/components/empty-state/empty-state.js.map +1 -1
  181. package/dist/components/empty-state/use-empty-state.js +12 -3
  182. package/dist/components/empty-state/use-empty-state.js.map +1 -1
  183. package/dist/components/field/field.js +1 -1
  184. package/dist/components/field-array/field-array.d.ts +1 -1
  185. package/dist/components/field-array/field-array.d.ts.map +1 -1
  186. package/dist/components/field-array/field-array.js +5 -1
  187. package/dist/components/field-array/field-array.js.map +1 -1
  188. package/dist/components/field-array/use-field-array.d.ts +3 -1
  189. package/dist/components/field-array/use-field-array.d.ts.map +1 -1
  190. package/dist/components/field-array/use-field-array.js +5 -2
  191. package/dist/components/field-array/use-field-array.js.map +1 -1
  192. package/dist/components/file-upload/file-upload.d.ts +24 -1
  193. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  194. package/dist/components/file-upload/file-upload.js +12 -2
  195. package/dist/components/file-upload/file-upload.js.map +1 -1
  196. package/dist/components/file-upload/use-file-upload.d.ts +1 -1
  197. package/dist/components/file-upload/use-file-upload.d.ts.map +1 -1
  198. package/dist/components/file-upload/use-file-upload.js.map +1 -1
  199. package/dist/components/flex/flex.d.ts +1 -1
  200. package/dist/components/flex/flex.d.ts.map +1 -1
  201. package/dist/components/flex/flex.js +4 -4
  202. package/dist/components/flex/flex.js.map +1 -1
  203. package/dist/components/form/form.d.ts +18 -4
  204. package/dist/components/form/form.d.ts.map +1 -1
  205. package/dist/components/form/form.js +21 -7
  206. package/dist/components/form/form.js.map +1 -1
  207. package/dist/components/form/use-form.d.ts +6 -0
  208. package/dist/components/form/use-form.d.ts.map +1 -1
  209. package/dist/components/form/use-form.js +4 -0
  210. package/dist/components/form/use-form.js.map +1 -1
  211. package/dist/components/funnel-chart/context.js +15 -0
  212. package/dist/components/funnel-chart/context.js.map +1 -0
  213. package/dist/components/funnel-chart/funnel-chart.d.ts +175 -0
  214. package/dist/components/funnel-chart/funnel-chart.d.ts.map +1 -0
  215. package/dist/components/funnel-chart/funnel-chart.js +188 -0
  216. package/dist/components/funnel-chart/funnel-chart.js.map +1 -0
  217. package/dist/components/funnel-chart/use-funnel-chart.d.ts +19 -0
  218. package/dist/components/funnel-chart/use-funnel-chart.d.ts.map +1 -0
  219. package/dist/components/funnel-chart/use-funnel-chart.js +26 -0
  220. package/dist/components/funnel-chart/use-funnel-chart.js.map +1 -0
  221. package/dist/components/graph-chart/context.js +15 -0
  222. package/dist/components/graph-chart/context.js.map +1 -0
  223. package/dist/components/graph-chart/graph-chart.d.ts +194 -0
  224. package/dist/components/graph-chart/graph-chart.d.ts.map +1 -0
  225. package/dist/components/graph-chart/graph-chart.js +219 -0
  226. package/dist/components/graph-chart/graph-chart.js.map +1 -0
  227. package/dist/components/graph-chart/use-graph-chart.d.ts +19 -0
  228. package/dist/components/graph-chart/use-graph-chart.d.ts.map +1 -0
  229. package/dist/components/graph-chart/use-graph-chart.js +26 -0
  230. package/dist/components/graph-chart/use-graph-chart.js.map +1 -0
  231. package/dist/components/grid/grid.d.ts +7 -0
  232. package/dist/components/grid/grid.d.ts.map +1 -1
  233. package/dist/components/grid/grid.js +7 -1
  234. package/dist/components/grid/grid.js.map +1 -1
  235. package/dist/components/grid-list/context.d.ts +9 -0
  236. package/dist/components/grid-list/context.d.ts.map +1 -0
  237. package/dist/components/grid-list/context.js +24 -0
  238. package/dist/components/grid-list/context.js.map +1 -0
  239. package/dist/components/grid-list/grid-list.d.ts +149 -0
  240. package/dist/components/grid-list/grid-list.d.ts.map +1 -0
  241. package/dist/components/grid-list/grid-list.js +118 -0
  242. package/dist/components/grid-list/grid-list.js.map +1 -0
  243. package/dist/components/grid-list/use-grid-list.d.ts +12 -0
  244. package/dist/components/grid-list/use-grid-list.d.ts.map +1 -0
  245. package/dist/components/grid-list/use-grid-list.js +20 -0
  246. package/dist/components/grid-list/use-grid-list.js.map +1 -0
  247. package/dist/components/heatmap/heatmap.d.ts +45 -4
  248. package/dist/components/heatmap/heatmap.d.ts.map +1 -1
  249. package/dist/components/heatmap/heatmap.js +40 -14
  250. package/dist/components/heatmap/heatmap.js.map +1 -1
  251. package/dist/components/heatmap/use-heatmap.d.ts +4 -2
  252. package/dist/components/heatmap/use-heatmap.d.ts.map +1 -1
  253. package/dist/components/heatmap/use-heatmap.js +8 -4
  254. package/dist/components/heatmap/use-heatmap.js.map +1 -1
  255. package/dist/components/hierarchy-chart/context.js +15 -0
  256. package/dist/components/hierarchy-chart/context.js.map +1 -0
  257. package/dist/components/hierarchy-chart/hierarchy-chart.d.ts +201 -0
  258. package/dist/components/hierarchy-chart/hierarchy-chart.d.ts.map +1 -0
  259. package/dist/components/hierarchy-chart/hierarchy-chart.js +228 -0
  260. package/dist/components/hierarchy-chart/hierarchy-chart.js.map +1 -0
  261. package/dist/components/hierarchy-chart/use-hierarchy-chart.d.ts +19 -0
  262. package/dist/components/hierarchy-chart/use-hierarchy-chart.d.ts.map +1 -0
  263. package/dist/components/hierarchy-chart/use-hierarchy-chart.js +26 -0
  264. package/dist/components/hierarchy-chart/use-hierarchy-chart.js.map +1 -0
  265. package/dist/components/hover-card/hover-card.js +2 -2
  266. package/dist/components/icon/icon.d.ts +7 -1
  267. package/dist/components/icon/icon.d.ts.map +1 -1
  268. package/dist/components/icon/icon.js +1 -0
  269. package/dist/components/icon/icon.js.map +1 -1
  270. package/dist/components/image/use-image.d.ts.map +1 -1
  271. package/dist/components/image/use-image.js +3 -1
  272. package/dist/components/image/use-image.js.map +1 -1
  273. package/dist/components/image-cropper/image-cropper.d.ts +35 -4
  274. package/dist/components/image-cropper/image-cropper.d.ts.map +1 -1
  275. package/dist/components/image-cropper/image-cropper.js +34 -5
  276. package/dist/components/image-cropper/image-cropper.js.map +1 -1
  277. package/dist/components/image-cropper/use-image-cropper.d.ts +3 -1
  278. package/dist/components/image-cropper/use-image-cropper.d.ts.map +1 -1
  279. package/dist/components/image-cropper/use-image-cropper.js +4 -1
  280. package/dist/components/image-cropper/use-image-cropper.js.map +1 -1
  281. package/dist/components/image-viewer/image-viewer.js +1 -1
  282. package/dist/components/image-viewer/use-image-viewer.d.ts.map +1 -1
  283. package/dist/components/image-viewer/use-image-viewer.js +9 -27
  284. package/dist/components/image-viewer/use-image-viewer.js.map +1 -1
  285. package/dist/components/infinite-scroll/infinite-scroll.d.ts +9 -1
  286. package/dist/components/infinite-scroll/infinite-scroll.d.ts.map +1 -1
  287. package/dist/components/infinite-scroll/infinite-scroll.js +2 -0
  288. package/dist/components/infinite-scroll/infinite-scroll.js.map +1 -1
  289. package/dist/components/json-viewer/json-viewer.d.ts +17 -2
  290. package/dist/components/json-viewer/json-viewer.d.ts.map +1 -1
  291. package/dist/components/json-viewer/json-viewer.js +26 -8
  292. package/dist/components/json-viewer/json-viewer.js.map +1 -1
  293. package/dist/components/listbox/listbox.d.ts +7 -1
  294. package/dist/components/listbox/listbox.d.ts.map +1 -1
  295. package/dist/components/listbox/listbox.js +2 -0
  296. package/dist/components/listbox/listbox.js.map +1 -1
  297. package/dist/components/loading-bar/use-loading-bar.d.ts.map +1 -1
  298. package/dist/components/loading-bar/use-loading-bar.js +3 -1
  299. package/dist/components/loading-bar/use-loading-bar.js.map +1 -1
  300. package/dist/components/log/log.d.ts +41 -2
  301. package/dist/components/log/log.d.ts.map +1 -1
  302. package/dist/components/log/log.js +25 -3
  303. package/dist/components/log/log.js.map +1 -1
  304. package/dist/components/log/use-log.d.ts +1 -1
  305. package/dist/components/log/use-log.d.ts.map +1 -1
  306. package/dist/components/log/use-log.js +4 -1
  307. package/dist/components/log/use-log.js.map +1 -1
  308. package/dist/components/markdown-stream/markdown-stream.d.ts +22 -2
  309. package/dist/components/markdown-stream/markdown-stream.d.ts.map +1 -1
  310. package/dist/components/markdown-stream/markdown-stream.js +43 -4
  311. package/dist/components/markdown-stream/markdown-stream.js.map +1 -1
  312. package/dist/components/marquee/marquee.d.ts +68 -12
  313. package/dist/components/marquee/marquee.d.ts.map +1 -1
  314. package/dist/components/marquee/marquee.js +52 -7
  315. package/dist/components/marquee/marquee.js.map +1 -1
  316. package/dist/components/mention/mention.d.ts +26 -6
  317. package/dist/components/mention/mention.d.ts.map +1 -1
  318. package/dist/components/mention/mention.js +14 -4
  319. package/dist/components/mention/mention.js.map +1 -1
  320. package/dist/components/menu/context.js +1 -1
  321. package/dist/components/menu/context.js.map +1 -1
  322. package/dist/components/menu/menu.d.ts +79 -28
  323. package/dist/components/menu/menu.d.ts.map +1 -1
  324. package/dist/components/menu/menu.js +104 -51
  325. package/dist/components/menu/menu.js.map +1 -1
  326. package/dist/components/menu/use-menu.d.ts +1 -1
  327. package/dist/components/menu/use-menu.d.ts.map +1 -1
  328. package/dist/components/menu/use-menu.js +8 -6
  329. package/dist/components/menu/use-menu.js.map +1 -1
  330. package/dist/components/menubar/context.js +1 -1
  331. package/dist/components/menubar/context.js.map +1 -1
  332. package/dist/components/menubar/menubar.d.ts +39 -18
  333. package/dist/components/menubar/menubar.d.ts.map +1 -1
  334. package/dist/components/menubar/menubar.js +96 -47
  335. package/dist/components/menubar/menubar.js.map +1 -1
  336. package/dist/components/menubar/use-menubar.d.ts +1 -1
  337. package/dist/components/menubar/use-menubar.d.ts.map +1 -1
  338. package/dist/components/menubar/use-menubar.js +4 -2
  339. package/dist/components/menubar/use-menubar.js.map +1 -1
  340. package/dist/components/message-feed/message-feed.d.ts +13 -1
  341. package/dist/components/message-feed/message-feed.d.ts.map +1 -1
  342. package/dist/components/message-feed/message-feed.js +25 -1
  343. package/dist/components/message-feed/message-feed.js.map +1 -1
  344. package/dist/components/navigation-menu/navigation-menu.d.ts +58 -1
  345. package/dist/components/navigation-menu/navigation-menu.d.ts.map +1 -1
  346. package/dist/components/navigation-menu/navigation-menu.js +82 -10
  347. package/dist/components/navigation-menu/navigation-menu.js.map +1 -1
  348. package/dist/components/notification/context.d.ts +5 -1
  349. package/dist/components/notification/context.d.ts.map +1 -1
  350. package/dist/components/notification/context.js.map +1 -1
  351. package/dist/components/notification/notification.d.ts +39 -23
  352. package/dist/components/notification/notification.d.ts.map +1 -1
  353. package/dist/components/notification/notification.js +27 -9
  354. package/dist/components/notification/notification.js.map +1 -1
  355. package/dist/components/notification/use-item-exit.js +22 -0
  356. package/dist/components/notification/use-item-exit.js.map +1 -0
  357. package/dist/components/notification/use-notification.d.ts +3 -3
  358. package/dist/components/notification/use-notification.d.ts.map +1 -1
  359. package/dist/components/notification/use-notification.js +20 -5
  360. package/dist/components/notification/use-notification.js.map +1 -1
  361. package/dist/components/number-animation/number-animation.d.ts +14 -2
  362. package/dist/components/number-animation/number-animation.d.ts.map +1 -1
  363. package/dist/components/number-animation/number-animation.js +5 -1
  364. package/dist/components/number-animation/number-animation.js.map +1 -1
  365. package/dist/components/number-field/number-field.d.ts +16 -1
  366. package/dist/components/number-field/number-field.d.ts.map +1 -1
  367. package/dist/components/number-field/number-field.js +6 -0
  368. package/dist/components/number-field/number-field.js.map +1 -1
  369. package/dist/components/pagination/pagination.d.ts +22 -2
  370. package/dist/components/pagination/pagination.d.ts.map +1 -1
  371. package/dist/components/pagination/pagination.js +22 -1
  372. package/dist/components/pagination/pagination.js.map +1 -1
  373. package/dist/components/pagination/use-pagination.js +1 -0
  374. package/dist/components/pagination/use-pagination.js.map +1 -1
  375. package/dist/components/pie-chart/context.js +15 -0
  376. package/dist/components/pie-chart/context.js.map +1 -0
  377. package/dist/components/pie-chart/pie-chart.d.ts +203 -0
  378. package/dist/components/pie-chart/pie-chart.d.ts.map +1 -0
  379. package/dist/components/pie-chart/pie-chart.js +236 -0
  380. package/dist/components/pie-chart/pie-chart.js.map +1 -0
  381. package/dist/components/pie-chart/use-pie-chart.d.ts +19 -0
  382. package/dist/components/pie-chart/use-pie-chart.d.ts.map +1 -0
  383. package/dist/components/pie-chart/use-pie-chart.js +26 -0
  384. package/dist/components/pie-chart/use-pie-chart.js.map +1 -0
  385. package/dist/components/popconfirm/popconfirm.js +2 -2
  386. package/dist/components/popover/popover.d.ts +11 -0
  387. package/dist/components/popover/popover.d.ts.map +1 -1
  388. package/dist/components/popover/popover.js +7 -2
  389. package/dist/components/popover/popover.js.map +1 -1
  390. package/dist/components/progress/progress.d.ts +63 -3
  391. package/dist/components/progress/progress.d.ts.map +1 -1
  392. package/dist/components/progress/progress.js +55 -3
  393. package/dist/components/progress/progress.js.map +1 -1
  394. package/dist/components/question-flow/question-flow.d.ts +40 -1
  395. package/dist/components/question-flow/question-flow.d.ts.map +1 -1
  396. package/dist/components/question-flow/question-flow.js +37 -1
  397. package/dist/components/question-flow/question-flow.js.map +1 -1
  398. package/dist/components/radar-chart/context.js +15 -0
  399. package/dist/components/radar-chart/context.js.map +1 -0
  400. package/dist/components/radar-chart/radar-chart.d.ts +189 -0
  401. package/dist/components/radar-chart/radar-chart.d.ts.map +1 -0
  402. package/dist/components/radar-chart/radar-chart.js +220 -0
  403. package/dist/components/radar-chart/radar-chart.js.map +1 -0
  404. package/dist/components/radar-chart/use-radar-chart.d.ts +19 -0
  405. package/dist/components/radar-chart/use-radar-chart.d.ts.map +1 -0
  406. package/dist/components/radar-chart/use-radar-chart.js +26 -0
  407. package/dist/components/radar-chart/use-radar-chart.js.map +1 -0
  408. package/dist/components/radio-group/radio-group.d.ts +37 -2
  409. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  410. package/dist/components/radio-group/radio-group.js +54 -8
  411. package/dist/components/radio-group/radio-group.js.map +1 -1
  412. package/dist/components/radio-group/use-radio-group.d.ts +3 -1
  413. package/dist/components/radio-group/use-radio-group.d.ts.map +1 -1
  414. package/dist/components/radio-group/use-radio-group.js +7 -3
  415. package/dist/components/radio-group/use-radio-group.js.map +1 -1
  416. package/dist/components/reasoning/reasoning.d.ts +1 -1
  417. package/dist/components/reasoning/reasoning.d.ts.map +1 -1
  418. package/dist/components/reasoning/reasoning.js +1 -0
  419. package/dist/components/reasoning/reasoning.js.map +1 -1
  420. package/dist/components/sankey-chart/context.js +15 -0
  421. package/dist/components/sankey-chart/context.js.map +1 -0
  422. package/dist/components/sankey-chart/sankey-chart.d.ts +161 -0
  423. package/dist/components/sankey-chart/sankey-chart.d.ts.map +1 -0
  424. package/dist/components/sankey-chart/sankey-chart.js +208 -0
  425. package/dist/components/sankey-chart/sankey-chart.js.map +1 -0
  426. package/dist/components/sankey-chart/use-sankey-chart.d.ts +19 -0
  427. package/dist/components/sankey-chart/use-sankey-chart.d.ts.map +1 -0
  428. package/dist/components/sankey-chart/use-sankey-chart.js +26 -0
  429. package/dist/components/sankey-chart/use-sankey-chart.js.map +1 -0
  430. package/dist/components/scroll-area/scroll-area.d.ts +13 -5
  431. package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
  432. package/dist/components/scroll-area/scroll-area.js +17 -3
  433. package/dist/components/scroll-area/scroll-area.js.map +1 -1
  434. package/dist/components/select/select.d.ts +7 -1
  435. package/dist/components/select/select.d.ts.map +1 -1
  436. package/dist/components/select/select.js +13 -4
  437. package/dist/components/select/select.js.map +1 -1
  438. package/dist/components/select/use-select.js +2 -1
  439. package/dist/components/select/use-select.js.map +1 -1
  440. package/dist/components/side-nav/context.js +17 -1
  441. package/dist/components/side-nav/context.js.map +1 -1
  442. package/dist/components/side-nav/side-nav.d.ts +51 -7
  443. package/dist/components/side-nav/side-nav.d.ts.map +1 -1
  444. package/dist/components/side-nav/side-nav.js +152 -13
  445. package/dist/components/side-nav/side-nav.js.map +1 -1
  446. package/dist/components/side-nav/use-side-nav.d.ts +4 -2
  447. package/dist/components/side-nav/use-side-nav.d.ts.map +1 -1
  448. package/dist/components/side-nav/use-side-nav.js +5 -3
  449. package/dist/components/side-nav/use-side-nav.js.map +1 -1
  450. package/dist/components/signature-pad/signature-pad.d.ts +26 -4
  451. package/dist/components/signature-pad/signature-pad.d.ts.map +1 -1
  452. package/dist/components/signature-pad/signature-pad.js +32 -4
  453. package/dist/components/signature-pad/signature-pad.js.map +1 -1
  454. package/dist/components/signature-pad/use-signature-pad.d.ts +1 -1
  455. package/dist/components/signature-pad/use-signature-pad.d.ts.map +1 -1
  456. package/dist/components/signature-pad/use-signature-pad.js.map +1 -1
  457. package/dist/components/skeleton/use-skeleton.js +6 -2
  458. package/dist/components/skeleton/use-skeleton.js.map +1 -1
  459. package/dist/components/slider/slider.d.ts +27 -0
  460. package/dist/components/slider/slider.d.ts.map +1 -1
  461. package/dist/components/slider/slider.js +12 -0
  462. package/dist/components/slider/slider.js.map +1 -1
  463. package/dist/components/sortable/sortable.d.ts +19 -1
  464. package/dist/components/sortable/sortable.d.ts.map +1 -1
  465. package/dist/components/sortable/sortable.js +7 -2
  466. package/dist/components/sortable/sortable.js.map +1 -1
  467. package/dist/components/sortable/use-sortable.d.ts +1 -1
  468. package/dist/components/sortable/use-sortable.d.ts.map +1 -1
  469. package/dist/components/sortable/use-sortable.js +2 -1
  470. package/dist/components/sortable/use-sortable.js.map +1 -1
  471. package/dist/components/sparkline/sparkline.d.ts +101 -0
  472. package/dist/components/sparkline/sparkline.d.ts.map +1 -0
  473. package/dist/components/sparkline/sparkline.js +54 -0
  474. package/dist/components/sparkline/sparkline.js.map +1 -0
  475. package/dist/components/sparkline/use-sparkline.d.ts +15 -0
  476. package/dist/components/sparkline/use-sparkline.d.ts.map +1 -0
  477. package/dist/components/sparkline/use-sparkline.js +21 -0
  478. package/dist/components/sparkline/use-sparkline.js.map +1 -0
  479. package/dist/components/spinner/spinner.d.ts +8 -0
  480. package/dist/components/spinner/spinner.d.ts.map +1 -1
  481. package/dist/components/spinner/spinner.js +2 -0
  482. package/dist/components/spinner/spinner.js.map +1 -1
  483. package/dist/components/spinner/use-spinner.js +4 -2
  484. package/dist/components/spinner/use-spinner.js.map +1 -1
  485. package/dist/components/steps/steps.d.ts +28 -1
  486. package/dist/components/steps/steps.d.ts.map +1 -1
  487. package/dist/components/steps/steps.js +11 -2
  488. package/dist/components/steps/steps.js.map +1 -1
  489. package/dist/components/switch/switch.js +1 -1
  490. package/dist/components/table/context.js +9 -1
  491. package/dist/components/table/context.js.map +1 -1
  492. package/dist/components/table/table.d.ts +54 -5
  493. package/dist/components/table/table.d.ts.map +1 -1
  494. package/dist/components/table/table.js +40 -11
  495. package/dist/components/table/table.js.map +1 -1
  496. package/dist/components/table/use-table.d.ts +3 -1
  497. package/dist/components/table/use-table.d.ts.map +1 -1
  498. package/dist/components/table/use-table.js +5 -2
  499. package/dist/components/table/use-table.js.map +1 -1
  500. package/dist/components/tabs/tabs.d.ts +51 -3
  501. package/dist/components/tabs/tabs.d.ts.map +1 -1
  502. package/dist/components/tabs/tabs.js +60 -8
  503. package/dist/components/tabs/tabs.js.map +1 -1
  504. package/dist/components/tag/use-tag.d.ts.map +1 -1
  505. package/dist/components/tag/use-tag.js +3 -1
  506. package/dist/components/tag/use-tag.js.map +1 -1
  507. package/dist/components/tags-input/tags-input.d.ts +10 -2
  508. package/dist/components/tags-input/tags-input.d.ts.map +1 -1
  509. package/dist/components/tags-input/tags-input.js +11 -4
  510. package/dist/components/tags-input/tags-input.js.map +1 -1
  511. package/dist/components/tags-input/use-tags-input.d.ts +4 -2
  512. package/dist/components/tags-input/use-tags-input.d.ts.map +1 -1
  513. package/dist/components/tags-input/use-tags-input.js +5 -2
  514. package/dist/components/tags-input/use-tags-input.js.map +1 -1
  515. package/dist/components/time-picker/time-picker.d.ts +11 -7
  516. package/dist/components/time-picker/time-picker.d.ts.map +1 -1
  517. package/dist/components/time-picker/time-picker.js +4 -2
  518. package/dist/components/time-picker/time-picker.js.map +1 -1
  519. package/dist/components/time-range-picker/time-range-picker.d.ts +11 -7
  520. package/dist/components/time-range-picker/time-range-picker.d.ts.map +1 -1
  521. package/dist/components/time-range-picker/time-range-picker.js +4 -2
  522. package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
  523. package/dist/components/timer/timer.d.ts +1 -1
  524. package/dist/components/timestamp/timestamp.d.ts +20 -1
  525. package/dist/components/timestamp/timestamp.d.ts.map +1 -1
  526. package/dist/components/timestamp/timestamp.js +16 -5
  527. package/dist/components/timestamp/timestamp.js.map +1 -1
  528. package/dist/components/toolbar/toolbar.d.ts +17 -2
  529. package/dist/components/toolbar/toolbar.d.ts.map +1 -1
  530. package/dist/components/toolbar/toolbar.js +31 -4
  531. package/dist/components/toolbar/toolbar.js.map +1 -1
  532. package/dist/components/toolbar/use-toolbar.d.ts +4 -2
  533. package/dist/components/toolbar/use-toolbar.d.ts.map +1 -1
  534. package/dist/components/toolbar/use-toolbar.js +5 -2
  535. package/dist/components/toolbar/use-toolbar.js.map +1 -1
  536. package/dist/components/tooltip/context.d.ts +21 -0
  537. package/dist/components/tooltip/context.d.ts.map +1 -0
  538. package/dist/components/tooltip/context.js +10 -1
  539. package/dist/components/tooltip/context.js.map +1 -1
  540. package/dist/components/tooltip/tooltip.d.ts +53 -1
  541. package/dist/components/tooltip/tooltip.d.ts.map +1 -1
  542. package/dist/components/tooltip/tooltip.js +34 -3
  543. package/dist/components/tooltip/tooltip.js.map +1 -1
  544. package/dist/components/tooltip/use-tooltip.d.ts +3 -18
  545. package/dist/components/tooltip/use-tooltip.d.ts.map +1 -1
  546. package/dist/components/tooltip/use-tooltip.js +2 -0
  547. package/dist/components/tooltip/use-tooltip.js.map +1 -1
  548. package/dist/components/tour/tour.d.ts +9 -1
  549. package/dist/components/tour/tour.d.ts.map +1 -1
  550. package/dist/components/tour/tour.js +2 -0
  551. package/dist/components/tour/tour.js.map +1 -1
  552. package/dist/components/transfer/transfer.d.ts +21 -1
  553. package/dist/components/transfer/transfer.d.ts.map +1 -1
  554. package/dist/components/transfer/transfer.js +10 -2
  555. package/dist/components/transfer/transfer.js.map +1 -1
  556. package/dist/components/tree/tree.d.ts +34 -1
  557. package/dist/components/tree/tree.d.ts.map +1 -1
  558. package/dist/components/tree/tree.js +11 -0
  559. package/dist/components/tree/tree.js.map +1 -1
  560. package/dist/components/tree-select/context.js +10 -1
  561. package/dist/components/tree-select/context.js.map +1 -1
  562. package/dist/components/tree-select/tree-select.d.ts +70 -6
  563. package/dist/components/tree-select/tree-select.d.ts.map +1 -1
  564. package/dist/components/tree-select/tree-select.js +109 -12
  565. package/dist/components/tree-select/tree-select.js.map +1 -1
  566. package/dist/components/tree-select/use-tree-select.d.ts +3 -0
  567. package/dist/components/tree-select/use-tree-select.d.ts.map +1 -1
  568. package/dist/components/tree-select/use-tree-select.js +6 -1
  569. package/dist/components/tree-select/use-tree-select.js.map +1 -1
  570. package/dist/components/truncate/truncate.d.ts +25 -4
  571. package/dist/components/truncate/truncate.d.ts.map +1 -1
  572. package/dist/components/truncate/truncate.js +29 -14
  573. package/dist/components/truncate/truncate.js.map +1 -1
  574. package/dist/components/truncate/use-truncate.d.ts.map +1 -1
  575. package/dist/components/truncate/use-truncate.js +3 -1
  576. package/dist/components/truncate/use-truncate.js.map +1 -1
  577. package/dist/components/typography/typography.d.ts +35 -2
  578. package/dist/components/typography/typography.d.ts.map +1 -1
  579. package/dist/components/typography/typography.js +21 -3
  580. package/dist/components/typography/typography.js.map +1 -1
  581. package/dist/components/virtualizer/virtualizer.d.ts +26 -2
  582. package/dist/components/virtualizer/virtualizer.d.ts.map +1 -1
  583. package/dist/components/virtualizer/virtualizer.js +20 -3
  584. package/dist/components/virtualizer/virtualizer.js.map +1 -1
  585. package/dist/components/watermark/watermark.d.ts +14 -1
  586. package/dist/components/watermark/watermark.d.ts.map +1 -1
  587. package/dist/components/watermark/watermark.js +20 -5
  588. package/dist/components/watermark/watermark.js.map +1 -1
  589. package/dist/config/config.d.ts +1 -1
  590. package/dist/config/config.d.ts.map +1 -1
  591. package/dist/config/config.js +2 -1
  592. package/dist/config/config.js.map +1 -1
  593. package/dist/index.d.ts +59 -44
  594. package/dist/index.js +53 -38
  595. package/dist/package.js +1 -1
  596. package/dist/runtime/as-child.js +3 -2
  597. package/dist/runtime/as-child.js.map +1 -1
  598. package/dist/runtime/hydration.js +14 -0
  599. package/dist/runtime/hydration.js.map +1 -0
  600. package/dist/runtime/use-overlay-exit.js +0 -1
  601. package/dist/runtime/use-overlay-exit.js.map +1 -1
  602. package/dist/services/notification-service.d.ts +26 -7
  603. package/dist/services/notification-service.d.ts.map +1 -1
  604. package/dist/services/notification-service.js +35 -8
  605. package/dist/services/notification-service.js.map +1 -1
  606. package/dist/sound.d.ts +6 -7
  607. package/dist/sound.d.ts.map +1 -1
  608. package/dist/sound.js +6 -6
  609. package/dist/sound.js.map +1 -1
  610. package/package.json +15 -14
  611. package/dist/components/gradient-text/gradient-text.d.ts +0 -36
  612. package/dist/components/gradient-text/gradient-text.d.ts.map +0 -1
  613. package/dist/components/gradient-text/gradient-text.js +0 -20
  614. package/dist/components/gradient-text/gradient-text.js.map +0 -1
  615. package/dist/components/icon-wrapper/icon-wrapper.d.ts +0 -29
  616. package/dist/components/icon-wrapper/icon-wrapper.d.ts.map +0 -1
  617. package/dist/components/icon-wrapper/icon-wrapper.js +0 -20
  618. package/dist/components/icon-wrapper/icon-wrapper.js.map +0 -1
  619. package/dist/components/segmented/context.d.ts +0 -13
  620. package/dist/components/segmented/context.d.ts.map +0 -1
  621. package/dist/components/segmented/context.js +0 -24
  622. package/dist/components/segmented/context.js.map +0 -1
  623. package/dist/components/segmented/segmented.d.ts +0 -161
  624. package/dist/components/segmented/segmented.d.ts.map +0 -1
  625. package/dist/components/segmented/segmented.js +0 -142
  626. package/dist/components/segmented/segmented.js.map +0 -1
  627. package/dist/components/segmented/use-segmented.d.ts +0 -15
  628. package/dist/components/segmented/use-segmented.d.ts.map +0 -1
  629. package/dist/components/segmented/use-segmented.js +0 -22
  630. package/dist/components/segmented/use-segmented.js.map +0 -1
  631. package/dist/components/toast/context.js +0 -15
  632. package/dist/components/toast/context.js.map +0 -1
  633. package/dist/components/toast/toast.d.ts +0 -123
  634. package/dist/components/toast/toast.d.ts.map +0 -1
  635. package/dist/components/toast/toast.js +0 -112
  636. package/dist/components/toast/toast.js.map +0 -1
  637. package/dist/components/toast/use-toast.d.ts +0 -10
  638. package/dist/components/toast/use-toast.d.ts.map +0 -1
  639. package/dist/components/toast/use-toast.js +0 -17
  640. package/dist/components/toast/use-toast.js.map +0 -1
  641. package/dist/services/toast-service.d.ts +0 -69
  642. package/dist/services/toast-service.d.ts.map +0 -1
  643. package/dist/services/toast-service.js +0 -161
  644. package/dist/services/toast-service.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"field-array.js","names":[],"sources":["../../../src/components/field-array/field-array.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 field array 相关实现。\n\nimport type { FieldArrayApi, FieldArrayItemProps, FieldArraySchema, FieldArrayTranslations, FormPath } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useOptionalFormContext } from '../form/context'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideFieldArray, provideFieldArrayItem, useFieldArrayContext, useFieldArrayItemContext } from './context'\nimport { useFieldArray } from './use-field-array'\n\ntype FieldArrayProps = FieldArraySchema['props']\n\n/** 默认插槽的载荷:逐行投影与整份值、行数与上下限状态,以及整份替换、增删、移动的动作。 */\nexport type FieldArrayRootSlotProps = Pick<\n FieldArrayApi,\n | 'items'\n | 'value'\n | 'count'\n | 'empty'\n | 'atMin'\n | 'atMax'\n | 'canAdd'\n | 'setValue'\n | 'add'\n | 'remove'\n | 'move'\n | 'moveUp'\n | 'moveDown'\n>\n\nexport const XhFieldArrayRoot = defineComponent({\n name: 'XhFieldArrayRoot',\n // 有 connect 与机器兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: Array as PropType<unknown[]> },\n defaultValue: { type: Array as PropType<unknown[]> },\n min: { type: Number },\n max: { type: Number },\n createItem: { type: Function as PropType<() => unknown> },\n movable: Boolean,\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: [String, Array] as PropType<FormPath> },\n translations: { type: Object as PropType<Partial<FieldArrayTranslations>> },\n },\n // value-change 携带 { value },update:value 携带裸数组\n emits: {\n 'value-change': (_details: PayloadOf<FieldArrayProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<FieldArrayProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: FieldArrayRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const form = useOptionalFormContext()\n const onValueChange: FieldArrayProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useFieldArray(withXhConfig('field-array', useFormControlProps(props)) as FieldArrayProps, { onValueChange }, form?.service)\n provideFieldArray(ctx)\n // items 里每一项都带 key,作者铺行时直接 :key=\"row.key\"\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n items: ctx.api.value.items,\n value: ctx.api.value.value,\n count: ctx.api.value.count,\n empty: ctx.api.value.empty,\n atMin: ctx.api.value.atMin,\n atMax: ctx.api.value.atMax,\n canAdd: ctx.api.value.canAdd,\n setValue: ctx.api.value.setValue,\n add: ctx.api.value.add,\n remove: ctx.api.value.remove,\n move: ctx.api.value.move,\n moveUp: ctx.api.value.moveUp,\n moveDown: ctx.api.value.moveDown,\n }))\n },\n})\n\nexport const XhFieldArrayItem = defineComponent({\n name: 'XhFieldArrayItem',\n props: {\n // 下标由作者声明,兼收字符串以支持模板里写 index=\"0\"\n index: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useFieldArrayContext()\n const item = computed<FieldArrayItemProps>(() => ({ index: Math.trunc(Number(props.index)) }))\n provideFieldArrayItem({ item })\n return () => h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 行前的行号或名目;纯标注,不与行内的控件建立 for 关联。 */\nexport const XhFieldArrayItemLabel = defineComponent({\n name: 'XhFieldArrayItemLabel',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('span', ctx.api.value.getItemLabelProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayItemContent = defineComponent({\n name: 'XhFieldArrayItemContent',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('div', ctx.api.value.getItemContentProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayItemAction = defineComponent({\n name: 'XhFieldArrayItemAction',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('div', ctx.api.value.getItemActionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayAddTrigger = defineComponent({\n name: 'XhFieldArrayAddTrigger',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n return () => h('button', ctx.api.value.getAddTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayItemDeleteTrigger = defineComponent({\n name: 'XhFieldArrayItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayMoveUpTrigger = defineComponent({\n name: 'XhFieldArrayMoveUpTrigger',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('button', ctx.api.value.getMoveUpTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayMoveDownTrigger = defineComponent({\n name: 'XhFieldArrayMoveDownTrigger',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('button', ctx.api.value.getMoveDownTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"field-array.js","names":[],"sources":["../../../src/components/field-array/field-array.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 field array 相关实现。\n\nimport type { FieldArrayApi, FieldArrayItemProps, FieldArraySchema, FieldArrayTranslations, FormPath } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useOptionalFormContext } from '../form/context'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideFieldArray, provideFieldArrayItem, useFieldArrayContext, useFieldArrayItemContext } from './context'\nimport { useFieldArray } from './use-field-array'\n\ntype FieldArrayProps = FieldArraySchema['props']\n\n/** 默认插槽的载荷:逐行投影与整份值、行数与上下限状态,以及整份替换、增删、移动的动作。 */\nexport type FieldArrayRootSlotProps = Pick<\n FieldArrayApi,\n | 'items'\n | 'value'\n | 'count'\n | 'empty'\n | 'atMin'\n | 'atMax'\n | 'canAdd'\n | 'setValue'\n | 'add'\n | 'insert'\n | 'remove'\n | 'move'\n | 'moveUp'\n | 'moveDown'\n>\n\nexport const XhFieldArrayRoot = defineComponent({\n name: 'XhFieldArrayRoot',\n // 有 connect 与机器兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: Array as PropType<unknown[]> },\n defaultValue: { type: Array as PropType<unknown[]> },\n min: { type: Number },\n max: { type: Number },\n createItem: { type: Function as PropType<() => unknown> },\n movable: Boolean,\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: [String, Array] as PropType<FormPath> },\n translations: { type: Object as PropType<Partial<FieldArrayTranslations>> },\n },\n // value-change 携带 { value },update:value 携带裸数组\n emits: {\n 'value-change': (_details: PayloadOf<FieldArrayProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<FieldArrayProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: FieldArrayRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const form = useOptionalFormContext()\n const onValueChange: FieldArrayProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useFieldArray(withXhConfig('field-array', useFormControlProps(props)) as FieldArrayProps, { onValueChange }, form?.service)\n provideFieldArray(ctx)\n // items 里每一项都带 key,作者铺行时直接 :key=\"row.key\"\n return () => h('div', { ...(ctx.api.value.getRootProps() as Record<string, unknown>), ref: ctx.rootRef }, slots.default?.({\n items: ctx.api.value.items,\n value: ctx.api.value.value,\n count: ctx.api.value.count,\n empty: ctx.api.value.empty,\n atMin: ctx.api.value.atMin,\n atMax: ctx.api.value.atMax,\n canAdd: ctx.api.value.canAdd,\n setValue: ctx.api.value.setValue,\n add: ctx.api.value.add,\n insert: ctx.api.value.insert,\n remove: ctx.api.value.remove,\n move: ctx.api.value.move,\n moveUp: ctx.api.value.moveUp,\n moveDown: ctx.api.value.moveDown,\n }))\n },\n})\n\nexport const XhFieldArrayItem = defineComponent({\n name: 'XhFieldArrayItem',\n props: {\n // 下标由作者声明,兼收字符串以支持模板里写 index=\"0\"\n index: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useFieldArrayContext()\n const item = computed<FieldArrayItemProps>(() => ({ index: Math.trunc(Number(props.index)) }))\n provideFieldArrayItem({ item })\n return () => h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 行前的行号或名目;纯标注,不与行内的控件建立 for 关联。 */\nexport const XhFieldArrayItemLabel = defineComponent({\n name: 'XhFieldArrayItemLabel',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('span', ctx.api.value.getItemLabelProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayItemContent = defineComponent({\n name: 'XhFieldArrayItemContent',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('div', ctx.api.value.getItemContentProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayItemAction = defineComponent({\n name: 'XhFieldArrayItemAction',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('div', ctx.api.value.getItemActionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayAddTrigger = defineComponent({\n name: 'XhFieldArrayAddTrigger',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n return () => h('button', ctx.api.value.getAddTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayItemDeleteTrigger = defineComponent({\n name: 'XhFieldArrayItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayMoveUpTrigger = defineComponent({\n name: 'XhFieldArrayMoveUpTrigger',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('button', ctx.api.value.getMoveUpTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFieldArrayMoveDownTrigger = defineComponent({\n name: 'XhFieldArrayMoveDownTrigger',\n setup(_, { slots }) {\n const ctx = useFieldArrayContext()\n const { item } = useFieldArrayItemContext()\n return () => h('button', ctx.api.value.getMoveDownTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
@@ -1,10 +1,12 @@
1
- import { ComputedRef } from "vue";
1
+ import { ComputedRef, Ref } from "vue";
2
2
  import { Service } from "@xihan-ui/core";
3
3
  import { FieldArrayApi, FieldArraySchema, FormSchema } from "@xihan-ui/headless";
4
4
  //#region src/components/field-array/use-field-array.d.ts
5
5
  interface FieldArrayContext {
6
6
  api: ComputedRef<FieldArrayApi>;
7
7
  service: Service<FieldArraySchema>;
8
+ /** 行所在的根节点:列表动效接在它上面。 */
9
+ rootRef: Ref<HTMLElement | null>;
8
10
  }
9
11
  declare function useFieldArray(props: FieldArraySchema['props'], handlers?: Pick<FieldArraySchema['props'], 'onValueChange'>, form?: Service<FormSchema> | null): FieldArrayContext;
10
12
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"use-field-array.d.ts","names":[],"sources":["../../../src/components/field-array/use-field-array.ts"],"mappings":";;;;UAiBiB;EACf,KAAK,YAAY;EACjB,SAAS,QAAQ;;iBAGH,cACd,OAAO,2BACP,WAAU,KAAK,6CACf,OAAO,QAAQ,qBACd"}
1
+ {"version":3,"file":"use-field-array.d.ts","names":[],"sources":["../../../src/components/field-array/use-field-array.ts"],"mappings":";;;;UAiBiB;EACf,KAAK,YAAY;EACjB,SAAS,QAAQ;;EAEjB,SAAS,IAAI;;iBAGC,cACd,OAAO,2BACP,WAAU,KAAK,6CACf,OAAO,QAAQ,qBACd"}
@@ -1,7 +1,7 @@
1
1
  import { vueNormalize } from "../../runtime/normalize-props.js";
2
2
  import { useMachine } from "../../runtime/use-machine.js";
3
3
  import { createVueIdGenerator } from "../../runtime/vue-id.js";
4
- import { computed } from "vue";
4
+ import { computed, ref } from "vue";
5
5
  import { createScope } from "@xihan-ui/core";
6
6
  import { connectFieldArray, fieldArrayMachine } from "@xihan-ui/headless";
7
7
  //#region src/components/field-array/use-field-array.ts
@@ -11,9 +11,12 @@ function useFieldArray(props, handlers = {}, form) {
11
11
  ...handlers
12
12
  }), createScope(null, createVueIdGenerator()));
13
13
  service.refs.set("form", form ?? null);
14
+ const rootRef = ref(null);
15
+ service.refs.set("getRootEl", () => rootRef.value);
14
16
  return {
15
17
  api: computed(() => connectFieldArray(service, vueNormalize)),
16
- service
18
+ service,
19
+ rootRef
17
20
  };
18
21
  }
19
22
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"use-field-array.js","names":[],"sources":["../../../src/components/field-array/use-field-array.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 use field array 相关实现。\n\nimport type { Service } from '@xihan-ui/core'\nimport type { FieldArrayApi, FieldArraySchema, FormSchema } from '@xihan-ui/headless'\nimport type { ComputedRef } from 'vue'\nimport { createScope } from '@xihan-ui/core'\nimport { connectFieldArray, fieldArrayMachine } from '@xihan-ui/headless'\nimport { computed } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface FieldArrayContext {\n api: ComputedRef<FieldArrayApi>\n service: Service<FieldArraySchema>\n}\n\nexport function useFieldArray(\n props: FieldArraySchema['props'],\n handlers: Pick<FieldArraySchema['props'], 'onValueChange'> = {},\n form?: Service<FormSchema> | null,\n): FieldArrayContext {\n // scope id 走 Vue 的 useId,保证同页多实例的 IDREF 不相撞\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(fieldArrayMachine, () => ({ ...props, ...handlers }), scope)\n service.refs.set('form', form ?? null)\n const api = computed(() => connectFieldArray(service, vueNormalize))\n return { api, service }\n}\n"],"mappings":";;;;;;;AAsBA,SAAgB,cACd,OACA,WAA6D,CAAC,GAC9D,MACmB;CAInB,MAAM,UAAU,WAAW,0BAA0B;EAAE,GAAG;EAAO,GAAG;CAAS,IAD/D,YAAY,MADZ,qBACsB,CACiD,CAAC;CACtF,QAAQ,KAAK,IAAI,QAAQ,QAAQ,IAAI;CAErC,OAAO;EAAE,KADG,eAAe,kBAAkB,SAAS,YAAY,CACvD;EAAG;CAAQ;AACxB"}
1
+ {"version":3,"file":"use-field-array.js","names":[],"sources":["../../../src/components/field-array/use-field-array.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 use field array 相关实现。\n\nimport type { Service } from '@xihan-ui/core'\nimport type { FieldArrayApi, FieldArraySchema, FormSchema } from '@xihan-ui/headless'\nimport type { ComputedRef, Ref } from 'vue'\nimport { createScope } from '@xihan-ui/core'\nimport { connectFieldArray, fieldArrayMachine } from '@xihan-ui/headless'\nimport { computed, ref } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface FieldArrayContext {\n api: ComputedRef<FieldArrayApi>\n service: Service<FieldArraySchema>\n /** 行所在的根节点:列表动效接在它上面。 */\n rootRef: Ref<HTMLElement | null>\n}\n\nexport function useFieldArray(\n props: FieldArraySchema['props'],\n handlers: Pick<FieldArraySchema['props'], 'onValueChange'> = {},\n form?: Service<FormSchema> | null,\n): FieldArrayContext {\n // scope id 走 Vue 的 useId,保证同页多实例的 IDREF 不相撞\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(fieldArrayMachine, () => ({ ...props, ...handlers }), scope)\n service.refs.set('form', form ?? null)\n const rootRef = ref<HTMLElement | null>(null)\n // 传 getter 而非节点本身,ref 在挂载后才有值\n service.refs.set('getRootEl', () => rootRef.value)\n const api = computed(() => connectFieldArray(service, vueNormalize))\n return { api, service, rootRef }\n}\n"],"mappings":";;;;;;;AAwBA,SAAgB,cACd,OACA,WAA6D,CAAC,GAC9D,MACmB;CAInB,MAAM,UAAU,WAAW,0BAA0B;EAAE,GAAG;EAAO,GAAG;CAAS,IAD/D,YAAY,MADZ,qBACsB,CACiD,CAAC;CACtF,QAAQ,KAAK,IAAI,QAAQ,QAAQ,IAAI;CACrC,MAAM,UAAU,IAAwB,IAAI;CAE5C,QAAQ,KAAK,IAAI,mBAAmB,QAAQ,KAAK;CAEjD,OAAO;EAAE,KADG,eAAe,kBAAkB,SAAS,YAAY,CACvD;EAAG;EAAS;CAAQ;AACjC"}
@@ -4,7 +4,7 @@ import { FileUploadApi, FileUploadFile, FileUploadRemoteFile, FileUploadSchema,
4
4
  //#region src/components/file-upload/file-upload.d.ts
5
5
  type FileUploadProps = FileUploadSchema['props'];
6
6
  /** 默认插槽的载荷:文件清单与传输快照、投放区与数量状态,以及增删清空、开始上传、拉起选择器等命令。 */
7
- type FileUploadRootSlotProps = Pick<FileUploadApi, 'acceptedFiles' | 'remoteFiles' | 'allFiles' | 'uploadOf' | 'startUpload' | 'dragging' | 'empty' | 'disabled' | 'maxFiles' | 'getFileSizeText' | 'setFiles' | 'addFiles' | 'deleteFile' | 'clear' | 'openFilePicker'>;
7
+ type FileUploadRootSlotProps = Pick<FileUploadApi, 'acceptedFiles' | 'remoteFiles' | 'allFiles' | 'uploadOf' | 'startUpload' | 'cancelUpload' | 'dragging' | 'empty' | 'disabled' | 'maxFiles' | 'getFileSizeText' | 'setFiles' | 'addFiles' | 'deleteFile' | 'clear' | 'openFilePicker'>;
8
8
  declare const XhFileUploadRoot: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
9
9
  files: {
10
10
  type: PropType<File[]>;
@@ -52,6 +52,16 @@ declare const XhFileUploadRoot: import("vue").DefineComponent<import("vue").Extr
52
52
  type: BooleanConstructor;
53
53
  default: undefined;
54
54
  };
55
+ allowPaste: {
56
+ type: BooleanConstructor;
57
+ default: undefined;
58
+ };
59
+ validate: {
60
+ type: PropType<FileUploadProps["validate"]>;
61
+ };
62
+ maxConcurrentUploads: {
63
+ type: NumberConstructor;
64
+ };
55
65
  directory: BooleanConstructor;
56
66
  capture: {
57
67
  type: PropType<"user" | "environment">;
@@ -70,6 +80,7 @@ declare const XhFileUploadRoot: import("vue").DefineComponent<import("vue").Extr
70
80
  'update:remoteFiles': (_files: PayloadOf<FileUploadProps, "onRemoteFilesChange">["files"]) => true;
71
81
  'upload-complete': (_details: PayloadOf<FileUploadProps, "onUploadComplete">) => true;
72
82
  'upload-error': (_details: PayloadOf<FileUploadProps, "onUploadError">) => true;
83
+ 'upload-cancel': (_details: PayloadOf<FileUploadProps, "onUploadCancel">) => true;
73
84
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
74
85
  files: {
75
86
  type: PropType<File[]>;
@@ -117,6 +128,16 @@ declare const XhFileUploadRoot: import("vue").DefineComponent<import("vue").Extr
117
128
  type: BooleanConstructor;
118
129
  default: undefined;
119
130
  };
131
+ allowPaste: {
132
+ type: BooleanConstructor;
133
+ default: undefined;
134
+ };
135
+ validate: {
136
+ type: PropType<FileUploadProps["validate"]>;
137
+ };
138
+ maxConcurrentUploads: {
139
+ type: NumberConstructor;
140
+ };
120
141
  directory: BooleanConstructor;
121
142
  capture: {
122
143
  type: PropType<"user" | "environment">;
@@ -133,12 +154,14 @@ declare const XhFileUploadRoot: import("vue").DefineComponent<import("vue").Extr
133
154
  "onUpdate:remoteFiles"?: ((_files: FileUploadRemoteFile[]) => any) | undefined;
134
155
  "onUpload-complete"?: ((_details: import("@xihan-ui/headless").FileUploadCompleteDetails) => any) | undefined;
135
156
  "onUpload-error"?: ((_details: import("@xihan-ui/headless").FileUploadErrorDetails) => any) | undefined;
157
+ "onUpload-cancel"?: ((_details: import("@xihan-ui/headless").FileUploadCancelDetails) => any) | undefined;
136
158
  }>, {
137
159
  invalid: boolean;
138
160
  disabled: boolean;
139
161
  directory: boolean;
140
162
  autoUpload: boolean;
141
163
  allowDrop: boolean;
164
+ allowPaste: boolean;
142
165
  }, SlotsType<{
143
166
  default?: (props: FileUploadRootSlotProps) => VNode[];
144
167
  }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload.d.ts","names":[],"sources":["../../../src/components/file-upload/file-upload.ts"],"mappings":";;;;KAkBK,kBAAkB;;KAGX,0BAA0B,KACpC;cAkBW,gCAAgB,8BAAA;;IAKD,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACV,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IAClB,MAAA,SAAS;;;;;;;IAEF,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASR,MAAA;;;IACK,MAAA,SAAS,QAAQ;;;;;EAItB,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;EACT,gBAAA,UAAA,UAAU;EACV,gBAAA,UAAA,UAAU;EACF,wBAAA,UAAA,UAAU;EACb,uBAAA,QAAA,UAAU;EACX,oBAAA,UAAA,UAAU;EACb,iBAAA,UAAA,UAAU;;;IA3Bb,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACV,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IAClB,MAAA,SAAS;;;;;;;IAEF,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASR,MAAA;;;IACK,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;EAcvC,WAAC,OAAO,4BAA4B;kCAmChD;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAO5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAM/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,8BAAA;;;;;;;;;;qCAsB9B;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAM3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,8BAAA;;;IAID,MAAA,SAAS;;;;IAEE,MAAA;;;;;;;IAFX,MAAA,SAAS;;;;IAEE,MAAA;;MAqBrC,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAY/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAYnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAOnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6CAA6B,0BAAA,oBAAA,4BAAA;;8BAWxC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"file-upload.d.ts","names":[],"sources":["../../../src/components/file-upload/file-upload.ts"],"mappings":";;;;KAkBK,kBAAkB;;KAGX,0BAA0B,KACpC;cAmBW,gCAAgB,8BAAA;;IAKD,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACV,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IAClB,MAAA,SAAS;;;;;;;IAEF,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASL,MAAA,SAAS;;;;;;;IAGZ,MAAA;;;IACK,MAAA,SAAS,QAAQ;;;;;EAItB,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;EACT,gBAAA,UAAA,UAAU;EACV,gBAAA,UAAA,UAAU;EACF,wBAAA,UAAA,UAAU;EACb,uBAAA,QAAA,UAAU;EACX,oBAAA,UAAA,UAAU;EACb,iBAAA,UAAA,UAAU;EACT,kBAAA,UAAA,UAAU;;;IA/Bd,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACV,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IAClB,MAAA,SAAS;;;;;;;IAEF,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASL,MAAA,SAAS;;;;;;;IAGZ,MAAA;;;IACK,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;;;EAevC,WAAC,OAAO,4BAA4B;kCAqChD;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAO5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAM/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,8BAAA;;;;;;;;;;qCAsB9B;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAM3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,8BAAA;;;IAID,MAAA,SAAS;;;;IAEE,MAAA;;;;;;;IAFX,MAAA,SAAS;;;;IAEE,MAAA;;MAqBrC,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAY/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAYnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAOnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6CAA6B,0BAAA,oBAAA,4BAAA;;8BAWxC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -35,6 +35,12 @@ const XhFileUploadRoot = defineComponent({
35
35
  type: Boolean,
36
36
  default: void 0
37
37
  },
38
+ allowPaste: {
39
+ type: Boolean,
40
+ default: void 0
41
+ },
42
+ validate: { type: Function },
43
+ maxConcurrentUploads: { type: Number },
38
44
  directory: Boolean,
39
45
  capture: { type: String },
40
46
  translations: { type: Object }
@@ -47,7 +53,8 @@ const XhFileUploadRoot = defineComponent({
47
53
  "remote-files-change": (_details) => true,
48
54
  "update:remoteFiles": (_files) => true,
49
55
  "upload-complete": (_details) => true,
50
- "upload-error": (_details) => true
56
+ "upload-error": (_details) => true,
57
+ "upload-cancel": (_details) => true
51
58
  },
52
59
  slots: Object,
53
60
  setup(props, { slots, emit }) {
@@ -63,13 +70,15 @@ const XhFileUploadRoot = defineComponent({
63
70
  };
64
71
  const onUploadComplete = (details) => emit("upload-complete", details);
65
72
  const onUploadError = (details) => emit("upload-error", details);
73
+ const onUploadCancel = (details) => emit("upload-cancel", details);
66
74
  const ctx = useFileUpload(withXhConfig("file-upload", useFormControlProps(props)), {
67
75
  onFilesChange,
68
76
  onFileAccept,
69
77
  onFileReject,
70
78
  onRemoteFilesChange,
71
79
  onUploadComplete,
72
- onUploadError
80
+ onUploadError,
81
+ onUploadCancel
73
82
  });
74
83
  provideFileUpload(ctx);
75
84
  return () => h("div", ctx.api.value.getRootProps(), slots.default?.({
@@ -78,6 +87,7 @@ const XhFileUploadRoot = defineComponent({
78
87
  allFiles: ctx.api.value.allFiles,
79
88
  uploadOf: ctx.api.value.uploadOf,
80
89
  startUpload: ctx.api.value.startUpload,
90
+ cancelUpload: ctx.api.value.cancelUpload,
81
91
  dragging: ctx.api.value.dragging,
82
92
  empty: ctx.api.value.empty,
83
93
  disabled: ctx.api.value.disabled,
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload.js","names":[],"sources":["../../../src/components/file-upload/file-upload.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 file upload 相关实现。\n\nimport type { FileUploadApi, FileUploadFile, FileUploadItemProps, FileUploadRemoteFile, FileUploadSchema, FileUploadTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideFileUpload, provideFileUploadItem, useFileUploadContext, useFileUploadItemContext } from './context'\nimport { useFileUpload } from './use-file-upload'\n\ntype FileUploadProps = FileUploadSchema['props']\n\n/** 默认插槽的载荷:文件清单与传输快照、投放区与数量状态,以及增删清空、开始上传、拉起选择器等命令。 */\nexport type FileUploadRootSlotProps = Pick<\n FileUploadApi,\n | 'acceptedFiles'\n | 'remoteFiles'\n | 'allFiles'\n | 'uploadOf'\n | 'startUpload'\n | 'dragging'\n | 'empty'\n | 'disabled'\n | 'maxFiles'\n | 'getFileSizeText'\n | 'setFiles'\n | 'addFiles'\n | 'deleteFile'\n | 'clear'\n | 'openFilePicker'\n>\n\nexport const XhFileUploadRoot = defineComponent({\n name: 'XhFileUploadRoot',\n // 有 connect 与机器兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n // 缺席值 undefined 表示非受控\n files: { type: Array as PropType<File[]> },\n defaultFiles: { type: Array as PropType<File[]> },\n remoteFiles: { type: Array as PropType<FileUploadRemoteFile[]> },\n defaultRemoteFiles: { type: Array as PropType<FileUploadRemoteFile[]> },\n upload: { type: Function as PropType<FileUploadProps['upload']> },\n autoUpload: { type: Boolean, default: undefined },\n accept: { type: [String, Array] as PropType<string | string[]> },\n maxFiles: { type: Number },\n maxFileSize: { type: Number },\n minFileSize: { type: Number },\n disabled: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n allowDrop: { type: Boolean, default: undefined },\n directory: Boolean,\n capture: { type: String as PropType<'user' | 'environment'> },\n translations: { type: Object as PropType<Partial<FileUploadTranslations>> },\n },\n // files-change 携带 { files },update:files 携带裸数组;file-accept / file-reject 逐个文件报告\n emits: {\n 'files-change': (_details: PayloadOf<FileUploadProps, 'onFilesChange'>) => true,\n 'update:files': (_files: PayloadOf<FileUploadProps, 'onFilesChange'>['files']) => true,\n 'file-accept': (_details: PayloadOf<FileUploadProps, 'onFileAccept'>) => true,\n 'file-reject': (_details: PayloadOf<FileUploadProps, 'onFileReject'>) => true,\n 'remote-files-change': (_details: PayloadOf<FileUploadProps, 'onRemoteFilesChange'>) => true,\n 'update:remoteFiles': (_files: PayloadOf<FileUploadProps, 'onRemoteFilesChange'>['files']) => true,\n 'upload-complete': (_details: PayloadOf<FileUploadProps, 'onUploadComplete'>) => true,\n 'upload-error': (_details: PayloadOf<FileUploadProps, 'onUploadError'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: FileUploadRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onFilesChange: FileUploadProps['onFilesChange'] = (details) => {\n emit('files-change', details)\n emit('update:files', details.files)\n }\n const onFileAccept: FileUploadProps['onFileAccept'] = details => emit('file-accept', details)\n const onFileReject: FileUploadProps['onFileReject'] = details => emit('file-reject', details)\n const onRemoteFilesChange: FileUploadProps['onRemoteFilesChange'] = (details) => {\n emit('remote-files-change', details)\n emit('update:remoteFiles', details.files)\n }\n const onUploadComplete: FileUploadProps['onUploadComplete'] = details => emit('upload-complete', details)\n const onUploadError: FileUploadProps['onUploadError'] = details => emit('upload-error', details)\n const ctx = useFileUpload(withXhConfig('file-upload', useFormControlProps(props)) as FileUploadProps, { onFilesChange, onFileAccept, onFileReject, onRemoteFilesChange, onUploadComplete, onUploadError })\n provideFileUpload(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n acceptedFiles: ctx.api.value.acceptedFiles,\n remoteFiles: ctx.api.value.remoteFiles,\n allFiles: ctx.api.value.allFiles,\n uploadOf: ctx.api.value.uploadOf,\n startUpload: ctx.api.value.startUpload,\n dragging: ctx.api.value.dragging,\n empty: ctx.api.value.empty,\n disabled: ctx.api.value.disabled,\n maxFiles: ctx.api.value.maxFiles,\n getFileSizeText: ctx.api.value.getFileSizeText,\n setFiles: ctx.api.value.setFiles,\n addFiles: ctx.api.value.addFiles,\n deleteFile: ctx.api.value.deleteFile,\n clear: ctx.api.value.clear,\n openFilePicker: ctx.api.value.openFilePicker,\n }))\n },\n})\n\nexport const XhFileUploadLabel = defineComponent({\n name: 'XhFileUploadLabel',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n // 用原生 label,getLabelProps 的 for 指向隐藏输入\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadDropzone = defineComponent({\n name: 'XhFileUploadDropzone',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n return () => h('div', ctx.api.value.getDropzoneProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadTrigger = defineComponent({\n name: 'XhFileUploadTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = useFileUploadContext()\n return () => {\n const part = mergePartProps(ctx.api.value.getTriggerProps() as Record<string, unknown>, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'file-upload')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhFileUploadHiddenInput = defineComponent({\n name: 'XhFileUploadHiddenInput',\n setup() {\n const ctx = useFileUploadContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n\nexport const XhFileUploadList = defineComponent({\n name: 'XhFileUploadList',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n return () => h('div', ctx.api.value.getListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadItem = defineComponent({\n name: 'XhFileUploadItem',\n props: {\n /** 该行显示哪个文件(本地或远程附件)。 */\n file: { type: Object as PropType<FileUploadFile> },\n /** 改用下标从 allFiles(远程在前、本地在后)中取文件,兼收字符串以支持模板中写 index=\"0\"。 */\n index: { type: [Number, String] as PropType<number | string> },\n },\n setup(props, { slots }) {\n const ctx = useFileUploadContext()\n const file = computed<FileUploadFile | undefined>(() => {\n if (props.file)\n return props.file\n if (props.index == null)\n return undefined\n return ctx.api.value.allFiles[Math.trunc(Number(props.index))]\n })\n // 条目上下文,子部件从中取文件\n const item = computed<FileUploadItemProps>(() => ({ file: file.value as FileUploadFile }))\n provideFileUploadItem({ item })\n return () => {\n // 下标指向的文件不存在时只渲染空壳,不打组件属性也不渲染子部件\n if (!file.value)\n return h('div')\n return h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, slots.default?.())\n }\n },\n})\n\nexport const XhFileUploadItemName = defineComponent({\n name: 'XhFileUploadItemName',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n // 有插槽用插槽,否则显示文件名\n return () => h(\n 'span',\n ctx.api.value.getItemNameProps(item.value) as Record<string, unknown>,\n slots.default?.() ?? item.value.file.name,\n )\n },\n})\n\nexport const XhFileUploadItemSizeText = defineComponent({\n name: 'XhFileUploadItemSizeText',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n // 有插槽用插槽,否则显示格式化后的文件大小\n return () => h(\n 'span',\n ctx.api.value.getItemSizeTextProps(item.value) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getFileSizeText(item.value.file),\n )\n },\n})\n\nexport const XhFileUploadItemPreview = defineComponent({\n name: 'XhFileUploadItemPreview',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n return () => h('div', ctx.api.value.getItemPreviewProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadItemProgress = defineComponent({\n name: 'XhFileUploadItemProgress',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n return () => h('div', ctx.api.value.getItemProgressProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadItemDeleteTrigger = defineComponent({\n name: 'XhFileUploadItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n return () => h(\n 'button',\n ctx.api.value.getItemDeleteTriggerProps(item.value) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhFileUploadClearTrigger = defineComponent({\n name: 'XhFileUploadClearTrigger',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"file-upload.js","names":[],"sources":["../../../src/components/file-upload/file-upload.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 file upload 相关实现。\n\nimport type { FileUploadApi, FileUploadFile, FileUploadItemProps, FileUploadRemoteFile, FileUploadSchema, FileUploadTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideFileUpload, provideFileUploadItem, useFileUploadContext, useFileUploadItemContext } from './context'\nimport { useFileUpload } from './use-file-upload'\n\ntype FileUploadProps = FileUploadSchema['props']\n\n/** 默认插槽的载荷:文件清单与传输快照、投放区与数量状态,以及增删清空、开始上传、拉起选择器等命令。 */\nexport type FileUploadRootSlotProps = Pick<\n FileUploadApi,\n | 'acceptedFiles'\n | 'remoteFiles'\n | 'allFiles'\n | 'uploadOf'\n | 'startUpload'\n | 'cancelUpload'\n | 'dragging'\n | 'empty'\n | 'disabled'\n | 'maxFiles'\n | 'getFileSizeText'\n | 'setFiles'\n | 'addFiles'\n | 'deleteFile'\n | 'clear'\n | 'openFilePicker'\n>\n\nexport const XhFileUploadRoot = defineComponent({\n name: 'XhFileUploadRoot',\n // 有 connect 与机器兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n // 缺席值 undefined 表示非受控\n files: { type: Array as PropType<File[]> },\n defaultFiles: { type: Array as PropType<File[]> },\n remoteFiles: { type: Array as PropType<FileUploadRemoteFile[]> },\n defaultRemoteFiles: { type: Array as PropType<FileUploadRemoteFile[]> },\n upload: { type: Function as PropType<FileUploadProps['upload']> },\n autoUpload: { type: Boolean, default: undefined },\n accept: { type: [String, Array] as PropType<string | string[]> },\n maxFiles: { type: Number },\n maxFileSize: { type: Number },\n minFileSize: { type: Number },\n disabled: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n allowDrop: { type: Boolean, default: undefined },\n allowPaste: { type: Boolean, default: undefined },\n validate: { type: Function as PropType<FileUploadProps['validate']> },\n maxConcurrentUploads: { type: Number },\n directory: Boolean,\n capture: { type: String as PropType<'user' | 'environment'> },\n translations: { type: Object as PropType<Partial<FileUploadTranslations>> },\n },\n // files-change 携带 { files },update:files 携带裸数组;file-accept / file-reject 逐个文件报告\n emits: {\n 'files-change': (_details: PayloadOf<FileUploadProps, 'onFilesChange'>) => true,\n 'update:files': (_files: PayloadOf<FileUploadProps, 'onFilesChange'>['files']) => true,\n 'file-accept': (_details: PayloadOf<FileUploadProps, 'onFileAccept'>) => true,\n 'file-reject': (_details: PayloadOf<FileUploadProps, 'onFileReject'>) => true,\n 'remote-files-change': (_details: PayloadOf<FileUploadProps, 'onRemoteFilesChange'>) => true,\n 'update:remoteFiles': (_files: PayloadOf<FileUploadProps, 'onRemoteFilesChange'>['files']) => true,\n 'upload-complete': (_details: PayloadOf<FileUploadProps, 'onUploadComplete'>) => true,\n 'upload-error': (_details: PayloadOf<FileUploadProps, 'onUploadError'>) => true,\n 'upload-cancel': (_details: PayloadOf<FileUploadProps, 'onUploadCancel'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: FileUploadRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onFilesChange: FileUploadProps['onFilesChange'] = (details) => {\n emit('files-change', details)\n emit('update:files', details.files)\n }\n const onFileAccept: FileUploadProps['onFileAccept'] = details => emit('file-accept', details)\n const onFileReject: FileUploadProps['onFileReject'] = details => emit('file-reject', details)\n const onRemoteFilesChange: FileUploadProps['onRemoteFilesChange'] = (details) => {\n emit('remote-files-change', details)\n emit('update:remoteFiles', details.files)\n }\n const onUploadComplete: FileUploadProps['onUploadComplete'] = details => emit('upload-complete', details)\n const onUploadError: FileUploadProps['onUploadError'] = details => emit('upload-error', details)\n const onUploadCancel: FileUploadProps['onUploadCancel'] = details => emit('upload-cancel', details)\n const ctx = useFileUpload(withXhConfig('file-upload', useFormControlProps(props)) as FileUploadProps, { onFilesChange, onFileAccept, onFileReject, onRemoteFilesChange, onUploadComplete, onUploadError, onUploadCancel })\n provideFileUpload(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n acceptedFiles: ctx.api.value.acceptedFiles,\n remoteFiles: ctx.api.value.remoteFiles,\n allFiles: ctx.api.value.allFiles,\n uploadOf: ctx.api.value.uploadOf,\n startUpload: ctx.api.value.startUpload,\n cancelUpload: ctx.api.value.cancelUpload,\n dragging: ctx.api.value.dragging,\n empty: ctx.api.value.empty,\n disabled: ctx.api.value.disabled,\n maxFiles: ctx.api.value.maxFiles,\n getFileSizeText: ctx.api.value.getFileSizeText,\n setFiles: ctx.api.value.setFiles,\n addFiles: ctx.api.value.addFiles,\n deleteFile: ctx.api.value.deleteFile,\n clear: ctx.api.value.clear,\n openFilePicker: ctx.api.value.openFilePicker,\n }))\n },\n})\n\nexport const XhFileUploadLabel = defineComponent({\n name: 'XhFileUploadLabel',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n // 用原生 label,getLabelProps 的 for 指向隐藏输入\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadDropzone = defineComponent({\n name: 'XhFileUploadDropzone',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n return () => h('div', ctx.api.value.getDropzoneProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadTrigger = defineComponent({\n name: 'XhFileUploadTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = useFileUploadContext()\n return () => {\n const part = mergePartProps(ctx.api.value.getTriggerProps() as Record<string, unknown>, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'file-upload')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhFileUploadHiddenInput = defineComponent({\n name: 'XhFileUploadHiddenInput',\n setup() {\n const ctx = useFileUploadContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n\nexport const XhFileUploadList = defineComponent({\n name: 'XhFileUploadList',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n return () => h('div', ctx.api.value.getListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadItem = defineComponent({\n name: 'XhFileUploadItem',\n props: {\n /** 该行显示哪个文件(本地或远程附件)。 */\n file: { type: Object as PropType<FileUploadFile> },\n /** 改用下标从 allFiles(远程在前、本地在后)中取文件,兼收字符串以支持模板中写 index=\"0\"。 */\n index: { type: [Number, String] as PropType<number | string> },\n },\n setup(props, { slots }) {\n const ctx = useFileUploadContext()\n const file = computed<FileUploadFile | undefined>(() => {\n if (props.file)\n return props.file\n if (props.index == null)\n return undefined\n return ctx.api.value.allFiles[Math.trunc(Number(props.index))]\n })\n // 条目上下文,子部件从中取文件\n const item = computed<FileUploadItemProps>(() => ({ file: file.value as FileUploadFile }))\n provideFileUploadItem({ item })\n return () => {\n // 下标指向的文件不存在时只渲染空壳,不打组件属性也不渲染子部件\n if (!file.value)\n return h('div')\n return h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, slots.default?.())\n }\n },\n})\n\nexport const XhFileUploadItemName = defineComponent({\n name: 'XhFileUploadItemName',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n // 有插槽用插槽,否则显示文件名\n return () => h(\n 'span',\n ctx.api.value.getItemNameProps(item.value) as Record<string, unknown>,\n slots.default?.() ?? item.value.file.name,\n )\n },\n})\n\nexport const XhFileUploadItemSizeText = defineComponent({\n name: 'XhFileUploadItemSizeText',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n // 有插槽用插槽,否则显示格式化后的文件大小\n return () => h(\n 'span',\n ctx.api.value.getItemSizeTextProps(item.value) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getFileSizeText(item.value.file),\n )\n },\n})\n\nexport const XhFileUploadItemPreview = defineComponent({\n name: 'XhFileUploadItemPreview',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n return () => h('div', ctx.api.value.getItemPreviewProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadItemProgress = defineComponent({\n name: 'XhFileUploadItemProgress',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n return () => h('div', ctx.api.value.getItemProgressProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFileUploadItemDeleteTrigger = defineComponent({\n name: 'XhFileUploadItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n const { item } = useFileUploadItemContext()\n return () => h(\n 'button',\n ctx.api.value.getItemDeleteTriggerProps(item.value) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhFileUploadClearTrigger = defineComponent({\n name: 'XhFileUploadClearTrigger',\n setup(_, { slots }) {\n const ctx = useFileUploadContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":";;;;;;;;AAyCA,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CAEN,OAAO;EAEL,OAAO,EAAE,MAAM,MAA0B;EACzC,cAAc,EAAE,MAAM,MAA0B;EAChD,aAAa,EAAE,MAAM,MAA0C;EAC/D,oBAAoB,EAAE,MAAM,MAA0C;EACtE,QAAQ,EAAE,MAAM,SAAgD;EAChE,YAAY;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAChD,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,EAAiC;EAC/D,UAAU,EAAE,MAAM,OAAO;EACzB,aAAa,EAAE,MAAM,OAAO;EAC5B,aAAa,EAAE,MAAM,OAAO;EAC5B,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,SAAS;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC7C,MAAM,EAAE,MAAM,OAAO;EACrB,WAAW;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC/C,YAAY;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAChD,UAAU,EAAE,MAAM,SAAkD;EACpE,sBAAsB,EAAE,MAAM,OAAO;EACrC,WAAW;EACX,SAAS,EAAE,MAAM,OAA2C;EAC5D,cAAc,EAAE,MAAM,OAAoD;CAC5E;CAEA,OAAO;EACL,iBAAiB,aAA0D;EAC3E,iBAAiB,WAAiE;EAClF,gBAAgB,aAAyD;EACzE,gBAAgB,aAAyD;EACzE,wBAAwB,aAAgE;EACxF,uBAAuB,WAAuE;EAC9F,oBAAoB,aAA6D;EACjF,iBAAiB,aAA0D;EAC3E,kBAAkB,aAA2D;CAC/E;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,iBAAmD,YAAY;GACnE,KAAK,gBAAgB,OAAO;GAC5B,KAAK,gBAAgB,QAAQ,KAAK;EACpC;EACA,MAAM,gBAAgD,YAAW,KAAK,eAAe,OAAO;EAC5F,MAAM,gBAAgD,YAAW,KAAK,eAAe,OAAO;EAC5F,MAAM,uBAA+D,YAAY;GAC/E,KAAK,uBAAuB,OAAO;GACnC,KAAK,sBAAsB,QAAQ,KAAK;EAC1C;EACA,MAAM,oBAAwD,YAAW,KAAK,mBAAmB,OAAO;EACxG,MAAM,iBAAkD,YAAW,KAAK,gBAAgB,OAAO;EAC/F,MAAM,kBAAoD,YAAW,KAAK,iBAAiB,OAAO;EAClG,MAAM,MAAM,cAAc,aAAa,eAAe,oBAAoB,KAAK,CAAC,GAAsB;GAAE;GAAe;GAAc;GAAc;GAAqB;GAAkB;GAAe;EAAe,CAAC;EACzN,kBAAkB,GAAG;EACrB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,eAAe,IAAI,IAAI,MAAM;GAC7B,aAAa,IAAI,IAAI,MAAM;GAC3B,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,aAAa,IAAI,IAAI,MAAM;GAC3B,cAAc,IAAI,IAAI,MAAM;GAC5B,UAAU,IAAI,IAAI,MAAM;GACxB,OAAO,IAAI,IAAI,MAAM;GACrB,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,iBAAiB,IAAI,IAAI,MAAM;GAC/B,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,YAAY,IAAI,IAAI,MAAM;GAC1B,OAAO,IAAI,IAAI,MAAM;GACrB,gBAAgB,IAAI,IAAI,MAAM;EAChC,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EAEjC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,uBAAuB,gBAAgB;CAClD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,iBAAiB,GAA8B,MAAM,UAAU,CAAC;CACtG;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CAEN,cAAc;CACd,OAAO;;AAEL,SAAS,QACX;CACA,MAAM,OAAO,EAAE,OAAO,SAAS;EAC7B,MAAM,MAAM,qBAAqB;EACjC,aAAa;GACX,MAAM,OAAO,eAAe,IAAI,IAAI,MAAM,gBAAgB,GAA8B,KAAK;GAC7F,MAAM,WAAW,MAAM,UAAU;GAEjC,IAAI,MAAM,SAAS;IACjB,MAAM,SAAS,eAAe,UAAU,MAAM,aAAa;IAC3D,IAAI,QACF,OAAO;GACX;GACA,OAAO,EAAE,UAAU,MAAM,QAAQ;EACnC;CACF;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,oBAAoB,CAA4B;CACxF;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU,CAAC;CAClG;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,OAAO;;EAEL,MAAM,EAAE,MAAM,OAAmC;;EAEjD,OAAO,EAAE,MAAM,CAAC,QAAQ,MAAM,EAA+B;CAC/D;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,qBAAqB;EACjC,MAAM,OAAO,eAA2C;GACtD,IAAI,MAAM,MACR,OAAO,MAAM;GACf,IAAI,MAAM,SAAS,MACjB,OAAO,KAAA;GACT,OAAO,IAAI,IAAI,MAAM,SAAS,KAAK,MAAM,OAAO,MAAM,KAAK,CAAC;EAC9D,CAAC;EAED,MAAM,OAAO,gBAAqC,EAAE,MAAM,KAAK,MAAwB,EAAE;EACzF,sBAAsB,EAAE,KAAK,CAAC;EAC9B,aAAa;GAEX,IAAI,CAAC,KAAK,OACR,OAAO,EAAE,KAAK;GAChB,OAAO,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;EACtG;CACF;AACF,CAAC;AAED,MAAa,uBAAuB,gBAAgB;CAClD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,MAAM,EAAE,SAAS,yBAAyB;EAE1C,aAAa,EACX,QACA,IAAI,IAAI,MAAM,iBAAiB,KAAK,KAAK,GACzC,MAAM,UAAU,KAAK,KAAK,MAAM,KAAK,IACvC;CACF;AACF,CAAC;AAED,MAAa,2BAA2B,gBAAgB;CACtD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,MAAM,EAAE,SAAS,yBAAyB;EAE1C,aAAa,EACX,QACA,IAAI,IAAI,MAAM,qBAAqB,KAAK,KAAK,GAC7C,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,gBAAgB,KAAK,MAAM,IAAI,CACpE;CACF;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,MAAM,EAAE,SAAS,yBAAyB;EAC1C,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,oBAAoB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACnH;AACF,CAAC;AAED,MAAa,2BAA2B,gBAAgB;CACtD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,MAAM,EAAE,SAAS,yBAAyB;EAC1C,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,qBAAqB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACpH;AACF,CAAC;AAED,MAAa,gCAAgC,gBAAgB;CAC3D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,MAAM,EAAE,SAAS,yBAAyB;EAC1C,aAAa,EACX,UACA,IAAI,IAAI,MAAM,0BAA0B,KAAK,KAAK,GAClD,MAAM,UAAU,CAClB;CACF;AACF,CAAC;AAED,MAAa,2BAA2B,gBAAgB;CACtD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC7G;AACF,CAAC"}
@@ -4,7 +4,7 @@ import { FileUploadApi, FileUploadSchema } from "@xihan-ui/headless";
4
4
  interface FileUploadContext {
5
5
  api: ComputedRef<FileUploadApi>;
6
6
  }
7
- declare function useFileUpload(props: FileUploadSchema['props'], handlers?: Pick<FileUploadSchema['props'], 'onFilesChange' | 'onFileAccept' | 'onFileReject' | 'onRemoteFilesChange' | 'onUploadComplete' | 'onUploadError'>): FileUploadContext;
7
+ declare function useFileUpload(props: FileUploadSchema['props'], handlers?: Pick<FileUploadSchema['props'], 'onFilesChange' | 'onFileAccept' | 'onFileReject' | 'onRemoteFilesChange' | 'onUploadComplete' | 'onUploadError' | 'onUploadCancel'>): FileUploadContext;
8
8
  //#endregion
9
9
  export { FileUploadContext, useFileUpload };
10
10
  //# sourceMappingURL=use-file-upload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-file-upload.d.ts","names":[],"sources":["../../../src/components/file-upload/use-file-upload.ts"],"mappings":";;;UAgBiB;EACf,KAAK,YAAY;;iBAGH,cACd,OAAO,2BACP,WAAU,KAAK,+IACd"}
1
+ {"version":3,"file":"use-file-upload.d.ts","names":[],"sources":["../../../src/components/file-upload/use-file-upload.ts"],"mappings":";;;UAgBiB;EACf,KAAK,YAAY;;iBAGH,cACd,OAAO,2BACP,WAAU,KAAK,kKACd"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-file-upload.js","names":[],"sources":["../../../src/components/file-upload/use-file-upload.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 use file upload 相关实现。\n\nimport type { FileUploadApi, FileUploadSchema } from '@xihan-ui/headless'\nimport type { ComputedRef } from 'vue'\nimport { createScope } from '@xihan-ui/core'\nimport { connectFileUpload, fileUploadMachine } from '@xihan-ui/headless'\nimport { computed } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface FileUploadContext {\n api: ComputedRef<FileUploadApi>\n}\n\nexport function useFileUpload(\n props: FileUploadSchema['props'],\n handlers: Pick<FileUploadSchema['props'], 'onFilesChange' | 'onFileAccept' | 'onFileReject' | 'onRemoteFilesChange' | 'onUploadComplete' | 'onUploadError'> = {},\n): FileUploadContext {\n // scope id 走 Vue 的 useId,保证同页多实例的 IDREF 与隐藏输入不相撞\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(fileUploadMachine, () => ({ ...props, ...handlers }), scope)\n const api = computed(() => connectFileUpload(service, vueNormalize))\n return { api }\n}\n"],"mappings":";;;;;;;AAoBA,SAAgB,cACd,OACA,WAA8J,CAAC,GAC5I;CAInB,MAAM,UAAU,WAAW,0BAA0B;EAAE,GAAG;EAAO,GAAG;CAAS,IAD/D,YAAY,MADZ,qBACsB,CACiD,CAAC;CAEtF,OAAO,EAAE,KADG,eAAe,kBAAkB,SAAS,YAAY,CACvD,EAAE;AACf"}
1
+ {"version":3,"file":"use-file-upload.js","names":[],"sources":["../../../src/components/file-upload/use-file-upload.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 use file upload 相关实现。\n\nimport type { FileUploadApi, FileUploadSchema } from '@xihan-ui/headless'\nimport type { ComputedRef } from 'vue'\nimport { createScope } from '@xihan-ui/core'\nimport { connectFileUpload, fileUploadMachine } from '@xihan-ui/headless'\nimport { computed } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface FileUploadContext {\n api: ComputedRef<FileUploadApi>\n}\n\nexport function useFileUpload(\n props: FileUploadSchema['props'],\n handlers: Pick<FileUploadSchema['props'], 'onFilesChange' | 'onFileAccept' | 'onFileReject' | 'onRemoteFilesChange' | 'onUploadComplete' | 'onUploadError' | 'onUploadCancel'> = {},\n): FileUploadContext {\n // scope id 走 Vue 的 useId,保证同页多实例的 IDREF 与隐藏输入不相撞\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(fileUploadMachine, () => ({ ...props, ...handlers }), scope)\n const api = computed(() => connectFileUpload(service, vueNormalize))\n return { api }\n}\n"],"mappings":";;;;;;;AAoBA,SAAgB,cACd,OACA,WAAiL,CAAC,GAC/J;CAInB,MAAM,UAAU,WAAW,0BAA0B;EAAE,GAAG;EAAO,GAAG;CAAS,IAD/D,YAAY,MADZ,qBACsB,CACiD,CAAC;CAEtF,OAAO,EAAE,KADG,eAAe,kBAAkB,SAAS,YAAY,CACvD,EAAE;AACf"}
@@ -41,8 +41,8 @@ declare const XhFlex: import("vue").DefineComponent<import("vue").ExtractPropTyp
41
41
  wrap: BooleanConstructor;
42
42
  inline: BooleanConstructor;
43
43
  }>> & Readonly<{}>, {
44
- wrap: boolean;
45
44
  inline: boolean;
45
+ wrap: boolean;
46
46
  }, SlotsType<{
47
47
  /** 子项,按写入的顺序排列。 */
48
48
  default?: () => VNode[];
@@ -1 +1 @@
1
- {"version":3,"file":"flex.d.ts","names":[],"sources":["../../../src/components/flex/flex.ts"],"mappings":";;;;;;;cAkBa,2BAAW,0BAAA,oBAAA,4BAAA;;8BAMtB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAyCW,sBAAM,8BAAA;;IAIgB,MAAA,SAAS;;;IACf,MAAA,SAAS;;;IACP,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;;;;;IAHD,MAAA,SAAS;;;IACf,MAAA,SAAS;;;IACP,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;;;;;;EAMtB,gBAAM;;EAER,cAAM;kCAYhB"}
1
+ {"version":3,"file":"flex.d.ts","names":[],"sources":["../../../src/components/flex/flex.ts"],"mappings":";;;;;;;cAkBa,2BAAW,0BAAA,oBAAA,4BAAA;;8BAMtB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAyCW,sBAAM,8BAAA;;IAK0B,MAAA,SAAS;;;IACf,MAAA,SAAS;;;IACP,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;;;;;IAHD,MAAA,SAAS;;;IACf,MAAA,SAAS;;;IACP,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;;;;;;EAMhC,gBAAM;;EAER,cAAM;kCAYhB"}
@@ -51,10 +51,10 @@ function interleave(items, split) {
51
51
  const XhFlex = defineComponent({
52
52
  name: "XhFlex",
53
53
  props: {
54
- orientation: { type: String },
55
- align: { type: String },
56
- justify: { type: String },
57
- gap: { type: String },
54
+ orientation: { type: [String, Object] },
55
+ align: { type: [String, Object] },
56
+ justify: { type: [String, Object] },
57
+ gap: { type: [String, Object] },
58
58
  wrap: Boolean,
59
59
  inline: Boolean
60
60
  },
@@ -1 +1 @@
1
- {"version":3,"file":"flex.js","names":[],"sources":["../../../src/components/flex/flex.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 flex 相关实现。\n\nimport type { FlexProps } from '@xihan-ui/headless'\nimport type { PropType, Slot, SlotsType, VNode } from 'vue'\nimport { connectFlex } from '@xihan-ui/headless'\nimport { Comment, computed, defineComponent, Fragment, h, Text } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { provideFlex, useFlexContext } from './context'\n\n/**\n * 分隔符部件。写 `split` 插槽时组件在每道缝隙中自动铺设一个,\n * 手写它也能得到同一种结构:两条路径产出的 DOM 完全一致。\n */\nexport const XhFlexSplit = defineComponent({\n name: 'XhFlexSplit',\n setup(_, { slots }) {\n const ctx = useFlexContext()\n return () => h('span', ctx.api.value.getSplitProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 把默认插槽摊平为一个个子项。\n *\n * `v-for` 产出的是一个片段而不是若干节点,不摊平就整段算一个子项,分隔符只会插在整段的两端;\n * `v-if` 为假留下的注释节点与模板缩进留下的空白文本不渲染任何像素,保留会插出两条相邻的分隔符。\n */\nfunction flexItems(nodes: readonly VNode[]): VNode[] {\n const items: VNode[] = []\n for (const node of nodes) {\n if (node.type === Comment)\n continue\n if (node.type === Text) {\n if (String(node.children ?? '').trim() !== '')\n items.push(node)\n continue\n }\n if (node.type === Fragment && Array.isArray(node.children)) {\n items.push(...flexItems(node.children as VNode[]))\n continue\n }\n items.push(node)\n }\n return items\n}\n\n/**\n * 在每两个子项之间铺设一个分隔符部件。\n * 插槽逐缝隙重新求值:同一份 vnode 挂在两处会被后一处替换。\n */\nfunction interleave(items: readonly VNode[], split: Slot): VNode[] {\n const out: VNode[] = []\n items.forEach((item, index) => {\n if (index > 0)\n out.push(h(XhFlexSplit, { key: `xh-flex-split-${index}` }, () => split()))\n out.push(item)\n })\n return out\n}\n\nexport const XhFlex = defineComponent({\n name: 'XhFlex',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n orientation: { type: String as PropType<FlexProps['orientation']> },\n align: { type: String as PropType<FlexProps['align']> },\n justify: { type: String as PropType<FlexProps['justify']> },\n gap: { type: String as PropType<FlexProps['gap']> },\n wrap: Boolean,\n inline: Boolean,\n },\n slots: Object as SlotsType<{\n /** 子项,按写入的顺序排列。 */\n default?: () => VNode[]\n /** 分隔符的内容:写了它,组件在每两个子项之间各铺设一个分隔符部件,逐缝隙重新求值一次。 */\n split?: () => VNode[]\n }>,\n setup(props, { slots }) {\n const api = computed(() => connectFlex(props as FlexProps, vueNormalize))\n provideFlex({ api })\n return () => {\n const children = slots.default?.() ?? []\n // 没写分隔符插槽时原样交出去,不摊平:摊平会打散 v-for 的片段,白白丢掉它的复用信息\n const content = slots.split ? interleave(flexItems(children), slots.split) : children\n return h('div', api.value.getRootProps() as Record<string, unknown>, content)\n }\n },\n})\n"],"mappings":";;;;;;;;;AAkBA,MAAa,cAAc,gBAAgB;CACzC,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACpG;AACF,CAAC;;;;;;;AAQD,SAAS,UAAU,OAAkC;CACnD,MAAM,QAAiB,CAAC;CACxB,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,SAAS,SAChB;EACF,IAAI,KAAK,SAAS,MAAM;GACtB,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC,CAAC,KAAK,MAAM,IACzC,MAAM,KAAK,IAAI;GACjB;EACF;EACA,IAAI,KAAK,SAAS,YAAY,MAAM,QAAQ,KAAK,QAAQ,GAAG;GAC1D,MAAM,KAAK,GAAG,UAAU,KAAK,QAAmB,CAAC;GACjD;EACF;EACA,MAAM,KAAK,IAAI;CACjB;CACA,OAAO;AACT;;;;;AAMA,SAAS,WAAW,OAAyB,OAAsB;CACjE,MAAM,MAAe,CAAC;CACtB,MAAM,SAAS,MAAM,UAAU;EAC7B,IAAI,QAAQ,GACV,IAAI,KAAK,EAAE,aAAa,EAAE,KAAK,iBAAiB,QAAQ,SAAS,MAAM,CAAC,CAAC;EAC3E,IAAI,KAAK,IAAI;CACf,CAAC;CACD,OAAO;AACT;AAEA,MAAa,SAAS,gBAAgB;CACpC,MAAM;CAEN,OAAO;EACL,aAAa,EAAE,MAAM,OAA6C;EAClE,OAAO,EAAE,MAAM,OAAuC;EACtD,SAAS,EAAE,MAAM,OAAyC;EAC1D,KAAK,EAAE,MAAM,OAAqC;EAClD,MAAM;EACN,QAAQ;CACV;CACA,OAAO;CAMP,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,eAAe,YAAY,OAAoB,YAAY,CAAC;EACxE,YAAY,EAAE,IAAI,CAAC;EACnB,aAAa;GACX,MAAM,WAAW,MAAM,UAAU,KAAK,CAAC;GAEvC,MAAM,UAAU,MAAM,QAAQ,WAAW,UAAU,QAAQ,GAAG,MAAM,KAAK,IAAI;GAC7E,OAAO,EAAE,OAAO,IAAI,MAAM,aAAa,GAA8B,OAAO;EAC9E;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"flex.js","names":[],"sources":["../../../src/components/flex/flex.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 flex 相关实现。\n\nimport type { FlexProps } from '@xihan-ui/headless'\nimport type { PropType, Slot, SlotsType, VNode } from 'vue'\nimport { connectFlex } from '@xihan-ui/headless'\nimport { Comment, computed, defineComponent, Fragment, h, Text } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { provideFlex, useFlexContext } from './context'\n\n/**\n * 分隔符部件。写 `split` 插槽时组件在每道缝隙中自动铺设一个,\n * 手写它也能得到同一种结构:两条路径产出的 DOM 完全一致。\n */\nexport const XhFlexSplit = defineComponent({\n name: 'XhFlexSplit',\n setup(_, { slots }) {\n const ctx = useFlexContext()\n return () => h('span', ctx.api.value.getSplitProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 把默认插槽摊平为一个个子项。\n *\n * `v-for` 产出的是一个片段而不是若干节点,不摊平就整段算一个子项,分隔符只会插在整段的两端;\n * `v-if` 为假留下的注释节点与模板缩进留下的空白文本不渲染任何像素,保留会插出两条相邻的分隔符。\n */\nfunction flexItems(nodes: readonly VNode[]): VNode[] {\n const items: VNode[] = []\n for (const node of nodes) {\n if (node.type === Comment)\n continue\n if (node.type === Text) {\n if (String(node.children ?? '').trim() !== '')\n items.push(node)\n continue\n }\n if (node.type === Fragment && Array.isArray(node.children)) {\n items.push(...flexItems(node.children as VNode[]))\n continue\n }\n items.push(node)\n }\n return items\n}\n\n/**\n * 在每两个子项之间铺设一个分隔符部件。\n * 插槽逐缝隙重新求值:同一份 vnode 挂在两处会被后一处替换。\n */\nfunction interleave(items: readonly VNode[], split: Slot): VNode[] {\n const out: VNode[] = []\n items.forEach((item, index) => {\n if (index > 0)\n out.push(h(XhFlexSplit, { key: `xh-flex-split-${index}` }, () => split()))\n out.push(item)\n })\n return out\n}\n\nexport const XhFlex = defineComponent({\n name: 'XhFlex',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n // 四条排版轴都兼收断点对象,逐档写各自的取值\n orientation: { type: [String, Object] as PropType<FlexProps['orientation']> },\n align: { type: [String, Object] as PropType<FlexProps['align']> },\n justify: { type: [String, Object] as PropType<FlexProps['justify']> },\n gap: { type: [String, Object] as PropType<FlexProps['gap']> },\n wrap: Boolean,\n inline: Boolean,\n },\n slots: Object as SlotsType<{\n /** 子项,按写入的顺序排列。 */\n default?: () => VNode[]\n /** 分隔符的内容:写了它,组件在每两个子项之间各铺设一个分隔符部件,逐缝隙重新求值一次。 */\n split?: () => VNode[]\n }>,\n setup(props, { slots }) {\n const api = computed(() => connectFlex(props as FlexProps, vueNormalize))\n provideFlex({ api })\n return () => {\n const children = slots.default?.() ?? []\n // 没写分隔符插槽时原样交出去,不摊平:摊平会打散 v-for 的片段,白白丢掉它的复用信息\n const content = slots.split ? interleave(flexItems(children), slots.split) : children\n return h('div', api.value.getRootProps() as Record<string, unknown>, content)\n }\n },\n})\n"],"mappings":";;;;;;;;;AAkBA,MAAa,cAAc,gBAAgB;CACzC,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACpG;AACF,CAAC;;;;;;;AAQD,SAAS,UAAU,OAAkC;CACnD,MAAM,QAAiB,CAAC;CACxB,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,SAAS,SAChB;EACF,IAAI,KAAK,SAAS,MAAM;GACtB,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC,CAAC,KAAK,MAAM,IACzC,MAAM,KAAK,IAAI;GACjB;EACF;EACA,IAAI,KAAK,SAAS,YAAY,MAAM,QAAQ,KAAK,QAAQ,GAAG;GAC1D,MAAM,KAAK,GAAG,UAAU,KAAK,QAAmB,CAAC;GACjD;EACF;EACA,MAAM,KAAK,IAAI;CACjB;CACA,OAAO;AACT;;;;;AAMA,SAAS,WAAW,OAAyB,OAAsB;CACjE,MAAM,MAAe,CAAC;CACtB,MAAM,SAAS,MAAM,UAAU;EAC7B,IAAI,QAAQ,GACV,IAAI,KAAK,EAAE,aAAa,EAAE,KAAK,iBAAiB,QAAQ,SAAS,MAAM,CAAC,CAAC;EAC3E,IAAI,KAAK,IAAI;CACf,CAAC;CACD,OAAO;AACT;AAEA,MAAa,SAAS,gBAAgB;CACpC,MAAM;CAEN,OAAO;EAEL,aAAa,EAAE,MAAM,CAAC,QAAQ,MAAM,EAAwC;EAC5E,OAAO,EAAE,MAAM,CAAC,QAAQ,MAAM,EAAkC;EAChE,SAAS,EAAE,MAAM,CAAC,QAAQ,MAAM,EAAoC;EACpE,KAAK,EAAE,MAAM,CAAC,QAAQ,MAAM,EAAgC;EAC5D,MAAM;EACN,QAAQ;CACV;CACA,OAAO;CAMP,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,eAAe,YAAY,OAAoB,YAAY,CAAC;EACxE,YAAY,EAAE,IAAI,CAAC;EACnB,aAAa;GACX,MAAM,WAAW,MAAM,UAAU,KAAK,CAAC;GAEvC,MAAM,UAAU,MAAM,QAAQ,WAAW,UAAU,QAAQ,GAAG,MAAM,KAAK,IAAI;GAC7E,OAAO,EAAE,OAAO,IAAI,MAAM,aAAa,GAA8B,OAAO;EAC9E;CACF;AACF,CAAC"}
@@ -3,8 +3,8 @@ import { PropType, SlotsType, VNode } from "vue";
3
3
  import { FormApi, FormColumns, FormErrorPatch, FormFieldSpan, FormPath, FormSchema, FormValidateOn, FormValues } from "@xihan-ui/headless";
4
4
  //#region src/components/form/form.d.ts
5
5
  type FormProps = FormSchema['props'];
6
- /** 默认插槽的载荷:整表的值与错误、校验态,以及逐字段读写、清错、提交、重置的命令。 */
7
- type FormRootSlotProps = Pick<FormApi, 'values' | 'errors' | 'errorNames' | 'invalid' | 'submitFailed' | 'validating' | 'validationError' | 'getFieldId' | 'getFieldError' | 'setFieldValue' | 'setFieldError' | 'clearErrors' | 'submit' | 'reset'>;
6
+ /** 默认插槽的载荷:整表的值与错误、校验与提交在途、改动与触碰,以及逐字段读写、清错、校验、提交、重置的命令。 */
7
+ type FormRootSlotProps = Pick<FormApi, 'values' | 'errors' | 'errorNames' | 'invalid' | 'submitFailed' | 'validating' | 'submitting' | 'dirty' | 'validationError' | 'getFieldId' | 'getFieldError' | 'isFieldDirty' | 'isFieldTouched' | 'setFieldValue' | 'setFieldError' | 'clearErrors' | 'submit' | 'validateAll' | 'validateField' | 'validateFields' | 'resetField' | 'reset'>;
8
8
  /** 字段容器默认插槽的载荷:该字段的名字、值、错误与控件 id,以及写值的命令。 */
9
9
  interface FormFieldGroupSlotProps {
10
10
  name: FormPath;
@@ -61,13 +61,20 @@ declare const XhFormRoot: import("vue").DefineComponent<import("vue").ExtractPro
61
61
  };
62
62
  disabled: BooleanConstructor;
63
63
  readOnly: BooleanConstructor;
64
+ /**
65
+ * 校验通过才调用。返回 thenable 期间 submitting 为真、再提交不发生,拒绝经 submit-error 报出。
66
+ * 模板中照常写 @submit,Vue 会把它落到该 prop 上。
67
+ */
68
+ onSubmit: {
69
+ type: PropType<FormProps["onSubmit"]>;
70
+ };
64
71
  }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
65
72
  [key: string]: any;
66
73
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
67
74
  'values-change': (_details: PayloadOf<FormProps, "onValuesChange">) => true;
68
75
  'errors-change': (_details: PayloadOf<FormProps, "onErrorsChange">) => true;
69
- submit: (_details: PayloadOf<FormProps, "onSubmit">) => true;
70
76
  invalid: (_details: PayloadOf<FormProps, "onInvalid">) => true;
77
+ 'submit-error': (_details: PayloadOf<FormProps, "onSubmitError">) => true;
71
78
  'validation-error': (_details: PayloadOf<FormProps, "onValidationError">) => true;
72
79
  'update:values': (_values: PayloadOf<FormProps, "onValuesChange">["values"]) => true;
73
80
  'update:errors': (_errors: PayloadOf<FormProps, "onErrorsChange">["errors"]) => true;
@@ -111,11 +118,18 @@ declare const XhFormRoot: import("vue").DefineComponent<import("vue").ExtractPro
111
118
  };
112
119
  disabled: BooleanConstructor;
113
120
  readOnly: BooleanConstructor;
121
+ /**
122
+ * 校验通过才调用。返回 thenable 期间 submitting 为真、再提交不发生,拒绝经 submit-error 报出。
123
+ * 模板中照常写 @submit,Vue 会把它落到该 prop 上。
124
+ */
125
+ onSubmit: {
126
+ type: PropType<FormProps["onSubmit"]>;
127
+ };
114
128
  }>> & Readonly<{
115
129
  onInvalid?: ((_details: import("@xihan-ui/headless").FormInvalidDetails) => any) | undefined;
116
- onSubmit?: ((_details: import("@xihan-ui/headless").FormSubmitDetails) => any) | undefined;
117
130
  "onValues-change"?: ((_details: import("@xihan-ui/headless").FormValuesChangeDetails) => any) | undefined;
118
131
  "onErrors-change"?: ((_details: import("@xihan-ui/headless").FormErrorsChangeDetails) => any) | undefined;
132
+ "onSubmit-error"?: ((_details: import("@xihan-ui/headless").FormSubmitErrorDetails) => any) | undefined;
119
133
  "onValidation-error"?: ((_details: import("@xihan-ui/headless").FormValidationErrorDetails) => any) | undefined;
120
134
  "onUpdate:values"?: ((_values: FormValues) => any) | undefined;
121
135
  "onUpdate:errors"?: ((_errors: import("@xihan-ui/headless").FormErrors) => any) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"form.d.ts","names":[],"sources":["../../../src/components/form/form.ts"],"mappings":";;;;KAcK,YAAY;;KAGL,oBAAoB,KAC9B;;UAkBe;EACf,MAAM;EACN;EACA;EACA;EACA;EACA,WAAW;;;KAID,4BAA4B,KAAK;;UAG5B;EACf,MAAM;EACN;;cAGW,0BAAU,8BAAA;;IAIO,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IAChB,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACE,MAAA,SAAS;;;IACf,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;IAEE,MAAA,SAAS;;;;;;IAEhB,MAAA,SAAS;;;;;;;EAMX,kBAAA,UAAA,UAAU;EACV,kBAAA,UAAA,UAAU;EACjB,SAAA,UAAA,UAAU;EACT,UAAA,UAAA,UAAU;EACD,qBAAA,UAAA,UAAU;EACd,kBAAA,SAAA,UAAU;EACV,kBAAA,SAAA,UAAU;;;IAxBX,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IAChB,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACE,MAAA,SAAS;;;IACf,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;IAEE,MAAA,SAAS;;;;;;IAEhB,MAAA,SAAS;;;;;;;;;;;;;;;;EAe7B,WAAC,OAAO,sBAAsB;kCAuC1C;cAEW,gCAAgB,8BAAA;;;IAIQ,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;;;IAFV,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;EAGjC,WAAC,OAAO,4BAA4B;kCAoBhD;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;;EAGjB,WAAC,OAAO,8BAA8B;kCAUlD;cAEW,sCAAsB,8BAAA;;;IAIE,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;EAGhC,WAAC,OAAO,kCAAkC;kCAWtD;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"form.d.ts","names":[],"sources":["../../../src/components/form/form.ts"],"mappings":";;;;KAcK,YAAY;;KAGL,oBAAoB,KAC9B;;UA0Be;EACf,MAAM;EACN;EACA;EACA;EACA;EACA,WAAW;;;KAID,4BAA4B,KAAK;;UAG5B;EACf,MAAM;EACN;;cAGW,0BAAU,8BAAA;;IAIO,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IAChB,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACE,MAAA,SAAS;;;IACf,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;IAEE,MAAA,SAAS;;;;;;IAEhB,MAAA,SAAS;;;;;;;;;IAOT,MAAA,SAAS;;;;;EAIX,kBAAA,UAAA,UAAU;EACV,kBAAA,UAAA,UAAU;EAChB,UAAA,UAAA,UAAU;EACL,iBAAA,UAAA,UAAU;EACN,qBAAA,UAAA,UAAU;EACd,kBAAA,SAAA,UAAU;EACV,kBAAA,SAAA,UAAU;;;IA7BX,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IAChB,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACE,MAAA,SAAS;;;IACf,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;IAEE,MAAA,SAAS;;;;;;IAEhB,MAAA,SAAS;;;;;;;;;IAOT,MAAA,SAAS;;;;;;;;;;;;;;EAa7B,WAAC,OAAO,sBAAsB;kCAiD1C;cAEW,gCAAgB,8BAAA;;;IAIQ,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;;;IAFV,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;EAGjC,WAAC,OAAO,4BAA4B;kCAoBhD;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;;EAGjB,WAAC,OAAO,8BAA8B;kCAWlD;cAEW,sCAAsB,8BAAA;;;IAIE,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;EAGhC,WAAC,OAAO,kCAAkC;kCAWtD;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -19,13 +19,18 @@ const XhFormRoot = defineComponent({
19
19
  labelWidth: { type: [Number, String] },
20
20
  labelAlign: { type: String },
21
21
  disabled: Boolean,
22
- readOnly: Boolean
22
+ readOnly: Boolean,
23
+ /**
24
+ * 校验通过才调用。返回 thenable 期间 submitting 为真、再提交不发生,拒绝经 submit-error 报出。
25
+ * 模板中照常写 @submit,Vue 会把它落到该 prop 上。
26
+ */
27
+ onSubmit: { type: Function }
23
28
  },
24
29
  emits: {
25
30
  "values-change": (_details) => true,
26
31
  "errors-change": (_details) => true,
27
- "submit": (_details) => true,
28
32
  "invalid": (_details) => true,
33
+ "submit-error": (_details) => true,
29
34
  "validation-error": (_details) => true,
30
35
  "update:values": (_values) => true,
31
36
  "update:errors": (_errors) => true
@@ -41,7 +46,8 @@ const XhFormRoot = defineComponent({
41
46
  emit("errors-change", details);
42
47
  emit("update:errors", details.errors);
43
48
  },
44
- onSubmit: (details) => emit("submit", details),
49
+ onSubmit: (details) => props.onSubmit?.(details),
50
+ onSubmitError: (details) => emit("submit-error", details),
45
51
  onInvalid: (details) => emit("invalid", details),
46
52
  onValidationError: (details) => emit("validation-error", details)
47
53
  });
@@ -58,13 +64,21 @@ const XhFormRoot = defineComponent({
58
64
  invalid: ctx.api.value.invalid,
59
65
  submitFailed: ctx.api.value.submitFailed,
60
66
  validating: ctx.api.value.validating,
67
+ submitting: ctx.api.value.submitting,
68
+ dirty: ctx.api.value.dirty,
61
69
  validationError: ctx.api.value.validationError,
62
70
  getFieldId: ctx.api.value.getFieldId,
63
71
  getFieldError: ctx.api.value.getFieldError,
72
+ isFieldDirty: ctx.api.value.isFieldDirty,
73
+ isFieldTouched: ctx.api.value.isFieldTouched,
64
74
  setFieldValue: ctx.setFieldValue,
65
75
  setFieldError: ctx.setFieldError,
66
76
  clearErrors: ctx.clearErrors,
67
77
  submit: ctx.submit,
78
+ validateAll: ctx.validateAll,
79
+ validateField: ctx.validateField,
80
+ validateFields: ctx.validateFields,
81
+ resetField: ctx.resetField,
68
82
  reset: ctx.reset
69
83
  }));
70
84
  }
@@ -103,9 +117,9 @@ const XhFormErrorSummary = defineComponent({
103
117
  setup(_, { slots }) {
104
118
  const ctx = useFormContext();
105
119
  return () => h("div", ctx.api.value.getErrorSummaryProps(), slots.default?.({
106
- errors: ctx.api.value.errors,
107
- errorNames: ctx.api.value.errorNames,
108
- errorCount: ctx.api.value.errorCount
120
+ errors: ctx.api.value.summaryErrors,
121
+ errorNames: ctx.api.value.summaryErrorNames,
122
+ errorCount: ctx.api.value.summaryErrorCount
109
123
  }));
110
124
  }
111
125
  });
@@ -122,7 +136,7 @@ name: {
122
136
  const ctx = useFormContext();
123
137
  return () => h("a", ctx.api.value.getErrorSummaryItemProps({ name: props.name }), slots.default?.({
124
138
  name: props.name,
125
- error: ctx.api.value.getFieldError(props.name)
139
+ error: ctx.api.value.getSummaryError(props.name)
126
140
  }));
127
141
  }
128
142
  });
@@ -1 +1 @@
1
- {"version":3,"file":"form.js","names":[],"sources":["../../../src/components/form/form.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 form 相关实现。\n\nimport type { FormApi, FormColumns, FormErrorPatch, FormFieldSpan, FormPath, FormSchema, FormValidateOn, FormValues } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { provideForm, provideFormField, useFormContext } from './context'\nimport { useForm } from './use-form'\n\ntype FormProps = FormSchema['props']\n\n/** 默认插槽的载荷:整表的值与错误、校验态,以及逐字段读写、清错、提交、重置的命令。 */\nexport type FormRootSlotProps = Pick<\n FormApi,\n | 'values'\n | 'errors'\n | 'errorNames'\n | 'invalid'\n | 'submitFailed'\n | 'validating'\n | 'validationError'\n | 'getFieldId'\n | 'getFieldError'\n | 'setFieldValue'\n | 'setFieldError'\n | 'clearErrors'\n | 'submit'\n | 'reset'\n>\n\n/** 字段容器默认插槽的载荷:该字段的名字、值、错误与控件 id,以及写值的命令。 */\nexport interface FormFieldGroupSlotProps {\n name: FormPath\n value: unknown\n error: string | undefined\n invalid: boolean\n controlId: string\n setValue: (next: unknown) => void\n}\n\n/** 错误摘要默认插槽的载荷:整表的错误、出错字段名与条数。 */\nexport type FormErrorSummarySlotProps = Pick<FormApi, 'errors' | 'errorNames' | 'errorCount'>\n\n/** 错误摘要单条默认插槽的载荷:该条指向的字段名与它的错误文案。 */\nexport interface FormErrorSummaryItemSlotProps {\n name: FormPath\n error: string | undefined\n}\n\nexport const XhFormRoot = defineComponent({\n name: 'XhFormRoot',\n // 缺省值由 connect 与机器给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n values: { type: Object as PropType<FormValues> },\n defaultValues: { type: Object as PropType<FormValues> },\n errors: { type: Object as PropType<FormErrorPatch> },\n defaultErrors: { type: Object as PropType<FormErrorPatch> },\n validate: { type: Function as PropType<FormProps['validate']> },\n rules: { type: Object as PropType<FormProps['rules']> },\n validateMessages: { type: Object as PropType<FormProps['validateMessages']> },\n validateOn: { type: String as PropType<FormValidateOn> },\n layout: { type: String as PropType<FormProps['layout']> },\n /** grid 排布下分几列:整数即各档同一个列数,断点对象 `{ base, sm, md, lg, xl }` 则逐档取值。 */\n columns: { type: [Number, Object] as PropType<FormColumns> },\n labelWidth: { type: [Number, String] },\n labelAlign: { type: String as PropType<FormProps['labelAlign']> },\n disabled: Boolean,\n readOnly: Boolean,\n },\n // *-change 携带 details 对象,update:* 携带裸表;submit 与 invalid 按校验结果二选一\n emits: {\n 'values-change': (_details: PayloadOf<FormProps, 'onValuesChange'>) => true,\n 'errors-change': (_details: PayloadOf<FormProps, 'onErrorsChange'>) => true,\n 'submit': (_details: PayloadOf<FormProps, 'onSubmit'>) => true,\n 'invalid': (_details: PayloadOf<FormProps, 'onInvalid'>) => true,\n 'validation-error': (_details: PayloadOf<FormProps, 'onValidationError'>) => true,\n 'update:values': (_values: PayloadOf<FormProps, 'onValuesChange'>['values']) => true,\n 'update:errors': (_errors: PayloadOf<FormProps, 'onErrorsChange'>['errors']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: FormRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useForm(props as FormProps, {\n onValuesChange: (details) => {\n emit('values-change', details)\n emit('update:values', details.values)\n },\n onErrorsChange: (details) => {\n emit('errors-change', details)\n emit('update:errors', details.errors)\n },\n onSubmit: details => emit('submit', details),\n onInvalid: details => emit('invalid', details),\n onValidationError: details => emit('validation-error', details),\n })\n provideForm(ctx)\n\n // 根节点渲染为原生 form,隐式提交与 submit 事件都依赖它\n return () => h('form', {\n ...ctx.api.value.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, slots.default?.({\n values: ctx.api.value.values,\n errors: ctx.api.value.errors,\n errorNames: ctx.api.value.errorNames,\n invalid: ctx.api.value.invalid,\n submitFailed: ctx.api.value.submitFailed,\n validating: ctx.api.value.validating,\n validationError: ctx.api.value.validationError,\n getFieldId: ctx.api.value.getFieldId,\n getFieldError: ctx.api.value.getFieldError,\n setFieldValue: ctx.setFieldValue,\n setFieldError: ctx.setFieldError,\n clearErrors: ctx.clearErrors,\n submit: ctx.submit,\n reset: ctx.reset,\n }))\n },\n})\n\nexport const XhFormFieldGroup = defineComponent({\n name: 'XhFormFieldGroup',\n props: {\n /** 字段路径;字符串含点仍是单键,数组才表示层级。 */\n name: { type: [String, Array] as PropType<FormPath>, required: true },\n /** grid 排布下该格占多宽:1 至 4 跨相应列数,'full' 占满整行;未写时占一列。 */\n span: { type: [Number, String] as PropType<FormFieldSpan> },\n },\n slots: Object as SlotsType<{\n default?: (props: FormFieldGroupSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useFormContext()\n // 后代 Field 据此从表单上下文自取校验态,省掉逐字段搬运\n provideFormField({ name: () => props.name })\n // 作用域插槽暴露本字段的值、错误与写入方法\n return () => h(\n 'div',\n ctx.api.value.getFieldGroupProps({ name: props.name, span: props.span }) as Record<string, unknown>,\n slots.default?.({\n name: props.name,\n value: ctx.api.value.getFieldValue(props.name),\n error: ctx.api.value.getFieldError(props.name),\n invalid: ctx.api.value.isFieldInvalid(props.name),\n controlId: ctx.api.value.getFieldId(props.name),\n setValue: (next: unknown) => ctx.setFieldValue(props.name, next),\n }),\n )\n },\n})\n\nexport const XhFormErrorSummary = defineComponent({\n name: 'XhFormErrorSummary',\n slots: Object as SlotsType<{\n default?: (props: FormErrorSummarySlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useFormContext()\n return () => h('div', ctx.api.value.getErrorSummaryProps() as Record<string, unknown>, slots.default?.({\n errors: ctx.api.value.errors,\n errorNames: ctx.api.value.errorNames,\n errorCount: ctx.api.value.errorCount,\n }))\n },\n})\n\nexport const XhFormErrorSummaryItem = defineComponent({\n name: 'XhFormErrorSummaryItem',\n props: {\n /** 该条指向哪个字段路径。 */\n name: { type: [String, Array] as PropType<FormPath>, required: true },\n },\n slots: Object as SlotsType<{\n default?: (props: FormErrorSummaryItemSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useFormContext()\n // 渲染为原生 a,href 指向字段容器的 id\n return () => h(\n 'a',\n ctx.api.value.getErrorSummaryItemProps({ name: props.name }) as Record<string, unknown>,\n slots.default?.({ name: props.name, error: ctx.api.value.getFieldError(props.name) }),\n )\n },\n})\n\nexport const XhFormSubmitTrigger = defineComponent({\n name: 'XhFormSubmitTrigger',\n setup(_, { slots }) {\n const ctx = useFormContext()\n return () => h('button', ctx.api.value.getSubmitTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFormResetTrigger = defineComponent({\n name: 'XhFormResetTrigger',\n setup(_, { slots }) {\n const ctx = useFormContext()\n return () => h('button', ctx.api.value.getResetTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"form.js","names":[],"sources":["../../../src/components/form/form.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 form 相关实现。\n\nimport type { FormApi, FormColumns, FormErrorPatch, FormFieldSpan, FormPath, FormSchema, FormValidateOn, FormValues } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { provideForm, provideFormField, useFormContext } from './context'\nimport { useForm } from './use-form'\n\ntype FormProps = FormSchema['props']\n\n/** 默认插槽的载荷:整表的值与错误、校验与提交在途、改动与触碰,以及逐字段读写、清错、校验、提交、重置的命令。 */\nexport type FormRootSlotProps = Pick<\n FormApi,\n | 'values'\n | 'errors'\n | 'errorNames'\n | 'invalid'\n | 'submitFailed'\n | 'validating'\n | 'submitting'\n | 'dirty'\n | 'validationError'\n | 'getFieldId'\n | 'getFieldError'\n | 'isFieldDirty'\n | 'isFieldTouched'\n | 'setFieldValue'\n | 'setFieldError'\n | 'clearErrors'\n | 'submit'\n | 'validateAll'\n | 'validateField'\n | 'validateFields'\n | 'resetField'\n | 'reset'\n>\n\n/** 字段容器默认插槽的载荷:该字段的名字、值、错误与控件 id,以及写值的命令。 */\nexport interface FormFieldGroupSlotProps {\n name: FormPath\n value: unknown\n error: string | undefined\n invalid: boolean\n controlId: string\n setValue: (next: unknown) => void\n}\n\n/** 错误摘要默认插槽的载荷:整表的错误、出错字段名与条数。 */\nexport type FormErrorSummarySlotProps = Pick<FormApi, 'errors' | 'errorNames' | 'errorCount'>\n\n/** 错误摘要单条默认插槽的载荷:该条指向的字段名与它的错误文案。 */\nexport interface FormErrorSummaryItemSlotProps {\n name: FormPath\n error: string | undefined\n}\n\nexport const XhFormRoot = defineComponent({\n name: 'XhFormRoot',\n // 缺省值由 connect 与机器给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n values: { type: Object as PropType<FormValues> },\n defaultValues: { type: Object as PropType<FormValues> },\n errors: { type: Object as PropType<FormErrorPatch> },\n defaultErrors: { type: Object as PropType<FormErrorPatch> },\n validate: { type: Function as PropType<FormProps['validate']> },\n rules: { type: Object as PropType<FormProps['rules']> },\n validateMessages: { type: Object as PropType<FormProps['validateMessages']> },\n validateOn: { type: String as PropType<FormValidateOn> },\n layout: { type: String as PropType<FormProps['layout']> },\n /** grid 排布下分几列:整数即各档同一个列数,断点对象 `{ base, sm, md, lg, xl }` 则逐档取值。 */\n columns: { type: [Number, Object] as PropType<FormColumns> },\n labelWidth: { type: [Number, String] },\n labelAlign: { type: String as PropType<FormProps['labelAlign']> },\n disabled: Boolean,\n readOnly: Boolean,\n /**\n * 校验通过才调用。返回 thenable 期间 submitting 为真、再提交不发生,拒绝经 submit-error 报出。\n * 模板中照常写 @submit,Vue 会把它落到该 prop 上。\n */\n onSubmit: { type: Function as PropType<FormProps['onSubmit']> },\n },\n // *-change 携带 details 对象,update:* 携带裸表;submit 与 invalid 按校验结果二选一\n emits: {\n 'values-change': (_details: PayloadOf<FormProps, 'onValuesChange'>) => true,\n 'errors-change': (_details: PayloadOf<FormProps, 'onErrorsChange'>) => true,\n 'invalid': (_details: PayloadOf<FormProps, 'onInvalid'>) => true,\n 'submit-error': (_details: PayloadOf<FormProps, 'onSubmitError'>) => true,\n 'validation-error': (_details: PayloadOf<FormProps, 'onValidationError'>) => true,\n 'update:values': (_values: PayloadOf<FormProps, 'onValuesChange'>['values']) => true,\n 'update:errors': (_errors: PayloadOf<FormProps, 'onErrorsChange'>['errors']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: FormRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useForm(props as FormProps, {\n onValuesChange: (details) => {\n emit('values-change', details)\n emit('update:values', details.values)\n },\n onErrorsChange: (details) => {\n emit('errors-change', details)\n emit('update:errors', details.errors)\n },\n // 返回值要交给机器:thenable 即进入提交在途\n onSubmit: details => props.onSubmit?.(details),\n onSubmitError: details => emit('submit-error', details),\n onInvalid: details => emit('invalid', details),\n onValidationError: details => emit('validation-error', details),\n })\n provideForm(ctx)\n\n // 根节点渲染为原生 form,隐式提交与 submit 事件都依赖它\n return () => h('form', {\n ...ctx.api.value.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, slots.default?.({\n values: ctx.api.value.values,\n errors: ctx.api.value.errors,\n errorNames: ctx.api.value.errorNames,\n invalid: ctx.api.value.invalid,\n submitFailed: ctx.api.value.submitFailed,\n validating: ctx.api.value.validating,\n submitting: ctx.api.value.submitting,\n dirty: ctx.api.value.dirty,\n validationError: ctx.api.value.validationError,\n getFieldId: ctx.api.value.getFieldId,\n getFieldError: ctx.api.value.getFieldError,\n isFieldDirty: ctx.api.value.isFieldDirty,\n isFieldTouched: ctx.api.value.isFieldTouched,\n setFieldValue: ctx.setFieldValue,\n setFieldError: ctx.setFieldError,\n clearErrors: ctx.clearErrors,\n submit: ctx.submit,\n validateAll: ctx.validateAll,\n validateField: ctx.validateField,\n validateFields: ctx.validateFields,\n resetField: ctx.resetField,\n reset: ctx.reset,\n }))\n },\n})\n\nexport const XhFormFieldGroup = defineComponent({\n name: 'XhFormFieldGroup',\n props: {\n /** 字段路径;字符串含点仍是单键,数组才表示层级。 */\n name: { type: [String, Array] as PropType<FormPath>, required: true },\n /** grid 排布下该格占多宽:1 至 4 跨相应列数,'full' 占满整行;未写时占一列。 */\n span: { type: [Number, String] as PropType<FormFieldSpan> },\n },\n slots: Object as SlotsType<{\n default?: (props: FormFieldGroupSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useFormContext()\n // 后代 Field 据此从表单上下文自取校验态,省掉逐字段搬运\n provideFormField({ name: () => props.name })\n // 作用域插槽暴露本字段的值、错误与写入方法\n return () => h(\n 'div',\n ctx.api.value.getFieldGroupProps({ name: props.name, span: props.span }) as Record<string, unknown>,\n slots.default?.({\n name: props.name,\n value: ctx.api.value.getFieldValue(props.name),\n error: ctx.api.value.getFieldError(props.name),\n invalid: ctx.api.value.isFieldInvalid(props.name),\n controlId: ctx.api.value.getFieldId(props.name),\n setValue: (next: unknown) => ctx.setFieldValue(props.name, next),\n }),\n )\n },\n})\n\nexport const XhFormErrorSummary = defineComponent({\n name: 'XhFormErrorSummary',\n slots: Object as SlotsType<{\n default?: (props: FormErrorSummarySlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useFormContext()\n // 摘要读它自己那版错误表:退场途中文案与条数照撤下之前的写\n return () => h('div', ctx.api.value.getErrorSummaryProps() as Record<string, unknown>, slots.default?.({\n errors: ctx.api.value.summaryErrors,\n errorNames: ctx.api.value.summaryErrorNames,\n errorCount: ctx.api.value.summaryErrorCount,\n }))\n },\n})\n\nexport const XhFormErrorSummaryItem = defineComponent({\n name: 'XhFormErrorSummaryItem',\n props: {\n /** 该条指向哪个字段路径。 */\n name: { type: [String, Array] as PropType<FormPath>, required: true },\n },\n slots: Object as SlotsType<{\n default?: (props: FormErrorSummaryItemSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useFormContext()\n // 渲染为原生 a,href 指向字段容器的 id\n return () => h(\n 'a',\n ctx.api.value.getErrorSummaryItemProps({ name: props.name }) as Record<string, unknown>,\n slots.default?.({ name: props.name, error: ctx.api.value.getSummaryError(props.name) }),\n )\n },\n})\n\nexport const XhFormSubmitTrigger = defineComponent({\n name: 'XhFormSubmitTrigger',\n setup(_, { slots }) {\n const ctx = useFormContext()\n return () => h('button', ctx.api.value.getSubmitTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhFormResetTrigger = defineComponent({\n name: 'XhFormResetTrigger',\n setup(_, { slots }) {\n const ctx = useFormContext()\n return () => h('button', ctx.api.value.getResetTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}