@xihan-ui/vue 3.0.0 → 3.1.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 (168) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +1 -1
  3. package/dist/components/cascader/cascader.d.ts +2 -0
  4. package/dist/components/cascader/cascader.d.ts.map +1 -1
  5. package/dist/components/cascader/cascader.js +3 -1
  6. package/dist/components/cascader/cascader.js.map +1 -1
  7. package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
  8. package/dist/components/checkbox-group/checkbox-group.js +30 -11
  9. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  10. package/dist/components/checkbox-group/use-checkbox-group.d.ts +6 -1
  11. package/dist/components/checkbox-group/use-checkbox-group.d.ts.map +1 -1
  12. package/dist/components/checkbox-group/use-checkbox-group.js +7 -3
  13. package/dist/components/checkbox-group/use-checkbox-group.js.map +1 -1
  14. package/dist/components/color-field/color-field.d.ts +2 -0
  15. package/dist/components/color-field/color-field.d.ts.map +1 -1
  16. package/dist/components/color-field/color-field.js +3 -1
  17. package/dist/components/color-field/color-field.js.map +1 -1
  18. package/dist/components/color-picker/color-picker.d.ts +76 -9
  19. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  20. package/dist/components/color-picker/color-picker.js +87 -6
  21. package/dist/components/color-picker/color-picker.js.map +1 -1
  22. package/dist/components/color-picker/context.js +10 -1
  23. package/dist/components/color-picker/context.js.map +1 -1
  24. package/dist/components/color-picker/use-color-picker.js +14 -4
  25. package/dist/components/color-picker/use-color-picker.js.map +1 -1
  26. package/dist/components/color-swatch-picker/color-swatch-picker.d.ts.map +1 -1
  27. package/dist/components/color-swatch-picker/color-swatch-picker.js +21 -4
  28. package/dist/components/color-swatch-picker/color-swatch-picker.js.map +1 -1
  29. package/dist/components/color-swatch-picker/use-color-swatch-picker.d.ts +6 -1
  30. package/dist/components/color-swatch-picker/use-color-swatch-picker.d.ts.map +1 -1
  31. package/dist/components/color-swatch-picker/use-color-swatch-picker.js +7 -3
  32. package/dist/components/color-swatch-picker/use-color-swatch-picker.js.map +1 -1
  33. package/dist/components/combobox/combobox.d.ts +2 -0
  34. package/dist/components/combobox/combobox.d.ts.map +1 -1
  35. package/dist/components/combobox/combobox.js +3 -1
  36. package/dist/components/combobox/combobox.js.map +1 -1
  37. package/dist/components/command/command.d.ts +3 -3
  38. package/dist/components/context-menu/context-menu.d.ts +9 -1
  39. package/dist/components/context-menu/context-menu.d.ts.map +1 -1
  40. package/dist/components/context-menu/context-menu.js +9 -0
  41. package/dist/components/context-menu/context-menu.js.map +1 -1
  42. package/dist/components/date-field/date-field.d.ts +6 -2
  43. package/dist/components/date-field/date-field.d.ts.map +1 -1
  44. package/dist/components/date-field/date-field.js +5 -2
  45. package/dist/components/date-field/date-field.js.map +1 -1
  46. package/dist/components/date-picker/context.js +10 -1
  47. package/dist/components/date-picker/context.js.map +1 -1
  48. package/dist/components/date-picker/date-picker.d.ts +58 -3
  49. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  50. package/dist/components/date-picker/date-picker.js +76 -5
  51. package/dist/components/date-picker/date-picker.js.map +1 -1
  52. package/dist/components/date-range-picker/date-range-picker.d.ts +27 -1
  53. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  54. package/dist/components/date-range-picker/date-range-picker.js +9 -1
  55. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  56. package/dist/components/dialog/dialog.d.ts +1 -1
  57. package/dist/components/drawer/drawer.d.ts +1 -1
  58. package/dist/components/field/context.d.ts +6 -1
  59. package/dist/components/field/context.d.ts.map +1 -1
  60. package/dist/components/field/context.js +10 -1
  61. package/dist/components/field/context.js.map +1 -1
  62. package/dist/components/field/field.d.ts +9 -1
  63. package/dist/components/field/field.d.ts.map +1 -1
  64. package/dist/components/field/field.js +14 -2
  65. package/dist/components/field/field.js.map +1 -1
  66. package/dist/components/field/use-field-control.d.ts +8 -1
  67. package/dist/components/field/use-field-control.d.ts.map +1 -1
  68. package/dist/components/field/use-field-control.js +14 -1
  69. package/dist/components/field/use-field-control.js.map +1 -1
  70. package/dist/components/file-upload/file-upload.d.ts +2 -0
  71. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  72. package/dist/components/file-upload/file-upload.js +3 -1
  73. package/dist/components/file-upload/file-upload.js.map +1 -1
  74. package/dist/components/float-button/float-button.d.ts +26 -1
  75. package/dist/components/float-button/float-button.d.ts.map +1 -1
  76. package/dist/components/float-button/float-button.js +17 -5
  77. package/dist/components/float-button/float-button.js.map +1 -1
  78. package/dist/components/float-button/use-float-button.js +7 -1
  79. package/dist/components/float-button/use-float-button.js.map +1 -1
  80. package/dist/components/form/context.js +5 -1
  81. package/dist/components/form/context.js.map +1 -1
  82. package/dist/components/form/use-form-control.js +1 -1
  83. package/dist/components/markdown-stream/markdown-stream.d.ts +1 -1
  84. package/dist/components/menu/menu.js +29 -1
  85. package/dist/components/menu/menu.js.map +1 -1
  86. package/dist/components/menubar/menubar.d.ts +9 -1
  87. package/dist/components/menubar/menubar.d.ts.map +1 -1
  88. package/dist/components/menubar/menubar.js +13 -0
  89. package/dist/components/menubar/menubar.js.map +1 -1
  90. package/dist/components/pin-input/pin-input.d.ts.map +1 -1
  91. package/dist/components/pin-input/pin-input.js +7 -1
  92. package/dist/components/pin-input/pin-input.js.map +1 -1
  93. package/dist/components/popconfirm/popconfirm.d.ts +20 -1
  94. package/dist/components/popconfirm/popconfirm.d.ts.map +1 -1
  95. package/dist/components/popconfirm/popconfirm.js +7 -0
  96. package/dist/components/popconfirm/popconfirm.js.map +1 -1
  97. package/dist/components/popconfirm/use-popconfirm.js +2 -0
  98. package/dist/components/popconfirm/use-popconfirm.js.map +1 -1
  99. package/dist/components/popover/popover.d.ts +1 -1
  100. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  101. package/dist/components/radio-group/radio-group.js +25 -6
  102. package/dist/components/radio-group/radio-group.js.map +1 -1
  103. package/dist/components/radio-group/use-radio-group.d.ts +5 -0
  104. package/dist/components/radio-group/use-radio-group.d.ts.map +1 -1
  105. package/dist/components/radio-group/use-radio-group.js +4 -1
  106. package/dist/components/radio-group/use-radio-group.js.map +1 -1
  107. package/dist/components/rating/rating.d.ts.map +1 -1
  108. package/dist/components/rating/rating.js +7 -1
  109. package/dist/components/rating/rating.js.map +1 -1
  110. package/dist/components/reasoning/reasoning.d.ts +1 -1
  111. package/dist/components/select/select.d.ts +2 -0
  112. package/dist/components/select/select.d.ts.map +1 -1
  113. package/dist/components/select/select.js +3 -1
  114. package/dist/components/select/select.js.map +1 -1
  115. package/dist/components/signature-pad/signature-pad.d.ts +2 -0
  116. package/dist/components/signature-pad/signature-pad.d.ts.map +1 -1
  117. package/dist/components/signature-pad/signature-pad.js +3 -1
  118. package/dist/components/signature-pad/signature-pad.js.map +1 -1
  119. package/dist/components/slider/slider.d.ts.map +1 -1
  120. package/dist/components/slider/slider.js +7 -1
  121. package/dist/components/slider/slider.js.map +1 -1
  122. package/dist/components/sortable/sortable.d.ts +1 -1
  123. package/dist/components/table/table.d.ts +2 -2
  124. package/dist/components/table/table.d.ts.map +1 -1
  125. package/dist/components/tags-input/tags-input.d.ts +2 -0
  126. package/dist/components/tags-input/tags-input.d.ts.map +1 -1
  127. package/dist/components/tags-input/tags-input.js +3 -1
  128. package/dist/components/tags-input/tags-input.js.map +1 -1
  129. package/dist/components/text-field/text-field.d.ts +2 -0
  130. package/dist/components/text-field/text-field.d.ts.map +1 -1
  131. package/dist/components/text-field/text-field.js +3 -1
  132. package/dist/components/text-field/text-field.js.map +1 -1
  133. package/dist/components/time-field/time-field.d.ts +2 -0
  134. package/dist/components/time-field/time-field.d.ts.map +1 -1
  135. package/dist/components/time-field/time-field.js +3 -1
  136. package/dist/components/time-field/time-field.js.map +1 -1
  137. package/dist/components/time-picker/context.js +10 -1
  138. package/dist/components/time-picker/context.js.map +1 -1
  139. package/dist/components/time-picker/time-picker.d.ts +78 -9
  140. package/dist/components/time-picker/time-picker.d.ts.map +1 -1
  141. package/dist/components/time-picker/time-picker.js +89 -8
  142. package/dist/components/time-picker/time-picker.js.map +1 -1
  143. package/dist/components/time-range-picker/time-range-picker.d.ts +2 -0
  144. package/dist/components/time-range-picker/time-range-picker.d.ts.map +1 -1
  145. package/dist/components/time-range-picker/time-range-picker.js +3 -1
  146. package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
  147. package/dist/components/toggle-group/toggle-group.d.ts.map +1 -1
  148. package/dist/components/toggle-group/toggle-group.js +7 -1
  149. package/dist/components/toggle-group/toggle-group.js.map +1 -1
  150. package/dist/components/tour/tour.d.ts +1 -1
  151. package/dist/components/tree/tree.d.ts +2 -2
  152. package/dist/components/tree/tree.js +1 -1
  153. package/dist/components/tree/tree.js.map +1 -1
  154. package/dist/components/tree-select/tree-select.d.ts +2 -0
  155. package/dist/components/tree-select/tree-select.d.ts.map +1 -1
  156. package/dist/components/tree-select/tree-select.js +3 -1
  157. package/dist/components/tree-select/tree-select.js.map +1 -1
  158. package/dist/components/truncate/truncate.d.ts.map +1 -1
  159. package/dist/components/truncate/truncate.js +4 -8
  160. package/dist/components/truncate/truncate.js.map +1 -1
  161. package/dist/index.d.ts +7 -7
  162. package/dist/index.js +8 -8
  163. package/dist/package.js +1 -1
  164. package/dist/runtime/portal.js +2 -0
  165. package/dist/runtime/portal.js.map +1 -1
  166. package/dist/runtime/with-handlers.js +25 -0
  167. package/dist/runtime/with-handlers.js.map +1 -0
  168. package/package.json +15 -15
package/CHANGELOG.md CHANGED
@@ -1,5 +1,64 @@
1
1
  # @xihan-ui/vue
2
2
 
3
+ ## 3.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 525029a: 带清空钮的 15 个组件统一新增清空事件:TextField、ColorField、Select、Combobox、Cascader、TreeSelect、TagsInput、DateField、DatePicker、DateRangePicker、TimeField、TimePicker、TimeRangePicker、FileUpload、SignaturePad。用户按清空钮(`clear-trigger`)清掉了值时,先发值变化、再发清空:headless 为 `onClear`,Vue 为 `@clear`,React 为 `onClear`,Web Components 派发 `clear` 事件。程序化的 `clear()` 与 Escape 清空不发,列表或画板本来就空时按清空钮是空操作,也不发。此前只能从值变为空推断清空,分不出是按了清空钮还是删光了字。
8
+ - b96f8ac: ColorPicker 的值改为恒为颜色串数组,并支持多选。
9
+
10
+ - **破坏**:`onValueChange` / `value-change` 的 `value`、Vue `update:value`、`api.value` 由字符串改为 `string[]`:单选恒为一项;`setValue` 接收数组。宿主写入的 `value` / `defaultValue` 仍可写裸串,按一项处理。工作色(触发钮色块与值文字显示的那个)改由新增的 `api.color` 读出。迁移:读值处取 `value[0]`,写值处包一层数组。
11
+ - 新增 `selectionMode="multiple"`:浮层里调出的工作色是草稿,按新部件 `confirm-trigger`(`XhColorPickerConfirmTrigger`,文字由作者写)收进值,浮层不收;预设色板点一下切换选中;`maxSelected` 限制个数;同一个颜色按颜色比较只收一份。
12
+ - 多选的选中值在输入行里排成标签:新增 `tag-list` 部件与 `XhColorPickerTagList` / `XhColorPickerTag` / `XhColorPickerTagLabel` / `XhColorPickerOverflowTag` / `XhColorPickerItemDeleteTrigger`,与 Select 多选同一套库内标签,每枚前一个该颜色的色点;值文字收起,触发钮只留色块并成为键盘入口(退格摘掉最后一个);标签不截短、放不下折行,超过 `maxTagCount`(默认 3)折进 +N;`translations` 新增 `deleteItem` / `overflowTag`;表单一个选中值一份同名隐藏输入。
13
+
14
+ - 570af4d: DatePicker 多选(`selectionMode="multiple"`)的选中值在输入行里排成标签:新增 `tag-list` 部件与 `XhDatePickerTagList` / `XhDatePickerTag` / `XhDatePickerTagLabel` / `XhDatePickerOverflowTag` / `XhDatePickerItemDeleteTrigger`(Vue / React 的标签行不写子节点即按 `tags` 铺好;Web Components 按 `tags` 渲染 `tag` 节点),与 Select 多选同一套库内标签。段位在多选时收起,日历钮常驻并成为键盘入口:退格摘掉最后一个、点标签上的叉摘掉那一个;超过新增的 `maxTagCount`(默认 3)的折进 +N,`translations` 新增 `deleteItem` / `overflowTag`;没有选中时整条 `placeholder` 落在标签行上;表单一个选中值一份同名隐藏输入(`field.getHiddenInputProps({ value })`)。此前多选时输入行只显示、只编辑第一个日期,隐藏输入也只提交第一个。
15
+ - 9ba6c54: DateField / DatePicker 的 `placeholder` 接受字符串:一段都没填、焦点也不在段上时,输入行显示这句整条占位(「请选择生效时间」),段位与分隔符淡出让位,焦点一进到段上就换回 yyyy / mm / dd 段位;给对象仍是逐段的占位串。DatePicker 此前不转发 `placeholder`,现在两种写法都转给内嵌的分段输入。DateRangePicker 新增 `startPlaceholder` / `endPlaceholder`(两组各自的整条占位)与两端共用的逐段 `placeholder`。整条占位以段位组上的 `data-placeholder-shown` 与 `data-placeholder-text` 表出,由皮肤用生成内容画,前景走新增的 `--xh-date-picker-placeholder-fg` / `--xh-date-range-picker-placeholder-fg`(DateField 沿用 `--xh-date-field-placeholder-fg`);headless 新导出类型 `DateSegmentPlaceholders`。
16
+ - c8b910e: 新增字段边界 `XhFieldBoundary`(Web Components 为 `display: contents` 的 `<xh-field-boundary>`):子树里的库内控件不再继承外层字段的标签、说明、禁用 / 只读 / 必填 / 无效与控件 id,表单字段组也一并断开。组合控件把内嵌的搜索框、筛选框包进来,它们就不会被读成外层字段的名字,两个封装同处一个字段时也不会拿到同一个 id。Vue / React 的浮层内容经 Portal 搬到落点后自动断开,与 Web Components 物理搬迁后的行为一致;Vue 另导出 `clearFieldContext()` 供组合式封装在 setup 里断开。
17
+ - f195f2d: 组类控件直接放进表单字段(不经 `XhFieldControl`)也接上字段的标题与说明:单选组、复选框组、色板选择、切换按钮组、评分、滑块、分格输入把字段的标题并进焦点宿主的名字链(组根、星组或拇指),说明与错误文案进描述链,读屏进组时一起念出;校验、必填与只读仍按字段状态由组件自己投影(`role=group` 不接受 `aria-invalid` / `aria-required`)。新增 `useFieldGroupWiring` 供组类封装只取字段的描述链。
18
+ - df5d988: FloatButton 支持拖动与贴边:`draggable`(Web Components 为 `button-draggable`,避开 HTML 全局属性 `draggable`)打开后可按住触发器拖到别处,移动过激活距离才跟手,起拖时展开的动作组先收起、拖完补派的点击不开合;松手按 `snap` 贴边(`inline` 缺省贴左右两边里近的那条、`block` 贴上下、`nearest` 贴四边里最近的、`none` 停在放手处),甩一下贴到甩去的那一边,弹簧带着松手速度落定。新增 `position` / `defaultPosition` / `onPositionChange`(Vue `v-model:position`、Web Components `position-change` 事件):贴边位置写 `{ edge, ratio }`,按比例记、换个视口尺寸照样贴在同一侧,停在一点写像素坐标 `{ x, y }`;不给时仍停在 `placement` 那一角。展开组恒朝页面中间长。
19
+ - 90ead40: Menu、ContextMenu、Menubar 的数据驱动支持多级:节点写 `children`(一组菜单条目)即为子菜单入口,Vue / React 的默认树按 `children` 递归铺出下一层,深度不限,叶子的选中经菜单树汇到根上;Menubar 在条目上读 `children`。入口只能是普通条目,勾选与单选条目带 `children` 直接报错。此前 `MenuNode` 没有 `children`,用数据描述菜单最多两级,路由菜单这类深度不定的场景只能手写 `Sub` 部件。Vue 的 `XhContextMenuSub`(与 React 对齐)与两端的 `XhMenubarSub` 新增 `collection`,供子层取显示文本与禁用。Web Components 由作者写 Light DOM,不读这一项。
20
+ - 97fce6f: TimePicker 的值改为恒为 ISO 时间串数组,并支持多选。
21
+
22
+ - **破坏**:`onValueChange` / `value-change` 的 `value`、Vue `update:value`、`api.value` 由字符串改为 `string[]`:单选至多一项,还没填全时为空数组(此前是空串);`setValue` 接收数组。宿主写入的 `value` / `defaultValue` 仍可写裸串,按一项处理。迁移:读值处取 `value[0] ?? ''`,写值处包一层数组。
23
+ - 新增 `selectionMode="multiple"`:各列拼出的是草稿,按新部件 `confirm-trigger`(`XhTimePickerConfirmTrigger`,文字由作者写)收进值,浮层不收;快捷选项点一下切换选中;`maxSelected` 限制个数。
24
+ - 多选的选中值在输入行里排成标签:新增 `tag-list` 部件与 `XhTimePickerTagList` / `XhTimePickerTag` / `XhTimePickerTagLabel` / `XhTimePickerOverflowTag` / `XhTimePickerItemDeleteTrigger`,与 Select 多选同一套库内标签;段位收起,展开钮常驻并成为键盘入口(退格摘掉最后一个);标签不截短、放不下折行,超过 `maxTagCount`(默认 3)折进 +N;`translations` 新增 `deleteItem` / `overflowTag`;表单一个选中值一份同名隐藏输入。
25
+ - `segment` 不再列为必备部件(`meta.requiredParts` 去掉一条,属放宽):多选时段位收起,Web Components 作者在多选里不写段不再报 `wc.missing-part`,与 DatePicker 同。
26
+
27
+ ### Patch Changes
28
+
29
+ - dbcf03e: CheckboxGroup 与 ColorSwatchPicker 的根只在 `label` 部件真渲染了时才输出 `aria-labelledby`(新增由适配器统计的 `labelled`),不再指向不存在的节点;复选框组没有标题时全选格只念自己的文本,色板选择没有标题时名字交给 `translations.group`。Vue / React 的 `label` 属性在手写选项时同样铺出标题。
30
+ - 44461b4: Popconfirm 补上文档已列出的 `disabled` 与 `dir`:三端根组件声明并转给 popover 状态机,`disabled` 时触发器转原生 `disabled` 并带 `data-disabled`、点按不展开、展开途中转为禁用即收起;`dir` 写在定位层上,浮层搬到落点后仍按作者给的方向排布。此前这两个属性写上后落到根节点上不起作用。
31
+ - 5012c46: RadioGroup 的方向键只接落在条目或根节点自身上的按键,并跳过内层已 `preventDefault` 的事件:组里摆着的数字框、下拉等行内编辑控件,方向键照常移光标、换值,不再被当成切换选项。
32
+
33
+ 根节点只在 `label` 部件真渲染了时才输出 `aria-labelledby`(新增由适配器统计的 `labelled`),不再指向不存在的节点;Vue / React 的 `label` 属性在手写选项时同样铺出标题,与文档「提供后不必再写 label 部件」一致。
34
+
35
+ - f03b64d: `XhTruncate` 上作者写的属性改为与连接层逐条合并:`style` 与行数 `--xh-_truncate-lines` 并存,`class` 与监听器一并合上,同名的其余属性以作者的为准,与 React 一致。此前组件把连接层的属性平铺在作者的之后,作者写的 `style`(如 `max-inline-size: 20rem`)整个被盖掉。
36
+ - Updated dependencies [fc9c306]
37
+ - Updated dependencies [dbcf03e]
38
+ - Updated dependencies [525029a]
39
+ - Updated dependencies [b96f8ac]
40
+ - Updated dependencies [570af4d]
41
+ - Updated dependencies [9ba6c54]
42
+ - Updated dependencies [ecccb6b]
43
+ - Updated dependencies [d960188]
44
+ - Updated dependencies [df5d988]
45
+ - Updated dependencies [ba0fcdb]
46
+ - Updated dependencies [999d7b9]
47
+ - Updated dependencies [90ead40]
48
+ - Updated dependencies [44461b4]
49
+ - Updated dependencies [5012c46]
50
+ - Updated dependencies [cf0da15]
51
+ - Updated dependencies [113c99b]
52
+ - Updated dependencies [97fce6f]
53
+ - Updated dependencies [6d2c38c]
54
+ - Updated dependencies [cf84bc9]
55
+ - @xihan-ui/core@3.1.0
56
+ - @xihan-ui/headless@3.1.0
57
+ - @xihan-ui/motion@3.1.0
58
+ - @xihan-ui/position@3.1.0
59
+ - @xihan-ui/pointer@3.1.0
60
+ - @xihan-ui/viz@3.1.0
61
+
3
62
  ## 3.0.0
4
63
 
5
64
  ### Major Changes
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @xihan-ui/vue
2
2
 
3
- Vue 3 适配器:140 个组件的 Vue 形态,外加对应的 composables。行为全部来自 `@xihan-ui/headless`,这一层只负责把它接到 Vue 的响应式与渲染上。
3
+ Vue 适配器:全部组件的 Vue 形态,外加对应的 composables。行为全部来自 `@xihan-ui/headless`,这一层只负责把它接到 Vue 的响应式与渲染上。
4
4
 
5
5
  **谁会装它**:在 Vue 里用这套组件的人装它。样式另装 `@xihan-ui/styles`,或者自己写。
6
6
 
@@ -99,6 +99,7 @@ declare const XhCascaderRoot: import("vue").DefineComponent<import("vue").Extrac
99
99
  }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
100
100
  [key: string]: any;
101
101
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
102
+ clear: () => true;
102
103
  'value-change': (_details: PayloadOf<CascaderProps, "onValueChange">) => true;
103
104
  'open-change': (_details: PayloadOf<CascaderProps, "onOpenChange">) => true;
104
105
  'update:value': (_value: PayloadOf<CascaderProps, "onValueChange">["value"]) => true;
@@ -199,6 +200,7 @@ declare const XhCascaderRoot: import("vue").DefineComponent<import("vue").Extrac
199
200
  }>> & Readonly<{
200
201
  "onValue-change"?: ((_details: import("@xihan-ui/headless").CascaderValueChangeDetails) => any) | undefined;
201
202
  "onUpdate:value"?: ((_value: string[][]) => any) | undefined;
203
+ onClear?: (() => any) | undefined;
202
204
  "onOpen-change"?: ((_details: import("@xihan-ui/headless").CascaderOpenChangeDetails) => any) | undefined;
203
205
  "onUpdate:open"?: ((_open: boolean) => any) | undefined;
204
206
  "onBranch-load-start"?: ((_details: import("@xihan-ui/headless").CascaderBranchLoadStartDetails) => any) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"cascader.d.ts","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"mappings":"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"}
1
+ {"version":3,"file":"cascader.d.ts","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { withXhConfig } from "../../config/config.js";
2
2
  import { XhPortal } from "../../runtime/portal.js";
3
3
  import { slotIsPlainText } from "../../runtime/slot-content.js";
4
4
  import { useScrollbars } from "../../runtime/use-scrollbars.js";
5
+ import { withHandlers } from "../../runtime/with-handlers.js";
5
6
  import { useFormControlProps } from "../form/use-form-control.js";
6
7
  import { useFieldLabelWiring, useFieldStateWiring } from "../field/use-field-control.js";
7
8
  import { provideCascader, provideCascaderContent, provideCascaderGroup, provideCascaderItem, provideCascaderTag, useCascaderContentContext, useCascaderContext, useCascaderGroupContext, useCascaderItemContext, useCascaderTagContext } from "./context.js";
@@ -84,6 +85,7 @@ const XhCascaderRoot = defineComponent({
84
85
  dir: { type: String }
85
86
  },
86
87
  emits: {
88
+ "clear": () => true,
87
89
  "value-change": (_details) => true,
88
90
  "open-change": (_details) => true,
89
91
  "update:value": (_value) => true,
@@ -102,7 +104,7 @@ const XhCascaderRoot = defineComponent({
102
104
  emit("open-change", details);
103
105
  emit("update:open", details.open);
104
106
  };
105
- const ctx = useCascader(withXhConfig("cascader", useFormControlProps(props)), {
107
+ const ctx = useCascader(withHandlers(withXhConfig("cascader", useFormControlProps(props)), { onClear: () => emit("clear") }), {
106
108
  onValueChange: notifyValue,
107
109
  onOpenChange: notifyOpen,
108
110
  onBranchLoadStart: (details) => emit("branch-load-start", details),
@@ -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 { 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 '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(withXhConfig('cascader', useFormControlProps(props)) 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 }, () => [\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":"checkbox-group.d.ts","names":[],"sources":["../../../src/components/checkbox-group/checkbox-group.ts"],"mappings":";;;;;KA4BK,qBAAqB;;KAGd,6BAA6B,KACvC;cAIW,mCAAmB,8BAAA;;IAGC,MAAA,SAAS;;;;;;;IAId,MAAA;;;IACO,MAAA;;;IACF,MAAA;;;;;;;;;;;;;;;;;;;;;;;;IAOE,MAAA,SAAS;;;IAChB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACN,MAAA,SAAS;;;;;EAIT,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;IArBN,MAAA,SAAS;;;;;;;IAId,MAAA;;;IACO,MAAA;;;IACF,MAAA;;;;;;;;;;;;;;;;;;;;;;;;IAOE,MAAA,SAAS;;;IAChB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACN,MAAA,SAAS;;;;;;;;;;EAQ1B,WAAC,OAAO,+BAA+B;EACzC,cAAM;EACP,QAAC,OAAO,0BAA0B;kCA2B3C;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAM/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAiB9B;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAQnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8CAA8B,0BAAA,oBAAA,4BAAA;;8BAOzC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+CAA+B,0BAAA,oBAAA,4BAAA;;8BAO1C,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"checkbox-group.d.ts","names":[],"sources":["../../../src/components/checkbox-group/checkbox-group.ts"],"mappings":";;;;;KA6BK,qBAAqB;;KAGd,6BAA6B,KACvC;cAIW,mCAAmB,8BAAA;;IAGC,MAAA,SAAS;;;;;;;IAId,MAAA;;;IACO,MAAA;;;IACF,MAAA;;;;;;;;;;;;;;;;;;;;;;;;IAOE,MAAA,SAAS;;;IAChB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACN,MAAA,SAAS;;;;;EAIT,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;IArBN,MAAA,SAAS;;;;;;;IAId,MAAA;;;IACO,MAAA;;;IACF,MAAA;;;;;;;;;;;;;;;;;;;;;;;;IAOE,MAAA,SAAS;;;IAChB,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACN,MAAA,SAAS;;;;;;;;;;EAQ1B,WAAC,OAAO,+BAA+B;EACzC,cAAM;EACP,QAAC,OAAO,0BAA0B;kCA8B3C;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAa/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAiB9B;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAQnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8CAA8B,0BAAA,oBAAA,4BAAA;;8BAOzC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+CAA+B,0BAAA,oBAAA,4BAAA;;8BAO1C,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -1,7 +1,8 @@
1
1
  import { useFormControlProps } from "../form/use-form-control.js";
2
+ import { useFieldGroupWiring, useFieldLabelWiring } from "../field/use-field-control.js";
2
3
  import { provideCheckboxGroup, provideCheckboxGroupItem, useCheckboxGroupContext, useCheckboxGroupItemContext } from "./context.js";
3
4
  import { useCheckboxGroup } from "./use-checkbox-group.js";
4
- import { computed, defineComponent, h } from "vue";
5
+ import { computed, defineComponent, h, onBeforeUnmount, onMounted } from "vue";
5
6
  //#region src/components/checkbox-group/checkbox-group.ts
6
7
  const XhCheckboxGroupRoot = defineComponent({
7
8
  name: "XhCheckboxGroupRoot",
@@ -44,21 +45,35 @@ const XhCheckboxGroupRoot = defineComponent({
44
45
  };
45
46
  const ctx = useCheckboxGroup(useFormControlProps(props), notify);
46
47
  provideCheckboxGroup(ctx);
47
- return () => h("div", ctx.api.value.getRootProps(), slots.default ? slots.default({
48
- value: ctx.api.value.value,
49
- checkedState: ctx.api.value.checkedState,
50
- atMax: ctx.api.value.atMax,
51
- atMin: ctx.api.value.atMin,
52
- isChecked: ctx.api.value.isChecked,
53
- setValue: ctx.api.value.setValue,
54
- toggleValue: ctx.api.value.toggleValue
55
- }) : props.collection ? renderDefaultTree(ctx.api.value.collection, slots.label?.() ?? (props.label != null ? [props.label] : null), slots.item) : []);
48
+ const fieldWiring = useFieldGroupWiring();
49
+ const fieldLabel = useFieldLabelWiring();
50
+ return () => {
51
+ const title = slots.label?.() ?? (props.label != null ? [props.label] : null);
52
+ return h("div", fieldLabel.value({
53
+ ...fieldWiring.value,
54
+ ...ctx.api.value.getRootProps()
55
+ }), slots.default ? [...renderLabel(title), ...slots.default({
56
+ value: ctx.api.value.value,
57
+ checkedState: ctx.api.value.checkedState,
58
+ atMax: ctx.api.value.atMax,
59
+ atMin: ctx.api.value.atMin,
60
+ isChecked: ctx.api.value.isChecked,
61
+ setValue: ctx.api.value.setValue,
62
+ toggleValue: ctx.api.value.toggleValue
63
+ })] : props.collection ? renderDefaultTree(ctx.api.value.collection, title, slots.item) : renderLabel(title));
64
+ };
56
65
  }
57
66
  });
58
67
  const XhCheckboxGroupLabel = defineComponent({
59
68
  name: "XhCheckboxGroupLabel",
60
69
  setup(_, { slots }) {
61
70
  const ctx = useCheckboxGroupContext();
71
+ onMounted(() => {
72
+ ctx.labelCount.value++;
73
+ });
74
+ onBeforeUnmount(() => {
75
+ ctx.labelCount.value--;
76
+ });
62
77
  return () => h("span", ctx.api.value.getLabelProps(), slots.default?.());
63
78
  }
64
79
  });
@@ -121,7 +136,7 @@ const XhCheckboxGroupSelectAllTrigger = defineComponent({
121
136
  * 全选控件不在其中:它是可选部件,需要时写默认插槽。
122
137
  */
123
138
  function renderDefaultTree(collection, label, itemSlot) {
124
- return [...label ? [h(XhCheckboxGroupLabel, null, () => label)] : [], ...collection.map((node) => h(XhCheckboxGroupItem, {
139
+ return [...renderLabel(label), ...collection.map((node) => h(XhCheckboxGroupItem, {
125
140
  key: node.value,
126
141
  value: node.value
127
142
  }, () => [
@@ -130,6 +145,10 @@ function renderDefaultTree(collection, label, itemSlot) {
130
145
  ...node.description != null ? [h(XhCheckboxGroupItemDescription, null, () => node.description)] : []
131
146
  ]))];
132
147
  }
148
+ /** 组标题:给了文字或 label 插槽才铺 label 部件。 */
149
+ function renderLabel(title) {
150
+ return title ? [h(XhCheckboxGroupLabel, null, () => title)] : [];
151
+ }
133
152
  //#endregion
134
153
  export { XhCheckboxGroupIndicator, XhCheckboxGroupItem, XhCheckboxGroupItemDescription, XhCheckboxGroupItemText, XhCheckboxGroupLabel, XhCheckboxGroupRoot, XhCheckboxGroupSelectAllTrigger };
135
154
 
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox-group.js","names":[],"sources":["../../../src/components/checkbox-group/checkbox-group.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// 提供 checkbox group 相关实现。\n\nimport type { Orientation, Size, Tone } from '@xihan-ui/core'\nimport type {\n CheckboxGroupApi,\n CheckboxGroupItemProps,\n CheckboxGroupNode,\n CheckboxGroupNodeMeta,\n CheckboxGroupSchema,\n CheckboxGroupVariant,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h } from 'vue'\nimport { useFormControlProps } from '../form/use-form-control'\nimport {\n provideCheckboxGroup,\n provideCheckboxGroupItem,\n useCheckboxGroupContext,\n useCheckboxGroupItemContext,\n} from './context'\nimport { useCheckboxGroup } from './use-checkbox-group'\n\ntype CheckboxGroupProps = CheckboxGroupSchema['props']\n\n/** 默认插槽的载荷:整组的选中集合与全选态,以及整体替换与翻转单值的方法。 */\nexport type CheckboxGroupRootSlotProps = Pick<\n CheckboxGroupApi,\n 'value' | 'checkedState' | 'atMax' | 'atMin' | 'isChecked' | 'setValue' | 'toggleValue'\n>\n\nexport const XhCheckboxGroupRoot = defineComponent({\n name: 'XhCheckboxGroupRoot',\n props: {\n collection: { type: Array as PropType<CheckboxGroupNode[]> },\n /** 标题文字。提供后不必再写 label 部件;需要放置其他内容时改用 label 插槽。 */\n label: { type: String },\n // 缺席值 undefined 表示非受控\n value: { type: Array as PropType<string[]> },\n defaultValue: { type: Array as PropType<string[]> },\n itemValues: { type: Array as PropType<string[]> },\n min: { type: Number },\n max: { type: Number },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n orientation: { type: String as PropType<Orientation> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n variant: { type: String as PropType<CheckboxGroupVariant> },\n },\n // value-change 携带 { value },update:value 携带裸数组\n emits: {\n 'value-change': (_details: PayloadOf<CheckboxGroupProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<CheckboxGroupProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CheckboxGroupRootSlotProps) => VNode[]\n label?: () => VNode[]\n item?: (props: CheckboxGroupNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: CheckboxGroupProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useCheckboxGroup(useFormControlProps(props) as CheckboxGroupProps, notify)\n provideCheckboxGroup(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default\n ? slots.default({\n value: ctx.api.value.value,\n checkedState: ctx.api.value.checkedState,\n atMax: ctx.api.value.atMax,\n atMin: ctx.api.value.atMin,\n isChecked: ctx.api.value.isChecked,\n setValue: ctx.api.value.setValue,\n toggleValue: ctx.api.value.toggleValue,\n })\n : props.collection\n ? renderDefaultTree(\n ctx.api.value.collection,\n slots.label?.() ?? (props.label != null ? [props.label] : null),\n slots.item,\n )\n : [])\n },\n})\n\nexport const XhCheckboxGroupLabel = defineComponent({\n name: 'XhCheckboxGroupLabel',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCheckboxGroupItem = defineComponent({\n name: 'XhCheckboxGroupItem',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useCheckboxGroupContext()\n const item = computed<CheckboxGroupItemProps>(() => ({ value: props.value, disabled: props.disabled }))\n provideCheckboxGroupItem({ item })\n // 表单影子由条目自行装配,不暴露成独立组件,作者只写方框与文本\n return () => h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, [\n h('input', ctx.api.value.getHiddenInputProps(item.value) as Record<string, unknown>),\n ...(slots.default?.() ?? []),\n ])\n },\n})\n\nexport const XhCheckboxGroupIndicator = defineComponent({\n name: 'XhCheckboxGroupIndicator',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n const { item } = useCheckboxGroupItemContext()\n // 插槽留给作者放对勾图形,方框本身对读屏隐藏\n return () => h('span', ctx.api.value.getIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCheckboxGroupItemText = defineComponent({\n name: 'XhCheckboxGroupItemText',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n const { item } = useCheckboxGroupItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCheckboxGroupItemDescription = defineComponent({\n name: 'XhCheckboxGroupItemDescription',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n const { item } = useCheckboxGroupItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCheckboxGroupSelectAllTrigger = defineComponent({\n name: 'XhCheckboxGroupSelectAllTrigger',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n // 与条目同形的 role=checkbox 节点,渲染为 div,Space 由 connect 接管\n return () => h('div', ctx.api.value.getSelectAllTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 未写默认插槽时按 collection 铺开的整套结构,作者只提供数据。\n * 与手写部件产出的 DOM 完全一致,需要修改结构时写默认插槽,行为不变。\n * 全选控件不在其中:它是可选部件,需要时写默认插槽。\n */\nfunction renderDefaultTree(\n collection: readonly CheckboxGroupNodeMeta[],\n label: (VNode | string)[] | null,\n itemSlot?: (node: CheckboxGroupNodeMeta) => VNode[],\n): VNode[] {\n return [\n ...(label ? [h(XhCheckboxGroupLabel, null, () => label)] : []),\n ...collection.map(node =>\n h(XhCheckboxGroupItem, { key: node.value, value: node.value }, () => [\n h(XhCheckboxGroupIndicator),\n h(XhCheckboxGroupItemText, null, () => itemSlot?.(node) ?? node.label),\n ...(node.description != null ? [h(XhCheckboxGroupItemDescription, null, () => node.description)] : []),\n ]),\n ),\n ]\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"checkbox-group.js","names":[],"sources":["../../../src/components/checkbox-group/checkbox-group.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// 提供 checkbox group 相关实现。\n\nimport type { Orientation, Size, Tone } from '@xihan-ui/core'\nimport type {\n CheckboxGroupApi,\n CheckboxGroupItemProps,\n CheckboxGroupNode,\n CheckboxGroupNodeMeta,\n CheckboxGroupSchema,\n CheckboxGroupVariant,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, onBeforeUnmount, onMounted } from 'vue'\nimport { useFieldGroupWiring, useFieldLabelWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport {\n provideCheckboxGroup,\n provideCheckboxGroupItem,\n useCheckboxGroupContext,\n useCheckboxGroupItemContext,\n} from './context'\nimport { useCheckboxGroup } from './use-checkbox-group'\n\ntype CheckboxGroupProps = CheckboxGroupSchema['props']\n\n/** 默认插槽的载荷:整组的选中集合与全选态,以及整体替换与翻转单值的方法。 */\nexport type CheckboxGroupRootSlotProps = Pick<\n CheckboxGroupApi,\n 'value' | 'checkedState' | 'atMax' | 'atMin' | 'isChecked' | 'setValue' | 'toggleValue'\n>\n\nexport const XhCheckboxGroupRoot = defineComponent({\n name: 'XhCheckboxGroupRoot',\n props: {\n collection: { type: Array as PropType<CheckboxGroupNode[]> },\n /** 标题文字。提供后不必再写 label 部件;需要放置其他内容时改用 label 插槽。 */\n label: { type: String },\n // 缺席值 undefined 表示非受控\n value: { type: Array as PropType<string[]> },\n defaultValue: { type: Array as PropType<string[]> },\n itemValues: { type: Array as PropType<string[]> },\n min: { type: Number },\n max: { type: Number },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n orientation: { type: String as PropType<Orientation> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n variant: { type: String as PropType<CheckboxGroupVariant> },\n },\n // value-change 携带 { value },update:value 携带裸数组\n emits: {\n 'value-change': (_details: PayloadOf<CheckboxGroupProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<CheckboxGroupProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CheckboxGroupRootSlotProps) => VNode[]\n label?: () => VNode[]\n item?: (props: CheckboxGroupNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: CheckboxGroupProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useCheckboxGroup(useFormControlProps(props) as CheckboxGroupProps, notify)\n provideCheckboxGroup(ctx)\n // 放进表单字段时,字段的标题与说明接到组上:读屏进组时念组名与说明\n const fieldWiring = useFieldGroupWiring()\n const fieldLabel = useFieldLabelWiring()\n return () => {\n // 标题文字不论手写选项还是数据驱动都由根铺出:手写选项时不必再写 label 部件\n const title = slots.label?.() ?? (props.label != null ? [props.label] : null)\n return h('div', fieldLabel.value({ ...fieldWiring.value, ...ctx.api.value.getRootProps() as Record<string, unknown> }), slots.default\n ? [...renderLabel(title), ...slots.default({\n value: ctx.api.value.value,\n checkedState: ctx.api.value.checkedState,\n atMax: ctx.api.value.atMax,\n atMin: ctx.api.value.atMin,\n isChecked: ctx.api.value.isChecked,\n setValue: ctx.api.value.setValue,\n toggleValue: ctx.api.value.toggleValue,\n })]\n : props.collection\n ? renderDefaultTree(ctx.api.value.collection, title, slots.item)\n : renderLabel(title))\n }\n },\n})\n\nexport const XhCheckboxGroupLabel = defineComponent({\n name: 'XhCheckboxGroupLabel',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n // 渲出来了才登记:根的 aria-labelledby 只在这个节点真在场时才指过来\n onMounted(() => {\n ctx.labelCount.value++\n })\n onBeforeUnmount(() => {\n ctx.labelCount.value--\n })\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCheckboxGroupItem = defineComponent({\n name: 'XhCheckboxGroupItem',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useCheckboxGroupContext()\n const item = computed<CheckboxGroupItemProps>(() => ({ value: props.value, disabled: props.disabled }))\n provideCheckboxGroupItem({ item })\n // 表单影子由条目自行装配,不暴露成独立组件,作者只写方框与文本\n return () => h('div', ctx.api.value.getItemProps(item.value) as Record<string, unknown>, [\n h('input', ctx.api.value.getHiddenInputProps(item.value) as Record<string, unknown>),\n ...(slots.default?.() ?? []),\n ])\n },\n})\n\nexport const XhCheckboxGroupIndicator = defineComponent({\n name: 'XhCheckboxGroupIndicator',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n const { item } = useCheckboxGroupItemContext()\n // 插槽留给作者放对勾图形,方框本身对读屏隐藏\n return () => h('span', ctx.api.value.getIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCheckboxGroupItemText = defineComponent({\n name: 'XhCheckboxGroupItemText',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n const { item } = useCheckboxGroupItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCheckboxGroupItemDescription = defineComponent({\n name: 'XhCheckboxGroupItemDescription',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n const { item } = useCheckboxGroupItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCheckboxGroupSelectAllTrigger = defineComponent({\n name: 'XhCheckboxGroupSelectAllTrigger',\n setup(_, { slots }) {\n const ctx = useCheckboxGroupContext()\n // 与条目同形的 role=checkbox 节点,渲染为 div,Space 由 connect 接管\n return () => h('div', ctx.api.value.getSelectAllTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 未写默认插槽时按 collection 铺开的整套结构,作者只提供数据。\n * 与手写部件产出的 DOM 完全一致,需要修改结构时写默认插槽,行为不变。\n * 全选控件不在其中:它是可选部件,需要时写默认插槽。\n */\nfunction renderDefaultTree(\n collection: readonly CheckboxGroupNodeMeta[],\n label: (VNode | string)[] | null,\n itemSlot?: (node: CheckboxGroupNodeMeta) => VNode[],\n): VNode[] {\n return [\n ...renderLabel(label),\n ...collection.map(node =>\n h(XhCheckboxGroupItem, { key: node.value, value: node.value }, () => [\n h(XhCheckboxGroupIndicator),\n h(XhCheckboxGroupItemText, null, () => itemSlot?.(node) ?? node.label),\n ...(node.description != null ? [h(XhCheckboxGroupItemDescription, null, () => node.description)] : []),\n ]),\n ),\n ]\n}\n\n/** 组标题:给了文字或 label 插槽才铺 label 部件。 */\nfunction renderLabel(title: (VNode | string)[] | null): VNode[] {\n return title ? [h(XhCheckboxGroupLabel, null, () => title)] : []\n}\n"],"mappings":"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"}
@@ -1,10 +1,15 @@
1
- import { ComputedRef } from "vue";
1
+ import { ComputedRef, Ref } from "vue";
2
2
  import { Service } from "@xihan-ui/core";
3
3
  import { CheckboxGroupApi, CheckboxGroupSchema } from "@xihan-ui/headless";
4
4
  //#region src/components/checkbox-group/use-checkbox-group.d.ts
5
5
  interface CheckboxGroupContext {
6
6
  api: ComputedRef<CheckboxGroupApi>;
7
7
  service: Service<CheckboxGroupSchema>;
8
+ /**
9
+ * 已挂载的 label 部件数量,由 XhCheckboxGroupLabel 自行登记。
10
+ * 根的 aria-labelledby 据此决定输不输出:只看 label 属性有没有值不够,手写选项时标题可能根本没渲染。
11
+ */
12
+ labelCount: Ref<number>;
8
13
  }
9
14
  declare function useCheckboxGroup(props: CheckboxGroupSchema['props'], onValueChange?: CheckboxGroupSchema['props']['onValueChange']): CheckboxGroupContext;
10
15
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"use-checkbox-group.d.ts","names":[],"sources":["../../../src/components/checkbox-group/use-checkbox-group.ts"],"mappings":";;;;UAiBiB;EACf,KAAK,YAAY;EACjB,SAAS,QAAQ;;iBAGH,iBACd,OAAO,8BACP,gBAAgB,gDACf"}
1
+ {"version":3,"file":"use-checkbox-group.d.ts","names":[],"sources":["../../../src/components/checkbox-group/use-checkbox-group.ts"],"mappings":";;;;UAiBiB;EACf,KAAK,YAAY;EACjB,SAAS,QAAQ;;;;;EAKjB,YAAY;;iBAGE,iBACd,OAAO,8BACP,gBAAgB,gDACf"}
@@ -1,18 +1,22 @@
1
1
  import { vueNormalize } from "../../runtime/normalize-props.js";
2
2
  import { useMachine } from "../../runtime/use-machine.js";
3
3
  import { createVueIdGenerator } from "../../runtime/vue-id.js";
4
- import { computed } from "vue";
4
+ import { computed, ref } from "vue";
5
5
  import { createScope } from "@xihan-ui/core";
6
6
  import { checkboxGroupMachine, connectCheckboxGroup } from "@xihan-ui/headless";
7
7
  //#region src/components/checkbox-group/use-checkbox-group.ts
8
8
  function useCheckboxGroup(props, onValueChange) {
9
+ const scope = createScope(null, createVueIdGenerator());
10
+ const labelCount = ref(0);
9
11
  const service = useMachine(checkboxGroupMachine, () => ({
10
12
  ...props,
13
+ labelled: labelCount.value > 0,
11
14
  onValueChange
12
- }), createScope(null, createVueIdGenerator()));
15
+ }), scope);
13
16
  return {
14
17
  api: computed(() => connectCheckboxGroup(service, vueNormalize)),
15
- service
18
+ service,
19
+ labelCount
16
20
  };
17
21
  }
18
22
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"use-checkbox-group.js","names":[],"sources":["../../../src/components/checkbox-group/use-checkbox-group.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 use checkbox group 相关实现。\n\nimport type { Service } from '@xihan-ui/core'\nimport type { CheckboxGroupApi, CheckboxGroupSchema } from '@xihan-ui/headless'\nimport type { ComputedRef } from 'vue'\nimport { createScope } from '@xihan-ui/core'\nimport { checkboxGroupMachine, connectCheckboxGroup } from '@xihan-ui/headless'\nimport { computed } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface CheckboxGroupContext {\n api: ComputedRef<CheckboxGroupApi>\n service: Service<CheckboxGroupSchema>\n}\n\nexport function useCheckboxGroup(\n props: CheckboxGroupSchema['props'],\n onValueChange?: CheckboxGroupSchema['props']['onValueChange'],\n): CheckboxGroupContext {\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n // onValueChange 由组件外壳(emit)或组合式调用方提供,随 props 一并喂给机器\n const service = useMachine(checkboxGroupMachine, () => ({ ...props, onValueChange }), scope)\n const api = computed(() => connectCheckboxGroup(service, vueNormalize))\n return { api, service }\n}\n"],"mappings":";;;;;;;AAsBA,SAAgB,iBACd,OACA,eACsB;CAItB,MAAM,UAAU,WAAW,6BAA6B;EAAE,GAAG;EAAO;CAAc,IAFpE,YAAY,MADZ,qBACsB,CAEsD,CAAC;CAE3F,OAAO;EAAE,KADG,eAAe,qBAAqB,SAAS,YAAY,CAC1D;EAAG;CAAQ;AACxB"}
1
+ {"version":3,"file":"use-checkbox-group.js","names":[],"sources":["../../../src/components/checkbox-group/use-checkbox-group.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 use checkbox group 相关实现。\n\nimport type { Service } from '@xihan-ui/core'\nimport type { CheckboxGroupApi, CheckboxGroupSchema } from '@xihan-ui/headless'\nimport type { ComputedRef, Ref } from 'vue'\nimport { createScope } from '@xihan-ui/core'\nimport { checkboxGroupMachine, connectCheckboxGroup } from '@xihan-ui/headless'\nimport { computed, ref } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface CheckboxGroupContext {\n api: ComputedRef<CheckboxGroupApi>\n service: Service<CheckboxGroupSchema>\n /**\n * 已挂载的 label 部件数量,由 XhCheckboxGroupLabel 自行登记。\n * 根的 aria-labelledby 据此决定输不输出:只看 label 属性有没有值不够,手写选项时标题可能根本没渲染。\n */\n labelCount: Ref<number>\n}\n\nexport function useCheckboxGroup(\n props: CheckboxGroupSchema['props'],\n onValueChange?: CheckboxGroupSchema['props']['onValueChange'],\n): CheckboxGroupContext {\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n // onValueChange 由组件外壳(emit)或组合式调用方提供,随 props 一并喂给机器\n const labelCount = ref(0)\n const service = useMachine(checkboxGroupMachine, () => ({ ...props, labelled: labelCount.value > 0, onValueChange }), scope)\n const api = computed(() => connectCheckboxGroup(service, vueNormalize))\n return { api, service, labelCount }\n}\n"],"mappings":";;;;;;;AA2BA,SAAgB,iBACd,OACA,eACsB;CAEtB,MAAM,QAAQ,YAAY,MADZ,qBACsB,CAAC;CAErC,MAAM,aAAa,IAAI,CAAC;CACxB,MAAM,UAAU,WAAW,6BAA6B;EAAE,GAAG;EAAO,UAAU,WAAW,QAAQ;EAAG;CAAc,IAAI,KAAK;CAE3H,OAAO;EAAE,KADG,eAAe,qBAAqB,SAAS,YAAY,CAC1D;EAAG;EAAS;CAAW;AACpC"}
@@ -60,6 +60,7 @@ declare const XhColorFieldRoot: import("vue").DefineComponent<import("vue").Extr
60
60
  }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
61
61
  [key: string]: any;
62
62
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
63
+ clear: () => true;
63
64
  'value-change': (_details: PayloadOf<ColorFieldProps, "onValueChange">) => true;
64
65
  'update:value': (_value: PayloadOf<ColorFieldProps, "onValueChange">["value"]) => true;
65
66
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -117,6 +118,7 @@ declare const XhColorFieldRoot: import("vue").DefineComponent<import("vue").Extr
117
118
  }>> & Readonly<{
118
119
  "onValue-change"?: ((_details: import("@xihan-ui/headless").ColorFieldValueChangeDetails) => any) | undefined;
119
120
  "onUpdate:value"?: ((_value: string) => any) | undefined;
121
+ onClear?: (() => any) | undefined;
120
122
  }>, {
121
123
  required: boolean;
122
124
  invalid: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"color-field.d.ts","names":[],"sources":["../../../src/components/color-field/color-field.ts"],"mappings":";;;;;KAkBK,kBAAkB;KAEX,0BAA0B,KACpC;cAIW,gCAAgB,8BAAA;;;;;;;;;;IAOC,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAUR,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;EAId,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;;;IAlBT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAUR,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;;;;;;;;;EAQ/B,WAAC,OAAO,4BAA4B;kCAsBhD;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAO5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAa5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"color-field.d.ts","names":[],"sources":["../../../src/components/color-field/color-field.ts"],"mappings":";;;;;KAmBK,kBAAkB;KAEX,0BAA0B,KACpC;cAIW,gCAAgB,8BAAA;;;;;;;;;;IAOC,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAUR,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;;EAKd,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;;;IAnBT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAUR,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;;;;;;;;;;EAS/B,WAAC,OAAO,4BAA4B;kCAsBhD;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAO5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAa5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -1,4 +1,5 @@
1
1
  import { withXhConfig } from "../../config/config.js";
2
+ import { withHandlers } from "../../runtime/with-handlers.js";
2
3
  import { useFormControlProps } from "../form/use-form-control.js";
3
4
  import { useFieldLabelWiring, useFieldStateWiring } from "../field/use-field-control.js";
4
5
  import { provideColorField, useColorFieldContext } from "./context.js";
@@ -43,6 +44,7 @@ const XhColorFieldRoot = defineComponent({
43
44
  translations: { type: Object }
44
45
  },
45
46
  emits: {
47
+ "clear": () => true,
46
48
  "value-change": (_details) => true,
47
49
  "update:value": (_value) => true
48
50
  },
@@ -52,7 +54,7 @@ const XhColorFieldRoot = defineComponent({
52
54
  emit("value-change", details);
53
55
  emit("update:value", details.value);
54
56
  };
55
- const ctx = useColorField(withXhConfig("color-field", useFormControlProps(props)), notify);
57
+ const ctx = useColorField(withHandlers(withXhConfig("color-field", useFormControlProps(props)), { onClear: () => emit("clear") }), notify);
56
58
  provideColorField(ctx);
57
59
  return () => h("div", ctx.api.value.getRootProps(), slots.default?.({
58
60
  value: ctx.api.value.value,