@xihan-ui/vue 3.0.0 → 3.2.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 (237) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/README.md +1 -1
  3. package/dist/components/carousel/carousel.d.ts +7 -1
  4. package/dist/components/carousel/carousel.d.ts.map +1 -1
  5. package/dist/components/carousel/carousel.js +1 -0
  6. package/dist/components/carousel/carousel.js.map +1 -1
  7. package/dist/components/cartesian-chart/cartesian-chart.d.ts.map +1 -1
  8. package/dist/components/cartesian-chart/cartesian-chart.js +2 -2
  9. package/dist/components/cartesian-chart/cartesian-chart.js.map +1 -1
  10. package/dist/components/cascader/cascader.d.ts +2 -0
  11. package/dist/components/cascader/cascader.d.ts.map +1 -1
  12. package/dist/components/cascader/cascader.js +5 -2
  13. package/dist/components/cascader/cascader.js.map +1 -1
  14. package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
  15. package/dist/components/checkbox-group/checkbox-group.js +30 -11
  16. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  17. package/dist/components/checkbox-group/use-checkbox-group.d.ts +6 -1
  18. package/dist/components/checkbox-group/use-checkbox-group.d.ts.map +1 -1
  19. package/dist/components/checkbox-group/use-checkbox-group.js +7 -3
  20. package/dist/components/checkbox-group/use-checkbox-group.js.map +1 -1
  21. package/dist/components/citation/citation.d.ts.map +1 -1
  22. package/dist/components/citation/citation.js +8 -6
  23. package/dist/components/citation/citation.js.map +1 -1
  24. package/dist/components/color-field/color-field.d.ts +2 -0
  25. package/dist/components/color-field/color-field.d.ts.map +1 -1
  26. package/dist/components/color-field/color-field.js +3 -1
  27. package/dist/components/color-field/color-field.js.map +1 -1
  28. package/dist/components/color-picker/color-picker.d.ts +76 -9
  29. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  30. package/dist/components/color-picker/color-picker.js +89 -7
  31. package/dist/components/color-picker/color-picker.js.map +1 -1
  32. package/dist/components/color-picker/context.js +10 -1
  33. package/dist/components/color-picker/context.js.map +1 -1
  34. package/dist/components/color-picker/use-color-picker.js +14 -4
  35. package/dist/components/color-picker/use-color-picker.js.map +1 -1
  36. package/dist/components/color-swatch-picker/color-swatch-picker.d.ts.map +1 -1
  37. package/dist/components/color-swatch-picker/color-swatch-picker.js +21 -4
  38. package/dist/components/color-swatch-picker/color-swatch-picker.js.map +1 -1
  39. package/dist/components/color-swatch-picker/use-color-swatch-picker.d.ts +6 -1
  40. package/dist/components/color-swatch-picker/use-color-swatch-picker.d.ts.map +1 -1
  41. package/dist/components/color-swatch-picker/use-color-swatch-picker.js +7 -3
  42. package/dist/components/color-swatch-picker/use-color-swatch-picker.js.map +1 -1
  43. package/dist/components/combobox/combobox.d.ts +2 -0
  44. package/dist/components/combobox/combobox.d.ts.map +1 -1
  45. package/dist/components/combobox/combobox.js +6 -4
  46. package/dist/components/combobox/combobox.js.map +1 -1
  47. package/dist/components/command/command.d.ts +3 -3
  48. package/dist/components/context-menu/context-menu.d.ts +9 -1
  49. package/dist/components/context-menu/context-menu.d.ts.map +1 -1
  50. package/dist/components/context-menu/context-menu.js +11 -1
  51. package/dist/components/context-menu/context-menu.js.map +1 -1
  52. package/dist/components/date-field/date-field.d.ts +6 -2
  53. package/dist/components/date-field/date-field.d.ts.map +1 -1
  54. package/dist/components/date-field/date-field.js +5 -2
  55. package/dist/components/date-field/date-field.js.map +1 -1
  56. package/dist/components/date-picker/context.js +10 -1
  57. package/dist/components/date-picker/context.js.map +1 -1
  58. package/dist/components/date-picker/date-picker.d.ts +58 -3
  59. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  60. package/dist/components/date-picker/date-picker.js +77 -5
  61. package/dist/components/date-picker/date-picker.js.map +1 -1
  62. package/dist/components/date-range-picker/date-range-picker.d.ts +27 -1
  63. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  64. package/dist/components/date-range-picker/date-range-picker.js +10 -1
  65. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  66. package/dist/components/dialog/dialog.d.ts +12 -1
  67. package/dist/components/dialog/dialog.d.ts.map +1 -1
  68. package/dist/components/dialog/dialog.js +14 -4
  69. package/dist/components/dialog/dialog.js.map +1 -1
  70. package/dist/components/drawer/drawer.d.ts +12 -1
  71. package/dist/components/drawer/drawer.d.ts.map +1 -1
  72. package/dist/components/drawer/drawer.js +14 -4
  73. package/dist/components/drawer/drawer.js.map +1 -1
  74. package/dist/components/field/context.d.ts +6 -1
  75. package/dist/components/field/context.d.ts.map +1 -1
  76. package/dist/components/field/context.js +10 -1
  77. package/dist/components/field/context.js.map +1 -1
  78. package/dist/components/field/field.d.ts +9 -1
  79. package/dist/components/field/field.d.ts.map +1 -1
  80. package/dist/components/field/field.js +14 -2
  81. package/dist/components/field/field.js.map +1 -1
  82. package/dist/components/field/use-field-control.d.ts +8 -1
  83. package/dist/components/field/use-field-control.d.ts.map +1 -1
  84. package/dist/components/field/use-field-control.js +14 -1
  85. package/dist/components/field/use-field-control.js.map +1 -1
  86. package/dist/components/file-upload/file-upload.d.ts +2 -0
  87. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  88. package/dist/components/file-upload/file-upload.js +3 -1
  89. package/dist/components/file-upload/file-upload.js.map +1 -1
  90. package/dist/components/float-button/float-button.d.ts +26 -1
  91. package/dist/components/float-button/float-button.d.ts.map +1 -1
  92. package/dist/components/float-button/float-button.js +17 -5
  93. package/dist/components/float-button/float-button.js.map +1 -1
  94. package/dist/components/float-button/use-float-button.js +7 -1
  95. package/dist/components/float-button/use-float-button.js.map +1 -1
  96. package/dist/components/floating-panel/floating-panel.d.ts +2 -2
  97. package/dist/components/floating-panel/floating-panel.js +4 -1
  98. package/dist/components/floating-panel/floating-panel.js.map +1 -1
  99. package/dist/components/form/context.js +5 -1
  100. package/dist/components/form/context.js.map +1 -1
  101. package/dist/components/form/form.d.ts +8 -0
  102. package/dist/components/form/form.d.ts.map +1 -1
  103. package/dist/components/form/form.js +4 -1
  104. package/dist/components/form/form.js.map +1 -1
  105. package/dist/components/form/use-form-control.js +1 -1
  106. package/dist/components/funnel-chart/funnel-chart.d.ts.map +1 -1
  107. package/dist/components/funnel-chart/funnel-chart.js +2 -2
  108. package/dist/components/funnel-chart/funnel-chart.js.map +1 -1
  109. package/dist/components/graph-chart/graph-chart.d.ts.map +1 -1
  110. package/dist/components/graph-chart/graph-chart.js +2 -2
  111. package/dist/components/graph-chart/graph-chart.js.map +1 -1
  112. package/dist/components/hierarchy-chart/hierarchy-chart.d.ts.map +1 -1
  113. package/dist/components/hierarchy-chart/hierarchy-chart.js +2 -2
  114. package/dist/components/hierarchy-chart/hierarchy-chart.js.map +1 -1
  115. package/dist/components/hover-card/hover-card.js +2 -1
  116. package/dist/components/hover-card/hover-card.js.map +1 -1
  117. package/dist/components/image-viewer/image-viewer.d.ts +7 -1
  118. package/dist/components/image-viewer/image-viewer.d.ts.map +1 -1
  119. package/dist/components/image-viewer/image-viewer.js +1 -0
  120. package/dist/components/image-viewer/image-viewer.js.map +1 -1
  121. package/dist/components/mention/mention.d.ts +1 -1
  122. package/dist/components/mention/mention.js +5 -4
  123. package/dist/components/mention/mention.js.map +1 -1
  124. package/dist/components/menu/menu.js +31 -2
  125. package/dist/components/menu/menu.js.map +1 -1
  126. package/dist/components/menubar/context.d.ts.map +1 -1
  127. package/dist/components/menubar/context.js.map +1 -1
  128. package/dist/components/menubar/menubar.d.ts +9 -1
  129. package/dist/components/menubar/menubar.d.ts.map +1 -1
  130. package/dist/components/menubar/menubar.js +29 -2
  131. package/dist/components/menubar/menubar.js.map +1 -1
  132. package/dist/components/pagination/pagination.js +4 -2
  133. package/dist/components/pagination/pagination.js.map +1 -1
  134. package/dist/components/pie-chart/pie-chart.d.ts.map +1 -1
  135. package/dist/components/pie-chart/pie-chart.js +2 -2
  136. package/dist/components/pie-chart/pie-chart.js.map +1 -1
  137. package/dist/components/pin-input/pin-input.d.ts.map +1 -1
  138. package/dist/components/pin-input/pin-input.js +7 -1
  139. package/dist/components/pin-input/pin-input.js.map +1 -1
  140. package/dist/components/popconfirm/popconfirm.d.ts +20 -1
  141. package/dist/components/popconfirm/popconfirm.d.ts.map +1 -1
  142. package/dist/components/popconfirm/popconfirm.js +9 -1
  143. package/dist/components/popconfirm/popconfirm.js.map +1 -1
  144. package/dist/components/popconfirm/use-popconfirm.js +2 -0
  145. package/dist/components/popconfirm/use-popconfirm.js.map +1 -1
  146. package/dist/components/popover/popover.d.ts +1 -1
  147. package/dist/components/popover/popover.js +2 -1
  148. package/dist/components/popover/popover.js.map +1 -1
  149. package/dist/components/radar-chart/radar-chart.d.ts.map +1 -1
  150. package/dist/components/radar-chart/radar-chart.js +2 -2
  151. package/dist/components/radar-chart/radar-chart.js.map +1 -1
  152. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  153. package/dist/components/radio-group/radio-group.js +25 -6
  154. package/dist/components/radio-group/radio-group.js.map +1 -1
  155. package/dist/components/radio-group/use-radio-group.d.ts +5 -0
  156. package/dist/components/radio-group/use-radio-group.d.ts.map +1 -1
  157. package/dist/components/radio-group/use-radio-group.js +4 -1
  158. package/dist/components/radio-group/use-radio-group.js.map +1 -1
  159. package/dist/components/rating/rating.d.ts.map +1 -1
  160. package/dist/components/rating/rating.js +7 -1
  161. package/dist/components/rating/rating.js.map +1 -1
  162. package/dist/components/sankey-chart/sankey-chart.d.ts.map +1 -1
  163. package/dist/components/sankey-chart/sankey-chart.js +2 -2
  164. package/dist/components/sankey-chart/sankey-chart.js.map +1 -1
  165. package/dist/components/select/select.d.ts +13 -0
  166. package/dist/components/select/select.d.ts.map +1 -1
  167. package/dist/components/select/select.js +15 -4
  168. package/dist/components/select/select.js.map +1 -1
  169. package/dist/components/side-nav/side-nav.d.ts.map +1 -1
  170. package/dist/components/side-nav/side-nav.js +8 -2
  171. package/dist/components/side-nav/side-nav.js.map +1 -1
  172. package/dist/components/signature-pad/signature-pad.d.ts +2 -0
  173. package/dist/components/signature-pad/signature-pad.d.ts.map +1 -1
  174. package/dist/components/signature-pad/signature-pad.js +3 -1
  175. package/dist/components/signature-pad/signature-pad.js.map +1 -1
  176. package/dist/components/slider/slider.d.ts.map +1 -1
  177. package/dist/components/slider/slider.js +7 -1
  178. package/dist/components/slider/slider.js.map +1 -1
  179. package/dist/components/tags-input/tags-input.d.ts +2 -0
  180. package/dist/components/tags-input/tags-input.d.ts.map +1 -1
  181. package/dist/components/tags-input/tags-input.js +3 -1
  182. package/dist/components/tags-input/tags-input.js.map +1 -1
  183. package/dist/components/text-field/text-field.d.ts +2 -0
  184. package/dist/components/text-field/text-field.d.ts.map +1 -1
  185. package/dist/components/text-field/text-field.js +3 -1
  186. package/dist/components/text-field/text-field.js.map +1 -1
  187. package/dist/components/time-field/time-field.d.ts +2 -0
  188. package/dist/components/time-field/time-field.d.ts.map +1 -1
  189. package/dist/components/time-field/time-field.js +3 -1
  190. package/dist/components/time-field/time-field.js.map +1 -1
  191. package/dist/components/time-picker/context.js +10 -1
  192. package/dist/components/time-picker/context.js.map +1 -1
  193. package/dist/components/time-picker/time-picker.d.ts +78 -9
  194. package/dist/components/time-picker/time-picker.d.ts.map +1 -1
  195. package/dist/components/time-picker/time-picker.js +91 -9
  196. package/dist/components/time-picker/time-picker.js.map +1 -1
  197. package/dist/components/time-range-picker/time-range-picker.d.ts +2 -0
  198. package/dist/components/time-range-picker/time-range-picker.d.ts.map +1 -1
  199. package/dist/components/time-range-picker/time-range-picker.js +5 -2
  200. package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
  201. package/dist/components/toggle-group/toggle-group.d.ts.map +1 -1
  202. package/dist/components/toggle-group/toggle-group.js +7 -1
  203. package/dist/components/toggle-group/toggle-group.js.map +1 -1
  204. package/dist/components/tooltip/tooltip.js +2 -1
  205. package/dist/components/tooltip/tooltip.js.map +1 -1
  206. package/dist/components/tour/tour.js +12 -3
  207. package/dist/components/tour/tour.js.map +1 -1
  208. package/dist/components/tree/tree.d.ts +2 -2
  209. package/dist/components/tree/tree.js +1 -1
  210. package/dist/components/tree/tree.js.map +1 -1
  211. package/dist/components/tree-select/tree-select.d.ts +2 -0
  212. package/dist/components/tree-select/tree-select.d.ts.map +1 -1
  213. package/dist/components/tree-select/tree-select.js +6 -4
  214. package/dist/components/tree-select/tree-select.js.map +1 -1
  215. package/dist/components/truncate/truncate.d.ts.map +1 -1
  216. package/dist/components/truncate/truncate.js +4 -8
  217. package/dist/components/truncate/truncate.js.map +1 -1
  218. package/dist/index.d.ts +7 -7
  219. package/dist/index.js +8 -8
  220. package/dist/locale.d.ts +2 -0
  221. package/dist/locale.js +2 -0
  222. package/dist/package.js +1 -1
  223. package/dist/runtime/as-child.js +7 -2
  224. package/dist/runtime/as-child.js.map +1 -1
  225. package/dist/runtime/portal.js +13 -1
  226. package/dist/runtime/portal.js.map +1 -1
  227. package/dist/runtime/use-overlay-exit.js +6 -1
  228. package/dist/runtime/use-overlay-exit.js.map +1 -1
  229. package/dist/runtime/with-handlers.js +25 -0
  230. package/dist/runtime/with-handlers.js.map +1 -0
  231. package/dist/services/dialog-service.d.ts +3 -3
  232. package/dist/services/dialog-service.d.ts.map +1 -1
  233. package/dist/services/dialog-service.js +8 -6
  234. package/dist/services/dialog-service.js.map +1 -1
  235. package/dist/services/service-config.js +2 -1
  236. package/dist/services/service-config.js.map +1 -1
  237. package/package.json +19 -15
package/CHANGELOG.md CHANGED
@@ -1,5 +1,153 @@
1
1
  # @xihan-ui/vue
2
2
 
3
+ ## 3.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 9b0a9d8: 新增十种常用语言的内建语言包:`zhCN`(简体中文)、`zhTW`(繁體中文)、`enUS`、`jaJP`、`koKR`、`frFR`、`deDE`、`esES`、`ptBR`、`ruRU`。
8
+
9
+ 语言包放在新的 `locale` 子入口,四个包各一个:`@xihan-ui/headless/locale`、`@xihan-ui/vue/locale`、`@xihan-ui/react/locale`、`@xihan-ui/web-components/locale`,主入口体积不变,各语言是独立的具名导出,只打进用到的那几份。一份语言包就是一份全局配置 `{ locale, translations }`(类型 `XhLocale`),直接交给 `provideXhConfig` / `XhConfigProvider` / `setXhConfig`,日期时间类组件的 `locale` 随之一起切换;还要配别的项时展开合并,个别文案仍可在实例上覆盖。
10
+
11
+ 语言包覆盖组件的每一条文案,含图表摘要、拖拽播报等函数式文案;`enUS` 与其余九份同形,也是组件没配语言包时用的那一份。没有缺省、或缺省取自实例内容的键(作者自写的可见文字与标签、条目自己的名字、`timestamp.justNow`)刻意不收,给了会改变行为。组件新增文案键时,各语言包在类型检查里一并报缺。
12
+
13
+ - bd63fd4: 组件不再自带英文:界面文字一律取语言包,没配语言包时取英文语言包 `enUS`(现为与其余九份同形的完整语言包)。英文输出与此前逐字相同;新门禁 `check-builtin-text` 拦住把英文兜底写回组件或适配器。
14
+
15
+ 原先写死、语言包管不到的文字一并收进 translations,九种语言同步补齐:
16
+
17
+ - Dialog 新增 `ok` / `cancel` / `actionError`:命令式对话框服务(三端 `createDialogService`)的确定、取消钮与动作失败提示。没传 `okText` / `cancelText` / `actionErrorText` 时取服务 `config`(自定义元素侧取宿主所在处的 `setXhConfig`)里的语言包,此前固定为 `OK` / `Cancel` / 英文失败提示。新增导出 `dialogServiceTranslations()`。
18
+ - Form 新增 `translations` 属性,`FormTranslations` 收进校验报错模板(`required`、`type`、`minLength` 等,形状同 `validateMessages`),三端接全局配置。取值顺序:规则的 `message` → `validateMessages` → `translations`(含全局语言包)→ 英文语言包。`runFieldRules` / `runFormRules` 签名不变。
19
+ - Kbd:`keyName` 有了缺省(读屏键名,按平台区分 Option / Alt、Command / Windows),新增 `keyLabel`(键帽字,Mac 用系统符号)。两者第二个参数是平台;`formatHotkey` 新增可选的第三个参数接收这两条,缺省取英文语言包。
20
+ - Citation 新增 `previewLinkSource` / `previewLinkDocument`(预览卡里打开来源的链接字),API 新增 `previewLinkText(item)` 与 `sourceMetaText(source)`;Vue / React 的缺省渲染改用它们,来源副文字里没有媒体类型的文档不再写死 `Document`,改取 `translations.document`。
21
+ - Mention 新增 `empty`(缺省空态文字),API 新增 `emptyText`,Vue / React 的缺省渲染改用它。
22
+
23
+ 带英文缺省的公开常量(`CHART_TRANSLATIONS`、`CARTESIAN_TRANSLATIONS` 等七种图表的文案表、`HEATMAP_LEGEND_TEXT`、`SPINNER_DEFAULT_LABEL`、`DATE_SEGMENT_LABEL`、`DATE_FIELD_CLEAR_LABEL`、`default*Summary` 一类函数)名字与签名不变,值改为取自英文语言包。
24
+
25
+ - 8b8d520: 浮在内容之上的圆钮(Action Control `floating` 档)整体下移一档:sm / md / lg 由 40 / 48 / 56px 改为 32 / 40 / 48px(compact 28 / 36 / 44px),图标 16 / 20 / 24px,缺省 md 即 40px。48px 的钮在矮视口与小卡片里会叠住内容与彼此(走马灯的翻页钮与播放钮、纵向轨道压住正文)。
26
+
27
+ 视觉默认变化:BackTop、FloatButton(含展开列表里的动作项)缺省由 48px 变为 40px,`size="lg"` 由 56px 变为 48px;ImageViewer 翻页钮由 48px 变为 40px、关闭钮由 40px 变为 32px;Carousel 翻页与播放钮为 40px。Log / MessageFeed 的回到底部钮缺省仍是 32px。
28
+
29
+ 新增尺寸档:
30
+
31
+ - Carousel 新增 `size`(sm / md / lg,缺省 md),翻页、播放三颗钮同档。
32
+ - ImageViewer 新增 `size`(sm / md / lg,缺省 md),翻页钮同档,关闭钮比它低一档、最低 sm。
33
+ - Log、MessageFeed 的回到底部钮随组件已有的 `size` 换档:比组件低一档、最低 sm(sm / md 时 32px,lg 时 40px)。
34
+
35
+ 新增的 `size` 与其他组件一样接全局配置,没写时取全局尺寸。
36
+
37
+ - 68b0410: Dialog 与 Drawer 新增 `unmountOnExit`(缺省 true,行为不变:第一次打开才挂载,退场动画播完就卸载)。设为 false 时打开过之后收起只隐藏、不卸载:Vue 与 React 把定位层以内联 `display: none` 收起、遮罩不留、Portal 视觉桥断开,再打开不重挂,内容里的组件状态、输入与滚动位置都留着,反复开合的重内容面板(设置面板、长表单)不再每次付一遍挂载开销。
38
+
39
+ headless 的 Dialog / Drawer connect 多出 `isContentMounted(present)`,与 Collapsible、Accordion 共用同一条挂卸判定;机器 context 多出 `opened`(挂载之后打开过没有)。
40
+
41
+ Web Components 的作者节点一向常驻,行为不变;写进 content 里一个 `<template>` 的内容按同一规则挂卸:第一次打开克隆,缺省退场播完撤走,`unmount-on-exit="false"` 时克隆一次之后常驻。
42
+
43
+ - 5b21815: 四处写死英文的读屏角色说明(`aria-roledescription`)改为可经 `translations` 翻译,缺省仍是原来的英文:
44
+
45
+ - Carousel:`rootRoleDescription`(根,缺省 `carousel`)、`itemRoleDescription`(每一张,缺省 `slide`)。
46
+ - Sortable:`itemDragTriggerRoleDescription`(拖拽手柄,缺省 `sortable`)。
47
+ - Table:`columnDragRoleDescription`(列拖拽把手,缺省 `draggable column`)。
48
+
49
+ 内建语言包同步补齐这四个键,切换语言后读屏不再夹着英文的角色名。
50
+
51
+ - 831acc9: 每个角色节点另带皮肤挂载类 `xh-scope-<组件名>`,与 `data-scope` 一一对应(`data-scope="dialog"` 的节点带 `xh-scope-dialog`)。解剖产出的 attrs 多一项 `class`,Vue 与作者的 class 合并、React 落成 `className` 并与作者的拼接、Web Components 按词增删不覆盖作者写的类;asChild 把部件属性合进自带解剖的子节点时,挂载类随 `data-scope` 一起让位,一个节点不会同时吃两个组件的皮肤。core 新增导出 `SCOPE_CLASS_PREFIX`、`scopeClass()` 与 `stripScopeClass()`。
52
+
53
+ 挂载类是皮肤产物改以类名领头的前提:浏览器按类名给规则分桶,属性选择器只按属性名分桶,几千条以 `[data-scope=…]` 领头的皮肤规则挤在同一个桶里,每个组件节点每次样式重算都要逐条试一遍。`data-scope` / `data-part` 仍是公开的样式契约,作者的覆盖写法不变。节点的 class 属性因此多了一个词:对 DOM 做快照或精确比对 `className` 的测试需要随之更新。只用 `@xihan-ui/styles`、自己书写标记的页面,要给每个带 `data-scope="x"` 的节点补上 `class="xh-scope-x"`,否则皮肤不命中。
54
+
55
+ - ecd3fcf: Select 新增 `lazyMount`(缺省 false,行为不变):列表内容第一次展开时才挂载,之后常驻、来回开合不重建。页面上 Select 很多时,收起态每个实例都背着一整份条目,挂载开销大半在这里——300 个各带 20 个条目、传了 `collection` 的 Select 挂载由约 530ms 降到约 183ms。打开前的选中文字与收起态连打(焦点在触发器上直接打字选中)改按 `collection` 计算;没给 `collection` 时打开前选中文字退回值本身、连打不生效。headless 的 connect 新增 `isContentMounted()`,机器 context 记 `opened`。Web Components 里把条目写进 list 里的一个 `<template>`,第一次展开才克隆(未开 lazy-mount 时模板也照常克隆进来)。
56
+
57
+ 自绘滚动条在 `disabled` 时容器暂缺不再报「找不到滚动容器」诊断:列表懒挂载、还没展开过时轴先禁用着。
58
+
59
+ ### Patch Changes
60
+
61
+ - b986a55: 图表(CartesianChart、PieChart、FunnelChart、RadarChart、GraphChart、HierarchyChart、SankeyChart)在根末尾追加的视觉隐藏数据表不再撑出祖先的滚动条。此前 1px 的隐藏样式直接写在 `<table>` 上,而表格的 `block-size` 只当最小高度、`overflow` 对表格不生效,表格照样有几十行那么高,绝对定位的盒子算进祖先的可滚动溢出,图表放进 `overflow: auto` 的容器(卡片、面板、对话框正文)就多出一截空滚动。新增部件 `table-region`(`getTableRegionProps()`):块级、1px、裁掉,视觉隐藏落在它上面,表格放在里面照常排版,读屏读到的数据表不变;`table` 部件不再带隐藏样式。三个适配器同步改为「摘要 + 区域(内含表格)」。
62
+ - dfdbf5e: 两处缺省取自实例数据的文案改为实例内容优先,全局配置里的 `translations`(包括内建语言包)不再盖掉它们:
63
+
64
+ - CartesianChart 数据表的列名先取轴标题:x 轴写了 `title` 时首列就叫这个名字,`translations.keyLabel` 只在轴没有标题时使用;含散点时的数值列同理,先取 y 轴标题,再用 `translations.valueLabel`。此前 `keyLabel` / `valueLabel` 一旦给出就压过轴标题,全局注入一份中文「类别」会把作者写的「月份」换掉。
65
+ - Heatmap 发散色阶的对照条两端恒写数值(中点减去 / 加上两侧最远距离),`translations.legendLow` / `legendHigh` 只换顺序色阶两端的词。此前两者给出时发散色阶两端也被换成「少 / 多」,读不出哪端是负。需要在发散色阶两端写别的字时,改写 `legend-label` 部件的内容。
66
+
67
+ - e0bf1ee: HierarchyChart 的绘图区补上读屏角色说明(`aria-roledescription`),取 `translations.chartRoleDescription`,与其余六种图表一致。绘图区是 `role="tree"`、按方向键展开收起,缺省说法因此用 `tree chart`(各语言包同为「树状图表」一类保留「树」字的说法),不用笼统的 `chart`,读屏才不会把树的操作提示盖掉。
68
+ - 581ba6f: Portal 视觉桥只在浮层呈现期间存在。此前每个浮层定位层一挂载就建桥:在来源整条祖先链上挂观察、建时把候选自定义属性读一遍,页面上几十个关着的提示与下拉白付这笔账,含几十个提示的面板一打开就多出数万次计算样式读取;缓存页一进一出,页内每台桥还要各重算两遍。现在 Vue 与 React 的内部 `XhPortal` 多一个 `present`(缺省为真,常显与展开才渲染的落点不变),带退场闸门的浮层(Tooltip、Popover、HoverCard、Popconfirm、Menu、ContextMenu、Select、Combobox、Cascader、TreeSelect、Mention、ColorPicker、DatePicker、DateRangePicker、TimePicker、TimeRangePicker、FloatingPanel、Pagination、Tour)把可见与否交给它:关着时不建桥,转为呈现时在内容露出、定位引擎第一次量尺寸之前建桥,退场播完后撤掉。Web Components 不经视觉桥,不受影响。
69
+ - bdd28ca: 菜单栏、侧栏与引用悬停卡的浮层也只在呈现期间建 Portal 视觉桥。这几个部件的定位层随组件常驻——菜单栏每一项一个、折叠侧栏每个分支一个弹出面板外加一个名称提示、正文里每处 hover 档引用一个——此前一挂载就各建一台桥,在来源整条祖先链上挂观察、建时读一遍计算样式。现在 `XhMenubarPositioner` 跟着这张菜单的退场闸门(由 `XhMenubarContent` 写回)、`XhSideNavBranchContent` 的弹出面板与 `XhSideNavTooltip` 跟着各自的退场闸门、`XhCitationPositioner` 跟着卡片是否渲染(展开中或退场未播完)决定建不建桥:关着不建,展开时在内容露出前建,退场播完后撤掉。Web Components 不经视觉桥,不受影响。
70
+ - Updated dependencies [9b0a9d8]
71
+ - Updated dependencies [bd63fd4]
72
+ - Updated dependencies [b986a55]
73
+ - Updated dependencies [dfdbf5e]
74
+ - Updated dependencies [8b8d520]
75
+ - Updated dependencies [e0bf1ee]
76
+ - Updated dependencies [a566f82]
77
+ - Updated dependencies [3f54a40]
78
+ - Updated dependencies [68b0410]
79
+ - Updated dependencies [b33ae37]
80
+ - Updated dependencies [5b21815]
81
+ - Updated dependencies [831acc9]
82
+ - Updated dependencies [b991ede]
83
+ - Updated dependencies [ecd3fcf]
84
+ - Updated dependencies [736fc04]
85
+ - @xihan-ui/headless@3.2.0
86
+ - @xihan-ui/core@3.2.0
87
+ - @xihan-ui/motion@3.2.0
88
+ - @xihan-ui/position@3.2.0
89
+ - @xihan-ui/pointer@3.2.0
90
+ - @xihan-ui/viz@3.2.0
91
+
92
+ ## 3.1.0
93
+
94
+ ### Minor Changes
95
+
96
+ - 525029a: 带清空钮的 15 个组件统一新增清空事件:TextField、ColorField、Select、Combobox、Cascader、TreeSelect、TagsInput、DateField、DatePicker、DateRangePicker、TimeField、TimePicker、TimeRangePicker、FileUpload、SignaturePad。用户按清空钮(`clear-trigger`)清掉了值时,先发值变化、再发清空:headless 为 `onClear`,Vue 为 `@clear`,React 为 `onClear`,Web Components 派发 `clear` 事件。程序化的 `clear()` 与 Escape 清空不发,列表或画板本来就空时按清空钮是空操作,也不发。此前只能从值变为空推断清空,分不出是按了清空钮还是删光了字。
97
+ - b96f8ac: ColorPicker 的值改为恒为颜色串数组,并支持多选。
98
+
99
+ - **破坏**:`onValueChange` / `value-change` 的 `value`、Vue `update:value`、`api.value` 由字符串改为 `string[]`:单选恒为一项;`setValue` 接收数组。宿主写入的 `value` / `defaultValue` 仍可写裸串,按一项处理。工作色(触发钮色块与值文字显示的那个)改由新增的 `api.color` 读出。迁移:读值处取 `value[0]`,写值处包一层数组。
100
+ - 新增 `selectionMode="multiple"`:浮层里调出的工作色是草稿,按新部件 `confirm-trigger`(`XhColorPickerConfirmTrigger`,文字由作者写)收进值,浮层不收;预设色板点一下切换选中;`maxSelected` 限制个数;同一个颜色按颜色比较只收一份。
101
+ - 多选的选中值在输入行里排成标签:新增 `tag-list` 部件与 `XhColorPickerTagList` / `XhColorPickerTag` / `XhColorPickerTagLabel` / `XhColorPickerOverflowTag` / `XhColorPickerItemDeleteTrigger`,与 Select 多选同一套库内标签,每枚前一个该颜色的色点;值文字收起,触发钮只留色块并成为键盘入口(退格摘掉最后一个);标签不截短、放不下折行,超过 `maxTagCount`(默认 3)折进 +N;`translations` 新增 `deleteItem` / `overflowTag`;表单一个选中值一份同名隐藏输入。
102
+
103
+ - 570af4d: DatePicker 多选(`selectionMode="multiple"`)的选中值在输入行里排成标签:新增 `tag-list` 部件与 `XhDatePickerTagList` / `XhDatePickerTag` / `XhDatePickerTagLabel` / `XhDatePickerOverflowTag` / `XhDatePickerItemDeleteTrigger`(Vue / React 的标签行不写子节点即按 `tags` 铺好;Web Components 按 `tags` 渲染 `tag` 节点),与 Select 多选同一套库内标签。段位在多选时收起,日历钮常驻并成为键盘入口:退格摘掉最后一个、点标签上的叉摘掉那一个;超过新增的 `maxTagCount`(默认 3)的折进 +N,`translations` 新增 `deleteItem` / `overflowTag`;没有选中时整条 `placeholder` 落在标签行上;表单一个选中值一份同名隐藏输入(`field.getHiddenInputProps({ value })`)。此前多选时输入行只显示、只编辑第一个日期,隐藏输入也只提交第一个。
104
+ - 9ba6c54: DateField / DatePicker 的 `placeholder` 接受字符串:一段都没填、焦点也不在段上时,输入行显示这句整条占位(「请选择生效时间」),段位与分隔符淡出让位,焦点一进到段上就换回 yyyy / mm / dd 段位;给对象仍是逐段的占位串。DatePicker 此前不转发 `placeholder`,现在两种写法都转给内嵌的分段输入。DateRangePicker 新增 `startPlaceholder` / `endPlaceholder`(两组各自的整条占位)与两端共用的逐段 `placeholder`。整条占位以段位组上的 `data-placeholder-shown` 与 `data-placeholder-text` 表出,由皮肤用生成内容画,前景走新增的 `--xh-date-picker-placeholder-fg` / `--xh-date-range-picker-placeholder-fg`(DateField 沿用 `--xh-date-field-placeholder-fg`);headless 新导出类型 `DateSegmentPlaceholders`。
105
+ - c8b910e: 新增字段边界 `XhFieldBoundary`(Web Components 为 `display: contents` 的 `<xh-field-boundary>`):子树里的库内控件不再继承外层字段的标签、说明、禁用 / 只读 / 必填 / 无效与控件 id,表单字段组也一并断开。组合控件把内嵌的搜索框、筛选框包进来,它们就不会被读成外层字段的名字,两个封装同处一个字段时也不会拿到同一个 id。Vue / React 的浮层内容经 Portal 搬到落点后自动断开,与 Web Components 物理搬迁后的行为一致;Vue 另导出 `clearFieldContext()` 供组合式封装在 setup 里断开。
106
+ - f195f2d: 组类控件直接放进表单字段(不经 `XhFieldControl`)也接上字段的标题与说明:单选组、复选框组、色板选择、切换按钮组、评分、滑块、分格输入把字段的标题并进焦点宿主的名字链(组根、星组或拇指),说明与错误文案进描述链,读屏进组时一起念出;校验、必填与只读仍按字段状态由组件自己投影(`role=group` 不接受 `aria-invalid` / `aria-required`)。新增 `useFieldGroupWiring` 供组类封装只取字段的描述链。
107
+ - df5d988: FloatButton 支持拖动与贴边:`draggable`(Web Components 为 `button-draggable`,避开 HTML 全局属性 `draggable`)打开后可按住触发器拖到别处,移动过激活距离才跟手,起拖时展开的动作组先收起、拖完补派的点击不开合;松手按 `snap` 贴边(`inline` 缺省贴左右两边里近的那条、`block` 贴上下、`nearest` 贴四边里最近的、`none` 停在放手处),甩一下贴到甩去的那一边,弹簧带着松手速度落定。新增 `position` / `defaultPosition` / `onPositionChange`(Vue `v-model:position`、Web Components `position-change` 事件):贴边位置写 `{ edge, ratio }`,按比例记、换个视口尺寸照样贴在同一侧,停在一点写像素坐标 `{ x, y }`;不给时仍停在 `placement` 那一角。展开组恒朝页面中间长。
108
+ - 90ead40: Menu、ContextMenu、Menubar 的数据驱动支持多级:节点写 `children`(一组菜单条目)即为子菜单入口,Vue / React 的默认树按 `children` 递归铺出下一层,深度不限,叶子的选中经菜单树汇到根上;Menubar 在条目上读 `children`。入口只能是普通条目,勾选与单选条目带 `children` 直接报错。此前 `MenuNode` 没有 `children`,用数据描述菜单最多两级,路由菜单这类深度不定的场景只能手写 `Sub` 部件。Vue 的 `XhContextMenuSub`(与 React 对齐)与两端的 `XhMenubarSub` 新增 `collection`,供子层取显示文本与禁用。Web Components 由作者写 Light DOM,不读这一项。
109
+ - 97fce6f: TimePicker 的值改为恒为 ISO 时间串数组,并支持多选。
110
+
111
+ - **破坏**:`onValueChange` / `value-change` 的 `value`、Vue `update:value`、`api.value` 由字符串改为 `string[]`:单选至多一项,还没填全时为空数组(此前是空串);`setValue` 接收数组。宿主写入的 `value` / `defaultValue` 仍可写裸串,按一项处理。迁移:读值处取 `value[0] ?? ''`,写值处包一层数组。
112
+ - 新增 `selectionMode="multiple"`:各列拼出的是草稿,按新部件 `confirm-trigger`(`XhTimePickerConfirmTrigger`,文字由作者写)收进值,浮层不收;快捷选项点一下切换选中;`maxSelected` 限制个数。
113
+ - 多选的选中值在输入行里排成标签:新增 `tag-list` 部件与 `XhTimePickerTagList` / `XhTimePickerTag` / `XhTimePickerTagLabel` / `XhTimePickerOverflowTag` / `XhTimePickerItemDeleteTrigger`,与 Select 多选同一套库内标签;段位收起,展开钮常驻并成为键盘入口(退格摘掉最后一个);标签不截短、放不下折行,超过 `maxTagCount`(默认 3)折进 +N;`translations` 新增 `deleteItem` / `overflowTag`;表单一个选中值一份同名隐藏输入。
114
+ - `segment` 不再列为必备部件(`meta.requiredParts` 去掉一条,属放宽):多选时段位收起,Web Components 作者在多选里不写段不再报 `wc.missing-part`,与 DatePicker 同。
115
+
116
+ ### Patch Changes
117
+
118
+ - dbcf03e: CheckboxGroup 与 ColorSwatchPicker 的根只在 `label` 部件真渲染了时才输出 `aria-labelledby`(新增由适配器统计的 `labelled`),不再指向不存在的节点;复选框组没有标题时全选格只念自己的文本,色板选择没有标题时名字交给 `translations.group`。Vue / React 的 `label` 属性在手写选项时同样铺出标题。
119
+ - 44461b4: Popconfirm 补上文档已列出的 `disabled` 与 `dir`:三端根组件声明并转给 popover 状态机,`disabled` 时触发器转原生 `disabled` 并带 `data-disabled`、点按不展开、展开途中转为禁用即收起;`dir` 写在定位层上,浮层搬到落点后仍按作者给的方向排布。此前这两个属性写上后落到根节点上不起作用。
120
+ - 5012c46: RadioGroup 的方向键只接落在条目或根节点自身上的按键,并跳过内层已 `preventDefault` 的事件:组里摆着的数字框、下拉等行内编辑控件,方向键照常移光标、换值,不再被当成切换选项。
121
+
122
+ 根节点只在 `label` 部件真渲染了时才输出 `aria-labelledby`(新增由适配器统计的 `labelled`),不再指向不存在的节点;Vue / React 的 `label` 属性在手写选项时同样铺出标题,与文档「提供后不必再写 label 部件」一致。
123
+
124
+ - f03b64d: `XhTruncate` 上作者写的属性改为与连接层逐条合并:`style` 与行数 `--xh-_truncate-lines` 并存,`class` 与监听器一并合上,同名的其余属性以作者的为准,与 React 一致。此前组件把连接层的属性平铺在作者的之后,作者写的 `style`(如 `max-inline-size: 20rem`)整个被盖掉。
125
+ - Updated dependencies [fc9c306]
126
+ - Updated dependencies [dbcf03e]
127
+ - Updated dependencies [525029a]
128
+ - Updated dependencies [b96f8ac]
129
+ - Updated dependencies [570af4d]
130
+ - Updated dependencies [9ba6c54]
131
+ - Updated dependencies [ecccb6b]
132
+ - Updated dependencies [d960188]
133
+ - Updated dependencies [df5d988]
134
+ - Updated dependencies [ba0fcdb]
135
+ - Updated dependencies [999d7b9]
136
+ - Updated dependencies [90ead40]
137
+ - Updated dependencies [44461b4]
138
+ - Updated dependencies [5012c46]
139
+ - Updated dependencies [cf0da15]
140
+ - Updated dependencies [113c99b]
141
+ - Updated dependencies [97fce6f]
142
+ - Updated dependencies [6d2c38c]
143
+ - Updated dependencies [cf84bc9]
144
+ - @xihan-ui/core@3.1.0
145
+ - @xihan-ui/headless@3.1.0
146
+ - @xihan-ui/motion@3.1.0
147
+ - @xihan-ui/position@3.1.0
148
+ - @xihan-ui/pointer@3.1.0
149
+ - @xihan-ui/viz@3.1.0
150
+
3
151
  ## 3.0.0
4
152
 
5
153
  ### Major Changes
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @xihan-ui/vue
2
2
 
3
- Vue 3 适配器:140 个组件的 Vue 形态,外加对应的 composables。行为全部来自 `@xihan-ui/headless`,这一层只负责把它接到 Vue 的响应式与渲染上。
3
+ Vue 适配器:全部组件的 Vue 形态,外加对应的 composables。行为全部来自 `@xihan-ui/headless`,这一层只负责把它接到 Vue 的响应式与渲染上。
4
4
 
5
5
  **谁会装它**:在 Vue 里用这套组件的人装它。样式另装 `@xihan-ui/styles`,或者自己写。
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { PayloadOf } from "../../runtime/payload.js";
2
2
  import { PropType, SlotsType, VNode } from "vue";
3
- import { Direction, Orientation } from "@xihan-ui/core";
3
+ import { Direction, Orientation, Size } from "@xihan-ui/core";
4
4
  import { CarouselApi, CarouselEffect, CarouselSchema, CarouselTranslations } from "@xihan-ui/headless";
5
5
  //#region src/components/carousel/carousel.d.ts
6
6
  type CarouselProps = CarouselSchema['props'];
@@ -46,6 +46,9 @@ declare const XhCarouselRoot: import("vue").DefineComponent<import("vue").Extrac
46
46
  effect: {
47
47
  type: PropType<CarouselEffect>;
48
48
  };
49
+ size: {
50
+ type: PropType<Size>;
51
+ };
49
52
  translations: {
50
53
  type: PropType<Partial<CarouselTranslations>>;
51
54
  };
@@ -94,6 +97,9 @@ declare const XhCarouselRoot: import("vue").DefineComponent<import("vue").Extrac
94
97
  effect: {
95
98
  type: PropType<CarouselEffect>;
96
99
  };
100
+ size: {
101
+ type: PropType<Size>;
102
+ };
97
103
  translations: {
98
104
  type: PropType<Partial<CarouselTranslations>>;
99
105
  };
@@ -1 +1 @@
1
- {"version":3,"file":"carousel.d.ts","names":[],"sources":["../../../src/components/carousel/carousel.ts"],"mappings":";;;;;KAgBK,gBAAgB;;KAGT,wBAAwB,KAClC;cAqBW,8BAAc,8BAAA;;;;;;;;;;;;;;;;;IASQ,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;IAGO,MAAA;;;;;;;;;;;IAGb,MAAA,SAAS;;;IACH,MAAA,SAAS,QAAQ;;;;;EAIvB,gBAAA,UAAA,UAAU;EACb,gBAAA,OAAA,UAAU;;;;;;;;;;;;;;;;;;IAbF,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;IAGO,MAAA;;;;;;;;;;;IAGb,MAAA,SAAS;;;IACH,MAAA,SAAS,QAAQ;;;;;;;;;;EAQvC,WAAC,OAAO,0BAA0B;kCA8B9C;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAMzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8BAAc,8BAAA;;IAIY,MAAA;;;;;;;IAAA,MAAA;;;MAUrC,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAMhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAMhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;;;;;;cAQW,yCAAyB,0BAAA,oBAAA,4BAAA;;;EAGxB,WAAC;IAAS;QAAuB;kCAU7C;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,8BAAA;;IAIO,MAAA;;;;;;;IAAA,MAAA;;;MAUrC,oDAAA"}
1
+ {"version":3,"file":"carousel.d.ts","names":[],"sources":["../../../src/components/carousel/carousel.ts"],"mappings":";;;;;KAgBK,gBAAgB;;KAGT,wBAAwB,KAClC;cAqBW,8BAAc,8BAAA;;;;;;;;;;;;;;;;;IASQ,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;IAGO,MAAA;;;;;;;;;;;IAGb,MAAA,SAAS;;;IACX,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;EAIvB,gBAAA,UAAA,UAAU;EACb,gBAAA,OAAA,UAAU;;;;;;;;;;;;;;;;;;IAdF,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;IAGO,MAAA;;;;;;;;;;;IAGb,MAAA,SAAS;;;IACX,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;;;;;;EAQvC,WAAC,OAAO,0BAA0B;kCA8B9C;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAMzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8BAAc,8BAAA;;IAIY,MAAA;;;;;;;IAAA,MAAA;;;MAUrC,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAMhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAMhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;;;;;;cAQW,yCAAyB,0BAAA,oBAAA,4BAAA;;;EAGxB,WAAC;IAAS;QAAuB;kCAU7C;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,8BAAA;;IAIO,MAAA;;;;;;;IAAA,MAAA;;;MAUrC,oDAAA"}
@@ -27,6 +27,7 @@ const XhCarouselRoot = defineComponent({
27
27
  },
28
28
  spacing: { type: String },
29
29
  effect: { type: String },
30
+ size: { type: String },
30
31
  translations: { type: Object }
31
32
  },
32
33
  emits: {
@@ -1 +1 @@
1
- {"version":3,"file":"carousel.js","names":[],"sources":["../../../src/components/carousel/carousel.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 carousel 相关实现。\n\nimport type { Direction, Orientation } from '@xihan-ui/core'\nimport type { CarouselApi, CarouselEffect, CarouselSchema, CarouselTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideCarousel, useCarouselContext } from './context'\nimport { useCarousel } from './use-carousel'\n\ntype CarouselProps = CarouselSchema['props']\n\n/** 默认插槽的载荷:当前页与翻页区间、自动播放与拖拽状态,以及翻页、播放的命令。 */\nexport type CarouselRootSlotProps = Pick<\n CarouselApi,\n | 'page'\n | 'totalPages'\n | 'slideCount'\n | 'slideRange'\n | 'pageSnapPoints'\n | 'canScrollPrev'\n | 'canScrollNext'\n | 'autoplaying'\n | 'paused'\n | 'autoplayStopped'\n | 'dragging'\n | 'isInView'\n | 'setPage'\n | 'goToPrev'\n | 'goToNext'\n | 'play'\n | 'pause'\n | 'resume'\n>\n\nexport const XhCarouselRoot = defineComponent({\n name: 'XhCarouselRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n page: { type: Number },\n defaultPage: { type: Number },\n slideCount: { type: Number },\n slidesPerPage: { type: Number },\n slidesPerMove: { type: Number },\n orientation: { type: String as PropType<Orientation> },\n dir: { type: String as PropType<Direction> },\n loop: { type: Boolean, default: undefined },\n // 布尔或毫秒:true 用默认间隔,数值即间隔\n autoplay: { type: [Boolean, Number] as PropType<boolean | number>, default: undefined },\n allowPointerDrag: { type: Boolean, default: undefined },\n spacing: { type: String },\n effect: { type: String as PropType<CarouselEffect> },\n translations: { type: Object as PropType<Partial<CarouselTranslations>> },\n },\n // page-change 携带 { page },update:page 携带裸页码\n emits: {\n 'page-change': (_details: PayloadOf<CarouselProps, 'onPageChange'>) => true,\n 'update:page': (_page: PayloadOf<CarouselProps, 'onPageChange'>['page']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CarouselRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: CarouselProps['onPageChange'] = (details) => {\n emit('page-change', details)\n emit('update:page', details.page)\n }\n const ctx = useCarousel(withXhConfig('carousel', props) as CarouselProps, notify)\n provideCarousel(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n page: ctx.api.value.page,\n totalPages: ctx.api.value.totalPages,\n slideCount: ctx.api.value.slideCount,\n slideRange: ctx.api.value.slideRange,\n pageSnapPoints: ctx.api.value.pageSnapPoints,\n canScrollPrev: ctx.api.value.canScrollPrev,\n canScrollNext: ctx.api.value.canScrollNext,\n autoplaying: ctx.api.value.autoplaying,\n paused: ctx.api.value.paused,\n autoplayStopped: ctx.api.value.autoplayStopped,\n dragging: ctx.api.value.dragging,\n isInView: ctx.api.value.isInView,\n setPage: ctx.api.value.setPage,\n goToPrev: ctx.api.value.goToPrev,\n goToNext: ctx.api.value.goToNext,\n play: ctx.api.value.play,\n pause: ctx.api.value.pause,\n resume: ctx.api.value.resume,\n }))\n },\n})\n\nexport const XhCarouselViewport = defineComponent({\n name: 'XhCarouselViewport',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('div', ctx.api.value.getViewportProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCarouselList = defineComponent({\n name: 'XhCarouselList',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('div', ctx.api.value.getListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCarouselItem = defineComponent({\n name: 'XhCarouselItem',\n props: {\n // 下标由作者声明,兼收字符串以支持模板里写 index=\"0\"\n index: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCarouselContext()\n return () => h(\n 'div',\n ctx.api.value.getItemProps({ index: Number(props.index) }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhCarouselPrevTrigger = defineComponent({\n name: 'XhCarouselPrevTrigger',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('button', ctx.api.value.getPrevTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCarouselNextTrigger = defineComponent({\n name: 'XhCarouselNextTrigger',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('button', ctx.api.value.getNextTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 播放 / 暂停开关。开启 autoplay 后应当渲染它:\n * 自动翻页必须有一处能够停止,且停止之后不会被其他交互重新启动。\n *\n * 插槽得到的 `stopped` 是用户是否已按下停止,不含悬停与焦点两路的临时暂停。\n */\nexport const XhCarouselAutoplayTrigger = defineComponent({\n name: 'XhCarouselAutoplayTrigger',\n slots: Object as SlotsType<{\n default?: (props: { stopped: boolean }) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h(\n 'button',\n ctx.api.value.getAutoplayTriggerProps() as Record<string, unknown>,\n slots.default?.({ stopped: ctx.api.value.autoplayStopped }),\n )\n },\n})\n\nexport const XhCarouselIndicatorGroup = defineComponent({\n name: 'XhCarouselIndicatorGroup',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('div', ctx.api.value.getIndicatorGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCarouselIndicator = defineComponent({\n name: 'XhCarouselIndicator',\n props: {\n // 指示点对应的页码,0 基;兼收字符串\n index: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCarouselContext()\n return () => h(\n 'button',\n ctx.api.value.getIndicatorProps({ index: Number(props.index) }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"carousel.js","names":[],"sources":["../../../src/components/carousel/carousel.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 carousel 相关实现。\n\nimport type { Direction, Orientation, Size } from '@xihan-ui/core'\nimport type { CarouselApi, CarouselEffect, CarouselSchema, CarouselTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideCarousel, useCarouselContext } from './context'\nimport { useCarousel } from './use-carousel'\n\ntype CarouselProps = CarouselSchema['props']\n\n/** 默认插槽的载荷:当前页与翻页区间、自动播放与拖拽状态,以及翻页、播放的命令。 */\nexport type CarouselRootSlotProps = Pick<\n CarouselApi,\n | 'page'\n | 'totalPages'\n | 'slideCount'\n | 'slideRange'\n | 'pageSnapPoints'\n | 'canScrollPrev'\n | 'canScrollNext'\n | 'autoplaying'\n | 'paused'\n | 'autoplayStopped'\n | 'dragging'\n | 'isInView'\n | 'setPage'\n | 'goToPrev'\n | 'goToNext'\n | 'play'\n | 'pause'\n | 'resume'\n>\n\nexport const XhCarouselRoot = defineComponent({\n name: 'XhCarouselRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n page: { type: Number },\n defaultPage: { type: Number },\n slideCount: { type: Number },\n slidesPerPage: { type: Number },\n slidesPerMove: { type: Number },\n orientation: { type: String as PropType<Orientation> },\n dir: { type: String as PropType<Direction> },\n loop: { type: Boolean, default: undefined },\n // 布尔或毫秒:true 用默认间隔,数值即间隔\n autoplay: { type: [Boolean, Number] as PropType<boolean | number>, default: undefined },\n allowPointerDrag: { type: Boolean, default: undefined },\n spacing: { type: String },\n effect: { type: String as PropType<CarouselEffect> },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<Partial<CarouselTranslations>> },\n },\n // page-change 携带 { page },update:page 携带裸页码\n emits: {\n 'page-change': (_details: PayloadOf<CarouselProps, 'onPageChange'>) => true,\n 'update:page': (_page: PayloadOf<CarouselProps, 'onPageChange'>['page']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CarouselRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: CarouselProps['onPageChange'] = (details) => {\n emit('page-change', details)\n emit('update:page', details.page)\n }\n const ctx = useCarousel(withXhConfig('carousel', props) as CarouselProps, notify)\n provideCarousel(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n page: ctx.api.value.page,\n totalPages: ctx.api.value.totalPages,\n slideCount: ctx.api.value.slideCount,\n slideRange: ctx.api.value.slideRange,\n pageSnapPoints: ctx.api.value.pageSnapPoints,\n canScrollPrev: ctx.api.value.canScrollPrev,\n canScrollNext: ctx.api.value.canScrollNext,\n autoplaying: ctx.api.value.autoplaying,\n paused: ctx.api.value.paused,\n autoplayStopped: ctx.api.value.autoplayStopped,\n dragging: ctx.api.value.dragging,\n isInView: ctx.api.value.isInView,\n setPage: ctx.api.value.setPage,\n goToPrev: ctx.api.value.goToPrev,\n goToNext: ctx.api.value.goToNext,\n play: ctx.api.value.play,\n pause: ctx.api.value.pause,\n resume: ctx.api.value.resume,\n }))\n },\n})\n\nexport const XhCarouselViewport = defineComponent({\n name: 'XhCarouselViewport',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('div', ctx.api.value.getViewportProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCarouselList = defineComponent({\n name: 'XhCarouselList',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('div', ctx.api.value.getListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCarouselItem = defineComponent({\n name: 'XhCarouselItem',\n props: {\n // 下标由作者声明,兼收字符串以支持模板里写 index=\"0\"\n index: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCarouselContext()\n return () => h(\n 'div',\n ctx.api.value.getItemProps({ index: Number(props.index) }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhCarouselPrevTrigger = defineComponent({\n name: 'XhCarouselPrevTrigger',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('button', ctx.api.value.getPrevTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCarouselNextTrigger = defineComponent({\n name: 'XhCarouselNextTrigger',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('button', ctx.api.value.getNextTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 播放 / 暂停开关。开启 autoplay 后应当渲染它:\n * 自动翻页必须有一处能够停止,且停止之后不会被其他交互重新启动。\n *\n * 插槽得到的 `stopped` 是用户是否已按下停止,不含悬停与焦点两路的临时暂停。\n */\nexport const XhCarouselAutoplayTrigger = defineComponent({\n name: 'XhCarouselAutoplayTrigger',\n slots: Object as SlotsType<{\n default?: (props: { stopped: boolean }) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h(\n 'button',\n ctx.api.value.getAutoplayTriggerProps() as Record<string, unknown>,\n slots.default?.({ stopped: ctx.api.value.autoplayStopped }),\n )\n },\n})\n\nexport const XhCarouselIndicatorGroup = defineComponent({\n name: 'XhCarouselIndicatorGroup',\n setup(_, { slots }) {\n const ctx = useCarouselContext()\n return () => h('div', ctx.api.value.getIndicatorGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCarouselIndicator = defineComponent({\n name: 'XhCarouselIndicator',\n props: {\n // 指示点对应的页码,0 基;兼收字符串\n index: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCarouselContext()\n return () => h(\n 'button',\n ctx.api.value.getIndicatorProps({ index: Number(props.index) }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cartesian-chart.d.ts","names":[],"sources":["../../../src/components/cartesian-chart/cartesian-chart.ts"],"mappings":";;;;KAqCK,sBAAsB;;KAGf,8BAA8B,KAAK;;UAG9B;EACf,QAAQ;EACR,SAAS;;;cAuDE,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAgBW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAgBjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BASnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;;;;;cAOW,oCAAoB,0BAAA,oBAAA,4BAAA;;gCAmB/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,0CAA0B,0BAAA,oBAAA,4BAAA;;8BAmBrC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,uCAAuB,0BAAA,oBAAA,4BAAA;;;EAGtB,WAAC,OAAO,mCAAmC;kCAWvD;;cAGW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAMhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,8BAAA;;IAII,MAAA,kBAAkB,aAAa;;;IACvC,MAAA,kBAAkB;;;IAClB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACH,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACV,MAAA,SAAS;;;;;;;IAEJ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACN,MAAA,kBAAkB;;;IACxB,MAAA,SAAS;;;IACP,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;IAGjB,MAAA,SAAS;;;IACA,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACnB,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;EAId,yBAAA,UAAA,UAAU;EACZ,wBAAA,SAAA,UAAU;EACX,sBAAA,UAAA,UAAU;EACf,qBAAA,MAAA,UAAU;EACT,kBAAA,UAAA,UAAU;EACX,kBAAA,SAAA,UAAU;EACT,kBAAA,UAAA,UAAU;EACX,kBAAA,SAAA,UAAU;EACA,2BAAA,UAAA,UAAU;EACT,0BAAA,YAAA,UAAU;EACrB,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;;;IAxCH,MAAA,kBAAkB,aAAa;;;IACvC,MAAA,kBAAkB;;;IAClB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACH,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACV,MAAA,SAAS;;;;;;;IAEJ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACN,MAAA,kBAAkB;;;IACxB,MAAA,SAAS;;;IACP,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;IAGjB,MAAA,SAAS;;;IACA,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACnB,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;;;;;;EAmBvC,WAAC,OAAO,gCAAgC;;EAExC,gBAAM;;EAEN,WAAC,OAAO,mCAAmC;;EAE7C,cAAM;kCA2DhB"}
1
+ {"version":3,"file":"cartesian-chart.d.ts","names":[],"sources":["../../../src/components/cartesian-chart/cartesian-chart.ts"],"mappings":";;;;KAqCK,sBAAsB;;KAGf,8BAA8B,KAAK;;UAG9B;EACf,QAAQ;EACR,SAAS;;;cA0DE,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAgBW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAgBjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BASnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;;;;;cAOW,oCAAoB,0BAAA,oBAAA,4BAAA;;gCAmB/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,0CAA0B,0BAAA,oBAAA,4BAAA;;8BAmBrC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,uCAAuB,0BAAA,oBAAA,4BAAA;;;EAGtB,WAAC,OAAO,mCAAmC;kCAWvD;;cAGW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAMhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,8BAAA;;IAII,MAAA,kBAAkB,aAAa;;;IACvC,MAAA,kBAAkB;;;IAClB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACH,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACV,MAAA,SAAS;;;;;;;IAEJ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACN,MAAA,kBAAkB;;;IACxB,MAAA,SAAS;;;IACP,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;IAGjB,MAAA,SAAS;;;IACA,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACnB,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;EAId,yBAAA,UAAA,UAAU;EACZ,wBAAA,SAAA,UAAU;EACX,sBAAA,UAAA,UAAU;EACf,qBAAA,MAAA,UAAU;EACT,kBAAA,UAAA,UAAU;EACX,kBAAA,SAAA,UAAU;EACT,kBAAA,UAAA,UAAU;EACX,kBAAA,SAAA,UAAU;EACA,2BAAA,UAAA,UAAU;EACT,0BAAA,YAAA,UAAU;EACrB,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;;;IAxCH,MAAA,kBAAkB,aAAa;;;IACvC,MAAA,kBAAkB;;;IAClB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACH,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACV,MAAA,SAAS;;;;;;;IAEJ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACN,MAAA,kBAAkB;;;IACxB,MAAA,SAAS;;;IACP,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;IAGjB,MAAA,SAAS;;;IACA,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACnB,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;;;;;;EAmBvC,WAAC,OAAO,gCAAgC;;EAExC,gBAAM;;EAEN,WAAC,OAAO,mCAAmC;;EAE7C,cAAM;kCA2DhB"}
@@ -39,7 +39,7 @@ function renderTooltipContent(api) {
39
39
  /** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */
40
40
  function renderA11y(api) {
41
41
  const { columns, rows } = api.table;
42
- return [h("p", api.getSummaryProps(), api.summary), h("table", api.getTableProps(), [
42
+ return [h("p", api.getSummaryProps(), api.summary), h("div", api.getTableRegionProps(), [h("table", api.getTableProps(), [
43
43
  h("caption", api.tableCaption),
44
44
  h("thead", [h("tr", columns.map((column) => h("th", {
45
45
  key: column.id,
@@ -49,7 +49,7 @@ function renderA11y(api) {
49
49
  key: c,
50
50
  scope: "row"
51
51
  }, cell.text) : h("td", { key: c }, cell.text)))))
52
- ])];
52
+ ])])];
53
53
  }
54
54
  /** 标题:图表的可及名来源。 */
55
55
  const XhCartesianChartCaption = defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"cartesian-chart.js","names":[],"sources":["../../../src/components/cartesian-chart/cartesian-chart.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 cartesian chart 相关实现。\n\nimport type {\n CartesianAnnotation,\n CartesianAxis,\n CartesianBrush,\n CartesianBrushSelection,\n CartesianChartApi,\n CartesianChartSchema,\n CartesianChartTranslations,\n CartesianOrientation,\n CartesianRenderer,\n CartesianSeries,\n CartesianTooltipModel,\n CartesianTooltipOrder,\n CartesianTrigger,\n CartesianWindow,\n CartesianZoom,\n ChartDatumDetails,\n ChartKey,\n ChartMark,\n ChartPalette,\n ChartRow,\n ColumnSource,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideCartesianChart, useCartesianChartContext } from './context'\nimport { useCartesianChart } from './use-cartesian-chart'\n\ntype CartesianChartProps = CartesianChartSchema['props']\n\n/** 默认插槽的载荷:自行摆放部件时用得上的状态与动作。 */\nexport type CartesianChartRootSlotProps = Pick<CartesianChartApi, 'legendItems' | 'active' | 'tooltip' | 'empty' | 'hiddenSeries' | 'activeKey' | 'toggleSeries' | 'setFocusedDatum' | 'table'>\n\n/** 提示框插槽的载荷:激活的数据(axis 模式带 items)与缺省的内容模型。 */\nexport interface CartesianChartTooltipSlotProps {\n active: ChartDatumDetails | null\n tooltip: CartesianTooltipModel | null\n}\n\n/** 纹理定义:绘图区的第一个子节点,每种纹理一个 pattern、里面一条线。 */\nfunction renderDefs(api: CartesianChartApi): VNode {\n return h('defs', api.getDefsProps() as Record<string, unknown>, [\n ...api.patterns.map(pattern =>\n h('pattern', { ...api.getPatternProps(pattern) as Record<string, unknown>, key: pattern.id }, [\n h('path', api.getPatternLineProps(pattern) as Record<string, unknown>),\n ])),\n // 缩放后的裁剪区:窗外的系列与注释按它裁掉\n ...(api.clip ? [h('clipPath', { ...api.getClipPathProps() as Record<string, unknown>, key: 'clip' }, [h('rect', api.getClipRectProps() as Record<string, unknown>)])] : []),\n ])\n}\n\n/** 一个场景标记画成 SVG 元素;分组递归画子标记,文字标记带文字。 */\nfunction renderMark(api: CartesianChartApi, mark: ChartMark): VNode {\n const props = { ...api.getMarkProps(mark) as Record<string, unknown>, key: mark.key }\n if (mark.kind === 'group')\n return h('g', props, mark.children.map(child => renderMark(api, child)))\n if (mark.kind === 'text')\n return h('text', props, mark.text)\n return h('path', props)\n}\n\n/** 缺省的提示框内容:头部是自变量,每个系列一行(色标、数值、系列名)。 */\nfunction renderTooltipContent(api: CartesianChartApi): VNode[] {\n const tooltip = api.tooltip\n if (!tooltip)\n return []\n return [\n h('div', api.getTooltipHeaderProps() as Record<string, unknown>, tooltip.header),\n ...tooltip.rows.map(row => h('div', { ...api.getTooltipRowProps(row) as Record<string, unknown>, key: row.seriesId }, [\n h('span', api.getTooltipSwatchProps(row) as Record<string, unknown>),\n h('span', api.getTooltipValueProps(row) as Record<string, unknown>, row.value),\n h('span', api.getTooltipNameProps(row) as Record<string, unknown>, row.name),\n ])),\n ]\n}\n\n/** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */\nfunction renderA11y(api: CartesianChartApi): VNode[] {\n const { columns, rows } = api.table\n return [\n h('p', api.getSummaryProps() as Record<string, unknown>, api.summary),\n h('table', api.getTableProps() as Record<string, unknown>, [\n h('caption', api.tableCaption),\n h('thead', [h('tr', columns.map(column => h('th', { key: column.id, scope: 'col' }, column.label)))]),\n h('tbody', rows.map((row, i) => h('tr', { key: i }, row.cells.map((cell, c) =>\n c === 0 ? h('th', { key: c, scope: 'row' }, cell.text) : h('td', { key: c }, cell.text))))),\n ]),\n ]\n}\n\n/** 标题:图表的可及名来源。 */\nexport const XhCartesianChartCaption = defineComponent({\n name: 'XhCartesianChartCaption',\n setup(_, { slots }) {\n const ctx = useCartesianChartContext()\n return () => h('figcaption', ctx.api.value.getCaptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 色阶图例:按值着色时跟在图例项后面;没有按值着色时整块收起,节点常在。 */\nfunction renderLegendScale(api: CartesianChartApi): VNode {\n const scale = api.legendScale\n return h('div', { ...api.getLegendScaleProps() as Record<string, unknown>, key: 'legend-scale' }, scale\n ? [\n h('span', api.getLegendScaleNameProps() as Record<string, unknown>, scale.name),\n h('span', api.getLegendScaleValueProps('min') as Record<string, unknown>, scale.min),\n h('span', api.getLegendScaleBarProps() as Record<string, unknown>),\n h('span', api.getLegendScaleValueProps('max') as Record<string, unknown>, scale.max),\n ]\n : [])\n}\n\n/** 图例:项由组件按系列生成;只有一个系列时整条收起。 */\nexport const XhCartesianChartLegend = defineComponent({\n name: 'XhCartesianChartLegend',\n setup() {\n const ctx = useCartesianChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getLegendProps() as Record<string, unknown>, [\n ...api.legendItems.map(item =>\n h('button', { ...api.getLegendItemProps(item) as Record<string, unknown>, key: item.id }, [\n h('span', api.getLegendSwatchProps(item) as Record<string, unknown>),\n h('span', api.getLegendLabelProps(item) as Record<string, unknown>, item.name),\n ])),\n renderLegendScale(api),\n ])\n }\n },\n})\n\n/** 视口:尺寸观测的宿主,块尺寸由组件槽决定、含坐标轴带。 */\nexport const XhCartesianChartViewport = defineComponent({\n name: 'XhCartesianChartViewport',\n setup(_, { slots }) {\n const ctx = useCartesianChartContext()\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.viewportRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/**\n * 绘图区:按场景生成网格、坐标轴、系列与前景层,层序由连接层分好。\n * 数据层画在画布上时前面再垫一层 svg(网格、坐标轴、参考带、准线)与画布;绘图区始终以同一个 key 在最后,\n * 渲染器切换时它不重建,焦点不丢。\n */\nexport const XhCartesianChartPlot = defineComponent({\n name: 'XhCartesianChartPlot',\n setup() {\n const ctx = useCartesianChartContext()\n const bindCanvas = (el: unknown): void => {\n ctx.canvasRef.value = el as HTMLCanvasElement | null\n }\n return () => {\n const api = ctx.api.value\n const plot = h('svg', { ...api.getPlotProps() as Record<string, unknown>, key: 'plot' }, [renderDefs(api), ...api.layers.plot.map(mark => renderMark(api, mark))])\n if (api.renderer !== 'canvas')\n return [plot]\n return [\n h('svg', { ...api.getUnderlayProps() as Record<string, unknown>, key: 'underlay' }, api.layers.underlay.map(mark => renderMark(api, mark))),\n h('canvas', { ...api.getCanvasProps() as Record<string, unknown>, key: 'canvas', ref: bindCanvas }),\n plot,\n ]\n }\n },\n})\n\n/** 缩放条:一条轨道上的窗口与两端的手柄;自变量方向不能缩放时收起。 */\nexport const XhCartesianChartZoomSlider = defineComponent({\n name: 'XhCartesianChartZoomSlider',\n setup() {\n const ctx = useCartesianChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getZoomSliderProps() as Record<string, unknown>, [\n h('div', api.getZoomTrackProps() as Record<string, unknown>, [\n h('div', api.getZoomWindowProps() as Record<string, unknown>, [\n h('span', api.getZoomHandleProps('start') as Record<string, unknown>),\n h('span', api.getZoomHandleProps('end') as Record<string, unknown>),\n ]),\n h('svg', api.getZoomPreviewProps() as Record<string, unknown>, [\n h('path', api.getZoomPreviewLineProps() as Record<string, unknown>),\n ]),\n ]),\n ])\n }\n },\n})\n\n/** 提示框:缺省内容按激活的数据生成,作用域插槽可替换。 */\nexport const XhCartesianChartTooltip = defineComponent({\n name: 'XhCartesianChartTooltip',\n slots: Object as SlotsType<{\n default?: (props: CartesianChartTooltipSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useCartesianChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getTooltipProps() as Record<string, unknown>, slots.default\n ? slots.default({ active: api.active, tooltip: api.tooltip })\n : renderTooltipContent(api))\n }\n },\n})\n\n/** 空态:没有可画的数据时显示,缺省文字取文案。 */\nexport const XhCartesianChartEmpty = defineComponent({\n name: 'XhCartesianChartEmpty',\n setup(_, { slots }) {\n const ctx = useCartesianChartContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.emptyText)\n },\n})\n\n/** 根:铺开缺省结构或交给默认插槽,并在末尾追加摘要与数据表。 */\nexport const XhCartesianChartRoot = defineComponent({\n name: 'XhCartesianChartRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n data: { type: [Array, Object] as PropType<readonly ChartRow[] | ColumnSource> },\n series: { type: Array as PropType<readonly CartesianSeries[]> },\n xAxis: { type: Object as PropType<CartesianAxis> },\n yAxis: { type: Object as PropType<CartesianAxis> },\n orientation: { type: String as PropType<CartesianOrientation> },\n renderer: { type: String as PropType<CartesianRenderer> },\n trigger: { type: String as PropType<CartesianTrigger> },\n totals: { type: Boolean, default: undefined },\n tooltipOrder: { type: String as PropType<CartesianTooltipOrder> },\n palette: { type: String as PropType<ChartPalette> },\n annotations: { type: Array as PropType<readonly CartesianAnnotation[]> },\n zoom: { type: String as PropType<CartesianZoom> },\n window: { type: Object as PropType<CartesianWindow> },\n defaultWindow: { type: Object as PropType<CartesianWindow> },\n follow: { type: Boolean, default: undefined },\n defaultFollow: { type: Boolean, default: undefined },\n brush: { type: String as PropType<CartesianBrush> },\n brushSelection: { type: Object as PropType<CartesianBrushSelection | null> },\n defaultBrushSelection: { type: Object as PropType<CartesianBrushSelection | null> },\n hiddenSeries: { type: Array as PropType<string[]> },\n defaultHiddenSeries: { type: Array as PropType<string[]> },\n activeKey: { type: [String, Number, Date, null] as PropType<ChartKey | null> },\n pending: { type: Boolean, default: undefined },\n animated: { type: Boolean, default: undefined },\n locale: { type: String },\n translations: { type: Object as PropType<Partial<CartesianChartTranslations>> },\n },\n // hidden-series-change / active-key-change 携带 details;update:* 携带裸值,支持 v-model\n emits: {\n 'hidden-series-change': (_details: PayloadOf<CartesianChartProps, 'onHiddenSeriesChange'>) => true,\n 'update:hiddenSeries': (_hidden: PayloadOf<CartesianChartProps, 'onHiddenSeriesChange'>['hiddenSeries']) => true,\n 'active-key-change': (_details: PayloadOf<CartesianChartProps, 'onActiveKeyChange'>) => true,\n 'update:activeKey': (_key: PayloadOf<CartesianChartProps, 'onActiveKeyChange'>['activeKey']) => true,\n 'window-change': (_details: PayloadOf<CartesianChartProps, 'onWindowChange'>) => true,\n 'update:window': (_window: PayloadOf<CartesianChartProps, 'onWindowChange'>['window']) => true,\n 'follow-change': (_details: PayloadOf<CartesianChartProps, 'onFollowChange'>) => true,\n 'update:follow': (_follow: PayloadOf<CartesianChartProps, 'onFollowChange'>['follow']) => true,\n 'brush-selection-change': (_details: PayloadOf<CartesianChartProps, 'onBrushSelectionChange'>) => true,\n 'update:brushSelection': (_selection: PayloadOf<CartesianChartProps, 'onBrushSelectionChange'>['selection']) => true,\n 'datum-active': (_details: PayloadOf<CartesianChartProps, 'onDatumActive'>) => true,\n 'datum-press': (_details: PayloadOf<CartesianChartProps, 'onDatumPress'>) => true,\n },\n slots: Object as SlotsType<{\n /** 自行摆放部件;不写时铺开缺省结构:图例、视口(绘图区与空态)、提示框。 */\n default?: (props: CartesianChartRootSlotProps) => VNode[]\n /** 缺省结构里的标题内容。 */\n caption?: () => VNode[]\n /** 缺省结构里的提示框内容。 */\n tooltip?: (props: CartesianChartTooltipSlotProps) => VNode[]\n /** 缺省结构里的空态内容。 */\n empty?: () => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useCartesianChart(withXhConfig('cartesian-chart', props) as CartesianChartProps, {\n onHiddenSeriesChange: (details) => {\n emit('hidden-series-change', details)\n emit('update:hiddenSeries', details.hiddenSeries)\n },\n onActiveKeyChange: (details) => {\n emit('active-key-change', details)\n emit('update:activeKey', details.activeKey)\n },\n onWindowChange: (details) => {\n emit('window-change', details)\n emit('update:window', details.window)\n },\n onFollowChange: (details) => {\n emit('follow-change', details)\n emit('update:follow', details.follow)\n },\n onBrushSelectionChange: (details) => {\n emit('brush-selection-change', details)\n emit('update:brushSelection', details.selection)\n },\n onDatumActive: details => emit('datum-active', details),\n onDatumPress: details => emit('datum-press', details),\n })\n provideCartesianChart(ctx)\n return () => {\n const api = ctx.api.value\n const content = slots.default\n ? slots.default({\n legendItems: api.legendItems,\n active: api.active,\n tooltip: api.tooltip,\n empty: api.empty,\n table: api.table,\n hiddenSeries: api.hiddenSeries,\n activeKey: api.activeKey,\n toggleSeries: api.toggleSeries,\n setFocusedDatum: api.setFocusedDatum,\n })\n : [\n ...(slots.caption ? [h(XhCartesianChartCaption, null, () => slots.caption?.())] : []),\n h(XhCartesianChartLegend),\n // 空态放进视口:叠在绘图区上居中,标题与图例不被盖住\n h(XhCartesianChartViewport, null, () => [\n h(XhCartesianChartPlot),\n h(XhCartesianChartEmpty, null, slots.empty ? () => slots.empty?.() : undefined),\n ]),\n h(XhCartesianChartZoomSlider),\n h(XhCartesianChartTooltip, null, slots.tooltip ? { default: slots.tooltip } : undefined),\n ]\n return h('figure', {\n ...api.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, [...content, ...renderA11y(api)])\n }\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"cartesian-chart.js","names":[],"sources":["../../../src/components/cartesian-chart/cartesian-chart.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 cartesian chart 相关实现。\n\nimport type {\n CartesianAnnotation,\n CartesianAxis,\n CartesianBrush,\n CartesianBrushSelection,\n CartesianChartApi,\n CartesianChartSchema,\n CartesianChartTranslations,\n CartesianOrientation,\n CartesianRenderer,\n CartesianSeries,\n CartesianTooltipModel,\n CartesianTooltipOrder,\n CartesianTrigger,\n CartesianWindow,\n CartesianZoom,\n ChartDatumDetails,\n ChartKey,\n ChartMark,\n ChartPalette,\n ChartRow,\n ColumnSource,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideCartesianChart, useCartesianChartContext } from './context'\nimport { useCartesianChart } from './use-cartesian-chart'\n\ntype CartesianChartProps = CartesianChartSchema['props']\n\n/** 默认插槽的载荷:自行摆放部件时用得上的状态与动作。 */\nexport type CartesianChartRootSlotProps = Pick<CartesianChartApi, 'legendItems' | 'active' | 'tooltip' | 'empty' | 'hiddenSeries' | 'activeKey' | 'toggleSeries' | 'setFocusedDatum' | 'table'>\n\n/** 提示框插槽的载荷:激活的数据(axis 模式带 items)与缺省的内容模型。 */\nexport interface CartesianChartTooltipSlotProps {\n active: ChartDatumDetails | null\n tooltip: CartesianTooltipModel | null\n}\n\n/** 纹理定义:绘图区的第一个子节点,每种纹理一个 pattern、里面一条线。 */\nfunction renderDefs(api: CartesianChartApi): VNode {\n return h('defs', api.getDefsProps() as Record<string, unknown>, [\n ...api.patterns.map(pattern =>\n h('pattern', { ...api.getPatternProps(pattern) as Record<string, unknown>, key: pattern.id }, [\n h('path', api.getPatternLineProps(pattern) as Record<string, unknown>),\n ])),\n // 缩放后的裁剪区:窗外的系列与注释按它裁掉\n ...(api.clip ? [h('clipPath', { ...api.getClipPathProps() as Record<string, unknown>, key: 'clip' }, [h('rect', api.getClipRectProps() as Record<string, unknown>)])] : []),\n ])\n}\n\n/** 一个场景标记画成 SVG 元素;分组递归画子标记,文字标记带文字。 */\nfunction renderMark(api: CartesianChartApi, mark: ChartMark): VNode {\n const props = { ...api.getMarkProps(mark) as Record<string, unknown>, key: mark.key }\n if (mark.kind === 'group')\n return h('g', props, mark.children.map(child => renderMark(api, child)))\n if (mark.kind === 'text')\n return h('text', props, mark.text)\n return h('path', props)\n}\n\n/** 缺省的提示框内容:头部是自变量,每个系列一行(色标、数值、系列名)。 */\nfunction renderTooltipContent(api: CartesianChartApi): VNode[] {\n const tooltip = api.tooltip\n if (!tooltip)\n return []\n return [\n h('div', api.getTooltipHeaderProps() as Record<string, unknown>, tooltip.header),\n ...tooltip.rows.map(row => h('div', { ...api.getTooltipRowProps(row) as Record<string, unknown>, key: row.seriesId }, [\n h('span', api.getTooltipSwatchProps(row) as Record<string, unknown>),\n h('span', api.getTooltipValueProps(row) as Record<string, unknown>, row.value),\n h('span', api.getTooltipNameProps(row) as Record<string, unknown>, row.name),\n ])),\n ]\n}\n\n/** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */\nfunction renderA11y(api: CartesianChartApi): VNode[] {\n const { columns, rows } = api.table\n return [\n h('p', api.getSummaryProps() as Record<string, unknown>, api.summary),\n // 视觉隐藏落在包着表格的区域上,表格在里面照常排版:隐藏写在表格上收不住它的高度\n h('div', api.getTableRegionProps() as Record<string, unknown>, [\n h('table', api.getTableProps() as Record<string, unknown>, [\n h('caption', api.tableCaption),\n h('thead', [h('tr', columns.map(column => h('th', { key: column.id, scope: 'col' }, column.label)))]),\n h('tbody', rows.map((row, i) => h('tr', { key: i }, row.cells.map((cell, c) =>\n c === 0 ? h('th', { key: c, scope: 'row' }, cell.text) : h('td', { key: c }, cell.text))))),\n ]),\n ]),\n ]\n}\n\n/** 标题:图表的可及名来源。 */\nexport const XhCartesianChartCaption = defineComponent({\n name: 'XhCartesianChartCaption',\n setup(_, { slots }) {\n const ctx = useCartesianChartContext()\n return () => h('figcaption', ctx.api.value.getCaptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 色阶图例:按值着色时跟在图例项后面;没有按值着色时整块收起,节点常在。 */\nfunction renderLegendScale(api: CartesianChartApi): VNode {\n const scale = api.legendScale\n return h('div', { ...api.getLegendScaleProps() as Record<string, unknown>, key: 'legend-scale' }, scale\n ? [\n h('span', api.getLegendScaleNameProps() as Record<string, unknown>, scale.name),\n h('span', api.getLegendScaleValueProps('min') as Record<string, unknown>, scale.min),\n h('span', api.getLegendScaleBarProps() as Record<string, unknown>),\n h('span', api.getLegendScaleValueProps('max') as Record<string, unknown>, scale.max),\n ]\n : [])\n}\n\n/** 图例:项由组件按系列生成;只有一个系列时整条收起。 */\nexport const XhCartesianChartLegend = defineComponent({\n name: 'XhCartesianChartLegend',\n setup() {\n const ctx = useCartesianChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getLegendProps() as Record<string, unknown>, [\n ...api.legendItems.map(item =>\n h('button', { ...api.getLegendItemProps(item) as Record<string, unknown>, key: item.id }, [\n h('span', api.getLegendSwatchProps(item) as Record<string, unknown>),\n h('span', api.getLegendLabelProps(item) as Record<string, unknown>, item.name),\n ])),\n renderLegendScale(api),\n ])\n }\n },\n})\n\n/** 视口:尺寸观测的宿主,块尺寸由组件槽决定、含坐标轴带。 */\nexport const XhCartesianChartViewport = defineComponent({\n name: 'XhCartesianChartViewport',\n setup(_, { slots }) {\n const ctx = useCartesianChartContext()\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.viewportRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/**\n * 绘图区:按场景生成网格、坐标轴、系列与前景层,层序由连接层分好。\n * 数据层画在画布上时前面再垫一层 svg(网格、坐标轴、参考带、准线)与画布;绘图区始终以同一个 key 在最后,\n * 渲染器切换时它不重建,焦点不丢。\n */\nexport const XhCartesianChartPlot = defineComponent({\n name: 'XhCartesianChartPlot',\n setup() {\n const ctx = useCartesianChartContext()\n const bindCanvas = (el: unknown): void => {\n ctx.canvasRef.value = el as HTMLCanvasElement | null\n }\n return () => {\n const api = ctx.api.value\n const plot = h('svg', { ...api.getPlotProps() as Record<string, unknown>, key: 'plot' }, [renderDefs(api), ...api.layers.plot.map(mark => renderMark(api, mark))])\n if (api.renderer !== 'canvas')\n return [plot]\n return [\n h('svg', { ...api.getUnderlayProps() as Record<string, unknown>, key: 'underlay' }, api.layers.underlay.map(mark => renderMark(api, mark))),\n h('canvas', { ...api.getCanvasProps() as Record<string, unknown>, key: 'canvas', ref: bindCanvas }),\n plot,\n ]\n }\n },\n})\n\n/** 缩放条:一条轨道上的窗口与两端的手柄;自变量方向不能缩放时收起。 */\nexport const XhCartesianChartZoomSlider = defineComponent({\n name: 'XhCartesianChartZoomSlider',\n setup() {\n const ctx = useCartesianChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getZoomSliderProps() as Record<string, unknown>, [\n h('div', api.getZoomTrackProps() as Record<string, unknown>, [\n h('div', api.getZoomWindowProps() as Record<string, unknown>, [\n h('span', api.getZoomHandleProps('start') as Record<string, unknown>),\n h('span', api.getZoomHandleProps('end') as Record<string, unknown>),\n ]),\n h('svg', api.getZoomPreviewProps() as Record<string, unknown>, [\n h('path', api.getZoomPreviewLineProps() as Record<string, unknown>),\n ]),\n ]),\n ])\n }\n },\n})\n\n/** 提示框:缺省内容按激活的数据生成,作用域插槽可替换。 */\nexport const XhCartesianChartTooltip = defineComponent({\n name: 'XhCartesianChartTooltip',\n slots: Object as SlotsType<{\n default?: (props: CartesianChartTooltipSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useCartesianChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getTooltipProps() as Record<string, unknown>, slots.default\n ? slots.default({ active: api.active, tooltip: api.tooltip })\n : renderTooltipContent(api))\n }\n },\n})\n\n/** 空态:没有可画的数据时显示,缺省文字取文案。 */\nexport const XhCartesianChartEmpty = defineComponent({\n name: 'XhCartesianChartEmpty',\n setup(_, { slots }) {\n const ctx = useCartesianChartContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.emptyText)\n },\n})\n\n/** 根:铺开缺省结构或交给默认插槽,并在末尾追加摘要与数据表。 */\nexport const XhCartesianChartRoot = defineComponent({\n name: 'XhCartesianChartRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n data: { type: [Array, Object] as PropType<readonly ChartRow[] | ColumnSource> },\n series: { type: Array as PropType<readonly CartesianSeries[]> },\n xAxis: { type: Object as PropType<CartesianAxis> },\n yAxis: { type: Object as PropType<CartesianAxis> },\n orientation: { type: String as PropType<CartesianOrientation> },\n renderer: { type: String as PropType<CartesianRenderer> },\n trigger: { type: String as PropType<CartesianTrigger> },\n totals: { type: Boolean, default: undefined },\n tooltipOrder: { type: String as PropType<CartesianTooltipOrder> },\n palette: { type: String as PropType<ChartPalette> },\n annotations: { type: Array as PropType<readonly CartesianAnnotation[]> },\n zoom: { type: String as PropType<CartesianZoom> },\n window: { type: Object as PropType<CartesianWindow> },\n defaultWindow: { type: Object as PropType<CartesianWindow> },\n follow: { type: Boolean, default: undefined },\n defaultFollow: { type: Boolean, default: undefined },\n brush: { type: String as PropType<CartesianBrush> },\n brushSelection: { type: Object as PropType<CartesianBrushSelection | null> },\n defaultBrushSelection: { type: Object as PropType<CartesianBrushSelection | null> },\n hiddenSeries: { type: Array as PropType<string[]> },\n defaultHiddenSeries: { type: Array as PropType<string[]> },\n activeKey: { type: [String, Number, Date, null] as PropType<ChartKey | null> },\n pending: { type: Boolean, default: undefined },\n animated: { type: Boolean, default: undefined },\n locale: { type: String },\n translations: { type: Object as PropType<Partial<CartesianChartTranslations>> },\n },\n // hidden-series-change / active-key-change 携带 details;update:* 携带裸值,支持 v-model\n emits: {\n 'hidden-series-change': (_details: PayloadOf<CartesianChartProps, 'onHiddenSeriesChange'>) => true,\n 'update:hiddenSeries': (_hidden: PayloadOf<CartesianChartProps, 'onHiddenSeriesChange'>['hiddenSeries']) => true,\n 'active-key-change': (_details: PayloadOf<CartesianChartProps, 'onActiveKeyChange'>) => true,\n 'update:activeKey': (_key: PayloadOf<CartesianChartProps, 'onActiveKeyChange'>['activeKey']) => true,\n 'window-change': (_details: PayloadOf<CartesianChartProps, 'onWindowChange'>) => true,\n 'update:window': (_window: PayloadOf<CartesianChartProps, 'onWindowChange'>['window']) => true,\n 'follow-change': (_details: PayloadOf<CartesianChartProps, 'onFollowChange'>) => true,\n 'update:follow': (_follow: PayloadOf<CartesianChartProps, 'onFollowChange'>['follow']) => true,\n 'brush-selection-change': (_details: PayloadOf<CartesianChartProps, 'onBrushSelectionChange'>) => true,\n 'update:brushSelection': (_selection: PayloadOf<CartesianChartProps, 'onBrushSelectionChange'>['selection']) => true,\n 'datum-active': (_details: PayloadOf<CartesianChartProps, 'onDatumActive'>) => true,\n 'datum-press': (_details: PayloadOf<CartesianChartProps, 'onDatumPress'>) => true,\n },\n slots: Object as SlotsType<{\n /** 自行摆放部件;不写时铺开缺省结构:图例、视口(绘图区与空态)、提示框。 */\n default?: (props: CartesianChartRootSlotProps) => VNode[]\n /** 缺省结构里的标题内容。 */\n caption?: () => VNode[]\n /** 缺省结构里的提示框内容。 */\n tooltip?: (props: CartesianChartTooltipSlotProps) => VNode[]\n /** 缺省结构里的空态内容。 */\n empty?: () => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useCartesianChart(withXhConfig('cartesian-chart', props) as CartesianChartProps, {\n onHiddenSeriesChange: (details) => {\n emit('hidden-series-change', details)\n emit('update:hiddenSeries', details.hiddenSeries)\n },\n onActiveKeyChange: (details) => {\n emit('active-key-change', details)\n emit('update:activeKey', details.activeKey)\n },\n onWindowChange: (details) => {\n emit('window-change', details)\n emit('update:window', details.window)\n },\n onFollowChange: (details) => {\n emit('follow-change', details)\n emit('update:follow', details.follow)\n },\n onBrushSelectionChange: (details) => {\n emit('brush-selection-change', details)\n emit('update:brushSelection', details.selection)\n },\n onDatumActive: details => emit('datum-active', details),\n onDatumPress: details => emit('datum-press', details),\n })\n provideCartesianChart(ctx)\n return () => {\n const api = ctx.api.value\n const content = slots.default\n ? slots.default({\n legendItems: api.legendItems,\n active: api.active,\n tooltip: api.tooltip,\n empty: api.empty,\n table: api.table,\n hiddenSeries: api.hiddenSeries,\n activeKey: api.activeKey,\n toggleSeries: api.toggleSeries,\n setFocusedDatum: api.setFocusedDatum,\n })\n : [\n ...(slots.caption ? [h(XhCartesianChartCaption, null, () => slots.caption?.())] : []),\n h(XhCartesianChartLegend),\n // 空态放进视口:叠在绘图区上居中,标题与图例不被盖住\n h(XhCartesianChartViewport, null, () => [\n h(XhCartesianChartPlot),\n h(XhCartesianChartEmpty, null, slots.empty ? () => slots.empty?.() : undefined),\n ]),\n h(XhCartesianChartZoomSlider),\n h(XhCartesianChartTooltip, null, slots.tooltip ? { default: slots.tooltip } : undefined),\n ]\n return h('figure', {\n ...api.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, [...content, ...renderA11y(api)])\n }\n },\n})\n"],"mappings":"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"}
@@ -99,6 +99,7 @@ declare const XhCascaderRoot: import("vue").DefineComponent<import("vue").Extrac
99
99
  }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
100
100
  [key: string]: any;
101
101
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
102
+ clear: () => true;
102
103
  'value-change': (_details: PayloadOf<CascaderProps, "onValueChange">) => true;
103
104
  'open-change': (_details: PayloadOf<CascaderProps, "onOpenChange">) => true;
104
105
  'update:value': (_value: PayloadOf<CascaderProps, "onValueChange">["value"]) => true;
@@ -199,6 +200,7 @@ declare const XhCascaderRoot: import("vue").DefineComponent<import("vue").Extrac
199
200
  }>> & Readonly<{
200
201
  "onValue-change"?: ((_details: import("@xihan-ui/headless").CascaderValueChangeDetails) => any) | undefined;
201
202
  "onUpdate:value"?: ((_value: string[][]) => any) | undefined;
203
+ onClear?: (() => any) | undefined;
202
204
  "onOpen-change"?: ((_details: import("@xihan-ui/headless").CascaderOpenChangeDetails) => any) | undefined;
203
205
  "onUpdate:open"?: ((_open: boolean) => any) | undefined;
204
206
  "onBranch-load-start"?: ((_details: import("@xihan-ui/headless").CascaderBranchLoadStartDetails) => any) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"cascader.d.ts","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"mappings":"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"}
1
+ {"version":3,"file":"cascader.d.ts","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { withXhConfig } from "../../config/config.js";
2
2
  import { XhPortal } from "../../runtime/portal.js";
3
3
  import { slotIsPlainText } from "../../runtime/slot-content.js";
4
4
  import { useScrollbars } from "../../runtime/use-scrollbars.js";
5
+ import { withHandlers } from "../../runtime/with-handlers.js";
5
6
  import { useFormControlProps } from "../form/use-form-control.js";
6
7
  import { useFieldLabelWiring, useFieldStateWiring } from "../field/use-field-control.js";
7
8
  import { provideCascader, provideCascaderContent, provideCascaderGroup, provideCascaderItem, provideCascaderTag, useCascaderContentContext, useCascaderContext, useCascaderGroupContext, useCascaderItemContext, useCascaderTagContext } from "./context.js";
@@ -84,6 +85,7 @@ const XhCascaderRoot = defineComponent({
84
85
  dir: { type: String }
85
86
  },
86
87
  emits: {
88
+ "clear": () => true,
87
89
  "value-change": (_details) => true,
88
90
  "open-change": (_details) => true,
89
91
  "update:value": (_value) => true,
@@ -102,7 +104,7 @@ const XhCascaderRoot = defineComponent({
102
104
  emit("open-change", details);
103
105
  emit("update:open", details.open);
104
106
  };
105
- const ctx = useCascader(withXhConfig("cascader", useFormControlProps(props)), {
107
+ const ctx = useCascader(withHandlers(withXhConfig("cascader", useFormControlProps(props)), { onClear: () => emit("clear") }), {
106
108
  onValueChange: notifyValue,
107
109
  onOpenChange: notifyOpen,
108
110
  onBranchLoadStart: (details) => emit("branch-load-start", details),
@@ -268,7 +270,8 @@ container: { type: Object } },
268
270
  });
269
271
  return () => h(XhPortal, {
270
272
  to: props.container ?? ctx.portalTarget.value,
271
- source: ctx.triggerRef
273
+ source: ctx.triggerRef,
274
+ present: ctx.visible.value
272
275
  }, () => [h("div", {
273
276
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
274
277
  ref: (el) => {