@xihan-ui/vue 3.0.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 +148 -0
- package/README.md +1 -1
- 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.d.ts +2 -0
- package/dist/components/cascader/cascader.d.ts.map +1 -1
- package/dist/components/cascader/cascader.js +5 -2
- package/dist/components/cascader/cascader.js.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.js +30 -11
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/checkbox-group/use-checkbox-group.d.ts +6 -1
- package/dist/components/checkbox-group/use-checkbox-group.d.ts.map +1 -1
- package/dist/components/checkbox-group/use-checkbox-group.js +7 -3
- package/dist/components/checkbox-group/use-checkbox-group.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-field/color-field.d.ts +2 -0
- package/dist/components/color-field/color-field.d.ts.map +1 -1
- package/dist/components/color-field/color-field.js +3 -1
- package/dist/components/color-field/color-field.js.map +1 -1
- package/dist/components/color-picker/color-picker.d.ts +76 -9
- package/dist/components/color-picker/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/color-picker.js +89 -7
- package/dist/components/color-picker/color-picker.js.map +1 -1
- package/dist/components/color-picker/context.js +10 -1
- package/dist/components/color-picker/context.js.map +1 -1
- package/dist/components/color-picker/use-color-picker.js +14 -4
- package/dist/components/color-picker/use-color-picker.js.map +1 -1
- package/dist/components/color-swatch-picker/color-swatch-picker.d.ts.map +1 -1
- package/dist/components/color-swatch-picker/color-swatch-picker.js +21 -4
- package/dist/components/color-swatch-picker/color-swatch-picker.js.map +1 -1
- package/dist/components/color-swatch-picker/use-color-swatch-picker.d.ts +6 -1
- package/dist/components/color-swatch-picker/use-color-swatch-picker.d.ts.map +1 -1
- package/dist/components/color-swatch-picker/use-color-swatch-picker.js +7 -3
- package/dist/components/color-swatch-picker/use-color-swatch-picker.js.map +1 -1
- package/dist/components/combobox/combobox.d.ts +2 -0
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/combobox.js +6 -4
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/command/command.d.ts +3 -3
- package/dist/components/context-menu/context-menu.d.ts +9 -1
- package/dist/components/context-menu/context-menu.d.ts.map +1 -1
- package/dist/components/context-menu/context-menu.js +11 -1
- package/dist/components/context-menu/context-menu.js.map +1 -1
- package/dist/components/date-field/date-field.d.ts +6 -2
- package/dist/components/date-field/date-field.d.ts.map +1 -1
- package/dist/components/date-field/date-field.js +5 -2
- package/dist/components/date-field/date-field.js.map +1 -1
- package/dist/components/date-picker/context.js +10 -1
- package/dist/components/date-picker/context.js.map +1 -1
- package/dist/components/date-picker/date-picker.d.ts +58 -3
- package/dist/components/date-picker/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker/date-picker.js +77 -5
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.d.ts +27 -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 +10 -1
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/dialog/dialog.d.ts +12 -1
- package/dist/components/dialog/dialog.d.ts.map +1 -1
- package/dist/components/dialog/dialog.js +14 -4
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.d.ts +12 -1
- package/dist/components/drawer/drawer.d.ts.map +1 -1
- package/dist/components/drawer/drawer.js +14 -4
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/field/context.d.ts +6 -1
- package/dist/components/field/context.d.ts.map +1 -1
- package/dist/components/field/context.js +10 -1
- package/dist/components/field/context.js.map +1 -1
- package/dist/components/field/field.d.ts +9 -1
- package/dist/components/field/field.d.ts.map +1 -1
- package/dist/components/field/field.js +14 -2
- package/dist/components/field/field.js.map +1 -1
- package/dist/components/field/use-field-control.d.ts +8 -1
- package/dist/components/field/use-field-control.d.ts.map +1 -1
- package/dist/components/field/use-field-control.js +14 -1
- package/dist/components/field/use-field-control.js.map +1 -1
- package/dist/components/file-upload/file-upload.d.ts +2 -0
- package/dist/components/file-upload/file-upload.d.ts.map +1 -1
- package/dist/components/file-upload/file-upload.js +3 -1
- package/dist/components/file-upload/file-upload.js.map +1 -1
- package/dist/components/float-button/float-button.d.ts +26 -1
- package/dist/components/float-button/float-button.d.ts.map +1 -1
- package/dist/components/float-button/float-button.js +17 -5
- package/dist/components/float-button/float-button.js.map +1 -1
- package/dist/components/float-button/use-float-button.js +7 -1
- package/dist/components/float-button/use-float-button.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/context.js +5 -1
- package/dist/components/form/context.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/form/use-form-control.js +1 -1
- package/dist/components/funnel-chart/funnel-chart.d.ts.map +1 -1
- package/dist/components/funnel-chart/funnel-chart.js +2 -2
- package/dist/components/funnel-chart/funnel-chart.js.map +1 -1
- package/dist/components/graph-chart/graph-chart.d.ts.map +1 -1
- package/dist/components/graph-chart/graph-chart.js +2 -2
- package/dist/components/graph-chart/graph-chart.js.map +1 -1
- package/dist/components/hierarchy-chart/hierarchy-chart.d.ts.map +1 -1
- package/dist/components/hierarchy-chart/hierarchy-chart.js +2 -2
- package/dist/components/hierarchy-chart/hierarchy-chart.js.map +1 -1
- package/dist/components/hover-card/hover-card.js +2 -1
- package/dist/components/hover-card/hover-card.js.map +1 -1
- package/dist/components/image-viewer/image-viewer.d.ts +7 -1
- package/dist/components/image-viewer/image-viewer.d.ts.map +1 -1
- package/dist/components/image-viewer/image-viewer.js +1 -0
- package/dist/components/image-viewer/image-viewer.js.map +1 -1
- package/dist/components/mention/mention.d.ts +1 -1
- package/dist/components/mention/mention.js +5 -4
- package/dist/components/mention/mention.js.map +1 -1
- package/dist/components/menu/menu.js +31 -2
- 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 +9 -1
- package/dist/components/menubar/menubar.d.ts.map +1 -1
- package/dist/components/menubar/menubar.js +29 -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/pin-input/pin-input.d.ts.map +1 -1
- package/dist/components/pin-input/pin-input.js +7 -1
- package/dist/components/pin-input/pin-input.js.map +1 -1
- package/dist/components/popconfirm/popconfirm.d.ts +20 -1
- package/dist/components/popconfirm/popconfirm.d.ts.map +1 -1
- package/dist/components/popconfirm/popconfirm.js +9 -1
- package/dist/components/popconfirm/popconfirm.js.map +1 -1
- package/dist/components/popconfirm/use-popconfirm.js +2 -0
- package/dist/components/popconfirm/use-popconfirm.js.map +1 -1
- package/dist/components/popover/popover.d.ts +1 -1
- package/dist/components/popover/popover.js +2 -1
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/radar-chart/radar-chart.d.ts.map +1 -1
- package/dist/components/radar-chart/radar-chart.js +2 -2
- package/dist/components/radar-chart/radar-chart.js.map +1 -1
- package/dist/components/radio-group/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group/radio-group.js +25 -6
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/radio-group/use-radio-group.d.ts +5 -0
- package/dist/components/radio-group/use-radio-group.d.ts.map +1 -1
- package/dist/components/radio-group/use-radio-group.js +4 -1
- package/dist/components/radio-group/use-radio-group.js.map +1 -1
- package/dist/components/rating/rating.d.ts.map +1 -1
- package/dist/components/rating/rating.js +7 -1
- package/dist/components/rating/rating.js.map +1 -1
- package/dist/components/sankey-chart/sankey-chart.d.ts.map +1 -1
- package/dist/components/sankey-chart/sankey-chart.js +2 -2
- package/dist/components/sankey-chart/sankey-chart.js.map +1 -1
- package/dist/components/select/select.d.ts +13 -0
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/select/select.js +15 -4
- 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/signature-pad/signature-pad.d.ts +2 -0
- package/dist/components/signature-pad/signature-pad.d.ts.map +1 -1
- package/dist/components/signature-pad/signature-pad.js +3 -1
- package/dist/components/signature-pad/signature-pad.js.map +1 -1
- package/dist/components/slider/slider.d.ts.map +1 -1
- package/dist/components/slider/slider.js +7 -1
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/tags-input/tags-input.d.ts +2 -0
- package/dist/components/tags-input/tags-input.d.ts.map +1 -1
- package/dist/components/tags-input/tags-input.js +3 -1
- package/dist/components/tags-input/tags-input.js.map +1 -1
- package/dist/components/text-field/text-field.d.ts +2 -0
- package/dist/components/text-field/text-field.d.ts.map +1 -1
- package/dist/components/text-field/text-field.js +3 -1
- package/dist/components/text-field/text-field.js.map +1 -1
- package/dist/components/time-field/time-field.d.ts +2 -0
- package/dist/components/time-field/time-field.d.ts.map +1 -1
- package/dist/components/time-field/time-field.js +3 -1
- package/dist/components/time-field/time-field.js.map +1 -1
- package/dist/components/time-picker/context.js +10 -1
- package/dist/components/time-picker/context.js.map +1 -1
- package/dist/components/time-picker/time-picker.d.ts +78 -9
- package/dist/components/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/time-picker/time-picker.js +91 -9
- package/dist/components/time-picker/time-picker.js.map +1 -1
- package/dist/components/time-range-picker/time-range-picker.d.ts +2 -0
- package/dist/components/time-range-picker/time-range-picker.d.ts.map +1 -1
- package/dist/components/time-range-picker/time-range-picker.js +5 -2
- package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
- package/dist/components/toggle-group/toggle-group.d.ts.map +1 -1
- package/dist/components/toggle-group/toggle-group.js +7 -1
- package/dist/components/toggle-group/toggle-group.js.map +1 -1
- package/dist/components/tooltip/tooltip.js +2 -1
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/components/tour/tour.js +12 -3
- package/dist/components/tour/tour.js.map +1 -1
- package/dist/components/tree/tree.d.ts +2 -2
- package/dist/components/tree/tree.js +1 -1
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree-select/tree-select.d.ts +2 -0
- package/dist/components/tree-select/tree-select.d.ts.map +1 -1
- package/dist/components/tree-select/tree-select.js +6 -4
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/truncate/truncate.d.ts.map +1 -1
- package/dist/components/truncate/truncate.js +4 -8
- package/dist/components/truncate/truncate.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.js +8 -8
- 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 +13 -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/runtime/with-handlers.js +25 -0
- package/dist/runtime/with-handlers.js.map +1 -0
- 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":"signature-pad.js","names":[],"sources":["../../../src/components/signature-pad/signature-pad.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 signature pad 相关实现。\n\nimport type { SignaturePadApi, SignaturePadDrawingOptions, SignaturePadSchema, SignaturePadTranslations, SignaturePadValue } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideSignaturePad, useSignaturePadContext } from './context'\nimport { useSignaturePad } from './use-signature-pad'\n\ntype SignaturePadProps = SignaturePadSchema['props']\n\n/** 默认插槽的载荷:签名数据、笔迹路径与空态、落笔中标记,以及导出、清空、撤销与重做的动作。 */\nexport type SignaturePadRootSlotProps = Pick<\n SignaturePadApi,\n | 'value'\n | 'paths'\n | 'empty'\n | 'drawing'\n | 'disabled'\n | 'readOnly'\n | 'canUndo'\n | 'canRedo'\n | 'statusText'\n | 'toSvg'\n | 'clear'\n | 'undo'\n | 'redo'\n>\n\nexport const XhSignaturePadRoot = defineComponent({\n name: 'XhSignaturePadRoot',\n // 缺省值由 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n // 缺席值 undefined 表示非受控\n value: { type: Object as PropType<SignaturePadValue> },\n defaultValue: { type: Object as PropType<SignaturePadValue> },\n drawing: { type: Object as PropType<SignaturePadDrawingOptions> },\n translations: { type: Object as PropType<Partial<SignaturePadTranslations>> },\n },\n // draw / draw-end 是笔迹通知;value-change 携带 { value },update:value 携带裸值\n emits: {\n 'draw': (_details: PayloadOf<SignaturePadProps, 'onDraw'>) => true,\n 'draw-end': (_details: PayloadOf<SignaturePadProps, 'onDrawEnd'>) => true,\n 'value-change': (_details: PayloadOf<SignaturePadProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SignaturePadProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SignaturePadRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onDraw: SignaturePadProps['onDraw'] = details => emit('draw', details)\n const onDrawEnd: SignaturePadProps['onDrawEnd'] = details => emit('draw-end', details)\n const onValueChange: SignaturePadProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useSignaturePad(withXhConfig('signature-pad', useFormControlProps(props)) as SignaturePadProps, { onDraw, onDrawEnd, onValueChange })\n provideSignaturePad(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n paths: ctx.api.value.paths,\n empty: ctx.api.value.empty,\n drawing: ctx.api.value.drawing,\n disabled: ctx.api.value.disabled,\n readOnly: ctx.api.value.readOnly,\n canUndo: ctx.api.value.canUndo,\n canRedo: ctx.api.value.canRedo,\n statusText: ctx.api.value.statusText,\n toSvg: ctx.api.value.toSvg,\n clear: ctx.api.value.clear,\n undo: ctx.api.value.undo,\n redo: ctx.api.value.redo,\n }))\n },\n})\n\nexport const XhSignaturePadLabel = defineComponent({\n name: 'XhSignaturePadLabel',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 不用原生 label:画布是 svg、不是可被 label 关联的表单控件,名字经 aria-labelledby 挂过去\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadControl = defineComponent({\n name: 'XhSignaturePadControl',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 画布是 svg:笔迹与基准线都是图元。viewBox 由连接层按钉住的尺寸给,\n // 基准线与笔迹都建在这棵 svg 子树里,命名空间由它带下去\n return () => h('svg', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: ctx.controlRef,\n }, slots.default?.())\n },\n})\n\nexport const XhSignaturePadGuide = defineComponent({\n name: 'XhSignaturePadGuide',\n setup() {\n const ctx = useSignaturePadContext()\n return () => h('line', ctx.api.value.getGuideProps() as Record<string, unknown>)\n },\n})\n\nexport const XhSignaturePadPath = defineComponent({\n name: 'XhSignaturePadPath',\n setup() {\n const ctx = useSignaturePadContext()\n // 全部笔迹落在这一条路径上,每一笔是它的一条子路径\n return () => h('path', ctx.api.value.getPathProps() as Record<string, unknown>)\n },\n})\n\nexport const XhSignaturePadClearTrigger = defineComponent({\n name: 'XhSignaturePadClearTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadUndoTrigger = defineComponent({\n name: 'XhSignaturePadUndoTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getUndoTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadRedoTrigger = defineComponent({\n name: 'XhSignaturePadRedoTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getRedoTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadStatus = defineComponent({\n name: 'XhSignaturePadStatus',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 作者不写内容就用内建那句话,读屏才有东西可念\n return () => h(\n 'span',\n ctx.api.value.getStatusProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.statusText,\n )\n },\n})\n\nexport const XhSignaturePadHiddenInput = defineComponent({\n name: 'XhSignaturePadHiddenInput',\n setup() {\n const ctx = useSignaturePadContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"signature-pad.js","names":[],"sources":["../../../src/components/signature-pad/signature-pad.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 signature pad 相关实现。\n\nimport type { SignaturePadApi, SignaturePadDrawingOptions, SignaturePadSchema, SignaturePadTranslations, SignaturePadValue } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideSignaturePad, useSignaturePadContext } from './context'\nimport { useSignaturePad } from './use-signature-pad'\n\ntype SignaturePadProps = SignaturePadSchema['props']\n\n/** 默认插槽的载荷:签名数据、笔迹路径与空态、落笔中标记,以及导出、清空、撤销与重做的动作。 */\nexport type SignaturePadRootSlotProps = Pick<\n SignaturePadApi,\n | 'value'\n | 'paths'\n | 'empty'\n | 'drawing'\n | 'disabled'\n | 'readOnly'\n | 'canUndo'\n | 'canRedo'\n | 'statusText'\n | 'toSvg'\n | 'clear'\n | 'undo'\n | 'redo'\n>\n\nexport const XhSignaturePadRoot = defineComponent({\n name: 'XhSignaturePadRoot',\n // 缺省值由 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n // 缺席值 undefined 表示非受控\n value: { type: Object as PropType<SignaturePadValue> },\n defaultValue: { type: Object as PropType<SignaturePadValue> },\n drawing: { type: Object as PropType<SignaturePadDrawingOptions> },\n translations: { type: Object as PropType<Partial<SignaturePadTranslations>> },\n },\n // draw / draw-end 是笔迹通知;value-change 携带 { value },update:value 携带裸值\n emits: {\n 'clear': () => true,\n 'draw': (_details: PayloadOf<SignaturePadProps, 'onDraw'>) => true,\n 'draw-end': (_details: PayloadOf<SignaturePadProps, 'onDrawEnd'>) => true,\n 'value-change': (_details: PayloadOf<SignaturePadProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SignaturePadProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SignaturePadRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onDraw: SignaturePadProps['onDraw'] = details => emit('draw', details)\n const onDrawEnd: SignaturePadProps['onDrawEnd'] = details => emit('draw-end', details)\n const onValueChange: SignaturePadProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useSignaturePad(withHandlers(withXhConfig('signature-pad', useFormControlProps(props)), { onClear: () => emit('clear') }) as SignaturePadProps, { onDraw, onDrawEnd, onValueChange })\n provideSignaturePad(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n paths: ctx.api.value.paths,\n empty: ctx.api.value.empty,\n drawing: ctx.api.value.drawing,\n disabled: ctx.api.value.disabled,\n readOnly: ctx.api.value.readOnly,\n canUndo: ctx.api.value.canUndo,\n canRedo: ctx.api.value.canRedo,\n statusText: ctx.api.value.statusText,\n toSvg: ctx.api.value.toSvg,\n clear: ctx.api.value.clear,\n undo: ctx.api.value.undo,\n redo: ctx.api.value.redo,\n }))\n },\n})\n\nexport const XhSignaturePadLabel = defineComponent({\n name: 'XhSignaturePadLabel',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 不用原生 label:画布是 svg、不是可被 label 关联的表单控件,名字经 aria-labelledby 挂过去\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadControl = defineComponent({\n name: 'XhSignaturePadControl',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 画布是 svg:笔迹与基准线都是图元。viewBox 由连接层按钉住的尺寸给,\n // 基准线与笔迹都建在这棵 svg 子树里,命名空间由它带下去\n return () => h('svg', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: ctx.controlRef,\n }, slots.default?.())\n },\n})\n\nexport const XhSignaturePadGuide = defineComponent({\n name: 'XhSignaturePadGuide',\n setup() {\n const ctx = useSignaturePadContext()\n return () => h('line', ctx.api.value.getGuideProps() as Record<string, unknown>)\n },\n})\n\nexport const XhSignaturePadPath = defineComponent({\n name: 'XhSignaturePadPath',\n setup() {\n const ctx = useSignaturePadContext()\n // 全部笔迹落在这一条路径上,每一笔是它的一条子路径\n return () => h('path', ctx.api.value.getPathProps() as Record<string, unknown>)\n },\n})\n\nexport const XhSignaturePadClearTrigger = defineComponent({\n name: 'XhSignaturePadClearTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadUndoTrigger = defineComponent({\n name: 'XhSignaturePadUndoTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getUndoTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadRedoTrigger = defineComponent({\n name: 'XhSignaturePadRedoTrigger',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n return () => h('button', ctx.api.value.getRedoTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSignaturePadStatus = defineComponent({\n name: 'XhSignaturePadStatus',\n setup(_, { slots }) {\n const ctx = useSignaturePadContext()\n // 作者不写内容就用内建那句话,读屏才有东西可念\n return () => h(\n 'span',\n ctx.api.value.getStatusProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.statusText,\n )\n },\n})\n\nexport const XhSignaturePadHiddenInput = defineComponent({\n name: 'XhSignaturePadHiddenInput',\n setup() {\n const ctx = useSignaturePadContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":";;;;;;;AAqCA,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CAEN,OAAO;EACL,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,SAAS;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC7C,MAAM,EAAE,MAAM,OAAO;EAErB,OAAO,EAAE,MAAM,OAAsC;EACrD,cAAc,EAAE,MAAM,OAAsC;EAC5D,SAAS,EAAE,MAAM,OAA+C;EAChE,cAAc,EAAE,MAAM,OAAsD;CAC9E;CAEA,OAAO;EACL,eAAe;EACf,SAAS,aAAqD;EAC9D,aAAa,aAAwD;EACrE,iBAAiB,aAA4D;EAC7E,iBAAiB,WAAmE;CACtF;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,UAAsC,YAAW,KAAK,QAAQ,OAAO;EAC3E,MAAM,aAA4C,YAAW,KAAK,YAAY,OAAO;EACrF,MAAM,iBAAqD,YAAY;GACrE,KAAK,gBAAgB,OAAO;GAC5B,KAAK,gBAAgB,QAAQ,KAAK;EACpC;EACA,MAAM,MAAM,gBAAgB,aAAa,aAAa,iBAAiB,oBAAoB,KAAK,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,EAAE,CAAC,GAAwB;GAAE;GAAQ;GAAW;EAAc,CAAC;EAChM,oBAAoB,GAAG;EACvB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,OAAO,IAAI,IAAI,MAAM;GACrB,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,SAAS,IAAI,IAAI,MAAM;GACvB,SAAS,IAAI,IAAI,MAAM;GACvB,YAAY,IAAI,IAAI,MAAM;GAC1B,OAAO,IAAI,IAAI,MAAM;GACrB,OAAO,IAAI,IAAI,MAAM;GACrB,MAAM,IAAI,IAAI,MAAM;GACpB,MAAM,IAAI,IAAI,MAAM;EACtB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,uBAAuB;EAEnC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACpG;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,uBAAuB;EAGnC,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,gBAAgB;GACjC,KAAK,IAAI;EACX,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,uBAAuB;EACnC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,cAAc,CAA4B;CACjF;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,uBAAuB;EAEnC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,aAAa,CAA4B;CAChF;AACF,CAAC;AAED,MAAa,6BAA6B,gBAAgB;CACxD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,uBAAuB;EACnC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC7G;AACF,CAAC;AAED,MAAa,4BAA4B,gBAAgB;CACvD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,uBAAuB;EACnC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,oBAAoB,GAA8B,MAAM,UAAU,CAAC;CAC5G;AACF,CAAC;AAED,MAAa,4BAA4B,gBAAgB;CACvD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,uBAAuB;EACnC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,oBAAoB,GAA8B,MAAM,UAAU,CAAC;CAC5G;AACF,CAAC;AAED,MAAa,uBAAuB,gBAAgB;CAClD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,uBAAuB;EAEnC,aAAa,EACX,QACA,IAAI,IAAI,MAAM,eAAe,GAC7B,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,UACrC;CACF;AACF,CAAC;AAED,MAAa,4BAA4B,gBAAgB;CACvD,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,uBAAuB;EACnC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,oBAAoB,CAA4B;CACxF;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.d.ts","names":[],"sources":["../../../src/components/slider/slider.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"slider.d.ts","names":[],"sources":["../../../src/components/slider/slider.ts"],"mappings":";;;;;KAkBK,cAAc;;KAGP,sBAAsB,KAChC;;UAKe;EACf,MAAM;;cAGK,4BAAY,8BAAA;;IAIG,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;IAMP,MAAA,SAAS;;;;;;;;;;;;;;;;;;;IAKF,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;;;;;;;;;IAIR,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;IAGb,MAAA,UAAU,SAAS;;;;;EAKZ,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;EACJ,qBAAA,UAAA,UAAU;;;IA5BjB,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;IAMP,MAAA,SAAS;;;;;;;;;;;;;;;;;;;IAKF,MAAA,SAAS;;;IACjB,MAAA,SAAS;;;;;;;;;;;;;;;IAIR,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;IAGb,MAAA,UAAU,SAAS;;;;;;;;;;;;;;;EAU7B,WAAC,OAAO,wBAAwB;kCAqB5C;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAMxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAM1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAUxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;;EAGnB,QAAC,OAAO,iCAAiC;kCAclD;cAEW,6BAAa,0BAAA,oBAAA,4BAAA;;8BAMxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6BAAa,8BAAA;;;IAIa,MAAA;;;;;;;;IAAA,MAAA;;;;;qCAWrC;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAY5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useFormControlProps } from "../form/use-form-control.js";
|
|
2
|
+
import { useFieldGroupWiring, useFieldLabelWiring } from "../field/use-field-control.js";
|
|
2
3
|
import { provideSlider, provideSliderThumb, useSliderContext, useSliderThumbContext } from "./context.js";
|
|
3
4
|
import { useSlider } from "./use-slider.js";
|
|
4
5
|
import { computed, defineComponent, h } from "vue";
|
|
@@ -133,7 +134,12 @@ index: {
|
|
|
133
134
|
const ctx = useSliderContext();
|
|
134
135
|
const index = computed(() => normalizeItemIndex(props.index));
|
|
135
136
|
provideSliderThumb({ index });
|
|
136
|
-
|
|
137
|
+
const fieldWiring = useFieldGroupWiring();
|
|
138
|
+
const fieldLabel = useFieldLabelWiring();
|
|
139
|
+
return () => h("div", fieldLabel.value({
|
|
140
|
+
...fieldWiring.value,
|
|
141
|
+
...ctx.api.value.getThumbProps(index.value)
|
|
142
|
+
}), slots.default?.());
|
|
137
143
|
}
|
|
138
144
|
});
|
|
139
145
|
const XhSliderValueText = defineComponent({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.js","names":[],"sources":["../../../src/components/slider/slider.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 slider 相关实现。\n\nimport type { Direction, Orientation, Size, Tone } from '@xihan-ui/core'\nimport type { SliderApi, SliderMark, SliderMarkMeta, SliderSchema, SliderValueTextDetails } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { normalizeItemIndex } from '@xihan-ui/core'\nimport { computed, defineComponent, h } from 'vue'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideSlider, provideSliderThumb, useSliderContext, useSliderThumbContext } from './context'\nimport { useSlider } from './use-slider'\n\ntype SliderProps = SliderSchema['props']\n\n/** 默认插槽的载荷:当前值、逐个滑块的状态、已选区间与拖动标记,以及整份改值与单个滑块改值。 */\nexport type SliderRootSlotProps = Pick<\n SliderApi,\n 'value' | 'thumbs' | 'range' | 'dragging' | 'setValue' | 'setThumbValue'\n>\n\n/** tick 插槽的载荷:该档刻度的呈现数据。 */\nexport interface SliderTickGroupTickSlotProps {\n tick: SliderMarkMeta\n}\n\nexport const XhSliderRoot = defineComponent({\n name: 'XhSliderRoot',\n props: {\n // 值恒是数组,单滑块即长度 1;缺席值 undefined 表示非受控\n value: { type: Array as PropType<number[]> },\n defaultValue: { type: Array as PropType<number[]> },\n min: { type: Number },\n max: { type: Number },\n step: { type: Number },\n largeStep: { type: Number },\n minStepsBetweenThumbs: { type: Number },\n marks: { type: Array as PropType<SliderMark[]> },\n snapToMarks: { type: Boolean, default: undefined },\n inverted: { type: Boolean, default: undefined },\n draggableRange: { type: Boolean, default: undefined },\n trackFill: { type: Boolean, default: undefined },\n orientation: { type: String as PropType<Orientation> },\n dir: { type: String as PropType<Direction> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n name: { type: String },\n getValueText: {\n type: Function as PropType<(details: SliderValueTextDetails) => string>,\n },\n },\n // value-change 携带 { value },update:value 携带裸数组;value-change-end 只在操作收尾时发一次\n emits: {\n 'value-change': (_details: PayloadOf<SliderProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SliderProps, 'onValueChange'>['value']) => true,\n 'value-change-end': (_details: PayloadOf<SliderProps, 'onValueChangeEnd'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SliderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: SliderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyEnd: SliderProps['onValueChangeEnd'] = (details) => {\n emit('value-change-end', details)\n }\n const ctx = useSlider(useFormControlProps(props) as SliderProps, notify, notifyEnd)\n provideSlider(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n thumbs: ctx.api.value.thumbs,\n range: ctx.api.value.range,\n dragging: ctx.api.value.dragging,\n setValue: ctx.api.value.setValue,\n setThumbValue: ctx.api.value.setThumbValue,\n }))\n },\n})\n\nexport const XhSliderLabel = defineComponent({\n name: 'XhSliderLabel',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderControl = defineComponent({\n name: 'XhSliderControl',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderTrack = defineComponent({\n name: 'XhSliderTrack',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n // 轨道节点交给机器,矩形在指针事件里现量\n return () => h('div', {\n ...ctx.api.value.getTrackProps() as Record<string, unknown>,\n ref: ctx.trackRef,\n }, slots.default?.())\n },\n})\n\nexport const XhSliderTickGroup = defineComponent({\n name: 'XhSliderTickGroup',\n slots: Object as SlotsType<{\n tick?: (props: SliderTickGroupTickSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useSliderContext()\n // 刻度整组自动铺:圆点 + 文案(点文案跳值);tick 插槽可换文案内容\n return () => h('div', ctx.api.value.getTickGroupProps() as Record<string, unknown>, ctx.api.value.marks.flatMap(tick => [\n h('span', { ...ctx.api.value.getTickProps({ value: tick.value }) as Record<string, unknown>, key: `dot-${tick.value}` }),\n h(\n 'span',\n { ...ctx.api.value.getTickLabelProps({ value: tick.value }) as Record<string, unknown>, key: `label-${tick.value}` },\n slots.tick ? slots.tick({ tick }) : tick.label,\n ),\n ]))\n },\n})\n\nexport const XhSliderRange = defineComponent({\n name: 'XhSliderRange',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('div', ctx.api.value.getRangeProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderThumb = defineComponent({\n name: 'XhSliderThumb',\n props: {\n /** 第几个滑块,多滑块时必须逐个写明(`:index=\"i\"`);兼收字符串。 */\n index: { type: [Number, String] as PropType<number | string>, default: 0 },\n },\n setup(props, { slots }) {\n const ctx = useSliderContext()\n const index = computed(() => normalizeItemIndex(props.index))\n provideSliderThumb({ index })\n return () => h('div', ctx.api.value.getThumbProps(index.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderValueText = defineComponent({\n name: 'XhSliderValueText',\n setup(_, { slots }) {\n const { index } = useSliderThumbContext()\n const ctx = useSliderContext()\n // 值气泡:写在拇指里,没给内容就填这一个拇指的值文本\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps(index.value) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.valueText(index.value),\n )\n },\n})\n\nexport const XhSliderHiddenInput = defineComponent({\n name: 'XhSliderHiddenInput',\n setup() {\n const { index } = useSliderThumbContext()\n const ctx = useSliderContext()\n return () => h('input', ctx.api.value.getHiddenInputProps(index.value) as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slider.js","names":[],"sources":["../../../src/components/slider/slider.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 slider 相关实现。\n\nimport type { Direction, Orientation, Size, Tone } from '@xihan-ui/core'\nimport type { SliderApi, SliderMark, SliderMarkMeta, SliderSchema, SliderValueTextDetails } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { normalizeItemIndex } from '@xihan-ui/core'\nimport { computed, defineComponent, h } from 'vue'\nimport { useFieldGroupWiring, useFieldLabelWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideSlider, provideSliderThumb, useSliderContext, useSliderThumbContext } from './context'\nimport { useSlider } from './use-slider'\n\ntype SliderProps = SliderSchema['props']\n\n/** 默认插槽的载荷:当前值、逐个滑块的状态、已选区间与拖动标记,以及整份改值与单个滑块改值。 */\nexport type SliderRootSlotProps = Pick<\n SliderApi,\n 'value' | 'thumbs' | 'range' | 'dragging' | 'setValue' | 'setThumbValue'\n>\n\n/** tick 插槽的载荷:该档刻度的呈现数据。 */\nexport interface SliderTickGroupTickSlotProps {\n tick: SliderMarkMeta\n}\n\nexport const XhSliderRoot = defineComponent({\n name: 'XhSliderRoot',\n props: {\n // 值恒是数组,单滑块即长度 1;缺席值 undefined 表示非受控\n value: { type: Array as PropType<number[]> },\n defaultValue: { type: Array as PropType<number[]> },\n min: { type: Number },\n max: { type: Number },\n step: { type: Number },\n largeStep: { type: Number },\n minStepsBetweenThumbs: { type: Number },\n marks: { type: Array as PropType<SliderMark[]> },\n snapToMarks: { type: Boolean, default: undefined },\n inverted: { type: Boolean, default: undefined },\n draggableRange: { type: Boolean, default: undefined },\n trackFill: { type: Boolean, default: undefined },\n orientation: { type: String as PropType<Orientation> },\n dir: { type: String as PropType<Direction> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n name: { type: String },\n getValueText: {\n type: Function as PropType<(details: SliderValueTextDetails) => string>,\n },\n },\n // value-change 携带 { value },update:value 携带裸数组;value-change-end 只在操作收尾时发一次\n emits: {\n 'value-change': (_details: PayloadOf<SliderProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<SliderProps, 'onValueChange'>['value']) => true,\n 'value-change-end': (_details: PayloadOf<SliderProps, 'onValueChangeEnd'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: SliderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: SliderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyEnd: SliderProps['onValueChangeEnd'] = (details) => {\n emit('value-change-end', details)\n }\n const ctx = useSlider(useFormControlProps(props) as SliderProps, notify, notifyEnd)\n provideSlider(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n thumbs: ctx.api.value.thumbs,\n range: ctx.api.value.range,\n dragging: ctx.api.value.dragging,\n setValue: ctx.api.value.setValue,\n setThumbValue: ctx.api.value.setThumbValue,\n }))\n },\n})\n\nexport const XhSliderLabel = defineComponent({\n name: 'XhSliderLabel',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderControl = defineComponent({\n name: 'XhSliderControl',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderTrack = defineComponent({\n name: 'XhSliderTrack',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n // 轨道节点交给机器,矩形在指针事件里现量\n return () => h('div', {\n ...ctx.api.value.getTrackProps() as Record<string, unknown>,\n ref: ctx.trackRef,\n }, slots.default?.())\n },\n})\n\nexport const XhSliderTickGroup = defineComponent({\n name: 'XhSliderTickGroup',\n slots: Object as SlotsType<{\n tick?: (props: SliderTickGroupTickSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useSliderContext()\n // 刻度整组自动铺:圆点 + 文案(点文案跳值);tick 插槽可换文案内容\n return () => h('div', ctx.api.value.getTickGroupProps() as Record<string, unknown>, ctx.api.value.marks.flatMap(tick => [\n h('span', { ...ctx.api.value.getTickProps({ value: tick.value }) as Record<string, unknown>, key: `dot-${tick.value}` }),\n h(\n 'span',\n { ...ctx.api.value.getTickLabelProps({ value: tick.value }) as Record<string, unknown>, key: `label-${tick.value}` },\n slots.tick ? slots.tick({ tick }) : tick.label,\n ),\n ]))\n },\n})\n\nexport const XhSliderRange = defineComponent({\n name: 'XhSliderRange',\n setup(_, { slots }) {\n const ctx = useSliderContext()\n return () => h('div', ctx.api.value.getRangeProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhSliderThumb = defineComponent({\n name: 'XhSliderThumb',\n props: {\n /** 第几个滑块,多滑块时必须逐个写明(`:index=\"i\"`);兼收字符串。 */\n index: { type: [Number, String] as PropType<number | string>, default: 0 },\n },\n setup(props, { slots }) {\n const ctx = useSliderContext()\n const index = computed(() => normalizeItemIndex(props.index))\n provideSliderThumb({ index })\n // 放进表单字段时,字段的标题与说明接到拇指上:焦点落在拇指,读屏在这里念名字与说明\n const fieldWiring = useFieldGroupWiring()\n const fieldLabel = useFieldLabelWiring()\n return () => h('div', fieldLabel.value({ ...fieldWiring.value, ...ctx.api.value.getThumbProps(index.value) as Record<string, unknown> }), slots.default?.())\n },\n})\n\nexport const XhSliderValueText = defineComponent({\n name: 'XhSliderValueText',\n setup(_, { slots }) {\n const { index } = useSliderThumbContext()\n const ctx = useSliderContext()\n // 值气泡:写在拇指里,没给内容就填这一个拇指的值文本\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps(index.value) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.valueText(index.value),\n )\n },\n})\n\nexport const XhSliderHiddenInput = defineComponent({\n name: 'XhSliderHiddenInput',\n setup() {\n const { index } = useSliderThumbContext()\n const ctx = useSliderContext()\n return () => h('input', ctx.api.value.getHiddenInputProps(index.value) as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
|
|
@@ -74,6 +74,7 @@ declare const XhTagsInputRoot: import("vue").DefineComponent<import("vue").Extra
|
|
|
74
74
|
}>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
75
75
|
[key: string]: any;
|
|
76
76
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
77
|
+
clear: () => true;
|
|
77
78
|
'value-change': (_details: PayloadOf<TagsInputProps, "onValueChange">) => true;
|
|
78
79
|
'update:value': (_value: PayloadOf<TagsInputProps, "onValueChange">["value"]) => true;
|
|
79
80
|
'input-value-change': (_details: PayloadOf<TagsInputProps, "onInputValueChange">) => true;
|
|
@@ -145,6 +146,7 @@ declare const XhTagsInputRoot: import("vue").DefineComponent<import("vue").Extra
|
|
|
145
146
|
}>> & Readonly<{
|
|
146
147
|
"onValue-change"?: ((_details: import("@xihan-ui/headless").TagsInputValueChangeDetails) => any) | undefined;
|
|
147
148
|
"onUpdate:value"?: ((_value: string[]) => any) | undefined;
|
|
149
|
+
onClear?: (() => any) | undefined;
|
|
148
150
|
"onInput-value-change"?: ((_details: import("@xihan-ui/headless").TagsInputInputValueChangeDetails) => any) | undefined;
|
|
149
151
|
"onUpdate:inputValue"?: ((_inputValue: string) => any) | undefined;
|
|
150
152
|
"onTag-reject"?: ((_details: import("@xihan-ui/headless").TagsInputTagRejectDetails) => any) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags-input.d.ts","names":[],"sources":["../../../src/components/tags-input/tags-input.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"tags-input.d.ts","names":[],"sources":["../../../src/components/tags-input/tags-input.ts"],"mappings":";;;;;KAmBK,iBAAiB;;KAGV,0BAA0B,KAAK;;KAG/B,yBAAyB,KACnC;cAmBW,+BAAe,8BAAA;;IAKA,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYO,MAAA;;;IACR,MAAA,SAAS;;;;;IAGP,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;;EAKtB,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;EACF,uBAAA,UAAA,UAAU;EACR,sBAAA,aAAA,UAAU;EACpB,eAAA,UAAA,UAAU;;;IA9BX,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYO,MAAA;;;IACR,MAAA,SAAS;;;;;IAGP,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;;;;EAYvC,WAAC,OAAO,2BAA2B;kCAiC/C;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAU3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,8BAAA;;;;;;;;;;;;MAgC1B,oDAAA;;cAGW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAOjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAO9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,4CAA4B,0BAAA,oBAAA,4BAAA;;8BAOvC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;;EAGf,WAAC,OAAO,4BAA4B;kCAchD;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { withXhConfig } from "../../config/config.js";
|
|
2
|
+
import { withHandlers } from "../../runtime/with-handlers.js";
|
|
2
3
|
import { useFormControlProps } from "../form/use-form-control.js";
|
|
3
4
|
import { useFieldLabelWiring, useFieldStateWiring } from "../field/use-field-control.js";
|
|
4
5
|
import { provideTagsInput, provideTagsInputItem, useTagsInputContext, useTagsInputItemContext } from "./context.js";
|
|
@@ -44,6 +45,7 @@ const XhTagsInputRoot = defineComponent({
|
|
|
44
45
|
translations: { type: Object }
|
|
45
46
|
},
|
|
46
47
|
emits: {
|
|
48
|
+
"clear": () => true,
|
|
47
49
|
"value-change": (_details) => true,
|
|
48
50
|
"update:value": (_value) => true,
|
|
49
51
|
"input-value-change": (_details) => true,
|
|
@@ -61,7 +63,7 @@ const XhTagsInputRoot = defineComponent({
|
|
|
61
63
|
emit("update:inputValue", details.inputValue);
|
|
62
64
|
};
|
|
63
65
|
const onTagReject = (details) => emit("tag-reject", details);
|
|
64
|
-
const ctx = useTagsInput(withXhConfig("tags-input", useFormControlProps(props)), {
|
|
66
|
+
const ctx = useTagsInput(withHandlers(withXhConfig("tags-input", useFormControlProps(props)), { onClear: () => emit("clear") }), {
|
|
65
67
|
onValueChange,
|
|
66
68
|
onInputValueChange,
|
|
67
69
|
onTagReject
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags-input.js","names":[],"sources":["../../../src/components/tags-input/tags-input.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 tags input 相关实现。\n\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/core'\nimport type { TagsInputApi, TagsInputBlurBehavior, TagsInputItemProps, TagsInputSchema, TagsInputTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideTagsInput, provideTagsInputItem, useTagsInputContext, useTagsInputItemContext } from './context'\nimport { useTagsInput } from './use-tags-input'\n\ntype TagsInputProps = TagsInputSchema['props']\n\n/** 计数部件默认插槽的载荷:当前个数、上限与已达上限、越界两个标志。 */\nexport type TagsInputCountSlotProps = Pick<TagsInputApi, 'count' | 'max' | 'atMax' | 'overflow'>\n\n/** 默认插槽的载荷:标签集合与输入文本、数量与越界标志、光标与编辑锚点,以及增删改与清空的动作。 */\nexport type TagsInputRootSlotProps = Pick<\n TagsInputApi,\n | 'value'\n | 'count'\n | 'inputValue'\n | 'empty'\n | 'atMax'\n | 'overflow'\n | 'highlightedValue'\n | 'editedValue'\n | 'canClear'\n | 'setValue'\n | 'addValue'\n | 'deleteValue'\n | 'clear'\n | 'setInputValue'\n | 'highlight'\n | 'edit'\n>\n\nexport const XhTagsInputRoot = defineComponent({\n name: 'XhTagsInputRoot',\n // 有 connect 与机器兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: Array as PropType<string[]> },\n defaultValue: { type: Array as PropType<string[]> },\n inputValue: { type: String },\n defaultInputValue: { type: String },\n max: { type: Number },\n allowOverflow: Boolean,\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n showCount: Boolean,\n name: { type: String },\n placeholder: { type: String },\n delimiter: { type: [String, Array] as PropType<string | string[]> },\n validate: { type: Function as PropType<TagsInputProps['validate']> },\n addOnPaste: Boolean,\n editable: Boolean,\n blurBehavior: { type: String as PropType<TagsInputBlurBehavior | null> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<Partial<TagsInputTranslations>> },\n },\n // value-change 携带 { value },update:value 携带裸数组;输入文本走 input-value-change 一路\n emits: {\n 'value-change': (_details: PayloadOf<TagsInputProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TagsInputProps, 'onValueChange'>['value']) => true,\n 'input-value-change': (_details: PayloadOf<TagsInputProps, 'onInputValueChange'>) => true,\n 'update:inputValue': (_inputValue: PayloadOf<TagsInputProps, 'onInputValueChange'>['inputValue']) => true,\n 'tag-reject': (_details: PayloadOf<TagsInputProps, 'onTagReject'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TagsInputRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onValueChange: TagsInputProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const onInputValueChange: TagsInputProps['onInputValueChange'] = (details) => {\n emit('input-value-change', details)\n emit('update:inputValue', details.inputValue)\n }\n const onTagReject: TagsInputProps['onTagReject'] = details => emit('tag-reject', details)\n const ctx = useTagsInput(withXhConfig('tags-input', useFormControlProps(props)) as TagsInputProps, { onValueChange, onInputValueChange, onTagReject })\n provideTagsInput(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n count: ctx.api.value.count,\n inputValue: ctx.api.value.inputValue,\n empty: ctx.api.value.empty,\n atMax: ctx.api.value.atMax,\n overflow: ctx.api.value.overflow,\n highlightedValue: ctx.api.value.highlightedValue,\n editedValue: ctx.api.value.editedValue,\n canClear: ctx.api.value.canClear,\n setValue: ctx.api.value.setValue,\n addValue: ctx.api.value.addValue,\n deleteValue: ctx.api.value.deleteValue,\n clear: ctx.api.value.clear,\n setInputValue: ctx.api.value.setInputValue,\n highlight: ctx.api.value.highlight,\n edit: ctx.api.value.edit,\n }))\n },\n})\n\nexport const XhTagsInputLabel = defineComponent({\n name: 'XhTagsInputLabel',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n // 用原生 label,getLabelProps 的 for 指向输入框\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTagsInputControl = defineComponent({\n name: 'XhTagsInputControl',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => h('div', { ...(ctx.api.value.getControlProps() as Record<string, unknown>), ref: ctx.controlRef }, slots.default?.())\n },\n})\n\nexport const XhTagsInputInput = defineComponent({\n name: 'XhTagsInputInput',\n setup() {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTagsInputContext()\n return () => h('input', fieldLabel.value({ ...fieldWiring.value, ...ctx.api.value.getInputProps() as Record<string, unknown> }))\n },\n})\n\nexport const XhTagsInputItem = defineComponent({\n name: 'XhTagsInputItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTagsInputContext()\n const item = computed<TagsInputItemProps>(() => ({ value: props.value }))\n provideTagsInputItem({ item })\n // 本标签持有焦点时,value 变更或卸载都上报焦点离场以终止编辑会话\n const itemEl = ref<HTMLElement | null>(null)\n const holdsFocus = (): boolean => {\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return false\n const active = service.scope.getActiveElement()\n return !!itemEl.value && !!active && (itemEl.value === active || itemEl.value.contains(active))\n }\n watch(() => props.value, (next, prev) => {\n if (next !== prev && holdsFocus())\n ctx.service.send({ type: 'ITEM.FOCUS_LOST' })\n })\n onBeforeUnmount(() => {\n if (holdsFocus())\n ctx.service.send({ type: 'ITEM.FOCUS_LOST' })\n })\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\n/** 标签的预览:渲染为库内 tag 的 root(data-scope=\"tag\"),就地编辑时由 tag 收起。 */\nexport const XhTagsInputItemPreview = defineComponent({\n name: 'XhTagsInputItemPreview',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('span', ctx.api.value.getItemPreviewProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签文字:渲染为 tag 的 label,截断落在这一层。 */\nexport const XhTagsInputItemText = defineComponent({\n name: 'XhTagsInputItemText',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 删除按钮:渲染为所在标签那份 tag 的 close-trigger,不占 Tab 位;禁用与只读时保留位置、原生 disabled。 */\nexport const XhTagsInputItemDeleteTrigger = defineComponent({\n name: 'XhTagsInputItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTagsInputItemInput = defineComponent({\n name: 'XhTagsInputItemInput',\n setup() {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('input', ctx.api.value.getItemInputProps(item.value) as Record<string, unknown>)\n },\n})\n\nexport const XhTagsInputClearTrigger = defineComponent({\n name: 'XhTagsInputClearTrigger',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 计数:未写内容时渲染「已用 / 上限」,未设上限时只渲染已用。 */\nexport const XhTagsInputCount = defineComponent({\n name: 'XhTagsInputCount',\n slots: Object as SlotsType<{\n default?: (props: TagsInputCountSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => {\n const api = ctx.api.value\n const fallback = api.max === undefined ? `${api.count}` : `${api.count} / ${api.max}`\n return h(\n 'span',\n api.getCountProps() as Record<string, unknown>,\n slots.default?.({ count: api.count, max: api.max, atMax: api.atMax, overflow: api.overflow }) ?? fallback,\n )\n }\n },\n})\n\nexport const XhTagsInputHiddenInput = defineComponent({\n name: 'XhTagsInputHiddenInput',\n setup() {\n const ctx = useTagsInputContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tags-input.js","names":[],"sources":["../../../src/components/tags-input/tags-input.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 tags input 相关实现。\n\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/core'\nimport type { TagsInputApi, TagsInputBlurBehavior, TagsInputItemProps, TagsInputSchema, TagsInputTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideTagsInput, provideTagsInputItem, useTagsInputContext, useTagsInputItemContext } from './context'\nimport { useTagsInput } from './use-tags-input'\n\ntype TagsInputProps = TagsInputSchema['props']\n\n/** 计数部件默认插槽的载荷:当前个数、上限与已达上限、越界两个标志。 */\nexport type TagsInputCountSlotProps = Pick<TagsInputApi, 'count' | 'max' | 'atMax' | 'overflow'>\n\n/** 默认插槽的载荷:标签集合与输入文本、数量与越界标志、光标与编辑锚点,以及增删改与清空的动作。 */\nexport type TagsInputRootSlotProps = Pick<\n TagsInputApi,\n | 'value'\n | 'count'\n | 'inputValue'\n | 'empty'\n | 'atMax'\n | 'overflow'\n | 'highlightedValue'\n | 'editedValue'\n | 'canClear'\n | 'setValue'\n | 'addValue'\n | 'deleteValue'\n | 'clear'\n | 'setInputValue'\n | 'highlight'\n | 'edit'\n>\n\nexport const XhTagsInputRoot = defineComponent({\n name: 'XhTagsInputRoot',\n // 有 connect 与机器兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: Array as PropType<string[]> },\n defaultValue: { type: Array as PropType<string[]> },\n inputValue: { type: String },\n defaultInputValue: { type: String },\n max: { type: Number },\n allowOverflow: Boolean,\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n showCount: Boolean,\n name: { type: String },\n placeholder: { type: String },\n delimiter: { type: [String, Array] as PropType<string | string[]> },\n validate: { type: Function as PropType<TagsInputProps['validate']> },\n addOnPaste: Boolean,\n editable: Boolean,\n blurBehavior: { type: String as PropType<TagsInputBlurBehavior | null> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<Partial<TagsInputTranslations>> },\n },\n // value-change 携带 { value },update:value 携带裸数组;输入文本走 input-value-change 一路\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<TagsInputProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TagsInputProps, 'onValueChange'>['value']) => true,\n 'input-value-change': (_details: PayloadOf<TagsInputProps, 'onInputValueChange'>) => true,\n 'update:inputValue': (_inputValue: PayloadOf<TagsInputProps, 'onInputValueChange'>['inputValue']) => true,\n 'tag-reject': (_details: PayloadOf<TagsInputProps, 'onTagReject'>) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TagsInputRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onValueChange: TagsInputProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const onInputValueChange: TagsInputProps['onInputValueChange'] = (details) => {\n emit('input-value-change', details)\n emit('update:inputValue', details.inputValue)\n }\n const onTagReject: TagsInputProps['onTagReject'] = details => emit('tag-reject', details)\n const ctx = useTagsInput(withHandlers(withXhConfig('tags-input', useFormControlProps(props)), { onClear: () => emit('clear') }) as TagsInputProps, { onValueChange, onInputValueChange, onTagReject })\n provideTagsInput(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n value: ctx.api.value.value,\n count: ctx.api.value.count,\n inputValue: ctx.api.value.inputValue,\n empty: ctx.api.value.empty,\n atMax: ctx.api.value.atMax,\n overflow: ctx.api.value.overflow,\n highlightedValue: ctx.api.value.highlightedValue,\n editedValue: ctx.api.value.editedValue,\n canClear: ctx.api.value.canClear,\n setValue: ctx.api.value.setValue,\n addValue: ctx.api.value.addValue,\n deleteValue: ctx.api.value.deleteValue,\n clear: ctx.api.value.clear,\n setInputValue: ctx.api.value.setInputValue,\n highlight: ctx.api.value.highlight,\n edit: ctx.api.value.edit,\n }))\n },\n})\n\nexport const XhTagsInputLabel = defineComponent({\n name: 'XhTagsInputLabel',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n // 用原生 label,getLabelProps 的 for 指向输入框\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTagsInputControl = defineComponent({\n name: 'XhTagsInputControl',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => h('div', { ...(ctx.api.value.getControlProps() as Record<string, unknown>), ref: ctx.controlRef }, slots.default?.())\n },\n})\n\nexport const XhTagsInputInput = defineComponent({\n name: 'XhTagsInputInput',\n setup() {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTagsInputContext()\n return () => h('input', fieldLabel.value({ ...fieldWiring.value, ...ctx.api.value.getInputProps() as Record<string, unknown> }))\n },\n})\n\nexport const XhTagsInputItem = defineComponent({\n name: 'XhTagsInputItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTagsInputContext()\n const item = computed<TagsInputItemProps>(() => ({ value: props.value }))\n provideTagsInputItem({ item })\n // 本标签持有焦点时,value 变更或卸载都上报焦点离场以终止编辑会话\n const itemEl = ref<HTMLElement | null>(null)\n const holdsFocus = (): boolean => {\n const { service } = ctx\n if (service.getStatus() !== 'Started')\n return false\n const active = service.scope.getActiveElement()\n return !!itemEl.value && !!active && (itemEl.value === active || itemEl.value.contains(active))\n }\n watch(() => props.value, (next, prev) => {\n if (next !== prev && holdsFocus())\n ctx.service.send({ type: 'ITEM.FOCUS_LOST' })\n })\n onBeforeUnmount(() => {\n if (holdsFocus())\n ctx.service.send({ type: 'ITEM.FOCUS_LOST' })\n })\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: itemEl },\n slots.default?.(),\n )\n },\n})\n\n/** 标签的预览:渲染为库内 tag 的 root(data-scope=\"tag\"),就地编辑时由 tag 收起。 */\nexport const XhTagsInputItemPreview = defineComponent({\n name: 'XhTagsInputItemPreview',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('span', ctx.api.value.getItemPreviewProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签文字:渲染为 tag 的 label,截断落在这一层。 */\nexport const XhTagsInputItemText = defineComponent({\n name: 'XhTagsInputItemText',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 删除按钮:渲染为所在标签那份 tag 的 close-trigger,不占 Tab 位;禁用与只读时保留位置、原生 disabled。 */\nexport const XhTagsInputItemDeleteTrigger = defineComponent({\n name: 'XhTagsInputItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTagsInputItemInput = defineComponent({\n name: 'XhTagsInputItemInput',\n setup() {\n const ctx = useTagsInputContext()\n const { item } = useTagsInputItemContext()\n return () => h('input', ctx.api.value.getItemInputProps(item.value) as Record<string, unknown>)\n },\n})\n\nexport const XhTagsInputClearTrigger = defineComponent({\n name: 'XhTagsInputClearTrigger',\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 计数:未写内容时渲染「已用 / 上限」,未设上限时只渲染已用。 */\nexport const XhTagsInputCount = defineComponent({\n name: 'XhTagsInputCount',\n slots: Object as SlotsType<{\n default?: (props: TagsInputCountSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useTagsInputContext()\n return () => {\n const api = ctx.api.value\n const fallback = api.max === undefined ? `${api.count}` : `${api.count} / ${api.max}`\n return h(\n 'span',\n api.getCountProps() as Record<string, unknown>,\n slots.default?.({ count: api.count, max: api.max, atMax: api.atMax, overflow: api.overflow }) ?? fallback,\n )\n }\n },\n})\n\nexport const XhTagsInputHiddenInput = defineComponent({\n name: 'XhTagsInputHiddenInput',\n setup() {\n const ctx = useTagsInputContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
|
|
@@ -64,6 +64,7 @@ declare const XhTextFieldRoot: import("vue").DefineComponent<import("vue").Extra
|
|
|
64
64
|
}>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
65
65
|
[key: string]: any;
|
|
66
66
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
67
|
+
clear: () => true;
|
|
67
68
|
'value-change': (_details: PayloadOf<TextFieldProps, "onValueChange">) => true;
|
|
68
69
|
'update:value': (_value: PayloadOf<TextFieldProps, "onValueChange">["value"]) => true;
|
|
69
70
|
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
@@ -122,6 +123,7 @@ declare const XhTextFieldRoot: import("vue").DefineComponent<import("vue").Extra
|
|
|
122
123
|
}>> & Readonly<{
|
|
123
124
|
"onValue-change"?: ((_details: import("@xihan-ui/headless").TextFieldValueChangeDetails) => any) | undefined;
|
|
124
125
|
"onUpdate:value"?: ((_value: string) => any) | undefined;
|
|
126
|
+
onClear?: (() => any) | undefined;
|
|
125
127
|
}>, {
|
|
126
128
|
required: boolean;
|
|
127
129
|
invalid: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-field.d.ts","names":[],"sources":["../../../src/components/text-field/text-field.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"text-field.d.ts","names":[],"sources":["../../../src/components/text-field/text-field.ts"],"mappings":";;;;;KAoBK,iBAAiB;;KAGV,yBAAyB,KACnC;;KAKU,0BAA0B,KAAK;cAE9B,+BAAe,8BAAA;;;;;;;;IAMA,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAWM,MAAA,SAAS;;;;IACrB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;;EAKd,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;IArBX,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAWM,MAAA,SAAS;;;;IACrB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACD,MAAA,SAAS;;;;;;;;;;;;;;;EAS/B,WAAC,OAAO,2BAA2B;kCAmB/C;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,8BAAA;;;IAIH,MAAA,SAAS;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAkCjC;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;;EAGf,WAAC,OAAO,4BAA4B;kCAchD"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { withXhConfig } from "../../config/config.js";
|
|
2
|
+
import { withHandlers } from "../../runtime/with-handlers.js";
|
|
2
3
|
import { useFormControlProps } from "../form/use-form-control.js";
|
|
3
4
|
import { useFieldLabelWiring, useFieldStateWiring } from "../field/use-field-control.js";
|
|
4
5
|
import { provideTextField, useTextFieldContext } from "./context.js";
|
|
@@ -43,6 +44,7 @@ const XhTextFieldRoot = defineComponent({
|
|
|
43
44
|
translations: { type: Object }
|
|
44
45
|
},
|
|
45
46
|
emits: {
|
|
47
|
+
"clear": () => true,
|
|
46
48
|
"value-change": (_details) => true,
|
|
47
49
|
"update:value": (_value) => true
|
|
48
50
|
},
|
|
@@ -52,7 +54,7 @@ const XhTextFieldRoot = defineComponent({
|
|
|
52
54
|
emit("value-change", details);
|
|
53
55
|
emit("update:value", details.value);
|
|
54
56
|
};
|
|
55
|
-
const ctx = useTextField(withXhConfig("text-field", useFormControlProps(props)), notify);
|
|
57
|
+
const ctx = useTextField(withHandlers(withXhConfig("text-field", useFormControlProps(props)), { onClear: () => emit("clear") }), notify);
|
|
56
58
|
provideTextField(ctx);
|
|
57
59
|
return () => h("div", ctx.api.value.getRootProps(), slots.default?.({
|
|
58
60
|
value: ctx.api.value.value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-field.js","names":[],"sources":["../../../src/components/text-field/text-field.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// 提供 text field 相关实现。\n\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/core'\nimport type { TextFieldApi, TextFieldInputHost, TextFieldSchema, TextFieldType } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { autoSizeTextarea } from '@xihan-ui/headless'\nimport { defineComponent, h, onBeforeUnmount, onMounted, onUpdated, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-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' | 'count' | 'canClear' | 'setValue' | 'clear'\n>\n\n/** 字数部件默认插槽的载荷:当前字数、上限与已达上限的标志。 */\nexport type TextFieldCountSlotProps = Pick<TextFieldApi, 'count' | 'maxLength' | 'atLimit'>\n\nexport const XhTextFieldRoot = defineComponent({\n name: 'XhTextFieldRoot',\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: String },\n defaultValue: { type: String },\n type: { type: String as PropType<TextFieldType> },\n placeholder: { type: String },\n // undefined 才表示「本实例没说」,Form/Field 才能安全地下传状态;false 是显式顶掉继承。\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n maxLength: { type: Number },\n clearable: Boolean,\n showCount: Boolean,\n autoSize: { type: [Boolean, Object] as PropType<TextFieldProps['autoSize']>, default: undefined },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<TextFieldProps['translations']> },\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', useFormControlProps(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 count: ctx.api.value.count,\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 const setInputRef = (node: unknown): void => {\n const next = props.as === 'textarea' ? node as HTMLTextAreaElement | null : null\n if (el.value && el.value !== next)\n autoSizeTextarea(el.value, false)\n el.value = next\n }\n const syncAutoSize = (): void => {\n if (el.value)\n autoSizeTextarea(el.value, ctx.api.value.autoSize)\n }\n // 模板 ref 赋值时节点尚未接入 Document;挂载及更新提交后再量,程序化写值与配置变化也走这条。\n onMounted(syncAutoSize)\n onUpdated(syncAutoSize)\n onBeforeUnmount(() => {\n if (el.value)\n autoSizeTextarea(el.value, false)\n el.value = null\n })\n // 自己渲染宿主节点,label 的 for 指向它\n return () => h(props.as, fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getInputProps({ as: props.as }) as Record<string, unknown>,\n ref: setInputRef,\n }))\n },\n})\n\nexport const XhTextFieldPrefix = defineComponent({\n name: 'XhTextFieldPrefix',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n return () => h('span', ctx.api.value.getPrefixProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTextFieldSuffix = defineComponent({\n name: 'XhTextFieldSuffix',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n return () => h('span', ctx.api.value.getSuffixProps() as Record<string, unknown>, slots.default?.())\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\n/** 字数:未写内容时渲染 `已用 / 上限`,未设上限时只渲染已用。 */\nexport const XhTextFieldCount = defineComponent({\n name: 'XhTextFieldCount',\n slots: Object as SlotsType<{\n default?: (props: TextFieldCountSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n return () => {\n const api = ctx.api.value\n const fallback = api.maxLength === undefined ? `${api.count}` : `${api.count} / ${api.maxLength}`\n return h(\n 'span',\n api.getCountProps() as Record<string, unknown>,\n slots.default?.({ count: api.count, maxLength: api.maxLength, atLimit: api.atLimit }) ?? fallback,\n )\n }\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"text-field.js","names":[],"sources":["../../../src/components/text-field/text-field.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// 提供 text field 相关实现。\n\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/core'\nimport type { TextFieldApi, TextFieldInputHost, TextFieldSchema, TextFieldType } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { autoSizeTextarea } from '@xihan-ui/headless'\nimport { defineComponent, h, onBeforeUnmount, onMounted, onUpdated, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { 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' | 'count' | 'canClear' | 'setValue' | 'clear'\n>\n\n/** 字数部件默认插槽的载荷:当前字数、上限与已达上限的标志。 */\nexport type TextFieldCountSlotProps = Pick<TextFieldApi, 'count' | 'maxLength' | 'atLimit'>\n\nexport const XhTextFieldRoot = defineComponent({\n name: 'XhTextFieldRoot',\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: String },\n defaultValue: { type: String },\n type: { type: String as PropType<TextFieldType> },\n placeholder: { type: String },\n // undefined 才表示「本实例没说」,Form/Field 才能安全地下传状态;false 是显式顶掉继承。\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n name: { type: String },\n maxLength: { type: Number },\n clearable: Boolean,\n showCount: Boolean,\n autoSize: { type: [Boolean, Object] as PropType<TextFieldProps['autoSize']>, default: undefined },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n translations: { type: Object as PropType<TextFieldProps['translations']> },\n },\n // value-change 携带 { value },update:value 携带裸串\n emits: {\n 'clear': () => true,\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(withHandlers(withXhConfig('text-field', useFormControlProps(props)), { onClear: () => emit('clear') }) 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 count: ctx.api.value.count,\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 const setInputRef = (node: unknown): void => {\n const next = props.as === 'textarea' ? node as HTMLTextAreaElement | null : null\n if (el.value && el.value !== next)\n autoSizeTextarea(el.value, false)\n el.value = next\n }\n const syncAutoSize = (): void => {\n if (el.value)\n autoSizeTextarea(el.value, ctx.api.value.autoSize)\n }\n // 模板 ref 赋值时节点尚未接入 Document;挂载及更新提交后再量,程序化写值与配置变化也走这条。\n onMounted(syncAutoSize)\n onUpdated(syncAutoSize)\n onBeforeUnmount(() => {\n if (el.value)\n autoSizeTextarea(el.value, false)\n el.value = null\n })\n // 自己渲染宿主节点,label 的 for 指向它\n return () => h(props.as, fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getInputProps({ as: props.as }) as Record<string, unknown>,\n ref: setInputRef,\n }))\n },\n})\n\nexport const XhTextFieldPrefix = defineComponent({\n name: 'XhTextFieldPrefix',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n return () => h('span', ctx.api.value.getPrefixProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTextFieldSuffix = defineComponent({\n name: 'XhTextFieldSuffix',\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n return () => h('span', ctx.api.value.getSuffixProps() as Record<string, unknown>, slots.default?.())\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\n/** 字数:未写内容时渲染 `已用 / 上限`,未设上限时只渲染已用。 */\nexport const XhTextFieldCount = defineComponent({\n name: 'XhTextFieldCount',\n slots: Object as SlotsType<{\n default?: (props: TextFieldCountSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useTextFieldContext()\n return () => {\n const api = ctx.api.value\n const fallback = api.maxLength === undefined ? `${api.count}` : `${api.count} / ${api.maxLength}`\n return h(\n 'span',\n api.getCountProps() as Record<string, unknown>,\n slots.default?.({ count: api.count, maxLength: api.maxLength, atLimit: api.atLimit }) ?? fallback,\n )\n }\n },\n})\n"],"mappings":"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"}
|
|
@@ -65,6 +65,7 @@ declare const XhTimeFieldRoot: import("vue").DefineComponent<import("vue").Extra
|
|
|
65
65
|
}>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
66
66
|
[key: string]: any;
|
|
67
67
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
68
|
+
clear: () => true;
|
|
68
69
|
'value-change': (_details: PayloadOf<TimeFieldProps, "onValueChange">) => true;
|
|
69
70
|
'update:value': (_value: PayloadOf<TimeFieldProps, "onValueChange">["value"]) => true;
|
|
70
71
|
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
@@ -126,6 +127,7 @@ declare const XhTimeFieldRoot: import("vue").DefineComponent<import("vue").Extra
|
|
|
126
127
|
}>> & Readonly<{
|
|
127
128
|
"onValue-change"?: ((_details: import("@xihan-ui/headless").TimeFieldValueChangeDetails) => any) | undefined;
|
|
128
129
|
"onUpdate:value"?: ((_value: string) => any) | undefined;
|
|
130
|
+
onClear?: (() => any) | undefined;
|
|
129
131
|
}>, {
|
|
130
132
|
required: boolean;
|
|
131
133
|
invalid: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-field.d.ts","names":[],"sources":["../../../src/components/time-field/time-field.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"time-field.d.ts","names":[],"sources":["../../../src/components/time-field/time-field.ts"],"mappings":";;;;;KAkBK,iBAAiB;;KAGV,yBAAyB,KACnC;cAIW,+BAAe,8BAAA;;;;;;;;;;;;;;;;;IAUK,MAAA,SAAS;;;IACP,MAAA,SAAS;;;;;;;IAER,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IAMd,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;EAKN,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;;;;;;;;;;IAjBN,MAAA,SAAS;;;IACP,MAAA,SAAS;;;;;;;IAER,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IAMd,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;;;;EASvB,WAAC,OAAO,2BAA2B;kCAsB/C;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAO3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,kCAAkB,8BAAA;;IAIA,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;;MAWtC,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { withXhConfig } from "../../config/config.js";
|
|
2
|
+
import { withHandlers } from "../../runtime/with-handlers.js";
|
|
2
3
|
import { useFormControlProps } from "../form/use-form-control.js";
|
|
3
4
|
import { provideTimeField, useTimeFieldContext } from "./context.js";
|
|
4
5
|
import { useTimeField } from "./use-time-field.js";
|
|
@@ -38,6 +39,7 @@ const XhTimeFieldRoot = defineComponent({
|
|
|
38
39
|
size: { type: String }
|
|
39
40
|
},
|
|
40
41
|
emits: {
|
|
42
|
+
"clear": () => true,
|
|
41
43
|
"value-change": (_details) => true,
|
|
42
44
|
"update:value": (_value) => true
|
|
43
45
|
},
|
|
@@ -47,7 +49,7 @@ const XhTimeFieldRoot = defineComponent({
|
|
|
47
49
|
emit("value-change", details);
|
|
48
50
|
emit("update:value", details.value);
|
|
49
51
|
};
|
|
50
|
-
const ctx = useTimeField(withXhConfig("time-field", useFormControlProps(props)), { onValueChange });
|
|
52
|
+
const ctx = useTimeField(withHandlers(withXhConfig("time-field", useFormControlProps(props)), { onClear: () => emit("clear") }), { onValueChange });
|
|
51
53
|
provideTimeField(ctx);
|
|
52
54
|
return () => h("div", ctx.api.value.getRootProps(), slots.default?.({
|
|
53
55
|
value: ctx.api.value.value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-field.js","names":[],"sources":["../../../src/components/time-field/time-field.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 field 相关实现。\n\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/core'\nimport type { TimeFieldApi, TimeFieldSchema, TimeGranularity, TimeHourCycle, TimeSegmentType } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideTimeField, useTimeFieldContext } from './context'\nimport { useTimeField } from './use-time-field'\n\ntype TimeFieldProps = TimeFieldSchema['props']\n\n/** 默认插槽的载荷:当前值、值状态标志、参与显示的段与写值方法。 */\nexport type TimeFieldRootSlotProps = Pick<\n TimeFieldApi,\n 'value' | 'empty' | 'outOfRange' | 'canClear' | 'segments' | 'focusedSegment' | 'hourCycle' | 'granularity' | 'setValue' | 'clear'\n>\n\nexport const XhTimeFieldRoot = defineComponent({\n name: 'XhTimeFieldRoot',\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: String },\n defaultValue: { type: String },\n min: { type: String },\n max: { type: String },\n locale: { type: String },\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n hourCycle: { type: Number as PropType<TimeHourCycle> },\n granularity: { type: String as PropType<TimeGranularity> },\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<TimeFieldProps['translations']> },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n placeholder: { type: String },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // value-change 携带 { value },update:value 携带裸串\n emits: {\n 'value-change': (_details: PayloadOf<TimeFieldProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TimeFieldProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TimeFieldRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onValueChange: TimeFieldProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useTimeField(withXhConfig('time-field', useFormControlProps(props)) as TimeFieldProps, { onValueChange })\n provideTimeField(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 outOfRange: ctx.api.value.outOfRange,\n canClear: ctx.api.value.canClear,\n segments: ctx.api.value.segments,\n focusedSegment: ctx.api.value.focusedSegment,\n hourCycle: ctx.api.value.hourCycle,\n granularity: ctx.api.value.granularity,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n }))\n },\n})\n\nexport const XhTimeFieldLabel = defineComponent({\n name: 'XhTimeFieldLabel',\n setup(_, { slots }) {\n const ctx = useTimeFieldContext()\n // 仍用原生 label 保持表单语义,点标题聚焦第一段由连接层的 click 接管\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeFieldControl = defineComponent({\n name: 'XhTimeFieldControl',\n setup(_, { slots }) {\n const ctx = useTimeFieldContext()\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeFieldSegmentGroup = defineComponent({\n name: 'XhTimeFieldSegmentGroup',\n setup(_, { slots }) {\n const ctx = useTimeFieldContext()\n return () => h('div', ctx.api.value.getSegmentGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeFieldSegment = defineComponent({\n name: 'XhTimeFieldSegment',\n props: {\n // 段的身份由作者声明\n segment: { type: String as PropType<TimeSegmentType>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimeFieldContext()\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 XhTimeFieldClearTrigger = defineComponent({\n name: 'XhTimeFieldClearTrigger',\n setup(_, { slots }) {\n const ctx = useTimeFieldContext()\n // 没写内容时由皮肤画兜底字形\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeFieldHiddenInput = defineComponent({\n name: 'XhTimeFieldHiddenInput',\n setup() {\n const ctx = useTimeFieldContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"time-field.js","names":[],"sources":["../../../src/components/time-field/time-field.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 field 相关实现。\n\nimport type { ControlVariant, Size, Tone } from '@xihan-ui/core'\nimport type { TimeFieldApi, TimeFieldSchema, TimeGranularity, TimeHourCycle, TimeSegmentType } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideTimeField, useTimeFieldContext } from './context'\nimport { useTimeField } from './use-time-field'\n\ntype TimeFieldProps = TimeFieldSchema['props']\n\n/** 默认插槽的载荷:当前值、值状态标志、参与显示的段与写值方法。 */\nexport type TimeFieldRootSlotProps = Pick<\n TimeFieldApi,\n 'value' | 'empty' | 'outOfRange' | 'canClear' | 'segments' | 'focusedSegment' | 'hourCycle' | 'granularity' | 'setValue' | 'clear'\n>\n\nexport const XhTimeFieldRoot = defineComponent({\n name: 'XhTimeFieldRoot',\n props: {\n // 缺席值 undefined 表示非受控\n value: { type: String },\n defaultValue: { type: String },\n min: { type: String },\n max: { type: String },\n locale: { type: String },\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n hourCycle: { type: Number as PropType<TimeHourCycle> },\n granularity: { type: String as PropType<TimeGranularity> },\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<TimeFieldProps['translations']> },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n placeholder: { type: String },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // value-change 携带 { value },update:value 携带裸串\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<TimeFieldProps, 'onValueChange'>) => true,\n 'update:value': (_value: PayloadOf<TimeFieldProps, 'onValueChange'>['value']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TimeFieldRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const onValueChange: TimeFieldProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const ctx = useTimeField(withHandlers(withXhConfig('time-field', useFormControlProps(props)), { onClear: () => emit('clear') }) as TimeFieldProps, { onValueChange })\n provideTimeField(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 outOfRange: ctx.api.value.outOfRange,\n canClear: ctx.api.value.canClear,\n segments: ctx.api.value.segments,\n focusedSegment: ctx.api.value.focusedSegment,\n hourCycle: ctx.api.value.hourCycle,\n granularity: ctx.api.value.granularity,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n }))\n },\n})\n\nexport const XhTimeFieldLabel = defineComponent({\n name: 'XhTimeFieldLabel',\n setup(_, { slots }) {\n const ctx = useTimeFieldContext()\n // 仍用原生 label 保持表单语义,点标题聚焦第一段由连接层的 click 接管\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeFieldControl = defineComponent({\n name: 'XhTimeFieldControl',\n setup(_, { slots }) {\n const ctx = useTimeFieldContext()\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeFieldSegmentGroup = defineComponent({\n name: 'XhTimeFieldSegmentGroup',\n setup(_, { slots }) {\n const ctx = useTimeFieldContext()\n return () => h('div', ctx.api.value.getSegmentGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeFieldSegment = defineComponent({\n name: 'XhTimeFieldSegment',\n props: {\n // 段的身份由作者声明\n segment: { type: String as PropType<TimeSegmentType>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimeFieldContext()\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 XhTimeFieldClearTrigger = defineComponent({\n name: 'XhTimeFieldClearTrigger',\n setup(_, { slots }) {\n const ctx = useTimeFieldContext()\n // 没写内容时由皮肤画兜底字形\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimeFieldHiddenInput = defineComponent({\n name: 'XhTimeFieldHiddenInput',\n setup() {\n const ctx = useTimeFieldContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
|
|
@@ -18,7 +18,16 @@ function useTimePickerColumnContext() {
|
|
|
18
18
|
if (!ctx) throw new Error("[xh] TimePicker 选项必须用在 XhTimePickerColumn 内");
|
|
19
19
|
return ctx;
|
|
20
20
|
}
|
|
21
|
+
const TAG_KEY = Symbol.for("xh-time-picker-tag");
|
|
22
|
+
function provideTimePickerTag(ctx) {
|
|
23
|
+
provide(TAG_KEY, ctx);
|
|
24
|
+
}
|
|
25
|
+
function useTimePickerTagContext() {
|
|
26
|
+
const ctx = inject(TAG_KEY, null);
|
|
27
|
+
if (!ctx) throw new Error("[xh] TimePicker 标签子部件必须用在 XhTimePickerTag 内");
|
|
28
|
+
return ctx;
|
|
29
|
+
}
|
|
21
30
|
//#endregion
|
|
22
|
-
export { provideTimePicker, provideTimePickerColumn, useTimePickerColumnContext, useTimePickerContext };
|
|
31
|
+
export { provideTimePicker, provideTimePickerColumn, provideTimePickerTag, useTimePickerColumnContext, useTimePickerContext, useTimePickerTagContext };
|
|
23
32
|
|
|
24
33
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/time-picker/context.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// 提供 context 相关实现。\n\nimport type { TimePickerColumnUnit } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { TimePickerContext } from './use-time-picker'\nimport { inject, provide } from 'vue'\n\n/** 列声明的单位,供列内选项取到自己所属的列。 */\nexport interface TimePickerColumnContext {\n unit: ComputedRef<TimePickerColumnUnit>\n}\n\nconst KEY: InjectionKey<TimePickerContext> = Symbol.for('xh-time-picker')\nconst COLUMN_KEY: InjectionKey<TimePickerColumnContext> = Symbol.for('xh-time-picker-column')\n\nexport function provideTimePicker(ctx: TimePickerContext): void {\n provide(KEY, ctx)\n}\n\nexport function useTimePickerContext(): TimePickerContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] TimePicker 部件必须用在 XhTimePickerRoot 内')\n return ctx\n}\n\nexport function provideTimePickerColumn(ctx: TimePickerColumnContext): void {\n provide(COLUMN_KEY, ctx)\n}\n\nexport function useTimePickerColumnContext(): TimePickerColumnContext {\n const ctx = inject(COLUMN_KEY, null)\n if (!ctx)\n throw new Error('[xh] TimePicker 选项必须用在 XhTimePickerColumn 内')\n return ctx\n}\n"],"mappings":";;AAiBA,MAAM,MAAuC,OAAO,IAAI,gBAAgB;AACxE,MAAM,aAAoD,OAAO,IAAI,uBAAuB;AAE5F,SAAgB,kBAAkB,KAA8B;CAC9D,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,uBAA0C;CACxD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,2CAA2C;CAC7D,OAAO;AACT;AAEA,SAAgB,wBAAwB,KAAoC;CAC1E,QAAQ,YAAY,GAAG;AACzB;AAEA,SAAgB,6BAAsD;CACpE,MAAM,MAAM,OAAO,YAAY,IAAI;CACnC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,6CAA6C;CAC/D,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/time-picker/context.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// 提供 context 相关实现。\n\nimport type { TimePickerColumnUnit } from '@xihan-ui/headless'\nimport type { ComputedRef, InjectionKey } from 'vue'\nimport type { TimePickerContext } from './use-time-picker'\nimport { inject, provide } from 'vue'\n\n/** 列声明的单位,供列内选项取到自己所属的列。 */\nexport interface TimePickerColumnContext {\n unit: ComputedRef<TimePickerColumnUnit>\n}\n\nconst KEY: InjectionKey<TimePickerContext> = Symbol.for('xh-time-picker')\nconst COLUMN_KEY: InjectionKey<TimePickerColumnContext> = Symbol.for('xh-time-picker-column')\n\nexport function provideTimePicker(ctx: TimePickerContext): void {\n provide(KEY, ctx)\n}\n\nexport function useTimePickerContext(): TimePickerContext {\n const ctx = inject(KEY, null)\n if (!ctx)\n throw new Error('[xh] TimePicker 部件必须用在 XhTimePickerRoot 内')\n return ctx\n}\n\nexport function provideTimePickerColumn(ctx: TimePickerColumnContext): void {\n provide(COLUMN_KEY, ctx)\n}\n\nexport function useTimePickerColumnContext(): TimePickerColumnContext {\n const ctx = inject(COLUMN_KEY, null)\n if (!ctx)\n throw new Error('[xh] TimePicker 选项必须用在 XhTimePickerColumn 内')\n return ctx\n}\n\n/** 标签声明的值,供标签中的删除按钮复用同一份声明。 */\nexport interface TimePickerTagContext {\n value: () => string\n}\n\nconst TAG_KEY: InjectionKey<TimePickerTagContext> = Symbol.for('xh-time-picker-tag')\n\nexport function provideTimePickerTag(ctx: TimePickerTagContext): void {\n provide(TAG_KEY, ctx)\n}\n\nexport function useTimePickerTagContext(): TimePickerTagContext {\n const ctx = inject(TAG_KEY, null)\n if (!ctx)\n throw new Error('[xh] TimePicker 标签子部件必须用在 XhTimePickerTag 内')\n return ctx\n}\n"],"mappings":";;AAiBA,MAAM,MAAuC,OAAO,IAAI,gBAAgB;AACxE,MAAM,aAAoD,OAAO,IAAI,uBAAuB;AAE5F,SAAgB,kBAAkB,KAA8B;CAC9D,QAAQ,KAAK,GAAG;AAClB;AAEA,SAAgB,uBAA0C;CACxD,MAAM,MAAM,OAAO,KAAK,IAAI;CAC5B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,2CAA2C;CAC7D,OAAO;AACT;AAEA,SAAgB,wBAAwB,KAAoC;CAC1E,QAAQ,YAAY,GAAG;AACzB;AAEA,SAAgB,6BAAsD;CACpE,MAAM,MAAM,OAAO,YAAY,IAAI;CACnC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,6CAA6C;CAC/D,OAAO;AACT;AAOA,MAAM,UAA8C,OAAO,IAAI,oBAAoB;AAEnF,SAAgB,qBAAqB,KAAiC;CACpE,QAAQ,SAAS,GAAG;AACtB;AAEA,SAAgB,0BAAgD;CAC9D,MAAM,MAAM,OAAO,SAAS,IAAI;CAChC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,6CAA6C;CAC/D,OAAO;AACT"}
|