@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":"hotkeys.js","names":[],"sources":["../../../src/components/hotkeys/hotkeys.ts"],"sourcesContent":["import type { HotkeysPlatform, HotkeysProps, HotkeysTarget, HotkeysTranslations } from '@xihan-ui/headless'\nimport type { Size } from '@xihan-ui/kernel'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { connectHotkeys, detectHotkeysPlatform } from '@xihan-ui/headless'\nimport { computed, defineComponent, h, onBeforeUnmount, onMounted, ref, watchEffect } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\n\n/**\n * 把一组键铺成一排键帽,并按 target 指定的节点接住这次组合。\n *\n * 内容整份由 keys 与平台算出,组件不收默认插槽——键帽上写什么、连接符出不出,\n * 两个平台的答案不一样,内容另有来源就对不上了。\n */\nexport const XhHotkeys = defineComponent({\n name: 'XhHotkeys',\n // 缺省值由 connect 给出,这里一律 default: undefined\n props: {\n keys: { type: Array as PropType<string[]>, default: undefined },\n platform: { type: String as PropType<HotkeysPlatform>, default: undefined },\n target: { type: String as PropType<HotkeysTarget>, default: undefined },\n preventDefault: { type: Boolean, default: undefined },\n enabled: { type: Boolean, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n translations: { type: Object as PropType<Partial<HotkeysTranslations>>, default: undefined },\n },\n // 只读事件:组合没有可双向绑定的值\n emits: {\n 'hot-key': (_details: PayloadOf<HotkeysProps, 'onHotKey'>) => true,\n },\n setup(props, { emit }) {\n const rootEl = ref<HTMLElement | null>(null)\n // 平台要等挂载后才测得出来;测出来之前按 connect 的缺省(非 Mac)出\n const detected = ref<HotkeysPlatform>('auto')\n onMounted(() => {\n detected.value = detectHotkeysPlatform()\n })\n\n const merged = withXhConfig('hotkeys', props)\n const api = computed(() => connectHotkeys({\n keys: props.keys,\n // 作者显式写了平台就以他为准,写 auto 或没写才用实测值\n platform: props.platform && props.platform !== 'auto' ? props.platform : detected.value,\n target: props.target,\n preventDefault: props.preventDefault,\n enabled: props.enabled,\n size: props.size,\n translations: merged.translations,\n onHotKey: details => emit('hot-key', details),\n }, vueNormalize))\n\n // 每次都现取 api:监听节点可以不变,接不接这次按键的判据却随 props 走\n const onKeyDown = (event: Event): void => api.value.handleKeyDown(event as KeyboardEvent)\n let bound: EventTarget | null = null\n const unbind = (): void => {\n bound?.removeEventListener('keydown', onKeyDown)\n bound = null\n }\n // 监听装在文档或组件所在的那一层父节点上,后者把组合限制在一块面板里\n watchEffect(() => {\n const el = rootEl.value\n const next = el === null ? null : (api.value.target === 'parent' ? el.parentElement : el.ownerDocument)\n if (next === bound)\n return\n unbind()\n bound = next\n bound?.addEventListener('keydown', onKeyDown)\n })\n onBeforeUnmount(unbind)\n\n return () => {\n const current = api.value\n const separatorProps = current.getSeparatorProps() as Record<string, unknown>\n const children: VNode[] = []\n current.segments.forEach((segment, index) => {\n if (index > 0)\n children.push(h('span', { ...separatorProps, key: `xh-hotkeys-separator-${index}` }, current.separator))\n children.push(h(\n 'kbd',\n { ...current.getKeyProps({ value: segment.source }) as Record<string, unknown>, key: `xh-hotkeys-key-${index}` },\n segment.label,\n ))\n })\n return h('span', { ...current.getRootProps() as Record<string, unknown>, ref: rootEl }, children)\n }\n },\n})\n"],"mappings":";;;;;;;;;;;AAeA,MAAa,YAAY,gBAAgB;CACvC,MAAM;CAEN,OAAO;EACL,MAAM;GAAE,MAAM;GAA6B,SAAS,KAAA;EAAU;EAC9D,UAAU;GAAE,MAAM;GAAqC,SAAS,KAAA;EAAU;EAC1E,QAAQ;GAAE,MAAM;GAAmC,SAAS,KAAA;EAAU;EACtE,gBAAgB;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EACpD,SAAS;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC7C,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;EAC3D,cAAc;GAAE,MAAM;GAAkD,SAAS,KAAA;EAAU;CAC7F;CAEA,OAAO,EACL,YAAY,aAAkD,KAChE;CACA,MAAM,OAAO,EAAE,QAAQ;EACrB,MAAM,SAAS,IAAwB,IAAI;EAE3C,MAAM,WAAW,IAAqB,MAAM;EAC5C,gBAAgB;GACd,SAAS,QAAQ,sBAAsB;EACzC,CAAC;EAED,MAAM,SAAS,aAAa,WAAW,KAAK;EAC5C,MAAM,MAAM,eAAe,eAAe;GACxC,MAAM,MAAM;GAEZ,UAAU,MAAM,YAAY,MAAM,aAAa,SAAS,MAAM,WAAW,SAAS;GAClF,QAAQ,MAAM;GACd,gBAAgB,MAAM;GACtB,SAAS,MAAM;GACf,MAAM,MAAM;GACZ,cAAc,OAAO;GACrB,WAAU,YAAW,KAAK,WAAW,OAAO;EAC9C,GAAG,YAAY,CAAC;EAGhB,MAAM,aAAa,UAAuB,IAAI,MAAM,cAAc,KAAsB;EACxF,IAAI,QAA4B;EAChC,MAAM,eAAqB;GACzB,OAAO,oBAAoB,WAAW,SAAS;GAC/C,QAAQ;EACV;EAEA,kBAAkB;GAChB,MAAM,KAAK,OAAO;GAClB,MAAM,OAAO,OAAO,OAAO,OAAQ,IAAI,MAAM,WAAW,WAAW,GAAG,gBAAgB,GAAG;GACzF,IAAI,SAAS,OACX;GACF,OAAO;GACP,QAAQ;GACR,OAAO,iBAAiB,WAAW,SAAS;EAC9C,CAAC;EACD,gBAAgB,MAAM;EAEtB,aAAa;GACX,MAAM,UAAU,IAAI;GACpB,MAAM,iBAAiB,QAAQ,kBAAkB;GACjD,MAAM,WAAoB,CAAC;GAC3B,QAAQ,SAAS,SAAS,SAAS,UAAU;IAC3C,IAAI,QAAQ,GACV,SAAS,KAAK,EAAE,QAAQ;KAAE,GAAG;KAAgB,KAAK,wBAAwB;IAAQ,GAAG,QAAQ,SAAS,CAAC;IACzG,SAAS,KAAK,EACZ,OACA;KAAE,GAAG,QAAQ,YAAY,EAAE,OAAO,QAAQ,OAAO,CAAC;KAA8B,KAAK,kBAAkB;IAAQ,GAC/G,QAAQ,KACV,CAAC;GACH,CAAC;GACD,OAAO,EAAE,QAAQ;IAAE,GAAG,QAAQ,aAAa;IAA8B,KAAK;GAAO,GAAG,QAAQ;EAClG;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"hotkeys.js","names":[],"sources":["../../../src/components/hotkeys/hotkeys.ts"],"sourcesContent":["import type { HotkeysPlatform, HotkeysProps, HotkeysTarget, HotkeysTranslations } from '@xihan-ui/headless'\nimport type { Size } from '@xihan-ui/kernel'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useHotkeys } from './use-hotkeys'\n\n/**\n * 把一组键铺成一排键帽,并按 target 指定的节点接住这次组合。\n *\n * 内容整份由 keys 与平台算出,组件不收默认插槽——键帽上写什么、连接符出不出,\n * 两个平台的答案不一样,内容另有来源就对不上了。\n *\n * 注册与渲染是两件事:只要注册不要键帽就直接用 useHotkeys。\n */\nexport const XhHotkeys = defineComponent({\n name: 'XhHotkeys',\n // 缺省值由 connect 给出,这里一律 default: undefined\n props: {\n keys: { type: Array as PropType<string[]>, default: undefined },\n platform: { type: String as PropType<HotkeysPlatform>, default: undefined },\n target: { type: String as PropType<HotkeysTarget>, default: undefined },\n preventDefault: { type: Boolean, default: undefined },\n enabled: { type: Boolean, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n translations: { type: Object as PropType<Partial<HotkeysTranslations>>, default: undefined },\n },\n // 只读事件:组合没有可双向绑定的值\n emits: {\n 'hot-key': (_details: PayloadOf<HotkeysProps, 'onHotKey'>) => true,\n },\n setup(props, { emit }) {\n const rootEl = ref<HTMLElement | null>(null)\n const merged = withXhConfig('hotkeys', props)\n\n const { api } = useHotkeys(() => ({\n keys: props.keys,\n platform: props.platform,\n target: props.target,\n preventDefault: props.preventDefault,\n enabled: props.enabled,\n size: props.size,\n translations: merged.translations,\n onHotKey: details => emit('hot-key', details),\n }), rootEl)\n\n return () => {\n const current = api.value\n const separatorProps = current.getSeparatorProps() as Record<string, unknown>\n const children: VNode[] = []\n current.segments.forEach((segment, index) => {\n if (index > 0)\n children.push(h('span', { ...separatorProps, key: `xh-hotkeys-separator-${index}` }, current.separator))\n children.push(h(\n 'kbd',\n { ...current.getKeyProps({ value: segment.source }) as Record<string, unknown>, key: `xh-hotkeys-key-${index}` },\n segment.label,\n ))\n })\n return h('span', { ...current.getRootProps() as Record<string, unknown>, ref: rootEl }, children)\n }\n },\n})\n"],"mappings":";;;;;;;;;;;;AAgBA,MAAa,YAAY,gBAAgB;CACvC,MAAM;CAEN,OAAO;EACL,MAAM;GAAE,MAAM;GAA6B,SAAS,KAAA;EAAU;EAC9D,UAAU;GAAE,MAAM;GAAqC,SAAS,KAAA;EAAU;EAC1E,QAAQ;GAAE,MAAM;GAAmC,SAAS,KAAA;EAAU;EACtE,gBAAgB;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EACpD,SAAS;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC7C,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;EAC3D,cAAc;GAAE,MAAM;GAAkD,SAAS,KAAA;EAAU;CAC7F;CAEA,OAAO,EACL,YAAY,aAAkD,KAChE;CACA,MAAM,OAAO,EAAE,QAAQ;EACrB,MAAM,SAAS,IAAwB,IAAI;EAC3C,MAAM,SAAS,aAAa,WAAW,KAAK;EAE5C,MAAM,EAAE,QAAQ,kBAAkB;GAChC,MAAM,MAAM;GACZ,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,gBAAgB,MAAM;GACtB,SAAS,MAAM;GACf,MAAM,MAAM;GACZ,cAAc,OAAO;GACrB,WAAU,YAAW,KAAK,WAAW,OAAO;EAC9C,IAAI,MAAM;EAEV,aAAa;GACX,MAAM,UAAU,IAAI;GACpB,MAAM,iBAAiB,QAAQ,kBAAkB;GACjD,MAAM,WAAoB,CAAC;GAC3B,QAAQ,SAAS,SAAS,SAAS,UAAU;IAC3C,IAAI,QAAQ,GACV,SAAS,KAAK,EAAE,QAAQ;KAAE,GAAG;KAAgB,KAAK,wBAAwB;IAAQ,GAAG,QAAQ,SAAS,CAAC;IACzG,SAAS,KAAK,EACZ,OACA;KAAE,GAAG,QAAQ,YAAY,EAAE,OAAO,QAAQ,OAAO,CAAC;KAA8B,KAAK,kBAAkB;IAAQ,GAC/G,QAAQ,KACV,CAAC;GACH,CAAC;GACD,OAAO,EAAE,QAAQ;IAAE,GAAG,QAAQ,aAAa;IAA8B,KAAK;GAAO,GAAG,QAAQ;EAClG;CACF;AACF,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { ComputedRef, Ref } from "vue";
2
+ import { HotkeySegment, HotkeysApi, HotkeysProps, HotkeysResolvedPlatform, HotkeysTarget } from "@xihan-ui/headless";
3
+ //#region src/components/hotkeys/use-hotkeys.d.ts
4
+ interface UseHotkeysOptions extends Omit<HotkeysProps, 'target'> {
5
+ /**
6
+ * 监听装在哪儿。'document' 缺省;'parent' 把组合限制在组件所在的那一层面板里,
7
+ * 需要第二参给出根节点;也可以自己给一个节点(滚动容器、window 等)。
8
+ */
9
+ target?: HotkeysTarget | (() => EventTarget | null);
10
+ }
11
+ interface HotkeysHandle {
12
+ /** 连接层产出的整面,渲染键帽时用。 */
13
+ api: ComputedRef<HotkeysApi>;
14
+ /** 翻好的各枚键,自绘键帽时用。 */
15
+ segments: ComputedRef<readonly HotkeySegment[]>;
16
+ platform: ComputedRef<HotkeysResolvedPlatform>;
17
+ separator: ComputedRef<string>;
18
+ /** 提前解绑;作用域销毁时自动调用。 */
19
+ stop: () => void;
20
+ }
21
+ /**
22
+ * 注册一组按键组合。只要注册不要键帽的场景(全局快捷键)直接用它,
23
+ * 要铺键帽就用 XhHotkeys——那个组件本身就是这个组合式的消费者。
24
+ *
25
+ * 一次调用管一组组合,注册四条就调四次:与组件形态一比一对齐,
26
+ * 免得两种形态的 preventDefault / enabled / platform 语义各走各的。
27
+ */
28
+ declare function useHotkeys(options: UseHotkeysOptions | (() => UseHotkeysOptions), rootRef?: Ref<HTMLElement | null>): HotkeysHandle;
29
+ //#endregion
30
+ export { HotkeysHandle, UseHotkeysOptions, useHotkeys };
31
+ //# sourceMappingURL=use-hotkeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-hotkeys.d.ts","names":[],"sources":["../../../src/components/hotkeys/use-hotkeys.ts"],"mappings":";;;UAaiB,0BAA0B,KAAK;;;;;EAK9C,SAAS,uBAAuB;;UAGjB;;EAEf,KAAK,YAAY;;EAEjB,UAAU,qBAAqB;EAC/B,UAAU,YAAY;EACtB,WAAW;;EAEX;;;;;;;;;iBAUc,WACd,SAAS,2BAA2B,oBACpC,UAAU,IAAI,sBACb"}
@@ -0,0 +1,60 @@
1
+ import { vueNormalize } from "../../runtime/normalize-props.js";
2
+ import { computed, onBeforeUnmount, onMounted, ref, toValue, watchEffect } from "vue";
3
+ import { connectHotkeys, detectHotkeysPlatform } from "@xihan-ui/headless";
4
+ //#region src/components/hotkeys/use-hotkeys.ts
5
+ /**
6
+ * 注册一组按键组合。只要注册不要键帽的场景(全局快捷键)直接用它,
7
+ * 要铺键帽就用 XhHotkeys——那个组件本身就是这个组合式的消费者。
8
+ *
9
+ * 一次调用管一组组合,注册四条就调四次:与组件形态一比一对齐,
10
+ * 免得两种形态的 preventDefault / enabled / platform 语义各走各的。
11
+ */
12
+ function useHotkeys(options, rootRef) {
13
+ const detected = ref("auto");
14
+ onMounted(() => {
15
+ detected.value = detectHotkeysPlatform();
16
+ });
17
+ const api = computed(() => {
18
+ const o = toValue(options);
19
+ return connectHotkeys({
20
+ ...o,
21
+ platform: o.platform && o.platform !== "auto" ? o.platform : detected.value,
22
+ target: typeof o.target === "function" ? void 0 : o.target
23
+ }, vueNormalize);
24
+ });
25
+ const onKeyDown = (event) => api.value.handleKeyDown(event);
26
+ let bound = null;
27
+ const stop = () => {
28
+ bound?.removeEventListener("keydown", onKeyDown);
29
+ bound = null;
30
+ };
31
+ watchEffect(() => {
32
+ const custom = toValue(options).target;
33
+ if (typeof custom === "function") {
34
+ const next = custom();
35
+ if (next === bound) return;
36
+ stop();
37
+ bound = next;
38
+ bound?.addEventListener("keydown", onKeyDown);
39
+ return;
40
+ }
41
+ const el = rootRef?.value ?? null;
42
+ const next = el === null ? typeof document === "undefined" ? null : document : api.value.target === "parent" ? el.parentElement : el.ownerDocument;
43
+ if (next === bound) return;
44
+ stop();
45
+ bound = next;
46
+ bound?.addEventListener("keydown", onKeyDown);
47
+ });
48
+ onBeforeUnmount(stop);
49
+ return {
50
+ api,
51
+ segments: computed(() => api.value.segments),
52
+ platform: computed(() => api.value.platform),
53
+ separator: computed(() => api.value.separator),
54
+ stop
55
+ };
56
+ }
57
+ //#endregion
58
+ export { useHotkeys };
59
+
60
+ //# sourceMappingURL=use-hotkeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-hotkeys.js","names":[],"sources":["../../../src/components/hotkeys/use-hotkeys.ts"],"sourcesContent":["import type {\n HotkeysApi,\n HotkeySegment,\n HotkeysPlatform,\n HotkeysProps,\n HotkeysResolvedPlatform,\n HotkeysTarget,\n} from '@xihan-ui/headless'\nimport type { ComputedRef, Ref } from 'vue'\nimport { connectHotkeys, detectHotkeysPlatform } from '@xihan-ui/headless'\nimport { computed, onBeforeUnmount, onMounted, ref, toValue, watchEffect } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\n\nexport interface UseHotkeysOptions extends Omit<HotkeysProps, 'target'> {\n /**\n * 监听装在哪儿。'document' 缺省;'parent' 把组合限制在组件所在的那一层面板里,\n * 需要第二参给出根节点;也可以自己给一个节点(滚动容器、window 等)。\n */\n target?: HotkeysTarget | (() => EventTarget | null)\n}\n\nexport interface HotkeysHandle {\n /** 连接层产出的整面,渲染键帽时用。 */\n api: ComputedRef<HotkeysApi>\n /** 翻好的各枚键,自绘键帽时用。 */\n segments: ComputedRef<readonly HotkeySegment[]>\n platform: ComputedRef<HotkeysResolvedPlatform>\n separator: ComputedRef<string>\n /** 提前解绑;作用域销毁时自动调用。 */\n stop: () => void\n}\n\n/**\n * 注册一组按键组合。只要注册不要键帽的场景(全局快捷键)直接用它,\n * 要铺键帽就用 XhHotkeys——那个组件本身就是这个组合式的消费者。\n *\n * 一次调用管一组组合,注册四条就调四次:与组件形态一比一对齐,\n * 免得两种形态的 preventDefault / enabled / platform 语义各走各的。\n */\nexport function useHotkeys(\n options: UseHotkeysOptions | (() => UseHotkeysOptions),\n rootRef?: Ref<HTMLElement | null>,\n): HotkeysHandle {\n // 平台要等挂载后才测得出来:落定前 'Mod' 会解析成 Control,Mac 上 ⌘K 按不出来\n const detected = ref<HotkeysPlatform>('auto')\n onMounted(() => {\n detected.value = detectHotkeysPlatform()\n })\n\n const api = computed(() => {\n const o = toValue(options)\n return connectHotkeys({\n ...o,\n // 作者显式写了平台就以他为准,写 auto 或没写才用实测值\n platform: o.platform && o.platform !== 'auto' ? o.platform : detected.value,\n // 自定义节点由本组合式自己挑,连接层只认那两种字面量\n target: typeof o.target === 'function' ? undefined : o.target,\n }, vueNormalize)\n })\n\n // 每次都现取 api:监听节点可以不变,接不接这次按键的判据却随选项走\n const onKeyDown = (event: Event): void => api.value.handleKeyDown(event as KeyboardEvent)\n let bound: EventTarget | null = null\n const stop = (): void => {\n bound?.removeEventListener('keydown', onKeyDown)\n bound = null\n }\n\n watchEffect(() => {\n const custom = toValue(options).target\n if (typeof custom === 'function') {\n const next = custom()\n if (next === bound)\n return\n stop()\n bound = next\n bound?.addEventListener('keydown', onKeyDown)\n return\n }\n const el = rootRef?.value ?? null\n const next = el === null\n ? (typeof document === 'undefined' ? null : document)\n : (api.value.target === 'parent' ? el.parentElement : el.ownerDocument)\n if (next === bound)\n return\n stop()\n bound = next\n bound?.addEventListener('keydown', onKeyDown)\n })\n onBeforeUnmount(stop)\n\n return {\n api,\n segments: computed(() => api.value.segments),\n platform: computed(() => api.value.platform),\n separator: computed(() => api.value.separator),\n stop,\n }\n}\n"],"mappings":";;;;;;;;;;;AAuCA,SAAgB,WACd,SACA,SACe;CAEf,MAAM,WAAW,IAAqB,MAAM;CAC5C,gBAAgB;EACd,SAAS,QAAQ,sBAAsB;CACzC,CAAC;CAED,MAAM,MAAM,eAAe;EACzB,MAAM,IAAI,QAAQ,OAAO;EACzB,OAAO,eAAe;GACpB,GAAG;GAEH,UAAU,EAAE,YAAY,EAAE,aAAa,SAAS,EAAE,WAAW,SAAS;GAEtE,QAAQ,OAAO,EAAE,WAAW,aAAa,KAAA,IAAY,EAAE;EACzD,GAAG,YAAY;CACjB,CAAC;CAGD,MAAM,aAAa,UAAuB,IAAI,MAAM,cAAc,KAAsB;CACxF,IAAI,QAA4B;CAChC,MAAM,aAAmB;EACvB,OAAO,oBAAoB,WAAW,SAAS;EAC/C,QAAQ;CACV;CAEA,kBAAkB;EAChB,MAAM,SAAS,QAAQ,OAAO,CAAC,CAAC;EAChC,IAAI,OAAO,WAAW,YAAY;GAChC,MAAM,OAAO,OAAO;GACpB,IAAI,SAAS,OACX;GACF,KAAK;GACL,QAAQ;GACR,OAAO,iBAAiB,WAAW,SAAS;GAC5C;EACF;EACA,MAAM,KAAK,SAAS,SAAS;EAC7B,MAAM,OAAO,OAAO,OACf,OAAO,aAAa,cAAc,OAAO,WACzC,IAAI,MAAM,WAAW,WAAW,GAAG,gBAAgB,GAAG;EAC3D,IAAI,SAAS,OACX;EACF,KAAK;EACL,QAAQ;EACR,OAAO,iBAAiB,WAAW,SAAS;CAC9C,CAAC;CACD,gBAAgB,IAAI;CAEpB,OAAO;EACL;EACA,UAAU,eAAe,IAAI,MAAM,QAAQ;EAC3C,UAAU,eAAe,IAAI,MAAM,QAAQ;EAC3C,WAAW,eAAe,IAAI,MAAM,SAAS;EAC7C;CACF;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/hover-card/context.ts
3
- const KEY = Symbol("xh-hover-card");
3
+ const KEY = Symbol.for("xh-hover-card");
4
4
  function provideHoverCard(ctx) {
5
5
  provide(KEY, ctx);
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/hover-card/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { HoverCardContext } from './use-hover-card'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<HoverCardContext> = Symbol('xh-hover-card')\n\nexport function provideHoverCard(ctx: HoverCardContext): void {\n provide(KEY, ctx)\n}\n\nexport function useHoverCardContext(): HoverCardContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] HoverCard 部件必须用在 XhHoverCardRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAsC,OAAO,eAAe;AAElE,SAAgB,iBAAiB,KAA6B;CAC5D,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,sBAAwC;CACtD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,yCAAyC;CAC3D,OAAO;AACT"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/hover-card/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { HoverCardContext } from './use-hover-card'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<HoverCardContext> = Symbol.for('xh-hover-card')\n\nexport function provideHoverCard(ctx: HoverCardContext): void {\n provide(KEY, ctx)\n}\n\nexport function useHoverCardContext(): HoverCardContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] HoverCard 部件必须用在 XhHoverCardRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAsC,OAAO,IAAI,eAAe;AAEtE,SAAgB,iBAAiB,KAA6B;CAC5D,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,sBAAwC;CACtD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,yCAAyC;CAC3D,OAAO;AACT"}
@@ -77,12 +77,12 @@ declare const XhHoverCardRoot: import("vue").DefineComponent<import("vue").Extra
77
77
  "onOpen-change"?: ((_details: import("@xihan-ui/headless").HoverCardOpenChangeDetails) => any) | undefined;
78
78
  "onUpdate:open"?: ((_open: boolean) => any) | undefined;
79
79
  }>, {
80
- size: Size;
81
80
  dir: Direction;
81
+ size: Size;
82
82
  disabled: boolean;
83
+ offset: number;
83
84
  open: boolean;
84
85
  defaultOpen: boolean;
85
- offset: number;
86
86
  placement: Placement;
87
87
  openDelay: number;
88
88
  closeDelay: number;
@@ -1 +1 @@
1
- {"version":3,"file":"hover-card.d.ts","names":[],"sources":["../../../src/components/hover-card/hover-card.ts"],"mappings":";;;;;KASK,iBAAiB;;KAGV,yBAAyB,KAAK;cAE7B,+BAAe,8BAAA;;;;;;;IAMK,MAAA,SAAS;;;;;;;;;;;;;;;;IAIf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;;EAIP,gBAAA,UAAA,UAAU;EACb,gBAAA,OAAA,UAAU;;;;;;;;IAXJ,MAAA,SAAS;;;;;;;;;;;;;;;;IAIf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;;;;;;;;;;;;;EAQvB,WAAC,OAAO,2BAA2B;kCAc/C;cAEW,kCAAkB,8BAAA;;;;;;;;;;qCAuB7B;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAchC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAY7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAM3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"hover-card.d.ts","names":[],"sources":["../../../src/components/hover-card/hover-card.ts"],"mappings":";;;;;KAUK,iBAAiB;;KAGV,yBAAyB,KAAK;cAE7B,+BAAe,8BAAA;;;;;;;IAMK,MAAA,SAAS;;;;;;;;;;;;;;;;IAIf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;;EAIP,gBAAA,UAAA,UAAU;EACb,gBAAA,OAAA,UAAU;;;;;;;;IAXJ,MAAA,SAAS;;;;;;;;;;;;;;;;IAIf,MAAA,SAAS;;;;;IAER,MAAA,SAAS;;;;;;;;;;;;;;;;;EAQvB,WAAC,OAAO,2BAA2B;kCAc/C;cAEW,kCAAkB,8BAAA;;;;;;;;;;qCAuB7B;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAgBhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAY7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAM3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -1,3 +1,4 @@
1
+ import { useScrollbars } from "../../runtime/use-scrollbars.js";
1
2
  import { mergeIntoChild } from "../../runtime/as-child.js";
2
3
  import { provideHoverCard, useHoverCardContext } from "./context.js";
3
4
  import { useHoverCard } from "./use-hover-card.js";
@@ -83,12 +84,13 @@ const XhHoverCardPositioner = defineComponent({
83
84
  inheritAttrs: false,
84
85
  setup(_, { slots, attrs }) {
85
86
  const ctx = useHoverCardContext();
87
+ const bars = useScrollbars({ scrollable: () => ctx.contentRef.value });
86
88
  return () => h(Teleport, { to: ctx.portalTarget.value }, [h("div", {
87
89
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
88
90
  ref: (el) => {
89
91
  ctx.positionerRef.value = el;
90
92
  }
91
- }, slots.default?.())]);
93
+ }, [...slots.default?.() ?? [], ...bars.render()])]);
92
94
  }
93
95
  });
94
96
  const XhHoverCardContent = defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"hover-card.js","names":[],"sources":["../../../src/components/hover-card/hover-card.ts"],"sourcesContent":["import type { HoverCardApi, HoverCardSchema } 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 { defineComponent, h, mergeProps, Teleport } from 'vue'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { provideHoverCard, useHoverCardContext } from './context'\nimport { useHoverCard } from './use-hover-card'\n\ntype HoverCardProps = HoverCardSchema['props']\n\n/** 默认插槽的载荷:浮层的开合状态与程序化开合的方法。 */\nexport type HoverCardRootSlotProps = Pick<HoverCardApi, 'open' | 'setOpen'>\n\nexport const XhHoverCardRoot = defineComponent({\n name: 'XhHoverCardRoot',\n // 缺省值由机器与 connect 给出,这里一律 default: undefined\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n openDelay: { type: Number, default: undefined },\n closeDelay: { type: Number, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n disabled: Boolean,\n size: { type: String as PropType<Size>, default: undefined },\n },\n // open-change 携带 { open },update:open 携带裸布尔\n emits: {\n 'open-change': (_details: PayloadOf<HoverCardProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<HoverCardProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: HoverCardRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: HoverCardProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useHoverCard(props as HoverCardProps, notify)\n provideHoverCard(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n setOpen: ctx.api.value.setOpen,\n }))\n },\n})\n\nexport const XhHoverCardTrigger = defineComponent({\n name: 'XhHoverCardTrigger',\n props: {\n /** 借用作者的子节点当触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots }) {\n const ctx = useHoverCardContext()\n return () => {\n const attrs = {\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, attrs, 'hover-card')\n if (merged)\n return merged\n }\n return h('button', attrs, children)\n }\n },\n})\n\nexport const XhHoverCardPositioner = defineComponent({\n name: 'XhHoverCardPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useHoverCardContext()\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 XhHoverCardContent = defineComponent({\n name: 'XhHoverCardContent',\n setup(_, { slots }) {\n const ctx = useHoverCardContext()\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 XhHoverCardArrow = defineComponent({\n name: 'XhHoverCardArrow',\n setup() {\n const ctx = useHoverCardContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n"],"mappings":";;;;;AAcA,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CAEN,OAAO;EACL,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;EACb,WAAW;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EACrE,QAAQ;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC3C,WAAW;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC9C,YAAY;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC/C,KAAK;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EAC/D,UAAU;EACV,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;CAC7D;CAEA,OAAO;EACL,gBAAgB,aAAwD;EACxE,gBAAgB,UAA6D;CAC/E;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,UAA0C,YAAY;GAC1D,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,MAAM,aAAa,OAAyB,MAAM;EACxD,iBAAiB,GAAG;EACpB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,MAAM,IAAI,IAAI,MAAM;GACpB,SAAS,IAAI,IAAI,MAAM;EACzB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,OAAO;;AAEL,SAAS,QACX;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,oBAAoB;EAChC,aAAa;GACX,MAAM,QAAQ;IACZ,GAAG,IAAI,IAAI,MAAM,gBAAgB;IACjC,MAAM,OAAgB;KAAE,IAAI,WAAW,QAAQ;IAAkB;GACnE;GACA,MAAM,WAAW,MAAM,UAAU;GAEjC,IAAI,MAAM,SAAS;IACjB,MAAM,SAAS,eAAe,UAAU,OAAO,YAAY;IAC3D,IAAI,QACF,OAAO;GACX;GACA,OAAO,EAAE,UAAU,OAAO,QAAQ;EACpC;CACF;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CAEN,cAAc;CACd,MAAM,GAAG,EAAE,OAAO,SAAS;EACzB,MAAM,MAAM,oBAAoB;EAEhC,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,MAAM,UAAU,CAAC,CACtB,CAAC;CACH;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,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,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,cAAc,CAA4B;CAChF;AACF,CAAC"}
1
+ {"version":3,"file":"hover-card.js","names":[],"sources":["../../../src/components/hover-card/hover-card.ts"],"sourcesContent":["import type { HoverCardApi, HoverCardSchema } 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 { defineComponent, h, mergeProps, Teleport } from 'vue'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { provideHoverCard, useHoverCardContext } from './context'\nimport { useHoverCard } from './use-hover-card'\n\ntype HoverCardProps = HoverCardSchema['props']\n\n/** 默认插槽的载荷:浮层的开合状态与程序化开合的方法。 */\nexport type HoverCardRootSlotProps = Pick<HoverCardApi, 'open' | 'setOpen'>\n\nexport const XhHoverCardRoot = defineComponent({\n name: 'XhHoverCardRoot',\n // 缺省值由机器与 connect 给出,这里一律 default: undefined\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement>, default: undefined },\n offset: { type: Number, default: undefined },\n openDelay: { type: Number, default: undefined },\n closeDelay: { type: Number, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n disabled: Boolean,\n size: { type: String as PropType<Size>, default: undefined },\n },\n // open-change 携带 { open },update:open 携带裸布尔\n emits: {\n 'open-change': (_details: PayloadOf<HoverCardProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<HoverCardProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: HoverCardRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: HoverCardProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useHoverCard(props as HoverCardProps, notify)\n provideHoverCard(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n setOpen: ctx.api.value.setOpen,\n }))\n },\n})\n\nexport const XhHoverCardTrigger = defineComponent({\n name: 'XhHoverCardTrigger',\n props: {\n /** 借用作者的子节点当触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots }) {\n const ctx = useHoverCardContext()\n return () => {\n const attrs = {\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, attrs, 'hover-card')\n if (merged)\n return merged\n }\n return h('button', attrs, children)\n }\n },\n})\n\nexport const XhHoverCardPositioner = defineComponent({\n name: 'XhHoverCardPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useHoverCardContext()\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 XhHoverCardContent = defineComponent({\n name: 'XhHoverCardContent',\n setup(_, { slots }) {\n const ctx = useHoverCardContext()\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 XhHoverCardArrow = defineComponent({\n name: 'XhHoverCardArrow',\n setup() {\n const ctx = useHoverCardContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n"],"mappings":";;;;;;AAeA,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CAEN,OAAO;EACL,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;EACb,WAAW;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EACrE,QAAQ;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC3C,WAAW;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC9C,YAAY;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC/C,KAAK;GAAE,MAAM;GAA+B,SAAS,KAAA;EAAU;EAC/D,UAAU;EACV,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;CAC7D;CAEA,OAAO;EACL,gBAAgB,aAAwD;EACxE,gBAAgB,UAA6D;CAC/E;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,UAA0C,YAAY;GAC1D,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,MAAM,aAAa,OAAyB,MAAM;EACxD,iBAAiB,GAAG;EACpB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,MAAM,IAAI,IAAI,MAAM;GACpB,SAAS,IAAI,IAAI,MAAM;EACzB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,OAAO;;AAEL,SAAS,QACX;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,oBAAoB;EAChC,aAAa;GACX,MAAM,QAAQ;IACZ,GAAG,IAAI,IAAI,MAAM,gBAAgB;IACjC,MAAM,OAAgB;KAAE,IAAI,WAAW,QAAQ;IAAkB;GACnE;GACA,MAAM,WAAW,MAAM,UAAU;GAEjC,IAAI,MAAM,SAAS;IACjB,MAAM,SAAS,eAAe,UAAU,OAAO,YAAY;IAC3D,IAAI,QACF,OAAO;GACX;GACA,OAAO,EAAE,UAAU,OAAO,QAAQ;EACpC;CACF;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CAEN,cAAc;CACd,MAAM,GAAG,EAAE,OAAO,SAAS;EACzB,MAAM,MAAM,oBAAoB;EAEhC,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,qBAAqB,gBAAgB;CAChD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,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,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,cAAc,CAA4B;CAChF;AACF,CAAC"}
@@ -28,7 +28,7 @@ function useHoverCard(props, onOpenChange) {
28
28
  const registerLayer = () => config.layerRegistry.register({
29
29
  kind: "popover",
30
30
  node: () => contentRef.value,
31
- branches: () => [triggerRef.value].filter(Boolean),
31
+ branches: () => [triggerRef.value, positionerRef.value].filter(Boolean),
32
32
  isModal: () => false,
33
33
  setModal: () => {},
34
34
  surfaces: () => []
@@ -1 +1 @@
1
- {"version":3,"file":"use-hover-card.js","names":[],"sources":["../../../src/components/hover-card/use-hover-card.ts"],"sourcesContent":["import type { HoverCardApi, HoverCardSchema } 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 { connectHoverCard, hoverCardMachine } 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 HoverCardContext {\n service: Service<HoverCardSchema>\n api: ComputedRef<HoverCardApi>\n /** 定位锚点。 */\n triggerRef: Ref<HTMLElement | null>\n /** 被定位的浮层。 */\n positionerRef: Ref<HTMLElement | null>\n /** 消解层节点,也是判定焦点是否仍在卡片内的依据。 */\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 浮层搬到哪儿:全局配置的 portalContainer > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useHoverCard(\n props: HoverCardSchema['props'],\n onOpenChange?: HoverCardSchema['props']['onOpenChange'],\n): HoverCardContext {\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\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(hoverCardMachine, () => ({ ...props, onOpenChange }), scope)\n\n // 无 DOM 环境(SSR)不建引擎与消解层\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 // trigger 记为本层分支,指针按在它上面算层内交互\n branches: () => [triggerRef.value].filter(Boolean) as Element[],\n // 悬停卡片非模态:不陷焦点、不锁滚动、无遮罩\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 }\n\n // 元素 getter 在无 DOM 环境下也要设,连接层判定焦点去向时经它们取节点\n service.refs.set('getAnchorEl', () => triggerRef.value)\n service.refs.set('getFloatingEl', () => positionerRef.value)\n service.refs.set('getContentEl', () => contentRef.value)\n\n const api = computed(() => connectHoverCard(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, triggerRef, positionerRef, contentRef, portalTarget }\n}\n"],"mappings":";;;;;;;;;;AA6BA,SAAgB,aACd,OACA,cACkB;CAClB,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,IAAwB,IAAI;CAC/C,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,aAAa,IAAwB,IAAI;CAE/C,MAAM,QAAQ,qBAAqB;CACnC,MAAM,QAAQ,YAAY,MAAM,KAAK;CACrC,MAAM,UAAU,WAAW,yBAAyB;EAAE,GAAG;EAAO;CAAa,IAAI,KAAK;CAItF,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;GAEjD,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;CACrD;CAGA,QAAQ,KAAK,IAAI,qBAAqB,WAAW,KAAK;CACtD,QAAQ,KAAK,IAAI,uBAAuB,cAAc,KAAK;CAC3D,QAAQ,KAAK,IAAI,sBAAsB,WAAW,KAAK;CAEvD,MAAM,MAAM,eAAe,iBAAiB,SAAS,YAAY,CAAC;CAMlE,OAAO;EAAE,SAJO,eAAe;GAAE;GAAQ,cAAc,IAAI,MAAM;GAAM;EAAW,CAInE;EAAG;EAAS;EAAK;EAAY;EAAe;EAAY,cAFlD,eAAiC,SAAS,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,KAAK,MAEvC;CAAE;AACtF"}
1
+ {"version":3,"file":"use-hover-card.js","names":[],"sources":["../../../src/components/hover-card/use-hover-card.ts"],"sourcesContent":["import type { HoverCardApi, HoverCardSchema } 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 { connectHoverCard, hoverCardMachine } 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 HoverCardContext {\n service: Service<HoverCardSchema>\n api: ComputedRef<HoverCardApi>\n /** 定位锚点。 */\n triggerRef: Ref<HTMLElement | null>\n /** 被定位的浮层。 */\n positionerRef: Ref<HTMLElement | null>\n /** 消解层节点,也是判定焦点是否仍在卡片内的依据。 */\n contentRef: Ref<HTMLElement | null>\n /** 此刻该不该渲染:退场动画播完之前仍为真。 */\n visible: Ref<boolean>\n /** 浮层搬到哪儿:全局配置的 portalContainer > body。 */\n portalTarget: ComputedRef<string | Element>\n}\n\nexport function useHoverCard(\n props: HoverCardSchema['props'],\n onOpenChange?: HoverCardSchema['props']['onOpenChange'],\n): HoverCardContext {\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\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(hoverCardMachine, () => ({ ...props, onOpenChange }), scope)\n\n // 无 DOM 环境(SSR)不建引擎与消解层\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 // trigger 记为本层分支,指针按在它上面算层内交互;\n // 浮层壳一并记上:卡片之外还浮着自绘滚动条,按住它拖动不该把卡片消解掉\n branches: () => [triggerRef.value, positionerRef.value].filter(Boolean) as Element[],\n // 悬停卡片非模态:不陷焦点、不锁滚动、无遮罩\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 }\n\n // 元素 getter 在无 DOM 环境下也要设,连接层判定焦点去向时经它们取节点\n service.refs.set('getAnchorEl', () => triggerRef.value)\n service.refs.set('getFloatingEl', () => positionerRef.value)\n service.refs.set('getContentEl', () => contentRef.value)\n\n const api = computed(() => connectHoverCard(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, triggerRef, positionerRef, contentRef, portalTarget }\n}\n"],"mappings":";;;;;;;;;;AA6BA,SAAgB,aACd,OACA,cACkB;CAClB,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,IAAwB,IAAI;CAC/C,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,aAAa,IAAwB,IAAI;CAE/C,MAAM,QAAQ,qBAAqB;CACnC,MAAM,QAAQ,YAAY,MAAM,KAAK;CACrC,MAAM,UAAU,WAAW,yBAAyB;EAAE,GAAG;EAAO;CAAa,IAAI,KAAK;CAItF,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;GAEtE,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;CACrD;CAGA,QAAQ,KAAK,IAAI,qBAAqB,WAAW,KAAK;CACtD,QAAQ,KAAK,IAAI,uBAAuB,cAAc,KAAK;CAC3D,QAAQ,KAAK,IAAI,sBAAsB,WAAW,KAAK;CAEvD,MAAM,MAAM,eAAe,iBAAiB,SAAS,YAAY,CAAC;CAMlE,OAAO;EAAE,SAJO,eAAe;GAAE;GAAQ,cAAc,IAAI,MAAM;GAAM;EAAW,CAInE;EAAG;EAAS;EAAK;EAAY;EAAe;EAAY,cAFlD,eAAiC,SAAS,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,KAAK,MAEvC;CAAE;AACtF"}
@@ -54,8 +54,8 @@ declare const XhIcon: import("vue").DefineComponent<import("vue").ExtractPropTyp
54
54
  };
55
55
  }>> & Readonly<{}>, {
56
56
  label: string;
57
- size: Size;
58
57
  tone: Tone;
58
+ size: Size;
59
59
  icon: IconRecord;
60
60
  weight: IconWeight;
61
61
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -30,8 +30,8 @@ declare const XhIconWrapper: import("vue").DefineComponent<import("vue").Extract
30
30
  default: undefined;
31
31
  };
32
32
  }>> & Readonly<{}>, {
33
- size: Size;
34
33
  tone: Tone;
34
+ size: Size;
35
35
  variant: ActionVariant;
36
36
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
37
37
  //#endregion
@@ -1,6 +1,6 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/image/context.ts
3
- const KEY = Symbol("xh-image");
3
+ const KEY = Symbol.for("xh-image");
4
4
  function provideImage(ctx) {
5
5
  provide(KEY, ctx);
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/image/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { ImageContext } from './use-image'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<ImageContext> = Symbol('xh-image')\n\nexport function provideImage(ctx: ImageContext): void {\n provide(KEY, ctx)\n}\n\nexport function useImageContext(): ImageContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Image 部件必须用在 XhImageRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAkC,OAAO,UAAU;AAEzD,SAAgB,aAAa,KAAyB;CACpD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,kBAAgC;CAC9C,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,iCAAiC;CACnD,OAAO;AACT"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/image/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { ImageContext } from './use-image'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<ImageContext> = Symbol.for('xh-image')\n\nexport function provideImage(ctx: ImageContext): void {\n provide(KEY, ctx)\n}\n\nexport function useImageContext(): ImageContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Image 部件必须用在 XhImageRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAkC,OAAO,IAAI,UAAU;AAE7D,SAAgB,aAAa,KAAyB;CACpD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,kBAAgC;CAC9C,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,iCAAiC;CACnD,OAAO;AACT"}
@@ -1,6 +1,6 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/image-cropper/context.ts
3
- const KEY = Symbol("xh-image-cropper");
3
+ const KEY = Symbol.for("xh-image-cropper");
4
4
  function provideImageCropper(ctx) {
5
5
  provide(KEY, ctx);
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/image-cropper/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { ImageCropperContext } from './use-image-cropper'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<ImageCropperContext> = Symbol('xh-image-cropper')\n\nexport function provideImageCropper(ctx: ImageCropperContext): void {\n provide(KEY, ctx)\n}\n\nexport function useImageCropperContext(): ImageCropperContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] ImageCropper 部件必须用在 XhImageCropperRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAyC,OAAO,kBAAkB;AAExE,SAAgB,oBAAoB,KAAgC;CAClE,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,yBAA8C;CAC5D,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,+CAA+C;CACjE,OAAO;AACT"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/image-cropper/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { ImageCropperContext } from './use-image-cropper'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<ImageCropperContext> = Symbol.for('xh-image-cropper')\n\nexport function provideImageCropper(ctx: ImageCropperContext): void {\n provide(KEY, ctx)\n}\n\nexport function useImageCropperContext(): ImageCropperContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] ImageCropper 部件必须用在 XhImageCropperRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAyC,OAAO,IAAI,kBAAkB;AAE5E,SAAgB,oBAAoB,KAAgC;CAClE,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,yBAA8C;CAC5D,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,+CAA+C;CACjE,OAAO;AACT"}
@@ -147,9 +147,9 @@ declare const XhImageCropperRoot: import("vue").DefineComponent<import("vue").Ex
147
147
  defaultValue: ImageCropperRect;
148
148
  disabled: boolean;
149
149
  translations: Partial<import("@xihan-ui/headless").ImageCropperTranslations> | undefined;
150
+ readOnly: boolean;
150
151
  src: string;
151
152
  alt: string;
152
- readOnly: boolean;
153
153
  shape: ImageCropperShape;
154
154
  zoom: number;
155
155
  rotation: number;
@@ -1,6 +1,6 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/image-viewer/context.ts
3
- const KEY = Symbol("xh-image-viewer");
3
+ const KEY = Symbol.for("xh-image-viewer");
4
4
  function provideImageViewer(ctx) {
5
5
  provide(KEY, ctx);
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/image-viewer/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { ImageViewerContext } from './use-image-viewer'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<ImageViewerContext> = Symbol('xh-image-viewer')\n\nexport function provideImageViewer(ctx: ImageViewerContext): void {\n provide(KEY, ctx)\n}\n\nexport function useImageViewerContext(): ImageViewerContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] ImageViewer 部件必须用在 XhImageViewerRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAwC,OAAO,iBAAiB;AAEtE,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"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/image-viewer/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { ImageViewerContext } from './use-image-viewer'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<ImageViewerContext> = Symbol.for('xh-image-viewer')\n\nexport function provideImageViewer(ctx: ImageViewerContext): void {\n provide(KEY, ctx)\n}\n\nexport function useImageViewerContext(): ImageViewerContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] ImageViewer 部件必须用在 XhImageViewerRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAwC,OAAO,IAAI,iBAAiB;AAE1E,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"}
@@ -118,15 +118,15 @@ declare const XhImageViewerRoot: import("vue").DefineComponent<import("vue").Ext
118
118
  "onIndex-change"?: ((_details: import("@xihan-ui/headless").ImageViewerIndexChangeDetails) => any) | undefined;
119
119
  "onUpdate:index"?: ((_index: number) => any) | undefined;
120
120
  }>, {
121
+ translations: Partial<import("@xihan-ui/headless").ImageViewerTranslations> | undefined;
121
122
  open: boolean;
122
123
  defaultOpen: boolean;
123
- translations: Partial<import("@xihan-ui/headless").ImageViewerTranslations> | undefined;
124
124
  index: number;
125
125
  loop: boolean;
126
+ items: ImageViewerItem[];
126
127
  closeOnEscape: boolean;
127
128
  closeOnInteractOutside: boolean;
128
129
  restoreFocus: boolean;
129
- items: ImageViewerItem[];
130
130
  defaultIndex: number;
131
131
  zoomStep: number;
132
132
  minScale: number;
@@ -1,6 +1,6 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/infinite-scroll/context.ts
3
- const KEY = Symbol("xh-infinite-scroll");
3
+ const KEY = Symbol.for("xh-infinite-scroll");
4
4
  function provideInfiniteScroll(ctx) {
5
5
  provide(KEY, ctx);
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/infinite-scroll/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { InfiniteScrollContext } from './use-infinite-scroll'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<InfiniteScrollContext> = Symbol('xh-infinite-scroll')\n\nexport function provideInfiniteScroll(ctx: InfiniteScrollContext): void {\n provide(KEY, ctx)\n}\n\nexport function useInfiniteScrollContext(): InfiniteScrollContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] InfiniteScroll 部件必须用在 XhInfiniteScrollRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAA2C,OAAO,oBAAoB;AAE5E,SAAgB,sBAAsB,KAAkC;CACtE,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,2BAAkD;CAChE,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,mDAAmD;CACrE,OAAO;AACT"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/infinite-scroll/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { InfiniteScrollContext } from './use-infinite-scroll'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<InfiniteScrollContext> = Symbol.for('xh-infinite-scroll')\n\nexport function provideInfiniteScroll(ctx: InfiniteScrollContext): void {\n provide(KEY, ctx)\n}\n\nexport function useInfiniteScrollContext(): InfiniteScrollContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] InfiniteScroll 部件必须用在 XhInfiniteScrollRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAA2C,OAAO,IAAI,oBAAoB;AAEhF,SAAgB,sBAAsB,KAAkC;CACtE,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,2BAAkD;CAChE,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,mDAAmD;CACrE,OAAO;AACT"}
@@ -47,8 +47,8 @@ declare const XhInfiniteScrollRoot: import("vue").DefineComponent<import("vue").
47
47
  }>> & Readonly<{
48
48
  onLoad?: (() => any) | undefined;
49
49
  }>, {
50
- target: HTMLElement | null;
51
50
  disabled: boolean;
51
+ target: HTMLElement | null;
52
52
  loading: boolean;
53
53
  distance: number;
54
54
  }, SlotsType<{
@@ -1,12 +1,16 @@
1
1
  import { PayloadOf } from "../../runtime/payload.js";
2
2
  import { PropType, VNode } from "vue";
3
- import { JsonViewerSchema, JsonViewerTranslations } from "@xihan-ui/headless";
3
+ import { JsonViewerSchema, JsonViewerTranslations, JsonViewerView } from "@xihan-ui/headless";
4
4
  import { Direction, Size } from "@xihan-ui/kernel";
5
5
  //#region src/components/json-viewer/json-viewer.d.ts
6
6
  type JsonViewerProps = JsonViewerSchema['props'];
7
7
  declare const XhJsonViewerRoot: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
8
8
  value: {
9
9
  type: PropType<unknown>;
10
+ default: unknown;
11
+ };
12
+ view: {
13
+ type: PropType<JsonViewerView>;
10
14
  default: undefined;
11
15
  };
12
16
  expandedValue: {
@@ -57,6 +61,10 @@ declare const XhJsonViewerRoot: import("vue").DefineComponent<import("vue").Extr
57
61
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
58
62
  value: {
59
63
  type: PropType<unknown>;
64
+ default: unknown;
65
+ };
66
+ view: {
67
+ type: PropType<JsonViewerView>;
60
68
  default: undefined;
61
69
  };
62
70
  expandedValue: {
@@ -103,10 +111,11 @@ declare const XhJsonViewerRoot: import("vue").DefineComponent<import("vue").Extr
103
111
  "onExpanded-change"?: ((_details: import("@xihan-ui/headless").JsonViewerExpandedChangeDetails) => any) | undefined;
104
112
  "onUpdate:expandedValue"?: ((_value: string[]) => any) | undefined;
105
113
  }>, {
106
- size: Size;
107
- value: undefined;
114
+ value: unknown;
108
115
  dir: Direction;
116
+ size: Size;
109
117
  translations: Partial<JsonViewerTranslations>;
118
+ view: JsonViewerView;
110
119
  loop: boolean;
111
120
  expandedValue: string[];
112
121
  defaultExpandedValue: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"json-viewer.d.ts","names":[],"sources":["../../../src/components/json-viewer/json-viewer.ts"],"mappings":";;;;;KAQK,kBAAkB;cA+DV,gCAAgB,8BAAA;;IAKS,MAAA;;;;IACF,MAAA;;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;IAMhB,MAAA,SAAS;;;;IACR,MAAA,SAAS;;;;IACD,MAAA,SAAS,QAAQ;;;;;;EAInB,oBAAA,UAAA,UAAU;EACP,yBAAA,QAAA,UAAU;;;IAfT,MAAA;;;;IACF,MAAA;;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;IAMhB,MAAA,SAAS;;;;IACR,MAAA,SAAS;;;;IACD,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;qCAsBnD"}
1
+ {"version":3,"file":"json-viewer.d.ts","names":[],"sources":["../../../src/components/json-viewer/json-viewer.ts"],"mappings":";;;;;KASK,kBAAkB;cA+DV,gCAAgB,8BAAA;;IAKS,MAAA;IAAyC;;;IACnD,MAAA,SAAS;;;;IACD,MAAA;;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;IAMhB,MAAA,SAAS;;;;IACR,MAAA,SAAS;;;;IACD,MAAA,SAAS,QAAQ;;;;;;EAInB,oBAAA,UAAA,UAAU;EACP,yBAAA,QAAA,UAAU;;;IAhBT,MAAA;IAAyC;;;IACnD,MAAA,SAAS;;;;IACD,MAAA;;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;IAMhB,MAAA,SAAS;;;;IACR,MAAA,SAAS;;;;IACD,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;;qCAgDnD"}
@@ -1,6 +1,7 @@
1
1
  import { withXhConfig } from "../../config/config.js";
2
+ import { useScrollbars } from "../../runtime/use-scrollbars.js";
2
3
  import { useJsonViewer } from "./use-json-viewer.js";
3
- import { defineComponent, h } from "vue";
4
+ import { defineComponent, h, ref } from "vue";
4
5
  //#region src/components/json-viewer/json-viewer.ts
5
6
  /** 可见行按父路径分组,铺 DOM 时逐层取用。 */
6
7
  function groupByParent(nodes) {
@@ -47,6 +48,10 @@ const XhJsonViewerRoot = defineComponent({
47
48
  type: null,
48
49
  default: void 0
49
50
  },
51
+ view: {
52
+ type: String,
53
+ default: void 0
54
+ },
50
55
  expandedValue: {
51
56
  type: Array,
52
57
  default: void 0
@@ -98,10 +103,26 @@ const XhJsonViewerRoot = defineComponent({
98
103
  emit("update:expandedValue", details.value);
99
104
  };
100
105
  const ctx = useJsonViewer(withXhConfig("json-viewer", props), notify);
106
+ const layerRef = ref(null);
107
+ const keepLayer = (el) => {
108
+ if (el) layerRef.value = el;
109
+ };
110
+ const bars = useScrollbars({
111
+ scrollable: () => layerRef.value,
112
+ axes: ["vertical", "horizontal"],
113
+ props: () => ({ dir: props.dir })
114
+ });
101
115
  return () => {
102
116
  const api = ctx.api.value;
117
+ if (api.view === "text") return h("div", api.getRootProps(), [h("pre", {
118
+ ...api.getTextProps(),
119
+ ref: keepLayer
120
+ }, api.text), ...bars.render()]);
103
121
  const children = groupByParent(api.visibleNodes);
104
- return h("div", api.getRootProps(), [h("div", api.getTreeProps(), renderRows(api, children, null))]);
122
+ return h("div", api.getRootProps(), [h("div", {
123
+ ...api.getTreeProps(),
124
+ ref: keepLayer
125
+ }, renderRows(api, children, null)), ...bars.render()]);
105
126
  };
106
127
  }
107
128
  });
@@ -1 +1 @@
1
- {"version":3,"file":"json-viewer.js","names":[],"sources":["../../../src/components/json-viewer/json-viewer.ts"],"sourcesContent":["import type { JsonViewerApi, JsonViewerNode, JsonViewerSchema, JsonViewerTranslations } from '@xihan-ui/headless'\nimport type { Direction, Size } from '@xihan-ui/kernel'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useJsonViewer } from './use-json-viewer'\n\ntype JsonViewerProps = JsonViewerSchema['props']\n\n/** 可见行按父路径分组,铺 DOM 时逐层取用。 */\nfunction groupByParent(nodes: readonly JsonViewerNode[]): Map<string | null, JsonViewerNode[]> {\n const out = new Map<string | null, JsonViewerNode[]>()\n for (const node of nodes) {\n const list = out.get(node.parent)\n if (list)\n list.push(node)\n else\n out.set(node.parent, [node])\n }\n return out\n}\n\nfunction renderRows(\n api: JsonViewerApi,\n children: Map<string | null, JsonViewerNode[]>,\n parent: string | null,\n): VNode[] {\n return (children.get(parent) ?? []).map(node => renderRow(api, children, node))\n}\n\n/**\n * 一行:标量是 item(键名 + 值),对象与数组是 branch(控制行 + 子层)。\n * 没有键名的行(根行、截断占位)不渲染键名部件,免得多出一个空盒子。\n */\nfunction renderRow(\n api: JsonViewerApi,\n children: Map<string | null, JsonViewerNode[]>,\n node: JsonViewerNode,\n): VNode {\n const ref = { value: node.value }\n\n if (!node.branch) {\n const parts: VNode[] = []\n if (node.key != null)\n parts.push(h('span', api.getItemKeyProps(ref) as Record<string, unknown>, node.key))\n parts.push(h('span', api.getItemValueProps(ref) as Record<string, unknown>, api.valueText(node)))\n return h('div', { ...api.getItemProps(ref) as Record<string, unknown>, key: node.value }, parts)\n }\n\n const control: VNode[] = [\n h('span', api.getBranchTriggerProps(ref) as Record<string, unknown>, [\n h('span', api.getBranchIndicatorProps(ref) as Record<string, unknown>),\n ]),\n ]\n if (node.key != null)\n control.push(h('span', api.getBranchTextProps(ref) as Record<string, unknown>, node.key))\n control.push(h('span', api.getPreviewProps(ref) as Record<string, unknown>, api.previewText(node)))\n\n const parts: VNode[] = [h('div', api.getBranchControlProps(ref) as Record<string, unknown>, control)]\n // 收起的子层不渲染:一份大 JSON 全铺出来会把页面压住,展开集合本来也是逐层放开的\n if (api.isExpanded(node.value)) {\n parts.push(h(\n 'div',\n api.getBranchContentProps(ref) as Record<string, unknown>,\n renderRows(api, children, node.value),\n ))\n }\n return h('div', { ...api.getBranchProps(ref) as Record<string, unknown>, key: node.value }, parts)\n}\n\nexport const XhJsonViewerRoot = defineComponent({\n name: 'XhJsonViewerRoot',\n // 有 connect 兜底的 prop 一律 default: undefined\n props: {\n // 任意形状都收,类型检查交给使用方\n value: { type: null as unknown as PropType<unknown>, default: undefined },\n expandedValue: { type: Array as PropType<string[]>, default: undefined },\n defaultExpandedValue: { type: Array as PropType<string[]>, default: undefined },\n defaultExpandedDepth: { type: Number, default: undefined },\n maxStringLength: { type: Number, default: undefined },\n maxItems: { type: Number, default: undefined },\n sortKeys: { type: Boolean, default: undefined },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n translations: { type: Object as PropType<Partial<JsonViewerTranslations>>, default: undefined },\n },\n // expanded-change 携带 { value },update:expandedValue 携带裸集合\n emits: {\n 'expanded-change': (_details: PayloadOf<JsonViewerProps, 'onExpandedChange'>) => true,\n 'update:expandedValue': (_value: PayloadOf<JsonViewerProps, 'onExpandedChange'>['value']) => true,\n },\n setup(props, { emit }) {\n const notify: JsonViewerProps['onExpandedChange'] = (details) => {\n emit('expanded-change', details)\n emit('update:expandedValue', details.value)\n }\n const ctx = useJsonViewer(withXhConfig('json-viewer', props) as JsonViewerProps, notify)\n // 行是按数据摊出来的,作者写不出也不必写:整棵树由组件自己铺\n return () => {\n const api = ctx.api.value\n const children = groupByParent(api.visibleNodes)\n return h('div', api.getRootProps() as Record<string, unknown>, [\n h('div', api.getTreeProps() as Record<string, unknown>, renderRows(api, children, null)),\n ])\n }\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"json-viewer.js","names":[],"sources":["../../../src/components/json-viewer/json-viewer.ts"],"sourcesContent":["import type { JsonViewerApi, JsonViewerNode, JsonViewerSchema, JsonViewerTranslations, JsonViewerView } from '@xihan-ui/headless'\nimport type { Direction, Size } from '@xihan-ui/kernel'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { useJsonViewer } from './use-json-viewer'\n\ntype JsonViewerProps = JsonViewerSchema['props']\n\n/** 可见行按父路径分组,铺 DOM 时逐层取用。 */\nfunction groupByParent(nodes: readonly JsonViewerNode[]): Map<string | null, JsonViewerNode[]> {\n const out = new Map<string | null, JsonViewerNode[]>()\n for (const node of nodes) {\n const list = out.get(node.parent)\n if (list)\n list.push(node)\n else\n out.set(node.parent, [node])\n }\n return out\n}\n\nfunction renderRows(\n api: JsonViewerApi,\n children: Map<string | null, JsonViewerNode[]>,\n parent: string | null,\n): VNode[] {\n return (children.get(parent) ?? []).map(node => renderRow(api, children, node))\n}\n\n/**\n * 一行:标量是 item(键名 + 值),对象与数组是 branch(控制行 + 子层)。\n * 没有键名的行(根行、截断占位)不渲染键名部件,免得多出一个空盒子。\n */\nfunction renderRow(\n api: JsonViewerApi,\n children: Map<string | null, JsonViewerNode[]>,\n node: JsonViewerNode,\n): VNode {\n const ref = { value: node.value }\n\n if (!node.branch) {\n const parts: VNode[] = []\n if (node.key != null)\n parts.push(h('span', api.getItemKeyProps(ref) as Record<string, unknown>, node.key))\n parts.push(h('span', api.getItemValueProps(ref) as Record<string, unknown>, api.valueText(node)))\n return h('div', { ...api.getItemProps(ref) as Record<string, unknown>, key: node.value }, parts)\n }\n\n const control: VNode[] = [\n h('span', api.getBranchTriggerProps(ref) as Record<string, unknown>, [\n h('span', api.getBranchIndicatorProps(ref) as Record<string, unknown>),\n ]),\n ]\n if (node.key != null)\n control.push(h('span', api.getBranchTextProps(ref) as Record<string, unknown>, node.key))\n control.push(h('span', api.getPreviewProps(ref) as Record<string, unknown>, api.previewText(node)))\n\n const parts: VNode[] = [h('div', api.getBranchControlProps(ref) as Record<string, unknown>, control)]\n // 收起的子层不渲染:一份大 JSON 全铺出来会把页面压住,展开集合本来也是逐层放开的\n if (api.isExpanded(node.value)) {\n parts.push(h(\n 'div',\n api.getBranchContentProps(ref) as Record<string, unknown>,\n renderRows(api, children, node.value),\n ))\n }\n return h('div', { ...api.getBranchProps(ref) as Record<string, unknown>, key: node.value }, parts)\n}\n\nexport const XhJsonViewerRoot = defineComponent({\n name: 'XhJsonViewerRoot',\n // 有 connect 兜底的 prop 一律 default: undefined\n props: {\n // 任意形状都收,类型检查交给使用方\n value: { type: null as unknown as PropType<unknown>, default: undefined as unknown },\n view: { type: String as PropType<JsonViewerView>, default: undefined },\n expandedValue: { type: Array as PropType<string[]>, default: undefined },\n defaultExpandedValue: { type: Array as PropType<string[]>, default: undefined },\n defaultExpandedDepth: { type: Number, default: undefined },\n maxStringLength: { type: Number, default: undefined },\n maxItems: { type: Number, default: undefined },\n sortKeys: { type: Boolean, default: undefined },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n translations: { type: Object as PropType<Partial<JsonViewerTranslations>>, default: undefined },\n },\n // expanded-change 携带 { value },update:expandedValue 携带裸集合\n emits: {\n 'expanded-change': (_details: PayloadOf<JsonViewerProps, 'onExpandedChange'>) => true,\n 'update:expandedValue': (_value: PayloadOf<JsonViewerProps, 'onExpandedChange'>['value']) => true,\n },\n setup(props, { emit }) {\n const notify: JsonViewerProps['onExpandedChange'] = (details) => {\n emit('expanded-change', details)\n emit('update:expandedValue', details.value)\n }\n const ctx = useJsonViewer(withXhConfig('json-viewer', props) as JsonViewerProps, notify)\n // 此刻在场的那个滚动层:两档互斥,树档是 tree、原文档是 pre。\n // 两档共用同一个函数 ref:换档时新旧 vnode 的 ref 是同一个,\n // Vue 就不再先把旧节点那份置空——两档各拿一个 ref 的话,\n // 中间会空出一拍,条子在那一拍里找不到容器、投一条诊断。\n // 只记在场的那个:拆卸时那次空调用不往下传\n const layerRef = ref<HTMLElement | null>(null)\n const keepLayer = (el: unknown): void => {\n if (el)\n layerRef.value = el as HTMLElement\n }\n // 两档的自绘条:与滚动层同级、绝对定位不占布局,壳是这层根。\n // 两条轴都摆——深层缩进往行首方向推、长字符串往行尾伸\n const bars = useScrollbars({\n scrollable: () => layerRef.value,\n axes: ['vertical', 'horizontal'],\n props: () => ({ dir: props.dir }),\n })\n // 行是按数据摊出来的,作者写不出也不必写:整棵树由组件自己铺\n return () => {\n const api = ctx.api.value\n // 原文档不铺行:整块文本交给 pre,框选与复制才拿得到与后端一字不差的那份\n if (api.view === 'text') {\n return h('div', api.getRootProps() as Record<string, unknown>, [\n h('pre', { ...api.getTextProps() as Record<string, unknown>, ref: keepLayer }, api.text),\n ...bars.render(),\n ])\n }\n\n const children = groupByParent(api.visibleNodes)\n return h('div', api.getRootProps() as Record<string, unknown>, [\n h('div', { ...api.getTreeProps() as Record<string, unknown>, ref: keepLayer }, renderRows(api, children, null)),\n ...bars.render(),\n ])\n }\n },\n})\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/layout/context.ts
3
- const KEY = Symbol("xh-layout");
3
+ const KEY = Symbol.for("xh-layout");
4
4
  function provideLayout(ctx) {
5
5
  provide(KEY, ctx);
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/layout/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { LayoutContext } from './use-layout'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<LayoutContext> = Symbol('xh-layout')\n\nexport function provideLayout(ctx: LayoutContext): void {\n provide(KEY, ctx)\n}\n\nexport function useLayoutContext(): LayoutContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Layout 部件必须用在 XhLayoutRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAmC,OAAO,WAAW;AAE3D,SAAgB,cAAc,KAA0B;CACtD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,mBAAkC;CAChD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,mCAAmC;CACrD,OAAO;AACT"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/layout/context.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\nimport type { LayoutContext } from './use-layout'\nimport { inject, provide } from 'vue'\n\nconst KEY: InjectionKey<LayoutContext> = Symbol.for('xh-layout')\n\nexport function provideLayout(ctx: LayoutContext): void {\n provide(KEY, ctx)\n}\n\nexport function useLayoutContext(): LayoutContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] Layout 部件必须用在 XhLayoutRoot 内')\n return ctx\n}\n"],"mappings":";;AAIA,MAAM,MAAmC,OAAO,IAAI,WAAW;AAE/D,SAAgB,cAAc,KAA0B;CACtD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,mBAAkC;CAChD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,mCAAmC;CACrD,OAAO;AACT"}
@@ -1,6 +1,6 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/list/context.ts
3
- const KEY = Symbol("xh-list");
3
+ const KEY = Symbol.for("xh-list");
4
4
  function provideList(ctx) {
5
5
  provide(KEY, ctx);
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/list/context.ts"],"sourcesContent":["import type { ListApi } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport { inject, provide } from 'vue'\n\nexport interface ListContext {\n api: ComputedRef<ListApi>\n}\n\nconst KEY: InjectionKey<ListContext> = Symbol('xh-list')\n\nexport function provideList(ctx: ListContext): void {\n provide(KEY, ctx)\n}\n\nexport function useListContext(): ListContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] List 部件必须用在 XhListRoot 内')\n return ctx\n}\n"],"mappings":";;AAQA,MAAM,MAAiC,OAAO,SAAS;AAEvD,SAAgB,YAAY,KAAwB;CAClD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,iBAA8B;CAC5C,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,+BAA+B;CACjD,OAAO;AACT"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/components/list/context.ts"],"sourcesContent":["import type { ListApi } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport { inject, provide } from 'vue'\n\nexport interface ListContext {\n api: ComputedRef<ListApi>\n}\n\nconst KEY: InjectionKey<ListContext> = Symbol.for('xh-list')\n\nexport function provideList(ctx: ListContext): void {\n provide(KEY, ctx)\n}\n\nexport function useListContext(): ListContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] List 部件必须用在 XhListRoot 内')\n return ctx\n}\n"],"mappings":";;AAQA,MAAM,MAAiC,OAAO,IAAI,SAAS;AAE3D,SAAgB,YAAY,KAAwB;CAClD,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,iBAA8B;CAC5C,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,+BAA+B;CACjD,OAAO;AACT"}
@@ -33,8 +33,8 @@ declare const XhListRoot: import("vue").DefineComponent<import("vue").ExtractPro
33
33
  as: string;
34
34
  size: Size;
35
35
  hoverable: boolean;
36
- bordered: boolean;
37
36
  split: boolean;
37
+ bordered: boolean;
38
38
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
39
39
  declare const XhListItem: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
40
40
  /** 条目渲染成哪个标签,默认 li;根换成 div 时这里一并换掉。 */
@@ -1,8 +1,8 @@
1
1
  import { inject, provide } from "vue";
2
2
  //#region src/components/listbox/context.ts
3
- const KEY = Symbol("xh-listbox");
4
- const ITEM_KEY = Symbol("xh-listbox-item");
5
- const GROUP_KEY = Symbol("xh-listbox-item-group");
3
+ const KEY = Symbol.for("xh-listbox");
4
+ const ITEM_KEY = Symbol.for("xh-listbox-item");
5
+ const GROUP_KEY = Symbol.for("xh-listbox-item-group");
6
6
  function provideListbox(ctx) {
7
7
  provide(KEY, ctx);
8
8
  }