@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
@@ -1 +1 @@
1
- {"version":3,"file":"select.js","names":[],"sources":["../../../src/components/select/select.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// 提供 select 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type { CollectionVirtualizer, SelectApi, SelectGroupProps, SelectItemProps, SelectNode, SelectNodeMeta, SelectOpenChangeDetails, SelectSchema, SelectTagMeta, SelectValueChangeDetails } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, 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 { provideSelect, provideSelectGroup, provideSelectItem, provideSelectTag, useSelectContext, useSelectGroupContext, useSelectItemContext, useSelectTagContext } from './context'\nimport { useSelect } from './use-select'\n\ntype SelectProps = SelectSchema['props']\n\n/** 默认插槽的载荷:展开态、选中集合与显示文字、可见标签与被折叠的个数及其文字,以及修改展开、修改值、清空、移除值四个动作。 */\nexport type SelectRootSlotProps = Pick<\n SelectApi,\n 'open' | 'value' | 'displayText' | 'tags' | 'overflowCount' | 'overflowText' | 'setOpen' | 'setValue' | 'clear' | 'deselect'\n>\n\nexport const XhSelectRoot = /* @__PURE__ */ defineComponent({\n name: 'XhSelectRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<SelectNode[]> },\n virtualizer: { type: Object as PropType<CollectionVirtualizer> },\n /** 标题文字。提供后不必再写 label 部件;需要放置其他内容时改用 label 插槽。 */\n label: { type: String },\n value: { type: [String, Array] as PropType<string | string[] | null> },\n defaultValue: { type: [String, Array] as PropType<string | string[] | null> },\n multiple: Boolean,\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n disabled: { type: Boolean, default: undefined },\n /** 只读:浮层照常展开与浏览,但选中值不可修改、也不可清空。 */\n readOnly: { type: Boolean, default: undefined },\n /** 自动渲染树中是否带清空按钮;手写部件不使用它,写了节点即可清空。 */\n clearable: Boolean,\n invalid: { type: Boolean, default: undefined },\n loading: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n translations: { type: Object as PropType<SelectProps['translations']> },\n maxTagCount: { type: Number },\n placeholder: { 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 variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // *-change 携带 details 对象,update:* 携带裸值。\n // 校验函数恒真,只声明载荷类型:'update:value' 是 string[],单选也是长度 1 的数组而非裸串。\n emits: {\n 'value-change': (_details: SelectValueChangeDetails) => true,\n 'open-change': (_details: SelectOpenChangeDetails) => true,\n 'update:value': (_value: string[]) => true,\n 'update:open': (_open: boolean) => true,\n },\n slots: Object as SlotsType<{\n 'default'?: (props: SelectRootSlotProps) => VNode[]\n 'label'?: () => VNode[]\n /** 只填条目的文字槽,副文本与首尾两格照旧各归各的 */\n 'item'?: (node: SelectNodeMeta) => VNode[]\n /** 只接管行首那一格,其余槽照旧由数据铺 */\n 'item-prefix'?: (node: SelectNodeMeta) => VNode[]\n /** 只接管行尾那一格(计数、徽标、次级图标),其余槽照旧由数据铺 */\n 'item-suffix'?: (node: SelectNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: SelectProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: SelectProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useSelect(withXhConfig('select', useFormControlProps(props)) as SelectProps, notifyValue, notifyOpen)\n provideSelect(ctx)\n\n // 表单影子由根部件装配:空串选项打底,每个选中值一个 selected 选项,供 required 判定。\n // 选中态一律靠选项的 selected 表达,多选下 select.value 表达不了集合。\n const hiddenSelect = (): VNode => {\n const api = ctx.api.value\n const options = [h('option', { value: '' })]\n for (const [i, v] of api.value.entries())\n options.push(h('option', { value: v, selected: true }, api.valueText[i] ?? v))\n return h('select', api.getHiddenSelectProps() as Record<string, unknown>, options)\n }\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, [\n hiddenSelect(),\n ...(slots.default\n ? slots.default({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n displayText: ctx.api.value.displayText,\n tags: ctx.api.value.tags,\n overflowCount: ctx.api.value.overflowCount,\n overflowText: ctx.api.value.overflowText,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n deselect: ctx.api.value.deselect,\n }) ?? []\n : props.collection\n ? renderDefaultTree(\n ctx.api.value.collection,\n props.multiple ? ctx.api.value.tags : null,\n slots.label?.() ?? (props.label != null ? [props.label] : null),\n props.clearable,\n slots.item,\n slots['item-prefix'],\n slots['item-suffix'],\n )\n : []),\n ])\n },\n})\n\nexport const XhSelectLabel = /* @__PURE__ */ defineComponent({\n name: 'XhSelectLabel',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectControl = /* @__PURE__ */ defineComponent({\n name: 'XhSelectControl',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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 XhSelectTrigger = /* @__PURE__ */ defineComponent({\n name: 'XhSelectTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useSelectContext()\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 XhSelectValueText = /* @__PURE__ */ defineComponent({\n name: 'XhSelectValueText',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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 XhSelectIndicator = /* @__PURE__ */ defineComponent({\n name: 'XhSelectIndicator',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n return () => h('span', ctx.api.value.getIndicatorProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectClearTrigger = /* @__PURE__ */ defineComponent({\n name: 'XhSelectClearTrigger',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 节点常挂,清不了时靠 hidden 藏掉\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectTagList = /* @__PURE__ */ defineComponent({\n name: 'XhSelectTagList',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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 XhSelectTagLabel = /* @__PURE__ */ defineComponent({\n name: 'XhSelectTagLabel',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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(XhSelectTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhSelectTagLabel, null, () => content)] : content\n}\n\n/** 一个选中值一个标签,即库内 tag 的 root(data-scope=\"tag\"):语气、尺寸与禁用从 select 传下,形态按控件的面派生;触发器内纯展示,触发器外配合 XhSelectItemDeleteTrigger 可删除。 */\nexport const XhSelectTag = /* @__PURE__ */ defineComponent({\n name: 'XhSelectTag',\n props: {\n /** 它代表哪个选中值。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSelectContext()\n provideSelectTag({ value: () => props.value })\n // 标签随文排在触发器那一行里,根用 span\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 XhSelectOverflowTag = /* @__PURE__ */ defineComponent({\n name: 'XhSelectOverflowTag',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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 XhSelectItemDeleteTrigger = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const tag = useSelectTagContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectPositioner = /* @__PURE__ */ defineComponent({\n name: 'XhSelectPositioner',\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 = useSelectContext()\n // 列表的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner,条子走浮层 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.listRef.value, props: { size: 'sm' } })\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 XhSelectContent = /* @__PURE__ */ defineComponent({\n name: 'XhSelectContent',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhSelectList = /* @__PURE__ */ defineComponent({\n name: 'XhSelectList',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 列表框本体:条目放这里面。滚动也在这一层,底部操作区因此不随条目滚走\n return () => h('div', {\n ...ctx.api.value.getListProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.listRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhSelectFooter = /* @__PURE__ */ defineComponent({\n name: 'XhSelectFooter',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 浮层底部的操作区:是 list 的兄弟,不进列表框的拥有关系,\n // 放在里面的按钮既不违反 listbox 的子节点约束,也不会被方向键与连打检索走到\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectEmpty = /* @__PURE__ */ defineComponent({\n name: 'XhSelectEmpty',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 空态占位:写在 content 里、list 的兄弟,不进列表框的拥有关系。\n // 给了 collection 时收放归连接层,条目手写时归作者\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectLoading = /* @__PURE__ */ defineComponent({\n name: 'XhSelectLoading',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 在途占位:与空态占位同一个位置,取数期间顶上来\n return () => h('div', ctx.api.value.getLoadingProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectGroup = /* @__PURE__ */ defineComponent({\n name: 'XhSelectGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSelectContext()\n const group = computed<SelectGroupProps>(() => ({ value: props.value }))\n provideSelectGroup({ group })\n // 分组容器:条目照常挂在它里面,role=group 是列表框允许拥有的两种子节点之一\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectGroupLabel = /* @__PURE__ */ defineComponent({\n name: 'XhSelectGroupLabel',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { group } = useSelectGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectItem = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItem',\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 = useSelectContext()\n const item = computed<SelectItemProps>(() => ({ value: props.value, disabled: props.disabled }))\n provideSelectItem({ item })\n // 本条目持有焦点时,value 变更重报高亮条目,卸载时上报条目丢失\n const itemEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const svc = ctx.service\n if (svc.getStatus() !== 'Started')\n return\n if (itemEl.value && svc.scope.getActiveElement() === itemEl.value)\n svc.send({ type: 'ITEM.HIGHLIGHT', value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (service.prop('virtualizer') && service.prop('collection')?.some(node => node.value === props.value))\n return\n // 按「本节点当下正持有焦点」判定,不按 value 比对\n if (itemEl.value && service.scope.getActiveElement() === itemEl.value)\n service.send({ type: 'ITEM.LOST' })\n })\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\nexport const XhSelectItemText = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemText',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行首的作者内容(图标、色块、头像),对读屏隐藏 */\nexport const XhSelectItemPrefix = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemPrefix',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemPrefixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行尾的作者内容(计数、徽标) */\nexport const XhSelectItemSuffix = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemSuffix',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemSuffixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */\nexport const XhSelectItemDescription = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemDescription',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectItemIndicator = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemIndicator',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 未写默认插槽时按 collection 铺开的整套结构,作者只提供数据。\n * 与手写部件产出的 DOM 完全一致,需要修改结构时写默认插槽,行为不变。\n */\nfunction renderDefaultTree(\n collection: readonly SelectNodeMeta[],\n tags: readonly SelectTagMeta[] | null,\n label: (VNode | string)[] | null,\n clearable: boolean,\n itemSlot?: (node: SelectNodeMeta) => VNode[],\n prefixSlot?: (node: SelectNodeMeta) => VNode[],\n suffixSlot?: (node: SelectNodeMeta) => VNode[],\n): VNode[] {\n // 多选的已选项在触发器里排成标签:占位文字与标签行同时写着,有选中时标签露面、占位让位;\n // 触发器里的标签只作展示(按钮不能套按钮),摆不下的折进 +N\n const trigger = h(XhSelectTrigger, null, () => [\n h(XhSelectValueText),\n ...(tags\n ? [h(XhSelectTagList, null, () => [\n ...tags.map(tag => h(XhSelectTag, { key: tag.value, value: tag.value }, () => tag.label)),\n h(XhSelectOverflowTag),\n ])]\n : []),\n h(XhSelectIndicator),\n ])\n return [\n ...(label ? [h(XhSelectLabel, null, () => label)] : []),\n // control 是盒:描边、底色与聚焦环都长在它上面,触发器与清空钮在里面并排。\n // 清空钮排在触发器之后(按钮不能套按钮),展开箭头是触发器里的指示符,\n // 视觉上仍是「清空在左、箭头在右」\n h(XhSelectControl, null, () => (clearable ? [trigger, h(XhSelectClearTrigger)] : [trigger])),\n h(XhSelectPositioner, null, () => [\n h(XhSelectContent, null, () => h(XhSelectList, null, () => collection.map(node =>\n h(XhSelectItem, { key: node.value, value: node.value }, () => [\n ...(prefixSlot ? [h(XhSelectItemPrefix, null, () => prefixSlot(node))] : []),\n h(XhSelectItemText, null, () => itemSlot?.(node) ?? node.label),\n ...(node.description != null ? [h(XhSelectItemDescription, null, () => node.description)] : []),\n ...(suffixSlot ? [h(XhSelectItemSuffix, null, () => suffixSlot(node))] : []),\n h(XhSelectItemIndicator),\n ]),\n ))),\n ]),\n ]\n}\n"],"mappings":";;;;;;;;;;AA4BA,MAAa,eAA+B,gCAAgB;CAC1D,MAAM;CAEN,OAAO;EACL,YAAY,EAAE,MAAM,MAAgC;EACpD,aAAa,EAAE,MAAM,OAA0C;;EAE/D,OAAO,EAAE,MAAM,OAAO;EACtB,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,EAAwC;EACrE,cAAc,EAAE,MAAM,CAAC,QAAQ,KAAK,EAAwC;EAC5E,UAAU;EACV,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;EACb,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;;EAE9C,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;;EAE9C,WAAW;EACX,SAAS;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC7C,SAAS;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC7C,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,MAAM,EAAE,MAAM,OAAO;EACrB,cAAc,EAAE,MAAM,OAAgD;EACtE,aAAa,EAAE,MAAM,OAAO;EAC5B,aAAa,EAAE,MAAM,OAAO;EAC5B,WAAW,EAAE,MAAM,OAA8B;EACjD,QAAQ,EAAE,MAAM,OAAO;EACvB,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,KAAK,EAAE,MAAM,OAA8B;EAC3C,SAAS,EAAE,MAAM,OAAmC;EACpD,MAAM,EAAE,MAAM,OAAyB;EACvC,MAAM,EAAE,MAAM,OAAyB;CACzC;CAGA,OAAO;EACL,iBAAiB,aAAuC;EACxD,gBAAgB,aAAsC;EACtD,iBAAiB,WAAqB;EACtC,gBAAgB,UAAmB;CACrC;CACA,OAAO;CAUP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,eAA6C,YAAY;GAC7D,KAAK,gBAAgB,OAAO;GAC5B,KAAK,gBAAgB,QAAQ,KAAK;EACpC;EACA,MAAM,cAA2C,YAAY;GAC3D,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,MAAM,UAAU,aAAa,UAAU,oBAAoB,KAAK,CAAC,GAAkB,aAAa,UAAU;EAChH,cAAc,GAAG;EAIjB,MAAM,qBAA4B;GAChC,MAAM,MAAM,IAAI,IAAI;GACpB,MAAM,UAAU,CAAC,EAAE,UAAU,EAAE,OAAO,GAAG,CAAC,CAAC;GAC3C,KAAK,MAAM,CAAC,GAAG,MAAM,IAAI,MAAM,QAAQ,GACrC,QAAQ,KAAK,EAAE,UAAU;IAAE,OAAO;IAAG,UAAU;GAAK,GAAG,IAAI,UAAU,MAAM,CAAC,CAAC;GAC/E,OAAO,EAAE,UAAU,IAAI,qBAAqB,GAA8B,OAAO;EACnF;EAEA,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,CAC7E,aAAa,GACb,GAAI,MAAM,UACN,MAAM,QAAQ;GACd,MAAM,IAAI,IAAI,MAAM;GACpB,OAAO,IAAI,IAAI,MAAM;GACrB,aAAa,IAAI,IAAI,MAAM;GAC3B,MAAM,IAAI,IAAI,MAAM;GACpB,eAAe,IAAI,IAAI,MAAM;GAC7B,cAAc,IAAI,IAAI,MAAM;GAC5B,SAAS,IAAI,IAAI,MAAM;GACvB,UAAU,IAAI,IAAI,MAAM;GACxB,OAAO,IAAI,IAAI,MAAM;GACrB,UAAU,IAAI,IAAI,MAAM;EAC1B,CAAC,KAAK,CAAC,IACL,MAAM,aACJ,kBACE,IAAI,IAAI,MAAM,YACd,MAAM,WAAW,IAAI,IAAI,MAAM,OAAO,MACtC,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,CAAC,MAAM,KAAK,IAAI,OAC1D,MAAM,WACN,MAAM,MACN,MAAM,gBACN,MAAM,cACR,IACA,CAAC,CACT,CAAC;CACH;AACF,CAAC;AAED,MAAa,gBAAgC,gCAAgB;CAC3D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACpG;AACF,CAAC;AAED,MAAa,kBAAkC,gCAAgB;CAC7D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAE7B,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,gBAAgB;GACjC,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,kBAAkC,gCAAgB;CAC7D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAElB,MAAM,cAAc,oBAAoB;EAExC,MAAM,aAAa,oBAAoB;EACvC,MAAM,MAAM,iBAAiB;EAC7B,aAAa,EAAE,UAAU,WAAW,MAAM;GACxC,GAAG,YAAY;GACf,GAAG,IAAI,IAAI,MAAM,gBAAgB;GACjC,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,CAAC,GAAG,MAAM,UAAU,CAAC;CACvB;AACF,CAAC;AAED,MAAa,oBAAoC,gCAAgB;CAC/D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAE7B,aAAa,EACX,QACA,IAAI,IAAI,MAAM,kBAAkB,GAChC,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,WACrC;CACF;AACF,CAAC;AAED,MAAa,oBAAoC,gCAAgB;CAC/D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,kBAAkB,GAA8B,MAAM,UAAU,CAAC;CACxG;AACF,CAAC;AAED,MAAa,uBAAuC,gCAAgB;CAClE,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAE7B,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC7G;AACF,CAAC;AAED,MAAa,kBAAkC,gCAAgB;CAC7D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAE7B,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,gBAAgB,GAA8B,MAAM,UAAU,CAAC;CACtG;AACF,CAAC;;AAGD,MAAa,mBAAmC,gCAAgB;CAC9D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,iBAAiB,GAA8B,MAAM,UAAU,CAAC;CACvG;AACF,CAAC;;;;;;AAOD,SAAS,YAAY,SAAqE;CACxF,IAAI,OAAO,YAAY,UACrB,OAAO,CAAC,EAAE,kBAAkB,YAAY,OAAO,CAAC;CAClD,OAAO,gBAAgB,OAAO,IAAI,CAAC,EAAE,kBAAkB,YAAY,OAAO,CAAC,IAAI;AACjF;;AAGA,MAAa,cAA8B,gCAAgB;CACzD,MAAM;CACN,OAAO;;AAEL,OAAO;EAAE,MAAM;EAAQ,UAAU;CAAK,EACxC;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,iBAAiB;EAC7B,iBAAiB,EAAE,aAAa,MAAM,MAAM,CAAC;EAE7C,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,YAAY,EAAE,OAAO,MAAM,MAAM,CAAC,GAA8B,YAAY,MAAM,UAAU,CAAC,CAAC;CACrI;AACF,CAAC;;AAGD,MAAa,sBAAsC,gCAAgB;CACjE,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,aAAa,EACX,QACA,IAAI,IAAI,MAAM,oBAAoB,GAClC,YAAY,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,YAAY,CAC7D;CACF;AACF,CAAC;;AAGD,MAAa,4BAA4C,gCAAgB;CACvE,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,0BAA0B,EAAE,OAAO,IAAI,MAAM,EAAE,CAAC,GAA8B,MAAM,UAAU,CAAC;CACxI;AACF,CAAC;AAED,MAAa,qBAAqC,gCAAgB;CAChE,MAAM;CACN,OAAO;;AAEL,WAAW,EAAE,MAAM,OAA4B,EACjD;CAEA,cAAc;CACd,MAAM,OAAO,EAAE,OAAO,SAAS;EAC7B,MAAM,MAAM,iBAAiB;EAE7B,MAAM,OAAO,cAAc;GAAE,kBAAkB,IAAI,QAAQ;GAAO,OAAO,EAAE,MAAM,KAAK;EAAE,CAAC;EAEzF,aAAa,EAAE,UAAU;GAAE,IAAI,MAAM,aAAa,IAAI,aAAa;GAAO,QAAQ,IAAI;EAAW,SAAS,CACxG,EAAE,OAAO;GACP,GAAG,WAAW,IAAI,IAAI,MAAM,mBAAmB,GAA8B,KAAK;GAClF,MAAM,OAAgB;IAAE,IAAI,cAAc,QAAQ;GAAkB;EACtE,GAAG,CAAC,GAAI,MAAM,UAAU,KAAK,CAAC,GAAI,GAAG,KAAK,OAAO,CAAC,CAAC,CACrD,CAAC;CACH;AACF,CAAC;AAED,MAAa,kBAAkC,gCAAgB;CAC7D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,gBAAgB;GAGjC,OAAO,IAAI,QAAQ,QAAQ,KAAA,IAAY,EAAE,SAAS,OAAO;GACzD,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,eAA+B,gCAAgB;CAC1D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAE7B,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,aAAa;GAC9B,MAAM,OAAgB;IAAE,IAAI,QAAQ,QAAQ;GAAkB;EAChE,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,iBAAiC,gCAAgB;CAC5D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAG7B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,eAAe,GAA8B,MAAM,UAAU,CAAC;CACpG;AACF,CAAC;AAED,MAAa,gBAAgC,gCAAgB;CAC3D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAG7B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACnG;AACF,CAAC;AAED,MAAa,kBAAkC,gCAAgB;CAC7D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAE7B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,gBAAgB,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,gBAAgC,gCAAgB;CAC3D,MAAM;CACN,OAAO,EACL,OAAO;EAAE,MAAM;EAAQ,UAAU;CAAK,EACxC;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,iBAAiB;EAC7B,MAAM,QAAQ,gBAAkC,EAAE,OAAO,MAAM,MAAM,EAAE;EACvE,mBAAmB,EAAE,MAAM,CAAC;EAE5B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,cAAc,MAAM,KAAK,GAA8B,MAAM,UAAU,CAAC;CAC9G;AACF,CAAC;AAED,MAAa,qBAAqC,gCAAgB;CAChE,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,MAAM,EAAE,UAAU,sBAAsB;EACxC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,mBAAmB,MAAM,KAAK,GAA8B,MAAM,UAAU,CAAC;CACpH;AACF,CAAC;AAED,MAAa,eAA+B,gCAAgB;CAC1D,MAAM;CACN,OAAO;EACL,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;EAEtC,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;CAChD;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,iBAAiB;EAC7B,MAAM,OAAO,gBAAiC;GAAE,OAAO,MAAM;GAAO,UAAU,MAAM;EAAS,EAAE;EAC/F,kBAAkB,EAAE,KAAK,CAAC;EAE1B,MAAM,SAAS,IAAwB,IAAI;EAC3C,YAAY,MAAM,QAAQ,MAAM,SAAS;GACvC,IAAI,SAAS,MACX;GACF,MAAM,MAAM,IAAI;GAChB,IAAI,IAAI,UAAU,MAAM,WACtB;GACF,IAAI,OAAO,SAAS,IAAI,MAAM,iBAAiB,MAAM,OAAO,OAC1D,IAAI,KAAK;IAAE,MAAM;IAAkB,OAAO;GAAK,CAAC;EACpD,CAAC;EACD,sBAAsB;GACpB,MAAM,EAAE,YAAY;GACpB,IAAI,QAAQ,UAAU,MAAM,WAC1B;GACF,IAAI,QAAQ,KAAK,aAAa,KAAK,QAAQ,KAAK,YAAY,CAAC,EAAE,MAAK,SAAQ,KAAK,UAAU,MAAM,KAAK,GACpG;GAEF,IAAI,OAAO,SAAS,QAAQ,MAAM,iBAAiB,MAAM,OAAO,OAC9D,QAAQ,KAAK,EAAE,MAAM,YAAY,CAAC;EACtC,CAAC;EACD,aAAa,EACX,OACA;GAAE,GAAG,IAAI,IAAI,MAAM,aAAa,KAAK,KAAK;GAA8B,KAAK;EAAO,GACpF,MAAM,UAAU,CAClB;CACF;AACF,CAAC;AAED,MAAa,mBAAmC,gCAAgB;CAC9D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,MAAM,EAAE,SAAS,qBAAqB;EACtC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,iBAAiB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACjH;AACF,CAAC;;AAGD,MAAa,qBAAqC,gCAAgB;CAChE,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,MAAM,EAAE,SAAS,qBAAqB;EACtC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,mBAAmB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACnH;AACF,CAAC;;AAGD,MAAa,qBAAqC,gCAAgB;CAChE,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,MAAM,EAAE,SAAS,qBAAqB;EACtC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,mBAAmB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACnH;AACF,CAAC;;AAGD,MAAa,0BAA0C,gCAAgB;CACrE,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,MAAM,EAAE,SAAS,qBAAqB;EACtC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,wBAAwB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACxH;AACF,CAAC;AAED,MAAa,wBAAwC,gCAAgB;CACnE,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,iBAAiB;EAC7B,MAAM,EAAE,SAAS,qBAAqB;EACtC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,sBAAsB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACtH;AACF,CAAC;;;;;AAMD,SAAS,kBACP,YACA,MACA,OACA,WACA,UACA,YACA,YACS;CAGT,MAAM,UAAU,EAAE,iBAAiB,YAAY;EAC7C,EAAE,iBAAiB;EACnB,GAAI,OACA,CAAC,EAAE,iBAAiB,YAAY,CAC9B,GAAG,KAAK,KAAI,QAAO,EAAE,aAAa;GAAE,KAAK,IAAI;GAAO,OAAO,IAAI;EAAM,SAAS,IAAI,KAAK,CAAC,GACxF,EAAE,mBAAmB,CACvB,CAAC,CAAC,IACF,CAAC;EACL,EAAE,iBAAiB;CACrB,CAAC;CACD,OAAO;EACL,GAAI,QAAQ,CAAC,EAAE,eAAe,YAAY,KAAK,CAAC,IAAI,CAAC;EAIrD,EAAE,iBAAiB,YAAa,YAAY,CAAC,SAAS,EAAE,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAE;EAC3F,EAAE,oBAAoB,YAAY,CAChC,EAAE,iBAAiB,YAAY,EAAE,cAAc,YAAY,WAAW,KAAI,SACxE,EAAE,cAAc;GAAE,KAAK,KAAK;GAAO,OAAO,KAAK;EAAM,SAAS;GAC5D,GAAI,aAAa,CAAC,EAAE,oBAAoB,YAAY,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC;GAC1E,EAAE,kBAAkB,YAAY,WAAW,IAAI,KAAK,KAAK,KAAK;GAC9D,GAAI,KAAK,eAAe,OAAO,CAAC,EAAE,yBAAyB,YAAY,KAAK,WAAW,CAAC,IAAI,CAAC;GAC7F,GAAI,aAAa,CAAC,EAAE,oBAAoB,YAAY,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC;GAC1E,EAAE,qBAAqB;EACzB,CAAC,CACH,CAAC,CAAC,CACJ,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"select.js","names":[],"sources":["../../../src/components/select/select.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// 提供 select 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type { CollectionVirtualizer, SelectApi, SelectGroupProps, SelectItemProps, SelectNode, SelectNodeMeta, SelectOpenChangeDetails, SelectSchema, SelectTagMeta, SelectValueChangeDetails } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, 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 { provideSelect, provideSelectGroup, provideSelectItem, provideSelectTag, useSelectContext, useSelectGroupContext, useSelectItemContext, useSelectTagContext } from './context'\nimport { useSelect } from './use-select'\n\ntype SelectProps = SelectSchema['props']\n\n/** 默认插槽的载荷:展开态、选中集合与显示文字、可见标签与被折叠的个数及其文字,以及修改展开、修改值、清空、移除值四个动作。 */\nexport type SelectRootSlotProps = Pick<\n SelectApi,\n 'open' | 'value' | 'displayText' | 'tags' | 'overflowCount' | 'overflowText' | 'setOpen' | 'setValue' | 'clear' | 'deselect'\n>\n\nexport const XhSelectRoot = /* @__PURE__ */ defineComponent({\n name: 'XhSelectRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<SelectNode[]> },\n virtualizer: { type: Object as PropType<CollectionVirtualizer> },\n /** 标题文字。提供后不必再写 label 部件;需要放置其他内容时改用 label 插槽。 */\n label: { type: String },\n value: { type: [String, Array] as PropType<string | string[] | null> },\n defaultValue: { type: [String, Array] as PropType<string | string[] | null> },\n multiple: Boolean,\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n disabled: { type: Boolean, default: undefined },\n /** 只读:浮层照常展开与浏览,但选中值不可修改、也不可清空。 */\n readOnly: { type: Boolean, default: undefined },\n /** 自动渲染树中是否带清空按钮;手写部件不使用它,写了节点即可清空。 */\n clearable: Boolean,\n invalid: { type: Boolean, default: undefined },\n loading: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n translations: { type: Object as PropType<SelectProps['translations']> },\n maxTagCount: { type: Number },\n placeholder: { 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 variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // *-change 携带 details 对象,update:* 携带裸值。\n // 校验函数恒真,只声明载荷类型:'update:value' 是 string[],单选也是长度 1 的数组而非裸串。\n emits: {\n 'clear': () => true,\n 'value-change': (_details: SelectValueChangeDetails) => true,\n 'open-change': (_details: SelectOpenChangeDetails) => true,\n 'update:value': (_value: string[]) => true,\n 'update:open': (_open: boolean) => true,\n },\n slots: Object as SlotsType<{\n 'default'?: (props: SelectRootSlotProps) => VNode[]\n 'label'?: () => VNode[]\n /** 只填条目的文字槽,副文本与首尾两格照旧各归各的 */\n 'item'?: (node: SelectNodeMeta) => VNode[]\n /** 只接管行首那一格,其余槽照旧由数据铺 */\n 'item-prefix'?: (node: SelectNodeMeta) => VNode[]\n /** 只接管行尾那一格(计数、徽标、次级图标),其余槽照旧由数据铺 */\n 'item-suffix'?: (node: SelectNodeMeta) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: SelectProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: SelectProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useSelect(withHandlers(withXhConfig('select', useFormControlProps(props)), { onClear: () => emit('clear') }) as SelectProps, notifyValue, notifyOpen)\n provideSelect(ctx)\n\n // 表单影子由根部件装配:空串选项打底,每个选中值一个 selected 选项,供 required 判定。\n // 选中态一律靠选项的 selected 表达,多选下 select.value 表达不了集合。\n const hiddenSelect = (): VNode => {\n const api = ctx.api.value\n const options = [h('option', { value: '' })]\n for (const [i, v] of api.value.entries())\n options.push(h('option', { value: v, selected: true }, api.valueText[i] ?? v))\n return h('select', api.getHiddenSelectProps() as Record<string, unknown>, options)\n }\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, [\n hiddenSelect(),\n ...(slots.default\n ? slots.default({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n displayText: ctx.api.value.displayText,\n tags: ctx.api.value.tags,\n overflowCount: ctx.api.value.overflowCount,\n overflowText: ctx.api.value.overflowText,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n deselect: ctx.api.value.deselect,\n }) ?? []\n : props.collection\n ? renderDefaultTree(\n ctx.api.value.collection,\n props.multiple ? ctx.api.value.tags : null,\n slots.label?.() ?? (props.label != null ? [props.label] : null),\n props.clearable,\n slots.item,\n slots['item-prefix'],\n slots['item-suffix'],\n )\n : []),\n ])\n },\n})\n\nexport const XhSelectLabel = /* @__PURE__ */ defineComponent({\n name: 'XhSelectLabel',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectControl = /* @__PURE__ */ defineComponent({\n name: 'XhSelectControl',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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 XhSelectTrigger = /* @__PURE__ */ defineComponent({\n name: 'XhSelectTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useSelectContext()\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 XhSelectValueText = /* @__PURE__ */ defineComponent({\n name: 'XhSelectValueText',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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 XhSelectIndicator = /* @__PURE__ */ defineComponent({\n name: 'XhSelectIndicator',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n return () => h('span', ctx.api.value.getIndicatorProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectClearTrigger = /* @__PURE__ */ defineComponent({\n name: 'XhSelectClearTrigger',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 节点常挂,清不了时靠 hidden 藏掉\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectTagList = /* @__PURE__ */ defineComponent({\n name: 'XhSelectTagList',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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 XhSelectTagLabel = /* @__PURE__ */ defineComponent({\n name: 'XhSelectTagLabel',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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(XhSelectTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhSelectTagLabel, null, () => content)] : content\n}\n\n/** 一个选中值一个标签,即库内 tag 的 root(data-scope=\"tag\"):语气、尺寸与禁用从 select 传下,形态按控件的面派生;触发器内纯展示,触发器外配合 XhSelectItemDeleteTrigger 可删除。 */\nexport const XhSelectTag = /* @__PURE__ */ defineComponent({\n name: 'XhSelectTag',\n props: {\n /** 它代表哪个选中值。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSelectContext()\n provideSelectTag({ value: () => props.value })\n // 标签随文排在触发器那一行里,根用 span\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 XhSelectOverflowTag = /* @__PURE__ */ defineComponent({\n name: 'XhSelectOverflowTag',\n setup(_, { slots }) {\n const ctx = useSelectContext()\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 XhSelectItemDeleteTrigger = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const tag = useSelectTagContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectPositioner = /* @__PURE__ */ defineComponent({\n name: 'XhSelectPositioner',\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 = useSelectContext()\n // 列表的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner,条子走浮层 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.listRef.value, props: { size: 'sm' } })\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 XhSelectContent = /* @__PURE__ */ defineComponent({\n name: 'XhSelectContent',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhSelectList = /* @__PURE__ */ defineComponent({\n name: 'XhSelectList',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 列表框本体:条目放这里面。滚动也在这一层,底部操作区因此不随条目滚走\n return () => h('div', {\n ...ctx.api.value.getListProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.listRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhSelectFooter = /* @__PURE__ */ defineComponent({\n name: 'XhSelectFooter',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 浮层底部的操作区:是 list 的兄弟,不进列表框的拥有关系,\n // 放在里面的按钮既不违反 listbox 的子节点约束,也不会被方向键与连打检索走到\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectEmpty = /* @__PURE__ */ defineComponent({\n name: 'XhSelectEmpty',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 空态占位:写在 content 里、list 的兄弟,不进列表框的拥有关系。\n // 给了 collection 时收放归连接层,条目手写时归作者\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectLoading = /* @__PURE__ */ defineComponent({\n name: 'XhSelectLoading',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n // 在途占位:与空态占位同一个位置,取数期间顶上来\n return () => h('div', ctx.api.value.getLoadingProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectGroup = /* @__PURE__ */ defineComponent({\n name: 'XhSelectGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSelectContext()\n const group = computed<SelectGroupProps>(() => ({ value: props.value }))\n provideSelectGroup({ group })\n // 分组容器:条目照常挂在它里面,role=group 是列表框允许拥有的两种子节点之一\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectGroupLabel = /* @__PURE__ */ defineComponent({\n name: 'XhSelectGroupLabel',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { group } = useSelectGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectItem = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItem',\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 = useSelectContext()\n const item = computed<SelectItemProps>(() => ({ value: props.value, disabled: props.disabled }))\n provideSelectItem({ item })\n // 本条目持有焦点时,value 变更重报高亮条目,卸载时上报条目丢失\n const itemEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const svc = ctx.service\n if (svc.getStatus() !== 'Started')\n return\n if (itemEl.value && svc.scope.getActiveElement() === itemEl.value)\n svc.send({ type: 'ITEM.HIGHLIGHT', value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (service.prop('virtualizer') && service.prop('collection')?.some(node => node.value === props.value))\n return\n // 按「本节点当下正持有焦点」判定,不按 value 比对\n if (itemEl.value && service.scope.getActiveElement() === itemEl.value)\n service.send({ type: 'ITEM.LOST' })\n })\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\nexport const XhSelectItemText = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemText',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行首的作者内容(图标、色块、头像),对读屏隐藏 */\nexport const XhSelectItemPrefix = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemPrefix',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemPrefixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行尾的作者内容(计数、徽标) */\nexport const XhSelectItemSuffix = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemSuffix',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemSuffixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */\nexport const XhSelectItemDescription = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemDescription',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSelectItemIndicator = /* @__PURE__ */ defineComponent({\n name: 'XhSelectItemIndicator',\n setup(_, { slots }) {\n const ctx = useSelectContext()\n const { item } = useSelectItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 未写默认插槽时按 collection 铺开的整套结构,作者只提供数据。\n * 与手写部件产出的 DOM 完全一致,需要修改结构时写默认插槽,行为不变。\n */\nfunction renderDefaultTree(\n collection: readonly SelectNodeMeta[],\n tags: readonly SelectTagMeta[] | null,\n label: (VNode | string)[] | null,\n clearable: boolean,\n itemSlot?: (node: SelectNodeMeta) => VNode[],\n prefixSlot?: (node: SelectNodeMeta) => VNode[],\n suffixSlot?: (node: SelectNodeMeta) => VNode[],\n): VNode[] {\n // 多选的已选项在触发器里排成标签:占位文字与标签行同时写着,有选中时标签露面、占位让位;\n // 触发器里的标签只作展示(按钮不能套按钮),摆不下的折进 +N\n const trigger = h(XhSelectTrigger, null, () => [\n h(XhSelectValueText),\n ...(tags\n ? [h(XhSelectTagList, null, () => [\n ...tags.map(tag => h(XhSelectTag, { key: tag.value, value: tag.value }, () => tag.label)),\n h(XhSelectOverflowTag),\n ])]\n : []),\n h(XhSelectIndicator),\n ])\n return [\n ...(label ? [h(XhSelectLabel, null, () => label)] : []),\n // control 是盒:描边、底色与聚焦环都长在它上面,触发器与清空钮在里面并排。\n // 清空钮排在触发器之后(按钮不能套按钮),展开箭头是触发器里的指示符,\n // 视觉上仍是「清空在左、箭头在右」\n h(XhSelectControl, null, () => (clearable ? [trigger, h(XhSelectClearTrigger)] : [trigger])),\n h(XhSelectPositioner, null, () => [\n h(XhSelectContent, null, () => h(XhSelectList, null, () => collection.map(node =>\n h(XhSelectItem, { key: node.value, value: node.value }, () => [\n ...(prefixSlot ? [h(XhSelectItemPrefix, null, () => prefixSlot(node))] : []),\n h(XhSelectItemText, null, () => itemSlot?.(node) ?? node.label),\n ...(node.description != null ? [h(XhSelectItemDescription, null, () => node.description)] : []),\n ...(suffixSlot ? [h(XhSelectItemSuffix, null, () => suffixSlot(node))] : []),\n h(XhSelectItemIndicator),\n ]),\n ))),\n ]),\n ]\n}\n"],"mappings":"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"}
@@ -40,6 +40,7 @@ declare const XhSignaturePadRoot: import("vue").DefineComponent<import("vue").Ex
40
40
  }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
41
41
  [key: string]: any;
42
42
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
43
+ clear: () => true;
43
44
  draw: (_details: PayloadOf<SignaturePadProps, "onDraw">) => true;
44
45
  'draw-end': (_details: PayloadOf<SignaturePadProps, "onDrawEnd">) => true;
45
46
  'value-change': (_details: PayloadOf<SignaturePadProps, "onValueChange">) => true;
@@ -79,6 +80,7 @@ declare const XhSignaturePadRoot: import("vue").DefineComponent<import("vue").Ex
79
80
  }>> & Readonly<{
80
81
  "onValue-change"?: ((_details: import("@xihan-ui/headless").SignaturePadValueChangeDetails) => any) | undefined;
81
82
  "onUpdate:value"?: ((_value: SignaturePadValue) => any) | undefined;
83
+ onClear?: (() => any) | undefined;
82
84
  onDraw?: ((_details: import("@xihan-ui/headless").SignaturePadDrawDetails) => any) | undefined;
83
85
  "onDraw-end"?: ((_details: import("@xihan-ui/headless").SignaturePadDrawEndDetails) => any) | undefined;
84
86
  }>, {
@@ -1 +1 @@
1
- {"version":3,"file":"signature-pad.d.ts","names":[],"sources":["../../../src/components/signature-pad/signature-pad.ts"],"mappings":";;;;KAgBK,oBAAoB;;KAGb,4BAA4B,KACtC;cAgBW,kCAAkB,8BAAA;;;;;;;;;;;;;;;;;;;;;IAUF,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACJ,MAAA,SAAS,QAAQ;;;;;EAI9B,OAAA,UAAA,UAAU;EACN,aAAA,UAAA,UAAU;EACN,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;;;;;;;;;;;;;;IAVV,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACJ,MAAA,SAAS,QAAQ;;;;;;;;;;;;;EAUvC,WAAC,OAAO,8BAA8B;kCA2BlD;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAWhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,0CAA0B,0BAAA,oBAAA,4BAAA;;8BAMrC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,yCAAyB,0BAAA,oBAAA,4BAAA;;8BAMpC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,yCAAyB,0BAAA,oBAAA,4BAAA;;8BAMpC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAW/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,yCAAyB,0BAAA,oBAAA,4BAAA;;8BAMpC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"signature-pad.d.ts","names":[],"sources":["../../../src/components/signature-pad/signature-pad.ts"],"mappings":";;;;KAiBK,oBAAoB;;KAGb,4BAA4B,KACtC;cAgBW,kCAAkB,8BAAA;;;;;;;;;;;;;;;;;;;;;IAUF,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACJ,MAAA,SAAS,QAAQ;;;;;;EAK9B,OAAA,UAAA,UAAU;EACN,aAAA,UAAA,UAAU;EACN,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;;;;;;;;;;;;;;IAXV,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACJ,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;EAWvC,WAAC,OAAO,8BAA8B;kCA2BlD;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAWhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,0CAA0B,0BAAA,oBAAA,4BAAA;;8BAMrC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,yCAAyB,0BAAA,oBAAA,4BAAA;;8BAMpC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,yCAAyB,0BAAA,oBAAA,4BAAA;;8BAMpC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAW/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,yCAAyB,0BAAA,oBAAA,4BAAA;;8BAMpC,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 { provideSignaturePad, useSignaturePadContext } from "./context.js";
4
5
  import { useSignaturePad } from "./use-signature-pad.js";
@@ -30,6 +31,7 @@ const XhSignaturePadRoot = defineComponent({
30
31
  translations: { type: Object }
31
32
  },
32
33
  emits: {
34
+ "clear": () => true,
33
35
  "draw": (_details) => true,
34
36
  "draw-end": (_details) => true,
35
37
  "value-change": (_details) => true,
@@ -43,7 +45,7 @@ const XhSignaturePadRoot = defineComponent({
43
45
  emit("value-change", details);
44
46
  emit("update:value", details.value);
45
47
  };
46
- const ctx = useSignaturePad(withXhConfig("signature-pad", useFormControlProps(props)), {
48
+ const ctx = useSignaturePad(withHandlers(withXhConfig("signature-pad", useFormControlProps(props)), { onClear: () => emit("clear") }), {
47
49
  onDraw,
48
50
  onDrawEnd,
49
51
  onValueChange
@@ -1 +1 @@
1
- {"version":3,"file":"signature-pad.js","names":[],"sources":["../../../src/components/signature-pad/signature-pad.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// 提供 signature pad 相关实现。\n\nimport type { SignaturePadApi, SignaturePadDrawingOptions, SignaturePadSchema, SignaturePadTranslations, SignaturePadValue } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideSignaturePad, useSignaturePadContext } from './context'\nimport { useSignaturePad } from './use-signature-pad'\n\ntype SignaturePadProps = SignaturePadSchema['props']\n\n/** 默认插槽的载荷:签名数据、笔迹路径与空态、落笔中标记,以及导出、清空、撤销与重做的动作。 */\nexport type SignaturePadRootSlotProps = Pick<\n SignaturePadApi,\n | 'value'\n | 'paths'\n | 'empty'\n | 'drawing'\n | 'disabled'\n | 'readOnly'\n | 'canUndo'\n | 'canRedo'\n | 'statusText'\n | 'toSvg'\n | 'clear'\n | 'undo'\n | 'redo'\n>\n\nexport const XhSignaturePadRoot = defineComponent({\n name: 'XhSignaturePadRoot',\n // 缺省值由 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n // 缺席值 undefined 表示非受控\n value: { type: Object as PropType<SignaturePadValue> },\n defaultValue: { type: Object as PropType<SignaturePadValue> },\n drawing: { type: Object as PropType<SignaturePadDrawingOptions> },\n translations: { type: Object as PropType<Partial<SignaturePadTranslations>> },\n },\n // draw / draw-end 是笔迹通知;value-change 携带 { value },update:value 携带裸值\n emits: {\n 'draw': (_details: PayloadOf<SignaturePadProps, 'onDraw'>) => true,\n 'draw-end': (_details: PayloadOf<SignaturePadProps, 'onDrawEnd'>) => true,\n 'value-change': (_details: PayloadOf<SignaturePadProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SignaturePadProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SignaturePadRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onDraw: SignaturePadProps['onDraw'] = details => emit('draw', details)\n const onDrawEnd: SignaturePadProps['onDrawEnd'] = details => emit('draw-end', details)\n const onValueChange: SignaturePadProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useSignaturePad(withXhConfig('signature-pad', useFormControlProps(props)) as SignaturePadProps, { onDraw, onDrawEnd, onValueChange })\n provideSignaturePad(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n paths: ctx.api.value.paths,\n empty: ctx.api.value.empty,\n drawing: ctx.api.value.drawing,\n disabled: ctx.api.value.disabled,\n readOnly: ctx.api.value.readOnly,\n canUndo: ctx.api.value.canUndo,\n canRedo: ctx.api.value.canRedo,\n statusText: ctx.api.value.statusText,\n toSvg: ctx.api.value.toSvg,\n clear: ctx.api.value.clear,\n undo: ctx.api.value.undo,\n redo: ctx.api.value.redo,\n }))\n },\n})\n\nexport const XhSignaturePadLabel = defineComponent({\n name: 'XhSignaturePadLabel',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 不用原生 label:画布是 svg、不是可被 label 关联的表单控件,名字经 aria-labelledby 挂过去\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadControl = defineComponent({\n name: 'XhSignaturePadControl',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 画布是 svg:笔迹与基准线都是图元。viewBox 由连接层按钉住的尺寸给,\n // 基准线与笔迹都建在这棵 svg 子树里,命名空间由它带下去\n return () => h('svg', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: ctx.controlRef,\n }, slots.default?.())\n },\n})\n\nexport const XhSignaturePadGuide = defineComponent({\n name: 'XhSignaturePadGuide',\n setup() {\n const ctx = useSignaturePadContext()\n return () => h('line', ctx.api.value.getGuideProps() as Record<string, unknown>)\n },\n})\n\nexport const XhSignaturePadPath = defineComponent({\n name: 'XhSignaturePadPath',\n setup() {\n const ctx = useSignaturePadContext()\n // 全部笔迹落在这一条路径上,每一笔是它的一条子路径\n return () => h('path', ctx.api.value.getPathProps() as Record<string, unknown>)\n },\n})\n\nexport const XhSignaturePadClearTrigger = defineComponent({\n name: 'XhSignaturePadClearTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadUndoTrigger = defineComponent({\n name: 'XhSignaturePadUndoTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getUndoTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadRedoTrigger = defineComponent({\n name: 'XhSignaturePadRedoTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getRedoTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadStatus = defineComponent({\n name: 'XhSignaturePadStatus',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 作者不写内容就用内建那句话,读屏才有东西可念\n return () => h(\n 'span',\n ctx.api.value.getStatusProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.statusText,\n )\n },\n})\n\nexport const XhSignaturePadHiddenInput = defineComponent({\n name: 'XhSignaturePadHiddenInput',\n setup() {\n const ctx = useSignaturePadContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"signature-pad.js","names":[],"sources":["../../../src/components/signature-pad/signature-pad.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// 提供 signature pad 相关实现。\n\nimport type { SignaturePadApi, SignaturePadDrawingOptions, SignaturePadSchema, SignaturePadTranslations, SignaturePadValue } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideSignaturePad, useSignaturePadContext } from './context'\nimport { useSignaturePad } from './use-signature-pad'\n\ntype SignaturePadProps = SignaturePadSchema['props']\n\n/** 默认插槽的载荷:签名数据、笔迹路径与空态、落笔中标记,以及导出、清空、撤销与重做的动作。 */\nexport type SignaturePadRootSlotProps = Pick<\n SignaturePadApi,\n | 'value'\n | 'paths'\n | 'empty'\n | 'drawing'\n | 'disabled'\n | 'readOnly'\n | 'canUndo'\n | 'canRedo'\n | 'statusText'\n | 'toSvg'\n | 'clear'\n | 'undo'\n | 'redo'\n>\n\nexport const XhSignaturePadRoot = defineComponent({\n name: 'XhSignaturePadRoot',\n // 缺省值由 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n // 缺席值 undefined 表示非受控\n value: { type: Object as PropType<SignaturePadValue> },\n defaultValue: { type: Object as PropType<SignaturePadValue> },\n drawing: { type: Object as PropType<SignaturePadDrawingOptions> },\n translations: { type: Object as PropType<Partial<SignaturePadTranslations>> },\n },\n // draw / draw-end 是笔迹通知;value-change 携带 { value },update:value 携带裸值\n emits: {\n 'clear': () => true,\n 'draw': (_details: PayloadOf<SignaturePadProps, 'onDraw'>) => true,\n 'draw-end': (_details: PayloadOf<SignaturePadProps, 'onDrawEnd'>) => true,\n 'value-change': (_details: PayloadOf<SignaturePadProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SignaturePadProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SignaturePadRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onDraw: SignaturePadProps['onDraw'] = details => emit('draw', details)\n const onDrawEnd: SignaturePadProps['onDrawEnd'] = details => emit('draw-end', details)\n const onValueChange: SignaturePadProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useSignaturePad(withHandlers(withXhConfig('signature-pad', useFormControlProps(props)), { onClear: () => emit('clear') }) as SignaturePadProps, { onDraw, onDrawEnd, onValueChange })\n provideSignaturePad(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n paths: ctx.api.value.paths,\n empty: ctx.api.value.empty,\n drawing: ctx.api.value.drawing,\n disabled: ctx.api.value.disabled,\n readOnly: ctx.api.value.readOnly,\n canUndo: ctx.api.value.canUndo,\n canRedo: ctx.api.value.canRedo,\n statusText: ctx.api.value.statusText,\n toSvg: ctx.api.value.toSvg,\n clear: ctx.api.value.clear,\n undo: ctx.api.value.undo,\n redo: ctx.api.value.redo,\n }))\n },\n})\n\nexport const XhSignaturePadLabel = defineComponent({\n name: 'XhSignaturePadLabel',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 不用原生 label:画布是 svg、不是可被 label 关联的表单控件,名字经 aria-labelledby 挂过去\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadControl = defineComponent({\n name: 'XhSignaturePadControl',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 画布是 svg:笔迹与基准线都是图元。viewBox 由连接层按钉住的尺寸给,\n // 基准线与笔迹都建在这棵 svg 子树里,命名空间由它带下去\n return () => h('svg', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: ctx.controlRef,\n }, slots.default?.())\n },\n})\n\nexport const XhSignaturePadGuide = defineComponent({\n name: 'XhSignaturePadGuide',\n setup() {\n const ctx = useSignaturePadContext()\n return () => h('line', ctx.api.value.getGuideProps() as Record<string, unknown>)\n },\n})\n\nexport const XhSignaturePadPath = defineComponent({\n name: 'XhSignaturePadPath',\n setup() {\n const ctx = useSignaturePadContext()\n // 全部笔迹落在这一条路径上,每一笔是它的一条子路径\n return () => h('path', ctx.api.value.getPathProps() as Record<string, unknown>)\n },\n})\n\nexport const XhSignaturePadClearTrigger = defineComponent({\n name: 'XhSignaturePadClearTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadUndoTrigger = defineComponent({\n name: 'XhSignaturePadUndoTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getUndoTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadRedoTrigger = defineComponent({\n name: 'XhSignaturePadRedoTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getRedoTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadStatus = defineComponent({\n name: 'XhSignaturePadStatus',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 作者不写内容就用内建那句话,读屏才有东西可念\n return () => h(\n 'span',\n ctx.api.value.getStatusProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.statusText,\n )\n },\n})\n\nexport const XhSignaturePadHiddenInput = defineComponent({\n name: 'XhSignaturePadHiddenInput',\n setup() {\n const ctx = useSignaturePadContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"slider.d.ts","names":[],"sources":["../../../src/components/slider/slider.ts"],"mappings":";;;;;KAiBK,cAAc;;KAGP,sBAAsB,KAChC;;UAKe;EACf,MAAM;;cAGK,4BAAY,8BAAA;;IAIG,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;IAMP,MAAA,SAAS;;;;;;;;;;;;;;;;;;;IAKF,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;;;;;;;;;IAIR,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;IAGb,MAAA,UAAU,SAAS;;;;;EAKZ,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;EACJ,qBAAA,UAAA,UAAU;;;IA5BjB,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;IAMP,MAAA,SAAS;;;;;;;;;;;;;;;;;;;IAKF,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;;;;;;;;;IAIR,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;IAGb,MAAA,UAAU,SAAS;;;;;;;;;;;;;;;EAU7B,WAAC,OAAO,wBAAwB;kCAqB5C;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAMxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAM1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAUxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;;EAGnB,QAAC,OAAO,iCAAiC;kCAclD;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAMxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6BAAa,8BAAA;;;IAIa,MAAA;;;;;;;;IAAA,MAAA;;;;;qCAQrC;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAY5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"slider.d.ts","names":[],"sources":["../../../src/components/slider/slider.ts"],"mappings":";;;;;KAkBK,cAAc;;KAGP,sBAAsB,KAChC;;UAKe;EACf,MAAM;;cAGK,4BAAY,8BAAA;;IAIG,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;IAMP,MAAA,SAAS;;;;;;;;;;;;;;;;;;;IAKF,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;;;;;;;;;IAIR,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;IAGb,MAAA,UAAU,SAAS;;;;;EAKZ,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;EACJ,qBAAA,UAAA,UAAU;;;IA5BjB,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;IAMP,MAAA,SAAS;;;;;;;;;;;;;;;;;;;IAKF,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;;;;;;;;;IAIR,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;IAGb,MAAA,UAAU,SAAS;;;;;;;;;;;;;;;EAU7B,WAAC,OAAO,wBAAwB;kCAqB5C;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAMxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAM1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAUxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;;EAGnB,QAAC,OAAO,iCAAiC;kCAclD;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAMxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6BAAa,8BAAA;;;IAIa,MAAA;;;;;;;;IAAA,MAAA;;;;;qCAWrC;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAY5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -1,4 +1,5 @@
1
1
  import { useFormControlProps } from "../form/use-form-control.js";
2
+ import { useFieldGroupWiring, useFieldLabelWiring } from "../field/use-field-control.js";
2
3
  import { provideSlider, provideSliderThumb, useSliderContext, useSliderThumbContext } from "./context.js";
3
4
  import { useSlider } from "./use-slider.js";
4
5
  import { computed, defineComponent, h } from "vue";
@@ -133,7 +134,12 @@ index: {
133
134
  const ctx = useSliderContext();
134
135
  const index = computed(() => normalizeItemIndex(props.index));
135
136
  provideSliderThumb({ index });
136
- return () => h("div", ctx.api.value.getThumbProps(index.value), slots.default?.());
137
+ const fieldWiring = useFieldGroupWiring();
138
+ const fieldLabel = useFieldLabelWiring();
139
+ return () => h("div", fieldLabel.value({
140
+ ...fieldWiring.value,
141
+ ...ctx.api.value.getThumbProps(index.value)
142
+ }), slots.default?.());
137
143
  }
138
144
  });
139
145
  const XhSliderValueText = defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"slider.js","names":[],"sources":["../../../src/components/slider/slider.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// 提供 slider 相关实现。\n\nimport type { Direction, Orientation, Size, Tone } from '@xihan-ui/core'\nimport type { SliderApi, SliderMark, SliderMarkMeta, SliderSchema, SliderValueTextDetails } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { normalizeItemIndex } from '@xihan-ui/core'\nimport { computed, defineComponent, h } from 'vue'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideSlider, provideSliderThumb, useSliderContext, useSliderThumbContext } from './context'\nimport { useSlider } from './use-slider'\n\ntype SliderProps = SliderSchema['props']\n\n/** 默认插槽的载荷:当前值、逐个滑块的状态、已选区间与拖动标记,以及整份改值与单个滑块改值。 */\nexport type SliderRootSlotProps = Pick<\n SliderApi,\n 'value' | 'thumbs' | 'range' | 'dragging' | 'setValue' | 'setThumbValue'\n>\n\n/** tick 插槽的载荷:该档刻度的呈现数据。 */\nexport interface SliderTickGroupTickSlotProps {\n tick: SliderMarkMeta\n}\n\nexport const XhSliderRoot = defineComponent({\n name: 'XhSliderRoot',\n props: {\n // 值恒是数组,单滑块即长度 1;缺席值 undefined 表示非受控\n value: { type: Array as PropType<number[]> },\n defaultValue: { type: Array as PropType<number[]> },\n min: { type: Number },\n max: { type: Number },\n step: { type: Number },\n largeStep: { type: Number },\n minStepsBetweenThumbs: { type: Number },\n marks: { type: Array as PropType<SliderMark[]> },\n snapToMarks: { type: Boolean, default: undefined },\n inverted: { type: Boolean, default: undefined },\n draggableRange: { type: Boolean, default: undefined },\n trackFill: { type: Boolean, default: undefined },\n orientation: { type: String as PropType<Orientation> },\n dir: { type: String as PropType<Direction> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n name: { type: String },\n getValueText: {\n type: Function as PropType<(details: SliderValueTextDetails) => string>,\n },\n },\n // value-change 携带 { value },update:value 携带裸数组;value-change-end 只在操作收尾时发一次\n emits: {\n 'value-change': (_details: PayloadOf<SliderProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SliderProps, 'onValueChange'>['value']) => true,\n 'value-change-end': (_details: PayloadOf<SliderProps, 'onValueChangeEnd'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SliderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: SliderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyEnd: SliderProps['onValueChangeEnd'] = (details) => {\n emit('value-change-end', details)\n }\n const ctx = useSlider(useFormControlProps(props) as SliderProps, notify, notifyEnd)\n provideSlider(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n thumbs: ctx.api.value.thumbs,\n range: ctx.api.value.range,\n dragging: ctx.api.value.dragging,\n setValue: ctx.api.value.setValue,\n setThumbValue: ctx.api.value.setThumbValue,\n }))\n },\n})\n\nexport const XhSliderLabel = defineComponent({\n name: 'XhSliderLabel',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderControl = defineComponent({\n name: 'XhSliderControl',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderTrack = defineComponent({\n name: 'XhSliderTrack',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n // 轨道节点交给机器,矩形在指针事件里现量\n return () => h('div', {\n ...ctx.api.value.getTrackProps() as Record<string, unknown>,\n ref: ctx.trackRef,\n }, slots.default?.())\n },\n})\n\nexport const XhSliderTickGroup = defineComponent({\n name: 'XhSliderTickGroup',\n slots: Object as SlotsType<{\n tick?: (props: SliderTickGroupTickSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useSliderContext()\n // 刻度整组自动铺:圆点 + 文案(点文案跳值);tick 插槽可换文案内容\n return () => h('div', ctx.api.value.getTickGroupProps() as Record<string, unknown>, ctx.api.value.marks.flatMap(tick => [\n h('span', { ...ctx.api.value.getTickProps({ value: tick.value }) as Record<string, unknown>, key: `dot-${tick.value}` }),\n h(\n 'span',\n { ...ctx.api.value.getTickLabelProps({ value: tick.value }) as Record<string, unknown>, key: `label-${tick.value}` },\n slots.tick ? slots.tick({ tick }) : tick.label,\n ),\n ]))\n },\n})\n\nexport const XhSliderRange = defineComponent({\n name: 'XhSliderRange',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('div', ctx.api.value.getRangeProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderThumb = defineComponent({\n name: 'XhSliderThumb',\n props: {\n /** 第几个滑块,多滑块时必须逐个写明(`:index=\"i\"`);兼收字符串。 */\n index: { type: [Number, String] as PropType<number | string>, default: 0 },\n },\n setup(props, { slots }) {\n const ctx = useSliderContext()\n const index = computed(() => normalizeItemIndex(props.index))\n provideSliderThumb({ index })\n return () => h('div', ctx.api.value.getThumbProps(index.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderValueText = defineComponent({\n name: 'XhSliderValueText',\n setup(_, { slots }) {\n const { index } = useSliderThumbContext()\n const ctx = useSliderContext()\n // 值气泡:写在拇指里,没给内容就填这一个拇指的值文本\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps(index.value) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.valueText(index.value),\n )\n },\n})\n\nexport const XhSliderHiddenInput = defineComponent({\n name: 'XhSliderHiddenInput',\n setup() {\n const { index } = useSliderThumbContext()\n const ctx = useSliderContext()\n return () => h('input', ctx.api.value.getHiddenInputProps(index.value) as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"slider.js","names":[],"sources":["../../../src/components/slider/slider.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// 提供 slider 相关实现。\n\nimport type { Direction, Orientation, Size, Tone } from '@xihan-ui/core'\nimport type { SliderApi, SliderMark, SliderMarkMeta, SliderSchema, SliderValueTextDetails } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { normalizeItemIndex } from '@xihan-ui/core'\nimport { computed, defineComponent, h } from 'vue'\nimport { useFieldGroupWiring, useFieldLabelWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideSlider, provideSliderThumb, useSliderContext, useSliderThumbContext } from './context'\nimport { useSlider } from './use-slider'\n\ntype SliderProps = SliderSchema['props']\n\n/** 默认插槽的载荷:当前值、逐个滑块的状态、已选区间与拖动标记,以及整份改值与单个滑块改值。 */\nexport type SliderRootSlotProps = Pick<\n SliderApi,\n 'value' | 'thumbs' | 'range' | 'dragging' | 'setValue' | 'setThumbValue'\n>\n\n/** tick 插槽的载荷:该档刻度的呈现数据。 */\nexport interface SliderTickGroupTickSlotProps {\n tick: SliderMarkMeta\n}\n\nexport const XhSliderRoot = defineComponent({\n name: 'XhSliderRoot',\n props: {\n // 值恒是数组,单滑块即长度 1;缺席值 undefined 表示非受控\n value: { type: Array as PropType<number[]> },\n defaultValue: { type: Array as PropType<number[]> },\n min: { type: Number },\n max: { type: Number },\n step: { type: Number },\n largeStep: { type: Number },\n minStepsBetweenThumbs: { type: Number },\n marks: { type: Array as PropType<SliderMark[]> },\n snapToMarks: { type: Boolean, default: undefined },\n inverted: { type: Boolean, default: undefined },\n draggableRange: { type: Boolean, default: undefined },\n trackFill: { type: Boolean, default: undefined },\n orientation: { type: String as PropType<Orientation> },\n dir: { type: String as PropType<Direction> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n name: { type: String },\n getValueText: {\n type: Function as PropType<(details: SliderValueTextDetails) => string>,\n },\n },\n // value-change 携带 { value },update:value 携带裸数组;value-change-end 只在操作收尾时发一次\n emits: {\n 'value-change': (_details: PayloadOf<SliderProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SliderProps, 'onValueChange'>['value']) => true,\n 'value-change-end': (_details: PayloadOf<SliderProps, 'onValueChangeEnd'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SliderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: SliderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyEnd: SliderProps['onValueChangeEnd'] = (details) => {\n emit('value-change-end', details)\n }\n const ctx = useSlider(useFormControlProps(props) as SliderProps, notify, notifyEnd)\n provideSlider(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n thumbs: ctx.api.value.thumbs,\n range: ctx.api.value.range,\n dragging: ctx.api.value.dragging,\n setValue: ctx.api.value.setValue,\n setThumbValue: ctx.api.value.setThumbValue,\n }))\n },\n})\n\nexport const XhSliderLabel = defineComponent({\n name: 'XhSliderLabel',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderControl = defineComponent({\n name: 'XhSliderControl',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderTrack = defineComponent({\n name: 'XhSliderTrack',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n // 轨道节点交给机器,矩形在指针事件里现量\n return () => h('div', {\n ...ctx.api.value.getTrackProps() as Record<string, unknown>,\n ref: ctx.trackRef,\n }, slots.default?.())\n },\n})\n\nexport const XhSliderTickGroup = defineComponent({\n name: 'XhSliderTickGroup',\n slots: Object as SlotsType<{\n tick?: (props: SliderTickGroupTickSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useSliderContext()\n // 刻度整组自动铺:圆点 + 文案(点文案跳值);tick 插槽可换文案内容\n return () => h('div', ctx.api.value.getTickGroupProps() as Record<string, unknown>, ctx.api.value.marks.flatMap(tick => [\n h('span', { ...ctx.api.value.getTickProps({ value: tick.value }) as Record<string, unknown>, key: `dot-${tick.value}` }),\n h(\n 'span',\n { ...ctx.api.value.getTickLabelProps({ value: tick.value }) as Record<string, unknown>, key: `label-${tick.value}` },\n slots.tick ? slots.tick({ tick }) : tick.label,\n ),\n ]))\n },\n})\n\nexport const XhSliderRange = defineComponent({\n name: 'XhSliderRange',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('div', ctx.api.value.getRangeProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderThumb = defineComponent({\n name: 'XhSliderThumb',\n props: {\n /** 第几个滑块,多滑块时必须逐个写明(`:index=\"i\"`);兼收字符串。 */\n index: { type: [Number, String] as PropType<number | string>, default: 0 },\n },\n setup(props, { slots }) {\n const ctx = useSliderContext()\n const index = computed(() => normalizeItemIndex(props.index))\n provideSliderThumb({ index })\n // 放进表单字段时,字段的标题与说明接到拇指上:焦点落在拇指,读屏在这里念名字与说明\n const fieldWiring = useFieldGroupWiring()\n const fieldLabel = useFieldLabelWiring()\n return () => h('div', fieldLabel.value({ ...fieldWiring.value, ...ctx.api.value.getThumbProps(index.value) as Record<string, unknown> }), slots.default?.())\n },\n})\n\nexport const XhSliderValueText = defineComponent({\n name: 'XhSliderValueText',\n setup(_, { slots }) {\n const { index } = useSliderThumbContext()\n const ctx = useSliderContext()\n // 值气泡:写在拇指里,没给内容就填这一个拇指的值文本\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps(index.value) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.valueText(index.value),\n )\n },\n})\n\nexport const XhSliderHiddenInput = defineComponent({\n name: 'XhSliderHiddenInput',\n setup() {\n const { index } = useSliderThumbContext()\n const ctx = useSliderContext()\n return () => h('input', ctx.api.value.getHiddenInputProps(index.value) as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
@@ -95,8 +95,8 @@ declare const XhSortableRoot: import("vue").DefineComponent<import("vue").Extrac
95
95
  "onUpdate:ids"?: ((_ids: string[]) => any) | undefined;
96
96
  }>, {
97
97
  disabled: boolean;
98
- ids: string[];
99
98
  autoScroll: boolean;
99
+ ids: string[];
100
100
  }, SlotsType<{
101
101
  default?: (props: SortableRootSlotProps) => VNode[];
102
102
  }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -214,14 +214,14 @@ declare const XhTableRoot: import("vue").DefineComponent<import("vue").ExtractPr
214
214
  }>> & Readonly<{
215
215
  "onExpanded-value-change"?: ((_details: import("@xihan-ui/headless").TableExpandedValueChangeDetails) => any) | undefined;
216
216
  "onUpdate:expandedValue"?: ((_value: string[]) => any) | undefined;
217
+ "onSelection-change"?: ((_details: import("@xihan-ui/headless").TableSelectionChangeDetails) => any) | undefined;
218
+ "onUpdate:selection"?: ((_selection: TableSelection) => any) | undefined;
217
219
  "onColumn-preference-change"?: ((_details: {
218
220
  value: TableColumnPreference;
219
221
  }) => any) | undefined;
220
222
  "onUpdate:columnPreference"?: ((_value: TableColumnPreference) => any) | undefined;
221
223
  "onSort-change"?: ((_details: import("@xihan-ui/headless").TableSortChangeDetails) => any) | undefined;
222
224
  "onUpdate:sort"?: ((_sort: TableSortDescriptor[]) => any) | undefined;
223
- "onSelection-change"?: ((_details: import("@xihan-ui/headless").TableSelectionChangeDetails) => any) | undefined;
224
- "onUpdate:selection"?: ((_selection: TableSelection) => any) | undefined;
225
225
  "onRow-move"?: ((_details: import("@xihan-ui/headless").TableRowMoveDetails) => any) | undefined;
226
226
  }>, {
227
227
  footer: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"table.d.ts","names":[],"sources":["../../../src/components/table/table.ts"],"mappings":"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"}
1
+ {"version":3,"file":"table.d.ts","names":[],"sources":["../../../src/components/table/table.ts"],"mappings":"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"}
@@ -74,6 +74,7 @@ declare const XhTagsInputRoot: import("vue").DefineComponent<import("vue").Extra
74
74
  }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
75
75
  [key: string]: any;
76
76
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
77
+ clear: () => true;
77
78
  'value-change': (_details: PayloadOf<TagsInputProps, "onValueChange">) => true;
78
79
  'update:value': (_value: PayloadOf<TagsInputProps, "onValueChange">["value"]) => true;
79
80
  'input-value-change': (_details: PayloadOf<TagsInputProps, "onInputValueChange">) => true;
@@ -145,6 +146,7 @@ declare const XhTagsInputRoot: import("vue").DefineComponent<import("vue").Extra
145
146
  }>> & Readonly<{
146
147
  "onValue-change"?: ((_details: import("@xihan-ui/headless").TagsInputValueChangeDetails) => any) | undefined;
147
148
  "onUpdate:value"?: ((_value: string[]) => any) | undefined;
149
+ onClear?: (() => any) | undefined;
148
150
  "onInput-value-change"?: ((_details: import("@xihan-ui/headless").TagsInputInputValueChangeDetails) => any) | undefined;
149
151
  "onUpdate:inputValue"?: ((_inputValue: string) => any) | undefined;
150
152
  "onTag-reject"?: ((_details: import("@xihan-ui/headless").TagsInputTagRejectDetails) => any) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"tags-input.d.ts","names":[],"sources":["../../../src/components/tags-input/tags-input.ts"],"mappings":";;;;;KAkBK,iBAAiB;;KAGV,0BAA0B,KAAK;;KAG/B,yBAAyB,KACnC;cAmBW,+BAAe,8BAAA;;IAKA,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYO,MAAA;;;IACR,MAAA,SAAS;;;;;IAGP,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;EAItB,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;EACF,uBAAA,UAAA,UAAU;EACR,sBAAA,aAAA,UAAU;EACpB,eAAA,UAAA,UAAU;;;IA7BX,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYO,MAAA;;;IACR,MAAA,SAAS;;;;;IAGP,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;EAWvC,WAAC,OAAO,2BAA2B;kCAiC/C;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAU3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,8BAAA;;;;;;;;;;;;MAgC1B,oDAAA;;cAGW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAOjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,4CAA4B,0BAAA,oBAAA,4BAAA;;8BAOvC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;;EAGf,WAAC,OAAO,4BAA4B;kCAchD;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"tags-input.d.ts","names":[],"sources":["../../../src/components/tags-input/tags-input.ts"],"mappings":";;;;;KAmBK,iBAAiB;;KAGV,0BAA0B,KAAK;;KAG/B,yBAAyB,KACnC;cAmBW,+BAAe,8BAAA;;IAKA,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYO,MAAA;;;IACR,MAAA,SAAS;;;;;IAGP,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;;EAKtB,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;EACF,uBAAA,UAAA,UAAU;EACR,sBAAA,aAAA,UAAU;EACpB,eAAA,UAAA,UAAU;;;IA9BX,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYO,MAAA;;;IACR,MAAA,SAAS;;;;;IAGP,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;;EAYvC,WAAC,OAAO,2BAA2B;kCAiC/C;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAU3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,8BAAA;;;;;;;;;;;;MAgC1B,oDAAA;;cAGW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAOjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,4CAA4B,0BAAA,oBAAA,4BAAA;;8BAOvC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;;EAGf,WAAC,OAAO,4BAA4B;kCAchD;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,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 { provideTagsInput, provideTagsInputItem, useTagsInputContext, useTagsInputItemContext } from "./context.js";
@@ -44,6 +45,7 @@ const XhTagsInputRoot = defineComponent({
44
45
  translations: { type: Object }
45
46
  },
46
47
  emits: {
48
+ "clear": () => true,
47
49
  "value-change": (_details) => true,
48
50
  "update:value": (_value) => true,
49
51
  "input-value-change": (_details) => true,
@@ -61,7 +63,7 @@ const XhTagsInputRoot = defineComponent({
61
63
  emit("update:inputValue", details.inputValue);
62
64
  };
63
65
  const onTagReject = (details) => emit("tag-reject", details);
64
- const ctx = useTagsInput(withXhConfig("tags-input", useFormControlProps(props)), {
66
+ const ctx = useTagsInput(withHandlers(withXhConfig("tags-input", useFormControlProps(props)), { onClear: () => emit("clear") }), {
65
67
  onValueChange,
66
68
  onInputValueChange,
67
69
  onTagReject
@@ -1 +1 @@
1
- {"version":3,"file":"tags-input.js","names":[],"sources":["../../../src/components/tags-input/tags-input.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// 提供 tags input 相关实现。\n\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/core'\nimport type { TagsInputApi, TagsInputBlurBehavior, TagsInputItemProps, TagsInputSchema, TagsInputTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideTagsInput, provideTagsInputItem, useTagsInputContext, useTagsInputItemContext } from './context'\nimport { useTagsInput } from './use-tags-input'\n\ntype TagsInputProps = TagsInputSchema['props']\n\n/** 计数部件默认插槽的载荷:当前个数、上限与已达上限、越界两个标志。 */\nexport type TagsInputCountSlotProps = Pick<TagsInputApi, 'count' | 'max' | 'atMax' | 'overflow'>\n\n/** 默认插槽的载荷:标签集合与输入文本、数量与越界标志、光标与编辑锚点,以及增删改与清空的动作。 */\nexport type TagsInputRootSlotProps = Pick<\n TagsInputApi,\n | 'value'\n | 'count'\n | 'inputValue'\n | 'empty'\n | 'atMax'\n | 'overflow'\n | 'highlightedValue'\n | 'editedValue'\n | 'canClear'\n | 'setValue'\n | 'addValue'\n | 'deleteValue'\n | 'clear'\n | 'setInputValue'\n | 'highlight'\n | 'edit'\n>\n\nexport const XhTagsInputRoot = defineComponent({\n name: 'XhTagsInputRoot',\n // 有 connect 与机器兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: Array as PropType<string[]> },\n defaultValue: { type: Array as PropType<string[]> },\n inputValue: { type: String },\n defaultInputValue: { type: String },\n max: { type: Number },\n allowOverflow: Boolean,\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n showCount: Boolean,\n name: { type: String },\n placeholder: { type: String },\n delimiter: { type: [String, Array] as PropType<string | string[]> },\n validate: { type: Function as PropType<TagsInputProps['validate']> },\n addOnPaste: Boolean,\n editable: Boolean,\n blurBehavior: { type: String as PropType<TagsInputBlurBehavior | null> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<Partial<TagsInputTranslations>> },\n },\n // value-change 携带 { value },update:value 携带裸数组;输入文本走 input-value-change 一路\n emits: {\n 'value-change': (_details: PayloadOf<TagsInputProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TagsInputProps, 'onValueChange'>['value']) => true,\n 'input-value-change': (_details: PayloadOf<TagsInputProps, 'onInputValueChange'>) => true,\n 'update:inputValue': (_inputValue: PayloadOf<TagsInputProps, 'onInputValueChange'>['inputValue']) => true,\n 'tag-reject': (_details: PayloadOf<TagsInputProps, 'onTagReject'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TagsInputRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onValueChange: TagsInputProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const onInputValueChange: TagsInputProps['onInputValueChange'] = (details) => {\n emit('input-value-change', details)\n emit('update:inputValue', details.inputValue)\n }\n const onTagReject: TagsInputProps['onTagReject'] = details => emit('tag-reject', details)\n const ctx = useTagsInput(withXhConfig('tags-input', useFormControlProps(props)) as TagsInputProps, { onValueChange, onInputValueChange, onTagReject })\n provideTagsInput(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n count: ctx.api.value.count,\n inputValue: ctx.api.value.inputValue,\n empty: ctx.api.value.empty,\n atMax: ctx.api.value.atMax,\n overflow: ctx.api.value.overflow,\n highlightedValue: ctx.api.value.highlightedValue,\n editedValue: ctx.api.value.editedValue,\n canClear: ctx.api.value.canClear,\n setValue: ctx.api.value.setValue,\n addValue: ctx.api.value.addValue,\n deleteValue: ctx.api.value.deleteValue,\n clear: ctx.api.value.clear,\n setInputValue: ctx.api.value.setInputValue,\n highlight: ctx.api.value.highlight,\n edit: ctx.api.value.edit,\n }))\n },\n})\n\nexport const XhTagsInputLabel = defineComponent({\n name: 'XhTagsInputLabel',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n // 用原生 label,getLabelProps 的 for 指向输入框\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTagsInputControl = defineComponent({\n name: 'XhTagsInputControl',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => h('div', { ...(ctx.api.value.getControlProps() as Record<string, unknown>), ref: ctx.controlRef }, slots.default?.())\n },\n})\n\nexport const XhTagsInputInput = defineComponent({\n name: 'XhTagsInputInput',\n setup() {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTagsInputContext()\n return () => h('input', fieldLabel.value({ ...fieldWiring.value, ...ctx.api.value.getInputProps() as Record<string, unknown> }))\n },\n})\n\nexport const XhTagsInputItem = defineComponent({\n name: 'XhTagsInputItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTagsInputContext()\n const item = computed<TagsInputItemProps>(() => ({ value: props.value }))\n provideTagsInputItem({ item })\n // 本标签持有焦点时,value 变更或卸载都上报焦点离场以终止编辑会话\n const itemEl = ref<HTMLElement | null>(null)\n const holdsFocus = (): boolean => {\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return false\n const active = service.scope.getActiveElement()\n return !!itemEl.value && !!active && (itemEl.value === active || itemEl.value.contains(active))\n }\n watch(() => props.value, (next, prev) => {\n if (next !== prev && holdsFocus())\n ctx.service.send({ type: 'ITEM.FOCUS_LOST' })\n })\n onBeforeUnmount(() => {\n if (holdsFocus())\n ctx.service.send({ type: 'ITEM.FOCUS_LOST' })\n })\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\n/** 标签的预览:渲染为库内 tag 的 root(data-scope=\"tag\"),就地编辑时由 tag 收起。 */\nexport const XhTagsInputItemPreview = defineComponent({\n name: 'XhTagsInputItemPreview',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('span', ctx.api.value.getItemPreviewProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签文字:渲染为 tag 的 label,截断落在这一层。 */\nexport const XhTagsInputItemText = defineComponent({\n name: 'XhTagsInputItemText',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 删除按钮:渲染为所在标签那份 tag 的 close-trigger,不占 Tab 位;禁用与只读时保留位置、原生 disabled。 */\nexport const XhTagsInputItemDeleteTrigger = defineComponent({\n name: 'XhTagsInputItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTagsInputItemInput = defineComponent({\n name: 'XhTagsInputItemInput',\n setup() {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('input', ctx.api.value.getItemInputProps(item.value) as Record<string, unknown>)\n },\n})\n\nexport const XhTagsInputClearTrigger = defineComponent({\n name: 'XhTagsInputClearTrigger',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 计数:未写内容时渲染「已用 / 上限」,未设上限时只渲染已用。 */\nexport const XhTagsInputCount = defineComponent({\n name: 'XhTagsInputCount',\n slots: Object as SlotsType<{\n default?: (props: TagsInputCountSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => {\n const api = ctx.api.value\n const fallback = api.max === undefined ? `${api.count}` : `${api.count} / ${api.max}`\n return h(\n 'span',\n api.getCountProps() as Record<string, unknown>,\n slots.default?.({ count: api.count, max: api.max, atMax: api.atMax, overflow: api.overflow }) ?? fallback,\n )\n }\n },\n})\n\nexport const XhTagsInputHiddenInput = defineComponent({\n name: 'XhTagsInputHiddenInput',\n setup() {\n const ctx = useTagsInputContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":";;;;;;;AA4CA,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CAEN,OAAO;EAEL,OAAO,EAAE,MAAM,MAA4B;EAC3C,cAAc,EAAE,MAAM,MAA4B;EAClD,YAAY,EAAE,MAAM,OAAO;EAC3B,mBAAmB,EAAE,MAAM,OAAO;EAClC,KAAK,EAAE,MAAM,OAAO;EACpB,eAAe;EACf,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,SAAS;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC7C,WAAW;EACX,MAAM,EAAE,MAAM,OAAO;EACrB,aAAa,EAAE,MAAM,OAAO;EAC5B,WAAW,EAAE,MAAM,CAAC,QAAQ,KAAK,EAAiC;EAClE,UAAU,EAAE,MAAM,SAAiD;EACnE,YAAY;EACZ,UAAU;EACV,cAAc,EAAE,MAAM,OAAiD;EACvE,SAAS,EAAE,MAAM,OAAmC;EACpD,MAAM,EAAE,MAAM,OAAyB;EACvC,MAAM,EAAE,MAAM,OAAyB;EACvC,cAAc,EAAE,MAAM,OAAmD;CAC3E;CAEA,OAAO;EACL,iBAAiB,aAAyD;EAC1E,iBAAiB,WAAgE;EACjF,uBAAuB,aAA8D;EACrF,sBAAsB,gBAA+E;EACrG,eAAe,aAAuD;CACxE;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,iBAAkD,YAAY;GAClE,KAAK,gBAAgB,OAAO;GAC5B,KAAK,gBAAgB,QAAQ,KAAK;EACpC;EACA,MAAM,sBAA4D,YAAY;GAC5E,KAAK,sBAAsB,OAAO;GAClC,KAAK,qBAAqB,QAAQ,UAAU;EAC9C;EACA,MAAM,eAA6C,YAAW,KAAK,cAAc,OAAO;EACxF,MAAM,MAAM,aAAa,aAAa,cAAc,oBAAoB,KAAK,CAAC,GAAqB;GAAE;GAAe;GAAoB;EAAY,CAAC;EACrJ,iBAAiB,GAAG;EACpB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,OAAO,IAAI,IAAI,MAAM;GACrB,OAAO,IAAI,IAAI,MAAM;GACrB,YAAY,IAAI,IAAI,MAAM;GAC1B,OAAO,IAAI,IAAI,MAAM;GACrB,OAAO,IAAI,IAAI,MAAM;GACrB,UAAU,IAAI,IAAI,MAAM;GACxB,kBAAkB,IAAI,IAAI,MAAM;GAChC,aAAa,IAAI,IAAI,MAAM;GAC3B,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,aAAa,IAAI,IAAI,MAAM;GAC3B,OAAO,IAAI,IAAI,MAAM;GACrB,eAAe,IAAI,IAAI,MAAM;GAC7B,WAAW,IAAI,IAAI,MAAM;GACzB,MAAM,IAAI,IAAI,MAAM;EACtB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAEhC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,OAAO;GAAE,GAAI,IAAI,IAAI,MAAM,gBAAgB;GAA+B,KAAK,IAAI;EAAW,GAAG,MAAM,UAAU,CAAC;CACnI;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,QAAQ;EAEN,MAAM,cAAc,oBAAoB;EAExC,MAAM,aAAa,oBAAoB;EACvC,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,SAAS,WAAW,MAAM;GAAE,GAAG,YAAY;GAAO,GAAG,IAAI,IAAI,MAAM,cAAc;EAA6B,CAAC,CAAC;CACjI;AACF,CAAC;AAED,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CACN,OAAO,EACL,OAAO;EAAE,MAAM;EAAQ,UAAU;CAAK,EACxC;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,oBAAoB;EAChC,MAAM,OAAO,gBAAoC,EAAE,OAAO,MAAM,MAAM,EAAE;EACxE,qBAAqB,EAAE,KAAK,CAAC;EAE7B,MAAM,SAAS,IAAwB,IAAI;EAC3C,MAAM,mBAA4B;GAChC,MAAM,EAAE,YAAY;GACpB,IAAI,QAAQ,UAAU,MAAM,WAC1B,OAAO;GACT,MAAM,SAAS,QAAQ,MAAM,iBAAiB;GAC9C,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,WAAW,OAAO,UAAU,UAAU,OAAO,MAAM,SAAS,MAAM;EAC/F;EACA,YAAY,MAAM,QAAQ,MAAM,SAAS;GACvC,IAAI,SAAS,QAAQ,WAAW,GAC9B,IAAI,QAAQ,KAAK,EAAE,MAAM,kBAAkB,CAAC;EAChD,CAAC;EACD,sBAAsB;GACpB,IAAI,WAAW,GACb,IAAI,QAAQ,KAAK,EAAE,MAAM,kBAAkB,CAAC;EAChD,CAAC;EACD,aAAa,EACX,OACA;GAAE,GAAG,IAAI,IAAI,MAAM,aAAa,KAAK,KAAK;GAA8B,KAAK;EAAO,GACpF,MAAM,UAAU,CAClB;CACF;AACF,CAAC;;AAGD,MAAa,yBAAyB,gBAAgB;CACpD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,MAAM,EAAE,SAAS,wBAAwB;EACzC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,oBAAoB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACpH;AACF,CAAC;;AAGD,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,MAAM,EAAE,SAAS,wBAAwB;EACzC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,iBAAiB,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CACjH;AACF,CAAC;;AAGD,MAAa,+BAA+B,gBAAgB;CAC1D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,MAAM,EAAE,SAAS,wBAAwB;EACzC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,0BAA0B,KAAK,KAAK,GAA8B,MAAM,UAAU,CAAC;CAC5H;AACF,CAAC;AAED,MAAa,uBAAuB,gBAAgB;CAClD,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,oBAAoB;EAChC,MAAM,EAAE,SAAS,wBAAwB;EACzC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,kBAAkB,KAAK,KAAK,CAA4B;CAChG;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC7G;AACF,CAAC;;AAGD,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,OAAO;CAGP,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,aAAa;GACX,MAAM,MAAM,IAAI,IAAI;GACpB,MAAM,WAAW,IAAI,QAAQ,KAAA,IAAY,GAAG,IAAI,UAAU,GAAG,IAAI,MAAM,KAAK,IAAI;GAChF,OAAO,EACL,QACA,IAAI,cAAc,GAClB,MAAM,UAAU;IAAE,OAAO,IAAI;IAAO,KAAK,IAAI;IAAK,OAAO,IAAI;IAAO,UAAU,IAAI;GAAS,CAAC,KAAK,QACnG;EACF;CACF;AACF,CAAC;AAED,MAAa,yBAAyB,gBAAgB;CACpD,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,oBAAoB,CAA4B;CACxF;AACF,CAAC"}
1
+ {"version":3,"file":"tags-input.js","names":[],"sources":["../../../src/components/tags-input/tags-input.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// 提供 tags input 相关实现。\n\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/core'\nimport type { TagsInputApi, TagsInputBlurBehavior, TagsInputItemProps, TagsInputSchema, TagsInputTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideTagsInput, provideTagsInputItem, useTagsInputContext, useTagsInputItemContext } from './context'\nimport { useTagsInput } from './use-tags-input'\n\ntype TagsInputProps = TagsInputSchema['props']\n\n/** 计数部件默认插槽的载荷:当前个数、上限与已达上限、越界两个标志。 */\nexport type TagsInputCountSlotProps = Pick<TagsInputApi, 'count' | 'max' | 'atMax' | 'overflow'>\n\n/** 默认插槽的载荷:标签集合与输入文本、数量与越界标志、光标与编辑锚点,以及增删改与清空的动作。 */\nexport type TagsInputRootSlotProps = Pick<\n TagsInputApi,\n | 'value'\n | 'count'\n | 'inputValue'\n | 'empty'\n | 'atMax'\n | 'overflow'\n | 'highlightedValue'\n | 'editedValue'\n | 'canClear'\n | 'setValue'\n | 'addValue'\n | 'deleteValue'\n | 'clear'\n | 'setInputValue'\n | 'highlight'\n | 'edit'\n>\n\nexport const XhTagsInputRoot = defineComponent({\n name: 'XhTagsInputRoot',\n // 有 connect 与机器兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: Array as PropType<string[]> },\n defaultValue: { type: Array as PropType<string[]> },\n inputValue: { type: String },\n defaultInputValue: { type: String },\n max: { type: Number },\n allowOverflow: Boolean,\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n showCount: Boolean,\n name: { type: String },\n placeholder: { type: String },\n delimiter: { type: [String, Array] as PropType<string | string[]> },\n validate: { type: Function as PropType<TagsInputProps['validate']> },\n addOnPaste: Boolean,\n editable: Boolean,\n blurBehavior: { type: String as PropType<TagsInputBlurBehavior | null> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<Partial<TagsInputTranslations>> },\n },\n // value-change 携带 { value },update:value 携带裸数组;输入文本走 input-value-change 一路\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<TagsInputProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TagsInputProps, 'onValueChange'>['value']) => true,\n 'input-value-change': (_details: PayloadOf<TagsInputProps, 'onInputValueChange'>) => true,\n 'update:inputValue': (_inputValue: PayloadOf<TagsInputProps, 'onInputValueChange'>['inputValue']) => true,\n 'tag-reject': (_details: PayloadOf<TagsInputProps, 'onTagReject'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TagsInputRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onValueChange: TagsInputProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const onInputValueChange: TagsInputProps['onInputValueChange'] = (details) => {\n emit('input-value-change', details)\n emit('update:inputValue', details.inputValue)\n }\n const onTagReject: TagsInputProps['onTagReject'] = details => emit('tag-reject', details)\n const ctx = useTagsInput(withHandlers(withXhConfig('tags-input', useFormControlProps(props)), { onClear: () => emit('clear') }) as TagsInputProps, { onValueChange, onInputValueChange, onTagReject })\n provideTagsInput(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n count: ctx.api.value.count,\n inputValue: ctx.api.value.inputValue,\n empty: ctx.api.value.empty,\n atMax: ctx.api.value.atMax,\n overflow: ctx.api.value.overflow,\n highlightedValue: ctx.api.value.highlightedValue,\n editedValue: ctx.api.value.editedValue,\n canClear: ctx.api.value.canClear,\n setValue: ctx.api.value.setValue,\n addValue: ctx.api.value.addValue,\n deleteValue: ctx.api.value.deleteValue,\n clear: ctx.api.value.clear,\n setInputValue: ctx.api.value.setInputValue,\n highlight: ctx.api.value.highlight,\n edit: ctx.api.value.edit,\n }))\n },\n})\n\nexport const XhTagsInputLabel = defineComponent({\n name: 'XhTagsInputLabel',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n // 用原生 label,getLabelProps 的 for 指向输入框\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTagsInputControl = defineComponent({\n name: 'XhTagsInputControl',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => h('div', { ...(ctx.api.value.getControlProps() as Record<string, unknown>), ref: ctx.controlRef }, slots.default?.())\n },\n})\n\nexport const XhTagsInputInput = defineComponent({\n name: 'XhTagsInputInput',\n setup() {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTagsInputContext()\n return () => h('input', fieldLabel.value({ ...fieldWiring.value, ...ctx.api.value.getInputProps() as Record<string, unknown> }))\n },\n})\n\nexport const XhTagsInputItem = defineComponent({\n name: 'XhTagsInputItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTagsInputContext()\n const item = computed<TagsInputItemProps>(() => ({ value: props.value }))\n provideTagsInputItem({ item })\n // 本标签持有焦点时,value 变更或卸载都上报焦点离场以终止编辑会话\n const itemEl = ref<HTMLElement | null>(null)\n const holdsFocus = (): boolean => {\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return false\n const active = service.scope.getActiveElement()\n return !!itemEl.value && !!active && (itemEl.value === active || itemEl.value.contains(active))\n }\n watch(() => props.value, (next, prev) => {\n if (next !== prev && holdsFocus())\n ctx.service.send({ type: 'ITEM.FOCUS_LOST' })\n })\n onBeforeUnmount(() => {\n if (holdsFocus())\n ctx.service.send({ type: 'ITEM.FOCUS_LOST' })\n })\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\n/** 标签的预览:渲染为库内 tag 的 root(data-scope=\"tag\"),就地编辑时由 tag 收起。 */\nexport const XhTagsInputItemPreview = defineComponent({\n name: 'XhTagsInputItemPreview',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('span', ctx.api.value.getItemPreviewProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签文字:渲染为 tag 的 label,截断落在这一层。 */\nexport const XhTagsInputItemText = defineComponent({\n name: 'XhTagsInputItemText',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 删除按钮:渲染为所在标签那份 tag 的 close-trigger,不占 Tab 位;禁用与只读时保留位置、原生 disabled。 */\nexport const XhTagsInputItemDeleteTrigger = defineComponent({\n name: 'XhTagsInputItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTagsInputItemInput = defineComponent({\n name: 'XhTagsInputItemInput',\n setup() {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('input', ctx.api.value.getItemInputProps(item.value) as Record<string, unknown>)\n },\n})\n\nexport const XhTagsInputClearTrigger = defineComponent({\n name: 'XhTagsInputClearTrigger',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 计数:未写内容时渲染「已用 / 上限」,未设上限时只渲染已用。 */\nexport const XhTagsInputCount = defineComponent({\n name: 'XhTagsInputCount',\n slots: Object as SlotsType<{\n default?: (props: TagsInputCountSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => {\n const api = ctx.api.value\n const fallback = api.max === undefined ? `${api.count}` : `${api.count} / ${api.max}`\n return h(\n 'span',\n api.getCountProps() as Record<string, unknown>,\n slots.default?.({ count: api.count, max: api.max, atMax: api.atMax, overflow: api.overflow }) ?? fallback,\n )\n }\n },\n})\n\nexport const XhTagsInputHiddenInput = defineComponent({\n name: 'XhTagsInputHiddenInput',\n setup() {\n const ctx = useTagsInputContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
@@ -64,6 +64,7 @@ declare const XhTextFieldRoot: import("vue").DefineComponent<import("vue").Extra
64
64
  }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
65
65
  [key: string]: any;
66
66
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
67
+ clear: () => true;
67
68
  'value-change': (_details: PayloadOf<TextFieldProps, "onValueChange">) => true;
68
69
  'update:value': (_value: PayloadOf<TextFieldProps, "onValueChange">["value"]) => true;
69
70
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -122,6 +123,7 @@ declare const XhTextFieldRoot: import("vue").DefineComponent<import("vue").Extra
122
123
  }>> & Readonly<{
123
124
  "onValue-change"?: ((_details: import("@xihan-ui/headless").TextFieldValueChangeDetails) => any) | undefined;
124
125
  "onUpdate:value"?: ((_value: string) => any) | undefined;
126
+ onClear?: (() => any) | undefined;
125
127
  }>, {
126
128
  required: boolean;
127
129
  invalid: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"text-field.d.ts","names":[],"sources":["../../../src/components/text-field/text-field.ts"],"mappings":";;;;;KAmBK,iBAAiB;;KAGV,yBAAyB,KACnC;;KAKU,0BAA0B,KAAK;cAE9B,+BAAe,8BAAA;;;;;;;;IAMA,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAWM,MAAA,SAAS;;;;IACrB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;EAId,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;IApBX,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAWM,MAAA,SAAS;;;;IACrB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;;;;;;;;;;EAQ/B,WAAC,OAAO,2BAA2B;kCAmB/C;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,8BAAA;;;IAIH,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAkCjC;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;;EAGf,WAAC,OAAO,4BAA4B;kCAchD"}
1
+ {"version":3,"file":"text-field.d.ts","names":[],"sources":["../../../src/components/text-field/text-field.ts"],"mappings":";;;;;KAoBK,iBAAiB;;KAGV,yBAAyB,KACnC;;KAKU,0BAA0B,KAAK;cAE9B,+BAAe,8BAAA;;;;;;;;IAMA,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAWM,MAAA,SAAS;;;;IACrB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;;EAKd,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;IArBX,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAWM,MAAA,SAAS;;;;IACrB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;;;;;;;;;;;EAS/B,WAAC,OAAO,2BAA2B;kCAmB/C;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,8BAAA;;;IAIH,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAkCjC;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;;EAGf,WAAC,OAAO,4BAA4B;kCAchD"}
@@ -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 { provideTextField, useTextFieldContext } from "./context.js";
@@ -43,6 +44,7 @@ const XhTextFieldRoot = 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 XhTextFieldRoot = defineComponent({
52
54
  emit("value-change", details);
53
55
  emit("update:value", details.value);
54
56
  };
55
- const ctx = useTextField(withXhConfig("text-field", useFormControlProps(props)), notify);
57
+ const ctx = useTextField(withHandlers(withXhConfig("text-field", useFormControlProps(props)), { onClear: () => emit("clear") }), notify);
56
58
  provideTextField(ctx);
57
59
  return () => h("div", ctx.api.value.getRootProps(), slots.default?.({
58
60
  value: ctx.api.value.value,