@xihan-ui/vue 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +259 -0
- package/README.md +1 -1
- package/dist/components/anchor/anchor.d.ts +1 -1
- package/dist/components/back-top/back-top.d.ts +1 -1
- package/dist/components/calendar/calendar.d.ts +1 -1
- package/dist/components/carousel/carousel.d.ts +1 -1
- package/dist/components/cascader/cascader.d.ts +6 -6
- package/dist/components/color-picker/color-picker.d.ts +2 -2
- package/dist/components/combobox/combobox.d.ts +5 -5
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/combobox.js +2 -1
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/context-menu/context-menu.d.ts +2 -2
- package/dist/components/date-field/date-field.d.ts +2 -2
- package/dist/components/date-picker/date-picker.d.ts +5 -5
- package/dist/components/date-picker/date-picker.d.ts.map +1 -1
- package/dist/components/descriptions/descriptions.d.ts +1 -1
- package/dist/components/dialog/dialog.d.ts +1 -1
- package/dist/components/drawer/drawer.d.ts +2 -2
- package/dist/components/float-button/float-button.d.ts +3 -3
- package/dist/components/floating-panel/floating-panel.d.ts +2 -2
- package/dist/components/form/form.d.ts +1 -1
- package/dist/components/hotkeys/hotkeys.d.ts +1 -1
- package/dist/components/hover-card/hover-card.d.ts +1 -1
- package/dist/components/image-viewer/image-viewer.d.ts +3 -3
- package/dist/components/json-viewer/json-viewer.d.ts +1 -1
- package/dist/components/list/list.d.ts +1 -1
- package/dist/components/listbox/listbox.d.ts +1 -1
- package/dist/components/mention/mention.d.ts +4 -4
- package/dist/components/menu/menu.d.ts +2 -2
- package/dist/components/notification/notification.d.ts +2 -2
- package/dist/components/number-animation/number-animation.d.ts +1 -1
- package/dist/components/number-field/number-field.d.ts +2 -2
- package/dist/components/pagination/pagination.d.ts +1 -1
- package/dist/components/password-input/password-input.d.ts +2 -2
- package/dist/components/pin-input/pin-input.d.ts +1 -1
- package/dist/components/popconfirm/popconfirm.d.ts +1 -1
- package/dist/components/popover/popover.d.ts +2 -2
- package/dist/components/popselect/popselect.d.ts +3 -3
- package/dist/components/popselect/popselect.d.ts.map +1 -1
- package/dist/components/popselect/popselect.js +2 -1
- package/dist/components/popselect/popselect.js.map +1 -1
- package/dist/components/resizable/context.d.ts +7 -0
- package/dist/components/resizable/context.d.ts.map +1 -0
- package/dist/components/resizable/context.js +15 -0
- package/dist/components/resizable/context.js.map +1 -0
- package/dist/components/resizable/resizable.d.ts +174 -0
- package/dist/components/resizable/resizable.d.ts.map +1 -0
- package/dist/components/resizable/resizable.js +108 -0
- package/dist/components/resizable/resizable.js.map +1 -0
- package/dist/components/resizable/use-resizable.d.ts +14 -0
- package/dist/components/resizable/use-resizable.d.ts.map +1 -0
- package/dist/components/resizable/use-resizable.js +25 -0
- package/dist/components/resizable/use-resizable.js.map +1 -0
- package/dist/components/select/select.d.ts +4 -4
- package/dist/components/side-nav/side-nav.d.ts +2 -2
- package/dist/components/slider/slider.d.ts +1 -1
- package/dist/components/sortable/context.d.ts +7 -0
- package/dist/components/sortable/context.d.ts.map +1 -0
- package/dist/components/sortable/context.js +15 -0
- package/dist/components/sortable/context.js.map +1 -0
- package/dist/components/sortable/sortable.d.ts +166 -0
- package/dist/components/sortable/sortable.d.ts.map +1 -0
- package/dist/components/sortable/sortable.js +128 -0
- package/dist/components/sortable/sortable.js.map +1 -0
- package/dist/components/sortable/use-sortable.d.ts +14 -0
- package/dist/components/sortable/use-sortable.d.ts.map +1 -0
- package/dist/components/sortable/use-sortable.js +26 -0
- package/dist/components/sortable/use-sortable.js.map +1 -0
- package/dist/components/steps/steps.d.ts +1 -1
- package/dist/components/switch/switch.d.ts +1 -1
- package/dist/components/table/table.d.ts +48 -4
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/table/table.js +58 -8
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/use-table.d.ts +1 -1
- package/dist/components/table/use-table.d.ts.map +1 -1
- package/dist/components/table/use-table.js +3 -2
- package/dist/components/table/use-table.js.map +1 -1
- package/dist/components/tabs/tabs.d.ts +47 -2
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/components/tabs/tabs.js +45 -3
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tabs/use-tabs.d.ts +1 -1
- package/dist/components/tabs/use-tabs.d.ts.map +1 -1
- package/dist/components/tabs/use-tabs.js +3 -2
- package/dist/components/tabs/use-tabs.js.map +1 -1
- package/dist/components/tags-input/tags-input.d.ts +3 -3
- package/dist/components/text-field/text-field.d.ts +1 -1
- package/dist/components/text-field/text-field.d.ts.map +1 -1
- package/dist/components/text-field/text-field.js +2 -1
- package/dist/components/text-field/text-field.js.map +1 -1
- package/dist/components/time-field/time-field.d.ts +2 -2
- package/dist/components/time-picker/time-picker.d.ts +5 -5
- package/dist/components/toast/toast.d.ts +1 -1
- package/dist/components/tooltip/tooltip.d.ts +1 -1
- package/dist/components/tour/tour.d.ts +4 -4
- package/dist/components/tree/tree.d.ts +46 -2
- package/dist/components/tree/tree.d.ts.map +1 -1
- package/dist/components/tree/tree.js +45 -3
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree/use-tree.d.ts +1 -1
- package/dist/components/tree/use-tree.d.ts.map +1 -1
- package/dist/components/tree/use-tree.js +3 -2
- package/dist/components/tree/use-tree.js.map +1 -1
- package/dist/components/tree-select/tree-select.d.ts +5 -5
- package/dist/index.d.ts +10 -4
- package/dist/index.js +10 -4
- package/dist/package.js +1 -1
- package/package.json +15 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","names":[],"sources":["../../../src/components/tabs/tabs.ts"],"sourcesContent":["import type { TabsActivationMode, TabsNode, TabsNodeMeta, TabsSchema, TabsVariant } from '@xihan-ui/headless'\nimport type { Direction, Orientation, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { slotPaints } from '../../runtime/slot-content'\nimport { provideTabs, useTabsContext } from './context'\nimport { useTabs } from './use-tabs'\n\ntype TabsProps = TabsSchema['props']\n\nexport const XhTabsRoot = defineComponent({\n name: 'XhTabsRoot',\n // 全部 default: undefined,缺省值由 connect 决定\n props: {\n collection: { type: Array as PropType<TabsNode[]>, default: undefined },\n value: { type: String as PropType<string | null>, default: undefined },\n defaultValue: { type: String as PropType<string | null>, default: undefined },\n orientation: { type: String as PropType<Orientation>, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n activationMode: { type: String as PropType<TabsActivationMode>, default: undefined },\n loop: { type: Boolean, default: undefined },\n variant: { type: String as PropType<TabsVariant>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n },\n // value-change 携带 { value },update:value 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<TabsProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TabsProps, 'onValueChange'>['value']) => true,\n },\n setup(props, { slots, emit }) {\n const notify: TabsProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useTabs(props as TabsProps, notify)\n provideTabs(ctx)\n return () => {\n // 默认插槽里有真内容就照旧交给作者;只剩注释或空白时当没写,给了 collection 就按数据铺开整套结构\n const authored = slots.default?.()\n const children = slotPaints(authored)\n ? authored\n : (props.collection ? renderDefaultTree(ctx.api.value.collection, slots.panel) : undefined)\n return h('div', ctx.api.value.getRootProps() as Record<string, unknown>, children)\n }\n },\n})\n\nexport const XhTabsList = defineComponent({\n name: 'XhTabsList',\n setup(_, { slots }) {\n const ctx = useTabsContext()\n return () => h('div', ctx.api.value.getListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTabsTrigger = defineComponent({\n name: 'XhTabsTrigger',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useTabsContext()\n // 本节点持有焦点时,value 变更重报焦点标签,卸载时上报列表失焦\n const itemEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const svc = ctx.service\n if (svc.getStatus() !== 'Started')\n return\n if (itemEl.value && svc.scope.getActiveElement() === itemEl.value)\n svc.send({ type: 'TRIGGER.FOCUS', value: next })\n })\n onBeforeUnmount(() => {\n if (ctx.service.getStatus() !== 'Started')\n return\n // 按「本节点当下正持有焦点」判定,不按 value 比对\n if (itemEl.value && ctx.service.scope.getActiveElement() === itemEl.value)\n ctx.service.send({ type: 'LIST.BLUR' })\n })\n return () => h(\n 'button',\n { ...ctx.api.value.getTriggerProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\nexport const XhTabsContent = defineComponent({\n name: 'XhTabsContent',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTabsContext()\n return () => h(\n 'div',\n ctx.api.value.getContentProps({ value: props.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\n/**\n * 没写默认插槽时按 collection 铺开的整套结构,作者只交数据。\n * 与手写部件产出的 DOM 完全一致,要改结构就写默认插槽,行为不变。\n * 面板内容走 panel 插槽,没写就是空面板。\n */\nfunction renderDefaultTree(\n collection: readonly TabsNodeMeta[],\n panelSlot?: (node: TabsNodeMeta) => VNode[],\n): VNode[] {\n return [\n h(XhTabsList, null, () => collection.map(node =>\n h(XhTabsTrigger, { key: node.value, value: node.value }, () => node.label),\n )),\n ...collection.map(node =>\n h(XhTabsContent, { key: node.value, value: node.value }, () => panelSlot?.(node) ?? []),\n ),\n ]\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"tabs.js","names":[],"sources":["../../../src/components/tabs/tabs.ts"],"sourcesContent":["import type { TabsActivationMode, TabsNode, TabsNodeMeta, TabsSchema, TabsVariant } from '@xihan-ui/headless'\nimport type { Direction, Orientation, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { slotPaints } from '../../runtime/slot-content'\nimport { provideTabs, useTabsContext } from './context'\nimport { useTabs } from './use-tabs'\n\ntype TabsProps = TabsSchema['props']\n\nexport const XhTabsRoot = defineComponent({\n name: 'XhTabsRoot',\n // 全部 default: undefined,缺省值由 connect 决定\n props: {\n collection: { type: Array as PropType<TabsNode[]>, default: undefined },\n value: { type: String as PropType<string | null>, default: undefined },\n defaultValue: { type: String as PropType<string | null>, default: undefined },\n orientation: { type: String as PropType<Orientation>, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n activationMode: { type: String as PropType<TabsActivationMode>, default: undefined },\n loop: { type: Boolean, default: undefined },\n variant: { type: String as PropType<TabsVariant>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n /** 标签可以拖着换位。整个标签都是拖动源,不另出把手。 */\n reorderable: Boolean,\n translations: { type: Object as PropType<TabsProps['translations']>, default: undefined },\n },\n // value-change 携带 { value },update:value 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<TabsProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TabsProps, 'onValueChange'>['value']) => true,\n // 换位是通知,标签序的真源在使用者的数据里,故没有配对的 update:*\n 'tab-move': (_details: PayloadOf<TabsProps, 'onTabMove'>) => true,\n },\n setup(props, { slots, emit }) {\n const notify: TabsProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n // 监听器不进 props 对象,故作为位置参数交给 useTabs,不能指望 { ...props } 带上\n const onTabMove: TabsProps['onTabMove'] = (details) => {\n emit('tab-move', details)\n }\n const ctx = useTabs(withXhConfig('tabs', props) as TabsProps, notify, onTabMove)\n provideTabs(ctx)\n return () => {\n // 默认插槽里有真内容就照旧交给作者;只剩注释或空白时当没写,给了 collection 就按数据铺开整套结构\n const authored = slots.default?.()\n const children = slotPaints(authored)\n ? authored\n : (props.collection ? renderDefaultTree(ctx.api.value.collection, slots.panel) : undefined)\n return h('div', ctx.api.value.getRootProps() as Record<string, unknown>, children)\n }\n },\n})\n\nexport const XhTabsList = defineComponent({\n name: 'XhTabsList',\n setup(_, { slots }) {\n const ctx = useTabsContext()\n return () => h('div', ctx.api.value.getListProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 拖动过程的读屏播报区,视觉上不可见。\n *\n * 放在 root 里、与 list 部件平级。它必须在拖动开始**之前**就在 DOM 上——\n * 读屏不播报后插入的节点,等到拖起才渲出来等于没有。\n */\nexport const XhTabsLiveRegion = defineComponent({\n name: 'XhTabsLiveRegion',\n setup() {\n const ctx = useTabsContext()\n return () => h(\n 'div',\n ctx.api.value.getLiveRegionProps() as Record<string, unknown>,\n ctx.service.context.get('announcement'),\n )\n },\n})\n\nexport const XhTabsTrigger = defineComponent({\n name: 'XhTabsTrigger',\n props: {\n value: { type: String, required: true },\n // 缺省交给 connect 回 collection 里查,写死 false 会盖掉数据里的禁用\n disabled: { type: Boolean, default: undefined },\n },\n setup(props, { slots }) {\n const ctx = useTabsContext()\n // 本节点持有焦点时,value 变更重报焦点标签,卸载时上报列表失焦\n const itemEl = ref<HTMLElement | null>(null)\n watch(() => props.value, (next, prev) => {\n if (next === prev)\n return\n const svc = ctx.service\n if (svc.getStatus() !== 'Started')\n return\n if (itemEl.value && svc.scope.getActiveElement() === itemEl.value)\n svc.send({ type: 'TRIGGER.FOCUS', value: next })\n })\n onBeforeUnmount(() => {\n if (ctx.service.getStatus() !== 'Started')\n return\n // 按「本节点当下正持有焦点」判定,不按 value 比对\n if (itemEl.value && ctx.service.scope.getActiveElement() === itemEl.value)\n ctx.service.send({ type: 'LIST.BLUR' })\n })\n return () => h(\n 'button',\n { ...ctx.api.value.getTriggerProps({ value: props.value, disabled: props.disabled }) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\n/**\n * 标签拖拽把手。放在标签里,自带 touch-action: none,按下即拖,不等激活距离。\n * 对读屏隐藏、也不占 Tab 位;键盘换位由标签带上的 Alt + 方向键承担。\n * 整个标签起手那一路照旧可用,把手是叠加的第二个入口。\n */\nexport const XhTabsTabDragTrigger = defineComponent({\n name: 'XhTabsTabDragTrigger',\n props: {\n /** 所属标签的 value。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTabsContext()\n return () => h(\n 'span',\n ctx.api.value.getTabDragTriggerProps({ value: props.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhTabsContent = defineComponent({\n name: 'XhTabsContent',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTabsContext()\n return () => h(\n 'div',\n ctx.api.value.getContentProps({ value: props.value }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\n/**\n * 没写默认插槽时按 collection 铺开的整套结构,作者只交数据。\n * 与手写部件产出的 DOM 完全一致,要改结构就写默认插槽,行为不变。\n * 面板内容走 panel 插槽,没写就是空面板。\n */\nfunction renderDefaultTree(\n collection: readonly TabsNodeMeta[],\n panelSlot?: (node: TabsNodeMeta) => VNode[],\n): VNode[] {\n return [\n h(XhTabsList, null, () => collection.map(node =>\n h(XhTabsTrigger, { key: node.value, value: node.value }, () => node.label),\n )),\n ...collection.map(node =>\n h(XhTabsContent, { key: node.value, value: node.value }, () => panelSlot?.(node) ?? []),\n ),\n ]\n}\n"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ interface TabsContext {
|
|
|
7
7
|
/** 机器实例,供部件上报 DOM 侧的事实(如条目卸载带走了焦点)。 */
|
|
8
8
|
service: Service<TabsSchema>;
|
|
9
9
|
}
|
|
10
|
-
declare function useTabs(props: TabsSchema['props'], onValueChange?: TabsSchema['props']['onValueChange']): TabsContext;
|
|
10
|
+
declare function useTabs(props: TabsSchema['props'], onValueChange?: TabsSchema['props']['onValueChange'], onTabMove?: TabsSchema['props']['onTabMove']): TabsContext;
|
|
11
11
|
//#endregion
|
|
12
12
|
export { TabsContext, useTabs };
|
|
13
13
|
//# sourceMappingURL=use-tabs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tabs.d.ts","names":[],"sources":["../../../src/components/tabs/use-tabs.ts"],"mappings":";;;;UAUiB;EACf,KAAK,YAAY;;EAEjB,SAAS,QAAQ;;iBAGH,QACd,OAAO,qBACP,gBAAgB,
|
|
1
|
+
{"version":3,"file":"use-tabs.d.ts","names":[],"sources":["../../../src/components/tabs/use-tabs.ts"],"mappings":";;;;UAUiB;EACf,KAAK,YAAY;;EAEjB,SAAS,QAAQ;;iBAGH,QACd,OAAO,qBACP,gBAAgB,sCAChB,YAAY,mCACX"}
|
|
@@ -5,10 +5,11 @@ import { computed } from "vue";
|
|
|
5
5
|
import { connectTabs, tabsMachine } from "@xihan-ui/headless";
|
|
6
6
|
import { createScope } from "@xihan-ui/kernel";
|
|
7
7
|
//#region src/components/tabs/use-tabs.ts
|
|
8
|
-
function useTabs(props, onValueChange) {
|
|
8
|
+
function useTabs(props, onValueChange, onTabMove) {
|
|
9
9
|
const service = useMachine(tabsMachine, () => ({
|
|
10
10
|
...props,
|
|
11
|
-
onValueChange
|
|
11
|
+
onValueChange,
|
|
12
|
+
onTabMove
|
|
12
13
|
}), createScope(null, createVueIdGenerator()));
|
|
13
14
|
return {
|
|
14
15
|
api: computed(() => connectTabs(service, vueNormalize)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tabs.js","names":[],"sources":["../../../src/components/tabs/use-tabs.ts"],"sourcesContent":["import type { TabsApi, TabsSchema } from '@xihan-ui/headless'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef } from 'vue'\nimport { connectTabs, tabsMachine } from '@xihan-ui/headless'\nimport { createScope } from '@xihan-ui/kernel'\nimport { computed } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface TabsContext {\n api: ComputedRef<TabsApi>\n /** 机器实例,供部件上报 DOM 侧的事实(如条目卸载带走了焦点)。 */\n service: Service<TabsSchema>\n}\n\nexport function useTabs(\n props: TabsSchema['props'],\n onValueChange?: TabsSchema['props']['onValueChange'],\n): TabsContext {\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(tabsMachine, () => ({ ...props, onValueChange }), scope)\n const api = computed(() => connectTabs(service, vueNormalize))\n return { api, service }\n}\n"],"mappings":";;;;;;;AAgBA,SAAgB,QACd,OACA,
|
|
1
|
+
{"version":3,"file":"use-tabs.js","names":[],"sources":["../../../src/components/tabs/use-tabs.ts"],"sourcesContent":["import type { TabsApi, TabsSchema } from '@xihan-ui/headless'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef } from 'vue'\nimport { connectTabs, tabsMachine } from '@xihan-ui/headless'\nimport { createScope } from '@xihan-ui/kernel'\nimport { computed } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface TabsContext {\n api: ComputedRef<TabsApi>\n /** 机器实例,供部件上报 DOM 侧的事实(如条目卸载带走了焦点)。 */\n service: Service<TabsSchema>\n}\n\nexport function useTabs(\n props: TabsSchema['props'],\n onValueChange?: TabsSchema['props']['onValueChange'],\n onTabMove?: TabsSchema['props']['onTabMove'],\n): TabsContext {\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n const service = useMachine(tabsMachine, () => ({ ...props, onValueChange, onTabMove }), scope)\n const api = computed(() => connectTabs(service, vueNormalize))\n return { api, service }\n}\n"],"mappings":";;;;;;;AAgBA,SAAgB,QACd,OACA,eACA,WACa;CAGb,MAAM,UAAU,WAAW,oBAAoB;EAAE,GAAG;EAAO;EAAe;CAAU,IADtE,YAAY,MADZ,qBACsB,CACwD,CAAC;CAE7F,OAAO;EAAE,KADG,eAAe,YAAY,SAAS,YAAY,CACjD;EAAG;CAAQ;AACxB"}
|
|
@@ -145,11 +145,11 @@ declare const XhTagsInputRoot: import("vue").DefineComponent<import("vue").Extra
|
|
|
145
145
|
size: Size;
|
|
146
146
|
disabled: boolean;
|
|
147
147
|
translations: Partial<TagsInputTranslations>;
|
|
148
|
-
variant: ControlVariant;
|
|
149
|
-
editable: boolean;
|
|
150
|
-
max: number;
|
|
151
148
|
readOnly: boolean;
|
|
152
149
|
placeholder: string;
|
|
150
|
+
variant: ControlVariant;
|
|
151
|
+
max: number;
|
|
152
|
+
editable: boolean;
|
|
153
153
|
inputValue: string;
|
|
154
154
|
defaultInputValue: string;
|
|
155
155
|
allowOverflow: boolean;
|
|
@@ -125,9 +125,9 @@ declare const XhTextFieldRoot: import("vue").DefineComponent<import("vue").Extra
|
|
|
125
125
|
size: Size;
|
|
126
126
|
disabled: boolean;
|
|
127
127
|
translations: Partial<import("@xihan-ui/headless").TextFieldTranslations> | undefined;
|
|
128
|
-
variant: ControlVariant;
|
|
129
128
|
readOnly: boolean;
|
|
130
129
|
placeholder: string;
|
|
130
|
+
variant: ControlVariant;
|
|
131
131
|
clearable: boolean;
|
|
132
132
|
maxLength: number;
|
|
133
133
|
autoSize: boolean | import("@xihan-ui/headless").TextFieldAutoSize | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-field.d.ts","names":[],"sources":["../../../src/components/text-field/text-field.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"text-field.d.ts","names":[],"sources":["../../../src/components/text-field/text-field.ts"],"mappings":";;;;;KAWK,iBAAiB;;KAGV,yBAAyB,KACnC;cAIW,+BAAe,8BAAA;;;;;;;;;;IAMA,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IASM,MAAA,SAAS;;;;IACrB,MAAA,SAAS;;;;IACZ,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;IACD,MAAA,SAAS;;;;;;EAId,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;;;IAlBX,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IASM,MAAA,SAAS;;;;IACrB,MAAA,SAAS;;;;IACZ,MAAA,SAAS;;;;IACT,MAAA,SAAS;;;;IACD,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;EAQ/B,WAAC,OAAO,2BAA2B;kCAkB/C;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,8BAAA;;;IAIH,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;;qCA2BjC;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { withXhConfig } from "../../config/config.js";
|
|
1
2
|
import { useFieldLabelWiring, useFieldStateWiring } from "../field/use-field-control.js";
|
|
2
3
|
import { provideTextField, useTextFieldContext } from "./context.js";
|
|
3
4
|
import { useTextField } from "./use-text-field.js";
|
|
@@ -67,7 +68,7 @@ const XhTextFieldRoot = defineComponent({
|
|
|
67
68
|
emit("value-change", details);
|
|
68
69
|
emit("update:value", details.value);
|
|
69
70
|
};
|
|
70
|
-
const ctx = useTextField(props, notify);
|
|
71
|
+
const ctx = useTextField(withXhConfig("text-field", props), notify);
|
|
71
72
|
provideTextField(ctx);
|
|
72
73
|
return () => h("div", ctx.api.value.getRootProps(), slots.default?.({
|
|
73
74
|
value: ctx.api.value.value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-field.js","names":[],"sources":["../../../src/components/text-field/text-field.ts"],"sourcesContent":["import type { TextFieldApi, TextFieldInputHost, TextFieldSchema, TextFieldType } from '@xihan-ui/headless'\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { autoSizeTextarea } from '@xihan-ui/headless'\nimport { defineComponent, h, onMounted, ref, watch } from 'vue'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { provideTextField, useTextFieldContext } from './context'\nimport { useTextField } from './use-text-field'\n\ntype TextFieldProps = TextFieldSchema['props']\n\n/** 默认插槽的载荷:当前值、值状态标志与写值方法。 */\nexport type TextFieldRootSlotProps = Pick<\n TextFieldApi,\n 'value' | 'empty' | 'atLimit' | 'canClear' | 'setValue' | 'clear'\n>\n\nexport const XhTextFieldRoot = defineComponent({\n name: 'XhTextFieldRoot',\n props: {\n // default: undefined 表示非受控\n value: { type: String, default: undefined },\n defaultValue: { type: String, default: undefined },\n type: { type: String as PropType<TextFieldType>, default: undefined },\n placeholder: { type: String, default: undefined },\n disabled: Boolean,\n readOnly: Boolean,\n required: Boolean,\n invalid: Boolean,\n name: { type: String, default: undefined },\n maxLength: { type: Number, default: undefined },\n clearable: Boolean,\n autoSize: { type: [Boolean, Object] as PropType<TextFieldProps['autoSize']>, default: undefined },\n variant: { type: String as PropType<ControlVariant>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n translations: { type: Object as PropType<TextFieldProps['translations']>, default: undefined },\n },\n // value-change 携带 { value },update:value 携带裸串\n emits: {\n 'value-change': (_details: PayloadOf<TextFieldProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TextFieldProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TextFieldRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: TextFieldProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useTextField(props as TextFieldProps, notify)\n provideTextField(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n empty: ctx.api.value.empty,\n atLimit: ctx.api.value.atLimit,\n canClear: ctx.api.value.canClear,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n }))\n },\n})\n\nexport const XhTextFieldLabel = defineComponent({\n name: 'XhTextFieldLabel',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n // 必须是原生 <label>,connect 把 for 写向 input\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTextFieldControl = defineComponent({\n name: 'XhTextFieldControl',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n // 视觉盒:输入框与清空按钮都放进来,皮肤把描边、底色、聚焦环画在它身上\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTextFieldInput = defineComponent({\n name: 'XhTextFieldInput',\n props: {\n /** 输入框渲染成哪个标签,默认 input;写 textarea 即多行宿主,接上 autoSize 自动高度。 */\n as: { type: String as PropType<TextFieldInputHost>, default: 'input' },\n },\n setup(props) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTextFieldContext()\n const el = ref<HTMLTextAreaElement | null>(null)\n // 程序化写值(setValue / 表单重置 / 受控回写)不触发 input 事件,量高在渲染后补一次\n watch(() => [ctx.api.value.value, props.as], () => {\n if (props.as === 'textarea' && el.value)\n autoSizeTextarea(el.value, ctx.api.value.autoSize)\n }, { flush: 'post' })\n onMounted(() => {\n if (props.as === 'textarea' && el.value)\n autoSizeTextarea(el.value, ctx.api.value.autoSize)\n })\n // 自己渲染宿主节点,label 的 for 指向它\n return () => h(props.as, fieldLabel.value({\n ...ctx.api.value.getInputProps({ as: props.as }) as Record<string, unknown>,\n ref: (node: unknown) => {\n el.value = props.as === 'textarea' ? node as HTMLTextAreaElement : null\n },\n ...fieldWiring.value,\n }))\n },\n})\n\nexport const XhTextFieldClearTrigger = defineComponent({\n name: 'XhTextFieldClearTrigger',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"text-field.js","names":[],"sources":["../../../src/components/text-field/text-field.ts"],"sourcesContent":["import type { TextFieldApi, TextFieldInputHost, TextFieldSchema, TextFieldType } from '@xihan-ui/headless'\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/kernel'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { autoSizeTextarea } from '@xihan-ui/headless'\nimport { defineComponent, h, onMounted, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { provideTextField, useTextFieldContext } from './context'\nimport { useTextField } from './use-text-field'\n\ntype TextFieldProps = TextFieldSchema['props']\n\n/** 默认插槽的载荷:当前值、值状态标志与写值方法。 */\nexport type TextFieldRootSlotProps = Pick<\n TextFieldApi,\n 'value' | 'empty' | 'atLimit' | 'canClear' | 'setValue' | 'clear'\n>\n\nexport const XhTextFieldRoot = defineComponent({\n name: 'XhTextFieldRoot',\n props: {\n // default: undefined 表示非受控\n value: { type: String, default: undefined },\n defaultValue: { type: String, default: undefined },\n type: { type: String as PropType<TextFieldType>, default: undefined },\n placeholder: { type: String, default: undefined },\n disabled: Boolean,\n readOnly: Boolean,\n required: Boolean,\n invalid: Boolean,\n name: { type: String, default: undefined },\n maxLength: { type: Number, default: undefined },\n clearable: Boolean,\n autoSize: { type: [Boolean, Object] as PropType<TextFieldProps['autoSize']>, default: undefined },\n variant: { type: String as PropType<ControlVariant>, default: undefined },\n tone: { type: String as PropType<Tone>, default: undefined },\n size: { type: String as PropType<Size>, default: undefined },\n translations: { type: Object as PropType<TextFieldProps['translations']>, default: undefined },\n },\n // value-change 携带 { value },update:value 携带裸串\n emits: {\n 'value-change': (_details: PayloadOf<TextFieldProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TextFieldProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TextFieldRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: TextFieldProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useTextField(withXhConfig('text-field', props) as TextFieldProps, notify)\n provideTextField(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n empty: ctx.api.value.empty,\n atLimit: ctx.api.value.atLimit,\n canClear: ctx.api.value.canClear,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n }))\n },\n})\n\nexport const XhTextFieldLabel = defineComponent({\n name: 'XhTextFieldLabel',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n // 必须是原生 <label>,connect 把 for 写向 input\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTextFieldControl = defineComponent({\n name: 'XhTextFieldControl',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n // 视觉盒:输入框与清空按钮都放进来,皮肤把描边、底色、聚焦环画在它身上\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTextFieldInput = defineComponent({\n name: 'XhTextFieldInput',\n props: {\n /** 输入框渲染成哪个标签,默认 input;写 textarea 即多行宿主,接上 autoSize 自动高度。 */\n as: { type: String as PropType<TextFieldInputHost>, default: 'input' },\n },\n setup(props) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTextFieldContext()\n const el = ref<HTMLTextAreaElement | null>(null)\n // 程序化写值(setValue / 表单重置 / 受控回写)不触发 input 事件,量高在渲染后补一次\n watch(() => [ctx.api.value.value, props.as], () => {\n if (props.as === 'textarea' && el.value)\n autoSizeTextarea(el.value, ctx.api.value.autoSize)\n }, { flush: 'post' })\n onMounted(() => {\n if (props.as === 'textarea' && el.value)\n autoSizeTextarea(el.value, ctx.api.value.autoSize)\n })\n // 自己渲染宿主节点,label 的 for 指向它\n return () => h(props.as, fieldLabel.value({\n ...ctx.api.value.getInputProps({ as: props.as }) as Record<string, unknown>,\n ref: (node: unknown) => {\n el.value = props.as === 'textarea' ? node as HTMLTextAreaElement : null\n },\n ...fieldWiring.value,\n }))\n },\n})\n\nexport const XhTextFieldClearTrigger = defineComponent({\n name: 'XhTextFieldClearTrigger',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":";;;;;;;AAmBA,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CACN,OAAO;EAEL,OAAO;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC1C,cAAc;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EACjD,MAAM;GAAE,MAAM;GAAmC,SAAS,KAAA;EAAU;EACpE,aAAa;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAChD,UAAU;EACV,UAAU;EACV,UAAU;EACV,SAAS;EACT,MAAM;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EACzC,WAAW;GAAE,MAAM;GAAQ,SAAS,KAAA;EAAU;EAC9C,WAAW;EACX,UAAU;GAAE,MAAM,CAAC,SAAS,MAAM;GAA2C,SAAS,KAAA;EAAU;EAChG,SAAS;GAAE,MAAM;GAAoC,SAAS,KAAA;EAAU;EACxE,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;EAC3D,MAAM;GAAE,MAAM;GAA0B,SAAS,KAAA;EAAU;EAC3D,cAAc;GAAE,MAAM;GAAoD,SAAS,KAAA;EAAU;CAC/F;CAEA,OAAO;EACL,iBAAiB,aAAyD;EAC1E,iBAAiB,WAAgE;CACnF;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,UAA2C,YAAY;GAC3D,KAAK,gBAAgB,OAAO;GAC5B,KAAK,gBAAgB,QAAQ,KAAK;EACpC;EACA,MAAM,MAAM,aAAa,aAAa,cAAc,KAAK,GAAqB,MAAM;EACpF,iBAAiB,GAAG;EACpB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,OAAO,IAAI,IAAI,MAAM;GACrB,OAAO,IAAI,IAAI,MAAM;GACrB,SAAS,IAAI,IAAI,MAAM;GACvB,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,OAAO,IAAI,IAAI,MAAM;EACvB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAEhC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAEhC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,gBAAgB,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,OAAO;;AAEL,IAAI;EAAE,MAAM;EAAwC,SAAS;CAAQ,EACvE;CACA,MAAM,OAAO;EAEX,MAAM,cAAc,oBAAoB;EAExC,MAAM,aAAa,oBAAoB;EACvC,MAAM,MAAM,oBAAoB;EAChC,MAAM,KAAK,IAAgC,IAAI;EAE/C,YAAY,CAAC,IAAI,IAAI,MAAM,OAAO,MAAM,EAAE,SAAS;GACjD,IAAI,MAAM,OAAO,cAAc,GAAG,OAChC,iBAAiB,GAAG,OAAO,IAAI,IAAI,MAAM,QAAQ;EACrD,GAAG,EAAE,OAAO,OAAO,CAAC;EACpB,gBAAgB;GACd,IAAI,MAAM,OAAO,cAAc,GAAG,OAChC,iBAAiB,GAAG,OAAO,IAAI,IAAI,MAAM,QAAQ;EACrD,CAAC;EAED,aAAa,EAAE,MAAM,IAAI,WAAW,MAAM;GACxC,GAAG,IAAI,IAAI,MAAM,cAAc,EAAE,IAAI,MAAM,GAAG,CAAC;GAC/C,MAAM,SAAkB;IACtB,GAAG,QAAQ,MAAM,OAAO,aAAa,OAA8B;GACrE;GACA,GAAG,YAAY;EACjB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC7G;AACF,CAAC"}
|
|
@@ -138,12 +138,12 @@ declare const XhTimeFieldRoot: import("vue").DefineComponent<import("vue").Extra
|
|
|
138
138
|
size: Size;
|
|
139
139
|
disabled: boolean;
|
|
140
140
|
translations: Partial<import("@xihan-ui/headless").TimeFieldTranslations> | undefined;
|
|
141
|
+
readOnly: boolean;
|
|
142
|
+
placeholder: string;
|
|
141
143
|
variant: ControlVariant;
|
|
142
144
|
max: string;
|
|
143
|
-
readOnly: boolean;
|
|
144
145
|
min: string;
|
|
145
146
|
locale: string;
|
|
146
|
-
placeholder: string;
|
|
147
147
|
granularity: TimeGranularity;
|
|
148
148
|
hourCycle: TimeHourCycle;
|
|
149
149
|
}, SlotsType<{
|
|
@@ -193,18 +193,18 @@ declare const XhTimePickerRoot: import("vue").DefineComponent<import("vue").Extr
|
|
|
193
193
|
tone: Tone;
|
|
194
194
|
size: Size;
|
|
195
195
|
disabled: boolean;
|
|
196
|
-
offset: number;
|
|
197
|
-
translations: Partial<import("@xihan-ui/headless").TimePickerTranslations> | undefined;
|
|
198
196
|
open: boolean;
|
|
199
197
|
defaultOpen: boolean;
|
|
198
|
+
translations: Partial<import("@xihan-ui/headless").TimePickerTranslations> | undefined;
|
|
199
|
+
offset: number;
|
|
200
|
+
readOnly: boolean;
|
|
201
|
+
placement: Placement;
|
|
200
202
|
variant: ControlVariant;
|
|
201
203
|
max: string;
|
|
202
|
-
readOnly: boolean;
|
|
203
204
|
min: string;
|
|
204
205
|
locale: string;
|
|
205
|
-
placement: Placement;
|
|
206
|
-
presets: TimePickerPreset[];
|
|
207
206
|
granularity: TimeGranularity;
|
|
207
|
+
presets: TimePickerPreset[];
|
|
208
208
|
step: number;
|
|
209
209
|
hourCycle: TimeHourCycle;
|
|
210
210
|
isTimeUnavailable: (value: string, unit: TimePickerColumnUnit) => boolean;
|
|
@@ -82,8 +82,8 @@ declare const XhToastRoot: import("vue").DefineComponent<import("vue").ExtractPr
|
|
|
82
82
|
}>, {
|
|
83
83
|
type: ToastType;
|
|
84
84
|
title: string;
|
|
85
|
-
translations: Partial<ToastTranslations>;
|
|
86
85
|
closable: boolean;
|
|
86
|
+
translations: Partial<ToastTranslations>;
|
|
87
87
|
duration: number;
|
|
88
88
|
removeDelay: number;
|
|
89
89
|
pauseOnPageIdle: boolean;
|
|
@@ -80,9 +80,9 @@ declare const XhTooltipRoot: import("vue").DefineComponent<import("vue").Extract
|
|
|
80
80
|
tone: Tone;
|
|
81
81
|
size: Size;
|
|
82
82
|
disabled: boolean;
|
|
83
|
-
offset: number;
|
|
84
83
|
open: boolean;
|
|
85
84
|
defaultOpen: boolean;
|
|
85
|
+
offset: number;
|
|
86
86
|
placement: Placement;
|
|
87
87
|
openDelay: number;
|
|
88
88
|
closeDelay: number;
|
|
@@ -129,19 +129,19 @@ declare const XhTourRoot: import("vue").DefineComponent<import("vue").ExtractPro
|
|
|
129
129
|
"onUpdate:step"?: ((_step: number) => any) | undefined;
|
|
130
130
|
onSkip?: ((_details: import("@xihan-ui/headless").TourSkipDetails) => any) | undefined;
|
|
131
131
|
}>, {
|
|
132
|
-
offset: number;
|
|
133
|
-
translations: Partial<import("@xihan-ui/headless").TourTranslations> | undefined;
|
|
134
132
|
open: boolean;
|
|
135
133
|
defaultOpen: boolean;
|
|
136
|
-
|
|
134
|
+
translations: Partial<import("@xihan-ui/headless").TourTranslations> | undefined;
|
|
135
|
+
offset: number;
|
|
137
136
|
placement: Placement;
|
|
137
|
+
steps: TourStep[];
|
|
138
138
|
closeOnEscape: boolean;
|
|
139
139
|
closeOnInteractOutside: boolean;
|
|
140
140
|
step: number;
|
|
141
|
+
autoScroll: boolean;
|
|
141
142
|
defaultStep: number;
|
|
142
143
|
showBackdrop: boolean;
|
|
143
144
|
spotlightPadding: number;
|
|
144
|
-
autoScroll: boolean;
|
|
145
145
|
}, SlotsType<{
|
|
146
146
|
default?: (props: TourRootSlotProps) => VNode[];
|
|
147
147
|
}>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -62,6 +62,17 @@ declare const XhTreeRoot: import("vue").DefineComponent<import("vue").ExtractPro
|
|
|
62
62
|
type: PropType<Direction>;
|
|
63
63
|
default: undefined;
|
|
64
64
|
};
|
|
65
|
+
/** 节点可以拖着搬家。整个节点都是拖动源,不另出把手。 */
|
|
66
|
+
nodeDraggable: BooleanConstructor;
|
|
67
|
+
/** 这一次搬家许不许。收到的是折算好的落点(搬到哪个父下面的第几位)。不给即都许。 */
|
|
68
|
+
allowDrop: {
|
|
69
|
+
type: PropType<TreeProps["allowDrop"]>;
|
|
70
|
+
default: undefined;
|
|
71
|
+
};
|
|
72
|
+
translations: {
|
|
73
|
+
type: PropType<TreeProps["translations"]>;
|
|
74
|
+
default: undefined;
|
|
75
|
+
};
|
|
65
76
|
}>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
66
77
|
[key: string]: any;
|
|
67
78
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
@@ -69,6 +80,7 @@ declare const XhTreeRoot: import("vue").DefineComponent<import("vue").ExtractPro
|
|
|
69
80
|
'update:expandedValue': (_value: PayloadOf<TreeProps, "onExpandedChange">["value"]) => true;
|
|
70
81
|
'selection-change': (_details: PayloadOf<TreeProps, "onSelectionChange">) => true;
|
|
71
82
|
'update:selection': (_value: PayloadOf<TreeProps, "onSelectionChange">["value"]) => true;
|
|
83
|
+
'node-move': (_move: PayloadOf<TreeProps, "onNodeMove">) => true;
|
|
72
84
|
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
73
85
|
collection: {
|
|
74
86
|
type: PropType<TreeNode[]>;
|
|
@@ -125,26 +137,41 @@ declare const XhTreeRoot: import("vue").DefineComponent<import("vue").ExtractPro
|
|
|
125
137
|
type: PropType<Direction>;
|
|
126
138
|
default: undefined;
|
|
127
139
|
};
|
|
140
|
+
/** 节点可以拖着搬家。整个节点都是拖动源,不另出把手。 */
|
|
141
|
+
nodeDraggable: BooleanConstructor;
|
|
142
|
+
/** 这一次搬家许不许。收到的是折算好的落点(搬到哪个父下面的第几位)。不给即都许。 */
|
|
143
|
+
allowDrop: {
|
|
144
|
+
type: PropType<TreeProps["allowDrop"]>;
|
|
145
|
+
default: undefined;
|
|
146
|
+
};
|
|
147
|
+
translations: {
|
|
148
|
+
type: PropType<TreeProps["translations"]>;
|
|
149
|
+
default: undefined;
|
|
150
|
+
};
|
|
128
151
|
}>> & Readonly<{
|
|
129
152
|
"onExpanded-change"?: ((_details: import("@xihan-ui/headless").TreeExpandedChangeDetails) => any) | undefined;
|
|
130
153
|
"onUpdate:expandedValue"?: ((_value: string[]) => any) | undefined;
|
|
131
154
|
"onSelection-change"?: ((_details: import("@xihan-ui/headless").TreeSelectionChangeDetails) => any) | undefined;
|
|
132
155
|
"onUpdate:selection"?: ((_value: string[]) => any) | undefined;
|
|
156
|
+
"onNode-move"?: ((_move: import("@xihan-ui/headless").TreeMove) => any) | undefined;
|
|
133
157
|
}>, {
|
|
134
158
|
multiple: boolean;
|
|
135
159
|
collection: TreeNode[];
|
|
136
160
|
dir: Direction;
|
|
137
161
|
disabled: boolean;
|
|
138
|
-
|
|
162
|
+
translations: Partial<import("@xihan-ui/headless").TreeTranslations> | undefined;
|
|
139
163
|
loop: boolean;
|
|
164
|
+
selectionMode: TreeSelectionMode;
|
|
140
165
|
checkedStrategy: import("@xihan-ui/behavior").CascadeStrategy | undefined;
|
|
141
166
|
cascade: boolean;
|
|
142
167
|
typeahead: boolean;
|
|
168
|
+
allowDrop: ((move: import("@xihan-ui/headless").TreeMove) => boolean) | undefined;
|
|
143
169
|
expandedValue: string[];
|
|
144
170
|
defaultExpandedValue: string[];
|
|
145
171
|
selection: string[];
|
|
146
172
|
defaultSelection: string[];
|
|
147
173
|
leafOrientation: import("@xihan-ui/kernel").Orientation | undefined;
|
|
174
|
+
nodeDraggable: boolean;
|
|
148
175
|
expandOnClick: boolean;
|
|
149
176
|
}, SlotsType<{
|
|
150
177
|
default?: (props: TreeRootSlotProps) => VNode[];
|
|
@@ -155,6 +182,15 @@ declare const XhTreeLabel: import("vue").DefineComponent<{}, () => VNode<import(
|
|
|
155
182
|
declare const XhTreeTree: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
156
183
|
[key: string]: any;
|
|
157
184
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
185
|
+
/**
|
|
186
|
+
* 拖动过程的读屏播报区,视觉上不可见。
|
|
187
|
+
*
|
|
188
|
+
* 放在 root 里、与 tree 部件平级。它必须在拖动开始**之前**就在 DOM 上——
|
|
189
|
+
* 读屏不播报后插入的节点,等到拾起才渲出来等于没有。
|
|
190
|
+
*/
|
|
191
|
+
declare const XhTreeLiveRegion: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
192
|
+
[key: string]: any;
|
|
193
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
158
194
|
declare const XhTreeItem: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
159
195
|
value: {
|
|
160
196
|
type: StringConstructor;
|
|
@@ -171,6 +207,14 @@ declare const XhTreeItem: import("vue").DefineComponent<import("vue").ExtractPro
|
|
|
171
207
|
declare const XhTreeItemText: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
172
208
|
[key: string]: any;
|
|
173
209
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
210
|
+
/**
|
|
211
|
+
* 节点拖拽把手。放在节点里,自带 touch-action: none,按下即拖,不等激活距离。
|
|
212
|
+
* 对读屏隐藏、也不占 Tab 位;键盘搬家由树上的 Alt + 方向键承担。
|
|
213
|
+
* 整个节点起手那一路照旧可用,把手是叠加的第二个入口。
|
|
214
|
+
*/
|
|
215
|
+
declare const XhTreeNodeDragTrigger: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
216
|
+
[key: string]: any;
|
|
217
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
174
218
|
declare const XhTreeItemCheckbox: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
175
219
|
[key: string]: any;
|
|
176
220
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -209,5 +253,5 @@ declare const XhTreeBranchContent: import("vue").DefineComponent<{}, () => VNode
|
|
|
209
253
|
[key: string]: any;
|
|
210
254
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
211
255
|
//#endregion
|
|
212
|
-
export { TreeRootSlotProps, XhTreeBranch, XhTreeBranchCheckbox, XhTreeBranchContent, XhTreeBranchControl, XhTreeBranchIndicator, XhTreeBranchText, XhTreeBranchTrigger, XhTreeItem, XhTreeItemCheckbox, XhTreeItemIndicator, XhTreeItemText, XhTreeLabel, XhTreeRoot, XhTreeTree };
|
|
256
|
+
export { TreeRootSlotProps, XhTreeBranch, XhTreeBranchCheckbox, XhTreeBranchContent, XhTreeBranchControl, XhTreeBranchIndicator, XhTreeBranchText, XhTreeBranchTrigger, XhTreeItem, XhTreeItemCheckbox, XhTreeItemIndicator, XhTreeItemText, XhTreeLabel, XhTreeLiveRegion, XhTreeNodeDragTrigger, XhTreeRoot, XhTreeTree };
|
|
213
257
|
//# sourceMappingURL=tree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.d.ts","names":[],"sources":["../../../src/components/tree/tree.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"tree.d.ts","names":[],"sources":["../../../src/components/tree/tree.ts"],"mappings":";;;;;KAUK,YAAY;;KAGL,oBAAoB,KAC9B;cAmCW,0BAAU,8BAAA;;IAIU,MAAA,SAAS;;;;IACN,MAAA;;;;IACO,MAAA;;;;IACX,MAAA;;;;IACO,MAAA;;;;;;;;;IAGA,MAAA,SAAS;;;;IACX,MAAA,SAAS;;;;;IAEP,MAAA,SAAS;;;;;;;;;;;;;;;;;IAKrB,MAAA,SAAS;;;;;;;IAID,MAAA,SAAS;;;;IACR,MAAA,SAAS;;;;;;EAIX,oBAAA,UAAA,UAAU;EACP,yBAAA,QAAA,UAAU;EACZ,qBAAA,UAAA,UAAU;EACZ,qBAAA,QAAA,UAAU;EAElB,cAAA,OAAA,UAAU;;;IA7BF,MAAA,SAAS;;;;IACN,MAAA;;;;IACO,MAAA;;;;IACX,MAAA;;;;IACO,MAAA;;;;;;;;;IAGA,MAAA,SAAS;;;;IACX,MAAA,SAAS;;;;;IAEP,MAAA,SAAS;;;;;;;;;;;;;;;;;IAKrB,MAAA,SAAS;;;;;;;IAID,MAAA,SAAS;;;;IACR,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY/B,WAAC,OAAO,sBAAsB;kCA6B1C;cAEW,2BAAW,0BAAA,oBAAA,4BAAA;;8BAMtB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,0BAAU,0BAAA,oBAAA,4BAAA;;8BAMrB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;;;;;;cAQW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAU3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,0BAAU,8BAAA;;;;;;;;;;;;MAiBrB,oDAAA;cAEW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAOzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;;;;;cAOW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,4BAAY,8BAAA;;;;;;;;;;;;MAkBvB,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAOhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAQ9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { withXhConfig } from "../../config/config.js";
|
|
1
2
|
import { provideTree, provideTreeNode, useTreeContext, useTreeNodeContext } from "./context.js";
|
|
2
3
|
import { useTree } from "./use-tree.js";
|
|
3
4
|
import { computed, defineComponent, h, onBeforeUnmount, ref, watch } from "vue";
|
|
@@ -76,13 +77,25 @@ const XhTreeRoot = defineComponent({
|
|
|
76
77
|
dir: {
|
|
77
78
|
type: String,
|
|
78
79
|
default: void 0
|
|
80
|
+
},
|
|
81
|
+
/** 节点可以拖着搬家。整个节点都是拖动源,不另出把手。 */
|
|
82
|
+
nodeDraggable: Boolean,
|
|
83
|
+
/** 这一次搬家许不许。收到的是折算好的落点(搬到哪个父下面的第几位)。不给即都许。 */
|
|
84
|
+
allowDrop: {
|
|
85
|
+
type: Function,
|
|
86
|
+
default: void 0
|
|
87
|
+
},
|
|
88
|
+
translations: {
|
|
89
|
+
type: Object,
|
|
90
|
+
default: void 0
|
|
79
91
|
}
|
|
80
92
|
},
|
|
81
93
|
emits: {
|
|
82
94
|
"expanded-change": (_details) => true,
|
|
83
95
|
"update:expandedValue": (_value) => true,
|
|
84
96
|
"selection-change": (_details) => true,
|
|
85
|
-
"update:selection": (_value) => true
|
|
97
|
+
"update:selection": (_value) => true,
|
|
98
|
+
"node-move": (_move) => true
|
|
86
99
|
},
|
|
87
100
|
slots: Object,
|
|
88
101
|
setup(props, { slots, emit }) {
|
|
@@ -94,7 +107,10 @@ const XhTreeRoot = defineComponent({
|
|
|
94
107
|
emit("selection-change", details);
|
|
95
108
|
emit("update:selection", details.value);
|
|
96
109
|
};
|
|
97
|
-
const
|
|
110
|
+
const onNodeMove = (move) => {
|
|
111
|
+
emit("node-move", move);
|
|
112
|
+
};
|
|
113
|
+
const ctx = useTree(withXhConfig("tree", props), onExpandedChange, onSelectionChange, onNodeMove);
|
|
98
114
|
provideTree(ctx);
|
|
99
115
|
return () => h("div", ctx.api.value.getRootProps(), slots.default?.({
|
|
100
116
|
visibleNodes: ctx.api.value.visibleNodes,
|
|
@@ -124,6 +140,19 @@ const XhTreeTree = defineComponent({
|
|
|
124
140
|
return () => h("div", ctx.api.value.getTreeProps(), slots.default?.());
|
|
125
141
|
}
|
|
126
142
|
});
|
|
143
|
+
/**
|
|
144
|
+
* 拖动过程的读屏播报区,视觉上不可见。
|
|
145
|
+
*
|
|
146
|
+
* 放在 root 里、与 tree 部件平级。它必须在拖动开始**之前**就在 DOM 上——
|
|
147
|
+
* 读屏不播报后插入的节点,等到拾起才渲出来等于没有。
|
|
148
|
+
*/
|
|
149
|
+
const XhTreeLiveRegion = defineComponent({
|
|
150
|
+
name: "XhTreeLiveRegion",
|
|
151
|
+
setup() {
|
|
152
|
+
const ctx = useTreeContext();
|
|
153
|
+
return () => h("div", ctx.api.value.getLiveRegionProps(), ctx.service.context.get("announcement"));
|
|
154
|
+
}
|
|
155
|
+
});
|
|
127
156
|
const XhTreeItem = defineComponent({
|
|
128
157
|
name: "XhTreeItem",
|
|
129
158
|
props: { value: {
|
|
@@ -150,6 +179,19 @@ const XhTreeItemText = defineComponent({
|
|
|
150
179
|
return () => h("span", ctx.api.value.getItemTextProps(node.value), slots.default?.());
|
|
151
180
|
}
|
|
152
181
|
});
|
|
182
|
+
/**
|
|
183
|
+
* 节点拖拽把手。放在节点里,自带 touch-action: none,按下即拖,不等激活距离。
|
|
184
|
+
* 对读屏隐藏、也不占 Tab 位;键盘搬家由树上的 Alt + 方向键承担。
|
|
185
|
+
* 整个节点起手那一路照旧可用,把手是叠加的第二个入口。
|
|
186
|
+
*/
|
|
187
|
+
const XhTreeNodeDragTrigger = defineComponent({
|
|
188
|
+
name: "XhTreeNodeDragTrigger",
|
|
189
|
+
setup(_, { slots }) {
|
|
190
|
+
const ctx = useTreeContext();
|
|
191
|
+
const { node } = useTreeNodeContext();
|
|
192
|
+
return () => h("span", ctx.api.value.getNodeDragTriggerProps(node.value), slots.default?.());
|
|
193
|
+
}
|
|
194
|
+
});
|
|
153
195
|
const XhTreeItemCheckbox = defineComponent({
|
|
154
196
|
name: "XhTreeItemCheckbox",
|
|
155
197
|
setup(_, { slots }) {
|
|
@@ -233,6 +275,6 @@ const XhTreeBranchContent = defineComponent({
|
|
|
233
275
|
}
|
|
234
276
|
});
|
|
235
277
|
//#endregion
|
|
236
|
-
export { XhTreeBranch, XhTreeBranchCheckbox, XhTreeBranchContent, XhTreeBranchControl, XhTreeBranchIndicator, XhTreeBranchText, XhTreeBranchTrigger, XhTreeItem, XhTreeItemCheckbox, XhTreeItemIndicator, XhTreeItemText, XhTreeLabel, XhTreeRoot, XhTreeTree };
|
|
278
|
+
export { XhTreeBranch, XhTreeBranchCheckbox, XhTreeBranchContent, XhTreeBranchControl, XhTreeBranchIndicator, XhTreeBranchText, XhTreeBranchTrigger, XhTreeItem, XhTreeItemCheckbox, XhTreeItemIndicator, XhTreeItemText, XhTreeLabel, XhTreeLiveRegion, XhTreeNodeDragTrigger, XhTreeRoot, XhTreeTree };
|
|
237
279
|
|
|
238
280
|
//# sourceMappingURL=tree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","names":[],"sources":["../../../src/components/tree/tree.ts"],"sourcesContent":["import type { TreeApi, TreeNode, TreeNodeProps, TreeSchema, TreeSelectionMode } from '@xihan-ui/headless'\nimport type { Direction } from '@xihan-ui/kernel'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { TreeContext } from './use-tree'\nimport { computed, defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { provideTree, provideTreeNode, useTreeContext, useTreeNodeContext } from './context'\nimport { useTree } from './use-tree'\n\ntype TreeProps = TreeSchema['props']\n\n/** 默认插槽的载荷:可见行序列与展开、选中、焦点状态,以及按值判定与展开、收起、选中的动作。 */\nexport type TreeRootSlotProps = Pick<\n TreeApi,\n | 'visibleNodes'\n | 'expandedValue'\n | 'selection'\n | 'focusedValue'\n | 'isExpanded'\n | 'isSelected'\n | 'isIndeterminate'\n | 'expand'\n | 'collapse'\n | 'select'\n>\n\n/** 本节点持有焦点时,value 变更重报焦点节点,卸载时上报整树失焦 */\nfunction reportNodeFocus(ctx: TreeContext, el: Ref<HTMLElement | null>, value: () => string): void {\n watch(value, (next, prev) => {\n if (next === prev)\n return\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'NODE.FOCUS', value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本节点当下正持有焦点」判定,不按 value 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'TREE.BLUR' })\n })\n}\n\nexport const XhTreeRoot = defineComponent({\n name: 'XhTreeRoot',\n // 有 connect 兜底的 prop 一律 default: undefined\n props: {\n collection: { type: Array as PropType<TreeNode[]>, default: undefined },\n expandedValue: { type: Array as PropType<string[]>, default: undefined },\n defaultExpandedValue: { type: Array as PropType<string[]>, default: undefined },\n selection: { type: Array as PropType<string[]>, default: undefined },\n defaultSelection: { type: Array as PropType<string[]>, default: undefined },\n multiple: { type: Boolean, default: undefined },\n /** 末端那一层怎么排,默认 vertical;horizontal 让子节点全是叶子的那层并排铺开。 */\n leafOrientation: { type: String as PropType<TreeProps['leafOrientation']>, default: undefined },\n selectionMode: { type: String as PropType<TreeSelectionMode>, default: undefined },\n cascade: Boolean,\n checkedStrategy: { type: String as PropType<TreeProps['checkedStrategy']>, default: undefined },\n expandOnClick: { type: Boolean, default: undefined },\n disabled: Boolean,\n loop: { type: Boolean, default: undefined },\n typeahead: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n },\n // *-change 携带 { value },update:* 携带裸集合;回传值恒为数组,单选时长度 ≤ 1\n emits: {\n 'expanded-change': (_details: PayloadOf<TreeProps, 'onExpandedChange'>) => true,\n 'update:expandedValue': (_value: PayloadOf<TreeProps, 'onExpandedChange'>['value']) => true,\n 'selection-change': (_details: PayloadOf<TreeProps, 'onSelectionChange'>) => true,\n 'update:selection': (_value: PayloadOf<TreeProps, 'onSelectionChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TreeRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onExpandedChange: TreeProps['onExpandedChange'] = (details) => {\n emit('expanded-change', details)\n emit('update:expandedValue', details.value)\n }\n const onSelectionChange: TreeProps['onSelectionChange'] = (details) => {\n emit('selection-change', details)\n emit('update:selection', details.value)\n }\n const ctx = useTree(props as TreeProps, onExpandedChange, onSelectionChange)\n provideTree(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n visibleNodes: ctx.api.value.visibleNodes,\n expandedValue: ctx.api.value.expandedValue,\n selection: ctx.api.value.selection,\n focusedValue: ctx.api.value.focusedValue,\n isExpanded: ctx.api.value.isExpanded,\n isSelected: ctx.api.value.isSelected,\n isIndeterminate: ctx.api.value.isIndeterminate,\n expand: ctx.api.value.expand,\n collapse: ctx.api.value.collapse,\n select: ctx.api.value.select,\n }))\n },\n})\n\nexport const XhTreeLabel = defineComponent({\n name: 'XhTreeLabel',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeTree = defineComponent({\n name: 'XhTreeTree',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n return () => h('div', ctx.api.value.getTreeProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeItem = defineComponent({\n name: 'XhTreeItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTreeContext()\n const node = computed<TreeNodeProps>(() => ({ value: props.value }))\n provideTreeNode({ node })\n const el = ref<HTMLElement | null>(null)\n reportNodeFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(node.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhTreeItemText = defineComponent({\n name: 'XhTreeItemText',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getItemTextProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeItemCheckbox = defineComponent({\n name: 'XhTreeItemCheckbox',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getItemCheckboxProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchCheckbox = defineComponent({\n name: 'XhTreeBranchCheckbox',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getBranchCheckboxProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeItemIndicator = defineComponent({\n name: 'XhTreeItemIndicator',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranch = defineComponent({\n name: 'XhTreeBranch',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTreeContext()\n const node = computed<TreeNodeProps>(() => ({ value: props.value }))\n // 分支自身也是 treeitem,供其子部件读取;子节点各自再 provide 一层\n provideTreeNode({ node })\n const el = ref<HTMLElement | null>(null)\n reportNodeFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getBranchProps(node.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhTreeBranchControl = defineComponent({\n name: 'XhTreeBranchControl',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('div', ctx.api.value.getBranchControlProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchTrigger = defineComponent({\n name: 'XhTreeBranchTrigger',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getBranchTriggerProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchIndicator = defineComponent({\n name: 'XhTreeBranchIndicator',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getBranchIndicatorProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchText = defineComponent({\n name: 'XhTreeBranchText',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getBranchTextProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchContent = defineComponent({\n name: 'XhTreeBranchContent',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n // 收起只加 hidden,不卸载子树节点\n return () => h('div', ctx.api.value.getBranchContentProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tree.js","names":[],"sources":["../../../src/components/tree/tree.ts"],"sourcesContent":["import type { TreeApi, TreeNode, TreeNodeProps, TreeSchema, TreeSelectionMode } from '@xihan-ui/headless'\nimport type { Direction } from '@xihan-ui/kernel'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { TreeContext } from './use-tree'\nimport { computed, defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideTree, provideTreeNode, useTreeContext, useTreeNodeContext } from './context'\nimport { useTree } from './use-tree'\n\ntype TreeProps = TreeSchema['props']\n\n/** 默认插槽的载荷:可见行序列与展开、选中、焦点状态,以及按值判定与展开、收起、选中的动作。 */\nexport type TreeRootSlotProps = Pick<\n TreeApi,\n | 'visibleNodes'\n | 'expandedValue'\n | 'selection'\n | 'focusedValue'\n | 'isExpanded'\n | 'isSelected'\n | 'isIndeterminate'\n | 'expand'\n | 'collapse'\n | 'select'\n>\n\n/** 本节点持有焦点时,value 变更重报焦点节点,卸载时上报整树失焦 */\nfunction reportNodeFocus(ctx: TreeContext, el: Ref<HTMLElement | null>, value: () => string): void {\n watch(value, (next, prev) => {\n if (next === prev)\n return\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'NODE.FOCUS', value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本节点当下正持有焦点」判定,不按 value 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'TREE.BLUR' })\n })\n}\n\nexport const XhTreeRoot = defineComponent({\n name: 'XhTreeRoot',\n // 有 connect 兜底的 prop 一律 default: undefined\n props: {\n collection: { type: Array as PropType<TreeNode[]>, default: undefined },\n expandedValue: { type: Array as PropType<string[]>, default: undefined },\n defaultExpandedValue: { type: Array as PropType<string[]>, default: undefined },\n selection: { type: Array as PropType<string[]>, default: undefined },\n defaultSelection: { type: Array as PropType<string[]>, default: undefined },\n multiple: { type: Boolean, default: undefined },\n /** 末端那一层怎么排,默认 vertical;horizontal 让子节点全是叶子的那层并排铺开。 */\n leafOrientation: { type: String as PropType<TreeProps['leafOrientation']>, default: undefined },\n selectionMode: { type: String as PropType<TreeSelectionMode>, default: undefined },\n cascade: Boolean,\n checkedStrategy: { type: String as PropType<TreeProps['checkedStrategy']>, default: undefined },\n expandOnClick: { type: Boolean, default: undefined },\n disabled: Boolean,\n loop: { type: Boolean, default: undefined },\n typeahead: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction>, default: undefined },\n /** 节点可以拖着搬家。整个节点都是拖动源,不另出把手。 */\n nodeDraggable: Boolean,\n /** 这一次搬家许不许。收到的是折算好的落点(搬到哪个父下面的第几位)。不给即都许。 */\n allowDrop: { type: Function as PropType<TreeProps['allowDrop']>, default: undefined },\n translations: { type: Object as PropType<TreeProps['translations']>, default: undefined },\n },\n // *-change 携带 { value },update:* 携带裸集合;回传值恒为数组,单选时长度 ≤ 1\n emits: {\n 'expanded-change': (_details: PayloadOf<TreeProps, 'onExpandedChange'>) => true,\n 'update:expandedValue': (_value: PayloadOf<TreeProps, 'onExpandedChange'>['value']) => true,\n 'selection-change': (_details: PayloadOf<TreeProps, 'onSelectionChange'>) => true,\n 'update:selection': (_value: PayloadOf<TreeProps, 'onSelectionChange'>['value']) => true,\n // 搬家是通知,节点顺序的真源在使用者的数据里,故没有配对的 update:*\n 'node-move': (_move: PayloadOf<TreeProps, 'onNodeMove'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TreeRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onExpandedChange: TreeProps['onExpandedChange'] = (details) => {\n emit('expanded-change', details)\n emit('update:expandedValue', details.value)\n }\n const onSelectionChange: TreeProps['onSelectionChange'] = (details) => {\n emit('selection-change', details)\n emit('update:selection', details.value)\n }\n const onNodeMove: TreeProps['onNodeMove'] = (move) => {\n emit('node-move', move)\n }\n const ctx = useTree(withXhConfig('tree', props) as TreeProps, onExpandedChange, onSelectionChange, onNodeMove)\n provideTree(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n visibleNodes: ctx.api.value.visibleNodes,\n expandedValue: ctx.api.value.expandedValue,\n selection: ctx.api.value.selection,\n focusedValue: ctx.api.value.focusedValue,\n isExpanded: ctx.api.value.isExpanded,\n isSelected: ctx.api.value.isSelected,\n isIndeterminate: ctx.api.value.isIndeterminate,\n expand: ctx.api.value.expand,\n collapse: ctx.api.value.collapse,\n select: ctx.api.value.select,\n }))\n },\n})\n\nexport const XhTreeLabel = defineComponent({\n name: 'XhTreeLabel',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeTree = defineComponent({\n name: 'XhTreeTree',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n return () => h('div', ctx.api.value.getTreeProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 拖动过程的读屏播报区,视觉上不可见。\n *\n * 放在 root 里、与 tree 部件平级。它必须在拖动开始**之前**就在 DOM 上——\n * 读屏不播报后插入的节点,等到拾起才渲出来等于没有。\n */\nexport const XhTreeLiveRegion = defineComponent({\n name: 'XhTreeLiveRegion',\n setup() {\n const ctx = useTreeContext()\n return () => h(\n 'div',\n ctx.api.value.getLiveRegionProps() as Record<string, unknown>,\n ctx.service.context.get('announcement'),\n )\n },\n})\n\nexport const XhTreeItem = defineComponent({\n name: 'XhTreeItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTreeContext()\n const node = computed<TreeNodeProps>(() => ({ value: props.value }))\n provideTreeNode({ node })\n const el = ref<HTMLElement | null>(null)\n reportNodeFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(node.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhTreeItemText = defineComponent({\n name: 'XhTreeItemText',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getItemTextProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/**\n * 节点拖拽把手。放在节点里,自带 touch-action: none,按下即拖,不等激活距离。\n * 对读屏隐藏、也不占 Tab 位;键盘搬家由树上的 Alt + 方向键承担。\n * 整个节点起手那一路照旧可用,把手是叠加的第二个入口。\n */\nexport const XhTreeNodeDragTrigger = defineComponent({\n name: 'XhTreeNodeDragTrigger',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getNodeDragTriggerProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeItemCheckbox = defineComponent({\n name: 'XhTreeItemCheckbox',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getItemCheckboxProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchCheckbox = defineComponent({\n name: 'XhTreeBranchCheckbox',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getBranchCheckboxProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeItemIndicator = defineComponent({\n name: 'XhTreeItemIndicator',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranch = defineComponent({\n name: 'XhTreeBranch',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTreeContext()\n const node = computed<TreeNodeProps>(() => ({ value: props.value }))\n // 分支自身也是 treeitem,供其子部件读取;子节点各自再 provide 一层\n provideTreeNode({ node })\n const el = ref<HTMLElement | null>(null)\n reportNodeFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getBranchProps(node.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhTreeBranchControl = defineComponent({\n name: 'XhTreeBranchControl',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('div', ctx.api.value.getBranchControlProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchTrigger = defineComponent({\n name: 'XhTreeBranchTrigger',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getBranchTriggerProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchIndicator = defineComponent({\n name: 'XhTreeBranchIndicator',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getBranchIndicatorProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchText = defineComponent({\n name: 'XhTreeBranchText',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n return () => h('span', ctx.api.value.getBranchTextProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTreeBranchContent = defineComponent({\n name: 'XhTreeBranchContent',\n setup(_, { slots }) {\n const ctx = useTreeContext()\n const { node } = useTreeNodeContext()\n // 收起只加 hidden,不卸载子树节点\n return () => h('div', ctx.api.value.getBranchContentProps(node.value) as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ interface TreeContext {
|
|
|
7
7
|
/** 机器实例,供部件上报 DOM 侧的事实(如节点卸载带走了焦点)。 */
|
|
8
8
|
service: Service<TreeSchema>;
|
|
9
9
|
}
|
|
10
|
-
declare function useTree(props: TreeSchema['props'], onExpandedChange?: TreeSchema['props']['onExpandedChange'], onSelectionChange?: TreeSchema['props']['onSelectionChange']): TreeContext;
|
|
10
|
+
declare function useTree(props: TreeSchema['props'], onExpandedChange?: TreeSchema['props']['onExpandedChange'], onSelectionChange?: TreeSchema['props']['onSelectionChange'], onNodeMove?: TreeSchema['props']['onNodeMove']): TreeContext;
|
|
11
11
|
//#endregion
|
|
12
12
|
export { TreeContext, useTree };
|
|
13
13
|
//# sourceMappingURL=use-tree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tree.d.ts","names":[],"sources":["../../../src/components/tree/use-tree.ts"],"mappings":";;;;UAUiB;EACf,KAAK,YAAY;;EAEjB,SAAS,QAAQ;;iBAGH,QACd,OAAO,qBACP,mBAAmB,yCACnB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"use-tree.d.ts","names":[],"sources":["../../../src/components/tree/use-tree.ts"],"mappings":";;;;UAUiB;EACf,KAAK,YAAY;;EAEjB,SAAS,QAAQ;;iBAGH,QACd,OAAO,qBACP,mBAAmB,yCACnB,oBAAoB,0CACpB,aAAa,oCACZ"}
|
|
@@ -5,11 +5,12 @@ import { computed } from "vue";
|
|
|
5
5
|
import { connectTree, treeMachine } from "@xihan-ui/headless";
|
|
6
6
|
import { createScope } from "@xihan-ui/kernel";
|
|
7
7
|
//#region src/components/tree/use-tree.ts
|
|
8
|
-
function useTree(props, onExpandedChange, onSelectionChange) {
|
|
8
|
+
function useTree(props, onExpandedChange, onSelectionChange, onNodeMove) {
|
|
9
9
|
const service = useMachine(treeMachine, () => ({
|
|
10
10
|
...props,
|
|
11
11
|
onExpandedChange,
|
|
12
|
-
onSelectionChange
|
|
12
|
+
onSelectionChange,
|
|
13
|
+
onNodeMove
|
|
13
14
|
}), createScope(null, createVueIdGenerator()));
|
|
14
15
|
return {
|
|
15
16
|
api: computed(() => connectTree(service, vueNormalize)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tree.js","names":[],"sources":["../../../src/components/tree/use-tree.ts"],"sourcesContent":["import type { TreeApi, TreeSchema } from '@xihan-ui/headless'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef } from 'vue'\nimport { connectTree, treeMachine } from '@xihan-ui/headless'\nimport { createScope } from '@xihan-ui/kernel'\nimport { computed } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface TreeContext {\n api: ComputedRef<TreeApi>\n /** 机器实例,供部件上报 DOM 侧的事实(如节点卸载带走了焦点)。 */\n service: Service<TreeSchema>\n}\n\nexport function useTree(\n props: TreeSchema['props'],\n onExpandedChange?: TreeSchema['props']['onExpandedChange'],\n onSelectionChange?: TreeSchema['props']['onSelectionChange'],\n): TreeContext {\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n // 连打检索缓冲存在机器的 refs 里,适配器不必注入 refs\n const service = useMachine(treeMachine
|
|
1
|
+
{"version":3,"file":"use-tree.js","names":[],"sources":["../../../src/components/tree/use-tree.ts"],"sourcesContent":["import type { TreeApi, TreeSchema } from '@xihan-ui/headless'\nimport type { Service } from '@xihan-ui/machine'\nimport type { ComputedRef } from 'vue'\nimport { connectTree, treeMachine } from '@xihan-ui/headless'\nimport { createScope } from '@xihan-ui/kernel'\nimport { computed } from 'vue'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { useMachine } from '../../runtime/use-machine'\nimport { createVueIdGenerator } from '../../runtime/vue-id'\n\nexport interface TreeContext {\n api: ComputedRef<TreeApi>\n /** 机器实例,供部件上报 DOM 侧的事实(如节点卸载带走了焦点)。 */\n service: Service<TreeSchema>\n}\n\nexport function useTree(\n props: TreeSchema['props'],\n onExpandedChange?: TreeSchema['props']['onExpandedChange'],\n onSelectionChange?: TreeSchema['props']['onSelectionChange'],\n onNodeMove?: TreeSchema['props']['onNodeMove'],\n): TreeContext {\n const idGen = createVueIdGenerator()\n const scope = createScope(null, idGen)\n // 连打检索缓冲存在机器的 refs 里,适配器不必注入 refs\n const service = useMachine(\n treeMachine,\n () => ({ ...props, onExpandedChange, onSelectionChange, onNodeMove }),\n scope,\n )\n const api = computed(() => connectTree(service, vueNormalize))\n return { api, service }\n}\n"],"mappings":";;;;;;;AAgBA,SAAgB,QACd,OACA,kBACA,mBACA,YACa;CAIb,MAAM,UAAU,WACd,oBACO;EAAE,GAAG;EAAO;EAAkB;EAAmB;CAAW,IAJvD,YAAY,MADZ,qBACsB,CAK9B,CACN;CAEA,OAAO;EAAE,KADG,eAAe,YAAY,SAAS,YAAY,CACjD;EAAG;CAAQ;AACxB"}
|