@xihan-ui/vue 3.1.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 (119) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/dist/components/carousel/carousel.d.ts +7 -1
  3. package/dist/components/carousel/carousel.d.ts.map +1 -1
  4. package/dist/components/carousel/carousel.js +1 -0
  5. package/dist/components/carousel/carousel.js.map +1 -1
  6. package/dist/components/cartesian-chart/cartesian-chart.d.ts.map +1 -1
  7. package/dist/components/cartesian-chart/cartesian-chart.js +2 -2
  8. package/dist/components/cartesian-chart/cartesian-chart.js.map +1 -1
  9. package/dist/components/cascader/cascader.js +2 -1
  10. package/dist/components/cascader/cascader.js.map +1 -1
  11. package/dist/components/citation/citation.d.ts.map +1 -1
  12. package/dist/components/citation/citation.js +8 -6
  13. package/dist/components/citation/citation.js.map +1 -1
  14. package/dist/components/color-picker/color-picker.js +2 -1
  15. package/dist/components/color-picker/color-picker.js.map +1 -1
  16. package/dist/components/combobox/combobox.js +3 -3
  17. package/dist/components/combobox/combobox.js.map +1 -1
  18. package/dist/components/context-menu/context-menu.js +2 -1
  19. package/dist/components/context-menu/context-menu.js.map +1 -1
  20. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  21. package/dist/components/date-picker/date-picker.js +1 -0
  22. package/dist/components/date-picker/date-picker.js.map +1 -1
  23. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  24. package/dist/components/date-range-picker/date-range-picker.js +1 -0
  25. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  26. package/dist/components/dialog/dialog.d.ts +11 -0
  27. package/dist/components/dialog/dialog.d.ts.map +1 -1
  28. package/dist/components/dialog/dialog.js +14 -4
  29. package/dist/components/dialog/dialog.js.map +1 -1
  30. package/dist/components/drawer/drawer.d.ts +11 -0
  31. package/dist/components/drawer/drawer.d.ts.map +1 -1
  32. package/dist/components/drawer/drawer.js +14 -4
  33. package/dist/components/drawer/drawer.js.map +1 -1
  34. package/dist/components/floating-panel/floating-panel.d.ts +2 -2
  35. package/dist/components/floating-panel/floating-panel.js +4 -1
  36. package/dist/components/floating-panel/floating-panel.js.map +1 -1
  37. package/dist/components/form/form.d.ts +8 -0
  38. package/dist/components/form/form.d.ts.map +1 -1
  39. package/dist/components/form/form.js +4 -1
  40. package/dist/components/form/form.js.map +1 -1
  41. package/dist/components/funnel-chart/funnel-chart.d.ts.map +1 -1
  42. package/dist/components/funnel-chart/funnel-chart.js +2 -2
  43. package/dist/components/funnel-chart/funnel-chart.js.map +1 -1
  44. package/dist/components/graph-chart/graph-chart.d.ts.map +1 -1
  45. package/dist/components/graph-chart/graph-chart.js +2 -2
  46. package/dist/components/graph-chart/graph-chart.js.map +1 -1
  47. package/dist/components/hierarchy-chart/hierarchy-chart.d.ts.map +1 -1
  48. package/dist/components/hierarchy-chart/hierarchy-chart.js +2 -2
  49. package/dist/components/hierarchy-chart/hierarchy-chart.js.map +1 -1
  50. package/dist/components/hover-card/hover-card.js +2 -1
  51. package/dist/components/hover-card/hover-card.js.map +1 -1
  52. package/dist/components/image-viewer/image-viewer.d.ts +7 -1
  53. package/dist/components/image-viewer/image-viewer.d.ts.map +1 -1
  54. package/dist/components/image-viewer/image-viewer.js +1 -0
  55. package/dist/components/image-viewer/image-viewer.js.map +1 -1
  56. package/dist/components/markdown-stream/markdown-stream.d.ts +1 -1
  57. package/dist/components/mention/mention.d.ts +1 -1
  58. package/dist/components/mention/mention.js +5 -4
  59. package/dist/components/mention/mention.js.map +1 -1
  60. package/dist/components/menu/menu.js +2 -1
  61. package/dist/components/menu/menu.js.map +1 -1
  62. package/dist/components/menubar/context.d.ts.map +1 -1
  63. package/dist/components/menubar/context.js.map +1 -1
  64. package/dist/components/menubar/menubar.d.ts.map +1 -1
  65. package/dist/components/menubar/menubar.js +16 -2
  66. package/dist/components/menubar/menubar.js.map +1 -1
  67. package/dist/components/pagination/pagination.js +4 -2
  68. package/dist/components/pagination/pagination.js.map +1 -1
  69. package/dist/components/pie-chart/pie-chart.d.ts.map +1 -1
  70. package/dist/components/pie-chart/pie-chart.js +2 -2
  71. package/dist/components/pie-chart/pie-chart.js.map +1 -1
  72. package/dist/components/popconfirm/popconfirm.js +2 -1
  73. package/dist/components/popconfirm/popconfirm.js.map +1 -1
  74. package/dist/components/popover/popover.js +2 -1
  75. package/dist/components/popover/popover.js.map +1 -1
  76. package/dist/components/radar-chart/radar-chart.d.ts.map +1 -1
  77. package/dist/components/radar-chart/radar-chart.js +2 -2
  78. package/dist/components/radar-chart/radar-chart.js.map +1 -1
  79. package/dist/components/reasoning/reasoning.d.ts +1 -1
  80. package/dist/components/sankey-chart/sankey-chart.d.ts.map +1 -1
  81. package/dist/components/sankey-chart/sankey-chart.js +2 -2
  82. package/dist/components/sankey-chart/sankey-chart.js.map +1 -1
  83. package/dist/components/select/select.d.ts +11 -0
  84. package/dist/components/select/select.d.ts.map +1 -1
  85. package/dist/components/select/select.js +12 -3
  86. package/dist/components/select/select.js.map +1 -1
  87. package/dist/components/side-nav/side-nav.d.ts.map +1 -1
  88. package/dist/components/side-nav/side-nav.js +8 -2
  89. package/dist/components/side-nav/side-nav.js.map +1 -1
  90. package/dist/components/sortable/sortable.d.ts +1 -1
  91. package/dist/components/table/table.d.ts +2 -2
  92. package/dist/components/table/table.d.ts.map +1 -1
  93. package/dist/components/time-picker/time-picker.js +2 -1
  94. package/dist/components/time-picker/time-picker.js.map +1 -1
  95. package/dist/components/time-range-picker/time-range-picker.js +2 -1
  96. package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
  97. package/dist/components/tooltip/tooltip.js +2 -1
  98. package/dist/components/tooltip/tooltip.js.map +1 -1
  99. package/dist/components/tour/tour.d.ts +1 -1
  100. package/dist/components/tour/tour.js +12 -3
  101. package/dist/components/tour/tour.js.map +1 -1
  102. package/dist/components/tree-select/tree-select.js +3 -3
  103. package/dist/components/tree-select/tree-select.js.map +1 -1
  104. package/dist/locale.d.ts +2 -0
  105. package/dist/locale.js +2 -0
  106. package/dist/package.js +1 -1
  107. package/dist/runtime/as-child.js +7 -2
  108. package/dist/runtime/as-child.js.map +1 -1
  109. package/dist/runtime/portal.js +11 -1
  110. package/dist/runtime/portal.js.map +1 -1
  111. package/dist/runtime/use-overlay-exit.js +6 -1
  112. package/dist/runtime/use-overlay-exit.js.map +1 -1
  113. package/dist/services/dialog-service.d.ts +3 -3
  114. package/dist/services/dialog-service.d.ts.map +1 -1
  115. package/dist/services/dialog-service.js +8 -6
  116. package/dist/services/dialog-service.js.map +1 -1
  117. package/dist/services/service-config.js +2 -1
  118. package/dist/services/service-config.js.map +1 -1
  119. package/package.json +19 -15
package/CHANGELOG.md CHANGED
@@ -1,5 +1,94 @@
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
+
3
92
  ## 3.1.0
4
93
 
5
94
  ### Minor Changes
@@ -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":";;;;;AAyCA,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CAEN,OAAO;EACL,MAAM,EAAE,MAAM,OAAO;EACrB,aAAa,EAAE,MAAM,OAAO;EAC5B,YAAY,EAAE,MAAM,OAAO;EAC3B,eAAe,EAAE,MAAM,OAAO;EAC9B,eAAe,EAAE,MAAM,OAAO;EAC9B,aAAa,EAAE,MAAM,OAAgC;EACrD,KAAK,EAAE,MAAM,OAA8B;EAC3C,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAE1C,UAAU;GAAE,MAAM,CAAC,SAAS,MAAM;GAAiC,SAAS,KAAA;EAAU;EACtF,kBAAkB;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EACtD,SAAS,EAAE,MAAM,OAAO;EACxB,QAAQ,EAAE,MAAM,OAAmC;EACnD,cAAc,EAAE,MAAM,OAAkD;CAC1E;CAEA,OAAO;EACL,gBAAgB,aAAuD;EACvE,gBAAgB,UAA4D;CAC9E;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,UAAyC,YAAY;GACzD,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,MAAM,YAAY,aAAa,YAAY,KAAK,GAAoB,MAAM;EAChF,gBAAgB,GAAG;EACnB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,MAAM,IAAI,IAAI,MAAM;GACpB,YAAY,IAAI,IAAI,MAAM;GAC1B,YAAY,IAAI,IAAI,MAAM;GAC1B,YAAY,IAAI,IAAI,MAAM;GAC1B,gBAAgB,IAAI,IAAI,MAAM;GAC9B,eAAe,IAAI,IAAI,MAAM;GAC7B,eAAe,IAAI,IAAI,MAAM;GAC7B,aAAa,IAAI,IAAI,MAAM;GAC3B,QAAQ,IAAI,IAAI,MAAM;GACtB,iBAAiB,IAAI,IAAI,MAAM;GAC/B,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,SAAS,IAAI,IAAI,MAAM;GACvB,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,MAAM,IAAI,IAAI,MAAM;GACpB,OAAO,IAAI,IAAI,MAAM;GACrB,QAAQ,IAAI,IAAI,MAAM;EACxB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,iBAAiB,GAA8B,MAAM,UAAU,CAAC;CACtG;AACF,CAAC;AAED,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU,CAAC;CAClG;AACF,CAAC;AAED,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CACN,OAAO,EAEL,OAAO;EAAE,MAAM,CAAC,QAAQ,MAAM;EAAgC,UAAU;CAAK,EAC/E;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EACX,OACA,IAAI,IAAI,MAAM,aAAa,EAAE,OAAO,OAAO,MAAM,KAAK,EAAE,CAAC,GACzD,MAAM,UAAU,CAClB;CACF;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,oBAAoB,GAA8B,MAAM,UAAU,CAAC;CAC5G;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,oBAAoB,GAA8B,MAAM,UAAU,CAAC;CAC5G;AACF,CAAC;;;;;;;AAQD,MAAa,4BAA4B,gBAAgB;CACvD,MAAM;CACN,OAAO;CAGP,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EACX,UACA,IAAI,IAAI,MAAM,wBAAwB,GACtC,MAAM,UAAU,EAAE,SAAS,IAAI,IAAI,MAAM,gBAAgB,CAAC,CAC5D;CACF;AACF,CAAC;AAED,MAAa,2BAA2B,gBAAgB;CACtD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,uBAAuB,GAA8B,MAAM,UAAU,CAAC;CAC5G;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,OAAO,EAEL,OAAO;EAAE,MAAM,CAAC,QAAQ,MAAM;EAAgC,UAAU;CAAK,EAC/E;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EACX,UACA,IAAI,IAAI,MAAM,kBAAkB,EAAE,OAAO,OAAO,MAAM,KAAK,EAAE,CAAC,GAC9D,MAAM,UAAU,CAClB;CACF;AACF,CAAC"}
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":";;;;;AAyCA,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CAEN,OAAO;EACL,MAAM,EAAE,MAAM,OAAO;EACrB,aAAa,EAAE,MAAM,OAAO;EAC5B,YAAY,EAAE,MAAM,OAAO;EAC3B,eAAe,EAAE,MAAM,OAAO;EAC9B,eAAe,EAAE,MAAM,OAAO;EAC9B,aAAa,EAAE,MAAM,OAAgC;EACrD,KAAK,EAAE,MAAM,OAA8B;EAC3C,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAE1C,UAAU;GAAE,MAAM,CAAC,SAAS,MAAM;GAAiC,SAAS,KAAA;EAAU;EACtF,kBAAkB;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EACtD,SAAS,EAAE,MAAM,OAAO;EACxB,QAAQ,EAAE,MAAM,OAAmC;EACnD,MAAM,EAAE,MAAM,OAAyB;EACvC,cAAc,EAAE,MAAM,OAAkD;CAC1E;CAEA,OAAO;EACL,gBAAgB,aAAuD;EACvE,gBAAgB,UAA4D;CAC9E;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,UAAyC,YAAY;GACzD,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,MAAM,YAAY,aAAa,YAAY,KAAK,GAAoB,MAAM;EAChF,gBAAgB,GAAG;EACnB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,MAAM,IAAI,IAAI,MAAM;GACpB,YAAY,IAAI,IAAI,MAAM;GAC1B,YAAY,IAAI,IAAI,MAAM;GAC1B,YAAY,IAAI,IAAI,MAAM;GAC1B,gBAAgB,IAAI,IAAI,MAAM;GAC9B,eAAe,IAAI,IAAI,MAAM;GAC7B,eAAe,IAAI,IAAI,MAAM;GAC7B,aAAa,IAAI,IAAI,MAAM;GAC3B,QAAQ,IAAI,IAAI,MAAM;GACtB,iBAAiB,IAAI,IAAI,MAAM;GAC/B,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,SAAS,IAAI,IAAI,MAAM;GACvB,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,MAAM,IAAI,IAAI,MAAM;GACpB,OAAO,IAAI,IAAI,MAAM;GACrB,QAAQ,IAAI,IAAI,MAAM;EACxB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,iBAAiB,GAA8B,MAAM,UAAU,CAAC;CACtG;AACF,CAAC;AAED,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU,CAAC;CAClG;AACF,CAAC;AAED,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CACN,OAAO,EAEL,OAAO;EAAE,MAAM,CAAC,QAAQ,MAAM;EAAgC,UAAU;CAAK,EAC/E;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EACX,OACA,IAAI,IAAI,MAAM,aAAa,EAAE,OAAO,OAAO,MAAM,KAAK,EAAE,CAAC,GACzD,MAAM,UAAU,CAClB;CACF;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,oBAAoB,GAA8B,MAAM,UAAU,CAAC;CAC5G;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,oBAAoB,GAA8B,MAAM,UAAU,CAAC;CAC5G;AACF,CAAC;;;;;;;AAQD,MAAa,4BAA4B,gBAAgB;CACvD,MAAM;CACN,OAAO;CAGP,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EACX,UACA,IAAI,IAAI,MAAM,wBAAwB,GACtC,MAAM,UAAU,EAAE,SAAS,IAAI,IAAI,MAAM,gBAAgB,CAAC,CAC5D;CACF;AACF,CAAC;AAED,MAAa,2BAA2B,gBAAgB;CACtD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,uBAAuB,GAA8B,MAAM,UAAU,CAAC;CAC5G;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,OAAO,EAEL,OAAO;EAAE,MAAM,CAAC,QAAQ,MAAM;EAAgC,UAAU;CAAK,EAC/E;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,mBAAmB;EAC/B,aAAa,EACX,UACA,IAAI,IAAI,MAAM,kBAAkB,EAAE,OAAO,OAAO,MAAM,KAAK,EAAE,CAAC,GAC9D,MAAM,UAAU,CAClB;CACF;AACF,CAAC"}
@@ -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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"}
@@ -270,7 +270,8 @@ container: { type: Object } },
270
270
  });
271
271
  return () => h(XhPortal, {
272
272
  to: props.container ?? ctx.portalTarget.value,
273
- source: ctx.triggerRef
273
+ source: ctx.triggerRef,
274
+ present: ctx.visible.value
274
275
  }, () => [h("div", {
275
276
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
276
277
  ref: (el) => {
@@ -1 +1 @@
1
- {"version":3,"file":"cascader.js","names":[],"sources":["../../../src/components/cascader/cascader.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// 提供 cascader 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n CascaderApi,\n CascaderExpandTrigger,\n CascaderGroupProps,\n CascaderItemProps,\n CascaderNode,\n CascaderSchema,\n CascaderSearchResult,\n CascaderTranslations,\n CascaderValue,\n} from '@xihan-ui/headless'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { CascaderContext } from './use-cascader'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, onUpdated, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotIsPlainText } from '../../runtime/slot-content'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideCascader, provideCascaderContent, provideCascaderGroup, provideCascaderItem, provideCascaderTag, useCascaderContentContext, useCascaderContext, useCascaderGroupContext, useCascaderItemContext, useCascaderTagContext } from './context'\nimport { useCascader } from './use-cascader'\n\ntype CascaderProps = CascaderSchema['props']\n\n/** 本条目持有焦点时,value 变更重新报告焦点条目,卸载时上报焦点丢失 */\nfunction reportItemFocus(\n ctx: CascaderContext,\n el: Ref<HTMLElement | null>,\n value: () => string,\n): void {\n watch(value, (next, prev) => {\n if (next === prev)\n return\n const { service, api } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (!el.value || service.scope.getActiveElement() !== el.value)\n return\n // 层号回 collection 里查,条目只自报值\n const meta = api.value.levels.flatMap(level => level.items).find(item => item.value === next)\n if (meta)\n service.send({ type: 'ITEM.FOCUS', level: meta.level, value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本条目当下正持有焦点」判定,不按 value 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'ITEM.LOST' })\n })\n}\n\n/** 默认插槽的载荷:级联的展开态、选中态与列数据、多选的可见标签与折起的个数,以及修改它们的方法。 */\nexport type CascaderRootSlotProps = Pick<\n CascaderApi,\n | 'open'\n | 'levels'\n | 'columns'\n | 'value'\n | 'valuePath'\n | 'activePath'\n | 'focusedPath'\n | 'displayText'\n | 'canClear'\n | 'tags'\n | 'overflowCount'\n | 'overflowText'\n | 'isSelected'\n | 'isIndeterminate'\n | 'isActive'\n | 'isVisible'\n | 'setOpen'\n | 'setValue'\n | 'setActivePath'\n | 'select'\n | 'clear'\n | 'deselect'\n>\n\nexport const XhCascaderRoot = defineComponent({\n name: 'XhCascaderRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<CascaderNode[]> },\n /** 取回懒分支(hasChildren 且没给 children)的直接子项;展开路径走到它时自动调用。 */\n loadChildren: { type: Function as PropType<CascaderProps['loadChildren']> },\n value: { type: Array as PropType<CascaderValue> },\n defaultValue: { type: Array as PropType<CascaderValue> },\n name: { type: String },\n form: { type: String },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n expandTrigger: { type: String as PropType<CascaderExpandTrigger> },\n changeOnSelect: Boolean,\n multiple: Boolean,\n /** 多选标签最多显示的数量,其余折进 +N;默认 3。 */\n maxTagCount: { type: Number },\n searchable: { type: Boolean, default: undefined },\n /** 自定义搜索匹配;缺省为整条路径的显示名连缀后大小写不敏感包含。 */\n filter: { type: Function as PropType<CascaderProps['filter']> },\n cascade: Boolean,\n checkedStrategy: { type: String as PropType<CascaderProps['checkedStrategy']> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n loading: Boolean,\n translations: { type: Object as PropType<Partial<CascaderTranslations>> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placeholder: { type: String },\n separator: { type: String },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值;选中值恒为路径数组,单选时长度 ≤ 1\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<CascaderProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<CascaderProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<CascaderProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<CascaderProps, 'onOpenChange'>['open']) => true,\n 'branch-load-start': (_details: PayloadOf<CascaderProps, 'onBranchLoadStart'>) => true,\n 'branch-load': (_details: PayloadOf<CascaderProps, 'onBranchLoad'>) => true,\n 'branch-load-error': (_details: PayloadOf<CascaderProps, 'onBranchLoadError'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CascaderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: CascaderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: CascaderProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useCascader(withHandlers(withXhConfig('cascader', useFormControlProps(props)), { onClear: () => emit('clear') }) as CascaderProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n onBranchLoadStart: details => emit('branch-load-start', details),\n onBranchLoad: details => emit('branch-load', details),\n onBranchLoadError: details => emit('branch-load-error', details),\n })\n provideCascader(ctx)\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, [slots.default?.({\n open: ctx.api.value.open,\n // levels 每层一列、层内节点各一条目,供作者渲染;columns 只读当前展开的列\n levels: ctx.api.value.levels,\n columns: ctx.api.value.columns,\n value: ctx.api.value.value,\n valuePath: ctx.api.value.valuePath,\n activePath: ctx.api.value.activePath,\n focusedPath: ctx.api.value.focusedPath,\n displayText: ctx.api.value.displayText,\n canClear: ctx.api.value.canClear,\n tags: ctx.api.value.tags,\n overflowCount: ctx.api.value.overflowCount,\n overflowText: ctx.api.value.overflowText,\n isSelected: ctx.api.value.isSelected,\n isIndeterminate: ctx.api.value.isIndeterminate,\n isActive: ctx.api.value.isActive,\n isVisible: ctx.api.value.isVisible,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n setActivePath: ctx.api.value.setActivePath,\n select: ctx.api.value.select,\n clear: ctx.api.value.clear,\n deselect: ctx.api.value.deselect,\n }), ...ctx.api.value.value.map(path => h('input', {\n ...ctx.api.value.getHiddenInputProps({ path }) as Record<string, unknown>,\n key: JSON.stringify(path),\n }))])\n },\n})\n\nexport const XhCascaderLabel = defineComponent({\n name: 'XhCascaderLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderControl = defineComponent({\n name: 'XhCascaderControl',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.controlRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhCascaderTrigger = defineComponent({\n name: 'XhCascaderTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useCascaderContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhCascaderValueText = defineComponent({\n name: 'XhCascaderValueText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 有插槽用插槽,否则显示整条路径或 placeholder\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.displayText,\n )\n },\n})\n\nexport const XhCascaderTagList = defineComponent({\n name: 'XhCascaderTagList',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 标签行:可见标签与 +N 那一枚在里面并排;无选中时连接层给 hidden,value-text 回来显示占位文字\n return () => h('span', ctx.api.value.getTagListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签文字所在的块(tag 的 label):截断规则挂在这一层。 */\nexport const XhCascaderTagLabel = defineComponent({\n name: 'XhCascaderTagLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getTagLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 标签内容:只有文字时替它包一层 label:截断规则挂在 label 上,直接展开在 root 上的文字过长会把\n * 删除按钮挤出;作者自己写了节点则原样放行。与 XhTagRoot 同一规则。\n * 库自身填入的文字(+N,没有折叠时是空串)恒包 label,三个适配器渲染出同一棵树。\n */\nfunction tagChildren(content: VNode[] | string | undefined): VNode[] | string | undefined {\n if (typeof content === 'string')\n return [h(XhCascaderTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhCascaderTagLabel, null, () => content)] : content\n}\n\n/** 一条选中路径一个标签,即库内 tag 的 root(data-scope=\"tag\"):语气、尺寸与禁用从级联传下,形态按控件的面派生;触发器内纯展示,触发器外配合 XhCascaderItemDeleteTrigger 可删除。 */\nexport const XhCascaderTag = defineComponent({\n name: 'XhCascaderTag',\n props: {\n /** 它代表哪条选中路径:写路径的比较键,即 tags 里的 key。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n provideCascaderTag({ value: () => props.value })\n return () => h('span', ctx.api.value.getTagProps({ value: props.value }) as Record<string, unknown>, tagChildren(slots.default?.()))\n },\n})\n\n/** 折叠的标签合成的一个标签:同样是 tag 的 root;有插槽时使用插槽,否则显示 +N。没有折叠的标签时连接层写 hidden。 */\nexport const XhCascaderOverflowTag = defineComponent({\n name: 'XhCascaderOverflowTag',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h(\n 'span',\n ctx.api.value.getOverflowTagProps() as Record<string, unknown>,\n tagChildren(slots.default?.() ?? ctx.api.value.overflowText),\n )\n },\n})\n\n/** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger(data-scope=\"tag\"),可及名使用 translations.deleteItem;点按移除所在标签的选中路径。 */\nexport const XhCascaderItemDeleteTrigger = defineComponent({\n name: 'XhCascaderItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const tag = useCascaderTagContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderIndicator = defineComponent({\n name: 'XhCascaderIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getIndicatorProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderClearTrigger = defineComponent({\n name: 'XhCascaderClearTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderPositioner = defineComponent({\n name: 'XhCascaderPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n // 列区的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner。\n // 只摆横的:列多到放不下时整体横向滚动,纵向溢出归每一列自己。\n // 横条的正负按排版方向算,而组件不读计算样式,把 positioner 上那份显式交过去\n const bars = useScrollbars({\n scrollable: () => ctx.contentRef.value,\n axes: ['horizontal'],\n // 条子走浮层 4px 档\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef }, () => [\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 XhCascaderLoading = defineComponent({\n name: 'XhCascaderLoading',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n const unregister = content.registerLoading()\n onBeforeUnmount(unregister)\n // 在途占位:作者没写内容时使用 Cascader 自己的翻译合同。\n return () => h(\n 'div',\n ctx.api.value.getLoadingProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.translations.loading,\n )\n },\n})\n\n/** 放在作者插槽之后挂载;隔着普通元素或业务组件的 Loading 已在 setup 阶段登记。 */\nconst XhCascaderAutoLoading = defineComponent({\n name: 'XhCascaderAutoLoading',\n setup() {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n return () => content.authoredLoadingCount.value > 0\n ? null\n : h('div', {\n ...ctx.api.value.getLoadingProps() as Record<string, unknown>,\n 'data-xh-cascader-auto-loading': '',\n }, ctx.api.value.translations.loading)\n },\n})\n\nexport const XhCascaderContent = defineComponent({\n name: 'XhCascaderContent',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const authoredLoadingCount = ref(0)\n const registerLoading = (): (() => void) => {\n authoredLoadingCount.value += 1\n let active = true\n return () => {\n if (!active)\n return\n active = false\n authoredLoadingCount.value -= 1\n }\n }\n provideCascaderContent({ authoredLoadingCount, registerLoading })\n // 收起时只隐藏不卸载;跨列的键盘导航也在这一层处理\n return () => {\n const api = ctx.api.value\n const children = slots.default?.() ?? []\n return h('div', {\n ...api.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 }, [\n children,\n // 空态占位常挂在列后,露不露面归连接层;empty 插槽可换内容,缺省文案按视图取无匹配或无数据\n h(\n 'div',\n api.getEmptyProps() as Record<string, unknown>,\n slots.empty ? slots.empty() : (api.searching ? api.translations.noMatch : api.translations.empty),\n ),\n h(XhCascaderAutoLoading),\n ])\n }\n },\n})\n\nexport const XhCascaderInput = defineComponent({\n name: 'XhCascaderInput',\n setup() {\n const ctx = useCascaderContext()\n // 搜索框放在 content 顶部;没开 searchable 时连接层给 hidden\n return () => h('input', ctx.api.value.getInputProps() as Record<string, unknown>)\n },\n})\n\n/** item 插槽的载荷:一条搜索候选。 */\nexport interface CascaderSearchListItemSlotProps {\n result: CascaderSearchResult\n}\n\nexport const XhCascaderSearchList = defineComponent({\n name: 'XhCascaderSearchList',\n slots: Object as SlotsType<{\n item?: (props: CascaderSearchListItemSlotProps) => VNode[]\n }>,\n // 根是片段(列表节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列表节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useCascaderContext()\n const searchListRef = ref<HTMLElement | null>(null)\n // 候选列表自己竖滚,条子贴在它的盒子上、紧跟在它后面(与列同一形态:浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => searchListRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 候选换代、列表显隐都会挪动它在壳内的位置:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 候选整组自动铺:整条路径连缀成一行;item 插槽可换内容\n return () => [\n h('div', {\n ...mergeProps(ctx.api.value.getSearchListProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { searchListRef.value = el as HTMLElement },\n }, ctx.api.value.searchResults.map(result =>\n h(\n 'div',\n { ...ctx.api.value.getSearchItemProps({ path: result.path }) as Record<string, unknown>, key: result.key },\n slots.item ? slots.item({ result }) : result.labels.join(' / '),\n ),\n )),\n ...bars.render(),\n ]\n },\n})\n\n/**\n * 懒分支那一列里的三块状态:在途、失败提示与重试钮。只在这一列属于懒分支时铺,露哪一块归连接层;\n * 文案走 translations.loading / branchError / retry。\n */\nfunction renderBranchFeedback(ctx: CascaderContext, level: number): VNode[] {\n const api = ctx.api.value\n if (api.columnLoadState(level) == null)\n return []\n return [\n h('div', { ...api.getBranchLoadingProps({ level }) as Record<string, unknown>, key: 'branch-loading' }, api.translations.loading),\n h('div', { ...api.getBranchErrorProps({ level }) as Record<string, unknown>, key: 'branch-error' }, api.translations.branchError),\n h('button', { ...api.getBranchRetryTriggerProps({ level }) as Record<string, unknown>, key: 'branch-retry-trigger' }, api.translations.retry),\n ]\n}\n\nexport const XhCascaderColumn = defineComponent({\n name: 'XhCascaderColumn',\n props: {\n // 层号,兼收字符串以支持模板里写 level=\"0\"\n level: { type: [Number, String] as PropType<number | string>, required: true },\n },\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n const columnRef = ref<HTMLElement | null>(null)\n // 每列自己竖滚:条子贴在本列的盒子上、紧跟在它后面;content 那条横的归浮层壳\n const bars = useScrollbars({\n scrollable: () => columnRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 展开路径一变,左边的列换内容、本列在壳内的位置跟着挪:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 展开路径变短时本列收起,节点常挂不卸载\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ level: Number(props.level) }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n [...(slots.default?.() ?? []), ...renderBranchFeedback(ctx, Number(props.level))],\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhCascaderGroup = defineComponent({\n name: 'XhCascaderGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const group = computed<CascaderGroupProps>(() => ({ value: props.value }))\n provideCascaderGroup({ group })\n // 分组容器:写在列里,条目照常挂在它下面\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderGroupLabel = defineComponent({\n name: 'XhCascaderGroupLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { group } = useCascaderGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItem = defineComponent({\n name: 'XhCascaderItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const item = computed<CascaderItemProps>(() => ({ value: props.value }))\n provideCascaderItem({ item })\n const el = ref<HTMLElement | null>(null)\n reportItemFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhCascaderItemText = defineComponent({\n name: 'XhCascaderItemText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */\nexport const XhCascaderItemDescription = defineComponent({\n name: 'XhCascaderItemDescription',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行尾的作者内容(计数、徽标) */\nexport const XhCascaderItemSuffix = defineComponent({\n name: 'XhCascaderItemSuffix',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemSuffixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItemIndicator = defineComponent({\n name: 'XhCascaderItemIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderFooter = defineComponent({\n name: 'XhCascaderFooter',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 浮层底部的操作区:写在 content 里、与列并列,横跨全部列;\n // 列表框语义在每一列上,放在这里的按钮既不进列的拥有关系,也走不到方向键\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"cascader.js","names":[],"sources":["../../../src/components/cascader/cascader.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// 提供 cascader 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n CascaderApi,\n CascaderExpandTrigger,\n CascaderGroupProps,\n CascaderItemProps,\n CascaderNode,\n CascaderSchema,\n CascaderSearchResult,\n CascaderTranslations,\n CascaderValue,\n} from '@xihan-ui/headless'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { CascaderContext } from './use-cascader'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, onUpdated, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotIsPlainText } from '../../runtime/slot-content'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideCascader, provideCascaderContent, provideCascaderGroup, provideCascaderItem, provideCascaderTag, useCascaderContentContext, useCascaderContext, useCascaderGroupContext, useCascaderItemContext, useCascaderTagContext } from './context'\nimport { useCascader } from './use-cascader'\n\ntype CascaderProps = CascaderSchema['props']\n\n/** 本条目持有焦点时,value 变更重新报告焦点条目,卸载时上报焦点丢失 */\nfunction reportItemFocus(\n ctx: CascaderContext,\n el: Ref<HTMLElement | null>,\n value: () => string,\n): void {\n watch(value, (next, prev) => {\n if (next === prev)\n return\n const { service, api } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (!el.value || service.scope.getActiveElement() !== el.value)\n return\n // 层号回 collection 里查,条目只自报值\n const meta = api.value.levels.flatMap(level => level.items).find(item => item.value === next)\n if (meta)\n service.send({ type: 'ITEM.FOCUS', level: meta.level, value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本条目当下正持有焦点」判定,不按 value 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'ITEM.LOST' })\n })\n}\n\n/** 默认插槽的载荷:级联的展开态、选中态与列数据、多选的可见标签与折起的个数,以及修改它们的方法。 */\nexport type CascaderRootSlotProps = Pick<\n CascaderApi,\n | 'open'\n | 'levels'\n | 'columns'\n | 'value'\n | 'valuePath'\n | 'activePath'\n | 'focusedPath'\n | 'displayText'\n | 'canClear'\n | 'tags'\n | 'overflowCount'\n | 'overflowText'\n | 'isSelected'\n | 'isIndeterminate'\n | 'isActive'\n | 'isVisible'\n | 'setOpen'\n | 'setValue'\n | 'setActivePath'\n | 'select'\n | 'clear'\n | 'deselect'\n>\n\nexport const XhCascaderRoot = defineComponent({\n name: 'XhCascaderRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<CascaderNode[]> },\n /** 取回懒分支(hasChildren 且没给 children)的直接子项;展开路径走到它时自动调用。 */\n loadChildren: { type: Function as PropType<CascaderProps['loadChildren']> },\n value: { type: Array as PropType<CascaderValue> },\n defaultValue: { type: Array as PropType<CascaderValue> },\n name: { type: String },\n form: { type: String },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n expandTrigger: { type: String as PropType<CascaderExpandTrigger> },\n changeOnSelect: Boolean,\n multiple: Boolean,\n /** 多选标签最多显示的数量,其余折进 +N;默认 3。 */\n maxTagCount: { type: Number },\n searchable: { type: Boolean, default: undefined },\n /** 自定义搜索匹配;缺省为整条路径的显示名连缀后大小写不敏感包含。 */\n filter: { type: Function as PropType<CascaderProps['filter']> },\n cascade: Boolean,\n checkedStrategy: { type: String as PropType<CascaderProps['checkedStrategy']> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n loading: Boolean,\n translations: { type: Object as PropType<Partial<CascaderTranslations>> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placeholder: { type: String },\n separator: { type: String },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值;选中值恒为路径数组,单选时长度 ≤ 1\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<CascaderProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<CascaderProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<CascaderProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<CascaderProps, 'onOpenChange'>['open']) => true,\n 'branch-load-start': (_details: PayloadOf<CascaderProps, 'onBranchLoadStart'>) => true,\n 'branch-load': (_details: PayloadOf<CascaderProps, 'onBranchLoad'>) => true,\n 'branch-load-error': (_details: PayloadOf<CascaderProps, 'onBranchLoadError'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CascaderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: CascaderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: CascaderProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useCascader(withHandlers(withXhConfig('cascader', useFormControlProps(props)), { onClear: () => emit('clear') }) as CascaderProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n onBranchLoadStart: details => emit('branch-load-start', details),\n onBranchLoad: details => emit('branch-load', details),\n onBranchLoadError: details => emit('branch-load-error', details),\n })\n provideCascader(ctx)\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, [slots.default?.({\n open: ctx.api.value.open,\n // levels 每层一列、层内节点各一条目,供作者渲染;columns 只读当前展开的列\n levels: ctx.api.value.levels,\n columns: ctx.api.value.columns,\n value: ctx.api.value.value,\n valuePath: ctx.api.value.valuePath,\n activePath: ctx.api.value.activePath,\n focusedPath: ctx.api.value.focusedPath,\n displayText: ctx.api.value.displayText,\n canClear: ctx.api.value.canClear,\n tags: ctx.api.value.tags,\n overflowCount: ctx.api.value.overflowCount,\n overflowText: ctx.api.value.overflowText,\n isSelected: ctx.api.value.isSelected,\n isIndeterminate: ctx.api.value.isIndeterminate,\n isActive: ctx.api.value.isActive,\n isVisible: ctx.api.value.isVisible,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n setActivePath: ctx.api.value.setActivePath,\n select: ctx.api.value.select,\n clear: ctx.api.value.clear,\n deselect: ctx.api.value.deselect,\n }), ...ctx.api.value.value.map(path => h('input', {\n ...ctx.api.value.getHiddenInputProps({ path }) as Record<string, unknown>,\n key: JSON.stringify(path),\n }))])\n },\n})\n\nexport const XhCascaderLabel = defineComponent({\n name: 'XhCascaderLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderControl = defineComponent({\n name: 'XhCascaderControl',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.controlRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhCascaderTrigger = defineComponent({\n name: 'XhCascaderTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useCascaderContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhCascaderValueText = defineComponent({\n name: 'XhCascaderValueText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 有插槽用插槽,否则显示整条路径或 placeholder\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.displayText,\n )\n },\n})\n\nexport const XhCascaderTagList = defineComponent({\n name: 'XhCascaderTagList',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 标签行:可见标签与 +N 那一枚在里面并排;无选中时连接层给 hidden,value-text 回来显示占位文字\n return () => h('span', ctx.api.value.getTagListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签文字所在的块(tag 的 label):截断规则挂在这一层。 */\nexport const XhCascaderTagLabel = defineComponent({\n name: 'XhCascaderTagLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getTagLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 标签内容:只有文字时替它包一层 label:截断规则挂在 label 上,直接展开在 root 上的文字过长会把\n * 删除按钮挤出;作者自己写了节点则原样放行。与 XhTagRoot 同一规则。\n * 库自身填入的文字(+N,没有折叠时是空串)恒包 label,三个适配器渲染出同一棵树。\n */\nfunction tagChildren(content: VNode[] | string | undefined): VNode[] | string | undefined {\n if (typeof content === 'string')\n return [h(XhCascaderTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhCascaderTagLabel, null, () => content)] : content\n}\n\n/** 一条选中路径一个标签,即库内 tag 的 root(data-scope=\"tag\"):语气、尺寸与禁用从级联传下,形态按控件的面派生;触发器内纯展示,触发器外配合 XhCascaderItemDeleteTrigger 可删除。 */\nexport const XhCascaderTag = defineComponent({\n name: 'XhCascaderTag',\n props: {\n /** 它代表哪条选中路径:写路径的比较键,即 tags 里的 key。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n provideCascaderTag({ value: () => props.value })\n return () => h('span', ctx.api.value.getTagProps({ value: props.value }) as Record<string, unknown>, tagChildren(slots.default?.()))\n },\n})\n\n/** 折叠的标签合成的一个标签:同样是 tag 的 root;有插槽时使用插槽,否则显示 +N。没有折叠的标签时连接层写 hidden。 */\nexport const XhCascaderOverflowTag = defineComponent({\n name: 'XhCascaderOverflowTag',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h(\n 'span',\n ctx.api.value.getOverflowTagProps() as Record<string, unknown>,\n tagChildren(slots.default?.() ?? ctx.api.value.overflowText),\n )\n },\n})\n\n/** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger(data-scope=\"tag\"),可及名使用 translations.deleteItem;点按移除所在标签的选中路径。 */\nexport const XhCascaderItemDeleteTrigger = defineComponent({\n name: 'XhCascaderItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const tag = useCascaderTagContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderIndicator = defineComponent({\n name: 'XhCascaderIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getIndicatorProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderClearTrigger = defineComponent({\n name: 'XhCascaderClearTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderPositioner = defineComponent({\n name: 'XhCascaderPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n // 列区的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner。\n // 只摆横的:列多到放不下时整体横向滚动,纵向溢出归每一列自己。\n // 横条的正负按排版方向算,而组件不读计算样式,把 positioner 上那份显式交过去\n const bars = useScrollbars({\n scrollable: () => ctx.contentRef.value,\n axes: ['horizontal'],\n // 条子走浮层 4px 档\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef, present: ctx.visible.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 XhCascaderLoading = defineComponent({\n name: 'XhCascaderLoading',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n const unregister = content.registerLoading()\n onBeforeUnmount(unregister)\n // 在途占位:作者没写内容时使用 Cascader 自己的翻译合同。\n return () => h(\n 'div',\n ctx.api.value.getLoadingProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.translations.loading,\n )\n },\n})\n\n/** 放在作者插槽之后挂载;隔着普通元素或业务组件的 Loading 已在 setup 阶段登记。 */\nconst XhCascaderAutoLoading = defineComponent({\n name: 'XhCascaderAutoLoading',\n setup() {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n return () => content.authoredLoadingCount.value > 0\n ? null\n : h('div', {\n ...ctx.api.value.getLoadingProps() as Record<string, unknown>,\n 'data-xh-cascader-auto-loading': '',\n }, ctx.api.value.translations.loading)\n },\n})\n\nexport const XhCascaderContent = defineComponent({\n name: 'XhCascaderContent',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const authoredLoadingCount = ref(0)\n const registerLoading = (): (() => void) => {\n authoredLoadingCount.value += 1\n let active = true\n return () => {\n if (!active)\n return\n active = false\n authoredLoadingCount.value -= 1\n }\n }\n provideCascaderContent({ authoredLoadingCount, registerLoading })\n // 收起时只隐藏不卸载;跨列的键盘导航也在这一层处理\n return () => {\n const api = ctx.api.value\n const children = slots.default?.() ?? []\n return h('div', {\n ...api.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 }, [\n children,\n // 空态占位常挂在列后,露不露面归连接层;empty 插槽可换内容,缺省文案按视图取无匹配或无数据\n h(\n 'div',\n api.getEmptyProps() as Record<string, unknown>,\n slots.empty ? slots.empty() : (api.searching ? api.translations.noMatch : api.translations.empty),\n ),\n h(XhCascaderAutoLoading),\n ])\n }\n },\n})\n\nexport const XhCascaderInput = defineComponent({\n name: 'XhCascaderInput',\n setup() {\n const ctx = useCascaderContext()\n // 搜索框放在 content 顶部;没开 searchable 时连接层给 hidden\n return () => h('input', ctx.api.value.getInputProps() as Record<string, unknown>)\n },\n})\n\n/** item 插槽的载荷:一条搜索候选。 */\nexport interface CascaderSearchListItemSlotProps {\n result: CascaderSearchResult\n}\n\nexport const XhCascaderSearchList = defineComponent({\n name: 'XhCascaderSearchList',\n slots: Object as SlotsType<{\n item?: (props: CascaderSearchListItemSlotProps) => VNode[]\n }>,\n // 根是片段(列表节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列表节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useCascaderContext()\n const searchListRef = ref<HTMLElement | null>(null)\n // 候选列表自己竖滚,条子贴在它的盒子上、紧跟在它后面(与列同一形态:浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => searchListRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 候选换代、列表显隐都会挪动它在壳内的位置:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 候选整组自动铺:整条路径连缀成一行;item 插槽可换内容\n return () => [\n h('div', {\n ...mergeProps(ctx.api.value.getSearchListProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { searchListRef.value = el as HTMLElement },\n }, ctx.api.value.searchResults.map(result =>\n h(\n 'div',\n { ...ctx.api.value.getSearchItemProps({ path: result.path }) as Record<string, unknown>, key: result.key },\n slots.item ? slots.item({ result }) : result.labels.join(' / '),\n ),\n )),\n ...bars.render(),\n ]\n },\n})\n\n/**\n * 懒分支那一列里的三块状态:在途、失败提示与重试钮。只在这一列属于懒分支时铺,露哪一块归连接层;\n * 文案走 translations.loading / branchError / retry。\n */\nfunction renderBranchFeedback(ctx: CascaderContext, level: number): VNode[] {\n const api = ctx.api.value\n if (api.columnLoadState(level) == null)\n return []\n return [\n h('div', { ...api.getBranchLoadingProps({ level }) as Record<string, unknown>, key: 'branch-loading' }, api.translations.loading),\n h('div', { ...api.getBranchErrorProps({ level }) as Record<string, unknown>, key: 'branch-error' }, api.translations.branchError),\n h('button', { ...api.getBranchRetryTriggerProps({ level }) as Record<string, unknown>, key: 'branch-retry-trigger' }, api.translations.retry),\n ]\n}\n\nexport const XhCascaderColumn = defineComponent({\n name: 'XhCascaderColumn',\n props: {\n // 层号,兼收字符串以支持模板里写 level=\"0\"\n level: { type: [Number, String] as PropType<number | string>, required: true },\n },\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n const columnRef = ref<HTMLElement | null>(null)\n // 每列自己竖滚:条子贴在本列的盒子上、紧跟在它后面;content 那条横的归浮层壳\n const bars = useScrollbars({\n scrollable: () => columnRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 展开路径一变,左边的列换内容、本列在壳内的位置跟着挪:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 展开路径变短时本列收起,节点常挂不卸载\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ level: Number(props.level) }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n [...(slots.default?.() ?? []), ...renderBranchFeedback(ctx, Number(props.level))],\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhCascaderGroup = defineComponent({\n name: 'XhCascaderGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const group = computed<CascaderGroupProps>(() => ({ value: props.value }))\n provideCascaderGroup({ group })\n // 分组容器:写在列里,条目照常挂在它下面\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderGroupLabel = defineComponent({\n name: 'XhCascaderGroupLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { group } = useCascaderGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItem = defineComponent({\n name: 'XhCascaderItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const item = computed<CascaderItemProps>(() => ({ value: props.value }))\n provideCascaderItem({ item })\n const el = ref<HTMLElement | null>(null)\n reportItemFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhCascaderItemText = defineComponent({\n name: 'XhCascaderItemText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */\nexport const XhCascaderItemDescription = defineComponent({\n name: 'XhCascaderItemDescription',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行尾的作者内容(计数、徽标) */\nexport const XhCascaderItemSuffix = defineComponent({\n name: 'XhCascaderItemSuffix',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemSuffixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItemIndicator = defineComponent({\n name: 'XhCascaderItemIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderFooter = defineComponent({\n name: 'XhCascaderFooter',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 浮层底部的操作区:写在 content 里、与列并列,横跨全部列;\n // 列表框语义在每一列上,放在这里的按钮既不进列的拥有关系,也走不到方向键\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"citation.d.ts","names":[],"sources":["../../../src/components/citation/citation.ts"],"mappings":";;;;;KAmBK,gBAAgB;cAER,8BAAc,8BAAA;;IAGG,MAAA,SAAS;;;IACD,MAAA;;;IACO,MAAA;;;;;;;;;;;;;IAKlB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;IAIX,MAAA,SAAS;;;;;;IAEN,MAAA,SAAS;;;;;EAGN,yBAAA,UAAA,UAAU;EACR,0BAAA;EACX,gBAAA,UAAA,UAAU;EACb,gBAAA;EACG,gBAAA,UAAA,UAAU;;;IAtBV,MAAA,SAAS;;;IACD,MAAA;;;IACO,MAAA;;;;;;;;;;;;;IAKlB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;IAIX,MAAA,SAAS;;;;;;IAEN,MAAA,SAAS;;;;;;;;;;;;;qCA4B3C;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAMzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,8BAAA;;;;;IAME,MAAA;;;;;;;;;;;;IAAA,MAAA;;;;;;;qCAS9B;;;;;cAMW,oCAAoB,8BAAA;;;IAIA,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;MAgBxC,oDAAA;cAEW,iCAAiB,8BAAA;;;;;;;;;;;;;;MAgB5B,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAeW,qCAAqB,0BAVzB,iCAAK,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAiBD,oCAAoB,0BAjBxB,iCAAK,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAwBD,gCAAgB,8BAAA;;;;;;;;;;;;;;;;qCAc3B;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAWzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"citation.d.ts","names":[],"sources":["../../../src/components/citation/citation.ts"],"mappings":";;;;;KAmBK,gBAAgB;cAER,8BAAc,8BAAA;;IAGG,MAAA,SAAS;;;IACD,MAAA;;;IACO,MAAA;;;;;;;;;;;;;IAKlB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;IAIX,MAAA,SAAS;;;;;;IAEN,MAAA,SAAS;;;;;EAGN,yBAAA,UAAA,UAAU;EACR,0BAAA;EACX,gBAAA,UAAA,UAAU;EACb,gBAAA;EACG,gBAAA,UAAA,UAAU;;;IAtBV,MAAA,SAAS;;;IACD,MAAA;;;IACO,MAAA;;;;;;;;;;;;;IAKlB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;IAIX,MAAA,SAAS;;;;;;IAEN,MAAA,SAAS;;;;;;;;;;;;;qCA4B3C;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAMzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,8BAAA;;;;;IAME,MAAA;;;;;;;;;;;;IAAA,MAAA;;;;;;;qCAS9B;;;;;cAMW,oCAAoB,8BAAA;;;IAIA,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;MAkBxC,oDAAA;cAEW,iCAAiB,8BAAA;;;;;;;;;;;;;;MAgB5B,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAeW,qCAAqB,0BAVzB,iCAAK,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAiBD,oCAAoB,0BAjBxB,iCAAK,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAwBD,gCAAgB,8BAAA;;;;;;;;;;;;;;;;qCAc3B;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAWzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}