@xihan-ui/vue 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +89 -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/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.map +1 -1
- package/dist/components/date-picker/date-picker.js +1 -0
- package/dist/components/date-picker/date-picker.js.map +1 -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 +1 -0
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/dialog/dialog.d.ts +11 -0
- 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 +11 -0
- 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/floating-panel/floating-panel.d.ts +2 -2
- 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/markdown-stream/markdown-stream.d.ts +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.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/reasoning/reasoning.d.ts +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/sortable/sortable.d.ts +1 -1
- package/dist/components/table/table.d.ts +2 -2
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/time-picker/time-picker.js +2 -1
- 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.d.ts +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/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":"side-nav.js","names":[],"sources":["../../../src/components/side-nav/side-nav.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// 提供 side nav 相关实现。\n\nimport type { Cleanup, Layer, Size, Tone } from '@xihan-ui/core'\nimport type { PresenceHandle } from '@xihan-ui/core/presence'\nimport type { SideNavApi, SideNavFilter, SideNavNode, SideNavSchema, TooltipSchema } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { createScope } from '@xihan-ui/core'\nimport { connectSideNav, findSideNavRowEl, sideNavTooltipProps, tooltipMachine } from '@xihan-ui/headless'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, defineComponent, h, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\nimport { useTooltipGroup } from '../tooltip/context'\nimport { provideSideNav, provideSideNavGroup, provideSideNavItem, provideSideNavNode, useSideNavContext, useSideNavGroupContext, useSideNavItemContext, useSideNavNodeContext } from './context'\nimport { useSideNav } from './use-side-nav'\n\ntype SideNavProps = SideNavSchema['props']\n\n/** 默认插槽的载荷:选中项、展开集合、折叠与浮层状态、检索词与搜索状态、逐节点的状态判定,以及选中、展开、折叠、弹出、改写检索词等命令。 */\nexport type SideNavRootSlotProps = Pick<\n SideNavApi,\n | 'value'\n | 'expandedValue'\n | 'collapsed'\n | 'popoutValue'\n | 'isSelected'\n | 'isExpanded'\n | 'isActiveBranch'\n | 'select'\n | 'setValue'\n | 'setExpandedValue'\n | 'expand'\n | 'collapse'\n | 'openPopout'\n | 'closePopout'\n | 'inputValue'\n | 'setInputValue'\n | 'searching'\n>\n\nexport const XhSideNavRoot = defineComponent({\n name: 'XhSideNavRoot',\n // 缺省值由 connect 与机器给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<SideNavNode[]> },\n value: { type: String as PropType<string | null> },\n defaultValue: { type: String as PropType<string | null> },\n expandedValue: { type: Array as PropType<string[]> },\n defaultExpandedValue: { type: Array as PropType<string[]> },\n accordion: Boolean,\n collapsed: { type: Boolean, default: undefined },\n collapsedPopout: { type: Boolean, default: undefined },\n disabled: Boolean,\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<SideNavProps['dir']> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n /** 搜索框的匹配规则;缺省为标签(缺省退回 value)大小写不敏感包含。 */\n filter: { type: Function as PropType<SideNavFilter> },\n translations: { type: Object as PropType<SideNavProps['translations']> },\n },\n // *-change 携带 details 对象,update:* 携带裸值,支持 v-model:value 与 v-model:expanded-value\n emits: {\n 'value-change': (_details: PayloadOf<SideNavProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SideNavProps, 'onValueChange'>['value']) => true,\n 'expanded-value-change': (_details: PayloadOf<SideNavProps, 'onExpandedValueChange'>) => true,\n 'update:expandedValue': (_value: PayloadOf<SideNavProps, 'onExpandedValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SideNavRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useSideNav(withXhConfig('side-nav', props) as SideNavProps, {\n onValueChange: (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n },\n onExpandedValueChange: (details) => {\n emit('expanded-value-change', details)\n emit('update:expandedValue', details.value)\n },\n })\n provideSideNav(ctx)\n // 经插槽暴露状态与命令,供折叠开关这类外部控件使用\n return () => h('nav', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n expandedValue: ctx.api.value.expandedValue,\n collapsed: ctx.api.value.collapsed,\n popoutValue: ctx.api.value.popoutValue,\n isSelected: ctx.api.value.isSelected,\n isExpanded: ctx.api.value.isExpanded,\n isActiveBranch: ctx.api.value.isActiveBranch,\n select: ctx.api.value.select,\n setValue: ctx.api.value.setValue,\n setExpandedValue: ctx.api.value.setExpandedValue,\n expand: ctx.api.value.expand,\n collapse: ctx.api.value.collapse,\n openPopout: ctx.api.value.openPopout,\n closePopout: ctx.api.value.closePopout,\n inputValue: ctx.api.value.inputValue,\n setInputValue: ctx.api.value.setInputValue,\n searching: ctx.api.value.searching,\n }))\n },\n})\n\nexport const XhSideNavList = defineComponent({\n name: 'XhSideNavList',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n return () => h('ul', ctx.api.value.getListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 搜索框:放在 list 之前,输入即按标签过滤导航树。 */\nexport const XhSideNavInput = defineComponent({\n name: 'XhSideNavInput',\n setup() {\n const ctx = useSideNavContext()\n return () => h('input', ctx.api.value.getInputProps() as Record<string, unknown>)\n },\n})\n\n/** 搜索一条都没命中时露面的占位;没写内容时显示 translations.noMatch。 */\nexport const XhSideNavEmpty = defineComponent({\n name: 'XhSideNavEmpty',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.translations.noMatch)\n },\n})\n\n/** 把一个值登记进所在分组,值变了换一条,卸下时撤销。登记写的是分组的成员表,回调不追踪它,免得自己触发自己。 */\nfunction joinGroup(value: () => string): void {\n const group = useSideNavGroupContext()\n if (!group)\n return\n watch(value, (next, _, onCleanup) => onCleanup(group.join(next)), { immediate: true })\n}\n\n// 叶子行的列表项:列表容器是 ul,链接得裹在 li 里才是它合法的直接子节点。\n// 身份取它包着的那条链接报上来的值:搜索时没命中就整行收起\nexport const XhSideNavItem = defineComponent({\n name: 'XhSideNavItem',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n const linkValue = shallowRef<string | null>(null)\n provideSideNavItem((value) => {\n linkValue.value = value\n })\n return () => h('li', ctx.api.value.getItemProps({ value: linkValue.value ?? undefined }) as Record<string, unknown>, slots.default?.())\n },\n})\n\n// 分组是上一层列表里的一条(li):里面放 group-label 与 group-list,组内的行挂在 group-list 里\nexport const XhSideNavGroup = defineComponent({\n name: 'XhSideNavGroup',\n props: {\n /** 分组身份,group-label 与 group-list 依靠它配对。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSideNavContext()\n // 成员由组里的链接与分支挂上时登记:搜索时一个成员都没命中就整组收起\n const members = shallowRef<readonly string[]>([])\n provideSideNavGroup({\n get value() {\n return props.value\n },\n join: (value) => {\n members.value = [...members.value, value]\n return () => {\n const at = members.value.indexOf(value)\n if (at !== -1)\n members.value = members.value.filter((_, i) => i !== at)\n }\n },\n })\n return () => h('li', ctx.api.value.getGroupProps({ value: props.value, members: members.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavGroupLabel = defineComponent({\n name: 'XhSideNavGroupLabel',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSideNavContext()\n return () => h('div', ctx.api.value.getGroupLabelProps({ value: props.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 分组里的列表:组内的 item 与 branch 挂在这里,以组标题命名;分组身份取自所在的 XhSideNavGroup。 */\nexport const XhSideNavGroupList = defineComponent({\n name: 'XhSideNavGroupList',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n const group = useSideNavGroupContext()\n if (!group)\n throw new Error('[xh] XhSideNavGroupList 必须用在 XhSideNavGroup 内')\n return () => h('ul', ctx.api.value.getGroupListProps({ value: group.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranch = defineComponent({\n name: 'XhSideNavBranch',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSideNavContext()\n provideSideNavNode(props)\n joinGroup(() => props.value)\n return () => h('li', ctx.api.value.getBranchProps({ value: props.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranchTrigger = defineComponent({\n name: 'XhSideNavBranchTrigger',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n const node = useSideNavNodeContext()\n return () => h('button', ctx.api.value.getBranchTriggerProps({ value: node.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranchText = defineComponent({\n name: 'XhSideNavBranchText',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n return () => h('span', ctx.api.value.getBranchTextProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranchIndicator = defineComponent({\n name: 'XhSideNavBranchIndicator',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n const node = useSideNavNodeContext()\n return () => h('span', ctx.api.value.getBranchIndicatorProps({ value: node.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranchContent = defineComponent({\n name: 'XhSideNavBranchContent',\n props: {\n /** 本分支弹层的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n setup(props, { slots }) {\n const ctx = useSideNavContext()\n const node = useSideNavNodeContext()\n // 一个弹出面板一份退场闸门:退场动画挂在面板上,从它身上探测。\n // 开合判据直接取 connect 这一帧的产出,不另起一套\n const panelRef = ref<HTMLElement | null>(null)\n let presence: PresenceHandle | null = null\n const visible = useOverlayExit({\n config: ctx.config,\n isOpen: () => (ctx.api.value.getPopoutPositionerProps({ value: node.value }) as Record<string, unknown>).hidden !== true,\n contentRef: panelRef,\n onPresence: (next) => {\n const previous = presence\n presence = next\n if (ctx.service.getStatus() !== 'Started')\n return\n if (next)\n ctx.service.send({ type: 'PRESENCE.SET', value: node.value, presence: next, connected: true })\n else if (previous)\n ctx.service.send({ type: 'PRESENCE.SET', value: node.value, presence: previous, connected: false })\n },\n })\n onMounted(() => {\n void nextTick(() => {\n if (presence && ctx.service.getStatus() === 'Started')\n ctx.service.send({ type: 'PRESENCE.SET', value: node.value, presence, connected: true })\n })\n })\n return () => {\n if (!ctx.api.value.isPopoutPanel(node.value)) {\n // 平铺分支没有定位层,原地渲染\n return h('ul', ctx.api.value.getBranchContentProps({ value: node.value }) as Record<string, unknown>, slots.default?.())\n }\n // 折叠态的弹出面板:定位层搬到浮层落点,逃开祖先的层叠上下文。\n // 收起跟着退场闸门走:定位层与面板的 hidden 都押后到退场动画播完\n const hidden = !visible.value || undefined\n const content = h('ul', {\n ...ctx.api.value.getBranchContentProps({ value: node.value }) as Record<string, unknown>,\n hidden,\n ref: (el: unknown) => { panelRef.value = el as HTMLElement | null },\n }, slots.default?.())\n return h(XhPortal, { to: props.container ?? ctx.portalTarget.value }, () => [\n h('div', {\n ...ctx.api.value.getPopoutPositionerProps({ value: node.value }) as Record<string, unknown>,\n hidden,\n }, [content]),\n ])\n }\n },\n})\n\n/**\n * 图标栏的名称提示:落成图标栏后,只剩图标的行悬停或聚焦时在行尾一侧显示行的标签。\n * 本体是一台内嵌的 Tooltip 机器(延时、接替窗口、提示组与定位全随 Tooltip),开合受控于侧栏;\n * 放一个即可,定位层搬到浮层落点,文字取 collection 里的标签,对读屏隐藏。\n */\nexport const XhSideNavTooltip = defineComponent({\n name: 'XhSideNavTooltip',\n props: {\n /** 名称提示的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n setup(props) {\n const ctx = useSideNavContext()\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n const hint = useMachine<TooltipSchema>(tooltipMachine, () => sideNavTooltipProps(ctx.service), createScope(null, createVueIdGenerator()))\n // 锚点是提示此刻对着的那一行,现查\n const anchor = (): HTMLElement | null => findSideNavRowEl(ctx.service, ctx.service.context.get('tooltipValue'))\n const config = ctx.config\n if (config) {\n // 提示只参与 Escape 仲裁与栈顶判定:不陷焦点、不锁滚动、没有遮罩;对着的那一行记为本层分支\n hint.refs.set('config', config)\n hint.refs.set('registerLayer', (): { layer: Layer, dispose: Cleanup } => config.layerRegistry.register({\n kind: 'inline',\n node: () => contentRef.value,\n branches: () => [anchor()].filter(Boolean) as Element[],\n isModal: () => false,\n surfaces: () => [],\n }))\n hint.refs.set('position', createPositionEngine())\n }\n hint.refs.set('getAnchorEl', anchor)\n hint.refs.set('getFloatingEl', () => positionerRef.value)\n // 放在 XhTooltipProvider 里就归它那一组,与页面上其余提示共用接替窗口\n hint.refs.set('group', useTooltipGroup())\n const visible = useOverlayExit({\n config,\n isOpen: () => hint.state.matches('visible'),\n contentRef,\n onPresence: presence => hint.refs.set('presence', presence),\n })\n // 交给根:行上的指针与焦点经根的连接层转给这台机器\n ctx.tooltip.value = hint\n onBeforeUnmount(() => {\n if (ctx.tooltip.value === hint)\n ctx.tooltip.value = null\n })\n const api = computed(() => connectSideNav(ctx.service, vueNormalize, hint))\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value }, () => [\n h('div', {\n ...api.value.getTooltipPositionerProps() as Record<string, unknown>,\n ref: (el: unknown) => { positionerRef.value = el as HTMLElement | null },\n }, [\n h('div', {\n ...api.value.getTooltipContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤给 content 声明了 display,真正的收起落成内联 display\n style: visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { contentRef.value = el as HTMLElement | null },\n }, api.value.tooltipText),\n ]),\n ])\n },\n})\n\nexport const XhSideNavLinkText = defineComponent({\n name: 'XhSideNavLinkText',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n return () => h('span', ctx.api.value.getLinkTextProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavLink = defineComponent({\n name: 'XhSideNavLink',\n // 直通属性自己合:作者的处理器排在部件前面,asChild 时连同部件属性一起落到作者的链接上\n inheritAttrs: false,\n props: {\n value: { type: String, required: true },\n /** 借用作者的子节点(如路由链接)作为链接,不再渲染自己的 `<a>`;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = useSideNavContext()\n // 身份报给外面的列表项与分组:搜索时它们据此决定整行、整组收不收\n const reportItem = useSideNavItemContext()\n if (reportItem) {\n watch(() => props.value, next => reportItem(next), { immediate: true })\n onBeforeUnmount(() => reportItem(null))\n }\n joinGroup(() => props.value)\n return () => {\n const part = mergePartProps(ctx.api.value.getLinkProps({ value: props.value }) as Record<string, unknown>, attrs)\n const children = slots.default?.()\n if (props.asChild)\n return mergeIntoChild(children, part, 'side-nav', { applyAnatomy: true })\n return h('a', part, children)\n }\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"side-nav.js","names":[],"sources":["../../../src/components/side-nav/side-nav.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// 提供 side nav 相关实现。\n\nimport type { Cleanup, Layer, Size, Tone } from '@xihan-ui/core'\nimport type { PresenceHandle } from '@xihan-ui/core/presence'\nimport type { SideNavApi, SideNavFilter, SideNavNode, SideNavSchema, TooltipSchema } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { createScope } from '@xihan-ui/core'\nimport { connectSideNav, findSideNavRowEl, sideNavTooltipProps, tooltipMachine } from '@xihan-ui/headless'\nimport { createPositionEngine } from '@xihan-ui/position'\nimport { computed, defineComponent, h, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { useMachine } from '../../runtime/use-machine'\nimport { useOverlayExit } from '../../runtime/use-overlay-exit'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\nimport { useTooltipGroup } from '../tooltip/context'\nimport { provideSideNav, provideSideNavGroup, provideSideNavItem, provideSideNavNode, useSideNavContext, useSideNavGroupContext, useSideNavItemContext, useSideNavNodeContext } from './context'\nimport { useSideNav } from './use-side-nav'\n\ntype SideNavProps = SideNavSchema['props']\n\n/** 默认插槽的载荷:选中项、展开集合、折叠与浮层状态、检索词与搜索状态、逐节点的状态判定,以及选中、展开、折叠、弹出、改写检索词等命令。 */\nexport type SideNavRootSlotProps = Pick<\n SideNavApi,\n | 'value'\n | 'expandedValue'\n | 'collapsed'\n | 'popoutValue'\n | 'isSelected'\n | 'isExpanded'\n | 'isActiveBranch'\n | 'select'\n | 'setValue'\n | 'setExpandedValue'\n | 'expand'\n | 'collapse'\n | 'openPopout'\n | 'closePopout'\n | 'inputValue'\n | 'setInputValue'\n | 'searching'\n>\n\nexport const XhSideNavRoot = defineComponent({\n name: 'XhSideNavRoot',\n // 缺省值由 connect 与机器给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<SideNavNode[]> },\n value: { type: String as PropType<string | null> },\n defaultValue: { type: String as PropType<string | null> },\n expandedValue: { type: Array as PropType<string[]> },\n defaultExpandedValue: { type: Array as PropType<string[]> },\n accordion: Boolean,\n collapsed: { type: Boolean, default: undefined },\n collapsedPopout: { type: Boolean, default: undefined },\n disabled: Boolean,\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<SideNavProps['dir']> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n /** 搜索框的匹配规则;缺省为标签(缺省退回 value)大小写不敏感包含。 */\n filter: { type: Function as PropType<SideNavFilter> },\n translations: { type: Object as PropType<SideNavProps['translations']> },\n },\n // *-change 携带 details 对象,update:* 携带裸值,支持 v-model:value 与 v-model:expanded-value\n emits: {\n 'value-change': (_details: PayloadOf<SideNavProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SideNavProps, 'onValueChange'>['value']) => true,\n 'expanded-value-change': (_details: PayloadOf<SideNavProps, 'onExpandedValueChange'>) => true,\n 'update:expandedValue': (_value: PayloadOf<SideNavProps, 'onExpandedValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SideNavRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useSideNav(withXhConfig('side-nav', props) as SideNavProps, {\n onValueChange: (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n },\n onExpandedValueChange: (details) => {\n emit('expanded-value-change', details)\n emit('update:expandedValue', details.value)\n },\n })\n provideSideNav(ctx)\n // 经插槽暴露状态与命令,供折叠开关这类外部控件使用\n return () => h('nav', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n expandedValue: ctx.api.value.expandedValue,\n collapsed: ctx.api.value.collapsed,\n popoutValue: ctx.api.value.popoutValue,\n isSelected: ctx.api.value.isSelected,\n isExpanded: ctx.api.value.isExpanded,\n isActiveBranch: ctx.api.value.isActiveBranch,\n select: ctx.api.value.select,\n setValue: ctx.api.value.setValue,\n setExpandedValue: ctx.api.value.setExpandedValue,\n expand: ctx.api.value.expand,\n collapse: ctx.api.value.collapse,\n openPopout: ctx.api.value.openPopout,\n closePopout: ctx.api.value.closePopout,\n inputValue: ctx.api.value.inputValue,\n setInputValue: ctx.api.value.setInputValue,\n searching: ctx.api.value.searching,\n }))\n },\n})\n\nexport const XhSideNavList = defineComponent({\n name: 'XhSideNavList',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n return () => h('ul', ctx.api.value.getListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 搜索框:放在 list 之前,输入即按标签过滤导航树。 */\nexport const XhSideNavInput = defineComponent({\n name: 'XhSideNavInput',\n setup() {\n const ctx = useSideNavContext()\n return () => h('input', ctx.api.value.getInputProps() as Record<string, unknown>)\n },\n})\n\n/** 搜索一条都没命中时露面的占位;没写内容时显示 translations.noMatch。 */\nexport const XhSideNavEmpty = defineComponent({\n name: 'XhSideNavEmpty',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.translations.noMatch)\n },\n})\n\n/** 把一个值登记进所在分组,值变了换一条,卸下时撤销。登记写的是分组的成员表,回调不追踪它,免得自己触发自己。 */\nfunction joinGroup(value: () => string): void {\n const group = useSideNavGroupContext()\n if (!group)\n return\n watch(value, (next, _, onCleanup) => onCleanup(group.join(next)), { immediate: true })\n}\n\n// 叶子行的列表项:列表容器是 ul,链接得裹在 li 里才是它合法的直接子节点。\n// 身份取它包着的那条链接报上来的值:搜索时没命中就整行收起\nexport const XhSideNavItem = defineComponent({\n name: 'XhSideNavItem',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n const linkValue = shallowRef<string | null>(null)\n provideSideNavItem((value) => {\n linkValue.value = value\n })\n return () => h('li', ctx.api.value.getItemProps({ value: linkValue.value ?? undefined }) as Record<string, unknown>, slots.default?.())\n },\n})\n\n// 分组是上一层列表里的一条(li):里面放 group-label 与 group-list,组内的行挂在 group-list 里\nexport const XhSideNavGroup = defineComponent({\n name: 'XhSideNavGroup',\n props: {\n /** 分组身份,group-label 与 group-list 依靠它配对。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSideNavContext()\n // 成员由组里的链接与分支挂上时登记:搜索时一个成员都没命中就整组收起\n const members = shallowRef<readonly string[]>([])\n provideSideNavGroup({\n get value() {\n return props.value\n },\n join: (value) => {\n members.value = [...members.value, value]\n return () => {\n const at = members.value.indexOf(value)\n if (at !== -1)\n members.value = members.value.filter((_, i) => i !== at)\n }\n },\n })\n return () => h('li', ctx.api.value.getGroupProps({ value: props.value, members: members.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavGroupLabel = defineComponent({\n name: 'XhSideNavGroupLabel',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSideNavContext()\n return () => h('div', ctx.api.value.getGroupLabelProps({ value: props.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 分组里的列表:组内的 item 与 branch 挂在这里,以组标题命名;分组身份取自所在的 XhSideNavGroup。 */\nexport const XhSideNavGroupList = defineComponent({\n name: 'XhSideNavGroupList',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n const group = useSideNavGroupContext()\n if (!group)\n throw new Error('[xh] XhSideNavGroupList 必须用在 XhSideNavGroup 内')\n return () => h('ul', ctx.api.value.getGroupListProps({ value: group.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranch = defineComponent({\n name: 'XhSideNavBranch',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useSideNavContext()\n provideSideNavNode(props)\n joinGroup(() => props.value)\n return () => h('li', ctx.api.value.getBranchProps({ value: props.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranchTrigger = defineComponent({\n name: 'XhSideNavBranchTrigger',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n const node = useSideNavNodeContext()\n return () => h('button', ctx.api.value.getBranchTriggerProps({ value: node.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranchText = defineComponent({\n name: 'XhSideNavBranchText',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n return () => h('span', ctx.api.value.getBranchTextProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranchIndicator = defineComponent({\n name: 'XhSideNavBranchIndicator',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n const node = useSideNavNodeContext()\n return () => h('span', ctx.api.value.getBranchIndicatorProps({ value: node.value }) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavBranchContent = defineComponent({\n name: 'XhSideNavBranchContent',\n props: {\n /** 本分支弹层的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n setup(props, { slots }) {\n const ctx = useSideNavContext()\n const node = useSideNavNodeContext()\n // 一个弹出面板一份退场闸门:退场动画挂在面板上,从它身上探测。\n // 开合判据直接取 connect 这一帧的产出,不另起一套\n const panelRef = ref<HTMLElement | null>(null)\n let presence: PresenceHandle | null = null\n const visible = useOverlayExit({\n config: ctx.config,\n isOpen: () => (ctx.api.value.getPopoutPositionerProps({ value: node.value }) as Record<string, unknown>).hidden !== true,\n contentRef: panelRef,\n onPresence: (next) => {\n const previous = presence\n presence = next\n if (ctx.service.getStatus() !== 'Started')\n return\n if (next)\n ctx.service.send({ type: 'PRESENCE.SET', value: node.value, presence: next, connected: true })\n else if (previous)\n ctx.service.send({ type: 'PRESENCE.SET', value: node.value, presence: previous, connected: false })\n },\n })\n onMounted(() => {\n void nextTick(() => {\n if (presence && ctx.service.getStatus() === 'Started')\n ctx.service.send({ type: 'PRESENCE.SET', value: node.value, presence, connected: true })\n })\n })\n return () => {\n if (!ctx.api.value.isPopoutPanel(node.value)) {\n // 平铺分支没有定位层,原地渲染\n return h('ul', ctx.api.value.getBranchContentProps({ value: node.value }) as Record<string, unknown>, slots.default?.())\n }\n // 折叠态的弹出面板:定位层搬到浮层落点,逃开祖先的层叠上下文。\n // 收起跟着退场闸门走:定位层与面板的 hidden 都押后到退场动画播完\n const hidden = !visible.value || undefined\n const content = h('ul', {\n ...ctx.api.value.getBranchContentProps({ value: node.value }) as Record<string, unknown>,\n hidden,\n ref: (el: unknown) => { panelRef.value = el as HTMLElement | null },\n }, slots.default?.())\n // 关着的弹出面板不建视觉桥:折叠态下每个分支各有一个定位层\n return h(XhPortal, { to: props.container ?? ctx.portalTarget.value, present: visible.value }, () => [\n h('div', {\n ...ctx.api.value.getPopoutPositionerProps({ value: node.value }) as Record<string, unknown>,\n hidden,\n }, [content]),\n ])\n }\n },\n})\n\n/**\n * 图标栏的名称提示:落成图标栏后,只剩图标的行悬停或聚焦时在行尾一侧显示行的标签。\n * 本体是一台内嵌的 Tooltip 机器(延时、接替窗口、提示组与定位全随 Tooltip),开合受控于侧栏;\n * 放一个即可,定位层搬到浮层落点,文字取 collection 里的标签,对读屏隐藏。\n */\nexport const XhSideNavTooltip = defineComponent({\n name: 'XhSideNavTooltip',\n props: {\n /** 名称提示的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n setup(props) {\n const ctx = useSideNavContext()\n const positionerRef = ref<HTMLElement | null>(null)\n const contentRef = ref<HTMLElement | null>(null)\n const hint = useMachine<TooltipSchema>(tooltipMachine, () => sideNavTooltipProps(ctx.service), createScope(null, createVueIdGenerator()))\n // 锚点是提示此刻对着的那一行,现查\n const anchor = (): HTMLElement | null => findSideNavRowEl(ctx.service, ctx.service.context.get('tooltipValue'))\n const config = ctx.config\n if (config) {\n // 提示只参与 Escape 仲裁与栈顶判定:不陷焦点、不锁滚动、没有遮罩;对着的那一行记为本层分支\n hint.refs.set('config', config)\n hint.refs.set('registerLayer', (): { layer: Layer, dispose: Cleanup } => config.layerRegistry.register({\n kind: 'inline',\n node: () => contentRef.value,\n branches: () => [anchor()].filter(Boolean) as Element[],\n isModal: () => false,\n surfaces: () => [],\n }))\n hint.refs.set('position', createPositionEngine())\n }\n hint.refs.set('getAnchorEl', anchor)\n hint.refs.set('getFloatingEl', () => positionerRef.value)\n // 放在 XhTooltipProvider 里就归它那一组,与页面上其余提示共用接替窗口\n hint.refs.set('group', useTooltipGroup())\n const visible = useOverlayExit({\n config,\n isOpen: () => hint.state.matches('visible'),\n contentRef,\n onPresence: presence => hint.refs.set('presence', presence),\n })\n // 交给根:行上的指针与焦点经根的连接层转给这台机器\n ctx.tooltip.value = hint\n onBeforeUnmount(() => {\n if (ctx.tooltip.value === hint)\n ctx.tooltip.value = null\n })\n const api = computed(() => connectSideNav(ctx.service, vueNormalize, hint))\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, present: visible.value }, () => [\n h('div', {\n ...api.value.getTooltipPositionerProps() as Record<string, unknown>,\n ref: (el: unknown) => { positionerRef.value = el as HTMLElement | null },\n }, [\n h('div', {\n ...api.value.getTooltipContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤给 content 声明了 display,真正的收起落成内联 display\n style: visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { contentRef.value = el as HTMLElement | null },\n }, api.value.tooltipText),\n ]),\n ])\n },\n})\n\nexport const XhSideNavLinkText = defineComponent({\n name: 'XhSideNavLinkText',\n setup(_, { slots }) {\n const ctx = useSideNavContext()\n return () => h('span', ctx.api.value.getLinkTextProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSideNavLink = defineComponent({\n name: 'XhSideNavLink',\n // 直通属性自己合:作者的处理器排在部件前面,asChild 时连同部件属性一起落到作者的链接上\n inheritAttrs: false,\n props: {\n value: { type: String, required: true },\n /** 借用作者的子节点(如路由链接)作为链接,不再渲染自己的 `<a>`;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = useSideNavContext()\n // 身份报给外面的列表项与分组:搜索时它们据此决定整行、整组收不收\n const reportItem = useSideNavItemContext()\n if (reportItem) {\n watch(() => props.value, next => reportItem(next), { immediate: true })\n onBeforeUnmount(() => reportItem(null))\n }\n joinGroup(() => props.value)\n return () => {\n const part = mergePartProps(ctx.api.value.getLinkProps({ value: props.value }) as Record<string, unknown>, attrs)\n const children = slots.default?.()\n if (props.asChild)\n return mergeIntoChild(children, part, 'side-nav', { applyAnatomy: true })\n return h('a', part, children)\n }\n },\n})\n"],"mappings":"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"}
|
|
@@ -95,8 +95,8 @@ declare const XhSortableRoot: import("vue").DefineComponent<import("vue").Extrac
|
|
|
95
95
|
"onUpdate:ids"?: ((_ids: string[]) => any) | undefined;
|
|
96
96
|
}>, {
|
|
97
97
|
disabled: boolean;
|
|
98
|
-
autoScroll: boolean;
|
|
99
98
|
ids: string[];
|
|
99
|
+
autoScroll: boolean;
|
|
100
100
|
}, SlotsType<{
|
|
101
101
|
default?: (props: SortableRootSlotProps) => VNode[];
|
|
102
102
|
}>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -214,14 +214,14 @@ declare const XhTableRoot: import("vue").DefineComponent<import("vue").ExtractPr
|
|
|
214
214
|
}>> & Readonly<{
|
|
215
215
|
"onExpanded-value-change"?: ((_details: import("@xihan-ui/headless").TableExpandedValueChangeDetails) => any) | undefined;
|
|
216
216
|
"onUpdate:expandedValue"?: ((_value: string[]) => any) | undefined;
|
|
217
|
-
"onSelection-change"?: ((_details: import("@xihan-ui/headless").TableSelectionChangeDetails) => any) | undefined;
|
|
218
|
-
"onUpdate:selection"?: ((_selection: TableSelection) => any) | undefined;
|
|
219
217
|
"onColumn-preference-change"?: ((_details: {
|
|
220
218
|
value: TableColumnPreference;
|
|
221
219
|
}) => any) | undefined;
|
|
222
220
|
"onUpdate:columnPreference"?: ((_value: TableColumnPreference) => any) | undefined;
|
|
223
221
|
"onSort-change"?: ((_details: import("@xihan-ui/headless").TableSortChangeDetails) => any) | undefined;
|
|
224
222
|
"onUpdate:sort"?: ((_sort: TableSortDescriptor[]) => any) | undefined;
|
|
223
|
+
"onSelection-change"?: ((_details: import("@xihan-ui/headless").TableSelectionChangeDetails) => any) | undefined;
|
|
224
|
+
"onUpdate:selection"?: ((_selection: TableSelection) => any) | undefined;
|
|
225
225
|
"onRow-move"?: ((_details: import("@xihan-ui/headless").TableRowMoveDetails) => any) | undefined;
|
|
226
226
|
}>, {
|
|
227
227
|
footer: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","names":[],"sources":["../../../src/components/table/table.ts"],"mappings":";;;;;KA0CK,aAAa;;KAyBN,qBAAqB,KAC/B;;;;;KAoCU,wBAAwB,KAClC;cAiBW,2BAAW,8BAAA;;IAIM,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACD,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACrB,MAAA,SAAS;;;;IAEZ,MAAA,SAAS;;;;IAER,MAAA,SAAS;;;;;;;;IAGL,MAAA,SAAS;;;;IAEZ,MAAA,SAAS;;;;;IAGL,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;IAGpB,MAAA;;;IACO,MAAA;;;;;;;;;;IAKZ,MAAA,SAAS;;;;;;;;IAMF,MAAA,SAAS;;;;;;;IAEpB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;EAIF,6BAAA;IAAE,OAAO;;EACZ,4BAAA,QAAA;EACV,gBAAA,UAAA,UAAU;EACb,gBAAA,OAAA,UAAU;EACF,qBAAA,UAAA,UAAU;EACR,qBAAA,YAAA,UAAU;EACP,0BAAA,UAAA,UAAU;EACb,yBAAA,QAAA,UAAU;EAEpB,aAAA,UAAA,UAAU;;;IAnDP,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACD,MAAA,SAAS;;;IACF,MAAA,SAAS;;;IACrB,MAAA,SAAS;;;;IAEZ,MAAA,SAAS;;;;IAER,MAAA,SAAS;;;;;;;;IAGL,MAAA,SAAS;;;;IAEZ,MAAA,SAAS;;;;;IAGL,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;IAGpB,MAAA;;;IACO,MAAA;;;;;;;;;;IAKZ,MAAA,SAAS;;;;;;;;IAMF,MAAA,SAAS;;;;;;;IAEpB,MAAA,SAAS;;;IACR,MAAA,SAAS;;;IACD,MAAA,SAAS
|
|
1
|
+
{"version":3,"file":"table.d.ts","names":[],"sources":["../../../src/components/table/table.ts"],"mappings":"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"}
|
|
@@ -229,7 +229,8 @@ container: { type: Object } },
|
|
|
229
229
|
const ctx = useTimePickerContext();
|
|
230
230
|
return () => h(XhPortal, {
|
|
231
231
|
to: props.container ?? ctx.portalTarget.value,
|
|
232
|
-
source: ctx.controlRef
|
|
232
|
+
source: ctx.controlRef,
|
|
233
|
+
present: ctx.visible.value
|
|
233
234
|
}, () => [h("div", {
|
|
234
235
|
...mergeProps(ctx.api.value.getPositionerProps(), attrs),
|
|
235
236
|
ref: (el) => {
|
|
@@ -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 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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"}
|
|
@@ -143,8 +143,8 @@ declare const XhTourRoot: import("vue").DefineComponent<import("vue").ExtractPro
|
|
|
143
143
|
defaultOpen: boolean;
|
|
144
144
|
closeOnEscape: boolean;
|
|
145
145
|
closeOnInteractOutside: boolean;
|
|
146
|
-
showBackdrop: boolean;
|
|
147
146
|
autoScroll: boolean;
|
|
147
|
+
showBackdrop: boolean;
|
|
148
148
|
}, SlotsType<{
|
|
149
149
|
default?: (props: TourRootSlotProps) => VNode[];
|
|
150
150
|
}>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -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) => {
|