@xihan-ui/vue 1.0.0-alpha.3 → 1.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 (458) hide show
  1. package/CHANGELOG.md +2057 -0
  2. package/dist/backgrounds.d.ts.map +1 -1
  3. package/dist/backgrounds.js +1 -5
  4. package/dist/backgrounds.js.map +1 -1
  5. package/dist/behavior.d.ts +38 -0
  6. package/dist/behavior.d.ts.map +1 -0
  7. package/dist/behavior.js +74 -0
  8. package/dist/behavior.js.map +1 -0
  9. package/dist/components/accordion/accordion.d.ts +1 -1
  10. package/dist/components/accordion/context.js +2 -2
  11. package/dist/components/accordion/context.js.map +1 -1
  12. package/dist/components/affix/context.js +1 -1
  13. package/dist/components/affix/context.js.map +1 -1
  14. package/dist/components/alert/context.js +1 -1
  15. package/dist/components/alert/context.js.map +1 -1
  16. package/dist/components/anchor/anchor.d.ts +2 -2
  17. package/dist/components/anchor/context.js +1 -1
  18. package/dist/components/anchor/context.js.map +1 -1
  19. package/dist/components/avatar/context.js +1 -1
  20. package/dist/components/avatar/context.js.map +1 -1
  21. package/dist/components/avatar-group/context.js +1 -1
  22. package/dist/components/avatar-group/context.js.map +1 -1
  23. package/dist/components/back-top/back-top.d.ts +2 -2
  24. package/dist/components/back-top/context.js +1 -1
  25. package/dist/components/back-top/context.js.map +1 -1
  26. package/dist/components/badge/badge.d.ts +142 -50
  27. package/dist/components/badge/badge.d.ts.map +1 -1
  28. package/dist/components/badge/badge.js +67 -37
  29. package/dist/components/badge/badge.js.map +1 -1
  30. package/dist/components/badge/context.js +15 -0
  31. package/dist/components/badge/context.js.map +1 -0
  32. package/dist/components/breadcrumb/breadcrumb.d.ts +1 -1
  33. package/dist/components/breadcrumb/context.js +1 -1
  34. package/dist/components/breadcrumb/context.js.map +1 -1
  35. package/dist/components/button-group/button-group.d.ts +1 -1
  36. package/dist/components/calendar/context.js +2 -2
  37. package/dist/components/calendar/context.js.map +1 -1
  38. package/dist/components/card/card.d.ts +1 -1
  39. package/dist/components/card/context.js +1 -1
  40. package/dist/components/card/context.js.map +1 -1
  41. package/dist/components/carousel/context.js +1 -1
  42. package/dist/components/carousel/context.js.map +1 -1
  43. package/dist/components/cascader/cascader.d.ts +4 -4
  44. package/dist/components/cascader/cascader.d.ts.map +1 -1
  45. package/dist/components/cascader/cascader.js +14 -4
  46. package/dist/components/cascader/cascader.js.map +1 -1
  47. package/dist/components/cascader/context.js +2 -2
  48. package/dist/components/cascader/context.js.map +1 -1
  49. package/dist/components/cascader/use-cascader.js +1 -1
  50. package/dist/components/cascader/use-cascader.js.map +1 -1
  51. package/dist/components/checkbox-group/context.js +2 -2
  52. package/dist/components/checkbox-group/context.js.map +1 -1
  53. package/dist/components/clipboard/context.js +1 -1
  54. package/dist/components/clipboard/context.js.map +1 -1
  55. package/dist/components/collapsible/context.js +1 -1
  56. package/dist/components/collapsible/context.js.map +1 -1
  57. package/dist/components/color-picker/color-picker.d.ts +12 -3
  58. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  59. package/dist/components/color-picker/color-picker.js +7 -1
  60. package/dist/components/color-picker/color-picker.js.map +1 -1
  61. package/dist/components/color-picker/context.js +2 -2
  62. package/dist/components/color-picker/context.js.map +1 -1
  63. package/dist/components/color-picker/use-color-picker.js +1 -1
  64. package/dist/components/color-picker/use-color-picker.js.map +1 -1
  65. package/dist/components/combobox/combobox.d.ts +3 -3
  66. package/dist/components/combobox/combobox.d.ts.map +1 -1
  67. package/dist/components/combobox/combobox.js +10 -4
  68. package/dist/components/combobox/combobox.js.map +1 -1
  69. package/dist/components/combobox/context.js +3 -3
  70. package/dist/components/combobox/context.js.map +1 -1
  71. package/dist/components/combobox/use-combobox.js +1 -1
  72. package/dist/components/combobox/use-combobox.js.map +1 -1
  73. package/dist/components/composer/context.js +1 -1
  74. package/dist/components/composer/context.js.map +1 -1
  75. package/dist/components/context-menu/context-menu.d.ts +4 -4
  76. package/dist/components/context-menu/context-menu.d.ts.map +1 -1
  77. package/dist/components/context-menu/context-menu.js +3 -1
  78. package/dist/components/context-menu/context-menu.js.map +1 -1
  79. package/dist/components/context-menu/context.js +5 -5
  80. package/dist/components/context-menu/context.js.map +1 -1
  81. package/dist/components/context-menu/use-context-menu.js +1 -1
  82. package/dist/components/context-menu/use-context-menu.js.map +1 -1
  83. package/dist/components/date-field/context.js +1 -1
  84. package/dist/components/date-field/context.js.map +1 -1
  85. package/dist/components/date-field/date-field.d.ts +2 -2
  86. package/dist/components/date-picker/context.js +13 -4
  87. package/dist/components/date-picker/context.js.map +1 -1
  88. package/dist/components/date-picker/date-picker.d.ts +80 -44
  89. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  90. package/dist/components/date-picker/date-picker.js +68 -26
  91. package/dist/components/date-picker/date-picker.js.map +1 -1
  92. package/dist/components/date-picker/use-date-picker.js +1 -1
  93. package/dist/components/date-picker/use-date-picker.js.map +1 -1
  94. package/dist/components/descriptions/context.js +1 -1
  95. package/dist/components/descriptions/context.js.map +1 -1
  96. package/dist/components/dialog/context.js +1 -1
  97. package/dist/components/dialog/context.js.map +1 -1
  98. package/dist/components/dialog/dialog.d.ts +1 -1
  99. package/dist/components/drawer/context.js +1 -1
  100. package/dist/components/drawer/context.js.map +1 -1
  101. package/dist/components/drawer/drawer.d.ts +2 -2
  102. package/dist/components/dynamic-input/context.js +2 -2
  103. package/dist/components/dynamic-input/context.js.map +1 -1
  104. package/dist/components/editable/context.js +1 -1
  105. package/dist/components/editable/context.js.map +1 -1
  106. package/dist/components/empty-state/context.js +1 -1
  107. package/dist/components/empty-state/context.js.map +1 -1
  108. package/dist/components/field/context.d.ts +9 -0
  109. package/dist/components/field/context.d.ts.map +1 -0
  110. package/dist/components/field/context.js +6 -2
  111. package/dist/components/field/context.js.map +1 -1
  112. package/dist/components/field/field.d.ts +26 -2
  113. package/dist/components/field/field.d.ts.map +1 -1
  114. package/dist/components/field/field.js +15 -4
  115. package/dist/components/field/field.js.map +1 -1
  116. package/dist/components/field/use-field-control.d.ts +41 -0
  117. package/dist/components/field/use-field-control.d.ts.map +1 -0
  118. package/dist/components/field/use-field-control.js +77 -0
  119. package/dist/components/field/use-field-control.js.map +1 -0
  120. package/dist/components/fieldset/context.js +1 -1
  121. package/dist/components/fieldset/context.js.map +1 -1
  122. package/dist/components/file-upload/context.js +2 -2
  123. package/dist/components/file-upload/context.js.map +1 -1
  124. package/dist/components/flex/flex.d.ts +9 -0
  125. package/dist/components/flex/flex.d.ts.map +1 -1
  126. package/dist/components/flex/flex.js +4 -0
  127. package/dist/components/flex/flex.js.map +1 -1
  128. package/dist/components/float-button/context.js +1 -1
  129. package/dist/components/float-button/context.js.map +1 -1
  130. package/dist/components/float-button/float-button.d.ts +2 -2
  131. package/dist/components/floating-panel/context.js +1 -1
  132. package/dist/components/floating-panel/context.js.map +1 -1
  133. package/dist/components/floating-panel/floating-panel.d.ts +1 -1
  134. package/dist/components/form/context.js +2 -2
  135. package/dist/components/form/context.js.map +1 -1
  136. package/dist/components/grid/context.js +1 -1
  137. package/dist/components/grid/context.js.map +1 -1
  138. package/dist/components/heatmap/context.js +3 -3
  139. package/dist/components/heatmap/context.js.map +1 -1
  140. package/dist/components/heatmap/heatmap.d.ts +1 -1
  141. package/dist/components/hotkeys/hotkeys.d.ts +3 -1
  142. package/dist/components/hotkeys/hotkeys.d.ts.map +1 -1
  143. package/dist/components/hotkeys/hotkeys.js +7 -25
  144. package/dist/components/hotkeys/hotkeys.js.map +1 -1
  145. package/dist/components/hotkeys/use-hotkeys.d.ts +31 -0
  146. package/dist/components/hotkeys/use-hotkeys.d.ts.map +1 -0
  147. package/dist/components/hotkeys/use-hotkeys.js +60 -0
  148. package/dist/components/hotkeys/use-hotkeys.js.map +1 -0
  149. package/dist/components/hover-card/context.js +1 -1
  150. package/dist/components/hover-card/context.js.map +1 -1
  151. package/dist/components/hover-card/hover-card.d.ts +2 -2
  152. package/dist/components/hover-card/hover-card.d.ts.map +1 -1
  153. package/dist/components/hover-card/hover-card.js +3 -1
  154. package/dist/components/hover-card/hover-card.js.map +1 -1
  155. package/dist/components/hover-card/use-hover-card.js +1 -1
  156. package/dist/components/hover-card/use-hover-card.js.map +1 -1
  157. package/dist/components/icon/icon.d.ts +1 -1
  158. package/dist/components/icon-wrapper/icon-wrapper.d.ts +1 -1
  159. package/dist/components/image/context.js +1 -1
  160. package/dist/components/image/context.js.map +1 -1
  161. package/dist/components/image-cropper/context.js +1 -1
  162. package/dist/components/image-cropper/context.js.map +1 -1
  163. package/dist/components/image-cropper/image-cropper.d.ts +1 -1
  164. package/dist/components/image-viewer/context.js +1 -1
  165. package/dist/components/image-viewer/context.js.map +1 -1
  166. package/dist/components/image-viewer/image-viewer.d.ts +2 -2
  167. package/dist/components/infinite-scroll/context.js +1 -1
  168. package/dist/components/infinite-scroll/context.js.map +1 -1
  169. package/dist/components/infinite-scroll/infinite-scroll.d.ts +1 -1
  170. package/dist/components/json-viewer/json-viewer.d.ts +12 -3
  171. package/dist/components/json-viewer/json-viewer.d.ts.map +1 -1
  172. package/dist/components/json-viewer/json-viewer.js +23 -2
  173. package/dist/components/json-viewer/json-viewer.js.map +1 -1
  174. package/dist/components/layout/context.js +1 -1
  175. package/dist/components/layout/context.js.map +1 -1
  176. package/dist/components/list/context.js +1 -1
  177. package/dist/components/list/context.js.map +1 -1
  178. package/dist/components/list/list.d.ts +1 -1
  179. package/dist/components/listbox/context.js +3 -3
  180. package/dist/components/listbox/context.js.map +1 -1
  181. package/dist/components/loading-bar/context.js +1 -1
  182. package/dist/components/loading-bar/context.js.map +1 -1
  183. package/dist/components/log/context.js +1 -1
  184. package/dist/components/log/context.js.map +1 -1
  185. package/dist/components/marquee/context.js +1 -1
  186. package/dist/components/marquee/context.js.map +1 -1
  187. package/dist/components/mention/context.js +2 -2
  188. package/dist/components/mention/context.js.map +1 -1
  189. package/dist/components/mention/mention.d.ts +2 -2
  190. package/dist/components/mention/mention.d.ts.map +1 -1
  191. package/dist/components/mention/mention.js +10 -4
  192. package/dist/components/mention/mention.js.map +1 -1
  193. package/dist/components/mention/use-mention.js +1 -1
  194. package/dist/components/mention/use-mention.js.map +1 -1
  195. package/dist/components/menu/context.js +4 -4
  196. package/dist/components/menu/context.js.map +1 -1
  197. package/dist/components/menu/menu.d.ts +3 -3
  198. package/dist/components/menu/menu.d.ts.map +1 -1
  199. package/dist/components/menu/menu.js +3 -1
  200. package/dist/components/menu/menu.js.map +1 -1
  201. package/dist/components/menu/use-menu.js +1 -1
  202. package/dist/components/menu/use-menu.js.map +1 -1
  203. package/dist/components/menubar/context.js +6 -6
  204. package/dist/components/menubar/context.js.map +1 -1
  205. package/dist/components/menubar/menubar.d.ts +2 -2
  206. package/dist/components/menubar/menubar.js.map +1 -1
  207. package/dist/components/navigation-menu/context.js +1 -1
  208. package/dist/components/navigation-menu/context.js.map +1 -1
  209. package/dist/components/navigation-menu/navigation-menu.d.ts +1 -1
  210. package/dist/components/notification/context.d.ts +23 -0
  211. package/dist/components/notification/context.d.ts.map +1 -0
  212. package/dist/components/notification/context.js +28 -0
  213. package/dist/components/notification/context.js.map +1 -0
  214. package/dist/components/notification/notification.d.ts +249 -0
  215. package/dist/components/notification/notification.d.ts.map +1 -0
  216. package/dist/components/notification/notification.js +179 -0
  217. package/dist/components/notification/notification.js.map +1 -0
  218. package/dist/components/notification/use-notification.d.ts +14 -0
  219. package/dist/components/notification/use-notification.d.ts.map +1 -0
  220. package/dist/components/notification/use-notification.js +42 -0
  221. package/dist/components/notification/use-notification.js.map +1 -0
  222. package/dist/components/number-animation/number-animation.d.ts +1 -1
  223. package/dist/components/number-field/context.js +1 -1
  224. package/dist/components/number-field/context.js.map +1 -1
  225. package/dist/components/number-field/number-field.d.ts +3 -3
  226. package/dist/components/number-field/number-field.d.ts.map +1 -1
  227. package/dist/components/number-field/number-field.js +7 -1
  228. package/dist/components/number-field/number-field.js.map +1 -1
  229. package/dist/components/page-header/context.js +1 -1
  230. package/dist/components/page-header/context.js.map +1 -1
  231. package/dist/components/pagination/context.js +1 -1
  232. package/dist/components/pagination/context.js.map +1 -1
  233. package/dist/components/pagination/pagination.d.ts +60 -6
  234. package/dist/components/pagination/pagination.d.ts.map +1 -1
  235. package/dist/components/pagination/pagination.js +85 -5
  236. package/dist/components/pagination/pagination.js.map +1 -1
  237. package/dist/components/pagination/use-pagination.d.ts +12 -2
  238. package/dist/components/pagination/use-pagination.d.ts.map +1 -1
  239. package/dist/components/pagination/use-pagination.js +50 -5
  240. package/dist/components/pagination/use-pagination.js.map +1 -1
  241. package/dist/components/password-input/context.js +1 -1
  242. package/dist/components/password-input/context.js.map +1 -1
  243. package/dist/components/password-input/password-input.d.ts +2 -2
  244. package/dist/components/password-input/password-input.d.ts.map +1 -1
  245. package/dist/components/password-input/password-input.js +7 -1
  246. package/dist/components/password-input/password-input.js.map +1 -1
  247. package/dist/components/pin-input/context.js +1 -1
  248. package/dist/components/pin-input/context.js.map +1 -1
  249. package/dist/components/pin-input/pin-input.d.ts +1 -1
  250. package/dist/components/popconfirm/context.js +1 -1
  251. package/dist/components/popconfirm/context.js.map +1 -1
  252. package/dist/components/popconfirm/popconfirm.d.ts +1 -1
  253. package/dist/components/popover/context.js +1 -1
  254. package/dist/components/popover/context.js.map +1 -1
  255. package/dist/components/popover/popover.d.ts +2 -2
  256. package/dist/components/popover/popover.d.ts.map +1 -1
  257. package/dist/components/popover/popover.js +3 -1
  258. package/dist/components/popover/popover.js.map +1 -1
  259. package/dist/components/popover/use-popover.js +1 -1
  260. package/dist/components/popover/use-popover.js.map +1 -1
  261. package/dist/components/popselect/context.js +2 -2
  262. package/dist/components/popselect/context.js.map +1 -1
  263. package/dist/components/popselect/popselect.d.ts +3 -3
  264. package/dist/components/popselect/popselect.d.ts.map +1 -1
  265. package/dist/components/popselect/popselect.js +3 -1
  266. package/dist/components/popselect/popselect.js.map +1 -1
  267. package/dist/components/popselect/use-popselect.js +1 -1
  268. package/dist/components/popselect/use-popselect.js.map +1 -1
  269. package/dist/components/progress/progress.d.ts +1 -1
  270. package/dist/components/qr-code/context.js +1 -1
  271. package/dist/components/qr-code/context.js.map +1 -1
  272. package/dist/components/radio-group/context.js +2 -2
  273. package/dist/components/radio-group/context.js.map +1 -1
  274. package/dist/components/radio-group/radio-group.d.ts +1 -1
  275. package/dist/components/rating/context.js +1 -1
  276. package/dist/components/rating/context.js.map +1 -1
  277. package/dist/components/rating/rating.d.ts +2 -2
  278. package/dist/components/result/context.js +1 -1
  279. package/dist/components/result/context.js.map +1 -1
  280. package/dist/components/scroll-area/context.js +2 -2
  281. package/dist/components/scroll-area/context.js.map +1 -1
  282. package/dist/components/scroll-area/scroll-area.d.ts +1 -1
  283. package/dist/components/scrollbar/context.js +1 -1
  284. package/dist/components/scrollbar/context.js.map +1 -1
  285. package/dist/components/scrollbar/scrollbar.d.ts +1 -1
  286. package/dist/components/segmented/context.js +2 -2
  287. package/dist/components/segmented/context.js.map +1 -1
  288. package/dist/components/segmented/segmented.d.ts +1 -1
  289. package/dist/components/select/context.js +3 -3
  290. package/dist/components/select/context.js.map +1 -1
  291. package/dist/components/select/select.d.ts +3 -3
  292. package/dist/components/select/select.d.ts.map +1 -1
  293. package/dist/components/select/select.js +7 -3
  294. package/dist/components/select/select.js.map +1 -1
  295. package/dist/components/side-nav/context.js +2 -2
  296. package/dist/components/side-nav/context.js.map +1 -1
  297. package/dist/components/side-nav/side-nav.d.ts +1 -1
  298. package/dist/components/signature-pad/context.js +1 -1
  299. package/dist/components/signature-pad/context.js.map +1 -1
  300. package/dist/components/skeleton/context.js +1 -1
  301. package/dist/components/skeleton/context.js.map +1 -1
  302. package/dist/components/slider/context.js +2 -2
  303. package/dist/components/slider/context.js.map +1 -1
  304. package/dist/components/slider/slider.d.ts +1 -1
  305. package/dist/components/space/context.js +1 -1
  306. package/dist/components/space/context.js.map +1 -1
  307. package/dist/components/space/space.d.ts +9 -0
  308. package/dist/components/space/space.d.ts.map +1 -1
  309. package/dist/components/space/space.js +4 -0
  310. package/dist/components/space/space.js.map +1 -1
  311. package/dist/components/spinner/context.js +1 -1
  312. package/dist/components/spinner/context.js.map +1 -1
  313. package/dist/components/spinner/spinner.d.ts +1 -1
  314. package/dist/components/splitter/context.js +1 -1
  315. package/dist/components/splitter/context.js.map +1 -1
  316. package/dist/components/statistic/context.js +1 -1
  317. package/dist/components/statistic/context.js.map +1 -1
  318. package/dist/components/statistic/statistic.d.ts +1 -1
  319. package/dist/components/steps/context.js +2 -2
  320. package/dist/components/steps/context.js.map +1 -1
  321. package/dist/components/steps/steps.d.ts +2 -2
  322. package/dist/components/table/context.js +4 -4
  323. package/dist/components/table/context.js.map +1 -1
  324. package/dist/components/table/table.d.ts +62 -3
  325. package/dist/components/table/table.d.ts.map +1 -1
  326. package/dist/components/table/table.js +37 -1
  327. package/dist/components/table/table.js.map +1 -1
  328. package/dist/components/table/use-table.d.ts +1 -1
  329. package/dist/components/table/use-table.d.ts.map +1 -1
  330. package/dist/components/table/use-table.js +3 -2
  331. package/dist/components/table/use-table.js.map +1 -1
  332. package/dist/components/tabs/context.js +1 -1
  333. package/dist/components/tabs/context.js.map +1 -1
  334. package/dist/components/tabs/tabs.d.ts +1 -1
  335. package/dist/components/tag/context.js +1 -1
  336. package/dist/components/tag/context.js.map +1 -1
  337. package/dist/components/tag/use-tag.js +14 -2
  338. package/dist/components/tag/use-tag.js.map +1 -1
  339. package/dist/components/tags-input/context.js +2 -2
  340. package/dist/components/tags-input/context.js.map +1 -1
  341. package/dist/components/tags-input/tags-input.d.ts +3 -3
  342. package/dist/components/tags-input/tags-input.d.ts.map +1 -1
  343. package/dist/components/tags-input/tags-input.js +7 -1
  344. package/dist/components/tags-input/tags-input.js.map +1 -1
  345. package/dist/components/text-field/context.js +1 -1
  346. package/dist/components/text-field/context.js.map +1 -1
  347. package/dist/components/text-field/text-field.d.ts +1 -1
  348. package/dist/components/text-field/text-field.d.ts.map +1 -1
  349. package/dist/components/text-field/text-field.js +7 -3
  350. package/dist/components/text-field/text-field.js.map +1 -1
  351. package/dist/components/thread/context.d.ts +7 -0
  352. package/dist/components/thread/context.d.ts.map +1 -0
  353. package/dist/components/thread/context.js +1 -1
  354. package/dist/components/thread/context.js.map +1 -1
  355. package/dist/components/time-field/context.js +1 -1
  356. package/dist/components/time-field/context.js.map +1 -1
  357. package/dist/components/time-field/time-field.d.ts +2 -2
  358. package/dist/components/time-picker/context.js +2 -2
  359. package/dist/components/time-picker/context.js.map +1 -1
  360. package/dist/components/time-picker/time-picker.d.ts +5 -5
  361. package/dist/components/time-picker/time-picker.d.ts.map +1 -1
  362. package/dist/components/time-picker/time-picker.js +10 -1
  363. package/dist/components/time-picker/time-picker.js.map +1 -1
  364. package/dist/components/time-picker/use-time-picker.d.ts +1 -0
  365. package/dist/components/time-picker/use-time-picker.d.ts.map +1 -1
  366. package/dist/components/time-picker/use-time-picker.js +3 -0
  367. package/dist/components/time-picker/use-time-picker.js.map +1 -1
  368. package/dist/components/timeline/context.js +2 -2
  369. package/dist/components/timeline/context.js.map +1 -1
  370. package/dist/components/timeline/timeline.d.ts +1 -1
  371. package/dist/components/timer/context.js +1 -1
  372. package/dist/components/timer/context.js.map +1 -1
  373. package/dist/components/toast/context.js +1 -1
  374. package/dist/components/toast/context.js.map +1 -1
  375. package/dist/components/toast/toast.d.ts +3 -15
  376. package/dist/components/toast/toast.d.ts.map +1 -1
  377. package/dist/components/toast/toast.js +1 -12
  378. package/dist/components/toast/toast.js.map +1 -1
  379. package/dist/components/toast/use-toast.d.ts.map +1 -1
  380. package/dist/components/toast/use-toast.js +1 -7
  381. package/dist/components/toast/use-toast.js.map +1 -1
  382. package/dist/components/toggle-group/context.js +1 -1
  383. package/dist/components/toggle-group/context.js.map +1 -1
  384. package/dist/components/toggle-group/toggle-group.d.ts +10 -1
  385. package/dist/components/toggle-group/toggle-group.d.ts.map +1 -1
  386. package/dist/components/toggle-group/toggle-group.js +4 -0
  387. package/dist/components/toggle-group/toggle-group.js.map +1 -1
  388. package/dist/components/toolbar/context.js +1 -1
  389. package/dist/components/toolbar/context.js.map +1 -1
  390. package/dist/components/toolbar/toolbar.d.ts +1 -1
  391. package/dist/components/tooltip/context.js +1 -1
  392. package/dist/components/tooltip/context.js.map +1 -1
  393. package/dist/components/tooltip/tooltip.d.ts +2 -2
  394. package/dist/components/tour/context.js +1 -1
  395. package/dist/components/tour/context.js.map +1 -1
  396. package/dist/components/tour/tour.d.ts +2 -2
  397. package/dist/components/transfer/context.js +3 -3
  398. package/dist/components/transfer/context.js.map +1 -1
  399. package/dist/components/tree/context.js +2 -2
  400. package/dist/components/tree/context.js.map +1 -1
  401. package/dist/components/tree/tree.d.ts +20 -0
  402. package/dist/components/tree/tree.d.ts.map +1 -1
  403. package/dist/components/tree/tree.js +9 -0
  404. package/dist/components/tree/tree.js.map +1 -1
  405. package/dist/components/tree-select/context.js +2 -2
  406. package/dist/components/tree-select/context.js.map +1 -1
  407. package/dist/components/tree-select/tree-select.d.ts +3 -3
  408. package/dist/components/tree-select/tree-select.d.ts.map +1 -1
  409. package/dist/components/tree-select/tree-select.js +14 -4
  410. package/dist/components/tree-select/tree-select.js.map +1 -1
  411. package/dist/components/tree-select/use-tree-select.js +1 -1
  412. package/dist/components/tree-select/use-tree-select.js.map +1 -1
  413. package/dist/components/typography/context.js +1 -1
  414. package/dist/components/typography/context.js.map +1 -1
  415. package/dist/components/virtualizer/context.js +1 -1
  416. package/dist/components/virtualizer/context.js.map +1 -1
  417. package/dist/components/watermark/context.js +1 -1
  418. package/dist/components/watermark/context.js.map +1 -1
  419. package/dist/config/config.js +1 -1
  420. package/dist/config/config.js.map +1 -1
  421. package/dist/index.d.ts +16 -9
  422. package/dist/index.js +15 -8
  423. package/dist/package.js +1 -1
  424. package/dist/runtime/use-scrollbars.js +66 -0
  425. package/dist/runtime/use-scrollbars.js.map +1 -0
  426. package/dist/services/dialog-service.d.ts +33 -8
  427. package/dist/services/dialog-service.d.ts.map +1 -1
  428. package/dist/services/dialog-service.js +44 -20
  429. package/dist/services/dialog-service.js.map +1 -1
  430. package/dist/services/glyph.js +41 -1
  431. package/dist/services/glyph.js.map +1 -1
  432. package/dist/services/loading-bar-service.d.ts +46 -0
  433. package/dist/services/loading-bar-service.d.ts.map +1 -0
  434. package/dist/services/loading-bar-service.js +70 -0
  435. package/dist/services/loading-bar-service.js.map +1 -0
  436. package/dist/services/mount-host.js +35 -0
  437. package/dist/services/mount-host.js.map +1 -0
  438. package/dist/services/notification-service.d.ts +46 -0
  439. package/dist/services/notification-service.d.ts.map +1 -0
  440. package/dist/services/notification-service.js +91 -0
  441. package/dist/services/notification-service.js.map +1 -0
  442. package/dist/services/service-config.js +16 -0
  443. package/dist/services/service-config.js.map +1 -0
  444. package/dist/services/toast-service.d.ts +20 -12
  445. package/dist/services/toast-service.d.ts.map +1 -1
  446. package/dist/services/toast-service.js +103 -50
  447. package/dist/services/toast-service.js.map +1 -1
  448. package/package.json +18 -14
  449. package/dist/components/toaster/context.js +0 -19
  450. package/dist/components/toaster/context.js.map +0 -1
  451. package/dist/components/toaster/toaster.d.ts +0 -135
  452. package/dist/components/toaster/toaster.d.ts.map +0 -1
  453. package/dist/components/toaster/toaster.js +0 -91
  454. package/dist/components/toaster/toaster.js.map +0 -1
  455. package/dist/components/toaster/use-toaster.d.ts +0 -15
  456. package/dist/components/toaster/use-toaster.d.ts.map +0 -1
  457. package/dist/components/toaster/use-toaster.js +0 -23
  458. package/dist/components/toaster/use-toaster.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"color-picker.d.ts","names":[],"sources":["../../../src/components/color-picker/color-picker.ts"],"mappings":";;;;;KAsBK,mBAAmB;;KAGZ,2BAA2B,KACrC;cAIW,iCAAiB,8BAAA;;;;;;;;;;IAMA,MAAA,SAAS;;;;;;;;;;;;IAMR,MAAA;;;;;;;;IAEJ,MAAA,SAAS;;;;IACH,MAAA,SAAS;;;;;;;;IAEN,MAAA,SAAS,QAAQ;;;;;;EAItB,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;EACZ,gBAAA,OAAA,UAAU;;;;;;;;;;;IAlBP,MAAA,SAAS;;;;;;;;;;;;IAMR,MAAA;;;;;;;;IAEJ,MAAA,SAAS;;;;IACH,MAAA,SAAS;;;;;;;;IAEN,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;EAUvC,WAAC,OAAO,6BAA6B;kCA4BjD;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAU/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAWjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAclC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAY/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAU5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,0CAA0B,8BAAA;;;IAIR,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAYtC;cAEW,+CAA+B,0BAAA,oBAAA,4BAAA;;8BAY1C,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+CAA+B,0BAAA,oBAAA,4BAAA;;8BAW1C,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,yCAAyB,8BAAA;;;IAIP,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAQtC;cAEW,8CAA8B,0BAAA,oBAAA,4BAAA;;8BAMzC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,8BAAA;;;;;;;;;;;;;;;;qCAclC;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"color-picker.d.ts","names":[],"sources":["../../../src/components/color-picker/color-picker.ts"],"mappings":";;;;;KAuBK,mBAAmB;;KAGZ,2BAA2B,KACrC;cAIW,iCAAiB,8BAAA;;;;;;;;;;IAMA,MAAA,SAAS;;;;;;;;;;;;IAMR,MAAA;;;;;;;;IAEH,MAAA,SAAS;;;;IACV,MAAA,SAAS;;;;IACH,MAAA,SAAS;;;;;;;;IAEN,MAAA,SAAS,QAAQ;;;;;;EAItB,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;EACZ,gBAAA,OAAA,UAAU;;;;;;;;;;;IAnBP,MAAA,SAAS;;;;;;;;;;;;IAMR,MAAA;;;;;;;;IAEH,MAAA,SAAS;;;;IACV,MAAA,SAAS;;;;IACH,MAAA,SAAS;;;;;;;;IAEN,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;EAUvC,WAAC,OAAO,6BAA6B;kCA4BjD;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAU/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAWjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAgBlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAY/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAU5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,0CAA0B,8BAAA;;;IAIR,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAYtC;cAEW,+CAA+B,0BAAA,oBAAA,4BAAA;;8BAY1C,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+CAA+B,0BAAA,oBAAA,4BAAA;;8BAW1C,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,yCAAyB,8BAAA;;;IAIP,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAQtC;cAEW,8CAA8B,0BAAA,oBAAA,4BAAA;;8BAMzC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,8BAAA;;;;;;;;;;;;;;;;qCAclC;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -1,4 +1,5 @@
1
1
  import { withXhConfig } from "../../config/config.js";
2
+ import { useScrollbars } from "../../runtime/use-scrollbars.js";
2
3
  import { provideColorPicker, provideColorPickerChannel, useColorPickerChannelContext, useColorPickerContext } from "./context.js";
3
4
  import { useColorPicker } from "./use-color-picker.js";
4
5
  import { Teleport, computed, defineComponent, h, mergeProps, onUnmounted } from "vue";
@@ -35,6 +36,10 @@ const XhColorPickerRoot = defineComponent({
35
36
  type: String,
36
37
  default: void 0
37
38
  },
39
+ size: {
40
+ type: String,
41
+ default: void 0
42
+ },
38
43
  dir: {
39
44
  type: String,
40
45
  default: void 0
@@ -131,12 +136,13 @@ const XhColorPickerPositioner = defineComponent({
131
136
  inheritAttrs: false,
132
137
  setup(_, { slots, attrs }) {
133
138
  const ctx = useColorPickerContext();
139
+ const bars = useScrollbars({ scrollable: () => ctx.contentRef.value });
134
140
  return () => h(Teleport, { to: ctx.portalTarget.value }, [h("div", {
135
141
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
136
142
  ref: (el) => {
137
143
  ctx.positionerRef.value = el;
138
144
  }
139
- }, slots.default?.())]);
145
+ }, [...slots.default?.() ?? [], ...bars.render()])]);
140
146
  }
141
147
  });
142
148
  const XhColorPickerContent = defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"color-picker.js","names":[],"sources":["../../../src/components/color-picker/color-picker.ts"],"sourcesContent":["import type {\n ColorPickerApi,\n ColorPickerChannel,\n ColorPickerFormat,\n ColorPickerInputChannel,\n ColorPickerSchema,\n ColorPickerTranslations,\n} from '@xihan-ui/headless'\nimport type { Direction, Placement } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { colorPickerToChannel, colorPickerToInputChannel } from '@xihan-ui/headless'\nimport { computed, defineComponent, h, mergeProps, onUnmounted, Teleport } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport {\n provideColorPicker,\n provideColorPickerChannel,\n useColorPickerChannelContext,\n useColorPickerContext,\n} from './context'\nimport { useColorPicker } from './use-color-picker'\n\ntype ColorPickerProps = ColorPickerSchema['props']\n\n/** 默认插槽的载荷:展开态、当前颜色的各式表示、预设色板、屏幕取色状态,以及改展开与改值两个动作。 */\nexport type ColorPickerRootSlotProps = Pick<\n ColorPickerApi,\n 'open' | 'value' | 'rgba' | 'hsva' | 'swatches' | 'picking' | 'eyeDropperSupported' | 'setOpen' | 'setValue'\n>\n\nexport const XhColorPickerRoot = defineComponent({\n name: 'XhColorPickerRoot',\n // 缺省值由 connect 与机器给出,这里一律 default: undefined\n props: {\n value: { type: String, default: undefined },\n defaultValue: { type: String, default: undefined },\n format: { type: String as PropType<ColorPickerFormat>, default: undefined },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n disabled: Boolean,\n readOnly: Boolean,\n alpha: Boolean,\n swatches: { type: Array as PropType<string[]>, default: undefined },\n name: { type: String, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n translations: { type: Object as PropType<Partial<ColorPickerTranslations>>, default: undefined },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<ColorPickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<ColorPickerProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<ColorPickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<ColorPickerProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: ColorPickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: ColorPickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: ColorPickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useColorPicker(withXhConfig('color-picker', props) as ColorPickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideColorPicker(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n rgba: ctx.api.value.rgba,\n hsva: ctx.api.value.hsva,\n swatches: ctx.api.value.swatches,\n picking: ctx.api.value.picking,\n eyeDropperSupported: ctx.api.value.eyeDropperSupported,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n }))\n },\n})\n\nexport const XhColorPickerLabel = defineComponent({\n name: 'XhColorPickerLabel',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerControl = defineComponent({\n name: 'XhColorPickerControl',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerTrigger = defineComponent({\n name: 'XhColorPickerTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 原生 button,激活交给平台;同时是浮层的定位锚点\n return () => h('button', {\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerValueText = defineComponent({\n name: 'XhColorPickerValueText',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 有插槽用插槽,否则显示当前值串\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.value,\n )\n },\n})\n\nexport const XhColorPickerSwatch = defineComponent({\n name: 'XhColorPickerSwatch',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('span', ctx.api.value.getSwatchProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerPositioner = defineComponent({\n name: 'XhColorPickerPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useColorPickerContext()\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(Teleport, { to: ctx.portalTarget.value }, [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhColorPickerContent = defineComponent({\n name: 'XhColorPickerContent',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerArea = defineComponent({\n name: 'XhColorPickerArea',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 区域节点交给机器,矩形在指针事件里现量\n return () => h('div', {\n ...ctx.api.value.getAreaProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.areaRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerAreaThumb = defineComponent({\n name: 'XhColorPickerAreaThumb',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('div', ctx.api.value.getAreaThumbProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerChannelSlider = defineComponent({\n name: 'XhColorPickerChannelSlider',\n props: {\n /** 这条滑杆调的是哪一路,缺省或不识别时按色相处理。 */\n channel: { type: String as PropType<ColorPickerChannel>, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useColorPickerContext()\n const channel = computed(() => colorPickerToChannel(props.channel))\n provideColorPickerChannel({ channel })\n return () => h(\n 'div',\n ctx.api.value.getChannelSliderProps({ channel: channel.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhColorPickerChannelSliderTrack = defineComponent({\n name: 'XhColorPickerChannelSliderTrack',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n const { channel } = useColorPickerChannelContext()\n // 卸载时撤掉登记,避免留下已离开文档的节点\n onUnmounted(() => ctx.setChannelTrack(channel.value, null))\n return () => h('div', {\n ...ctx.api.value.getChannelSliderTrackProps({ channel: channel.value }) as Record<string, unknown>,\n ref: (el: unknown) => ctx.setChannelTrack(channel.value, el as HTMLElement | null),\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerChannelSliderThumb = defineComponent({\n name: 'XhColorPickerChannelSliderThumb',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n const { channel } = useColorPickerChannelContext()\n return () => h(\n 'div',\n ctx.api.value.getChannelSliderThumbProps({ channel: channel.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhColorPickerChannelInput = defineComponent({\n name: 'XhColorPickerChannelInput',\n props: {\n /** 这个框编辑的是哪一路:hex 是整串,r/g/b 是分量,a 是透明度百分数;缺省或不识别时按 hex 处理。 */\n channel: { type: String as PropType<ColorPickerInputChannel>, default: undefined },\n },\n setup(props) {\n const ctx = useColorPickerContext()\n const channel = computed(() => colorPickerToInputChannel(props.channel))\n // 通道身份由本部件自己声明,不必嵌在通道滑杆内\n return () => h('input', ctx.api.value.getChannelInputProps({ channel: channel.value }) as Record<string, unknown>)\n },\n})\n\nexport const XhColorPickerEyeDropperTrigger = defineComponent({\n name: 'XhColorPickerEyeDropperTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('button', ctx.api.value.getEyeDropperTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerSwatchGroup = defineComponent({\n name: 'XhColorPickerSwatchGroup',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('div', ctx.api.value.getSwatchGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerSwatchItem = defineComponent({\n name: 'XhColorPickerSwatchItem',\n props: {\n /** 这一格的颜色。 */\n value: { type: String, default: '' },\n },\n setup(props, { slots }) {\n const ctx = useColorPickerContext()\n return () => h(\n 'button',\n ctx.api.value.getSwatchItemProps({ value: props.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhColorPickerHiddenInput = defineComponent({\n name: 'XhColorPickerHiddenInput',\n setup() {\n const ctx = useColorPickerContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"color-picker.js","names":[],"sources":["../../../src/components/color-picker/color-picker.ts"],"sourcesContent":["import type {\n ColorPickerApi,\n ColorPickerChannel,\n ColorPickerFormat,\n ColorPickerInputChannel,\n ColorPickerSchema,\n ColorPickerTranslations,\n} from '@xihan-ui/headless'\nimport type { Direction, Placement, Size } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { colorPickerToChannel, colorPickerToInputChannel } from '@xihan-ui/headless'\nimport { computed, defineComponent, h, mergeProps, onUnmounted, Teleport } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport {\n provideColorPicker,\n provideColorPickerChannel,\n useColorPickerChannelContext,\n useColorPickerContext,\n} from './context'\nimport { useColorPicker } from './use-color-picker'\n\ntype ColorPickerProps = ColorPickerSchema['props']\n\n/** 默认插槽的载荷:展开态、当前颜色的各式表示、预设色板、屏幕取色状态,以及改展开与改值两个动作。 */\nexport type ColorPickerRootSlotProps = Pick<\n ColorPickerApi,\n 'open' | 'value' | 'rgba' | 'hsva' | 'swatches' | 'picking' | 'eyeDropperSupported' | 'setOpen' | 'setValue'\n>\n\nexport const XhColorPickerRoot = defineComponent({\n name: 'XhColorPickerRoot',\n // 缺省值由 connect 与机器给出,这里一律 default: undefined\n props: {\n value: { type: String, default: undefined },\n defaultValue: { type: String, default: undefined },\n format: { type: String as PropType<ColorPickerFormat>, default: undefined },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n disabled: Boolean,\n readOnly: Boolean,\n alpha: Boolean,\n swatches: { type: Array as PropType<string[]>, default: undefined },\n name: { type: String, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n translations: { type: Object as PropType<Partial<ColorPickerTranslations>>, default: undefined },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<ColorPickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<ColorPickerProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<ColorPickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<ColorPickerProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: ColorPickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: ColorPickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: ColorPickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useColorPicker(withXhConfig('color-picker', props) as ColorPickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideColorPicker(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n rgba: ctx.api.value.rgba,\n hsva: ctx.api.value.hsva,\n swatches: ctx.api.value.swatches,\n picking: ctx.api.value.picking,\n eyeDropperSupported: ctx.api.value.eyeDropperSupported,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n }))\n },\n})\n\nexport const XhColorPickerLabel = defineComponent({\n name: 'XhColorPickerLabel',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerControl = defineComponent({\n name: 'XhColorPickerControl',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerTrigger = defineComponent({\n name: 'XhColorPickerTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 原生 button,激活交给平台;同时是浮层的定位锚点\n return () => h('button', {\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerValueText = defineComponent({\n name: 'XhColorPickerValueText',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 有插槽用插槽,否则显示当前值串\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.value,\n )\n },\n})\n\nexport const XhColorPickerSwatch = defineComponent({\n name: 'XhColorPickerSwatch',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('span', ctx.api.value.getSwatchProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerPositioner = defineComponent({\n name: 'XhColorPickerPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useColorPickerContext()\n // 面板的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(Teleport, { to: ctx.portalTarget.value }, [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhColorPickerContent = defineComponent({\n name: 'XhColorPickerContent',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerArea = defineComponent({\n name: 'XhColorPickerArea',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 区域节点交给机器,矩形在指针事件里现量\n return () => h('div', {\n ...ctx.api.value.getAreaProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.areaRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerAreaThumb = defineComponent({\n name: 'XhColorPickerAreaThumb',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('div', ctx.api.value.getAreaThumbProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerChannelSlider = defineComponent({\n name: 'XhColorPickerChannelSlider',\n props: {\n /** 这条滑杆调的是哪一路,缺省或不识别时按色相处理。 */\n channel: { type: String as PropType<ColorPickerChannel>, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useColorPickerContext()\n const channel = computed(() => colorPickerToChannel(props.channel))\n provideColorPickerChannel({ channel })\n return () => h(\n 'div',\n ctx.api.value.getChannelSliderProps({ channel: channel.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhColorPickerChannelSliderTrack = defineComponent({\n name: 'XhColorPickerChannelSliderTrack',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n const { channel } = useColorPickerChannelContext()\n // 卸载时撤掉登记,避免留下已离开文档的节点\n onUnmounted(() => ctx.setChannelTrack(channel.value, null))\n return () => h('div', {\n ...ctx.api.value.getChannelSliderTrackProps({ channel: channel.value }) as Record<string, unknown>,\n ref: (el: unknown) => ctx.setChannelTrack(channel.value, el as HTMLElement | null),\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerChannelSliderThumb = defineComponent({\n name: 'XhColorPickerChannelSliderThumb',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n const { channel } = useColorPickerChannelContext()\n return () => h(\n 'div',\n ctx.api.value.getChannelSliderThumbProps({ channel: channel.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhColorPickerChannelInput = defineComponent({\n name: 'XhColorPickerChannelInput',\n props: {\n /** 这个框编辑的是哪一路:hex 是整串,r/g/b 是分量,a 是透明度百分数;缺省或不识别时按 hex 处理。 */\n channel: { type: String as PropType<ColorPickerInputChannel>, default: undefined },\n },\n setup(props) {\n const ctx = useColorPickerContext()\n const channel = computed(() => colorPickerToInputChannel(props.channel))\n // 通道身份由本部件自己声明,不必嵌在通道滑杆内\n return () => h('input', ctx.api.value.getChannelInputProps({ channel: channel.value }) as Record<string, unknown>)\n },\n})\n\nexport const XhColorPickerEyeDropperTrigger = defineComponent({\n name: 'XhColorPickerEyeDropperTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('button', ctx.api.value.getEyeDropperTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerSwatchGroup = defineComponent({\n name: 'XhColorPickerSwatchGroup',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('div', ctx.api.value.getSwatchGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerSwatchItem = defineComponent({\n name: 'XhColorPickerSwatchItem',\n props: {\n /** 这一格的颜色。 */\n value: { type: String, default: '' },\n },\n setup(props, { slots }) {\n const ctx = useColorPickerContext()\n return () => h(\n 'button',\n ctx.api.value.getSwatchItemProps({ value: props.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhColorPickerHiddenInput = defineComponent({\n name: 'XhColorPickerHiddenInput',\n setup() {\n const ctx = useColorPickerContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/color-picker/context.ts
3
- const KEY = Symbol("xh-color-picker");
4
- const CHANNEL_KEY = Symbol("xh-color-picker-channel");
3
+ const KEY = Symbol.for("xh-color-picker");
4
+ const CHANNEL_KEY = Symbol.for("xh-color-picker-channel");
5
5
  function provideColorPicker(ctx) {
6
6
  provide(KEY, ctx);
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/color-picker/context.ts"],"sourcesContent":["import type { ColorPickerChannel } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { ColorPickerContext } from './use-color-picker'\nimport { inject, provide } from 'vue'\n\n/** 通道滑杆自报的身份,供它内部的轨道与拇指复用同一份声明。 */\nexport interface ColorPickerChannelContext {\n channel: ComputedRef<ColorPickerChannel>\n}\n\nconst KEY: InjectionKey<ColorPickerContext> = Symbol('xh-color-picker')\nconst CHANNEL_KEY: InjectionKey<ColorPickerChannelContext> = Symbol('xh-color-picker-channel')\n\nexport function provideColorPicker(ctx: ColorPickerContext): void {\n provide(KEY, ctx)\n}\n\nexport function useColorPickerContext(): ColorPickerContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] ColorPicker 部件必须用在 XhColorPickerRoot 内')\n return ctx\n}\n\nexport function provideColorPickerChannel(ctx: ColorPickerChannelContext): void {\n provide(CHANNEL_KEY, ctx)\n}\n\nexport function useColorPickerChannelContext(): ColorPickerChannelContext {\n const ctx = inject(CHANNEL_KEY, null)\n if (!ctx)\n throw new Error('[xh] ColorPicker 通道轨道与拇指必须用在 XhColorPickerChannelSlider 内')\n return ctx\n}\n"],"mappings":";;AAUA,MAAM,MAAwC,OAAO,iBAAiB;AACtE,MAAM,cAAuD,OAAO,yBAAyB;AAE7F,SAAgB,mBAAmB,KAA+B;CAChE,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,wBAA4C;CAC1D,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,6CAA6C;CAC/D,OAAO;AACT;AAEA,SAAgB,0BAA0B,KAAsC;CAC9E,QAAQ,aAAa,GAAG;AAC1B;AAEA,SAAgB,+BAA0D;CACxE,MAAM,MAAM,OAAO,aAAa,IAAI;CACpC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,2DAA2D;CAC7E,OAAO;AACT"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/color-picker/context.ts"],"sourcesContent":["import type { ColorPickerChannel } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { ColorPickerContext } from './use-color-picker'\nimport { inject, provide } from 'vue'\n\n/** 通道滑杆自报的身份,供它内部的轨道与拇指复用同一份声明。 */\nexport interface ColorPickerChannelContext {\n channel: ComputedRef<ColorPickerChannel>\n}\n\nconst KEY: InjectionKey<ColorPickerContext> = Symbol.for('xh-color-picker')\nconst CHANNEL_KEY: InjectionKey<ColorPickerChannelContext> = Symbol.for('xh-color-picker-channel')\n\nexport function provideColorPicker(ctx: ColorPickerContext): void {\n provide(KEY, ctx)\n}\n\nexport function useColorPickerContext(): ColorPickerContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] ColorPicker 部件必须用在 XhColorPickerRoot 内')\n return ctx\n}\n\nexport function provideColorPickerChannel(ctx: ColorPickerChannelContext): void {\n provide(CHANNEL_KEY, ctx)\n}\n\nexport function useColorPickerChannelContext(): ColorPickerChannelContext {\n const ctx = inject(CHANNEL_KEY, null)\n if (!ctx)\n throw new Error('[xh] ColorPicker 通道轨道与拇指必须用在 XhColorPickerChannelSlider 内')\n return ctx\n}\n"],"mappings":";;AAUA,MAAM,MAAwC,OAAO,IAAI,iBAAiB;AAC1E,MAAM,cAAuD,OAAO,IAAI,yBAAyB;AAEjG,SAAgB,mBAAmB,KAA+B;CAChE,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,wBAA4C;CAC1D,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,6CAA6C;CAC/D,OAAO;AACT;AAEA,SAAgB,0BAA0B,KAAsC;CAC9E,QAAQ,aAAa,GAAG;AAC1B;AAEA,SAAgB,+BAA0D;CACxE,MAAM,MAAM,OAAO,aAAa,IAAI;CACpC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,2DAA2D;CAC7E,OAAO;AACT"}
@@ -33,7 +33,7 @@ function useColorPicker(props, handlers = {}) {
33
33
  const registerLayer = () => config.layerRegistry.register({
34
34
  kind: "popover",
35
35
  node: () => contentRef.value,
36
- branches: () => [triggerRef.value].filter(Boolean),
36
+ branches: () => [triggerRef.value, positionerRef.value].filter(Boolean),
37
37
  isModal: () => false,
38
38
  setModal: () => {},
39
39
  surfaces: () => []
@@ -1 +1 @@
1
- {"version":3,"file":"use-color-picker.js","names":[],"sources":["../../../src/components/color-picker/use-color-picker.ts"],"sourcesContent":["import type { ColorPickerApi, ColorPickerChannel, ColorPickerSchema } from '@xihan-ui/headless'\nimport type { Cleanup, Layer, RuntimeConfig } from '@xihan-ui/kernel'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef, Ref } from 'vue'\nimport { colorPickerMachine, connectColorPicker } from '@xihan-ui/headless'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/kernel'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, ref } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface ColorPickerContext {\n service: Service<ColorPickerSchema>\n api: ComputedRef<ColorPickerApi>\n /** 触发器,同时是浮层的定位锚点。 */\n triggerRef: Ref<HTMLElement | null>\n positionerRef: Ref<HTMLElement | null>\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 二维取色区,机器在指针事件里拿它量矩形。 */\n areaRef: Ref<HTMLElement | null>\n /** 逐条登记通道轨道节点,由滑杆部件自报是哪一条。 */\n setChannelTrack: (channel: ColorPickerChannel, el: HTMLElement | null) => void\n /** 浮层搬到哪儿:全局配置的 portalContainer > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useColorPicker(\n props: ColorPickerSchema['props'],\n handlers: Pick<ColorPickerSchema['props'], 'onValueChange' | 'onOpenChange'> = {},\n): ColorPickerContext {\n const xhConfig = useXhConfig()\n const triggerRef = ref<HTMLElement | null>(null)\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n const areaRef = ref<HTMLElement | null>(null)\n // 普通对象而非响应式引用,这两个节点只在指针事件里读\n const channelTracks: Record<ColorPickerChannel, HTMLElement | null> = { hue: null, alpha: null }\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(colorPickerMachine, () => ({ ...props, ...handlers }), scope)\n\n // 服务端没有 DOM、也就没有退场:config 传 null 时闸门退化成「跟着展开态」\n let config: RuntimeConfig | null = null\n\n if (typeof document !== 'undefined') {\n config = createRuntimeConfig({ scope, idGenerator: idGen })\n\n // 只提供注册函数,入栈出栈由机器的 trackLayer 效应按展开态驱动\n const registerLayer = (): { layer: Layer, dispose: Cleanup } => config!.layerRegistry.register({\n kind: 'popover',\n node: () => contentRef.value,\n // 触发器记为本层分支,点它算层内交互\n branches: () => [triggerRef.value].filter(Boolean) as Element[],\n isModal: () => false,\n setModal: () => {},\n // 浮层不带遮罩,没有可点关闭的表面\n surfaces: () => [],\n })\n\n // 定位引擎由适配器注入,机器只经端口驱动\n service.refs.set('config', config!)\n service.refs.set('registerLayer', registerLayer)\n service.refs.set('position', createPositionEngine())\n service.refs.set('getAnchorEl', () => triggerRef.value)\n service.refs.set('getFloatingEl', () => positionerRef.value)\n service.refs.set('getContentEl', () => contentRef.value)\n // 传 getter 而非节点,ref 在挂载后才有值\n service.refs.set('getAreaEl', () => areaRef.value)\n service.refs.set('getChannelTrackEl', channel => channelTracks[channel])\n }\n\n const api = computed(() => connectColorPicker(service, vueNormalize))\n // 退场闸门:收起从跟着 open 走,改成跟着 presence 走\n const visible = useOverlayExit({ config, isOpen: () => api.value.open, contentRef })\n // 先问全局配置的落点,没有才落 body\n const portalTarget = computed<string | Element>(() => xhConfig.value.portalContainer?.() ?? config?.portalContainer() ?? 'body')\n\n return {\n visible,\n service,\n api,\n triggerRef,\n positionerRef,\n contentRef,\n areaRef,\n portalTarget,\n setChannelTrack: (channel, el) => {\n channelTracks[channel] = el\n },\n }\n}\n"],"mappings":";;;;;;;;;;AA+BA,SAAgB,eACd,OACA,WAA+E,CAAC,GAC5D;CACpB,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,IAAwB,IAAI;CAC/C,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,aAAa,IAAwB,IAAI;CAC/C,MAAM,UAAU,IAAwB,IAAI;CAE5C,MAAM,gBAAgE;EAAE,KAAK;EAAM,OAAO;CAAK;CAE/F,MAAM,QAAQ,qBAAqB;CACnC,MAAM,QAAQ,YAAY,MAAM,KAAK;CACrC,MAAM,UAAU,WAAW,2BAA2B;EAAE,GAAG;EAAO,GAAG;CAAS,IAAI,KAAK;CAGvF,IAAI,SAA+B;CAEnC,IAAI,OAAO,aAAa,aAAa;EACnC,SAAS,oBAAoB;GAAE;GAAO,aAAa;EAAM,CAAC;EAG1D,MAAM,sBAA0D,OAAQ,cAAc,SAAS;GAC7F,MAAM;GACN,YAAY,WAAW;GAEvB,gBAAgB,CAAC,WAAW,KAAK,CAAC,CAAC,OAAO,OAAO;GACjD,eAAe;GACf,gBAAgB,CAAC;GAEjB,gBAAgB,CAAC;EACnB,CAAC;EAGD,QAAQ,KAAK,IAAI,UAAU,MAAO;EAClC,QAAQ,KAAK,IAAI,iBAAiB,aAAa;EAC/C,QAAQ,KAAK,IAAI,YAAY,qBAAqB,CAAC;EACnD,QAAQ,KAAK,IAAI,qBAAqB,WAAW,KAAK;EACtD,QAAQ,KAAK,IAAI,uBAAuB,cAAc,KAAK;EAC3D,QAAQ,KAAK,IAAI,sBAAsB,WAAW,KAAK;EAEvD,QAAQ,KAAK,IAAI,mBAAmB,QAAQ,KAAK;EACjD,QAAQ,KAAK,IAAI,sBAAqB,YAAW,cAAc,QAAQ;CACzE;CAEA,MAAM,MAAM,eAAe,mBAAmB,SAAS,YAAY,CAAC;CAMpE,OAAO;EACL,SALc,eAAe;GAAE;GAAQ,cAAc,IAAI,MAAM;GAAM;EAAW,CAK1E;EACN;EACA;EACA;EACA;EACA;EACA;EACA,cAVmB,eAAiC,SAAS,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,KAAK,MAU5G;EACX,kBAAkB,SAAS,OAAO;GAChC,cAAc,WAAW;EAC3B;CACF;AACF"}
1
+ {"version":3,"file":"use-color-picker.js","names":[],"sources":["../../../src/components/color-picker/use-color-picker.ts"],"sourcesContent":["import type { ColorPickerApi, ColorPickerChannel, ColorPickerSchema } from '@xihan-ui/headless'\nimport type { Cleanup, Layer, RuntimeConfig } from '@xihan-ui/kernel'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef, Ref } from 'vue'\nimport { colorPickerMachine, connectColorPicker } from '@xihan-ui/headless'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/kernel'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, ref } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface ColorPickerContext {\n service: Service<ColorPickerSchema>\n api: ComputedRef<ColorPickerApi>\n /** 触发器,同时是浮层的定位锚点。 */\n triggerRef: Ref<HTMLElement | null>\n positionerRef: Ref<HTMLElement | null>\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 二维取色区,机器在指针事件里拿它量矩形。 */\n areaRef: Ref<HTMLElement | null>\n /** 逐条登记通道轨道节点,由滑杆部件自报是哪一条。 */\n setChannelTrack: (channel: ColorPickerChannel, el: HTMLElement | null) => void\n /** 浮层搬到哪儿:全局配置的 portalContainer > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useColorPicker(\n props: ColorPickerSchema['props'],\n handlers: Pick<ColorPickerSchema['props'], 'onValueChange' | 'onOpenChange'> = {},\n): ColorPickerContext {\n const xhConfig = useXhConfig()\n const triggerRef = ref<HTMLElement | null>(null)\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n const areaRef = ref<HTMLElement | null>(null)\n // 普通对象而非响应式引用,这两个节点只在指针事件里读\n const channelTracks: Record<ColorPickerChannel, HTMLElement | null> = { hue: null, alpha: null }\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(colorPickerMachine, () => ({ ...props, ...handlers }), scope)\n\n // 服务端没有 DOM、也就没有退场:config 传 null 时闸门退化成「跟着展开态」\n let config: RuntimeConfig | null = null\n\n if (typeof document !== 'undefined') {\n config = createRuntimeConfig({ scope, idGenerator: idGen })\n\n // 只提供注册函数,入栈出栈由机器的 trackLayer 效应按展开态驱动\n const registerLayer = (): { layer: Layer, dispose: Cleanup } => config!.layerRegistry.register({\n kind: 'popover',\n node: () => contentRef.value,\n // 触发器记为本层分支,点它算层内交互;\n // 浮层壳一并记上:content 之外还浮着自绘滚动条,按住它拖动不该把浮层消解掉\n branches: () => [triggerRef.value, positionerRef.value].filter(Boolean) as Element[],\n isModal: () => false,\n setModal: () => {},\n // 浮层不带遮罩,没有可点关闭的表面\n surfaces: () => [],\n })\n\n // 定位引擎由适配器注入,机器只经端口驱动\n service.refs.set('config', config!)\n service.refs.set('registerLayer', registerLayer)\n service.refs.set('position', createPositionEngine())\n service.refs.set('getAnchorEl', () => triggerRef.value)\n service.refs.set('getFloatingEl', () => positionerRef.value)\n service.refs.set('getContentEl', () => contentRef.value)\n // 传 getter 而非节点,ref 在挂载后才有值\n service.refs.set('getAreaEl', () => areaRef.value)\n service.refs.set('getChannelTrackEl', channel => channelTracks[channel])\n }\n\n const api = computed(() => connectColorPicker(service, vueNormalize))\n // 退场闸门:收起从跟着 open 走,改成跟着 presence 走\n const visible = useOverlayExit({ config, isOpen: () => api.value.open, contentRef })\n // 先问全局配置的落点,没有才落 body\n const portalTarget = computed<string | Element>(() => xhConfig.value.portalContainer?.() ?? config?.portalContainer() ?? 'body')\n\n return {\n visible,\n service,\n api,\n triggerRef,\n positionerRef,\n contentRef,\n areaRef,\n portalTarget,\n setChannelTrack: (channel, el) => {\n channelTracks[channel] = el\n },\n }\n}\n"],"mappings":";;;;;;;;;;AA+BA,SAAgB,eACd,OACA,WAA+E,CAAC,GAC5D;CACpB,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,IAAwB,IAAI;CAC/C,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,aAAa,IAAwB,IAAI;CAC/C,MAAM,UAAU,IAAwB,IAAI;CAE5C,MAAM,gBAAgE;EAAE,KAAK;EAAM,OAAO;CAAK;CAE/F,MAAM,QAAQ,qBAAqB;CACnC,MAAM,QAAQ,YAAY,MAAM,KAAK;CACrC,MAAM,UAAU,WAAW,2BAA2B;EAAE,GAAG;EAAO,GAAG;CAAS,IAAI,KAAK;CAGvF,IAAI,SAA+B;CAEnC,IAAI,OAAO,aAAa,aAAa;EACnC,SAAS,oBAAoB;GAAE;GAAO,aAAa;EAAM,CAAC;EAG1D,MAAM,sBAA0D,OAAQ,cAAc,SAAS;GAC7F,MAAM;GACN,YAAY,WAAW;GAGvB,gBAAgB,CAAC,WAAW,OAAO,cAAc,KAAK,CAAC,CAAC,OAAO,OAAO;GACtE,eAAe;GACf,gBAAgB,CAAC;GAEjB,gBAAgB,CAAC;EACnB,CAAC;EAGD,QAAQ,KAAK,IAAI,UAAU,MAAO;EAClC,QAAQ,KAAK,IAAI,iBAAiB,aAAa;EAC/C,QAAQ,KAAK,IAAI,YAAY,qBAAqB,CAAC;EACnD,QAAQ,KAAK,IAAI,qBAAqB,WAAW,KAAK;EACtD,QAAQ,KAAK,IAAI,uBAAuB,cAAc,KAAK;EAC3D,QAAQ,KAAK,IAAI,sBAAsB,WAAW,KAAK;EAEvD,QAAQ,KAAK,IAAI,mBAAmB,QAAQ,KAAK;EACjD,QAAQ,KAAK,IAAI,sBAAqB,YAAW,cAAc,QAAQ;CACzE;CAEA,MAAM,MAAM,eAAe,mBAAmB,SAAS,YAAY,CAAC;CAMpE,OAAO;EACL,SALc,eAAe;GAAE;GAAQ,cAAc,IAAI,MAAM;GAAM;EAAW,CAK1E;EACN;EACA;EACA;EACA;EACA;EACA;EACA,cAVmB,eAAiC,SAAS,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,KAAK,MAU5G;EACX,kBAAkB,SAAS,OAAO;GAChC,cAAc,WAAW;EAC3B;CACF;AACF"}
@@ -196,17 +196,17 @@ declare const XhComboboxRoot: import("vue").DefineComponent<import("vue").Extrac
196
196
  name: string;
197
197
  invalid: boolean;
198
198
  label: string;
199
- size: Size;
200
199
  value: string | string[];
201
200
  multiple: boolean;
202
201
  collection: ComboboxNode[];
203
202
  defaultValue: string | string[];
204
203
  tone: Tone;
204
+ size: Size;
205
205
  disabled: boolean;
206
+ offset: number;
207
+ translations: Partial<import("@xihan-ui/headless").ComboboxTranslations> | undefined;
206
208
  open: boolean;
207
209
  defaultOpen: boolean;
208
- translations: Partial<import("@xihan-ui/headless").ComboboxTranslations> | undefined;
209
- offset: number;
210
210
  variant: ControlVariant;
211
211
  readOnly: boolean;
212
212
  loop: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.d.ts","names":[],"sources":["../../../src/components/combobox/combobox.ts"],"mappings":";;;;;KAeK,gBAAgB;;KAGT,wBAAwB,KAClC;cAIW,8BAAc,8BAAA;;IAIM,MAAA,SAAS;;;;;;;;;;;;;;IAKJ,MAAA;;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAeT,MAAA,SAAS;;;;;;IAGR,MAAA,SAAS;;;;IACb,MAAA,SAAS;;;;;;;;IAEX,MAAA,SAAS;;;;IACZ,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;EAIN,iBAAA,UAAA,UAAU;EACJ,uBAAA,UAAA,UAAU;EACjB,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;EACA,sBAAA,aAAA,UAAU;EACtB,gBAAA,OAAA,UAAU;;;IAtCJ,MAAA,SAAS;;;;;;;;;;;;;;IAKJ,MAAA;;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAeT,MAAA,SAAS;;;;;;IAGR,MAAA,SAAS;;;;IACb,MAAA,SAAS;;;;;;;;IAEX,MAAA,SAAS;;;;IACZ,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYvB,WAAC,OAAO,0BAA0B;EACpC,cAAM;EACN,cAAM;EACP,QAAC,MAAM,qBAAqB;kCAqDrC;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAO1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAS5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,8BAAA;;;;;;IAOF,MAAA,SAAS;;;;;;;;;;;IAAT,MAAA,SAAS;;;;;qCASjC;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAc/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAY5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,8BAAA;;;;;;;;;;;;MAW9B,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAOnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8BAAc,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAkBzB;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAO1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"combobox.d.ts","names":[],"sources":["../../../src/components/combobox/combobox.ts"],"mappings":";;;;;KAiBK,gBAAgB;;KAGT,wBAAwB,KAClC;cAIW,8BAAc,8BAAA;;IAIM,MAAA,SAAS;;;;;;;;;;;;;;IAKJ,MAAA;;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAeT,MAAA,SAAS;;;;;;IAGR,MAAA,SAAS;;;;IACb,MAAA,SAAS;;;;;;;;IAEX,MAAA,SAAS;;;;IACZ,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;EAIN,iBAAA,UAAA,UAAU;EACJ,uBAAA,UAAA,UAAU;EACjB,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;EACA,sBAAA,aAAA,UAAU;EACtB,gBAAA,OAAA,UAAU;;;IAtCJ,MAAA,SAAS;;;;;;;;;;;;;;IAKJ,MAAA;;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAeT,MAAA,SAAS;;;;;;IAGR,MAAA,SAAS;;;;IACb,MAAA,SAAS;;;;;;;;IAEX,MAAA,SAAS;;;;IACZ,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYvB,WAAC,OAAO,0BAA0B;EACpC,cAAM;EACN,cAAM;EACP,QAAC,MAAM,qBAAqB;kCAqDrC;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAO1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAS5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,8BAAA;;;;;;IAOF,MAAA,SAAS;;;;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAcjC;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAgB/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAY5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,8BAAA;;;;;;;;;;;;MAW9B,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAOnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8BAAc,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAkBzB;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAO1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -1,3 +1,5 @@
1
+ import { useScrollbars } from "../../runtime/use-scrollbars.js";
2
+ import { useFieldLabelWiring, useFieldStateWiring } from "../field/use-field-control.js";
1
3
  import { provideCombobox, provideComboboxItem, provideComboboxItemGroup, useComboboxContext, useComboboxItemContext, useComboboxItemGroupContext } from "./context.js";
2
4
  import { useCombobox } from "./use-combobox.js";
3
5
  import { Teleport, computed, defineComponent, h, mergeProps, onMounted, onUnmounted, onUpdated, watch } from "vue";
@@ -165,13 +167,16 @@ as: {
165
167
  default: "input"
166
168
  } },
167
169
  setup(props) {
170
+ const fieldWiring = useFieldStateWiring();
171
+ const fieldLabel = useFieldLabelWiring();
168
172
  const ctx = useComboboxContext();
169
- return () => h(props.as, {
173
+ return () => h(props.as, fieldLabel.value({
170
174
  ...ctx.api.value.getInputProps({ as: props.as }),
171
175
  ref: (el) => {
172
176
  ctx.inputRef.value = el;
173
- }
174
- });
177
+ },
178
+ ...fieldWiring.value
179
+ }));
175
180
  }
176
181
  });
177
182
  const XhComboboxTrigger = defineComponent({
@@ -193,12 +198,13 @@ const XhComboboxPositioner = defineComponent({
193
198
  inheritAttrs: false,
194
199
  setup(_, { slots, attrs }) {
195
200
  const ctx = useComboboxContext();
201
+ const bars = useScrollbars({ scrollable: () => ctx.contentRef.value });
196
202
  return () => h(Teleport, { to: ctx.portalTarget.value }, [h("div", {
197
203
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
198
204
  ref: (el) => {
199
205
  ctx.positionerRef.value = el;
200
206
  }
201
- }, slots.default?.())]);
207
+ }, [...slots.default?.() ?? [], ...bars.render()])]);
202
208
  }
203
209
  });
204
210
  const XhComboboxContent = defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.js","names":[],"sources":["../../../src/components/combobox/combobox.ts"],"sourcesContent":["import type { ComboboxApi, ComboboxInputBehavior, ComboboxInputEl, ComboboxInputHost, ComboboxItemGroupProps, ComboboxItemProps, ComboboxNode, ComboboxNodeMeta, ComboboxSchema } from '@xihan-ui/headless'\nimport type { ControlVariant, Placement, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, mergeProps, onMounted, onUnmounted, onUpdated, Teleport, watch } from 'vue'\nimport {\n provideCombobox,\n provideComboboxItem,\n provideComboboxItemGroup,\n useComboboxContext,\n useComboboxItemContext,\n useComboboxItemGroupContext,\n} from './context'\nimport { useCombobox } from './use-combobox'\n\ntype ComboboxProps = ComboboxSchema['props']\n\n/** 默认插槽的载荷:展开状态、选中值、输入串、高亮候选、空态,与改这些的命令。 */\nexport type ComboboxRootSlotProps = Pick<\n ComboboxApi,\n 'open' | 'value' | 'inputValue' | 'highlightedValue' | 'empty' | 'isSelected' | 'setOpen' | 'setValue' | 'setInputValue' | 'clear'\n>\n\nexport const XhComboboxRoot = defineComponent({\n name: 'XhComboboxRoot',\n // 有 connect 兜底的 prop 一律 default: undefined\n props: {\n collection: { type: Array as PropType<ComboboxNode[]>, default: undefined },\n /** 标题文字。给了它就不必再写 label 部件;要放别的内容改用 label 插槽。 */\n label: { type: String, default: undefined },\n /** 无匹配时的提示语。给了它就不必再写 empty 部件;要放别的内容改用 empty 插槽。 */\n empty: { type: String, default: undefined },\n value: { type: [String, Array] as PropType<string | string[]>, default: undefined },\n defaultValue: { type: [String, Array] as PropType<string | string[]>, default: undefined },\n inputValue: { type: String, default: undefined },\n defaultInputValue: { type: String, default: undefined },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n /** 表单字段名;给了 hidden-input 才带 name 并参与提交 */\n name: { type: String, default: undefined },\n multiple: Boolean,\n disabled: Boolean,\n readOnly: Boolean,\n invalid: Boolean,\n loop: { type: Boolean, default: undefined },\n placeholder: { type: String, default: undefined },\n /** 自动铺开时是否渲染清空钮;手写部件模式不看它,写了节点即可清 */\n clearable: Boolean,\n translations: { type: Object as PropType<ComboboxProps['translations']>, default: undefined },\n allowCustomValue: Boolean,\n openOnClick: Boolean,\n inputBehavior: { type: String as PropType<ComboboxInputBehavior>, default: undefined },\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n variant: { type: String as PropType<ControlVariant>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<ComboboxProps, 'onValueChange'>) => true,\n 'input-value-change': (_details: PayloadOf<ComboboxProps, 'onInputValueChange'>) => true,\n 'open-change': (_details: PayloadOf<ComboboxProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<ComboboxProps, 'onValueChange'>['value']) => true,\n 'update:inputValue': (_inputValue: PayloadOf<ComboboxProps, 'onInputValueChange'>['inputValue']) => true,\n 'update:open': (_open: PayloadOf<ComboboxProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: ComboboxRootSlotProps) => VNode[]\n label?: () => VNode[]\n empty?: () => VNode[]\n item?: (node: ComboboxNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: ComboboxProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyInputValue: ComboboxProps['onInputValueChange'] = (details) => {\n emit('input-value-change', details)\n emit('update:inputValue', details.inputValue)\n }\n const notifyOpen: ComboboxProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useCombobox(props as ComboboxProps, {\n onValueChange: notifyValue,\n onInputValueChange: notifyInputValue,\n onOpenChange: notifyOpen,\n })\n provideCombobox(ctx)\n\n // 首帧结算一次候选条数供空态节点判断,之后的增删由条目自己上报\n onMounted(ctx.syncItems)\n onUpdated(ctx.syncItems)\n\n return () => h(\n 'div',\n ctx.api.value.getRootProps() as Record<string, unknown>,\n slots.default\n ? slots.default({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n inputValue: ctx.api.value.inputValue,\n highlightedValue: ctx.api.value.highlightedValue,\n empty: ctx.api.value.empty,\n isSelected: ctx.api.value.isSelected,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n setInputValue: ctx.api.value.setInputValue,\n clear: ctx.api.value.clear,\n })\n : props.collection\n ? renderDefaultTree(\n ctx.api.value.collection,\n slots.label?.() ?? (props.label != null ? [props.label] : null),\n slots.empty?.() ?? (props.empty != null ? [props.empty] : null),\n slots.item,\n props.clearable,\n )\n : [],\n )\n },\n})\n\nexport const XhComboboxLabel = defineComponent({\n name: 'XhComboboxLabel',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n // 用原生 label,connect 给的 for 指向输入框\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxControl = defineComponent({\n name: 'XhComboboxControl',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n return () => h('div', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.controlRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhComboboxInput = defineComponent({\n name: 'XhComboboxInput',\n props: {\n /**\n * 输入框渲染成哪个标签,默认 input。\n * 写 textarea 即多行宿主:connect 随之撤掉 type、role 与 aria-expanded。\n */\n as: { type: String as PropType<ComboboxInputHost>, default: 'input' },\n },\n setup(props) {\n const ctx = useComboboxContext()\n return () => h(props.as, {\n ...ctx.api.value.getInputProps({ as: props.as }) as Record<string, unknown>,\n ref: (el: unknown) => { ctx.inputRef.value = el as ComboboxInputEl },\n })\n },\n})\n\nexport const XhComboboxTrigger = defineComponent({\n name: 'XhComboboxTrigger',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n return () => h('button', ctx.api.value.getTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxClearTrigger = defineComponent({\n name: 'XhComboboxClearTrigger',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxPositioner = defineComponent({\n name: 'XhComboboxPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useComboboxContext()\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(Teleport, { to: ctx.portalTarget.value }, [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhComboboxContent = defineComponent({\n name: 'XhComboboxContent',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhComboboxItemGroup = defineComponent({\n name: 'XhComboboxItemGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useComboboxContext()\n const group = computed<ComboboxItemGroupProps>(() => ({ value: props.value }))\n provideComboboxItemGroup({ group })\n return () => h('div', ctx.api.value.getItemGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxItemGroupLabel = defineComponent({\n name: 'XhComboboxItemGroupLabel',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n const { group } = useComboboxItemGroupContext()\n return () => h('span', ctx.api.value.getItemGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxItem = defineComponent({\n name: 'XhComboboxItem',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useComboboxContext()\n const item = computed<ComboboxItemProps>(() => ({ value: props.value, disabled: props.disabled }))\n provideComboboxItem({ item })\n // 候选的进出与改名由条目自己上报,机器据此结算条数并摘掉悬空高亮\n onMounted(ctx.syncItems)\n onUnmounted(ctx.syncItems)\n // 节点就地复用时数量不变但身份换了,需按 value 另行上报\n watch(() => props.value, ctx.syncItems)\n return () => h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxItemText = defineComponent({\n name: 'XhComboboxItemText',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n const { item } = useComboboxItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxItemIndicator = defineComponent({\n name: 'XhComboboxItemIndicator',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n const { item } = useComboboxItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxHiddenInput = defineComponent({\n name: 'XhComboboxHiddenInput',\n setup() {\n const ctx = useComboboxContext()\n // 表单出口,不写这个部件即不参与表单提交\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n\nexport const XhComboboxEmpty = defineComponent({\n name: 'XhComboboxEmpty',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n // 放在 positioner 里作 content 的兄弟节点,不进 role=listbox\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 没写默认插槽时按 collection 铺开的整套结构,作者只交数据。\n * 与手写部件产出的 DOM 完全一致,要改结构就写默认插槽,行为不变。\n * 过滤仍归调用方:collection 就是此刻该显示的那几条候选。\n */\nfunction renderDefaultTree(\n collection: readonly ComboboxNodeMeta[],\n label: (VNode | string)[] | null,\n empty: (VNode | string)[] | null,\n itemSlot: ((node: ComboboxNodeMeta) => VNode[]) | undefined,\n clearable: boolean,\n): VNode[] {\n return [\n ...(label ? [h(XhComboboxLabel, null, () => label)] : []),\n h(XhComboboxControl, null, () => [\n h(XhComboboxInput),\n ...(clearable ? [h(XhComboboxClearTrigger)] : []),\n h(XhComboboxTrigger),\n ]),\n h(XhComboboxPositioner, null, () => [\n h(XhComboboxContent, null, () => collection.map(node =>\n h(XhComboboxItem, { key: node.value, value: node.value }, () => [\n h(XhComboboxItemText, null, () => itemSlot?.(node) ?? node.label),\n h(XhComboboxItemIndicator),\n ]),\n )),\n // 空态节点是 content 的兄弟,不进 role=listbox\n h(XhComboboxEmpty, null, () => empty ?? []),\n ]),\n ]\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"combobox.js","names":[],"sources":["../../../src/components/combobox/combobox.ts"],"sourcesContent":["import type { ComboboxApi, ComboboxInputBehavior, ComboboxInputEl, ComboboxInputHost, ComboboxItemGroupProps, ComboboxItemProps, ComboboxNode, ComboboxNodeMeta, ComboboxSchema } from '@xihan-ui/headless'\nimport type { ControlVariant, Placement, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, mergeProps, onMounted, onUnmounted, onUpdated, Teleport, watch } from 'vue'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport {\n provideCombobox,\n provideComboboxItem,\n provideComboboxItemGroup,\n useComboboxContext,\n useComboboxItemContext,\n useComboboxItemGroupContext,\n} from './context'\nimport { useCombobox } from './use-combobox'\n\ntype ComboboxProps = ComboboxSchema['props']\n\n/** 默认插槽的载荷:展开状态、选中值、输入串、高亮候选、空态,与改这些的命令。 */\nexport type ComboboxRootSlotProps = Pick<\n ComboboxApi,\n 'open' | 'value' | 'inputValue' | 'highlightedValue' | 'empty' | 'isSelected' | 'setOpen' | 'setValue' | 'setInputValue' | 'clear'\n>\n\nexport const XhComboboxRoot = defineComponent({\n name: 'XhComboboxRoot',\n // 有 connect 兜底的 prop 一律 default: undefined\n props: {\n collection: { type: Array as PropType<ComboboxNode[]>, default: undefined },\n /** 标题文字。给了它就不必再写 label 部件;要放别的内容改用 label 插槽。 */\n label: { type: String, default: undefined },\n /** 无匹配时的提示语。给了它就不必再写 empty 部件;要放别的内容改用 empty 插槽。 */\n empty: { type: String, default: undefined },\n value: { type: [String, Array] as PropType<string | string[]>, default: undefined },\n defaultValue: { type: [String, Array] as PropType<string | string[]>, default: undefined },\n inputValue: { type: String, default: undefined },\n defaultInputValue: { type: String, default: undefined },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n /** 表单字段名;给了 hidden-input 才带 name 并参与提交 */\n name: { type: String, default: undefined },\n multiple: Boolean,\n disabled: Boolean,\n readOnly: Boolean,\n invalid: Boolean,\n loop: { type: Boolean, default: undefined },\n placeholder: { type: String, default: undefined },\n /** 自动铺开时是否渲染清空钮;手写部件模式不看它,写了节点即可清 */\n clearable: Boolean,\n translations: { type: Object as PropType<ComboboxProps['translations']>, default: undefined },\n allowCustomValue: Boolean,\n openOnClick: Boolean,\n inputBehavior: { type: String as PropType<ComboboxInputBehavior>, default: undefined },\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n variant: { type: String as PropType<ControlVariant>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<ComboboxProps, 'onValueChange'>) => true,\n 'input-value-change': (_details: PayloadOf<ComboboxProps, 'onInputValueChange'>) => true,\n 'open-change': (_details: PayloadOf<ComboboxProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<ComboboxProps, 'onValueChange'>['value']) => true,\n 'update:inputValue': (_inputValue: PayloadOf<ComboboxProps, 'onInputValueChange'>['inputValue']) => true,\n 'update:open': (_open: PayloadOf<ComboboxProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: ComboboxRootSlotProps) => VNode[]\n label?: () => VNode[]\n empty?: () => VNode[]\n item?: (node: ComboboxNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: ComboboxProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyInputValue: ComboboxProps['onInputValueChange'] = (details) => {\n emit('input-value-change', details)\n emit('update:inputValue', details.inputValue)\n }\n const notifyOpen: ComboboxProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useCombobox(props as ComboboxProps, {\n onValueChange: notifyValue,\n onInputValueChange: notifyInputValue,\n onOpenChange: notifyOpen,\n })\n provideCombobox(ctx)\n\n // 首帧结算一次候选条数供空态节点判断,之后的增删由条目自己上报\n onMounted(ctx.syncItems)\n onUpdated(ctx.syncItems)\n\n return () => h(\n 'div',\n ctx.api.value.getRootProps() as Record<string, unknown>,\n slots.default\n ? slots.default({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n inputValue: ctx.api.value.inputValue,\n highlightedValue: ctx.api.value.highlightedValue,\n empty: ctx.api.value.empty,\n isSelected: ctx.api.value.isSelected,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n setInputValue: ctx.api.value.setInputValue,\n clear: ctx.api.value.clear,\n })\n : props.collection\n ? renderDefaultTree(\n ctx.api.value.collection,\n slots.label?.() ?? (props.label != null ? [props.label] : null),\n slots.empty?.() ?? (props.empty != null ? [props.empty] : null),\n slots.item,\n props.clearable,\n )\n : [],\n )\n },\n})\n\nexport const XhComboboxLabel = defineComponent({\n name: 'XhComboboxLabel',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n // 用原生 label,connect 给的 for 指向输入框\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxControl = defineComponent({\n name: 'XhComboboxControl',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n return () => h('div', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.controlRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhComboboxInput = defineComponent({\n name: 'XhComboboxInput',\n props: {\n /**\n * 输入框渲染成哪个标签,默认 input。\n * 写 textarea 即多行宿主:connect 随之撤掉 type、role 与 aria-expanded。\n */\n as: { type: String as PropType<ComboboxInputHost>, default: 'input' },\n },\n setup(props) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useComboboxContext()\n return () => h(props.as, fieldLabel.value({\n ...ctx.api.value.getInputProps({ as: props.as }) as Record<string, unknown>,\n ref: (el: unknown) => { ctx.inputRef.value = el as ComboboxInputEl },\n ...fieldWiring.value,\n }))\n },\n})\n\nexport const XhComboboxTrigger = defineComponent({\n name: 'XhComboboxTrigger',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n return () => h('button', ctx.api.value.getTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxClearTrigger = defineComponent({\n name: 'XhComboboxClearTrigger',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxPositioner = defineComponent({\n name: 'XhComboboxPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useComboboxContext()\n // 候选列表的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(Teleport, { to: ctx.portalTarget.value }, [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhComboboxContent = defineComponent({\n name: 'XhComboboxContent',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhComboboxItemGroup = defineComponent({\n name: 'XhComboboxItemGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useComboboxContext()\n const group = computed<ComboboxItemGroupProps>(() => ({ value: props.value }))\n provideComboboxItemGroup({ group })\n return () => h('div', ctx.api.value.getItemGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxItemGroupLabel = defineComponent({\n name: 'XhComboboxItemGroupLabel',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n const { group } = useComboboxItemGroupContext()\n return () => h('span', ctx.api.value.getItemGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxItem = defineComponent({\n name: 'XhComboboxItem',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useComboboxContext()\n const item = computed<ComboboxItemProps>(() => ({ value: props.value, disabled: props.disabled }))\n provideComboboxItem({ item })\n // 候选的进出与改名由条目自己上报,机器据此结算条数并摘掉悬空高亮\n onMounted(ctx.syncItems)\n onUnmounted(ctx.syncItems)\n // 节点就地复用时数量不变但身份换了,需按 value 另行上报\n watch(() => props.value, ctx.syncItems)\n return () => h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxItemText = defineComponent({\n name: 'XhComboboxItemText',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n const { item } = useComboboxItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxItemIndicator = defineComponent({\n name: 'XhComboboxItemIndicator',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n const { item } = useComboboxItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhComboboxHiddenInput = defineComponent({\n name: 'XhComboboxHiddenInput',\n setup() {\n const ctx = useComboboxContext()\n // 表单出口,不写这个部件即不参与表单提交\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n\nexport const XhComboboxEmpty = defineComponent({\n name: 'XhComboboxEmpty',\n setup(_, { slots }) {\n const ctx = useComboboxContext()\n // 放在 positioner 里作 content 的兄弟节点,不进 role=listbox\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 没写默认插槽时按 collection 铺开的整套结构,作者只交数据。\n * 与手写部件产出的 DOM 完全一致,要改结构就写默认插槽,行为不变。\n * 过滤仍归调用方:collection 就是此刻该显示的那几条候选。\n */\nfunction renderDefaultTree(\n collection: readonly ComboboxNodeMeta[],\n label: (VNode | string)[] | null,\n empty: (VNode | string)[] | null,\n itemSlot: ((node: ComboboxNodeMeta) => VNode[]) | undefined,\n clearable: boolean,\n): VNode[] {\n return [\n ...(label ? [h(XhComboboxLabel, null, () => label)] : []),\n h(XhComboboxControl, null, () => [\n h(XhComboboxInput),\n ...(clearable ? [h(XhComboboxClearTrigger)] : []),\n h(XhComboboxTrigger),\n ]),\n h(XhComboboxPositioner, null, () => [\n h(XhComboboxContent, null, () => collection.map(node =>\n h(XhComboboxItem, { key: node.value, value: node.value }, () => [\n h(XhComboboxItemText, null, () => itemSlot?.(node) ?? node.label),\n h(XhComboboxItemIndicator),\n ]),\n )),\n // 空态节点是 content 的兄弟,不进 role=listbox\n h(XhComboboxEmpty, null, () => empty ?? []),\n ]),\n ]\n}\n"],"mappings":";;;;;;AAyBA,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CAEN,OAAO;EACL,YAAY;GAAE,MAAM;GAAmC,SAAS,KAAA;EAAU;;EAE1E,OAAO;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;;EAE1C,OAAO;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC1C,OAAO;GAAE,MAAM,CAAC,QAAQ,KAAK;GAAkC,SAAS,KAAA;EAAU;EAClF,cAAc;GAAE,MAAM,CAAC,QAAQ,KAAK;GAAkC,SAAS,KAAA;EAAU;EACzF,YAAY;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC/C,mBAAmB;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EACtD,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;;EAEb,MAAM;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EACzC,UAAU;EACV,UAAU;EACV,UAAU;EACV,SAAS;EACT,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;;EAEhD,WAAW;EACX,cAAc;GAAE,MAAM;GAAmD,SAAS,KAAA;EAAU;EAC5F,kBAAkB;EAClB,aAAa;EACb,eAAe;GAAE,MAAM;GAA2C,SAAS,KAAA;EAAU;EACrF,WAAW;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EACrE,QAAQ;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC3C,SAAS;GAAE,MAAM;GAAoC,SAAS,KAAA;EAAU;EACxE,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;EAC3D,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;CAC7D;CAEA,OAAO;EACL,iBAAiB,aAAwD;EACzE,uBAAuB,aAA6D;EACpF,gBAAgB,aAAuD;EACvE,iBAAiB,WAA+D;EAChF,sBAAsB,gBAA8E;EACpG,gBAAgB,UAA4D;CAC9E;CACA,OAAO;CAMP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,eAA+C,YAAY;GAC/D,KAAK,gBAAgB,OAAO;GAC5B,KAAK,gBAAgB,QAAQ,KAAK;EACpC;EACA,MAAM,oBAAyD,YAAY;GACzE,KAAK,sBAAsB,OAAO;GAClC,KAAK,qBAAqB,QAAQ,UAAU;EAC9C;EACA,MAAM,cAA6C,YAAY;GAC7D,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,MAAM,YAAY,OAAwB;GAC9C,eAAe;GACf,oBAAoB;GACpB,cAAc;EAChB,CAAC;EACD,gBAAgB,GAAG;EAGnB,UAAU,IAAI,SAAS;EACvB,UAAU,IAAI,SAAS;EAEvB,aAAa,EACX,OACA,IAAI,IAAI,MAAM,aAAa,GAC3B,MAAM,UACF,MAAM,QAAQ;GACZ,MAAM,IAAI,IAAI,MAAM;GACpB,OAAO,IAAI,IAAI,MAAM;GACrB,YAAY,IAAI,IAAI,MAAM;GAC1B,kBAAkB,IAAI,IAAI,MAAM;GAChC,OAAO,IAAI,IAAI,MAAM;GACrB,YAAY,IAAI,IAAI,MAAM;GAC1B,SAAS,IAAI,IAAI,MAAM;GACvB,UAAU,IAAI,IAAI,MAAM;GACxB,eAAe,IAAI,IAAI,MAAM;GAC7B,OAAO,IAAI,IAAI,MAAM;EACvB,CAAC,IACD,MAAM,aACJ,kBACE,IAAI,IAAI,MAAM,YACd,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,CAAC,MAAM,KAAK,IAAI,OAC1D,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,CAAC,MAAM,KAAK,IAAI,OAC1D,MAAM,MACN,MAAM,SACR,IACA,CAAC,CACT;CACF;AACF,CAAC;AAED,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAE/B,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,gBAAgB;GACjC,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CACN,OAAO;;;;;AAKL,IAAI;EAAE,MAAM;EAAuC,SAAS;CAAQ,EACtE;CACA,MAAM,OAAO;EAEX,MAAM,cAAc,oBAAoB;EAExC,MAAM,aAAa,oBAAoB;EACvC,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,MAAM,IAAI,WAAW,MAAM;GACxC,GAAG,IAAI,IAAI,MAAM,cAAc,EAAE,IAAI,MAAM,GAAG,CAAC;GAC/C,MAAM,OAAgB;IAAE,IAAI,SAAS,QAAQ;GAAsB;GACnE,GAAG,YAAY;EACjB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,gBAAgB,GAA8B,MAAM,UAAU,CAAC;CACxG;AACF,CAAC;AAED,MAAa,yBAAyB,gBAAgB;CACpD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC7G;AACF,CAAC;AAED,MAAa,uBAAuB,gBAAgB;CAClD,MAAM;CAEN,cAAc;CACd,MAAM,GAAG,EAAE,OAAO,SAAS;EACzB,MAAM,MAAM,mBAAmB;EAE/B,MAAM,OAAO,cAAc,EAAE,kBAAkB,IAAI,WAAW,MAAM,CAAC;EAErE,aAAa,EAAE,UAAU,EAAE,IAAI,IAAI,aAAa,MAAM,GAAG,CACvD,EAAE,OAAO;GACP,GAAG,WAAW,IAAI,IAAI,MAAM,mBAAmB,GAA8B,KAAK;GAClF,MAAM,OAAgB;IAAE,IAAI,cAAc,QAAQ;GAAkB;EACtE,GAAG,CAAC,GAAI,MAAM,UAAU,KAAK,CAAC,GAAI,GAAG,KAAK,OAAO,CAAC,CAAC,CACrD,CAAC;CACH;AACF,CAAC;AAED,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,gBAAgB;GAGjC,OAAO,IAAI,QAAQ,QAAQ,KAAA,IAAY,EAAE,SAAS,OAAO;GACzD,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,OAAO,EACL,OAAO;EAAE,MAAM;EAAQ,UAAU;CAAK,EACxC;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,mBAAmB;EAC/B,MAAM,QAAQ,gBAAwC,EAAE,OAAO,MAAM,MAAM,EAAE;EAC7E,yBAAyB,EAAE,MAAM,CAAC;EAClC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,kBAAkB,MAAM,KAAK,GAA8B,MAAM,UAAU,CAAC;CAClH;AACF,CAAC;AAED,MAAa,2BAA2B,gBAAgB;CACtD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,MAAM,EAAE,UAAU,4BAA4B;EAC9C,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,uBAAuB,MAAM,KAAK,GAA8B,MAAM,UAAU,CAAC;CACxH;AACF,CAAC;AAED,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CACN,OAAO;EACL,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;EAEtC,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;CAChD;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,mBAAmB;EAC/B,MAAM,OAAO,gBAAmC;GAAE,OAAO,MAAM;GAAO,UAAU,MAAM;EAAS,EAAE;EACjG,oBAAoB,EAAE,KAAK,CAAC;EAE5B,UAAU,IAAI,SAAS;EACvB,YAAY,IAAI,SAAS;EAEzB,YAAY,MAAM,OAAO,IAAI,SAAS;EACtC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CAC5G;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,MAAM,EAAE,SAAS,uBAAuB;EACxC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,iBAAiB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACjH;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,MAAM,EAAE,SAAS,uBAAuB;EACxC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,sBAAsB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACtH;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,mBAAmB;EAE/B,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,oBAAoB,CAA4B;CACxF;AACF,CAAC;AAED,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAE/B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACnG;AACF,CAAC;;;;;;AAOD,SAAS,kBACP,YACA,OACA,OACA,UACA,WACS;CACT,OAAO;EACL,GAAI,QAAQ,CAAC,EAAE,iBAAiB,YAAY,KAAK,CAAC,IAAI,CAAC;EACvD,EAAE,mBAAmB,YAAY;GAC/B,EAAE,eAAe;GACjB,GAAI,YAAY,CAAC,EAAE,sBAAsB,CAAC,IAAI,CAAC;GAC/C,EAAE,iBAAiB;EACrB,CAAC;EACD,EAAE,sBAAsB,YAAY,CAClC,EAAE,mBAAmB,YAAY,WAAW,KAAI,SAC9C,EAAE,gBAAgB;GAAE,KAAK,KAAK;GAAO,OAAO,KAAK;EAAM,SAAS,CAC9D,EAAE,oBAAoB,YAAY,WAAW,IAAI,KAAK,KAAK,KAAK,GAChE,EAAE,uBAAuB,CAC3B,CAAC,CACH,CAAC,GAED,EAAE,iBAAiB,YAAY,SAAS,CAAC,CAAC,CAC5C,CAAC;CACH;AACF"}
@@ -1,8 +1,8 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/combobox/context.ts
3
- const KEY = Symbol("xh-combobox");
4
- const ITEM_KEY = Symbol("xh-combobox-item");
5
- const GROUP_KEY = Symbol("xh-combobox-item-group");
3
+ const KEY = Symbol.for("xh-combobox");
4
+ const ITEM_KEY = Symbol.for("xh-combobox-item");
5
+ const GROUP_KEY = Symbol.for("xh-combobox-item-group");
6
6
  function provideCombobox(ctx) {
7
7
  provide(KEY, ctx);
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/combobox/context.ts"],"sourcesContent":["import type { ComboboxItemGroupProps, ComboboxItemProps } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { ComboboxContext } from './use-combobox'\nimport { inject, provide } from 'vue'\n\n/** 候选自报的值与禁用,供 item-text / item-indicator 这类子部件复用同一份声明。 */\nexport interface ComboboxItemContext {\n item: ComputedRef<ComboboxItemProps>\n}\n\n/** 分组自报的身份,供分组标题取到同一个值(标题的 id 由它派生)。 */\nexport interface ComboboxItemGroupContext {\n group: ComputedRef<ComboboxItemGroupProps>\n}\n\nconst KEY: InjectionKey<ComboboxContext> = Symbol('xh-combobox')\nconst ITEM_KEY: InjectionKey<ComboboxItemContext> = Symbol('xh-combobox-item')\nconst GROUP_KEY: InjectionKey<ComboboxItemGroupContext> = Symbol('xh-combobox-item-group')\n\nexport function provideCombobox(ctx: ComboboxContext): void {\n provide(KEY, ctx)\n}\n\nexport function useComboboxContext(): ComboboxContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Combobox 部件必须用在 XhComboboxRoot 内')\n return ctx\n}\n\nexport function provideComboboxItem(ctx: ComboboxItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useComboboxItemContext(): ComboboxItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Combobox 候选子部件必须用在 XhComboboxItem 内')\n return ctx\n}\n\nexport function provideComboboxItemGroup(ctx: ComboboxItemGroupContext): void {\n provide(GROUP_KEY, ctx)\n}\n\nexport function useComboboxItemGroupContext(): ComboboxItemGroupContext {\n const ctx = inject(GROUP_KEY, null)\n if (!ctx)\n throw new Error('[xh] Combobox 分组标题必须用在 XhComboboxItemGroup 内')\n return ctx\n}\n"],"mappings":";;AAeA,MAAM,MAAqC,OAAO,aAAa;AAC/D,MAAM,WAA8C,OAAO,kBAAkB;AAC7E,MAAM,YAAoD,OAAO,wBAAwB;AAEzF,SAAgB,gBAAgB,KAA4B;CAC1D,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,qBAAsC;CACpD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,uCAAuC;CACzD,OAAO;AACT;AAEA,SAAgB,oBAAoB,KAAgC;CAClE,QAAQ,UAAU,GAAG;AACvB;AAEA,SAAgB,yBAA8C;CAC5D,MAAM,MAAM,OAAO,UAAU,IAAI;CACjC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,0CAA0C;CAC5D,OAAO;AACT;AAEA,SAAgB,yBAAyB,KAAqC;CAC5E,QAAQ,WAAW,GAAG;AACxB;AAEA,SAAgB,8BAAwD;CACtE,MAAM,MAAM,OAAO,WAAW,IAAI;CAClC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,8CAA8C;CAChE,OAAO;AACT"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/combobox/context.ts"],"sourcesContent":["import type { ComboboxItemGroupProps, ComboboxItemProps } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { ComboboxContext } from './use-combobox'\nimport { inject, provide } from 'vue'\n\n/** 候选自报的值与禁用,供 item-text / item-indicator 这类子部件复用同一份声明。 */\nexport interface ComboboxItemContext {\n item: ComputedRef<ComboboxItemProps>\n}\n\n/** 分组自报的身份,供分组标题取到同一个值(标题的 id 由它派生)。 */\nexport interface ComboboxItemGroupContext {\n group: ComputedRef<ComboboxItemGroupProps>\n}\n\nconst KEY: InjectionKey<ComboboxContext> = Symbol.for('xh-combobox')\nconst ITEM_KEY: InjectionKey<ComboboxItemContext> = Symbol.for('xh-combobox-item')\nconst GROUP_KEY: InjectionKey<ComboboxItemGroupContext> = Symbol.for('xh-combobox-item-group')\n\nexport function provideCombobox(ctx: ComboboxContext): void {\n provide(KEY, ctx)\n}\n\nexport function useComboboxContext(): ComboboxContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Combobox 部件必须用在 XhComboboxRoot 内')\n return ctx\n}\n\nexport function provideComboboxItem(ctx: ComboboxItemContext): void {\n provide(ITEM_KEY, ctx)\n}\n\nexport function useComboboxItemContext(): ComboboxItemContext {\n const ctx = inject(ITEM_KEY, null)\n if (!ctx)\n throw new Error('[xh] Combobox 候选子部件必须用在 XhComboboxItem 内')\n return ctx\n}\n\nexport function provideComboboxItemGroup(ctx: ComboboxItemGroupContext): void {\n provide(GROUP_KEY, ctx)\n}\n\nexport function useComboboxItemGroupContext(): ComboboxItemGroupContext {\n const ctx = inject(GROUP_KEY, null)\n if (!ctx)\n throw new Error('[xh] Combobox 分组标题必须用在 XhComboboxItemGroup 内')\n return ctx\n}\n"],"mappings":";;AAeA,MAAM,MAAqC,OAAO,IAAI,aAAa;AACnE,MAAM,WAA8C,OAAO,IAAI,kBAAkB;AACjF,MAAM,YAAoD,OAAO,IAAI,wBAAwB;AAE7F,SAAgB,gBAAgB,KAA4B;CAC1D,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,qBAAsC;CACpD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,uCAAuC;CACzD,OAAO;AACT;AAEA,SAAgB,oBAAoB,KAAgC;CAClE,QAAQ,UAAU,GAAG;AACvB;AAEA,SAAgB,yBAA8C;CAC5D,MAAM,MAAM,OAAO,UAAU,IAAI;CACjC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,0CAA0C;CAC5D,OAAO;AACT;AAEA,SAAgB,yBAAyB,KAAqC;CAC5E,QAAQ,WAAW,GAAG;AACxB;AAEA,SAAgB,8BAAwD;CACtE,MAAM,MAAM,OAAO,WAAW,IAAI;CAClC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,8CAA8C;CAChE,OAAO;AACT"}
@@ -29,7 +29,7 @@ function useCombobox(props, handlers = {}) {
29
29
  const registerLayer = () => config.layerRegistry.register({
30
30
  kind: "popover",
31
31
  node: () => contentRef.value,
32
- branches: () => [controlRef.value].filter(Boolean),
32
+ branches: () => [controlRef.value, positionerRef.value].filter(Boolean),
33
33
  isModal: () => false,
34
34
  setModal: () => {},
35
35
  surfaces: () => []
@@ -1 +1 @@
1
- {"version":3,"file":"use-combobox.js","names":[],"sources":["../../../src/components/combobox/use-combobox.ts"],"sourcesContent":["import type { ComboboxApi, ComboboxInputEl, ComboboxSchema } from '@xihan-ui/headless'\nimport type { Cleanup, Layer, RuntimeConfig } from '@xihan-ui/kernel'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef, Ref } from 'vue'\nimport { comboboxMachine, connectCombobox } from '@xihan-ui/headless'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/kernel'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, nextTick, ref } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface ComboboxContext {\n /** 机器实例,供部件直接上报 DOM 侧事实。 */\n service: Service<ComboboxSchema>\n api: ComputedRef<ComboboxApi>\n controlRef: Ref<HTMLElement | null>\n /** 输入宿主,input 或 textarea;由 XhComboboxInput 的 as 决定渲染成哪个。 */\n inputRef: Ref<ComboboxInputEl | null>\n positionerRef: Ref<HTMLElement | null>\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 上报候选集合可能变了;同一拍里多次调用只上报一次。 */\n syncItems: () => void\n /** 浮层搬到哪儿:全局配置的 portalContainer > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useCombobox(\n props: ComboboxSchema['props'],\n handlers: Pick<ComboboxSchema['props'], 'onValueChange' | 'onInputValueChange' | 'onOpenChange'> = {},\n): ComboboxContext {\n const xhConfig = useXhConfig()\n const controlRef = ref<HTMLElement | null>(null)\n const inputRef = ref<ComboboxInputEl | null>(null)\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(comboboxMachine, () => ({ ...props, ...handlers }), scope)\n\n // 服务端没有 DOM、也就没有退场:config 传 null 时闸门退化成「跟着展开态」\n let config: RuntimeConfig | null = null\n\n if (typeof document !== 'undefined') {\n config = createRuntimeConfig({ scope, idGenerator: idGen })\n\n // 只提供注册函数,实际入栈出栈由机器的 trackLayer 效应按展开态驱动\n const registerLayer = (): { layer: Layer, dispose: Cleanup } => config!.layerRegistry.register({\n kind: 'popover',\n node: () => contentRef.value,\n // 整个输入行记为本层分支,点输入框或触发按钮算层内交互\n branches: () => [controlRef.value].filter(Boolean) as Element[],\n isModal: () => false,\n setModal: () => {},\n surfaces: () => [],\n })\n\n // 定位引擎由适配器注入,机器只经端口驱动;锚点取整个输入行\n service.refs.set('config', config!)\n service.refs.set('registerLayer', registerLayer)\n service.refs.set('position', createPositionEngine())\n service.refs.set('getAnchorEl', () => controlRef.value)\n service.refs.set('getFloatingEl', () => positionerRef.value)\n service.refs.set('getContentEl', () => contentRef.value)\n service.refs.set('getInputEl', () => inputRef.value)\n }\n\n // 合并到下一拍统一上报,同时等待 DOM 落定\n let syncScheduled = false\n const syncItems = (): void => {\n if (syncScheduled)\n return\n syncScheduled = true\n void nextTick(() => {\n syncScheduled = false\n if (service.getStatus() === 'Started')\n service.send({ type: 'ITEMS.SYNC' })\n })\n }\n\n const api = computed(() => connectCombobox(service, vueNormalize))\n // 退场闸门:收起从跟着 open 走,改成跟着 presence 走\n const visible = useOverlayExit({ config, isOpen: () => api.value.open, contentRef })\n // 先问全局配置的落点,没有才落 body\n const portalTarget = computed<string | Element>(() => xhConfig.value.portalContainer?.() ?? config?.portalContainer() ?? 'body')\n\n return { visible, service, api, controlRef, inputRef, positionerRef, contentRef, syncItems, portalTarget }\n}\n"],"mappings":";;;;;;;;;;AA+BA,SAAgB,YACd,OACA,WAAmG,CAAC,GACnF;CACjB,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,IAAwB,IAAI;CAC/C,MAAM,WAAW,IAA4B,IAAI;CACjD,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,aAAa,IAAwB,IAAI;CAE/C,MAAM,QAAQ,qBAAqB;CACnC,MAAM,QAAQ,YAAY,MAAM,KAAK;CACrC,MAAM,UAAU,WAAW,wBAAwB;EAAE,GAAG;EAAO,GAAG;CAAS,IAAI,KAAK;CAGpF,IAAI,SAA+B;CAEnC,IAAI,OAAO,aAAa,aAAa;EACnC,SAAS,oBAAoB;GAAE;GAAO,aAAa;EAAM,CAAC;EAG1D,MAAM,sBAA0D,OAAQ,cAAc,SAAS;GAC7F,MAAM;GACN,YAAY,WAAW;GAEvB,gBAAgB,CAAC,WAAW,KAAK,CAAC,CAAC,OAAO,OAAO;GACjD,eAAe;GACf,gBAAgB,CAAC;GACjB,gBAAgB,CAAC;EACnB,CAAC;EAGD,QAAQ,KAAK,IAAI,UAAU,MAAO;EAClC,QAAQ,KAAK,IAAI,iBAAiB,aAAa;EAC/C,QAAQ,KAAK,IAAI,YAAY,qBAAqB,CAAC;EACnD,QAAQ,KAAK,IAAI,qBAAqB,WAAW,KAAK;EACtD,QAAQ,KAAK,IAAI,uBAAuB,cAAc,KAAK;EAC3D,QAAQ,KAAK,IAAI,sBAAsB,WAAW,KAAK;EACvD,QAAQ,KAAK,IAAI,oBAAoB,SAAS,KAAK;CACrD;CAGA,IAAI,gBAAgB;CACpB,MAAM,kBAAwB;EAC5B,IAAI,eACF;EACF,gBAAgB;EAChB,eAAoB;GAClB,gBAAgB;GAChB,IAAI,QAAQ,UAAU,MAAM,WAC1B,QAAQ,KAAK,EAAE,MAAM,aAAa,CAAC;EACvC,CAAC;CACH;CAEA,MAAM,MAAM,eAAe,gBAAgB,SAAS,YAAY,CAAC;CAMjE,OAAO;EAAE,SAJO,eAAe;GAAE;GAAQ,cAAc,IAAI,MAAM;GAAM;EAAW,CAInE;EAAG;EAAS;EAAK;EAAY;EAAU;EAAe;EAAY;EAAW,cAFvE,eAAiC,SAAS,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,KAAK,MAElB;CAAE;AAC3G"}
1
+ {"version":3,"file":"use-combobox.js","names":[],"sources":["../../../src/components/combobox/use-combobox.ts"],"sourcesContent":["import type { ComboboxApi, ComboboxInputEl, ComboboxSchema } from '@xihan-ui/headless'\nimport type { Cleanup, Layer, RuntimeConfig } from '@xihan-ui/kernel'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef, Ref } from 'vue'\nimport { comboboxMachine, connectCombobox } from '@xihan-ui/headless'\nimport { createRuntimeConfig, createScope } from '@xihan-ui/kernel'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, nextTick, ref } from 'vue'\nimport { useXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface ComboboxContext {\n /** 机器实例,供部件直接上报 DOM 侧事实。 */\n service: Service<ComboboxSchema>\n api: ComputedRef<ComboboxApi>\n controlRef: Ref<HTMLElement | null>\n /** 输入宿主,input 或 textarea;由 XhComboboxInput 的 as 决定渲染成哪个。 */\n inputRef: Ref<ComboboxInputEl | null>\n positionerRef: Ref<HTMLElement | null>\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 上报候选集合可能变了;同一拍里多次调用只上报一次。 */\n syncItems: () => void\n /** 浮层搬到哪儿:全局配置的 portalContainer > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useCombobox(\n props: ComboboxSchema['props'],\n handlers: Pick<ComboboxSchema['props'], 'onValueChange' | 'onInputValueChange' | 'onOpenChange'> = {},\n): ComboboxContext {\n const xhConfig = useXhConfig()\n const controlRef = ref<HTMLElement | null>(null)\n const inputRef = ref<ComboboxInputEl | null>(null)\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(comboboxMachine, () => ({ ...props, ...handlers }), scope)\n\n // 服务端没有 DOM、也就没有退场:config 传 null 时闸门退化成「跟着展开态」\n let config: RuntimeConfig | null = null\n\n if (typeof document !== 'undefined') {\n config = createRuntimeConfig({ scope, idGenerator: idGen })\n\n // 只提供注册函数,实际入栈出栈由机器的 trackLayer 效应按展开态驱动\n const registerLayer = (): { layer: Layer, dispose: Cleanup } => config!.layerRegistry.register({\n kind: 'popover',\n node: () => contentRef.value,\n // 整个输入行记为本层分支,点输入框或触发按钮算层内交互;\n // 浮层壳一并记上:候选列表之外还浮着自绘滚动条,按住它拖动不该把列表消解掉\n branches: () => [controlRef.value, positionerRef.value].filter(Boolean) as Element[],\n isModal: () => false,\n setModal: () => {},\n surfaces: () => [],\n })\n\n // 定位引擎由适配器注入,机器只经端口驱动;锚点取整个输入行\n service.refs.set('config', config!)\n service.refs.set('registerLayer', registerLayer)\n service.refs.set('position', createPositionEngine())\n service.refs.set('getAnchorEl', () => controlRef.value)\n service.refs.set('getFloatingEl', () => positionerRef.value)\n service.refs.set('getContentEl', () => contentRef.value)\n service.refs.set('getInputEl', () => inputRef.value)\n }\n\n // 合并到下一拍统一上报,同时等待 DOM 落定\n let syncScheduled = false\n const syncItems = (): void => {\n if (syncScheduled)\n return\n syncScheduled = true\n void nextTick(() => {\n syncScheduled = false\n if (service.getStatus() === 'Started')\n service.send({ type: 'ITEMS.SYNC' })\n })\n }\n\n const api = computed(() => connectCombobox(service, vueNormalize))\n // 退场闸门:收起从跟着 open 走,改成跟着 presence 走\n const visible = useOverlayExit({ config, isOpen: () => api.value.open, contentRef })\n // 先问全局配置的落点,没有才落 body\n const portalTarget = computed<string | Element>(() => xhConfig.value.portalContainer?.() ?? config?.portalContainer() ?? 'body')\n\n return { visible, service, api, controlRef, inputRef, positionerRef, contentRef, syncItems, portalTarget }\n}\n"],"mappings":";;;;;;;;;;AA+BA,SAAgB,YACd,OACA,WAAmG,CAAC,GACnF;CACjB,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,IAAwB,IAAI;CAC/C,MAAM,WAAW,IAA4B,IAAI;CACjD,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,aAAa,IAAwB,IAAI;CAE/C,MAAM,QAAQ,qBAAqB;CACnC,MAAM,QAAQ,YAAY,MAAM,KAAK;CACrC,MAAM,UAAU,WAAW,wBAAwB;EAAE,GAAG;EAAO,GAAG;CAAS,IAAI,KAAK;CAGpF,IAAI,SAA+B;CAEnC,IAAI,OAAO,aAAa,aAAa;EACnC,SAAS,oBAAoB;GAAE;GAAO,aAAa;EAAM,CAAC;EAG1D,MAAM,sBAA0D,OAAQ,cAAc,SAAS;GAC7F,MAAM;GACN,YAAY,WAAW;GAGvB,gBAAgB,CAAC,WAAW,OAAO,cAAc,KAAK,CAAC,CAAC,OAAO,OAAO;GACtE,eAAe;GACf,gBAAgB,CAAC;GACjB,gBAAgB,CAAC;EACnB,CAAC;EAGD,QAAQ,KAAK,IAAI,UAAU,MAAO;EAClC,QAAQ,KAAK,IAAI,iBAAiB,aAAa;EAC/C,QAAQ,KAAK,IAAI,YAAY,qBAAqB,CAAC;EACnD,QAAQ,KAAK,IAAI,qBAAqB,WAAW,KAAK;EACtD,QAAQ,KAAK,IAAI,uBAAuB,cAAc,KAAK;EAC3D,QAAQ,KAAK,IAAI,sBAAsB,WAAW,KAAK;EACvD,QAAQ,KAAK,IAAI,oBAAoB,SAAS,KAAK;CACrD;CAGA,IAAI,gBAAgB;CACpB,MAAM,kBAAwB;EAC5B,IAAI,eACF;EACF,gBAAgB;EAChB,eAAoB;GAClB,gBAAgB;GAChB,IAAI,QAAQ,UAAU,MAAM,WAC1B,QAAQ,KAAK,EAAE,MAAM,aAAa,CAAC;EACvC,CAAC;CACH;CAEA,MAAM,MAAM,eAAe,gBAAgB,SAAS,YAAY,CAAC;CAMjE,OAAO;EAAE,SAJO,eAAe;GAAE;GAAQ,cAAc,IAAI,MAAM;GAAM;EAAW,CAInE;EAAG;EAAS;EAAK;EAAY;EAAU;EAAe;EAAY;EAAW,cAFvE,eAAiC,SAAS,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,KAAK,MAElB;CAAE;AAC3G"}
@@ -1,6 +1,6 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/composer/context.ts
3
- const KEY = Symbol("xh-composer");
3
+ const KEY = Symbol.for("xh-composer");
4
4
  function provideComposer(ctx) {
5
5
  provide(KEY, ctx);
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/composer/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { ComposerContext } from './use-composer'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<ComposerContext> = Symbol('xh-composer')\n\nexport function provideComposer(ctx: ComposerContext): void {\n provide(KEY, ctx)\n}\n\nexport function useComposerContext(): ComposerContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Composer 部件必须用在 XhComposerRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAqC,OAAO,aAAa;AAE/D,SAAgB,gBAAgB,KAA4B;CAC1D,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,qBAAsC;CACpD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,uCAAuC;CACzD,OAAO;AACT"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/composer/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { ComposerContext } from './use-composer'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<ComposerContext> = Symbol.for('xh-composer')\n\nexport function provideComposer(ctx: ComposerContext): void {\n provide(KEY, ctx)\n}\n\nexport function useComposerContext(): ComposerContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Composer 部件必须用在 XhComposerRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAqC,OAAO,IAAI,aAAa;AAEnE,SAAgB,gBAAgB,KAA4B;CAC1D,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,qBAAsC;CACpD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,uCAAuC;CACzD,OAAO;AACT"}
@@ -111,14 +111,14 @@ declare const XhContextMenuRoot: import("vue").DefineComponent<import("vue").Ext
111
111
  "onOpen-change"?: ((_details: import("@xihan-ui/headless").ContextMenuOpenChangeDetails) => any) | undefined;
112
112
  "onUpdate:open"?: ((_open: boolean) => any) | undefined;
113
113
  }>, {
114
- size: Size;
115
114
  collection: ContextMenuNode[];
116
115
  dir: Direction;
117
116
  tone: Tone;
117
+ size: Size;
118
+ offset: number;
119
+ translations: Partial<import("@xihan-ui/headless").ContextMenuTranslations> | undefined;
118
120
  open: boolean;
119
121
  defaultOpen: boolean;
120
- translations: Partial<import("@xihan-ui/headless").ContextMenuTranslations> | undefined;
121
- offset: number;
122
122
  loop: boolean;
123
123
  placement: Placement;
124
124
  typeahead: boolean;
@@ -290,9 +290,9 @@ declare const XhContextMenuSub: import("vue").DefineComponent<import("vue").Extr
290
290
  default: undefined;
291
291
  };
292
292
  }>> & Readonly<{}>, {
293
- size: Size;
294
293
  dir: Direction;
295
294
  tone: Tone;
295
+ size: Size;
296
296
  disabled: boolean;
297
297
  offset: number;
298
298
  loop: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"context-menu.d.ts","names":[],"sources":["../../../src/components/context-menu/context-menu.ts"],"mappings":";;;;;KAwBK,mBAAmB;;KAGZ,2BAA2B,KAAK;;KAGhC,0BAA0B,KAAK;cAE9B,iCAAiB,8BAAA;;IAIG,MAAA,SAAS;;;;;;;;;IAGT,MAAA,SAAS;;;;;;;;;;;;;;;;IAIN,MAAA,SAAS;;;;IAClB,MAAA,SAAS;;;;;;;;IAER,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;EAIP,gBAAA,UAAA,UAAU;EACf,SAAA,UAAA,UAAU;EACR,gBAAA,OAAA,UAAU;;;IAjBJ,MAAA,SAAS;;;;;;;;;IAGT,MAAA,SAAS;;;;;;;;;;;;;;;;IAIN,MAAA,SAAS;;;;IAClB,MAAA,SAAS;;;;;;;;IAER,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;EASvB,WAAC,OAAO,6BAA6B;EACrC,gBAAM;EACT,QAAC,MAAM,wBAAwB;kCA4CxC;cAEW,oCAAoB,8BAAA;;;;;;;;;;qCAwB/B;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAclC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAY/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,8BAAA;;;;;;;;;;;;MAW7B,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAqC5B;;;;;;cAOW,gCAAgB,8BAAA;;;;;;;;;;;IAMI,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IAMf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;IAET,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;IAVJ,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IAMf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;IAET,MAAA,SAAS;;;;;;;;;;;;;;;;;;;EAIvB,WAAC,OAAO,4BAA4B;kCA6BhD;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAiBlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,0CAA0B,0BAAA,oBAAA,4BAAA;;8BAOrC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"context-menu.d.ts","names":[],"sources":["../../../src/components/context-menu/context-menu.ts"],"mappings":";;;;;KAyBK,mBAAmB;;KAGZ,2BAA2B,KAAK;;KAGhC,0BAA0B,KAAK;cAE9B,iCAAiB,8BAAA;;IAIG,MAAA,SAAS;;;;;;;;;IAGT,MAAA,SAAS;;;;;;;;;;;;;;;;IAIN,MAAA,SAAS;;;;IAClB,MAAA,SAAS;;;;;;;;IAER,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;EAIP,gBAAA,UAAA,UAAU;EACf,SAAA,UAAA,UAAU;EACR,gBAAA,OAAA,UAAU;;;IAjBJ,MAAA,SAAS;;;;;;;;;IAGT,MAAA,SAAS;;;;;;;;;;;;;;;;IAIN,MAAA,SAAS;;;;IAClB,MAAA,SAAS;;;;;;;;IAER,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;EASvB,WAAC,OAAO,6BAA6B;EACrC,gBAAM;EACT,QAAC,MAAM,wBAAwB;kCA4CxC;cAEW,oCAAoB,8BAAA;;;;;;;;;;qCAwB/B;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAgBlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAY/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,8BAAA;;;;;;;;;;;;MAW7B,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAqC5B;;;;;;cAOW,gCAAgB,8BAAA;;;;;;;;;;;IAMI,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IAMf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;IAET,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;IAVJ,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IAMf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;IAET,MAAA,SAAS;;;;;;;;;;;;;;;;;;;EAIvB,WAAC,OAAO,4BAA4B;kCA6BhD;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAiBlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,0CAA0B,0BAAA,oBAAA,4BAAA;;8BAOrC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -1,4 +1,5 @@
1
1
  import { withXhConfig } from "../../config/config.js";
2
+ import { useScrollbars } from "../../runtime/use-scrollbars.js";
2
3
  import { mergeIntoChild } from "../../runtime/as-child.js";
3
4
  import { provideContextMenu, provideContextMenuChain, provideContextMenuGroup, provideContextMenuItem, provideContextMenuSub, useContextMenuChain, useContextMenuContext, useContextMenuGroupContext, useContextMenuItemContext, useContextMenuSubContext } from "./context.js";
4
5
  import { provideMenu, provideMenuChain, useMenuContext } from "../menu/context.js";
@@ -120,12 +121,13 @@ const XhContextMenuPositioner = defineComponent({
120
121
  inheritAttrs: false,
121
122
  setup(_, { slots, attrs }) {
122
123
  const ctx = useContextMenuContext();
124
+ const bars = useScrollbars({ scrollable: () => ctx.contentRef.value });
123
125
  return () => h(Teleport, { to: ctx.portalTarget.value }, [h("div", {
124
126
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
125
127
  ref: (el) => {
126
128
  ctx.positionerRef.value = el;
127
129
  }
128
- }, slots.default?.())]);
130
+ }, [...slots.default?.() ?? [], ...bars.render()])]);
129
131
  }
130
132
  });
131
133
  const XhContextMenuContent = defineComponent({