@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.
- package/CHANGELOG.md +160 -0
- package/dist/components/carousel/carousel.d.ts +7 -1
- package/dist/components/carousel/carousel.d.ts.map +1 -1
- package/dist/components/carousel/carousel.js +1 -0
- package/dist/components/carousel/carousel.js.map +1 -1
- package/dist/components/cartesian-chart/cartesian-chart.d.ts.map +1 -1
- package/dist/components/cartesian-chart/cartesian-chart.js +2 -2
- package/dist/components/cartesian-chart/cartesian-chart.js.map +1 -1
- package/dist/components/cascader/cascader.js +2 -1
- package/dist/components/cascader/cascader.js.map +1 -1
- package/dist/components/citation/citation.d.ts.map +1 -1
- package/dist/components/citation/citation.js +8 -6
- package/dist/components/citation/citation.js.map +1 -1
- package/dist/components/color-picker/color-picker.js +2 -1
- package/dist/components/color-picker/color-picker.js.map +1 -1
- package/dist/components/combobox/combobox.js +3 -3
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/command/command.d.ts +3 -3
- package/dist/components/context-menu/context-menu.js +2 -1
- package/dist/components/context-menu/context-menu.js.map +1 -1
- package/dist/components/date-picker/date-picker.d.ts +4 -1
- package/dist/components/date-picker/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker/date-picker.js +9 -1
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.d.ts +4 -1
- package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js +9 -1
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/dialog/dialog.d.ts +12 -1
- package/dist/components/dialog/dialog.d.ts.map +1 -1
- package/dist/components/dialog/dialog.js +14 -4
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.d.ts +12 -1
- package/dist/components/drawer/drawer.d.ts.map +1 -1
- package/dist/components/drawer/drawer.js +14 -4
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/fieldset/context.d.ts +1 -0
- package/dist/components/fieldset/context.d.ts.map +1 -1
- package/dist/components/fieldset/context.js +9 -1
- package/dist/components/fieldset/context.js.map +1 -1
- package/dist/components/fieldset/fieldset.d.ts.map +1 -1
- package/dist/components/fieldset/fieldset.js +8 -3
- package/dist/components/fieldset/fieldset.js.map +1 -1
- package/dist/components/floating-panel/floating-panel.js +4 -1
- package/dist/components/floating-panel/floating-panel.js.map +1 -1
- package/dist/components/form/form.d.ts +8 -0
- package/dist/components/form/form.d.ts.map +1 -1
- package/dist/components/form/form.js +4 -1
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/funnel-chart/funnel-chart.d.ts.map +1 -1
- package/dist/components/funnel-chart/funnel-chart.js +2 -2
- package/dist/components/funnel-chart/funnel-chart.js.map +1 -1
- package/dist/components/graph-chart/graph-chart.d.ts.map +1 -1
- package/dist/components/graph-chart/graph-chart.js +2 -2
- package/dist/components/graph-chart/graph-chart.js.map +1 -1
- package/dist/components/hierarchy-chart/hierarchy-chart.d.ts.map +1 -1
- package/dist/components/hierarchy-chart/hierarchy-chart.js +2 -2
- package/dist/components/hierarchy-chart/hierarchy-chart.js.map +1 -1
- package/dist/components/hover-card/hover-card.js +2 -1
- package/dist/components/hover-card/hover-card.js.map +1 -1
- package/dist/components/image-viewer/image-viewer.d.ts +7 -1
- package/dist/components/image-viewer/image-viewer.d.ts.map +1 -1
- package/dist/components/image-viewer/image-viewer.js +1 -0
- package/dist/components/image-viewer/image-viewer.js.map +1 -1
- package/dist/components/mention/mention.d.ts +1 -1
- package/dist/components/mention/mention.js +5 -4
- package/dist/components/mention/mention.js.map +1 -1
- package/dist/components/menu/menu.js +2 -1
- package/dist/components/menu/menu.js.map +1 -1
- package/dist/components/menubar/context.d.ts.map +1 -1
- package/dist/components/menubar/context.js.map +1 -1
- package/dist/components/menubar/menubar.d.ts.map +1 -1
- package/dist/components/menubar/menubar.js +16 -2
- package/dist/components/menubar/menubar.js.map +1 -1
- package/dist/components/pagination/pagination.js +4 -2
- package/dist/components/pagination/pagination.js.map +1 -1
- package/dist/components/pie-chart/pie-chart.d.ts.map +1 -1
- package/dist/components/pie-chart/pie-chart.js +2 -2
- package/dist/components/pie-chart/pie-chart.js.map +1 -1
- package/dist/components/popconfirm/popconfirm.js +2 -1
- package/dist/components/popconfirm/popconfirm.js.map +1 -1
- package/dist/components/popover/popover.d.ts +1 -1
- package/dist/components/popover/popover.js +2 -1
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/radar-chart/radar-chart.d.ts.map +1 -1
- package/dist/components/radar-chart/radar-chart.js +2 -2
- package/dist/components/radar-chart/radar-chart.js.map +1 -1
- package/dist/components/sankey-chart/sankey-chart.d.ts.map +1 -1
- package/dist/components/sankey-chart/sankey-chart.js +2 -2
- package/dist/components/sankey-chart/sankey-chart.js.map +1 -1
- package/dist/components/select/select.d.ts +11 -0
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/select/select.js +12 -3
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/side-nav/side-nav.d.ts.map +1 -1
- package/dist/components/side-nav/side-nav.js +8 -2
- package/dist/components/side-nav/side-nav.js.map +1 -1
- package/dist/components/spinner/spinner.d.ts +9 -1
- package/dist/components/spinner/spinner.d.ts.map +1 -1
- package/dist/components/spinner/spinner.js +2 -0
- package/dist/components/spinner/spinner.js.map +1 -1
- package/dist/components/time-picker/time-picker.d.ts +4 -1
- package/dist/components/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/time-picker/time-picker.js +10 -2
- package/dist/components/time-picker/time-picker.js.map +1 -1
- package/dist/components/time-range-picker/time-range-picker.js +2 -1
- package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
- package/dist/components/tooltip/tooltip.js +2 -1
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/components/tour/tour.js +12 -3
- package/dist/components/tour/tour.js.map +1 -1
- package/dist/components/tree-select/tree-select.js +3 -3
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/config/config.js +1 -0
- package/dist/config/config.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/locale.d.ts +2 -0
- package/dist/locale.js +2 -0
- package/dist/package.js +1 -1
- package/dist/runtime/as-child.js +7 -2
- package/dist/runtime/as-child.js.map +1 -1
- package/dist/runtime/portal.js +11 -1
- package/dist/runtime/portal.js.map +1 -1
- package/dist/runtime/use-overlay-exit.js +6 -1
- package/dist/runtime/use-overlay-exit.js.map +1 -1
- package/dist/services/dialog-service.d.ts +3 -3
- package/dist/services/dialog-service.d.ts.map +1 -1
- package/dist/services/dialog-service.js +8 -6
- package/dist/services/dialog-service.js.map +1 -1
- package/dist/services/service-config.js +2 -1
- package/dist/services/service-config.js.map +1 -1
- package/package.json +19 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-picker.js","names":[],"sources":["../../../src/components/time-picker/time-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// 提供 time picker 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n TimeGranularity,\n TimeHourCycle,\n TimePickerApi,\n TimePickerColumn,\n TimePickerColumnUnit,\n TimePickerPreset,\n TimePickerPresetState,\n TimePickerSchema,\n TimePickerSelectionMode,\n TimeSegmentType,\n TimeStep,\n TimeUnavailablePredicate,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, mergeProps, onUpdated, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotIsPlainText, slotPaints } 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 {\n provideTimePicker,\n provideTimePickerColumn,\n provideTimePickerTag,\n useTimePickerColumnContext,\n useTimePickerContext,\n useTimePickerTagContext,\n} from './context'\nimport { useTimePicker } from './use-time-picker'\n\ntype TimePickerProps = TimePickerSchema['props']\n\n/** 默认插槽的载荷:浮层开合与当前值、值状态标志、当前的段与列,以及开合、写值、清空的动作。 */\nexport type TimePickerRootSlotProps = Pick<\n TimePickerApi,\n | 'open'\n | 'value'\n | 'empty'\n | 'outOfRange'\n | 'segments'\n | 'columns'\n | 'canClear'\n | 'canAdd'\n | 'setOpen'\n | 'setValue'\n | 'clear'\n | 'add'\n>\n\n/** 默认插槽的载荷:该列当前的可选值。 */\nexport interface TimePickerColumnSlotProps {\n options: TimePickerColumn['options']\n}\n\n/** 快捷选项列默认插槽的载荷:逐条的投影,作者据此自行铺设条目。 */\nexport interface TimePickerPresetsSlotProps {\n presets: readonly TimePickerPresetState[]\n}\n\nexport const XhTimePickerRoot = defineComponent({\n name: 'XhTimePickerRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n /** 选中的时刻,ISO 时间串数组;单选可写裸串。 */\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<TimePickerSelectionMode> },\n /** multiple 下最多选几个时刻。 */\n maxSelected: { type: Number },\n /** 多选时输入行最多摆几枚标签,其余折进 +N 那一枚;默认 3。 */\n maxTagCount: { type: Number },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n min: { type: String },\n max: { type: String },\n locale: { type: String },\n hourCycle: { type: Number as PropType<TimeHourCycle> },\n granularity: { type: String as PropType<TimeGranularity> },\n /** 按单位的步进:`{ hour?, minute?, second? }`,各单位缺省 1。 */\n timeStep: { type: Object as PropType<TimeStep> },\n /** 快捷选项;提供后浮层中多出一列,时刻要在自己的 computed 中计算后再传入。 */\n presets: { type: Array as PropType<TimePickerPreset[]> },\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<TimePickerProps['translations']> },\n /** 逐格可选性:时列按 24 小时制给值,第三个参数带已选的时与分。 */\n isTimeUnavailable: { type: Function as PropType<TimeUnavailablePredicate> },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<TimePickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<TimePickerProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<TimePickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<TimePickerProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TimePickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: TimePickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: TimePickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useTimePicker(withHandlers(withXhConfig('time-picker', useFormControlProps(props)), { onClear: () => emit('clear') }) as TimePickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideTimePicker(ctx)\n\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 empty: ctx.api.value.empty,\n outOfRange: ctx.api.value.outOfRange,\n segments: ctx.api.value.segments,\n columns: ctx.api.value.columns,\n canClear: ctx.api.value.canClear,\n canAdd: ctx.api.value.canAdd,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n add: ctx.api.value.add,\n }))\n },\n})\n\nexport const XhTimePickerLabel = defineComponent({\n name: 'XhTimePickerLabel',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n // 仍用原生 label 保持表单语义,点标题聚焦第一段由连接层的 click 接管\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerControl = defineComponent({\n name: 'XhTimePickerControl',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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\n/** 标签文字所在的块(tag 的 label)。 */\nexport const XhTimePickerTagLabel = defineComponent({\n name: 'XhTimePickerTagLabel',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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(XhTimePickerTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhTimePickerTagLabel, null, () => content)] : content\n}\n\n/** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger,可及名使用 translations.deleteItem;点按摘掉所在标签的选中值,焦点不动。 */\nexport const XhTimePickerItemDeleteTrigger = defineComponent({\n name: 'XhTimePickerItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n const tag = useTimePickerTagContext()\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 XhTimePickerTag = defineComponent({\n name: 'XhTimePickerTag',\n props: {\n /** 它代表哪个选中值。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n provideTimePickerTag({ 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 XhTimePickerOverflowTag = defineComponent({\n name: 'XhTimePickerOverflowTag',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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 XhTimePickerTagList = defineComponent({\n name: 'XhTimePickerTagList',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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(XhTimePickerTag, { key: tag.value, value: tag.value }, () => [\n h(XhTimePickerTagLabel, null, () => tag.label),\n h(XhTimePickerItemDeleteTrigger),\n ])),\n h(XhTimePickerOverflowTag),\n ])\n },\n})\n\nexport const XhTimePickerSegmentGroup = defineComponent({\n name: 'XhTimePickerSegmentGroup',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('div', ctx.api.value.getSegmentGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerSegment = defineComponent({\n name: 'XhTimePickerSegment',\n props: {\n // 段的身份由作者声明\n segment: { type: String as PropType<TimeSegmentType>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n // 有插槽用插槽,否则显示该段的文字,空段为占位串\n return () => h(\n 'span',\n ctx.api.value.getSegmentProps({ segment: props.segment }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getSegmentText({ segment: props.segment }),\n )\n },\n})\n\nexport const XhTimePickerTrigger = defineComponent({\n name: 'XhTimePickerTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTimePickerContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n // 归还焦点要落到它身上:锚点取的是整个输入行,那一层不可聚焦\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhTimePickerClearTrigger = defineComponent({\n name: 'XhTimePickerClearTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerPositioner = defineComponent({\n name: 'XhTimePickerPositioner',\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 = useTimePickerContext()\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.controlRef }, () => [\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?.()),\n ])\n },\n})\n\nexport const XhTimePickerContent = defineComponent({\n name: 'XhTimePickerContent',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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 XhTimePickerPresetGroup = defineComponent({\n name: 'XhTimePickerPresetGroup',\n slots: Object as SlotsType<{\n /** 自行铺设条目;未写时按 presets 数据自动铺设,两者产出的 DOM 一致。 */\n default?: (props: TimePickerPresetsSlotProps) => VNode[]\n }>,\n // 根是片段(选项列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTimePickerContext()\n const presetGroupRef = ref<HTMLElement | null>(null)\n // 快捷选项列定高自己竖滚:条子贴在它的盒子上、紧跟在它后面(浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => presetGroupRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n onUpdated(() => bars.measure())\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.({ presets: api.presets })\n return [\n h(\n 'div',\n {\n ...mergeProps(api.getPresetGroupProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { presetGroupRef.value = el as HTMLElement },\n },\n slotPaints(authored)\n ? authored\n : api.presets.map(preset => h(\n 'div',\n { ...api.getPresetProps({ value: preset.value }) as Record<string, unknown>, key: preset.value },\n preset.label,\n )),\n ),\n ...bars.render(),\n ]\n }\n },\n})\n\nexport const XhTimePickerPreset = defineComponent({\n name: 'XhTimePickerPreset',\n props: {\n /** 该条目的身份,与 presets 数据中的 value 逐字对应。 */\n value: { type: String, required: true },\n },\n slots: Object as SlotsType<{\n /** 条目内容;未写时使用数据中的 label。 */\n default?: () => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.()\n return h(\n 'div',\n api.getPresetProps({ value: props.value }) as Record<string, unknown>,\n slotPaints(authored) ? authored : api.presets.find(p => p.value === props.value)?.label,\n )\n }\n },\n})\n\nexport const XhTimePickerColumn = defineComponent({\n name: 'XhTimePickerColumn',\n props: {\n unit: { type: String as PropType<TimePickerColumnUnit>, required: true },\n },\n slots: Object as SlotsType<{\n default?: (props: TimePickerColumnSlotProps) => VNode[]\n }>,\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useTimePickerContext()\n const unit = computed(() => props.unit)\n // 下传单位,供列内选项取到自己归哪一列\n provideTimePickerColumn({ unit })\n const columnRef = ref<HTMLElement | null>(null)\n // 定高的时间列自己竖滚:条子贴在本列的盒子上、紧跟在它后面(浮层 4px 档)\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 onUpdated(() => bars.measure())\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ unit: props.unit }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n slots.default?.({ options: ctx.api.value.columns.find(c => c.unit === props.unit)?.options ?? [] }),\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhTimePickerItem = defineComponent({\n name: 'XhTimePickerItem',\n props: {\n /** 两位补零的显示串('09' / '30');上下午列写 '00' / '01'。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n const { unit } = useTimePickerColumnContext()\n // 有插槽用插槽,否则显示这一格该显示的文字(上下午列按 locale 译成「上午 / 下午」)\n return () => h(\n 'div',\n ctx.api.value.getItemProps({ unit: unit.value, value: props.value }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getItemText({ unit: unit.value, value: props.value }),\n )\n },\n})\n\n/** 「添加」:多选时把浮层里拼好的草稿收进值,浮层不收;单选时连接层给 hidden。文字由作者写。 */\nexport const XhTimePickerConfirmTrigger = defineComponent({\n name: 'XhTimePickerConfirmTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('button', ctx.api.value.getConfirmTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerHiddenInput = defineComponent({\n name: 'XhTimePickerHiddenInput',\n setup() {\n const ctx = useTimePickerContext()\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":";;;;;;;;;;;AAuEA,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CAEN,OAAO;;EAEL,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,EAAiC;EAC9D,cAAc,EAAE,MAAM,CAAC,QAAQ,KAAK,EAAiC;;EAErE,eAAe,EAAE,MAAM,OAA4C;;EAEnE,aAAa,EAAE,MAAM,OAAO;;EAE5B,aAAa,EAAE,MAAM,OAAO;EAC5B,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;EACb,KAAK,EAAE,MAAM,OAAO;EACpB,KAAK,EAAE,MAAM,OAAO;EACpB,QAAQ,EAAE,MAAM,OAAO;EACvB,WAAW,EAAE,MAAM,OAAkC;EACrD,aAAa,EAAE,MAAM,OAAoC;;EAEzD,UAAU,EAAE,MAAM,OAA6B;;EAE/C,SAAS,EAAE,MAAM,MAAsC;EACvD,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,cAAc,EAAE,MAAM,OAAoD;;EAE1E,mBAAmB,EAAE,MAAM,SAA+C;EAC1E,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,SAAS;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC7C,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,MAAM,EAAE,MAAM,OAAO;EACrB,SAAS,EAAE,MAAM,OAAmC;EACpD,MAAM,EAAE,MAAM,OAAyB;EACvC,MAAM,EAAE,MAAM,OAAyB;EACvC,WAAW,EAAE,MAAM,OAA8B;EACjD,QAAQ,EAAE,MAAM,OAAO;;EAEvB,KAAK,EAAE,MAAM,OAA8B;CAC7C;CAEA,OAAO;EACL,eAAe;EACf,iBAAiB,aAA0D;EAC3E,gBAAgB,aAAyD;EACzE,iBAAiB,WAAiE;EAClF,gBAAgB,UAA8D;CAChF;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,eAAiD,YAAY;GACjE,KAAK,gBAAgB,OAAO;GAC5B,KAAK,gBAAgB,QAAQ,KAAK;EACpC;EACA,MAAM,cAA+C,YAAY;GAC/D,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,MAAM,cAAc,aAAa,aAAa,eAAe,oBAAoB,KAAK,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,EAAE,CAAC,GAAsB;GACpJ,eAAe;GACf,cAAc;EAChB,CAAC;EACD,kBAAkB,GAAG;EAErB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,MAAM,IAAI,IAAI,MAAM;GACpB,OAAO,IAAI,IAAI,MAAM;GACrB,OAAO,IAAI,IAAI,MAAM;GACrB,YAAY,IAAI,IAAI,MAAM;GAC1B,UAAU,IAAI,IAAI,MAAM;GACxB,SAAS,IAAI,IAAI,MAAM;GACvB,UAAU,IAAI,IAAI,MAAM;GACxB,QAAQ,IAAI,IAAI,MAAM;GACtB,SAAS,IAAI,IAAI,MAAM;GACvB,UAAU,IAAI,IAAI,MAAM;GACxB,OAAO,IAAI,IAAI,MAAM;GACrB,KAAK,IAAI,IAAI,MAAM;EACrB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EAEjC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,gBAAgB;GACjC,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;;AAGD,MAAa,uBAAuB,gBAAgB;CAClD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,iBAAiB,GAA8B,MAAM,UAAU,CAAC;CACvG;AACF,CAAC;;AAGD,SAAS,YAAY,SAAqE;CACxF,IAAI,OAAO,YAAY,UACrB,OAAO,CAAC,EAAE,sBAAsB,YAAY,OAAO,CAAC;CACtD,OAAO,gBAAgB,OAAO,IAAI,CAAC,EAAE,sBAAsB,YAAY,OAAO,CAAC,IAAI;AACrF;;AAGA,MAAa,gCAAgC,gBAAgB;CAC3D,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,MAAM,MAAM,wBAAwB;EACpC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,0BAA0B,EAAE,OAAO,IAAI,MAAM,EAAE,CAAC,GAA8B,MAAM,UAAU,CAAC;CACxI;AACF,CAAC;;AAGD,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CACN,OAAO;;AAEL,OAAO;EAAE,MAAM;EAAQ,UAAU;CAAK,EACxC;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,qBAAqB;EACjC,qBAAqB,EAAE,aAAa,MAAM,MAAM,CAAC;EACjD,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,YAAY,EAAE,OAAO,MAAM,MAAM,CAAC,GAA8B,YAAY,MAAM,UAAU,CAAC,CAAC;CACrI;AACF,CAAC;;AAGD,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EACX,QACA,IAAI,IAAI,MAAM,oBAAoB,GAClC,YAAY,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,YAAY,CAC7D;CACF;AACF,CAAC;;;;;AAMD,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,gBAAgB,GAA8B,MAAM,UACrF,MAAM,QAAQ,IACd,CACE,GAAG,IAAI,IAAI,MAAM,KAAK,KAAI,QAAO,EAAE,iBAAiB;GAAE,KAAK,IAAI;GAAO,OAAO,IAAI;EAAM,SAAS,CAC9F,EAAE,sBAAsB,YAAY,IAAI,KAAK,GAC7C,EAAE,6BAA6B,CACjC,CAAC,CAAC,GACF,EAAE,uBAAuB,CAC3B,CAAC;CACP;AACF,CAAC;AAED,MAAa,2BAA2B,gBAAgB;CACtD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC1G;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,OAAO,EAEL,SAAS;EAAE,MAAM;EAAqC,UAAU;CAAK,EACvE;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,qBAAqB;EAEjC,aAAa,EACX,QACA,IAAI,IAAI,MAAM,gBAAgB,EAAE,SAAS,MAAM,QAAQ,CAAC,GACxD,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,eAAe,EAAE,SAAS,MAAM,QAAQ,CAAC,CAC9E;CACF;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAElB,MAAM,cAAc,oBAAoB;EAExC,MAAM,aAAa,oBAAoB;EACvC,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,UAAU,WAAW,MAAM;GACxC,GAAG,YAAY;GACf,GAAG,IAAI,IAAI,MAAM,gBAAgB;GAEjC,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,CAAC,GAAG,MAAM,UAAU,CAAC;CACvB;AACF,CAAC;AAED,MAAa,2BAA2B,gBAAgB;CACtD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC7G;AACF,CAAC;AAED,MAAa,yBAAyB,gBAAgB;CACpD,MAAM;CACN,OAAO;;AAEL,WAAW,EAAE,MAAM,OAA4B,EACjD;CAEA,cAAc;CACd,MAAM,OAAO,EAAE,OAAO,SAAS;EAC7B,MAAM,MAAM,qBAAqB;EAEjC,aAAa,EAAE,UAAU;GAAE,IAAI,MAAM,aAAa,IAAI,aAAa;GAAO,QAAQ,IAAI;EAAW,SAAS,CACxG,EAAE,OAAO;GACP,GAAG,WAAW,IAAI,IAAI,MAAM,mBAAmB,GAA8B,KAAK;GAClF,MAAM,OAAgB;IAAE,IAAI,cAAc,QAAQ;GAAkB;EACtE,GAAG,MAAM,UAAU,CAAC,CACtB,CAAC;CACH;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,gBAAgB;GAGjC,OAAO,IAAI,QAAQ,QAAQ,KAAA,IAAY,EAAE,SAAS,OAAO;GACzD,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,OAAO;CAKP,cAAc;CACd,MAAM,GAAG,EAAE,OAAO,SAAS;EACzB,MAAM,MAAM,qBAAqB;EACjC,MAAM,iBAAiB,IAAwB,IAAI;EAEnD,MAAM,OAAO,cAAc;GACzB,kBAAkB,eAAe;GACjC,QAAQ;GACR,cAAc;IAAE,KAAM,IAAI,IAAI,MAAM,mBAAmB,CAAC,CAAyB;IAAK,MAAM;GAAK;EACnG,CAAC;EACD,gBAAgB,KAAK,QAAQ,CAAC;EAC9B,aAAa;GACX,MAAM,MAAM,IAAI,IAAI;GACpB,MAAM,WAAW,MAAM,UAAU,EAAE,SAAS,IAAI,QAAQ,CAAC;GACzD,OAAO,CACL,EACE,OACA;IACE,GAAG,WAAW,IAAI,oBAAoB,GAA8B,KAAK;IACzE,MAAM,OAAgB;KAAE,eAAe,QAAQ;IAAkB;GACnE,GACA,WAAW,QAAQ,IACf,WACA,IAAI,QAAQ,KAAI,WAAU,EACxB,OACA;IAAE,GAAG,IAAI,eAAe,EAAE,OAAO,OAAO,MAAM,CAAC;IAA8B,KAAK,OAAO;GAAM,GAC/F,OAAO,KACT,CAAC,CACP,GACA,GAAG,KAAK,OAAO,CACjB;EACF;CACF;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,OAAO;;AAEL,OAAO;EAAE,MAAM;EAAQ,UAAU;CAAK,EACxC;CACA,OAAO;CAIP,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,qBAAqB;EACjC,aAAa;GACX,MAAM,MAAM,IAAI,IAAI;GACpB,MAAM,WAAW,MAAM,UAAU;GACjC,OAAO,EACL,OACA,IAAI,eAAe,EAAE,OAAO,MAAM,MAAM,CAAC,GACzC,WAAW,QAAQ,IAAI,WAAW,IAAI,QAAQ,MAAK,MAAK,EAAE,UAAU,MAAM,KAAK,CAAC,EAAE,KACpF;EACF;CACF;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,OAAO,EACL,MAAM;EAAE,MAAM;EAA0C,UAAU;CAAK,EACzE;CACA,OAAO;CAIP,cAAc;CACd,MAAM,OAAO,EAAE,OAAO,SAAS;EAC7B,MAAM,MAAM,qBAAqB;EAGjC,wBAAwB,EAAE,MAFb,eAAe,MAAM,IAEL,EAAE,CAAC;EAChC,MAAM,YAAY,IAAwB,IAAI;EAE9C,MAAM,OAAO,cAAc;GACzB,kBAAkB,UAAU;GAC5B,QAAQ;GACR,cAAc;IAAE,KAAM,IAAI,IAAI,MAAM,mBAAmB,CAAC,CAAyB;IAAK,MAAM;GAAK;EACnG,CAAC;EACD,gBAAgB,KAAK,QAAQ,CAAC;EAC9B,aAAa,CACX,EACE,OACA;GACE,GAAG,WAAW,IAAI,IAAI,MAAM,eAAe,EAAE,MAAM,MAAM,KAAK,CAAC,GAA8B,KAAK;GAClG,MAAM,OAAgB;IAAE,UAAU,QAAQ;GAAkB;EAC9D,GACA,MAAM,UAAU,EAAE,SAAS,IAAI,IAAI,MAAM,QAAQ,MAAK,MAAK,EAAE,SAAS,MAAM,IAAI,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CACpG,GACA,GAAG,KAAK,OAAO,CACjB;CACF;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,OAAO;;AAEL,OAAO;EAAE,MAAM;EAAQ,UAAU;CAAK,EACxC;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,qBAAqB;EACjC,MAAM,EAAE,SAAS,2BAA2B;EAE5C,aAAa,EACX,OACA,IAAI,IAAI,MAAM,aAAa;GAAE,MAAM,KAAK;GAAO,OAAO,MAAM;EAAM,CAAC,GACnE,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,YAAY;GAAE,MAAM,KAAK;GAAO,OAAO,MAAM;EAAM,CAAC,CACzF;CACF;AACF,CAAC;;AAGD,MAAa,6BAA6B,gBAAgB;CACxD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,qBAAqB;EACjC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,uBAAuB,GAA8B,MAAM,UAAU,CAAC;CAC/G;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,qBAAqB;EAEjC,aAAa,IAAI,IAAI,MAAM,kBAAkB,aACzC,IAAI,IAAI,MAAM,MAAM,KAAI,UAAS,EAAE,SAAS;GAAE,KAAK;GAAO,GAAG,IAAI,IAAI,MAAM,oBAAoB,EAAE,MAAM,CAAC;EAA6B,CAAC,CAAC,IACvI,EAAE,SAAS,IAAI,IAAI,MAAM,oBAAoB,CAA4B;CAC/E;AACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"time-picker.js","names":[],"sources":["../../../src/components/time-picker/time-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// 提供 time picker 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n TimeGranularity,\n TimeHourCycle,\n TimePickerApi,\n TimePickerColumn,\n TimePickerColumnUnit,\n TimePickerPreset,\n TimePickerPresetState,\n TimePickerSchema,\n TimePickerSelectionMode,\n TimeSegmentType,\n TimeStep,\n TimeUnavailablePredicate,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, mergeProps, onUpdated, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotIsPlainText, slotPaints } 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 {\n provideTimePicker,\n provideTimePickerColumn,\n provideTimePickerTag,\n useTimePickerColumnContext,\n useTimePickerContext,\n useTimePickerTagContext,\n} from './context'\nimport { useTimePicker } from './use-time-picker'\n\ntype TimePickerProps = TimePickerSchema['props']\n\n/** 默认插槽的载荷:浮层开合与当前值、值状态标志、当前的段与列,以及开合、写值、清空的动作。 */\nexport type TimePickerRootSlotProps = Pick<\n TimePickerApi,\n | 'open'\n | 'value'\n | 'empty'\n | 'outOfRange'\n | 'segments'\n | 'columns'\n | 'canClear'\n | 'canAdd'\n | 'setOpen'\n | 'setValue'\n | 'clear'\n | 'add'\n>\n\n/** 默认插槽的载荷:该列当前的可选值。 */\nexport interface TimePickerColumnSlotProps {\n options: TimePickerColumn['options']\n}\n\n/** 快捷选项列默认插槽的载荷:逐条的投影,作者据此自行铺设条目。 */\nexport interface TimePickerPresetsSlotProps {\n presets: readonly TimePickerPresetState[]\n}\n\nexport const XhTimePickerRoot = defineComponent({\n name: 'XhTimePickerRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n /** 选中的时刻,ISO 时间串数组;单选可写裸串。 */\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<TimePickerSelectionMode> },\n /** multiple 下最多选几个时刻。 */\n maxSelected: { type: Number },\n /** 多选时输入行最多摆几枚标签,其余折进 +N 那一枚;默认 3。 */\n maxTagCount: { type: Number },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n min: { type: String },\n max: { type: String },\n locale: { type: String },\n hourCycle: { type: Number as PropType<TimeHourCycle> },\n granularity: { type: String as PropType<TimeGranularity> },\n /** 按单位的步进:`{ hour?, minute?, second? }`,各单位缺省 1。 */\n timeStep: { type: Object as PropType<TimeStep> },\n /** 快捷选项;提供后浮层中多出一列,时刻要在自己的 computed 中计算后再传入。 */\n presets: { type: Array as PropType<TimePickerPreset[]> },\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<TimePickerProps['translations']> },\n /** 逐格可选性:时列按 24 小时制给值,第三个参数带已选的时与分。 */\n isTimeUnavailable: { type: Function as PropType<TimeUnavailablePredicate> },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<TimePickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<TimePickerProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<TimePickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<TimePickerProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TimePickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: TimePickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: TimePickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useTimePicker(withHandlers(withXhConfig('time-picker', useFormControlProps(props)), { onClear: () => emit('clear') }) as TimePickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideTimePicker(ctx)\n\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 empty: ctx.api.value.empty,\n outOfRange: ctx.api.value.outOfRange,\n segments: ctx.api.value.segments,\n columns: ctx.api.value.columns,\n canClear: ctx.api.value.canClear,\n canAdd: ctx.api.value.canAdd,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n add: ctx.api.value.add,\n }))\n },\n})\n\nexport const XhTimePickerLabel = defineComponent({\n name: 'XhTimePickerLabel',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n // 仍用原生 label 保持表单语义,点标题聚焦第一段由连接层的 click 接管\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerControl = defineComponent({\n name: 'XhTimePickerControl',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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\n/** 标签文字所在的块(tag 的 label)。 */\nexport const XhTimePickerTagLabel = defineComponent({\n name: 'XhTimePickerTagLabel',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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(XhTimePickerTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhTimePickerTagLabel, null, () => content)] : content\n}\n\n/** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger,可及名使用 translations.deleteItem;点按摘掉所在标签的选中值,焦点不动。 */\nexport const XhTimePickerItemDeleteTrigger = defineComponent({\n name: 'XhTimePickerItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n const tag = useTimePickerTagContext()\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 XhTimePickerTag = defineComponent({\n name: 'XhTimePickerTag',\n props: {\n /** 它代表哪个选中值。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n provideTimePickerTag({ 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 XhTimePickerOverflowTag = defineComponent({\n name: 'XhTimePickerOverflowTag',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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 XhTimePickerTagList = defineComponent({\n name: 'XhTimePickerTagList',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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(XhTimePickerTag, { key: tag.value, value: tag.value }, () => [\n h(XhTimePickerTagLabel, null, () => tag.label),\n h(XhTimePickerItemDeleteTrigger),\n ])),\n h(XhTimePickerOverflowTag),\n ])\n },\n})\n\nexport const XhTimePickerSegmentGroup = defineComponent({\n name: 'XhTimePickerSegmentGroup',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('div', ctx.api.value.getSegmentGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerSegment = defineComponent({\n name: 'XhTimePickerSegment',\n props: {\n // 段的身份由作者声明\n segment: { type: String as PropType<TimeSegmentType>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n // 有插槽用插槽,否则显示该段的文字,空段为占位串\n return () => h(\n 'span',\n ctx.api.value.getSegmentProps({ segment: props.segment }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getSegmentText({ segment: props.segment }),\n )\n },\n})\n\nexport const XhTimePickerTrigger = defineComponent({\n name: 'XhTimePickerTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTimePickerContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n // 归还焦点要落到它身上:锚点取的是整个输入行,那一层不可聚焦\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhTimePickerClearTrigger = defineComponent({\n name: 'XhTimePickerClearTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerPositioner = defineComponent({\n name: 'XhTimePickerPositioner',\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 = useTimePickerContext()\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.controlRef, 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?.()),\n ])\n },\n})\n\nexport const XhTimePickerContent = defineComponent({\n name: 'XhTimePickerContent',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\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 XhTimePickerPresetGroup = defineComponent({\n name: 'XhTimePickerPresetGroup',\n slots: Object as SlotsType<{\n /** 自行铺设条目;未写时按 presets 数据自动铺设,两者产出的 DOM 一致。 */\n default?: (props: TimePickerPresetsSlotProps) => VNode[]\n }>,\n // 根是片段(选项列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTimePickerContext()\n const presetGroupRef = ref<HTMLElement | null>(null)\n // 快捷选项列定高自己竖滚:条子贴在它的盒子上、紧跟在它后面(浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => presetGroupRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n onUpdated(() => bars.measure())\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.({ presets: api.presets })\n return [\n h(\n 'div',\n {\n ...mergeProps(api.getPresetGroupProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { presetGroupRef.value = el as HTMLElement },\n },\n slotPaints(authored)\n ? authored\n : api.presets.map(preset => h(\n 'div',\n { ...api.getPresetProps({ value: preset.value }) as Record<string, unknown>, key: preset.value },\n preset.label,\n )),\n ),\n ...bars.render(),\n ]\n }\n },\n})\n\nexport const XhTimePickerPreset = defineComponent({\n name: 'XhTimePickerPreset',\n props: {\n /** 该条目的身份,与 presets 数据中的 value 逐字对应。 */\n value: { type: String, required: true },\n },\n slots: Object as SlotsType<{\n /** 条目内容;未写时使用数据中的 label。 */\n default?: () => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.()\n return h(\n 'div',\n api.getPresetProps({ value: props.value }) as Record<string, unknown>,\n slotPaints(authored) ? authored : api.presets.find(p => p.value === props.value)?.label,\n )\n }\n },\n})\n\nexport const XhTimePickerColumn = defineComponent({\n name: 'XhTimePickerColumn',\n props: {\n unit: { type: String as PropType<TimePickerColumnUnit>, required: true },\n },\n slots: Object as SlotsType<{\n default?: (props: TimePickerColumnSlotProps) => VNode[]\n }>,\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useTimePickerContext()\n const unit = computed(() => props.unit)\n // 下传单位,供列内选项取到自己归哪一列\n provideTimePickerColumn({ unit })\n const columnRef = ref<HTMLElement | null>(null)\n // 定高的时间列自己竖滚:条子贴在本列的盒子上、紧跟在它后面(浮层 4px 档)\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 onUpdated(() => bars.measure())\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ unit: props.unit }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n slots.default?.({ options: ctx.api.value.columns.find(c => c.unit === props.unit)?.options ?? [] }),\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhTimePickerItem = defineComponent({\n name: 'XhTimePickerItem',\n props: {\n /** 两位补零的显示串('09' / '30');上下午列写 '00' / '01'。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n const { unit } = useTimePickerColumnContext()\n // 有插槽用插槽,否则显示这一格该显示的文字(上下午列按 locale 译成「上午 / 下午」)\n return () => h(\n 'div',\n ctx.api.value.getItemProps({ unit: unit.value, value: props.value }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getItemText({ unit: unit.value, value: props.value }),\n )\n },\n})\n\n/** 「添加」:多选时把浮层里拼好的草稿收进值,浮层不收;单选时连接层给 hidden。文字由作者写。 */\nexport const XhTimePickerConfirmTrigger = defineComponent({\n name: 'XhTimePickerConfirmTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('button', ctx.api.value.getConfirmTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerFooter = defineComponent({\n name: 'XhTimePickerFooter',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n // 浮层底部的通栏操作区:写在 content 里、排在各列之后,「添加」钮通常放在这里;\n // 不进任何集合的拥有关系,方向键走不到,里面的按钮照常进 Tab 序列,从列上按 Tab 就能走到,浮层不收\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerHiddenInput = defineComponent({\n name: 'XhTimePickerHiddenInput',\n setup() {\n const ctx = useTimePickerContext()\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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"}
|
|
@@ -195,7 +195,8 @@ container: { type: Object } },
|
|
|
195
195
|
});
|
|
196
196
|
return () => h(XhPortal, {
|
|
197
197
|
to: props.container ?? ctx.portalTarget.value,
|
|
198
|
-
source: ctx.controlRef
|
|
198
|
+
source: ctx.controlRef,
|
|
199
|
+
present: ctx.visible.value
|
|
199
200
|
}, () => [h("div", {
|
|
200
201
|
...mergeProps(ctx.api.value.getPositionerProps(), attrs),
|
|
201
202
|
ref: (el) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-range-picker.js","names":[],"sources":["../../../src/components/time-range-picker/time-range-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// 提供 time range picker 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n TimeGranularity,\n TimeHourCycle,\n TimePickerColumn,\n TimePickerColumnUnit,\n TimeRangePickerApi,\n TimeRangePickerEndIndex,\n TimeRangePickerPreset,\n TimeRangePickerPresetState,\n TimeRangePickerSchema,\n TimeSegmentType,\n TimeStep,\n TimeUnavailablePredicate,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { resolveTimeRangePickerEndIndex } from '@xihan-ui/headless'\nimport { computed, defineComponent, h, mergeProps, onUpdated, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotPaints } 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 {\n provideTimeRangePicker,\n provideTimeRangePickerColumn,\n provideTimeRangePickerEnd,\n useTimeRangePickerColumnContext,\n useTimeRangePickerContext,\n useTimeRangePickerEndContext,\n} from './context'\nimport { useTimeRangePicker } from './use-time-range-picker'\n\ntype TimeRangePickerProps = TimeRangePickerSchema['props']\n\n/** 默认插槽的载荷:浮层开合与两端、值状态标志、当前的段与两组时列,以及开合、写值、清空的动作。 */\nexport type TimeRangePickerRootSlotProps = Pick<\n TimeRangePickerApi,\n | 'open'\n | 'value'\n | 'start'\n | 'end'\n | 'empty'\n | 'outOfRange'\n | 'reversed'\n | 'segments'\n | 'columnGroups'\n | 'canClear'\n | 'setOpen'\n | 'setValue'\n | 'clear'\n>\n\n/** 时列外壳默认插槽的载荷:该端当前应排列的列。 */\nexport interface TimeRangePickerColumnGroupSlotProps {\n columns: readonly TimePickerColumn[]\n}\n\n/** 默认插槽的载荷:该列当前的可选值。 */\nexport interface TimeRangePickerColumnSlotProps {\n options: TimePickerColumn['options']\n}\n\n/** 快捷选项列默认插槽的载荷:逐条的投影,作者据此自行铺设条目。 */\nexport interface TimeRangePickerPresetsSlotProps {\n presets: readonly TimeRangePickerPresetState[]\n}\n\nexport const XhTimeRangePickerRoot = defineComponent({\n name: 'XhTimeRangePickerRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n /** 区间两端 [start, end];空缺的一端用空串占位。 */\n value: { type: Array as PropType<string[]> },\n defaultValue: { type: Array as PropType<string[]> },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n min: { type: String },\n max: { type: String },\n locale: { type: String },\n hourCycle: { type: Number as PropType<TimeHourCycle> },\n granularity: { type: String as PropType<TimeGranularity> },\n /** 按单位的步进:`{ hour?, minute?, second? }`,各单位缺省 1。 */\n timeStep: { type: Object as PropType<TimeStep> },\n /** 快捷选项;提供后浮层中多出一列,时刻要在自己的 computed 中计算后再传入。 */\n presets: { type: Array as PropType<TimeRangePickerPreset[]> },\n disabled: { type: Boolean, default: undefined },\n // 两组段位与时列各自的读屏名字\n translations: { type: Object as PropType<TimeRangePickerProps['translations']> },\n /** 逐格可选性:时列按 24 小时制给值,第三个参数带这一端已选的时分与端号。 */\n isTimeUnavailable: { type: Function as PropType<TimeUnavailablePredicate> },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n // 终点那份隐藏输入的表单名;不给即终点不参与提交\n endName: { type: String },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值;值恒为 [start, end],只填了终点时是 ['', end]\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<TimeRangePickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<TimeRangePickerProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<TimeRangePickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<TimeRangePickerProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TimeRangePickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: TimeRangePickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: TimeRangePickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useTimeRangePicker(withHandlers(withXhConfig('time-range-picker', useFormControlProps(props)), { onClear: () => emit('clear') }) as TimeRangePickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideTimeRangePicker(ctx)\n\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 start: ctx.api.value.start,\n end: ctx.api.value.end,\n empty: ctx.api.value.empty,\n outOfRange: ctx.api.value.outOfRange,\n reversed: ctx.api.value.reversed,\n segments: ctx.api.value.segments,\n columnGroups: ctx.api.value.columnGroups,\n canClear: ctx.api.value.canClear,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n }))\n },\n})\n\nexport const XhTimeRangePickerLabel = defineComponent({\n name: 'XhTimeRangePickerLabel',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\n // 仍用原生 label 保持表单语义,点标题聚焦第一段由连接层的 click 接管\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerControl = defineComponent({\n name: 'XhTimeRangePickerControl',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\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 XhTimeRangePickerSegmentGroup = defineComponent({\n name: 'XhTimeRangePickerSegmentGroup',\n props: {\n // 端号:0 起点、1 终点,兼收字符串以支持模板里写 index=\"1\"\n index: { type: [Number, String] as PropType<number | string>, default: 0 },\n },\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n const index = computed<TimeRangePickerEndIndex>(() => resolveTimeRangePickerEndIndex(props.index))\n // 组内的段位据此认领起止\n provideTimeRangePickerEnd({ index })\n return () => h('div', ctx.api.value.getSegmentGroupProps({ index: index.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerSegment = defineComponent({\n name: 'XhTimeRangePickerSegment',\n props: {\n // 段的身份由作者声明;属于哪一端跟着所在的段位容器走\n segment: { type: String as PropType<TimeSegmentType>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n // 有插槽用插槽,否则显示该段的文字,空段为占位串\n return () => h(\n 'span',\n ctx.api.value.getSegmentProps({ index: end.index.value, segment: props.segment }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getSegmentText({ index: end.index.value, segment: props.segment }),\n )\n },\n})\n\nexport const XhTimeRangePickerRangeSeparator = defineComponent({\n name: 'XhTimeRangePickerRangeSeparator',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\n return () => h(\n 'span',\n ctx.api.value.getRangeSeparatorProps() as Record<string, unknown>,\n slots.default?.() ?? '-',\n )\n },\n})\n\nexport const XhTimeRangePickerTrigger = defineComponent({\n name: 'XhTimeRangePickerTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTimeRangePickerContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n // 归还焦点要落到它身上:锚点取的是整个输入行,那一层不可聚焦\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerClearTrigger = defineComponent({\n name: 'XhTimeRangePickerClearTrigger',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerPositioner = defineComponent({\n name: 'XhTimeRangePickerPositioner',\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 = useTimeRangePickerContext()\n // 浮层面板的自绘条:两组时列并排放不下时面板整体横滚,横条与 content 同级挂在已经 fixed 的 positioner 上,\n // 条子走浮层 4px 档;各列自己竖滚的条子贴在列上、挂在 content 里\n const bars = useScrollbars({\n scrollable: () => ctx.contentRef.value,\n axes: ['horizontal'],\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.controlRef }, () => [\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 XhTimeRangePickerContent = defineComponent({\n name: 'XhTimeRangePickerContent',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\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 XhTimeRangePickerPresetGroup = defineComponent({\n name: 'XhTimeRangePickerPresetGroup',\n slots: Object as SlotsType<{\n /** 自行铺设条目;未写时按 presets 数据自动铺设,两者产出的 DOM 一致。 */\n default?: (props: TimeRangePickerPresetsSlotProps) => VNode[]\n }>,\n // 根是片段(选项列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTimeRangePickerContext()\n const presetGroupRef = ref<HTMLElement | null>(null)\n // 快捷选项列定高自己竖滚:条子贴在它的盒子上、紧跟在它后面(浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => presetGroupRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n onUpdated(() => bars.measure())\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.({ presets: api.presets })\n return [\n h(\n 'div',\n {\n ...mergeProps(api.getPresetGroupProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { presetGroupRef.value = el as HTMLElement },\n },\n slotPaints(authored)\n ? authored\n : api.presets.map(preset => h(\n 'div',\n { ...api.getPresetProps({ value: preset.value }) as Record<string, unknown>, key: preset.value },\n preset.label,\n )),\n ),\n ...bars.render(),\n ]\n }\n },\n})\n\nexport const XhTimeRangePickerPreset = defineComponent({\n name: 'XhTimeRangePickerPreset',\n props: {\n /** 该条目的身份,与 presets 数据中的 value 逐字对应。 */\n value: { type: String, required: true },\n },\n slots: Object as SlotsType<{\n /** 条目内容;未写时使用数据中的 label。 */\n default?: () => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.()\n return h(\n 'div',\n api.getPresetProps({ value: props.value }) as Record<string, unknown>,\n slotPaints(authored) ? authored : api.presets.find(p => p.value === props.value)?.label,\n )\n }\n },\n})\n\nexport const XhTimeRangePickerColumnGroup = defineComponent({\n name: 'XhTimeRangePickerColumnGroup',\n props: {\n // 端号:0 起点、1 终点,兼收字符串以支持模板里写 index=\"1\"\n index: { type: [Number, String] as PropType<number | string>, default: 0 },\n },\n slots: Object as SlotsType<{\n default?: (props: TimeRangePickerColumnGroupSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n const index = computed<TimeRangePickerEndIndex>(() => resolveTimeRangePickerEndIndex(props.index))\n // 组内的小标题、列与选项据此认领起止\n provideTimeRangePickerEnd({ index })\n return () => h(\n 'div',\n ctx.api.value.getColumnGroupProps({ index: index.value }) as Record<string, unknown>,\n slots.default?.({ columns: ctx.api.value.columnGroups[index.value].columns }),\n )\n },\n})\n\nexport const XhTimeRangePickerColumnGroupLabel = defineComponent({\n name: 'XhTimeRangePickerColumnGroupLabel',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n return () => h('div', ctx.api.value.getColumnGroupLabelProps({ index: end.index.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerColumn = defineComponent({\n name: 'XhTimeRangePickerColumn',\n props: {\n unit: { type: String as PropType<TimePickerColumnUnit>, required: true },\n },\n slots: Object as SlotsType<{\n default?: (props: TimeRangePickerColumnSlotProps) => VNode[]\n }>,\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n const unit = computed(() => props.unit)\n // 下传单位,供列内选项取到自己归哪一列\n provideTimeRangePickerColumn({ unit })\n const columnRef = ref<HTMLElement | null>(null)\n // 定高的时间列自己竖滚:条子贴在本列的盒子上、紧跟在它后面(浮层 4px 档)\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 onUpdated(() => bars.measure())\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ index: end.index.value, unit: props.unit }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n slots.default?.({ options: ctx.api.value.columnGroups[end.index.value].columns.find(c => c.unit === props.unit)?.options ?? [] }),\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhTimeRangePickerItem = defineComponent({\n name: 'XhTimeRangePickerItem',\n props: {\n /** 两位补零的显示串('09' / '30');上下午列写 '00' / '01'。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n const { unit } = useTimeRangePickerColumnContext()\n // 有插槽用插槽,否则显示这一格该显示的文字(上下午列按 locale 译成「上午 / 下午」)\n return () => h(\n 'div',\n ctx.api.value.getItemProps({ index: end.index.value, unit: unit.value, value: props.value }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getItemText({ unit: unit.value, value: props.value }),\n )\n },\n})\n\nexport const XhTimeRangePickerHiddenInput = defineComponent({\n name: 'XhTimeRangePickerHiddenInput',\n props: {\n // 写在段位容器外面时用它指明属于哪一端;写在容器里面不必给,跟着容器走\n index: { type: [Number, String] as PropType<number | string> },\n },\n setup(props) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n return () => {\n const index = props.index === undefined ? end.index.value : resolveTimeRangePickerEndIndex(props.index)\n return h('input', ctx.api.value.getHiddenInputProps({ index }) as Record<string, unknown>)\n }\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"time-range-picker.js","names":[],"sources":["../../../src/components/time-range-picker/time-range-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// 提供 time range picker 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n TimeGranularity,\n TimeHourCycle,\n TimePickerColumn,\n TimePickerColumnUnit,\n TimeRangePickerApi,\n TimeRangePickerEndIndex,\n TimeRangePickerPreset,\n TimeRangePickerPresetState,\n TimeRangePickerSchema,\n TimeSegmentType,\n TimeStep,\n TimeUnavailablePredicate,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { resolveTimeRangePickerEndIndex } from '@xihan-ui/headless'\nimport { computed, defineComponent, h, mergeProps, onUpdated, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotPaints } 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 {\n provideTimeRangePicker,\n provideTimeRangePickerColumn,\n provideTimeRangePickerEnd,\n useTimeRangePickerColumnContext,\n useTimeRangePickerContext,\n useTimeRangePickerEndContext,\n} from './context'\nimport { useTimeRangePicker } from './use-time-range-picker'\n\ntype TimeRangePickerProps = TimeRangePickerSchema['props']\n\n/** 默认插槽的载荷:浮层开合与两端、值状态标志、当前的段与两组时列,以及开合、写值、清空的动作。 */\nexport type TimeRangePickerRootSlotProps = Pick<\n TimeRangePickerApi,\n | 'open'\n | 'value'\n | 'start'\n | 'end'\n | 'empty'\n | 'outOfRange'\n | 'reversed'\n | 'segments'\n | 'columnGroups'\n | 'canClear'\n | 'setOpen'\n | 'setValue'\n | 'clear'\n>\n\n/** 时列外壳默认插槽的载荷:该端当前应排列的列。 */\nexport interface TimeRangePickerColumnGroupSlotProps {\n columns: readonly TimePickerColumn[]\n}\n\n/** 默认插槽的载荷:该列当前的可选值。 */\nexport interface TimeRangePickerColumnSlotProps {\n options: TimePickerColumn['options']\n}\n\n/** 快捷选项列默认插槽的载荷:逐条的投影,作者据此自行铺设条目。 */\nexport interface TimeRangePickerPresetsSlotProps {\n presets: readonly TimeRangePickerPresetState[]\n}\n\nexport const XhTimeRangePickerRoot = defineComponent({\n name: 'XhTimeRangePickerRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n /** 区间两端 [start, end];空缺的一端用空串占位。 */\n value: { type: Array as PropType<string[]> },\n defaultValue: { type: Array as PropType<string[]> },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n min: { type: String },\n max: { type: String },\n locale: { type: String },\n hourCycle: { type: Number as PropType<TimeHourCycle> },\n granularity: { type: String as PropType<TimeGranularity> },\n /** 按单位的步进:`{ hour?, minute?, second? }`,各单位缺省 1。 */\n timeStep: { type: Object as PropType<TimeStep> },\n /** 快捷选项;提供后浮层中多出一列,时刻要在自己的 computed 中计算后再传入。 */\n presets: { type: Array as PropType<TimeRangePickerPreset[]> },\n disabled: { type: Boolean, default: undefined },\n // 两组段位与时列各自的读屏名字\n translations: { type: Object as PropType<TimeRangePickerProps['translations']> },\n /** 逐格可选性:时列按 24 小时制给值,第三个参数带这一端已选的时分与端号。 */\n isTimeUnavailable: { type: Function as PropType<TimeUnavailablePredicate> },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n // 终点那份隐藏输入的表单名;不给即终点不参与提交\n endName: { type: String },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值;值恒为 [start, end],只填了终点时是 ['', end]\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<TimeRangePickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<TimeRangePickerProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<TimeRangePickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<TimeRangePickerProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TimeRangePickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: TimeRangePickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: TimeRangePickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useTimeRangePicker(withHandlers(withXhConfig('time-range-picker', useFormControlProps(props)), { onClear: () => emit('clear') }) as TimeRangePickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideTimeRangePicker(ctx)\n\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 start: ctx.api.value.start,\n end: ctx.api.value.end,\n empty: ctx.api.value.empty,\n outOfRange: ctx.api.value.outOfRange,\n reversed: ctx.api.value.reversed,\n segments: ctx.api.value.segments,\n columnGroups: ctx.api.value.columnGroups,\n canClear: ctx.api.value.canClear,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n }))\n },\n})\n\nexport const XhTimeRangePickerLabel = defineComponent({\n name: 'XhTimeRangePickerLabel',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\n // 仍用原生 label 保持表单语义,点标题聚焦第一段由连接层的 click 接管\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerControl = defineComponent({\n name: 'XhTimeRangePickerControl',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\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 XhTimeRangePickerSegmentGroup = defineComponent({\n name: 'XhTimeRangePickerSegmentGroup',\n props: {\n // 端号:0 起点、1 终点,兼收字符串以支持模板里写 index=\"1\"\n index: { type: [Number, String] as PropType<number | string>, default: 0 },\n },\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n const index = computed<TimeRangePickerEndIndex>(() => resolveTimeRangePickerEndIndex(props.index))\n // 组内的段位据此认领起止\n provideTimeRangePickerEnd({ index })\n return () => h('div', ctx.api.value.getSegmentGroupProps({ index: index.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerSegment = defineComponent({\n name: 'XhTimeRangePickerSegment',\n props: {\n // 段的身份由作者声明;属于哪一端跟着所在的段位容器走\n segment: { type: String as PropType<TimeSegmentType>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n // 有插槽用插槽,否则显示该段的文字,空段为占位串\n return () => h(\n 'span',\n ctx.api.value.getSegmentProps({ index: end.index.value, segment: props.segment }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getSegmentText({ index: end.index.value, segment: props.segment }),\n )\n },\n})\n\nexport const XhTimeRangePickerRangeSeparator = defineComponent({\n name: 'XhTimeRangePickerRangeSeparator',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\n return () => h(\n 'span',\n ctx.api.value.getRangeSeparatorProps() as Record<string, unknown>,\n slots.default?.() ?? '-',\n )\n },\n})\n\nexport const XhTimeRangePickerTrigger = defineComponent({\n name: 'XhTimeRangePickerTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTimeRangePickerContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n // 归还焦点要落到它身上:锚点取的是整个输入行,那一层不可聚焦\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerClearTrigger = defineComponent({\n name: 'XhTimeRangePickerClearTrigger',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerPositioner = defineComponent({\n name: 'XhTimeRangePickerPositioner',\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 = useTimeRangePickerContext()\n // 浮层面板的自绘条:两组时列并排放不下时面板整体横滚,横条与 content 同级挂在已经 fixed 的 positioner 上,\n // 条子走浮层 4px 档;各列自己竖滚的条子贴在列上、挂在 content 里\n const bars = useScrollbars({\n scrollable: () => ctx.contentRef.value,\n axes: ['horizontal'],\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.controlRef, 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 XhTimeRangePickerContent = defineComponent({\n name: 'XhTimeRangePickerContent',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\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 XhTimeRangePickerPresetGroup = defineComponent({\n name: 'XhTimeRangePickerPresetGroup',\n slots: Object as SlotsType<{\n /** 自行铺设条目;未写时按 presets 数据自动铺设,两者产出的 DOM 一致。 */\n default?: (props: TimeRangePickerPresetsSlotProps) => VNode[]\n }>,\n // 根是片段(选项列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTimeRangePickerContext()\n const presetGroupRef = ref<HTMLElement | null>(null)\n // 快捷选项列定高自己竖滚:条子贴在它的盒子上、紧跟在它后面(浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => presetGroupRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n onUpdated(() => bars.measure())\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.({ presets: api.presets })\n return [\n h(\n 'div',\n {\n ...mergeProps(api.getPresetGroupProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { presetGroupRef.value = el as HTMLElement },\n },\n slotPaints(authored)\n ? authored\n : api.presets.map(preset => h(\n 'div',\n { ...api.getPresetProps({ value: preset.value }) as Record<string, unknown>, key: preset.value },\n preset.label,\n )),\n ),\n ...bars.render(),\n ]\n }\n },\n})\n\nexport const XhTimeRangePickerPreset = defineComponent({\n name: 'XhTimeRangePickerPreset',\n props: {\n /** 该条目的身份,与 presets 数据中的 value 逐字对应。 */\n value: { type: String, required: true },\n },\n slots: Object as SlotsType<{\n /** 条目内容;未写时使用数据中的 label。 */\n default?: () => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.()\n return h(\n 'div',\n api.getPresetProps({ value: props.value }) as Record<string, unknown>,\n slotPaints(authored) ? authored : api.presets.find(p => p.value === props.value)?.label,\n )\n }\n },\n})\n\nexport const XhTimeRangePickerColumnGroup = defineComponent({\n name: 'XhTimeRangePickerColumnGroup',\n props: {\n // 端号:0 起点、1 终点,兼收字符串以支持模板里写 index=\"1\"\n index: { type: [Number, String] as PropType<number | string>, default: 0 },\n },\n slots: Object as SlotsType<{\n default?: (props: TimeRangePickerColumnGroupSlotProps) => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n const index = computed<TimeRangePickerEndIndex>(() => resolveTimeRangePickerEndIndex(props.index))\n // 组内的小标题、列与选项据此认领起止\n provideTimeRangePickerEnd({ index })\n return () => h(\n 'div',\n ctx.api.value.getColumnGroupProps({ index: index.value }) as Record<string, unknown>,\n slots.default?.({ columns: ctx.api.value.columnGroups[index.value].columns }),\n )\n },\n})\n\nexport const XhTimeRangePickerColumnGroupLabel = defineComponent({\n name: 'XhTimeRangePickerColumnGroupLabel',\n setup(_, { slots }) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n return () => h('div', ctx.api.value.getColumnGroupLabelProps({ index: end.index.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeRangePickerColumn = defineComponent({\n name: 'XhTimeRangePickerColumn',\n props: {\n unit: { type: String as PropType<TimePickerColumnUnit>, required: true },\n },\n slots: Object as SlotsType<{\n default?: (props: TimeRangePickerColumnSlotProps) => VNode[]\n }>,\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n const unit = computed(() => props.unit)\n // 下传单位,供列内选项取到自己归哪一列\n provideTimeRangePickerColumn({ unit })\n const columnRef = ref<HTMLElement | null>(null)\n // 定高的时间列自己竖滚:条子贴在本列的盒子上、紧跟在它后面(浮层 4px 档)\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 onUpdated(() => bars.measure())\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ index: end.index.value, unit: props.unit }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n slots.default?.({ options: ctx.api.value.columnGroups[end.index.value].columns.find(c => c.unit === props.unit)?.options ?? [] }),\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhTimeRangePickerItem = defineComponent({\n name: 'XhTimeRangePickerItem',\n props: {\n /** 两位补零的显示串('09' / '30');上下午列写 '00' / '01'。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n const { unit } = useTimeRangePickerColumnContext()\n // 有插槽用插槽,否则显示这一格该显示的文字(上下午列按 locale 译成「上午 / 下午」)\n return () => h(\n 'div',\n ctx.api.value.getItemProps({ index: end.index.value, unit: unit.value, value: props.value }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getItemText({ unit: unit.value, value: props.value }),\n )\n },\n})\n\nexport const XhTimeRangePickerHiddenInput = defineComponent({\n name: 'XhTimeRangePickerHiddenInput',\n props: {\n // 写在段位容器外面时用它指明属于哪一端;写在容器里面不必给,跟着容器走\n index: { type: [Number, String] as PropType<number | string> },\n },\n setup(props) {\n const ctx = useTimeRangePickerContext()\n const end = useTimeRangePickerEndContext()\n return () => {\n const index = props.index === undefined ? end.index.value : resolveTimeRangePickerEndIndex(props.index)\n return h('input', ctx.api.value.getHiddenInputProps({ index }) as Record<string, unknown>)\n }\n },\n})\n"],"mappings":"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"}
|
|
@@ -106,7 +106,8 @@ container: { type: Object } },
|
|
|
106
106
|
const ctx = useTooltipContext();
|
|
107
107
|
return () => h(XhPortal, {
|
|
108
108
|
to: props.container ?? ctx.portalTarget.value,
|
|
109
|
-
source: ctx.triggerRef
|
|
109
|
+
source: ctx.triggerRef,
|
|
110
|
+
present: ctx.visible.value
|
|
110
111
|
}, () => [h("div", {
|
|
111
112
|
...mergeProps(ctx.api.value.getPositionerProps(), attrs),
|
|
112
113
|
ref: (el) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.js","names":[],"sources":["../../../src/components/tooltip/tooltip.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// 提供 tooltip 相关实现。\n\nimport type { Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type { TooltipApi, TooltipSchema } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { createTooltipGroup } from '@xihan-ui/headless'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { provideTooltip, provideTooltipGroup, useTooltipContext } from './context'\nimport { useTooltip } from './use-tooltip'\n\ntype TooltipProps = TooltipSchema['props']\n\n/** 默认插槽的载荷:展开状态与开合方法。 */\nexport type TooltipRootSlotProps = Pick<TooltipApi, 'open' | 'setOpen'>\n\n/**\n * 提示组:子树里的提示归同一组,共用接替窗口、同一时刻只开一个,没写延时的取这里给的缺省。\n * 本身不渲染节点,也不改动子节点的排布。\n */\nexport const XhTooltipProvider = defineComponent({\n name: 'XhTooltipProvider',\n props: {\n /** 组内提示悬停进入到展开的缺省等待毫秒;提示自己写了就以提示为准。 */\n openDelay: { type: Number },\n /** 组内提示悬停移出到收起的缺省等待毫秒。 */\n closeDelay: { type: Number },\n /** 组内提示的缺省接替窗口毫秒;0 表示组内不接替。 */\n skipDelayDuration: { type: Number },\n },\n setup(props, { slots }) {\n // 组在 Provider 的一生里只建一次;缺省值每次现读,改 props 下一次开合即生效\n provideTooltipGroup(createTooltipGroup(() => ({\n openDelay: props.openDelay,\n closeDelay: props.closeDelay,\n skipDelayDuration: props.skipDelayDuration,\n })))\n return () => slots.default?.()\n },\n})\n\nexport const XhTooltipRoot = defineComponent({\n name: 'XhTooltipRoot',\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n openDelay: { type: Number },\n closeDelay: { type: Number },\n /** 跳过等待的窗口毫秒,默认 300:另一个提示开着或刚收起时,指向这一个直接接替、不播进场;0 不参与。 */\n skipDelayDuration: { type: Number },\n disabled: Boolean,\n /** 跟随鼠标:由指针打开的提示锚在指针落点上并随移动更新;触屏与聚焦打开时锚回 trigger。 */\n followCursor: { type: Boolean, default: undefined },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // open-change 携带 { open };update:open 携带裸布尔,支持 v-model:open\n emits: {\n 'open-change': (_details: PayloadOf<TooltipProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<TooltipProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TooltipRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: TooltipProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useTooltip(props as TooltipProps, notify)\n provideTooltip(ctx)\n return () => slots.default?.({ open: ctx.api.value.open, setOpen: ctx.api.value.setOpen })\n },\n})\n\nexport const XhTooltipTrigger = defineComponent({\n name: 'XhTooltipTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = useTooltipContext()\n return () => {\n const part = mergePartProps({\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'tooltip')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhTooltipPositioner = defineComponent({\n name: 'XhTooltipPositioner',\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 = useTooltipContext()\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?.()),\n ])\n },\n})\n\nexport const XhTooltipContent = defineComponent({\n name: 'XhTooltipContent',\n setup(_, { slots }) {\n const ctx = useTooltipContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤给 content 声明了 display 来盖掉 UA 的 [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 XhTooltipArrow = defineComponent({\n name: 'XhTooltipArrow',\n setup(_, { slots }) {\n const ctx = useTooltipContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":";;;;;;;;;;;;AA4BA,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CACN,OAAO;;EAEL,WAAW,EAAE,MAAM,OAAO;;EAE1B,YAAY,EAAE,MAAM,OAAO;;EAE3B,mBAAmB,EAAE,MAAM,OAAO;CACpC;CACA,MAAM,OAAO,EAAE,SAAS;EAEtB,oBAAoB,0BAA0B;GAC5C,WAAW,MAAM;GACjB,YAAY,MAAM;GAClB,mBAAmB,MAAM;EAC3B,EAAE,CAAC;EACH,aAAa,MAAM,UAAU;CAC/B;AACF,CAAC;AAED,MAAa,gBAAgB,gBAAgB;CAC3C,MAAM;CACN,OAAO;EACL,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;EACb,WAAW,EAAE,MAAM,OAA8B;EACjD,QAAQ,EAAE,MAAM,OAAO;;EAEvB,KAAK,EAAE,MAAM,OAA8B;EAC3C,WAAW,EAAE,MAAM,OAAO;EAC1B,YAAY,EAAE,MAAM,OAAO;;EAE3B,mBAAmB,EAAE,MAAM,OAAO;EAClC,UAAU;;EAEV,cAAc;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAClD,MAAM,EAAE,MAAM,OAAyB;EACvC,MAAM,EAAE,MAAM,OAAyB;CACzC;CAEA,OAAO;EACL,gBAAgB,aAAsD;EACtE,gBAAgB,UAA2D;CAC7E;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,UAAwC,YAAY;GACxD,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,MAAM,WAAW,OAAuB,MAAM;EACpD,eAAe,GAAG;EAClB,aAAa,MAAM,UAAU;GAAE,MAAM,IAAI,IAAI,MAAM;GAAM,SAAS,IAAI,IAAI,MAAM;EAAQ,CAAC;CAC3F;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CAEN,cAAc;CACd,OAAO;;AAEL,SAAS,QACX;CACA,MAAM,OAAO,EAAE,OAAO,SAAS;EAC7B,MAAM,MAAM,kBAAkB;EAC9B,aAAa;GACX,MAAM,OAAO,eAAe;IAC1B,GAAG,IAAI,IAAI,MAAM,gBAAgB;IACjC,MAAM,OAAgB;KAAE,IAAI,WAAW,QAAQ;IAAkB;GACnE,GAAG,KAAK;GACR,MAAM,WAAW,MAAM,UAAU;GAEjC,IAAI,MAAM,SAAS;IACjB,MAAM,SAAS,eAAe,UAAU,MAAM,SAAS;IACvD,IAAI,QACF,OAAO;GACX;GACA,OAAO,EAAE,UAAU,MAAM,QAAQ;EACnC;CACF;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,OAAO;;AAEL,WAAW,EAAE,MAAM,OAA4B,EACjD;CAEA,cAAc;CACd,MAAM,OAAO,EAAE,OAAO,SAAS;EAC7B,MAAM,MAAM,kBAAkB;EAE9B,aAAa,EAAE,UAAU;GAAE,IAAI,MAAM,aAAa,IAAI,aAAa;GAAO,QAAQ,IAAI;
|
|
1
|
+
{"version":3,"file":"tooltip.js","names":[],"sources":["../../../src/components/tooltip/tooltip.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// 提供 tooltip 相关实现。\n\nimport type { Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type { TooltipApi, TooltipSchema } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { createTooltipGroup } from '@xihan-ui/headless'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { provideTooltip, provideTooltipGroup, useTooltipContext } from './context'\nimport { useTooltip } from './use-tooltip'\n\ntype TooltipProps = TooltipSchema['props']\n\n/** 默认插槽的载荷:展开状态与开合方法。 */\nexport type TooltipRootSlotProps = Pick<TooltipApi, 'open' | 'setOpen'>\n\n/**\n * 提示组:子树里的提示归同一组,共用接替窗口、同一时刻只开一个,没写延时的取这里给的缺省。\n * 本身不渲染节点,也不改动子节点的排布。\n */\nexport const XhTooltipProvider = defineComponent({\n name: 'XhTooltipProvider',\n props: {\n /** 组内提示悬停进入到展开的缺省等待毫秒;提示自己写了就以提示为准。 */\n openDelay: { type: Number },\n /** 组内提示悬停移出到收起的缺省等待毫秒。 */\n closeDelay: { type: Number },\n /** 组内提示的缺省接替窗口毫秒;0 表示组内不接替。 */\n skipDelayDuration: { type: Number },\n },\n setup(props, { slots }) {\n // 组在 Provider 的一生里只建一次;缺省值每次现读,改 props 下一次开合即生效\n provideTooltipGroup(createTooltipGroup(() => ({\n openDelay: props.openDelay,\n closeDelay: props.closeDelay,\n skipDelayDuration: props.skipDelayDuration,\n })))\n return () => slots.default?.()\n },\n})\n\nexport const XhTooltipRoot = defineComponent({\n name: 'XhTooltipRoot',\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n openDelay: { type: Number },\n closeDelay: { type: Number },\n /** 跳过等待的窗口毫秒,默认 300:另一个提示开着或刚收起时,指向这一个直接接替、不播进场;0 不参与。 */\n skipDelayDuration: { type: Number },\n disabled: Boolean,\n /** 跟随鼠标:由指针打开的提示锚在指针落点上并随移动更新;触屏与聚焦打开时锚回 trigger。 */\n followCursor: { type: Boolean, default: undefined },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // open-change 携带 { open };update:open 携带裸布尔,支持 v-model:open\n emits: {\n 'open-change': (_details: PayloadOf<TooltipProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<TooltipProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TooltipRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: TooltipProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useTooltip(props as TooltipProps, notify)\n provideTooltip(ctx)\n return () => slots.default?.({ open: ctx.api.value.open, setOpen: ctx.api.value.setOpen })\n },\n})\n\nexport const XhTooltipTrigger = defineComponent({\n name: 'XhTooltipTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = useTooltipContext()\n return () => {\n const part = mergePartProps({\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'tooltip')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhTooltipPositioner = defineComponent({\n name: 'XhTooltipPositioner',\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 = useTooltipContext()\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?.()),\n ])\n },\n})\n\nexport const XhTooltipContent = defineComponent({\n name: 'XhTooltipContent',\n setup(_, { slots }) {\n const ctx = useTooltipContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤给 content 声明了 display 来盖掉 UA 的 [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 XhTooltipArrow = defineComponent({\n name: 'XhTooltipArrow',\n setup(_, { slots }) {\n const ctx = useTooltipContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
|
|
@@ -90,7 +90,10 @@ const XhTourBackdrop = defineComponent({
|
|
|
90
90
|
inheritAttrs: false,
|
|
91
91
|
setup(_, { slots, attrs }) {
|
|
92
92
|
const ctx = useTourContext();
|
|
93
|
-
return () => h(XhPortal, {
|
|
93
|
+
return () => h(XhPortal, {
|
|
94
|
+
to: ctx.portalTarget.value,
|
|
95
|
+
present: ctx.visible.value
|
|
96
|
+
}, () => [h("div", {
|
|
94
97
|
...mergeProps(ctx.api.value.getBackdropProps(), attrs),
|
|
95
98
|
hidden: !ctx.visible.value || !ctx.showBackdrop() || void 0,
|
|
96
99
|
ref: (el) => {
|
|
@@ -104,7 +107,10 @@ const XhTourSpotlight = defineComponent({
|
|
|
104
107
|
inheritAttrs: false,
|
|
105
108
|
setup(_, { attrs }) {
|
|
106
109
|
const ctx = useTourContext();
|
|
107
|
-
return () => h(XhPortal, {
|
|
110
|
+
return () => h(XhPortal, {
|
|
111
|
+
to: ctx.portalTarget.value,
|
|
112
|
+
present: ctx.visible.value
|
|
113
|
+
}, () => [h("div", {
|
|
108
114
|
...mergeProps(ctx.api.value.getSpotlightProps(), attrs),
|
|
109
115
|
hidden: !ctx.visible.value || !ctx.api.value.anchored || void 0,
|
|
110
116
|
ref: (el) => {
|
|
@@ -118,7 +124,10 @@ const XhTourPositioner = defineComponent({
|
|
|
118
124
|
inheritAttrs: false,
|
|
119
125
|
setup(_, { slots, attrs }) {
|
|
120
126
|
const ctx = useTourContext();
|
|
121
|
-
return () => h(XhPortal, {
|
|
127
|
+
return () => h(XhPortal, {
|
|
128
|
+
to: ctx.portalTarget.value,
|
|
129
|
+
present: ctx.visible.value
|
|
130
|
+
}, () => [h("div", {
|
|
122
131
|
...mergeProps(ctx.api.value.getPositionerProps(), attrs),
|
|
123
132
|
hidden: !ctx.visible.value || void 0,
|
|
124
133
|
ref: (el) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tour.js","names":[],"sources":["../../../src/components/tour/tour.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// 提供 tour 相关实现。\n\nimport type { Direction, Placement } from '@xihan-ui/core'\nimport type { TourApi, TourSchema, TourStep } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { provideTour, useTourContext } from './context'\nimport { useTour } from './use-tour'\n\ntype TourProps = TourSchema['props']\n\n/** 默认插槽的载荷:引导的开合与步序状态,以及开关、切换步骤、放弃与校准位置的动作。 */\nexport type TourRootSlotProps = Pick<\n TourApi,\n | 'open'\n | 'value'\n | 'count'\n | 'currentStep'\n | 'firstStep'\n | 'lastStep'\n | 'progressText'\n | 'setOpen'\n | 'setValue'\n | 'goToNextStep'\n | 'goToPrevStep'\n | 'skip'\n | 'remeasure'\n>\n\nexport const XhTourRoot = defineComponent({\n name: 'XhTourRoot',\n // 全部 default: undefined —— 缺省值的唯一事实源在 machine 与 connect\n props: {\n steps: { type: Array as PropType<TourStep[]> },\n value: { type: Number },\n defaultValue: { type: Number },\n open: { type: Boolean, default: undefined },\n defaultOpen: { type: Boolean, default: undefined },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n closeOnEscape: { type: Boolean, default: undefined },\n closeOnInteractOutside: { type: Boolean, default: undefined },\n showBackdrop: { type: Boolean, default: undefined },\n spotlightPadding: { type: Number },\n autoScroll: { type: Boolean, default: undefined },\n /** 目标缺席时等它出现的时长(ms),默认 3000;0 即不等。 */\n targetTimeout: { type: Number },\n translations: { type: Object as PropType<TourProps['translations']> },\n /** 本实例三张 Tour 浮层的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // open-change / value-change 携带对象;update:* 携带裸值,支持 v-model:open 与 v-model:value\n emits: {\n 'open-change': (_details: PayloadOf<TourProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<TourProps, 'onOpenChange'>['open']) => true,\n 'value-change': (_details: PayloadOf<TourProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TourProps, 'onValueChange'>['value']) => true,\n 'complete': (_details: PayloadOf<TourProps, 'onComplete'>) => true,\n 'skip': (_details: PayloadOf<TourProps, 'onSkip'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TourRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useTour(withXhConfig('tour', props) as TourProps, {\n onOpenChange: (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n },\n onValueChange: (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n },\n onComplete: details => emit('complete', details),\n onSkip: details => emit('skip', details),\n }, () => props.container)\n provideTour(ctx)\n // 经插槽暴露状态与走步、放弃等命令,供浮层外的按钮使用\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 count: ctx.api.value.count,\n currentStep: ctx.api.value.currentStep,\n firstStep: ctx.api.value.firstStep,\n lastStep: ctx.api.value.lastStep,\n progressText: ctx.api.value.progressText,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n goToNextStep: ctx.api.value.goToNextStep,\n goToPrevStep: ctx.api.value.goToPrevStep,\n skip: ctx.api.value.skip,\n remeasure: ctx.api.value.remeasure,\n }))\n },\n})\n\nexport const XhTourBackdrop = defineComponent({\n name: 'XhTourBackdrop',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到遮罩上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTourContext()\n // 与浮层同去一个落点:遮罩留在原地就会被面板甩下,两层不再叠在一起\n return () => h(XhPortal, { to: ctx.portalTarget.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getBackdropProps() as Record<string, unknown>, attrs),\n // 收起跟着退场闸门走:遮罩的淡出与气泡的退场并行播\n hidden: (!ctx.visible.value || !ctx.showBackdrop()) || undefined,\n ref: (el: unknown) => { ctx.backdropRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhTourSpotlight = defineComponent({\n name: 'XhTourSpotlight',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到高亮框上\n inheritAttrs: false,\n setup(_, { attrs }) {\n const ctx = useTourContext()\n // 高亮框与遮罩是同一层暗幕的两半,必须一起搬\n return () => h(XhPortal, { to: ctx.portalTarget.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getSpotlightProps() as Record<string, unknown>, attrs),\n // 收起跟着退场闸门走:高亮框的退场与气泡并行播;居中步照常不画\n hidden: (!ctx.visible.value || !ctx.api.value.anchored) || undefined,\n ref: (el: unknown) => { ctx.spotlightRef.value = el as HTMLElement },\n }),\n ])\n },\n})\n\nexport const XhTourPositioner = defineComponent({\n name: 'XhTourPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTourContext()\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: ctx.portalTarget.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n // 定位层收起跟着退场闸门走:它先 display:none 的话,里面气泡的退场一帧都播不出来\n hidden: !ctx.visible.value || undefined,\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhTourContent = defineComponent({\n name: 'XhTourContent',\n setup(_, { slots }) {\n const ctx = useTourContext()\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\n// 标题与描述的文字取自步骤声明,有插槽则用插槽\nexport const XhTourTitle = defineComponent({\n name: 'XhTourTitle',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h(\n 'h2',\n ctx.api.value.getTitleProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.currentStep?.title,\n )\n },\n})\n\nexport const XhTourDescription = defineComponent({\n name: 'XhTourDescription',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h(\n 'p',\n ctx.api.value.getDescriptionProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.currentStep?.description,\n )\n },\n})\n\nexport const XhTourProgressText = defineComponent({\n name: 'XhTourProgressText',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h(\n 'span',\n ctx.api.value.getProgressTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.progressText,\n )\n },\n})\n\n/** 圆点组:未提供默认插槽时按步数铺设圆点,作者提供后按作者的内容。 */\nexport const XhTourProgressIndicator = defineComponent({\n name: 'XhTourProgressIndicator',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => {\n const api = ctx.api.value\n const dots = Array.from({ length: api.count }, (_, index) =>\n h('div', api.getProgressDotProps({ index }) as Record<string, unknown>))\n return h(\n 'div',\n api.getProgressIndicatorProps() as Record<string, unknown>,\n slots.default?.() ?? dots,\n )\n }\n },\n})\n\nexport const XhTourProgressDot = defineComponent({\n name: 'XhTourProgressDot',\n props: {\n // 圆点对应的步序,0 基;兼收字符串\n index: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props) {\n const ctx = useTourContext()\n return () => h('div', ctx.api.value.getProgressDotProps({ index: Number(props.index) }) as Record<string, unknown>)\n },\n})\n\nexport const XhTourPrevTrigger = defineComponent({\n name: 'XhTourPrevTrigger',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h('button', ctx.api.value.getPrevTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTourNextTrigger = defineComponent({\n name: 'XhTourNextTrigger',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h('button', ctx.api.value.getNextTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTourSkipTrigger = defineComponent({\n name: 'XhTourSkipTrigger',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h('button', ctx.api.value.getSkipTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTourCloseTrigger = defineComponent({\n name: 'XhTourCloseTrigger',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h('button', ctx.api.value.getCloseTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTourArrow = defineComponent({\n name: 'XhTourArrow',\n setup() {\n const ctx = useTourContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tour.js","names":[],"sources":["../../../src/components/tour/tour.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// 提供 tour 相关实现。\n\nimport type { Direction, Placement } from '@xihan-ui/core'\nimport type { TourApi, TourSchema, TourStep } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { provideTour, useTourContext } from './context'\nimport { useTour } from './use-tour'\n\ntype TourProps = TourSchema['props']\n\n/** 默认插槽的载荷:引导的开合与步序状态,以及开关、切换步骤、放弃与校准位置的动作。 */\nexport type TourRootSlotProps = Pick<\n TourApi,\n | 'open'\n | 'value'\n | 'count'\n | 'currentStep'\n | 'firstStep'\n | 'lastStep'\n | 'progressText'\n | 'setOpen'\n | 'setValue'\n | 'goToNextStep'\n | 'goToPrevStep'\n | 'skip'\n | 'remeasure'\n>\n\nexport const XhTourRoot = defineComponent({\n name: 'XhTourRoot',\n // 全部 default: undefined —— 缺省值的唯一事实源在 machine 与 connect\n props: {\n steps: { type: Array as PropType<TourStep[]> },\n value: { type: Number },\n defaultValue: { type: Number },\n open: { type: Boolean, default: undefined },\n defaultOpen: { type: Boolean, default: undefined },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n closeOnEscape: { type: Boolean, default: undefined },\n closeOnInteractOutside: { type: Boolean, default: undefined },\n showBackdrop: { type: Boolean, default: undefined },\n spotlightPadding: { type: Number },\n autoScroll: { type: Boolean, default: undefined },\n /** 目标缺席时等它出现的时长(ms),默认 3000;0 即不等。 */\n targetTimeout: { type: Number },\n translations: { type: Object as PropType<TourProps['translations']> },\n /** 本实例三张 Tour 浮层的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // open-change / value-change 携带对象;update:* 携带裸值,支持 v-model:open 与 v-model:value\n emits: {\n 'open-change': (_details: PayloadOf<TourProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<TourProps, 'onOpenChange'>['open']) => true,\n 'value-change': (_details: PayloadOf<TourProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TourProps, 'onValueChange'>['value']) => true,\n 'complete': (_details: PayloadOf<TourProps, 'onComplete'>) => true,\n 'skip': (_details: PayloadOf<TourProps, 'onSkip'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TourRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useTour(withXhConfig('tour', props) as TourProps, {\n onOpenChange: (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n },\n onValueChange: (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n },\n onComplete: details => emit('complete', details),\n onSkip: details => emit('skip', details),\n }, () => props.container)\n provideTour(ctx)\n // 经插槽暴露状态与走步、放弃等命令,供浮层外的按钮使用\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 count: ctx.api.value.count,\n currentStep: ctx.api.value.currentStep,\n firstStep: ctx.api.value.firstStep,\n lastStep: ctx.api.value.lastStep,\n progressText: ctx.api.value.progressText,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n goToNextStep: ctx.api.value.goToNextStep,\n goToPrevStep: ctx.api.value.goToPrevStep,\n skip: ctx.api.value.skip,\n remeasure: ctx.api.value.remeasure,\n }))\n },\n})\n\nexport const XhTourBackdrop = defineComponent({\n name: 'XhTourBackdrop',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到遮罩上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTourContext()\n // 与浮层同去一个落点:遮罩留在原地就会被面板甩下,两层不再叠在一起\n return () => h(XhPortal, { to: ctx.portalTarget.value, present: ctx.visible.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getBackdropProps() as Record<string, unknown>, attrs),\n // 收起跟着退场闸门走:遮罩的淡出与气泡的退场并行播\n hidden: (!ctx.visible.value || !ctx.showBackdrop()) || undefined,\n ref: (el: unknown) => { ctx.backdropRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhTourSpotlight = defineComponent({\n name: 'XhTourSpotlight',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到高亮框上\n inheritAttrs: false,\n setup(_, { attrs }) {\n const ctx = useTourContext()\n // 高亮框与遮罩是同一层暗幕的两半,必须一起搬\n return () => h(XhPortal, { to: ctx.portalTarget.value, present: ctx.visible.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getSpotlightProps() as Record<string, unknown>, attrs),\n // 收起跟着退场闸门走:高亮框的退场与气泡并行播;居中步照常不画\n hidden: (!ctx.visible.value || !ctx.api.value.anchored) || undefined,\n ref: (el: unknown) => { ctx.spotlightRef.value = el as HTMLElement },\n }),\n ])\n },\n})\n\nexport const XhTourPositioner = defineComponent({\n name: 'XhTourPositioner',\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTourContext()\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: ctx.portalTarget.value, present: ctx.visible.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n // 定位层收起跟着退场闸门走:它先 display:none 的话,里面气泡的退场一帧都播不出来\n hidden: !ctx.visible.value || undefined,\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhTourContent = defineComponent({\n name: 'XhTourContent',\n setup(_, { slots }) {\n const ctx = useTourContext()\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\n// 标题与描述的文字取自步骤声明,有插槽则用插槽\nexport const XhTourTitle = defineComponent({\n name: 'XhTourTitle',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h(\n 'h2',\n ctx.api.value.getTitleProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.currentStep?.title,\n )\n },\n})\n\nexport const XhTourDescription = defineComponent({\n name: 'XhTourDescription',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h(\n 'p',\n ctx.api.value.getDescriptionProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.currentStep?.description,\n )\n },\n})\n\nexport const XhTourProgressText = defineComponent({\n name: 'XhTourProgressText',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h(\n 'span',\n ctx.api.value.getProgressTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.progressText,\n )\n },\n})\n\n/** 圆点组:未提供默认插槽时按步数铺设圆点,作者提供后按作者的内容。 */\nexport const XhTourProgressIndicator = defineComponent({\n name: 'XhTourProgressIndicator',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => {\n const api = ctx.api.value\n const dots = Array.from({ length: api.count }, (_, index) =>\n h('div', api.getProgressDotProps({ index }) as Record<string, unknown>))\n return h(\n 'div',\n api.getProgressIndicatorProps() as Record<string, unknown>,\n slots.default?.() ?? dots,\n )\n }\n },\n})\n\nexport const XhTourProgressDot = defineComponent({\n name: 'XhTourProgressDot',\n props: {\n // 圆点对应的步序,0 基;兼收字符串\n index: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props) {\n const ctx = useTourContext()\n return () => h('div', ctx.api.value.getProgressDotProps({ index: Number(props.index) }) as Record<string, unknown>)\n },\n})\n\nexport const XhTourPrevTrigger = defineComponent({\n name: 'XhTourPrevTrigger',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h('button', ctx.api.value.getPrevTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTourNextTrigger = defineComponent({\n name: 'XhTourNextTrigger',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h('button', ctx.api.value.getNextTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTourSkipTrigger = defineComponent({\n name: 'XhTourSkipTrigger',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h('button', ctx.api.value.getSkipTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTourCloseTrigger = defineComponent({\n name: 'XhTourCloseTrigger',\n setup(_, { slots }) {\n const ctx = useTourContext()\n return () => h('button', ctx.api.value.getCloseTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTourArrow = defineComponent({\n name: 'XhTourArrow',\n setup() {\n const ctx = useTourContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
|
|
@@ -306,7 +306,8 @@ container: { type: Object } },
|
|
|
306
306
|
});
|
|
307
307
|
return () => h(XhPortal, {
|
|
308
308
|
to: props.container ?? ctx.portalTarget.value,
|
|
309
|
-
source: ctx.triggerRef
|
|
309
|
+
source: ctx.triggerRef,
|
|
310
|
+
present: ctx.visible.value
|
|
310
311
|
}, () => [h("div", {
|
|
311
312
|
...mergeProps(ctx.api.value.getPositionerProps(), attrs),
|
|
312
313
|
ref: (el) => {
|
|
@@ -571,8 +572,7 @@ const XhTreeSelectHiddenInput = defineComponent({
|
|
|
571
572
|
setup(_, { attrs }) {
|
|
572
573
|
const ctx = useTreeSelectContext();
|
|
573
574
|
return () => ctx.api.value.value.map((value) => h("input", {
|
|
574
|
-
...ctx.api.value.getHiddenInputProps({ value }),
|
|
575
|
-
...attrs,
|
|
575
|
+
...mergeProps(ctx.api.value.getHiddenInputProps({ value }), attrs),
|
|
576
576
|
key: value
|
|
577
577
|
}));
|
|
578
578
|
}
|