@xihan-ui/vue 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +160 -0
  2. package/dist/components/carousel/carousel.d.ts +7 -1
  3. package/dist/components/carousel/carousel.d.ts.map +1 -1
  4. package/dist/components/carousel/carousel.js +1 -0
  5. package/dist/components/carousel/carousel.js.map +1 -1
  6. package/dist/components/cartesian-chart/cartesian-chart.d.ts.map +1 -1
  7. package/dist/components/cartesian-chart/cartesian-chart.js +2 -2
  8. package/dist/components/cartesian-chart/cartesian-chart.js.map +1 -1
  9. package/dist/components/cascader/cascader.js +2 -1
  10. package/dist/components/cascader/cascader.js.map +1 -1
  11. package/dist/components/citation/citation.d.ts.map +1 -1
  12. package/dist/components/citation/citation.js +8 -6
  13. package/dist/components/citation/citation.js.map +1 -1
  14. package/dist/components/color-picker/color-picker.js +2 -1
  15. package/dist/components/color-picker/color-picker.js.map +1 -1
  16. package/dist/components/combobox/combobox.js +3 -3
  17. package/dist/components/combobox/combobox.js.map +1 -1
  18. package/dist/components/command/command.d.ts +3 -3
  19. package/dist/components/context-menu/context-menu.js +2 -1
  20. package/dist/components/context-menu/context-menu.js.map +1 -1
  21. package/dist/components/date-picker/date-picker.d.ts +4 -1
  22. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  23. package/dist/components/date-picker/date-picker.js +9 -1
  24. package/dist/components/date-picker/date-picker.js.map +1 -1
  25. package/dist/components/date-range-picker/date-range-picker.d.ts +4 -1
  26. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  27. package/dist/components/date-range-picker/date-range-picker.js +9 -1
  28. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  29. package/dist/components/dialog/dialog.d.ts +12 -1
  30. package/dist/components/dialog/dialog.d.ts.map +1 -1
  31. package/dist/components/dialog/dialog.js +14 -4
  32. package/dist/components/dialog/dialog.js.map +1 -1
  33. package/dist/components/drawer/drawer.d.ts +12 -1
  34. package/dist/components/drawer/drawer.d.ts.map +1 -1
  35. package/dist/components/drawer/drawer.js +14 -4
  36. package/dist/components/drawer/drawer.js.map +1 -1
  37. package/dist/components/fieldset/context.d.ts +1 -0
  38. package/dist/components/fieldset/context.d.ts.map +1 -1
  39. package/dist/components/fieldset/context.js +9 -1
  40. package/dist/components/fieldset/context.js.map +1 -1
  41. package/dist/components/fieldset/fieldset.d.ts.map +1 -1
  42. package/dist/components/fieldset/fieldset.js +8 -3
  43. package/dist/components/fieldset/fieldset.js.map +1 -1
  44. package/dist/components/floating-panel/floating-panel.js +4 -1
  45. package/dist/components/floating-panel/floating-panel.js.map +1 -1
  46. package/dist/components/form/form.d.ts +8 -0
  47. package/dist/components/form/form.d.ts.map +1 -1
  48. package/dist/components/form/form.js +4 -1
  49. package/dist/components/form/form.js.map +1 -1
  50. package/dist/components/funnel-chart/funnel-chart.d.ts.map +1 -1
  51. package/dist/components/funnel-chart/funnel-chart.js +2 -2
  52. package/dist/components/funnel-chart/funnel-chart.js.map +1 -1
  53. package/dist/components/graph-chart/graph-chart.d.ts.map +1 -1
  54. package/dist/components/graph-chart/graph-chart.js +2 -2
  55. package/dist/components/graph-chart/graph-chart.js.map +1 -1
  56. package/dist/components/hierarchy-chart/hierarchy-chart.d.ts.map +1 -1
  57. package/dist/components/hierarchy-chart/hierarchy-chart.js +2 -2
  58. package/dist/components/hierarchy-chart/hierarchy-chart.js.map +1 -1
  59. package/dist/components/hover-card/hover-card.js +2 -1
  60. package/dist/components/hover-card/hover-card.js.map +1 -1
  61. package/dist/components/image-viewer/image-viewer.d.ts +7 -1
  62. package/dist/components/image-viewer/image-viewer.d.ts.map +1 -1
  63. package/dist/components/image-viewer/image-viewer.js +1 -0
  64. package/dist/components/image-viewer/image-viewer.js.map +1 -1
  65. package/dist/components/mention/mention.d.ts +1 -1
  66. package/dist/components/mention/mention.js +5 -4
  67. package/dist/components/mention/mention.js.map +1 -1
  68. package/dist/components/menu/menu.js +2 -1
  69. package/dist/components/menu/menu.js.map +1 -1
  70. package/dist/components/menubar/context.d.ts.map +1 -1
  71. package/dist/components/menubar/context.js.map +1 -1
  72. package/dist/components/menubar/menubar.d.ts.map +1 -1
  73. package/dist/components/menubar/menubar.js +16 -2
  74. package/dist/components/menubar/menubar.js.map +1 -1
  75. package/dist/components/pagination/pagination.js +4 -2
  76. package/dist/components/pagination/pagination.js.map +1 -1
  77. package/dist/components/pie-chart/pie-chart.d.ts.map +1 -1
  78. package/dist/components/pie-chart/pie-chart.js +2 -2
  79. package/dist/components/pie-chart/pie-chart.js.map +1 -1
  80. package/dist/components/popconfirm/popconfirm.js +2 -1
  81. package/dist/components/popconfirm/popconfirm.js.map +1 -1
  82. package/dist/components/popover/popover.d.ts +1 -1
  83. package/dist/components/popover/popover.js +2 -1
  84. package/dist/components/popover/popover.js.map +1 -1
  85. package/dist/components/radar-chart/radar-chart.d.ts.map +1 -1
  86. package/dist/components/radar-chart/radar-chart.js +2 -2
  87. package/dist/components/radar-chart/radar-chart.js.map +1 -1
  88. package/dist/components/sankey-chart/sankey-chart.d.ts.map +1 -1
  89. package/dist/components/sankey-chart/sankey-chart.js +2 -2
  90. package/dist/components/sankey-chart/sankey-chart.js.map +1 -1
  91. package/dist/components/select/select.d.ts +11 -0
  92. package/dist/components/select/select.d.ts.map +1 -1
  93. package/dist/components/select/select.js +12 -3
  94. package/dist/components/select/select.js.map +1 -1
  95. package/dist/components/side-nav/side-nav.d.ts.map +1 -1
  96. package/dist/components/side-nav/side-nav.js +8 -2
  97. package/dist/components/side-nav/side-nav.js.map +1 -1
  98. package/dist/components/spinner/spinner.d.ts +9 -1
  99. package/dist/components/spinner/spinner.d.ts.map +1 -1
  100. package/dist/components/spinner/spinner.js +2 -0
  101. package/dist/components/spinner/spinner.js.map +1 -1
  102. package/dist/components/time-picker/time-picker.d.ts +4 -1
  103. package/dist/components/time-picker/time-picker.d.ts.map +1 -1
  104. package/dist/components/time-picker/time-picker.js +10 -2
  105. package/dist/components/time-picker/time-picker.js.map +1 -1
  106. package/dist/components/time-range-picker/time-range-picker.js +2 -1
  107. package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
  108. package/dist/components/tooltip/tooltip.js +2 -1
  109. package/dist/components/tooltip/tooltip.js.map +1 -1
  110. package/dist/components/tour/tour.js +12 -3
  111. package/dist/components/tour/tour.js.map +1 -1
  112. package/dist/components/tree-select/tree-select.js +3 -3
  113. package/dist/components/tree-select/tree-select.js.map +1 -1
  114. package/dist/config/config.js +1 -0
  115. package/dist/config/config.js.map +1 -1
  116. package/dist/index.d.ts +4 -4
  117. package/dist/index.js +4 -4
  118. package/dist/locale.d.ts +2 -0
  119. package/dist/locale.js +2 -0
  120. package/dist/package.js +1 -1
  121. package/dist/runtime/as-child.js +7 -2
  122. package/dist/runtime/as-child.js.map +1 -1
  123. package/dist/runtime/portal.js +11 -1
  124. package/dist/runtime/portal.js.map +1 -1
  125. package/dist/runtime/use-overlay-exit.js +6 -1
  126. package/dist/runtime/use-overlay-exit.js.map +1 -1
  127. package/dist/services/dialog-service.d.ts +3 -3
  128. package/dist/services/dialog-service.d.ts.map +1 -1
  129. package/dist/services/dialog-service.js +8 -6
  130. package/dist/services/dialog-service.js.map +1 -1
  131. package/dist/services/service-config.js +2 -1
  132. package/dist/services/service-config.js.map +1 -1
  133. package/package.json +19 -15
@@ -1 +1 @@
1
- {"version":3,"file":"cascader.js","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 cascader 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n CascaderApi,\n CascaderExpandTrigger,\n CascaderGroupProps,\n CascaderItemProps,\n CascaderNode,\n CascaderSchema,\n CascaderSearchResult,\n CascaderTranslations,\n CascaderValue,\n} from '@xihan-ui/headless'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { CascaderContext } from './use-cascader'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, onUpdated, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotIsPlainText } from '../../runtime/slot-content'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideCascader, provideCascaderContent, provideCascaderGroup, provideCascaderItem, provideCascaderTag, useCascaderContentContext, useCascaderContext, useCascaderGroupContext, useCascaderItemContext, useCascaderTagContext } from './context'\nimport { useCascader } from './use-cascader'\n\ntype CascaderProps = CascaderSchema['props']\n\n/** 本条目持有焦点时,value 变更重新报告焦点条目,卸载时上报焦点丢失 */\nfunction reportItemFocus(\n ctx: CascaderContext,\n el: Ref<HTMLElement | null>,\n value: () => string,\n): void {\n watch(value, (next, prev) => {\n if (next === prev)\n return\n const { service, api } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (!el.value || service.scope.getActiveElement() !== el.value)\n return\n // 层号回 collection 里查,条目只自报值\n const meta = api.value.levels.flatMap(level => level.items).find(item => item.value === next)\n if (meta)\n service.send({ type: 'ITEM.FOCUS', level: meta.level, value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本条目当下正持有焦点」判定,不按 value 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'ITEM.LOST' })\n })\n}\n\n/** 默认插槽的载荷:级联的展开态、选中态与列数据、多选的可见标签与折起的个数,以及修改它们的方法。 */\nexport type CascaderRootSlotProps = Pick<\n CascaderApi,\n | 'open'\n | 'levels'\n | 'columns'\n | 'value'\n | 'valuePath'\n | 'activePath'\n | 'focusedPath'\n | 'displayText'\n | 'canClear'\n | 'tags'\n | 'overflowCount'\n | 'overflowText'\n | 'isSelected'\n | 'isIndeterminate'\n | 'isActive'\n | 'isVisible'\n | 'setOpen'\n | 'setValue'\n | 'setActivePath'\n | 'select'\n | 'clear'\n | 'deselect'\n>\n\nexport const XhCascaderRoot = defineComponent({\n name: 'XhCascaderRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<CascaderNode[]> },\n /** 取回懒分支(hasChildren 且没给 children)的直接子项;展开路径走到它时自动调用。 */\n loadChildren: { type: Function as PropType<CascaderProps['loadChildren']> },\n value: { type: Array as PropType<CascaderValue> },\n defaultValue: { type: Array as PropType<CascaderValue> },\n name: { type: String },\n form: { type: String },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n expandTrigger: { type: String as PropType<CascaderExpandTrigger> },\n changeOnSelect: Boolean,\n multiple: Boolean,\n /** 多选标签最多显示的数量,其余折进 +N;默认 3。 */\n maxTagCount: { type: Number },\n searchable: { type: Boolean, default: undefined },\n /** 自定义搜索匹配;缺省为整条路径的显示名连缀后大小写不敏感包含。 */\n filter: { type: Function as PropType<CascaderProps['filter']> },\n cascade: Boolean,\n checkedStrategy: { type: String as PropType<CascaderProps['checkedStrategy']> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n loading: Boolean,\n translations: { type: Object as PropType<Partial<CascaderTranslations>> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placeholder: { type: String },\n separator: { type: String },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值;选中值恒为路径数组,单选时长度 ≤ 1\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<CascaderProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<CascaderProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<CascaderProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<CascaderProps, 'onOpenChange'>['open']) => true,\n 'branch-load-start': (_details: PayloadOf<CascaderProps, 'onBranchLoadStart'>) => true,\n 'branch-load': (_details: PayloadOf<CascaderProps, 'onBranchLoad'>) => true,\n 'branch-load-error': (_details: PayloadOf<CascaderProps, 'onBranchLoadError'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CascaderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: CascaderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: CascaderProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useCascader(withHandlers(withXhConfig('cascader', useFormControlProps(props)), { onClear: () => emit('clear') }) as CascaderProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n onBranchLoadStart: details => emit('branch-load-start', details),\n onBranchLoad: details => emit('branch-load', details),\n onBranchLoadError: details => emit('branch-load-error', details),\n })\n provideCascader(ctx)\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, [slots.default?.({\n open: ctx.api.value.open,\n // levels 每层一列、层内节点各一条目,供作者渲染;columns 只读当前展开的列\n levels: ctx.api.value.levels,\n columns: ctx.api.value.columns,\n value: ctx.api.value.value,\n valuePath: ctx.api.value.valuePath,\n activePath: ctx.api.value.activePath,\n focusedPath: ctx.api.value.focusedPath,\n displayText: ctx.api.value.displayText,\n canClear: ctx.api.value.canClear,\n tags: ctx.api.value.tags,\n overflowCount: ctx.api.value.overflowCount,\n overflowText: ctx.api.value.overflowText,\n isSelected: ctx.api.value.isSelected,\n isIndeterminate: ctx.api.value.isIndeterminate,\n isActive: ctx.api.value.isActive,\n isVisible: ctx.api.value.isVisible,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n setActivePath: ctx.api.value.setActivePath,\n select: ctx.api.value.select,\n clear: ctx.api.value.clear,\n deselect: ctx.api.value.deselect,\n }), ...ctx.api.value.value.map(path => h('input', {\n ...ctx.api.value.getHiddenInputProps({ path }) as Record<string, unknown>,\n key: JSON.stringify(path),\n }))])\n },\n})\n\nexport const XhCascaderLabel = defineComponent({\n name: 'XhCascaderLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderControl = defineComponent({\n name: 'XhCascaderControl',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.controlRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhCascaderTrigger = defineComponent({\n name: 'XhCascaderTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useCascaderContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhCascaderValueText = defineComponent({\n name: 'XhCascaderValueText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 有插槽用插槽,否则显示整条路径或 placeholder\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.displayText,\n )\n },\n})\n\nexport const XhCascaderTagList = defineComponent({\n name: 'XhCascaderTagList',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 标签行:可见标签与 +N 那一枚在里面并排;无选中时连接层给 hidden,value-text 回来显示占位文字\n return () => h('span', ctx.api.value.getTagListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签文字所在的块(tag 的 label):截断规则挂在这一层。 */\nexport const XhCascaderTagLabel = defineComponent({\n name: 'XhCascaderTagLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getTagLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 标签内容:只有文字时替它包一层 label:截断规则挂在 label 上,直接展开在 root 上的文字过长会把\n * 删除按钮挤出;作者自己写了节点则原样放行。与 XhTagRoot 同一规则。\n * 库自身填入的文字(+N,没有折叠时是空串)恒包 label,三个适配器渲染出同一棵树。\n */\nfunction tagChildren(content: VNode[] | string | undefined): VNode[] | string | undefined {\n if (typeof content === 'string')\n return [h(XhCascaderTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhCascaderTagLabel, null, () => content)] : content\n}\n\n/** 一条选中路径一个标签,即库内 tag 的 root(data-scope=\"tag\"):语气、尺寸与禁用从级联传下,形态按控件的面派生;触发器内纯展示,触发器外配合 XhCascaderItemDeleteTrigger 可删除。 */\nexport const XhCascaderTag = defineComponent({\n name: 'XhCascaderTag',\n props: {\n /** 它代表哪条选中路径:写路径的比较键,即 tags 里的 key。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n provideCascaderTag({ value: () => props.value })\n return () => h('span', ctx.api.value.getTagProps({ value: props.value }) as Record<string, unknown>, tagChildren(slots.default?.()))\n },\n})\n\n/** 折叠的标签合成的一个标签:同样是 tag 的 root;有插槽时使用插槽,否则显示 +N。没有折叠的标签时连接层写 hidden。 */\nexport const XhCascaderOverflowTag = defineComponent({\n name: 'XhCascaderOverflowTag',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h(\n 'span',\n ctx.api.value.getOverflowTagProps() as Record<string, unknown>,\n tagChildren(slots.default?.() ?? ctx.api.value.overflowText),\n )\n },\n})\n\n/** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger(data-scope=\"tag\"),可及名使用 translations.deleteItem;点按移除所在标签的选中路径。 */\nexport const XhCascaderItemDeleteTrigger = defineComponent({\n name: 'XhCascaderItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const tag = useCascaderTagContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderIndicator = defineComponent({\n name: 'XhCascaderIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getIndicatorProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderClearTrigger = defineComponent({\n name: 'XhCascaderClearTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderPositioner = defineComponent({\n name: 'XhCascaderPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n // 列区的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner。\n // 只摆横的:列多到放不下时整体横向滚动,纵向溢出归每一列自己。\n // 横条的正负按排版方向算,而组件不读计算样式,把 positioner 上那份显式交过去\n const bars = useScrollbars({\n scrollable: () => ctx.contentRef.value,\n axes: ['horizontal'],\n // 条子走浮层 4px 档\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhCascaderLoading = defineComponent({\n name: 'XhCascaderLoading',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n const unregister = content.registerLoading()\n onBeforeUnmount(unregister)\n // 在途占位:作者没写内容时使用 Cascader 自己的翻译合同。\n return () => h(\n 'div',\n ctx.api.value.getLoadingProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.translations.loading,\n )\n },\n})\n\n/** 放在作者插槽之后挂载;隔着普通元素或业务组件的 Loading 已在 setup 阶段登记。 */\nconst XhCascaderAutoLoading = defineComponent({\n name: 'XhCascaderAutoLoading',\n setup() {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n return () => content.authoredLoadingCount.value > 0\n ? null\n : h('div', {\n ...ctx.api.value.getLoadingProps() as Record<string, unknown>,\n 'data-xh-cascader-auto-loading': '',\n }, ctx.api.value.translations.loading)\n },\n})\n\nexport const XhCascaderContent = defineComponent({\n name: 'XhCascaderContent',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const authoredLoadingCount = ref(0)\n const registerLoading = (): (() => void) => {\n authoredLoadingCount.value += 1\n let active = true\n return () => {\n if (!active)\n return\n active = false\n authoredLoadingCount.value -= 1\n }\n }\n provideCascaderContent({ authoredLoadingCount, registerLoading })\n // 收起时只隐藏不卸载;跨列的键盘导航也在这一层处理\n return () => {\n const api = ctx.api.value\n const children = slots.default?.() ?? []\n return h('div', {\n ...api.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, [\n children,\n // 空态占位常挂在列后,露不露面归连接层;empty 插槽可换内容,缺省文案按视图取无匹配或无数据\n h(\n 'div',\n api.getEmptyProps() as Record<string, unknown>,\n slots.empty ? slots.empty() : (api.searching ? api.translations.noMatch : api.translations.empty),\n ),\n h(XhCascaderAutoLoading),\n ])\n }\n },\n})\n\nexport const XhCascaderInput = defineComponent({\n name: 'XhCascaderInput',\n setup() {\n const ctx = useCascaderContext()\n // 搜索框放在 content 顶部;没开 searchable 时连接层给 hidden\n return () => h('input', ctx.api.value.getInputProps() as Record<string, unknown>)\n },\n})\n\n/** item 插槽的载荷:一条搜索候选。 */\nexport interface CascaderSearchListItemSlotProps {\n result: CascaderSearchResult\n}\n\nexport const XhCascaderSearchList = defineComponent({\n name: 'XhCascaderSearchList',\n slots: Object as SlotsType<{\n item?: (props: CascaderSearchListItemSlotProps) => VNode[]\n }>,\n // 根是片段(列表节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列表节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useCascaderContext()\n const searchListRef = ref<HTMLElement | null>(null)\n // 候选列表自己竖滚,条子贴在它的盒子上、紧跟在它后面(与列同一形态:浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => searchListRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 候选换代、列表显隐都会挪动它在壳内的位置:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 候选整组自动铺:整条路径连缀成一行;item 插槽可换内容\n return () => [\n h('div', {\n ...mergeProps(ctx.api.value.getSearchListProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { searchListRef.value = el as HTMLElement },\n }, ctx.api.value.searchResults.map(result =>\n h(\n 'div',\n { ...ctx.api.value.getSearchItemProps({ path: result.path }) as Record<string, unknown>, key: result.key },\n slots.item ? slots.item({ result }) : result.labels.join(' / '),\n ),\n )),\n ...bars.render(),\n ]\n },\n})\n\n/**\n * 懒分支那一列里的三块状态:在途、失败提示与重试钮。只在这一列属于懒分支时铺,露哪一块归连接层;\n * 文案走 translations.loading / branchError / retry。\n */\nfunction renderBranchFeedback(ctx: CascaderContext, level: number): VNode[] {\n const api = ctx.api.value\n if (api.columnLoadState(level) == null)\n return []\n return [\n h('div', { ...api.getBranchLoadingProps({ level }) as Record<string, unknown>, key: 'branch-loading' }, api.translations.loading),\n h('div', { ...api.getBranchErrorProps({ level }) as Record<string, unknown>, key: 'branch-error' }, api.translations.branchError),\n h('button', { ...api.getBranchRetryTriggerProps({ level }) as Record<string, unknown>, key: 'branch-retry-trigger' }, api.translations.retry),\n ]\n}\n\nexport const XhCascaderColumn = defineComponent({\n name: 'XhCascaderColumn',\n props: {\n // 层号,兼收字符串以支持模板里写 level=\"0\"\n level: { type: [Number, String] as PropType<number | string>, required: true },\n },\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n const columnRef = ref<HTMLElement | null>(null)\n // 每列自己竖滚:条子贴在本列的盒子上、紧跟在它后面;content 那条横的归浮层壳\n const bars = useScrollbars({\n scrollable: () => columnRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 展开路径一变,左边的列换内容、本列在壳内的位置跟着挪:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 展开路径变短时本列收起,节点常挂不卸载\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ level: Number(props.level) }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n [...(slots.default?.() ?? []), ...renderBranchFeedback(ctx, Number(props.level))],\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhCascaderGroup = defineComponent({\n name: 'XhCascaderGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const group = computed<CascaderGroupProps>(() => ({ value: props.value }))\n provideCascaderGroup({ group })\n // 分组容器:写在列里,条目照常挂在它下面\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderGroupLabel = defineComponent({\n name: 'XhCascaderGroupLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { group } = useCascaderGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItem = defineComponent({\n name: 'XhCascaderItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const item = computed<CascaderItemProps>(() => ({ value: props.value }))\n provideCascaderItem({ item })\n const el = ref<HTMLElement | null>(null)\n reportItemFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhCascaderItemText = defineComponent({\n name: 'XhCascaderItemText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */\nexport const XhCascaderItemDescription = defineComponent({\n name: 'XhCascaderItemDescription',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行尾的作者内容(计数、徽标) */\nexport const XhCascaderItemSuffix = defineComponent({\n name: 'XhCascaderItemSuffix',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemSuffixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItemIndicator = defineComponent({\n name: 'XhCascaderItemIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderFooter = defineComponent({\n name: 'XhCascaderFooter',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 浮层底部的操作区:写在 content 里、与列并列,横跨全部列;\n // 列表框语义在每一列上,放在这里的按钮既不进列的拥有关系,也走不到方向键\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"cascader.js","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 cascader 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n CascaderApi,\n CascaderExpandTrigger,\n CascaderGroupProps,\n CascaderItemProps,\n CascaderNode,\n CascaderSchema,\n CascaderSearchResult,\n CascaderTranslations,\n CascaderValue,\n} from '@xihan-ui/headless'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { CascaderContext } from './use-cascader'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, onUpdated, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotIsPlainText } from '../../runtime/slot-content'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideCascader, provideCascaderContent, provideCascaderGroup, provideCascaderItem, provideCascaderTag, useCascaderContentContext, useCascaderContext, useCascaderGroupContext, useCascaderItemContext, useCascaderTagContext } from './context'\nimport { useCascader } from './use-cascader'\n\ntype CascaderProps = CascaderSchema['props']\n\n/** 本条目持有焦点时,value 变更重新报告焦点条目,卸载时上报焦点丢失 */\nfunction reportItemFocus(\n ctx: CascaderContext,\n el: Ref<HTMLElement | null>,\n value: () => string,\n): void {\n watch(value, (next, prev) => {\n if (next === prev)\n return\n const { service, api } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (!el.value || service.scope.getActiveElement() !== el.value)\n return\n // 层号回 collection 里查,条目只自报值\n const meta = api.value.levels.flatMap(level => level.items).find(item => item.value === next)\n if (meta)\n service.send({ type: 'ITEM.FOCUS', level: meta.level, value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本条目当下正持有焦点」判定,不按 value 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'ITEM.LOST' })\n })\n}\n\n/** 默认插槽的载荷:级联的展开态、选中态与列数据、多选的可见标签与折起的个数,以及修改它们的方法。 */\nexport type CascaderRootSlotProps = Pick<\n CascaderApi,\n | 'open'\n | 'levels'\n | 'columns'\n | 'value'\n | 'valuePath'\n | 'activePath'\n | 'focusedPath'\n | 'displayText'\n | 'canClear'\n | 'tags'\n | 'overflowCount'\n | 'overflowText'\n | 'isSelected'\n | 'isIndeterminate'\n | 'isActive'\n | 'isVisible'\n | 'setOpen'\n | 'setValue'\n | 'setActivePath'\n | 'select'\n | 'clear'\n | 'deselect'\n>\n\nexport const XhCascaderRoot = defineComponent({\n name: 'XhCascaderRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<CascaderNode[]> },\n /** 取回懒分支(hasChildren 且没给 children)的直接子项;展开路径走到它时自动调用。 */\n loadChildren: { type: Function as PropType<CascaderProps['loadChildren']> },\n value: { type: Array as PropType<CascaderValue> },\n defaultValue: { type: Array as PropType<CascaderValue> },\n name: { type: String },\n form: { type: String },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n expandTrigger: { type: String as PropType<CascaderExpandTrigger> },\n changeOnSelect: Boolean,\n multiple: Boolean,\n /** 多选标签最多显示的数量,其余折进 +N;默认 3。 */\n maxTagCount: { type: Number },\n searchable: { type: Boolean, default: undefined },\n /** 自定义搜索匹配;缺省为整条路径的显示名连缀后大小写不敏感包含。 */\n filter: { type: Function as PropType<CascaderProps['filter']> },\n cascade: Boolean,\n checkedStrategy: { type: String as PropType<CascaderProps['checkedStrategy']> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n loading: Boolean,\n translations: { type: Object as PropType<Partial<CascaderTranslations>> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placeholder: { type: String },\n separator: { type: String },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值;选中值恒为路径数组,单选时长度 ≤ 1\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<CascaderProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<CascaderProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<CascaderProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<CascaderProps, 'onOpenChange'>['open']) => true,\n 'branch-load-start': (_details: PayloadOf<CascaderProps, 'onBranchLoadStart'>) => true,\n 'branch-load': (_details: PayloadOf<CascaderProps, 'onBranchLoad'>) => true,\n 'branch-load-error': (_details: PayloadOf<CascaderProps, 'onBranchLoadError'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CascaderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: CascaderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: CascaderProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useCascader(withHandlers(withXhConfig('cascader', useFormControlProps(props)), { onClear: () => emit('clear') }) as CascaderProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n onBranchLoadStart: details => emit('branch-load-start', details),\n onBranchLoad: details => emit('branch-load', details),\n onBranchLoadError: details => emit('branch-load-error', details),\n })\n provideCascader(ctx)\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, [slots.default?.({\n open: ctx.api.value.open,\n // levels 每层一列、层内节点各一条目,供作者渲染;columns 只读当前展开的列\n levels: ctx.api.value.levels,\n columns: ctx.api.value.columns,\n value: ctx.api.value.value,\n valuePath: ctx.api.value.valuePath,\n activePath: ctx.api.value.activePath,\n focusedPath: ctx.api.value.focusedPath,\n displayText: ctx.api.value.displayText,\n canClear: ctx.api.value.canClear,\n tags: ctx.api.value.tags,\n overflowCount: ctx.api.value.overflowCount,\n overflowText: ctx.api.value.overflowText,\n isSelected: ctx.api.value.isSelected,\n isIndeterminate: ctx.api.value.isIndeterminate,\n isActive: ctx.api.value.isActive,\n isVisible: ctx.api.value.isVisible,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n setActivePath: ctx.api.value.setActivePath,\n select: ctx.api.value.select,\n clear: ctx.api.value.clear,\n deselect: ctx.api.value.deselect,\n }), ...ctx.api.value.value.map(path => h('input', {\n ...ctx.api.value.getHiddenInputProps({ path }) as Record<string, unknown>,\n key: JSON.stringify(path),\n }))])\n },\n})\n\nexport const XhCascaderLabel = defineComponent({\n name: 'XhCascaderLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderControl = defineComponent({\n name: 'XhCascaderControl',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.controlRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhCascaderTrigger = defineComponent({\n name: 'XhCascaderTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useCascaderContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhCascaderValueText = defineComponent({\n name: 'XhCascaderValueText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 有插槽用插槽,否则显示整条路径或 placeholder\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.displayText,\n )\n },\n})\n\nexport const XhCascaderTagList = defineComponent({\n name: 'XhCascaderTagList',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 标签行:可见标签与 +N 那一枚在里面并排;无选中时连接层给 hidden,value-text 回来显示占位文字\n return () => h('span', ctx.api.value.getTagListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签文字所在的块(tag 的 label):截断规则挂在这一层。 */\nexport const XhCascaderTagLabel = defineComponent({\n name: 'XhCascaderTagLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getTagLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 标签内容:只有文字时替它包一层 label:截断规则挂在 label 上,直接展开在 root 上的文字过长会把\n * 删除按钮挤出;作者自己写了节点则原样放行。与 XhTagRoot 同一规则。\n * 库自身填入的文字(+N,没有折叠时是空串)恒包 label,三个适配器渲染出同一棵树。\n */\nfunction tagChildren(content: VNode[] | string | undefined): VNode[] | string | undefined {\n if (typeof content === 'string')\n return [h(XhCascaderTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhCascaderTagLabel, null, () => content)] : content\n}\n\n/** 一条选中路径一个标签,即库内 tag 的 root(data-scope=\"tag\"):语气、尺寸与禁用从级联传下,形态按控件的面派生;触发器内纯展示,触发器外配合 XhCascaderItemDeleteTrigger 可删除。 */\nexport const XhCascaderTag = defineComponent({\n name: 'XhCascaderTag',\n props: {\n /** 它代表哪条选中路径:写路径的比较键,即 tags 里的 key。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n provideCascaderTag({ value: () => props.value })\n return () => h('span', ctx.api.value.getTagProps({ value: props.value }) as Record<string, unknown>, tagChildren(slots.default?.()))\n },\n})\n\n/** 折叠的标签合成的一个标签:同样是 tag 的 root;有插槽时使用插槽,否则显示 +N。没有折叠的标签时连接层写 hidden。 */\nexport const XhCascaderOverflowTag = defineComponent({\n name: 'XhCascaderOverflowTag',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h(\n 'span',\n ctx.api.value.getOverflowTagProps() as Record<string, unknown>,\n tagChildren(slots.default?.() ?? ctx.api.value.overflowText),\n )\n },\n})\n\n/** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger(data-scope=\"tag\"),可及名使用 translations.deleteItem;点按移除所在标签的选中路径。 */\nexport const XhCascaderItemDeleteTrigger = defineComponent({\n name: 'XhCascaderItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const tag = useCascaderTagContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderIndicator = defineComponent({\n name: 'XhCascaderIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getIndicatorProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderClearTrigger = defineComponent({\n name: 'XhCascaderClearTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderPositioner = defineComponent({\n name: 'XhCascaderPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n // 列区的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner。\n // 只摆横的:列多到放不下时整体横向滚动,纵向溢出归每一列自己。\n // 横条的正负按排版方向算,而组件不读计算样式,把 positioner 上那份显式交过去\n const bars = useScrollbars({\n scrollable: () => ctx.contentRef.value,\n axes: ['horizontal'],\n // 条子走浮层 4px 档\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef, present: ctx.visible.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhCascaderLoading = defineComponent({\n name: 'XhCascaderLoading',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n const unregister = content.registerLoading()\n onBeforeUnmount(unregister)\n // 在途占位:作者没写内容时使用 Cascader 自己的翻译合同。\n return () => h(\n 'div',\n ctx.api.value.getLoadingProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.translations.loading,\n )\n },\n})\n\n/** 放在作者插槽之后挂载;隔着普通元素或业务组件的 Loading 已在 setup 阶段登记。 */\nconst XhCascaderAutoLoading = defineComponent({\n name: 'XhCascaderAutoLoading',\n setup() {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n return () => content.authoredLoadingCount.value > 0\n ? null\n : h('div', {\n ...ctx.api.value.getLoadingProps() as Record<string, unknown>,\n 'data-xh-cascader-auto-loading': '',\n }, ctx.api.value.translations.loading)\n },\n})\n\nexport const XhCascaderContent = defineComponent({\n name: 'XhCascaderContent',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const authoredLoadingCount = ref(0)\n const registerLoading = (): (() => void) => {\n authoredLoadingCount.value += 1\n let active = true\n return () => {\n if (!active)\n return\n active = false\n authoredLoadingCount.value -= 1\n }\n }\n provideCascaderContent({ authoredLoadingCount, registerLoading })\n // 收起时只隐藏不卸载;跨列的键盘导航也在这一层处理\n return () => {\n const api = ctx.api.value\n const children = slots.default?.() ?? []\n return h('div', {\n ...api.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, [\n children,\n // 空态占位常挂在列后,露不露面归连接层;empty 插槽可换内容,缺省文案按视图取无匹配或无数据\n h(\n 'div',\n api.getEmptyProps() as Record<string, unknown>,\n slots.empty ? slots.empty() : (api.searching ? api.translations.noMatch : api.translations.empty),\n ),\n h(XhCascaderAutoLoading),\n ])\n }\n },\n})\n\nexport const XhCascaderInput = defineComponent({\n name: 'XhCascaderInput',\n setup() {\n const ctx = useCascaderContext()\n // 搜索框放在 content 顶部;没开 searchable 时连接层给 hidden\n return () => h('input', ctx.api.value.getInputProps() as Record<string, unknown>)\n },\n})\n\n/** item 插槽的载荷:一条搜索候选。 */\nexport interface CascaderSearchListItemSlotProps {\n result: CascaderSearchResult\n}\n\nexport const XhCascaderSearchList = defineComponent({\n name: 'XhCascaderSearchList',\n slots: Object as SlotsType<{\n item?: (props: CascaderSearchListItemSlotProps) => VNode[]\n }>,\n // 根是片段(列表节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列表节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useCascaderContext()\n const searchListRef = ref<HTMLElement | null>(null)\n // 候选列表自己竖滚,条子贴在它的盒子上、紧跟在它后面(与列同一形态:浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => searchListRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 候选换代、列表显隐都会挪动它在壳内的位置:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 候选整组自动铺:整条路径连缀成一行;item 插槽可换内容\n return () => [\n h('div', {\n ...mergeProps(ctx.api.value.getSearchListProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { searchListRef.value = el as HTMLElement },\n }, ctx.api.value.searchResults.map(result =>\n h(\n 'div',\n { ...ctx.api.value.getSearchItemProps({ path: result.path }) as Record<string, unknown>, key: result.key },\n slots.item ? slots.item({ result }) : result.labels.join(' / '),\n ),\n )),\n ...bars.render(),\n ]\n },\n})\n\n/**\n * 懒分支那一列里的三块状态:在途、失败提示与重试钮。只在这一列属于懒分支时铺,露哪一块归连接层;\n * 文案走 translations.loading / branchError / retry。\n */\nfunction renderBranchFeedback(ctx: CascaderContext, level: number): VNode[] {\n const api = ctx.api.value\n if (api.columnLoadState(level) == null)\n return []\n return [\n h('div', { ...api.getBranchLoadingProps({ level }) as Record<string, unknown>, key: 'branch-loading' }, api.translations.loading),\n h('div', { ...api.getBranchErrorProps({ level }) as Record<string, unknown>, key: 'branch-error' }, api.translations.branchError),\n h('button', { ...api.getBranchRetryTriggerProps({ level }) as Record<string, unknown>, key: 'branch-retry-trigger' }, api.translations.retry),\n ]\n}\n\nexport const XhCascaderColumn = defineComponent({\n name: 'XhCascaderColumn',\n props: {\n // 层号,兼收字符串以支持模板里写 level=\"0\"\n level: { type: [Number, String] as PropType<number | string>, required: true },\n },\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n const columnRef = ref<HTMLElement | null>(null)\n // 每列自己竖滚:条子贴在本列的盒子上、紧跟在它后面;content 那条横的归浮层壳\n const bars = useScrollbars({\n scrollable: () => columnRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 展开路径一变,左边的列换内容、本列在壳内的位置跟着挪:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 展开路径变短时本列收起,节点常挂不卸载\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ level: Number(props.level) }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n [...(slots.default?.() ?? []), ...renderBranchFeedback(ctx, Number(props.level))],\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhCascaderGroup = defineComponent({\n name: 'XhCascaderGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const group = computed<CascaderGroupProps>(() => ({ value: props.value }))\n provideCascaderGroup({ group })\n // 分组容器:写在列里,条目照常挂在它下面\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderGroupLabel = defineComponent({\n name: 'XhCascaderGroupLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { group } = useCascaderGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItem = defineComponent({\n name: 'XhCascaderItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const item = computed<CascaderItemProps>(() => ({ value: props.value }))\n provideCascaderItem({ item })\n const el = ref<HTMLElement | null>(null)\n reportItemFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhCascaderItemText = defineComponent({\n name: 'XhCascaderItemText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */\nexport const XhCascaderItemDescription = defineComponent({\n name: 'XhCascaderItemDescription',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行尾的作者内容(计数、徽标) */\nexport const XhCascaderItemSuffix = defineComponent({\n name: 'XhCascaderItemSuffix',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemSuffixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItemIndicator = defineComponent({\n name: 'XhCascaderItemIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderFooter = defineComponent({\n name: 'XhCascaderFooter',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 浮层底部的操作区:写在 content 里、与列并列,横跨全部列;\n // 列表框语义在每一列上,放在这里的按钮既不进列的拥有关系,也走不到方向键\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"citation.d.ts","names":[],"sources":["../../../src/components/citation/citation.ts"],"mappings":";;;;;KAmBK,gBAAgB;cAER,8BAAc,8BAAA;;IAGG,MAAA,SAAS;;;IACD,MAAA;;;IACO,MAAA;;;;;;;;;;;;;IAKlB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;IAIX,MAAA,SAAS;;;;;;IAEN,MAAA,SAAS;;;;;EAGN,yBAAA,UAAA,UAAU;EACR,0BAAA;EACX,gBAAA,UAAA,UAAU;EACb,gBAAA;EACG,gBAAA,UAAA,UAAU;;;IAtBV,MAAA,SAAS;;;IACD,MAAA;;;IACO,MAAA;;;;;;;;;;;;;IAKlB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;IAIX,MAAA,SAAS;;;;;;IAEN,MAAA,SAAS;;;;;;;;;;;;;qCA4B3C;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAMzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,8BAAA;;;;;IAME,MAAA;;;;;;;;;;;;IAAA,MAAA;;;;;;;qCAS9B;;;;;cAMW,oCAAoB,8BAAA;;;IAIA,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;MAgBxC,oDAAA;cAEW,iCAAiB,8BAAA;;;;;;;;;;;;;;MAgB5B,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAeW,qCAAqB,0BAVzB,iCAAK,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAiBD,oCAAoB,0BAjBxB,iCAAK,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAwBD,gCAAgB,8BAAA;;;;;;;;;;;;;;;;qCAc3B;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAWzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"citation.d.ts","names":[],"sources":["../../../src/components/citation/citation.ts"],"mappings":";;;;;KAmBK,gBAAgB;cAER,8BAAc,8BAAA;;IAGG,MAAA,SAAS;;;IACD,MAAA;;;IACO,MAAA;;;;;;;;;;;;;IAKlB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;IAIX,MAAA,SAAS;;;;;;IAEN,MAAA,SAAS;;;;;EAGN,yBAAA,UAAA,UAAU;EACR,0BAAA;EACX,gBAAA,UAAA,UAAU;EACb,gBAAA;EACG,gBAAA,UAAA,UAAU;;;IAtBV,MAAA,SAAS;;;IACD,MAAA;;;IACO,MAAA;;;;;;;;;;;;;IAKlB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;IAIX,MAAA,SAAS;;;;;;IAEN,MAAA,SAAS;;;;;;;;;;;;;qCA4B3C;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAMzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,8BAAA;;;;;IAME,MAAA;;;;;;;;;;;;IAAA,MAAA;;;;;;;qCAS9B;;;;;cAMW,oCAAoB,8BAAA;;;IAIA,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;MAkBxC,oDAAA;cAEW,iCAAiB,8BAAA;;;;;;;;;;;;;;MAgB5B,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAeW,qCAAqB,0BAVzB,iCAAK,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAiBD,oCAAoB,0BAjBxB,iCAAK,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAwBD,gCAAgB,8BAAA;;;;;;;;;;;;;;;;qCAc3B;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAWzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
@@ -4,7 +4,7 @@ import { slotPaints } from "../../runtime/slot-content.js";
4
4
  import { provideCitation, provideCitationSource, useCitationContext, useCitationSource } from "./context.js";
5
5
  import { useCitation } from "./use-citation.js";
6
6
  import { computed, defineComponent, h, mergeProps } from "vue";
7
- import { citationSourceMetaText, citationSourceTitle } from "@xihan-ui/headless";
7
+ import { citationSourceTitle } from "@xihan-ui/headless";
8
8
  //#region src/components/citation/citation.ts
9
9
  const XhCitationRoot = defineComponent({
10
10
  name: "XhCitationRoot",
@@ -96,8 +96,9 @@ container: { type: Object } },
96
96
  setup(props, { slots, attrs }) {
97
97
  const ctx = useCitationContext();
98
98
  return () => {
99
+ const positioner = ctx.api.value.getPositionerProps();
99
100
  const shell = h("div", {
100
- ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
101
+ ...mergeProps(positioner, attrs),
101
102
  ref: (el) => {
102
103
  ctx.positionerRef.value = el;
103
104
  }
@@ -105,7 +106,8 @@ container: { type: Object } },
105
106
  if (ctx.api.value.previewMode !== "hover") return shell;
106
107
  return h(XhPortal, {
107
108
  to: props.container ?? ctx.portalTarget.value,
108
- source: ctx.rootRef
109
+ source: ctx.rootRef,
110
+ present: positioner.hidden !== true
109
111
  }, () => [shell]);
110
112
  };
111
113
  }
@@ -149,7 +151,7 @@ function sourcePart(name, slots) {
149
151
  const item = useCitationSource();
150
152
  return () => {
151
153
  const current = api.value.sources.find((source) => source.sourceId === item.value.sourceId);
152
- const text = name === "getSourceTitleProps" ? citationSourceTitle(current) : citationSourceMetaText(current, "Document");
154
+ const text = name === "getSourceTitleProps" ? citationSourceTitle(current) : api.value.sourceMetaText(current);
153
155
  return h("span", api.value[name](item.value), slots.default?.() ?? text);
154
156
  };
155
157
  }
@@ -206,14 +208,14 @@ function renderPreview(api, item) {
206
208
  const at = api.getPreviewPosition(item);
207
209
  return [
208
210
  h("header", api.getPreviewHeaderProps(item), [
209
- h("span", null, [h("strong", api.getPreviewTitleProps(item), citationSourceTitle(current)), h("span", api.getPreviewMetaProps(item), citationSourceMetaText(current, "Document"))]),
211
+ h("span", null, [h("strong", api.getPreviewTitleProps(item), citationSourceTitle(current)), h("span", api.getPreviewMetaProps(item), api.sourceMetaText(current))]),
210
212
  h("button", api.getPrevTriggerProps(item)),
211
213
  h("span", api.getPreviewIndexProps(item), at ? `${at.index} / ${at.total}` : ""),
212
214
  h("button", api.getNextTriggerProps(item)),
213
215
  h("button", api.getDismissTriggerProps(item))
214
216
  ]),
215
217
  h("blockquote", api.getQuoteProps(item), quote),
216
- h(linkTag, api.getPreviewLinkProps(item), current.type === "source-url" ? "Open source" : "Open document")
218
+ h(linkTag, api.getPreviewLinkProps(item), api.previewLinkText(item))
217
219
  ];
218
220
  }
219
221
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"citation.js","names":[],"sources":["../../../src/components/citation/citation.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// 提供 citation 相关实现。\n\nimport type { Direction, Placement, Size } from '@xihan-ui/core'\nimport type { CitationPreviewMode, CitationPreviewProps, CitationSchema, CitationSource, CitationSourceItemProps } from '@xihan-ui/headless'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { citationSourceMetaText, citationSourceTitle } from '@xihan-ui/headless'\nimport { computed, defineComponent, h, mergeProps } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotPaints } from '../../runtime/slot-content'\nimport { provideCitation, provideCitationSource, useCitationContext, useCitationSource } from './context'\nimport { useCitation } from './use-citation'\n\ntype CitationProps = CitationSchema['props']\n\nexport const XhCitationRoot = defineComponent({\n name: 'XhCitationRoot',\n props: {\n sources: { type: Array as PropType<CitationSource[]> },\n activeSourceId: { type: String as PropType<string | null> },\n defaultActiveSourceId: { type: String as PropType<string | null> },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n disabled: Boolean,\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n size: { type: String as PropType<Size> },\n previewMode: { type: String as PropType<CitationPreviewMode> },\n openDelay: { type: Number },\n closeDelay: { type: Number },\n skipDelayDuration: { type: Number },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n translations: { type: Object as PropType<CitationProps['translations']> },\n },\n emits: {\n 'active-source-change': (_details: PayloadOf<CitationProps, 'onActiveSourceChange'>) => true,\n 'update:activeSourceId': (_sourceId: string | null) => true,\n 'open-change': (_details: PayloadOf<CitationProps, 'onOpenChange'>) => true,\n 'update:open': (_open: boolean) => true,\n 'source-open': (_details: PayloadOf<CitationProps, 'onSourceOpen'>) => true,\n },\n setup(props, { emit, slots }) {\n // props 原样交进去、在取值器里展开:在这里展开会把首帧的值冻住,受控写回与改档都传不进机器\n const context = useCitation(withXhConfig('citation', props) as CitationProps, {\n onActiveSourceChange: (details) => {\n emit('active-source-change', details)\n emit('update:activeSourceId', details.sourceId)\n },\n onOpenChange: (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n },\n onSourceOpen: details => emit('source-open', details),\n })\n provideCitation(context)\n return () => h('div', {\n ...context.api.value.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { context.rootRef.value = el as HTMLElement | null },\n }, slots.default?.())\n },\n})\n\nexport const XhCitationText = defineComponent({\n name: 'XhCitationText',\n setup(_, { slots }) {\n const { api } = useCitationContext()\n return () => h('span', api.value.getTextProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCitationTrigger = defineComponent({\n name: 'XhCitationTrigger',\n props: {\n /** 这一处引用的来源;一处引多个来源时改写 sourceIds,两者只写一个。 */\n sourceId: String,\n /** 一处引用多个来源,预览里可以在它们之间轮换。 */\n sourceIds: { type: Array as PropType<readonly string[]> },\n citationId: String,\n anchorIndex: Number,\n disabled: Boolean,\n },\n setup(props, { slots }) {\n const { api } = useCitationContext()\n return () => h('button', api.value.getTriggerProps(props) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * hover 档的浮层定位壳:预览放进它里面,锚定到当前那处引用旁并搬到 portal 落点。\n * inline 档不搬家,皮肤把它排成 display: contents,里面的预览照常在正文流里。\n */\nexport const XhCitationPositioner = defineComponent({\n name: 'XhCitationPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // hover 档的根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCitationContext()\n return () => {\n const shell = h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement | null },\n }, slots.default?.())\n if (ctx.api.value.previewMode !== 'hover')\n return shell\n return h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.rootRef }, () => [shell])\n }\n },\n})\n\nexport const XhCitationPreview = defineComponent({\n name: 'XhCitationPreview',\n props: {\n sourceId: { type: String, required: true },\n anchorIndex: Number,\n },\n setup(props, { slots }) {\n const { api } = useCitationContext()\n return () => {\n const authored = slots.default?.()\n const item: CitationPreviewProps = props\n return h('section', api.value.getPreviewProps(item) as Record<string, unknown>, slotPaints(authored)\n ? authored\n : renderPreview(api.value, item))\n }\n },\n})\n\nexport const XhCitationSourceLink = defineComponent({\n name: 'XhCitationSourceLink',\n setup(_, { slots }) {\n const { api } = useCitationContext()\n const item = useCitationSource()\n return () => h('button', api.value.getSourceLinkProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCitationSourceIndex = defineComponent({\n name: 'XhCitationSourceIndex',\n setup(_, { slots }) {\n const { api } = useCitationContext()\n const item = useCitationSource()\n return () => h('span', api.value.getSourceIndexProps(item.value) as Record<string, unknown>, slots.default?.() ?? `${api.value.sources.findIndex(source => source.sourceId === item.value.sourceId) + 1}`)\n },\n})\n\nfunction sourcePart(\n name: 'getSourceTitleProps' | 'getSourceMetaProps',\n slots: { default?: () => VNode[] },\n): () => VNode {\n const { api } = useCitationContext()\n const item = useCitationSource()\n return () => {\n const current = api.value.sources.find(source => source.sourceId === item.value.sourceId)\n const text = name === 'getSourceTitleProps' ? citationSourceTitle(current) : citationSourceMetaText(current, 'Document')\n return h('span', api.value[name](item.value) as Record<string, unknown>, slots.default?.() ?? text)\n }\n}\n\nexport const XhCitationSourceTitle = defineComponent({\n name: 'XhCitationSourceTitle',\n setup(_, { slots }) {\n return sourcePart('getSourceTitleProps', slots)\n },\n})\n\nexport const XhCitationSourceMeta = defineComponent({\n name: 'XhCitationSourceMeta',\n setup(_, { slots }) {\n return sourcePart('getSourceMetaProps', slots)\n },\n})\n\nexport const XhCitationSource = defineComponent({\n name: 'XhCitationSource',\n props: {\n sourceId: { type: String, required: true },\n disabled: Boolean,\n },\n setup(props, { slots }) {\n const { api } = useCitationContext()\n const item = computed<CitationSourceItemProps>(() => ({ sourceId: props.sourceId, disabled: props.disabled }))\n provideCitationSource(item)\n return () => h('li', api.value.getSourceProps(item.value) as Record<string, unknown>, slots.default?.() ?? [\n h(XhCitationSourceLink, null, () => [h(XhCitationSourceIndex), h('span', null, [h(XhCitationSourceTitle), h(XhCitationSourceMeta)])]),\n ])\n },\n})\n\nexport const XhCitationList = defineComponent({\n name: 'XhCitationList',\n setup(_, { slots }) {\n const { api } = useCitationContext()\n return () => {\n const authored = slots.default?.()\n return h('ol', api.value.getListProps() as Record<string, unknown>, slotPaints(authored)\n ? authored\n : api.value.sources.map(source => h(XhCitationSource, { key: source.sourceId, sourceId: source.sourceId })))\n }\n },\n})\n\nfunction renderPreview(api: ReturnType<typeof useCitationContext>['api']['value'], item: CitationPreviewProps): VNode[] {\n const current = api.sources.find(source => source.sourceId === item.sourceId)\n if (!current)\n return []\n const anchorIndex = api.activeSourceId === item.sourceId ? api.activeAnchorIndex ?? item.anchorIndex ?? 0 : item.anchorIndex ?? 0\n const quote = current.anchors?.[anchorIndex]?.quote\n const linkTag = current.type === 'source-url' ? 'a' : 'button'\n const at = api.getPreviewPosition(item)\n return [\n h('header', api.getPreviewHeaderProps(item) as Record<string, unknown>, [\n h('span', null, [\n h('strong', api.getPreviewTitleProps(item) as Record<string, unknown>, citationSourceTitle(current)),\n h('span', api.getPreviewMetaProps(item) as Record<string, unknown>, citationSourceMetaText(current, 'Document')),\n ]),\n // 一处多源的轮换:只有一个来源时这三件带 hidden\n h('button', api.getPrevTriggerProps(item) as Record<string, unknown>),\n h('span', api.getPreviewIndexProps(item) as Record<string, unknown>, at ? `${at.index} / ${at.total}` : ''),\n h('button', api.getNextTriggerProps(item) as Record<string, unknown>),\n h('button', api.getDismissTriggerProps(item) as Record<string, unknown>),\n ]),\n h('blockquote', api.getQuoteProps(item) as Record<string, unknown>, quote),\n h(linkTag, api.getPreviewLinkProps(item) as Record<string, unknown>, current.type === 'source-url' ? 'Open source' : 'Open document'),\n ]\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"citation.js","names":[],"sources":["../../../src/components/citation/citation.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// 提供 citation 相关实现。\n\nimport type { Direction, Placement, Size } from '@xihan-ui/core'\nimport type { CitationPreviewMode, CitationPreviewProps, CitationSchema, CitationSource, CitationSourceItemProps } from '@xihan-ui/headless'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { citationSourceTitle } from '@xihan-ui/headless'\nimport { computed, defineComponent, h, mergeProps } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotPaints } from '../../runtime/slot-content'\nimport { provideCitation, provideCitationSource, useCitationContext, useCitationSource } from './context'\nimport { useCitation } from './use-citation'\n\ntype CitationProps = CitationSchema['props']\n\nexport const XhCitationRoot = defineComponent({\n name: 'XhCitationRoot',\n props: {\n sources: { type: Array as PropType<CitationSource[]> },\n activeSourceId: { type: String as PropType<string | null> },\n defaultActiveSourceId: { type: String as PropType<string | null> },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n disabled: Boolean,\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n size: { type: String as PropType<Size> },\n previewMode: { type: String as PropType<CitationPreviewMode> },\n openDelay: { type: Number },\n closeDelay: { type: Number },\n skipDelayDuration: { type: Number },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n translations: { type: Object as PropType<CitationProps['translations']> },\n },\n emits: {\n 'active-source-change': (_details: PayloadOf<CitationProps, 'onActiveSourceChange'>) => true,\n 'update:activeSourceId': (_sourceId: string | null) => true,\n 'open-change': (_details: PayloadOf<CitationProps, 'onOpenChange'>) => true,\n 'update:open': (_open: boolean) => true,\n 'source-open': (_details: PayloadOf<CitationProps, 'onSourceOpen'>) => true,\n },\n setup(props, { emit, slots }) {\n // props 原样交进去、在取值器里展开:在这里展开会把首帧的值冻住,受控写回与改档都传不进机器\n const context = useCitation(withXhConfig('citation', props) as CitationProps, {\n onActiveSourceChange: (details) => {\n emit('active-source-change', details)\n emit('update:activeSourceId', details.sourceId)\n },\n onOpenChange: (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n },\n onSourceOpen: details => emit('source-open', details),\n })\n provideCitation(context)\n return () => h('div', {\n ...context.api.value.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { context.rootRef.value = el as HTMLElement | null },\n }, slots.default?.())\n },\n})\n\nexport const XhCitationText = defineComponent({\n name: 'XhCitationText',\n setup(_, { slots }) {\n const { api } = useCitationContext()\n return () => h('span', api.value.getTextProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCitationTrigger = defineComponent({\n name: 'XhCitationTrigger',\n props: {\n /** 这一处引用的来源;一处引多个来源时改写 sourceIds,两者只写一个。 */\n sourceId: String,\n /** 一处引用多个来源,预览里可以在它们之间轮换。 */\n sourceIds: { type: Array as PropType<readonly string[]> },\n citationId: String,\n anchorIndex: Number,\n disabled: Boolean,\n },\n setup(props, { slots }) {\n const { api } = useCitationContext()\n return () => h('button', api.value.getTriggerProps(props) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * hover 档的浮层定位壳:预览放进它里面,锚定到当前那处引用旁并搬到 portal 落点。\n * inline 档不搬家,皮肤把它排成 display: contents,里面的预览照常在正文流里。\n */\nexport const XhCitationPositioner = defineComponent({\n name: 'XhCitationPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // hover 档的根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCitationContext()\n return () => {\n const positioner = ctx.api.value.getPositionerProps() as Record<string, unknown>\n const shell = h('div', {\n ...mergeProps(positioner, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement | null },\n }, slots.default?.())\n if (ctx.api.value.previewMode !== 'hover')\n return shell\n // 卡片没渲染(没展开,退场也播完)时定位壳是 hidden,不建视觉桥:正文里引用多,每处一台\n return h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.rootRef, present: positioner.hidden !== true }, () => [shell])\n }\n },\n})\n\nexport const XhCitationPreview = defineComponent({\n name: 'XhCitationPreview',\n props: {\n sourceId: { type: String, required: true },\n anchorIndex: Number,\n },\n setup(props, { slots }) {\n const { api } = useCitationContext()\n return () => {\n const authored = slots.default?.()\n const item: CitationPreviewProps = props\n return h('section', api.value.getPreviewProps(item) as Record<string, unknown>, slotPaints(authored)\n ? authored\n : renderPreview(api.value, item))\n }\n },\n})\n\nexport const XhCitationSourceLink = defineComponent({\n name: 'XhCitationSourceLink',\n setup(_, { slots }) {\n const { api } = useCitationContext()\n const item = useCitationSource()\n return () => h('button', api.value.getSourceLinkProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCitationSourceIndex = defineComponent({\n name: 'XhCitationSourceIndex',\n setup(_, { slots }) {\n const { api } = useCitationContext()\n const item = useCitationSource()\n return () => h('span', api.value.getSourceIndexProps(item.value) as Record<string, unknown>, slots.default?.() ?? `${api.value.sources.findIndex(source => source.sourceId === item.value.sourceId) + 1}`)\n },\n})\n\nfunction sourcePart(\n name: 'getSourceTitleProps' | 'getSourceMetaProps',\n slots: { default?: () => VNode[] },\n): () => VNode {\n const { api } = useCitationContext()\n const item = useCitationSource()\n return () => {\n const current = api.value.sources.find(source => source.sourceId === item.value.sourceId)\n const text = name === 'getSourceTitleProps' ? citationSourceTitle(current) : api.value.sourceMetaText(current)\n return h('span', api.value[name](item.value) as Record<string, unknown>, slots.default?.() ?? text)\n }\n}\n\nexport const XhCitationSourceTitle = defineComponent({\n name: 'XhCitationSourceTitle',\n setup(_, { slots }) {\n return sourcePart('getSourceTitleProps', slots)\n },\n})\n\nexport const XhCitationSourceMeta = defineComponent({\n name: 'XhCitationSourceMeta',\n setup(_, { slots }) {\n return sourcePart('getSourceMetaProps', slots)\n },\n})\n\nexport const XhCitationSource = defineComponent({\n name: 'XhCitationSource',\n props: {\n sourceId: { type: String, required: true },\n disabled: Boolean,\n },\n setup(props, { slots }) {\n const { api } = useCitationContext()\n const item = computed<CitationSourceItemProps>(() => ({ sourceId: props.sourceId, disabled: props.disabled }))\n provideCitationSource(item)\n return () => h('li', api.value.getSourceProps(item.value) as Record<string, unknown>, slots.default?.() ?? [\n h(XhCitationSourceLink, null, () => [h(XhCitationSourceIndex), h('span', null, [h(XhCitationSourceTitle), h(XhCitationSourceMeta)])]),\n ])\n },\n})\n\nexport const XhCitationList = defineComponent({\n name: 'XhCitationList',\n setup(_, { slots }) {\n const { api } = useCitationContext()\n return () => {\n const authored = slots.default?.()\n return h('ol', api.value.getListProps() as Record<string, unknown>, slotPaints(authored)\n ? authored\n : api.value.sources.map(source => h(XhCitationSource, { key: source.sourceId, sourceId: source.sourceId })))\n }\n },\n})\n\nfunction renderPreview(api: ReturnType<typeof useCitationContext>['api']['value'], item: CitationPreviewProps): VNode[] {\n const current = api.sources.find(source => source.sourceId === item.sourceId)\n if (!current)\n return []\n const anchorIndex = api.activeSourceId === item.sourceId ? api.activeAnchorIndex ?? item.anchorIndex ?? 0 : item.anchorIndex ?? 0\n const quote = current.anchors?.[anchorIndex]?.quote\n const linkTag = current.type === 'source-url' ? 'a' : 'button'\n const at = api.getPreviewPosition(item)\n return [\n h('header', api.getPreviewHeaderProps(item) as Record<string, unknown>, [\n h('span', null, [\n h('strong', api.getPreviewTitleProps(item) as Record<string, unknown>, citationSourceTitle(current)),\n h('span', api.getPreviewMetaProps(item) as Record<string, unknown>, api.sourceMetaText(current)),\n ]),\n // 一处多源的轮换:只有一个来源时这三件带 hidden\n h('button', api.getPrevTriggerProps(item) as Record<string, unknown>),\n h('span', api.getPreviewIndexProps(item) as Record<string, unknown>, at ? `${at.index} / ${at.total}` : ''),\n h('button', api.getNextTriggerProps(item) as Record<string, unknown>),\n h('button', api.getDismissTriggerProps(item) as Record<string, unknown>),\n ]),\n h('blockquote', api.getQuoteProps(item) as Record<string, unknown>, quote),\n h(linkTag, api.getPreviewLinkProps(item) as Record<string, unknown>, api.previewLinkText(item)),\n ]\n}\n"],"mappings":"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"}
@@ -157,7 +157,8 @@ container: { type: Object } },
157
157
  });
158
158
  return () => h(XhPortal, {
159
159
  to: props.container ?? ctx.portalTarget.value,
160
- source: ctx.triggerRef
160
+ source: ctx.triggerRef,
161
+ present: ctx.visible.value
161
162
  }, () => [h("div", {
162
163
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
163
164
  ref: (el) => {
@@ -1 +1 @@
1
- {"version":3,"file":"color-picker.js","names":[],"sources":["../../../src/components/color-picker/color-picker.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// 提供 color picker 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size } from '@xihan-ui/core'\nimport type {\n ColorFormat,\n ColorPickerApi,\n ColorPickerInputChannel,\n ColorPickerSchema,\n ColorPickerSelectionMode,\n ColorPickerTranslations,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { colorPickerToInputChannel } from '@xihan-ui/headless'\nimport { computed, defineComponent, h, mergeProps } 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 { XhColorSliderControl, XhColorSliderThumb, XhColorSliderTrack } from '../color-slider/color-slider'\nimport { provideColorSlider } from '../color-slider/context'\nimport { XhColorSwatchPickerItem } from '../color-swatch-picker/color-swatch-picker'\nimport { provideColorSwatchPicker } from '../color-swatch-picker/context'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideColorPicker, provideColorPickerTag, useColorPickerContext, useColorPickerTagContext } from './context'\nimport { useColorPicker } from './use-color-picker'\n\ntype ColorPickerProps = ColorPickerSchema['props']\n\n/** 默认插槽的载荷:展开态、当前颜色的各种表示、预设色板、屏幕取色状态,以及修改展开与修改值两个动作。 */\nexport type ColorPickerRootSlotProps = Pick<\n ColorPickerApi,\n 'open' | 'value' | 'color' | 'canAdd' | 'rgba' | 'hsva' | 'swatches' | 'recentColors' | 'picking' | 'eyeDropperSupported' | 'errors' | 'setOpen' | 'setValue' | 'add' | 'clearError' | 'clearRecentColors'\n>\n\nexport const XhColorPickerRoot = defineComponent({\n name: 'XhColorPickerRoot',\n // 缺省值由 connect 与机器给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n /** 选中的颜色,值串数组;单选可写裸串。 */\n value: { type: [String, Array] as PropType<string | string[]> },\n defaultValue: { type: [String, Array] as PropType<string | string[]> },\n /** 选择模式,默认 single;multiple 时工作色是草稿、按「添加」收进值,色块点一下切换,输入行里排成标签。 */\n selectionMode: { type: String as PropType<ColorPickerSelectionMode> },\n /** multiple 下最多选几个颜色。 */\n maxSelected: { type: Number },\n /** 多选时输入行最多摆几枚标签,其余折进 +N 那一枚;默认 3。 */\n maxTagCount: { type: Number },\n format: { type: String as PropType<ColorFormat> },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n alpha: Boolean,\n swatches: { type: Array as PropType<string[]> },\n inline: Boolean,\n // 缺席值 undefined 表示非受控\n recentColors: { type: Array as PropType<string[]> },\n defaultRecentColors: { type: Array as PropType<string[]> },\n maxRecentColors: { type: Number },\n name: { type: String },\n size: { type: String as PropType<Size> },\n variant: { type: String as PropType<ControlVariant> },\n dir: { type: String as PropType<Direction> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n translations: { type: Object as PropType<Partial<ColorPickerTranslations>> },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<ColorPickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<ColorPickerProps, 'onOpenChange'>) => true,\n 'color-error': (_details: PayloadOf<ColorPickerProps, 'onColorError'>) => true,\n 'update:value': (_value: PayloadOf<ColorPickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<ColorPickerProps, 'onOpenChange'>['open']) => true,\n 'recent-colors-change': (_details: PayloadOf<ColorPickerProps, 'onRecentColorsChange'>) => true,\n 'update:recentColors': (_recentColors: PayloadOf<ColorPickerProps, 'onRecentColorsChange'>['recentColors']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: ColorPickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: ColorPickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: ColorPickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const notifyColorError: ColorPickerProps['onColorError'] = details => emit('color-error', details)\n const notifyRecent: ColorPickerProps['onRecentColorsChange'] = (details) => {\n emit('recent-colors-change', details)\n emit('update:recentColors', details.recentColors)\n }\n const ctx = useColorPicker(withXhConfig('color-picker', useFormControlProps(props)) as ColorPickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n onColorError: notifyColorError,\n onRecentColorsChange: notifyRecent,\n })\n provideColorPicker(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n color: ctx.api.value.color,\n canAdd: ctx.api.value.canAdd,\n rgba: ctx.api.value.rgba,\n hsva: ctx.api.value.hsva,\n swatches: ctx.api.value.swatches,\n recentColors: ctx.api.value.recentColors,\n picking: ctx.api.value.picking,\n eyeDropperSupported: ctx.api.value.eyeDropperSupported,\n errors: ctx.api.value.errors,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n add: ctx.api.value.add,\n clearError: ctx.api.value.clearError,\n clearRecentColors: ctx.api.value.clearRecentColors,\n }))\n },\n})\n\nexport const XhColorPickerLabel = defineComponent({\n name: 'XhColorPickerLabel',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerControl = defineComponent({\n name: 'XhColorPickerControl',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerTrigger = defineComponent({\n name: 'XhColorPickerTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 原生 button,激活交给平台;同时是浮层的定位锚点\n return () => h('button', {\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 XhColorPickerValueText = defineComponent({\n name: 'XhColorPickerValueText',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 有插槽用插槽,否则显示工作色的值串\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.color,\n )\n },\n})\n\nexport const XhColorPickerSwatch = defineComponent({\n name: 'XhColorPickerSwatch',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('span', ctx.api.value.getSwatchProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerPositioner = defineComponent({\n name: 'XhColorPickerPositioner',\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 = useColorPickerContext()\n // 面板的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner;条子走浮层 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.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 XhColorPickerContent = defineComponent({\n name: 'XhColorPickerContent',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\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 XhColorPickerSaturationArea = defineComponent({\n name: 'XhColorPickerSaturationArea',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 区域节点交给机器,矩形在指针事件里现量\n return () => h('div', {\n ...ctx.api.value.getSaturationAreaProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.areaRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerAreaThumb = defineComponent({\n name: 'XhColorPickerAreaThumb',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('div', ctx.api.value.getAreaThumbProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 色相滑块的挂载点,同时充当该滑块的根节点:其中放置的是 XhColorSlider* 普通部件\n * (control / track / thumb / label / value-text),DOM 带 data-scope=\"color-slider\"。\n * 未写默认插槽时铺开最简结构:一条轨道加一个拇指。\n */\nexport const XhColorPickerHueSlider = defineComponent({\n name: 'XhColorPickerHueSlider',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n provideColorSlider(ctx.hueSlider)\n return () => h('div', ctx.api.value.getHueSliderProps() as Record<string, unknown>, slots.default?.() ?? renderSliderTree())\n },\n})\n\n/** 透明度滑块的挂载点,同上;alpha 关闭时整条禁用。 */\nexport const XhColorPickerAlphaSlider = defineComponent({\n name: 'XhColorPickerAlphaSlider',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n provideColorSlider(ctx.alphaSlider)\n return () => h('div', ctx.api.value.getAlphaSliderProps() as Record<string, unknown>, slots.default?.() ?? renderSliderTree())\n },\n})\n\n/** 未写默认插槽时的滑块内部:control 中一条 track 与一个 thumb,与手写部件产出的 DOM 一致。 */\nfunction renderSliderTree(): VNode[] {\n return [h(XhColorSliderControl, null, () => [h(XhColorSliderTrack), h(XhColorSliderThumb)])]\n}\n\nexport const XhColorPickerChannelInput = defineComponent({\n name: 'XhColorPickerChannelInput',\n props: {\n /** 该输入框编辑的通道:hex 是整串,r/g/b 是分量,a 是透明度百分数;默认或无法识别时按 hex 处理。 */\n channel: { type: String as PropType<ColorPickerInputChannel> },\n },\n setup(props) {\n const ctx = useColorPickerContext()\n const channel = computed(() => colorPickerToInputChannel(props.channel))\n // 通道身份由本部件自己声明,不必嵌在通道滑杆内\n return () => h('input', ctx.api.value.getChannelInputProps({ channel: channel.value }) as Record<string, unknown>)\n },\n})\n\nexport const XhColorPickerEyeDropperTrigger = defineComponent({\n name: 'XhColorPickerEyeDropperTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('button', ctx.api.value.getEyeDropperTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 预设色板的挂载点,同时充当色板的根节点(role=radiogroup、方向键与 roving tabindex 都在它上面):\n * 其中放置的是 XhColorSwatchPickerItem,DOM 带 data-scope=\"color-swatch-picker\"。\n * 未写默认插槽时按 swatches 自动铺开格子。\n */\nexport const XhColorPickerSwatchPicker = defineComponent({\n name: 'XhColorPickerSwatchPicker',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n provideColorSwatchPicker(ctx.swatchPicker)\n return () => h(\n 'div',\n ctx.api.value.getSwatchPickerProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.swatchPicker.swatches.map(node => h(XhColorSwatchPickerItem, { key: node.value, value: node.value })),\n )\n },\n})\n\n/**\n * 最近使用色的挂载点,与预设色板同一套:其中放置的是 XhColorSwatchPickerItem。\n * 未写默认插槽时按 recentColors 自动铺开格子;还没有最近使用色时挂载点收起。\n */\nexport const XhColorPickerRecentSwatchPicker = defineComponent({\n name: 'XhColorPickerRecentSwatchPicker',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n provideColorSwatchPicker(ctx.recentSwatchPicker)\n return () => h(\n 'div',\n ctx.api.value.getRecentSwatchPickerProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.recentSwatchPicker.swatches.map(node => h(XhColorSwatchPickerItem, { key: node.value, value: node.value })),\n )\n },\n})\n\n/** 标签文字所在的块(tag 的 label)。 */\nexport const XhColorPickerTagLabel = defineComponent({\n name: 'XhColorPickerTagLabel',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('span', ctx.api.value.getTagLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签内容:只有文字时替它包一层 label;作者自己写了节点则原样放行。库自身填入的文字(+N)恒包 label。 */\nfunction tagChildren(content: VNode[] | string | undefined): VNode[] | string | undefined {\n if (typeof content === 'string')\n return [h(XhColorPickerTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhColorPickerTagLabel, null, () => content)] : content\n}\n\n/** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger,可及名使用 translations.deleteItem;点按摘掉所在标签的颜色,焦点不动。 */\nexport const XhColorPickerItemDeleteTrigger = defineComponent({\n name: 'XhColorPickerItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n const tag = useColorPickerTagContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 多选时一个选中颜色一个标签,即库内 tag 的 root(data-scope=\"tag\"),标签前由皮肤画一个色点。 */\nexport const XhColorPickerTag = defineComponent({\n name: 'XhColorPickerTag',\n props: {\n /** 它代表哪个选中颜色。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useColorPickerContext()\n provideColorPickerTag({ value: () => props.value })\n return () => h('span', ctx.api.value.getTagProps({ value: props.value }) as Record<string, unknown>, tagChildren(slots.default?.()))\n },\n})\n\n/** 折叠的标签合成的一个标签:有插槽时使用插槽,否则显示 +N。没有折叠的标签时连接层写 hidden。 */\nexport const XhColorPickerOverflowTag = defineComponent({\n name: 'XhColorPickerOverflowTag',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\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/**\n * 标签行:多选时放在盒里、触发钮之前;单选时连接层给 hidden。\n * 不写插槽即按 tags 铺出带删除钮的标签与 +N 那一枚,写了插槽由作者自己铺。\n */\nexport const XhColorPickerTagList = defineComponent({\n name: 'XhColorPickerTagList',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('span', ctx.api.value.getTagListProps() as Record<string, unknown>, slots.default\n ? slots.default()\n : [\n ...ctx.api.value.tags.map(tag => h(XhColorPickerTag, { key: tag.value, value: tag.value }, () => [\n h(XhColorPickerTagLabel, null, () => tag.label),\n h(XhColorPickerItemDeleteTrigger),\n ])),\n h(XhColorPickerOverflowTag),\n ])\n },\n})\n\n/** 「添加」:多选时把工作色收进值,浮层不收;单选时连接层给 hidden。文字由作者写。 */\nexport const XhColorPickerConfirmTrigger = defineComponent({\n name: 'XhColorPickerConfirmTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('button', ctx.api.value.getConfirmTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerHiddenInput = defineComponent({\n name: 'XhColorPickerHiddenInput',\n setup() {\n const ctx = useColorPickerContext()\n // 多选时一个选中值一份同名输入,表单按原生多值收;单选仍是一份\n return () => ctx.api.value.selectionMode === 'multiple'\n ? ctx.api.value.value.map(value => h('input', { key: value, ...ctx.api.value.getHiddenInputProps({ value }) as Record<string, unknown> }))\n : h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"color-picker.js","names":[],"sources":["../../../src/components/color-picker/color-picker.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// 提供 color picker 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size } from '@xihan-ui/core'\nimport type {\n ColorFormat,\n ColorPickerApi,\n ColorPickerInputChannel,\n ColorPickerSchema,\n ColorPickerSelectionMode,\n ColorPickerTranslations,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { colorPickerToInputChannel } from '@xihan-ui/headless'\nimport { computed, defineComponent, h, mergeProps } 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 { XhColorSliderControl, XhColorSliderThumb, XhColorSliderTrack } from '../color-slider/color-slider'\nimport { provideColorSlider } from '../color-slider/context'\nimport { XhColorSwatchPickerItem } from '../color-swatch-picker/color-swatch-picker'\nimport { provideColorSwatchPicker } from '../color-swatch-picker/context'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideColorPicker, provideColorPickerTag, useColorPickerContext, useColorPickerTagContext } from './context'\nimport { useColorPicker } from './use-color-picker'\n\ntype ColorPickerProps = ColorPickerSchema['props']\n\n/** 默认插槽的载荷:展开态、当前颜色的各种表示、预设色板、屏幕取色状态,以及修改展开与修改值两个动作。 */\nexport type ColorPickerRootSlotProps = Pick<\n ColorPickerApi,\n 'open' | 'value' | 'color' | 'canAdd' | 'rgba' | 'hsva' | 'swatches' | 'recentColors' | 'picking' | 'eyeDropperSupported' | 'errors' | 'setOpen' | 'setValue' | 'add' | 'clearError' | 'clearRecentColors'\n>\n\nexport const XhColorPickerRoot = defineComponent({\n name: 'XhColorPickerRoot',\n // 缺省值由 connect 与机器给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n /** 选中的颜色,值串数组;单选可写裸串。 */\n value: { type: [String, Array] as PropType<string | string[]> },\n defaultValue: { type: [String, Array] as PropType<string | string[]> },\n /** 选择模式,默认 single;multiple 时工作色是草稿、按「添加」收进值,色块点一下切换,输入行里排成标签。 */\n selectionMode: { type: String as PropType<ColorPickerSelectionMode> },\n /** multiple 下最多选几个颜色。 */\n maxSelected: { type: Number },\n /** 多选时输入行最多摆几枚标签,其余折进 +N 那一枚;默认 3。 */\n maxTagCount: { type: Number },\n format: { type: String as PropType<ColorFormat> },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n alpha: Boolean,\n swatches: { type: Array as PropType<string[]> },\n inline: Boolean,\n // 缺席值 undefined 表示非受控\n recentColors: { type: Array as PropType<string[]> },\n defaultRecentColors: { type: Array as PropType<string[]> },\n maxRecentColors: { type: Number },\n name: { type: String },\n size: { type: String as PropType<Size> },\n variant: { type: String as PropType<ControlVariant> },\n dir: { type: String as PropType<Direction> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n translations: { type: Object as PropType<Partial<ColorPickerTranslations>> },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<ColorPickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<ColorPickerProps, 'onOpenChange'>) => true,\n 'color-error': (_details: PayloadOf<ColorPickerProps, 'onColorError'>) => true,\n 'update:value': (_value: PayloadOf<ColorPickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<ColorPickerProps, 'onOpenChange'>['open']) => true,\n 'recent-colors-change': (_details: PayloadOf<ColorPickerProps, 'onRecentColorsChange'>) => true,\n 'update:recentColors': (_recentColors: PayloadOf<ColorPickerProps, 'onRecentColorsChange'>['recentColors']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: ColorPickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: ColorPickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: ColorPickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const notifyColorError: ColorPickerProps['onColorError'] = details => emit('color-error', details)\n const notifyRecent: ColorPickerProps['onRecentColorsChange'] = (details) => {\n emit('recent-colors-change', details)\n emit('update:recentColors', details.recentColors)\n }\n const ctx = useColorPicker(withXhConfig('color-picker', useFormControlProps(props)) as ColorPickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n onColorError: notifyColorError,\n onRecentColorsChange: notifyRecent,\n })\n provideColorPicker(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n color: ctx.api.value.color,\n canAdd: ctx.api.value.canAdd,\n rgba: ctx.api.value.rgba,\n hsva: ctx.api.value.hsva,\n swatches: ctx.api.value.swatches,\n recentColors: ctx.api.value.recentColors,\n picking: ctx.api.value.picking,\n eyeDropperSupported: ctx.api.value.eyeDropperSupported,\n errors: ctx.api.value.errors,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n add: ctx.api.value.add,\n clearError: ctx.api.value.clearError,\n clearRecentColors: ctx.api.value.clearRecentColors,\n }))\n },\n})\n\nexport const XhColorPickerLabel = defineComponent({\n name: 'XhColorPickerLabel',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerControl = defineComponent({\n name: 'XhColorPickerControl',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerTrigger = defineComponent({\n name: 'XhColorPickerTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 原生 button,激活交给平台;同时是浮层的定位锚点\n return () => h('button', {\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 XhColorPickerValueText = defineComponent({\n name: 'XhColorPickerValueText',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 有插槽用插槽,否则显示工作色的值串\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.color,\n )\n },\n})\n\nexport const XhColorPickerSwatch = defineComponent({\n name: 'XhColorPickerSwatch',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('span', ctx.api.value.getSwatchProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerPositioner = defineComponent({\n name: 'XhColorPickerPositioner',\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 = useColorPickerContext()\n // 面板的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner;条子走浮层 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value, props: { size: 'sm' } })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef, present: ctx.visible.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhColorPickerContent = defineComponent({\n name: 'XhColorPickerContent',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\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 XhColorPickerSaturationArea = defineComponent({\n name: 'XhColorPickerSaturationArea',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n // 区域节点交给机器,矩形在指针事件里现量\n return () => h('div', {\n ...ctx.api.value.getSaturationAreaProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.areaRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhColorPickerAreaThumb = defineComponent({\n name: 'XhColorPickerAreaThumb',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('div', ctx.api.value.getAreaThumbProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 色相滑块的挂载点,同时充当该滑块的根节点:其中放置的是 XhColorSlider* 普通部件\n * (control / track / thumb / label / value-text),DOM 带 data-scope=\"color-slider\"。\n * 未写默认插槽时铺开最简结构:一条轨道加一个拇指。\n */\nexport const XhColorPickerHueSlider = defineComponent({\n name: 'XhColorPickerHueSlider',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n provideColorSlider(ctx.hueSlider)\n return () => h('div', ctx.api.value.getHueSliderProps() as Record<string, unknown>, slots.default?.() ?? renderSliderTree())\n },\n})\n\n/** 透明度滑块的挂载点,同上;alpha 关闭时整条禁用。 */\nexport const XhColorPickerAlphaSlider = defineComponent({\n name: 'XhColorPickerAlphaSlider',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n provideColorSlider(ctx.alphaSlider)\n return () => h('div', ctx.api.value.getAlphaSliderProps() as Record<string, unknown>, slots.default?.() ?? renderSliderTree())\n },\n})\n\n/** 未写默认插槽时的滑块内部:control 中一条 track 与一个 thumb,与手写部件产出的 DOM 一致。 */\nfunction renderSliderTree(): VNode[] {\n return [h(XhColorSliderControl, null, () => [h(XhColorSliderTrack), h(XhColorSliderThumb)])]\n}\n\nexport const XhColorPickerChannelInput = defineComponent({\n name: 'XhColorPickerChannelInput',\n props: {\n /** 该输入框编辑的通道:hex 是整串,r/g/b 是分量,a 是透明度百分数;默认或无法识别时按 hex 处理。 */\n channel: { type: String as PropType<ColorPickerInputChannel> },\n },\n setup(props) {\n const ctx = useColorPickerContext()\n const channel = computed(() => colorPickerToInputChannel(props.channel))\n // 通道身份由本部件自己声明,不必嵌在通道滑杆内\n return () => h('input', ctx.api.value.getChannelInputProps({ channel: channel.value }) as Record<string, unknown>)\n },\n})\n\nexport const XhColorPickerEyeDropperTrigger = defineComponent({\n name: 'XhColorPickerEyeDropperTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('button', ctx.api.value.getEyeDropperTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 预设色板的挂载点,同时充当色板的根节点(role=radiogroup、方向键与 roving tabindex 都在它上面):\n * 其中放置的是 XhColorSwatchPickerItem,DOM 带 data-scope=\"color-swatch-picker\"。\n * 未写默认插槽时按 swatches 自动铺开格子。\n */\nexport const XhColorPickerSwatchPicker = defineComponent({\n name: 'XhColorPickerSwatchPicker',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n provideColorSwatchPicker(ctx.swatchPicker)\n return () => h(\n 'div',\n ctx.api.value.getSwatchPickerProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.swatchPicker.swatches.map(node => h(XhColorSwatchPickerItem, { key: node.value, value: node.value })),\n )\n },\n})\n\n/**\n * 最近使用色的挂载点,与预设色板同一套:其中放置的是 XhColorSwatchPickerItem。\n * 未写默认插槽时按 recentColors 自动铺开格子;还没有最近使用色时挂载点收起。\n */\nexport const XhColorPickerRecentSwatchPicker = defineComponent({\n name: 'XhColorPickerRecentSwatchPicker',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n provideColorSwatchPicker(ctx.recentSwatchPicker)\n return () => h(\n 'div',\n ctx.api.value.getRecentSwatchPickerProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.recentSwatchPicker.swatches.map(node => h(XhColorSwatchPickerItem, { key: node.value, value: node.value })),\n )\n },\n})\n\n/** 标签文字所在的块(tag 的 label)。 */\nexport const XhColorPickerTagLabel = defineComponent({\n name: 'XhColorPickerTagLabel',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('span', ctx.api.value.getTagLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签内容:只有文字时替它包一层 label;作者自己写了节点则原样放行。库自身填入的文字(+N)恒包 label。 */\nfunction tagChildren(content: VNode[] | string | undefined): VNode[] | string | undefined {\n if (typeof content === 'string')\n return [h(XhColorPickerTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhColorPickerTagLabel, null, () => content)] : content\n}\n\n/** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger,可及名使用 translations.deleteItem;点按摘掉所在标签的颜色,焦点不动。 */\nexport const XhColorPickerItemDeleteTrigger = defineComponent({\n name: 'XhColorPickerItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n const tag = useColorPickerTagContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 多选时一个选中颜色一个标签,即库内 tag 的 root(data-scope=\"tag\"),标签前由皮肤画一个色点。 */\nexport const XhColorPickerTag = defineComponent({\n name: 'XhColorPickerTag',\n props: {\n /** 它代表哪个选中颜色。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useColorPickerContext()\n provideColorPickerTag({ value: () => props.value })\n return () => h('span', ctx.api.value.getTagProps({ value: props.value }) as Record<string, unknown>, tagChildren(slots.default?.()))\n },\n})\n\n/** 折叠的标签合成的一个标签:有插槽时使用插槽,否则显示 +N。没有折叠的标签时连接层写 hidden。 */\nexport const XhColorPickerOverflowTag = defineComponent({\n name: 'XhColorPickerOverflowTag',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\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/**\n * 标签行:多选时放在盒里、触发钮之前;单选时连接层给 hidden。\n * 不写插槽即按 tags 铺出带删除钮的标签与 +N 那一枚,写了插槽由作者自己铺。\n */\nexport const XhColorPickerTagList = defineComponent({\n name: 'XhColorPickerTagList',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('span', ctx.api.value.getTagListProps() as Record<string, unknown>, slots.default\n ? slots.default()\n : [\n ...ctx.api.value.tags.map(tag => h(XhColorPickerTag, { key: tag.value, value: tag.value }, () => [\n h(XhColorPickerTagLabel, null, () => tag.label),\n h(XhColorPickerItemDeleteTrigger),\n ])),\n h(XhColorPickerOverflowTag),\n ])\n },\n})\n\n/** 「添加」:多选时把工作色收进值,浮层不收;单选时连接层给 hidden。文字由作者写。 */\nexport const XhColorPickerConfirmTrigger = defineComponent({\n name: 'XhColorPickerConfirmTrigger',\n setup(_, { slots }) {\n const ctx = useColorPickerContext()\n return () => h('button', ctx.api.value.getConfirmTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhColorPickerHiddenInput = defineComponent({\n name: 'XhColorPickerHiddenInput',\n setup() {\n const ctx = useColorPickerContext()\n // 多选时一个选中值一份同名输入,表单按原生多值收;单选仍是一份\n return () => ctx.api.value.selectionMode === 'multiple'\n ? ctx.api.value.value.map(value => h('input', { key: value, ...ctx.api.value.getHiddenInputProps({ value }) as Record<string, unknown> }))\n : h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
@@ -241,7 +241,8 @@ container: { type: Object } },
241
241
  });
242
242
  return () => h(XhPortal, {
243
243
  to: props.container ?? ctx.portalTarget.value,
244
- source: ctx.controlRef
244
+ source: ctx.controlRef,
245
+ present: ctx.visible.value
245
246
  }, () => [h("div", {
246
247
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
247
248
  ref: (el) => {
@@ -358,8 +359,7 @@ const XhComboboxHiddenInput = defineComponent({
358
359
  setup(_, { attrs }) {
359
360
  const ctx = useComboboxContext();
360
361
  return () => ctx.api.value.value.map((value) => h("input", {
361
- ...ctx.api.value.getHiddenInputProps({ value }),
362
- ...attrs,
362
+ ...mergeProps(ctx.api.value.getHiddenInputProps({ value }), attrs),
363
363
  key: value
364
364
  }));
365
365
  }