@xihan-ui/vue 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +1 -1
  3. package/dist/components/cascader/cascader.d.ts +2 -0
  4. package/dist/components/cascader/cascader.d.ts.map +1 -1
  5. package/dist/components/cascader/cascader.js +3 -1
  6. package/dist/components/cascader/cascader.js.map +1 -1
  7. package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
  8. package/dist/components/checkbox-group/checkbox-group.js +30 -11
  9. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  10. package/dist/components/checkbox-group/use-checkbox-group.d.ts +6 -1
  11. package/dist/components/checkbox-group/use-checkbox-group.d.ts.map +1 -1
  12. package/dist/components/checkbox-group/use-checkbox-group.js +7 -3
  13. package/dist/components/checkbox-group/use-checkbox-group.js.map +1 -1
  14. package/dist/components/color-field/color-field.d.ts +2 -0
  15. package/dist/components/color-field/color-field.d.ts.map +1 -1
  16. package/dist/components/color-field/color-field.js +3 -1
  17. package/dist/components/color-field/color-field.js.map +1 -1
  18. package/dist/components/color-picker/color-picker.d.ts +76 -9
  19. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  20. package/dist/components/color-picker/color-picker.js +87 -6
  21. package/dist/components/color-picker/color-picker.js.map +1 -1
  22. package/dist/components/color-picker/context.js +10 -1
  23. package/dist/components/color-picker/context.js.map +1 -1
  24. package/dist/components/color-picker/use-color-picker.js +14 -4
  25. package/dist/components/color-picker/use-color-picker.js.map +1 -1
  26. package/dist/components/color-swatch-picker/color-swatch-picker.d.ts.map +1 -1
  27. package/dist/components/color-swatch-picker/color-swatch-picker.js +21 -4
  28. package/dist/components/color-swatch-picker/color-swatch-picker.js.map +1 -1
  29. package/dist/components/color-swatch-picker/use-color-swatch-picker.d.ts +6 -1
  30. package/dist/components/color-swatch-picker/use-color-swatch-picker.d.ts.map +1 -1
  31. package/dist/components/color-swatch-picker/use-color-swatch-picker.js +7 -3
  32. package/dist/components/color-swatch-picker/use-color-swatch-picker.js.map +1 -1
  33. package/dist/components/combobox/combobox.d.ts +2 -0
  34. package/dist/components/combobox/combobox.d.ts.map +1 -1
  35. package/dist/components/combobox/combobox.js +3 -1
  36. package/dist/components/combobox/combobox.js.map +1 -1
  37. package/dist/components/command/command.d.ts +3 -3
  38. package/dist/components/context-menu/context-menu.d.ts +9 -1
  39. package/dist/components/context-menu/context-menu.d.ts.map +1 -1
  40. package/dist/components/context-menu/context-menu.js +9 -0
  41. package/dist/components/context-menu/context-menu.js.map +1 -1
  42. package/dist/components/date-field/date-field.d.ts +6 -2
  43. package/dist/components/date-field/date-field.d.ts.map +1 -1
  44. package/dist/components/date-field/date-field.js +5 -2
  45. package/dist/components/date-field/date-field.js.map +1 -1
  46. package/dist/components/date-picker/context.js +10 -1
  47. package/dist/components/date-picker/context.js.map +1 -1
  48. package/dist/components/date-picker/date-picker.d.ts +58 -3
  49. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  50. package/dist/components/date-picker/date-picker.js +76 -5
  51. package/dist/components/date-picker/date-picker.js.map +1 -1
  52. package/dist/components/date-range-picker/date-range-picker.d.ts +27 -1
  53. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  54. package/dist/components/date-range-picker/date-range-picker.js +9 -1
  55. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  56. package/dist/components/dialog/dialog.d.ts +1 -1
  57. package/dist/components/drawer/drawer.d.ts +1 -1
  58. package/dist/components/field/context.d.ts +6 -1
  59. package/dist/components/field/context.d.ts.map +1 -1
  60. package/dist/components/field/context.js +10 -1
  61. package/dist/components/field/context.js.map +1 -1
  62. package/dist/components/field/field.d.ts +9 -1
  63. package/dist/components/field/field.d.ts.map +1 -1
  64. package/dist/components/field/field.js +14 -2
  65. package/dist/components/field/field.js.map +1 -1
  66. package/dist/components/field/use-field-control.d.ts +8 -1
  67. package/dist/components/field/use-field-control.d.ts.map +1 -1
  68. package/dist/components/field/use-field-control.js +14 -1
  69. package/dist/components/field/use-field-control.js.map +1 -1
  70. package/dist/components/file-upload/file-upload.d.ts +2 -0
  71. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  72. package/dist/components/file-upload/file-upload.js +3 -1
  73. package/dist/components/file-upload/file-upload.js.map +1 -1
  74. package/dist/components/float-button/float-button.d.ts +26 -1
  75. package/dist/components/float-button/float-button.d.ts.map +1 -1
  76. package/dist/components/float-button/float-button.js +17 -5
  77. package/dist/components/float-button/float-button.js.map +1 -1
  78. package/dist/components/float-button/use-float-button.js +7 -1
  79. package/dist/components/float-button/use-float-button.js.map +1 -1
  80. package/dist/components/form/context.js +5 -1
  81. package/dist/components/form/context.js.map +1 -1
  82. package/dist/components/form/use-form-control.js +1 -1
  83. package/dist/components/markdown-stream/markdown-stream.d.ts +1 -1
  84. package/dist/components/menu/menu.js +29 -1
  85. package/dist/components/menu/menu.js.map +1 -1
  86. package/dist/components/menubar/menubar.d.ts +9 -1
  87. package/dist/components/menubar/menubar.d.ts.map +1 -1
  88. package/dist/components/menubar/menubar.js +13 -0
  89. package/dist/components/menubar/menubar.js.map +1 -1
  90. package/dist/components/pin-input/pin-input.d.ts.map +1 -1
  91. package/dist/components/pin-input/pin-input.js +7 -1
  92. package/dist/components/pin-input/pin-input.js.map +1 -1
  93. package/dist/components/popconfirm/popconfirm.d.ts +20 -1
  94. package/dist/components/popconfirm/popconfirm.d.ts.map +1 -1
  95. package/dist/components/popconfirm/popconfirm.js +7 -0
  96. package/dist/components/popconfirm/popconfirm.js.map +1 -1
  97. package/dist/components/popconfirm/use-popconfirm.js +2 -0
  98. package/dist/components/popconfirm/use-popconfirm.js.map +1 -1
  99. package/dist/components/popover/popover.d.ts +1 -1
  100. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  101. package/dist/components/radio-group/radio-group.js +25 -6
  102. package/dist/components/radio-group/radio-group.js.map +1 -1
  103. package/dist/components/radio-group/use-radio-group.d.ts +5 -0
  104. package/dist/components/radio-group/use-radio-group.d.ts.map +1 -1
  105. package/dist/components/radio-group/use-radio-group.js +4 -1
  106. package/dist/components/radio-group/use-radio-group.js.map +1 -1
  107. package/dist/components/rating/rating.d.ts.map +1 -1
  108. package/dist/components/rating/rating.js +7 -1
  109. package/dist/components/rating/rating.js.map +1 -1
  110. package/dist/components/reasoning/reasoning.d.ts +1 -1
  111. package/dist/components/select/select.d.ts +2 -0
  112. package/dist/components/select/select.d.ts.map +1 -1
  113. package/dist/components/select/select.js +3 -1
  114. package/dist/components/select/select.js.map +1 -1
  115. package/dist/components/signature-pad/signature-pad.d.ts +2 -0
  116. package/dist/components/signature-pad/signature-pad.d.ts.map +1 -1
  117. package/dist/components/signature-pad/signature-pad.js +3 -1
  118. package/dist/components/signature-pad/signature-pad.js.map +1 -1
  119. package/dist/components/slider/slider.d.ts.map +1 -1
  120. package/dist/components/slider/slider.js +7 -1
  121. package/dist/components/slider/slider.js.map +1 -1
  122. package/dist/components/sortable/sortable.d.ts +1 -1
  123. package/dist/components/table/table.d.ts +2 -2
  124. package/dist/components/table/table.d.ts.map +1 -1
  125. package/dist/components/tags-input/tags-input.d.ts +2 -0
  126. package/dist/components/tags-input/tags-input.d.ts.map +1 -1
  127. package/dist/components/tags-input/tags-input.js +3 -1
  128. package/dist/components/tags-input/tags-input.js.map +1 -1
  129. package/dist/components/text-field/text-field.d.ts +2 -0
  130. package/dist/components/text-field/text-field.d.ts.map +1 -1
  131. package/dist/components/text-field/text-field.js +3 -1
  132. package/dist/components/text-field/text-field.js.map +1 -1
  133. package/dist/components/time-field/time-field.d.ts +2 -0
  134. package/dist/components/time-field/time-field.d.ts.map +1 -1
  135. package/dist/components/time-field/time-field.js +3 -1
  136. package/dist/components/time-field/time-field.js.map +1 -1
  137. package/dist/components/time-picker/context.js +10 -1
  138. package/dist/components/time-picker/context.js.map +1 -1
  139. package/dist/components/time-picker/time-picker.d.ts +78 -9
  140. package/dist/components/time-picker/time-picker.d.ts.map +1 -1
  141. package/dist/components/time-picker/time-picker.js +89 -8
  142. package/dist/components/time-picker/time-picker.js.map +1 -1
  143. package/dist/components/time-range-picker/time-range-picker.d.ts +2 -0
  144. package/dist/components/time-range-picker/time-range-picker.d.ts.map +1 -1
  145. package/dist/components/time-range-picker/time-range-picker.js +3 -1
  146. package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
  147. package/dist/components/toggle-group/toggle-group.d.ts.map +1 -1
  148. package/dist/components/toggle-group/toggle-group.js +7 -1
  149. package/dist/components/toggle-group/toggle-group.js.map +1 -1
  150. package/dist/components/tour/tour.d.ts +1 -1
  151. package/dist/components/tree/tree.d.ts +2 -2
  152. package/dist/components/tree/tree.js +1 -1
  153. package/dist/components/tree/tree.js.map +1 -1
  154. package/dist/components/tree-select/tree-select.d.ts +2 -0
  155. package/dist/components/tree-select/tree-select.d.ts.map +1 -1
  156. package/dist/components/tree-select/tree-select.js +3 -1
  157. package/dist/components/tree-select/tree-select.js.map +1 -1
  158. package/dist/components/truncate/truncate.d.ts.map +1 -1
  159. package/dist/components/truncate/truncate.js +4 -8
  160. package/dist/components/truncate/truncate.js.map +1 -1
  161. package/dist/index.d.ts +7 -7
  162. package/dist/index.js +8 -8
  163. package/dist/package.js +1 -1
  164. package/dist/runtime/portal.js +2 -0
  165. package/dist/runtime/portal.js.map +1 -1
  166. package/dist/runtime/with-handlers.js +25 -0
  167. package/dist/runtime/with-handlers.js.map +1 -0
  168. package/package.json +15 -15
@@ -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":";;;;;KAiBK,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;;;;;EAIN,iBAAA,UAAA,UAAU;EACZ,iBAAA,QAAA,UAAU;;;;;;;;;;;;;;;;;;IAhBN,MAAA,SAAS;;;IACP,MAAA,SAAS;;;;;;;IAER,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;IAMd,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;;;EAQvB,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
+ {"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":"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"}
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":";;;;;;;AA0BA,MAAa,kBAAkB,gBAAgB;CAC7C,MAAM;CACN,OAAO;EAEL,OAAO,EAAE,MAAM,OAAO;EACtB,cAAc,EAAE,MAAM,OAAO;EAC7B,KAAK,EAAE,MAAM,OAAO;EACpB,KAAK,EAAE,MAAM,OAAO;EACpB,QAAQ,EAAE,MAAM,OAAO;EAEvB,WAAW,EAAE,MAAM,OAAkC;EACrD,aAAa,EAAE,MAAM,OAAoC;EACzD,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,cAAc,EAAE,MAAM,OAAmD;EACzE,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,SAAS;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC7C,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,MAAM,EAAE,MAAM,OAAO;EACrB,aAAa,EAAE,MAAM,OAAO;EAC5B,SAAS,EAAE,MAAM,OAAmC;EACpD,MAAM,EAAE,MAAM,OAAyB;EACvC,MAAM,EAAE,MAAM,OAAyB;CACzC;CAEA,OAAO;EACL,eAAe;EACf,iBAAiB,aAAyD;EAC1E,iBAAiB,WAAgE;CACnF;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,iBAAkD,YAAY;GAClE,KAAK,gBAAgB,OAAO;GAC5B,KAAK,gBAAgB,QAAQ,KAAK;EACpC;EACA,MAAM,MAAM,aAAa,aAAa,aAAa,cAAc,oBAAoB,KAAK,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,EAAE,CAAC,GAAqB,EAAE,cAAc,CAAC;EACpK,iBAAiB,GAAG;EACpB,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU;GAC7F,OAAO,IAAI,IAAI,MAAM;GACrB,OAAO,IAAI,IAAI,MAAM;GACrB,YAAY,IAAI,IAAI,MAAM;GAC1B,UAAU,IAAI,IAAI,MAAM;GACxB,UAAU,IAAI,IAAI,MAAM;GACxB,gBAAgB,IAAI,IAAI,MAAM;GAC9B,WAAW,IAAI,IAAI,MAAM;GACzB,aAAa,IAAI,IAAI,MAAM;GAC3B,UAAU,IAAI,IAAI,MAAM;GACxB,OAAO,IAAI,IAAI,MAAM;EACvB,CAAC,CAAC;CACJ;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAEhC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,gBAAgB,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC1G;AACF,CAAC;AAED,MAAa,qBAAqB,gBAAgB;CAChD,MAAM;CACN,OAAO,EAEL,SAAS;EAAE,MAAM;EAAqC,UAAU;CAAK,EACvE;CACA,MAAM,OAAO,EAAE,SAAS;EACtB,MAAM,MAAM,oBAAoB;EAEhC,aAAa,EACX,QACA,IAAI,IAAI,MAAM,gBAAgB,EAAE,SAAS,MAAM,QAAQ,CAAC,GACxD,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,eAAe,EAAE,SAAS,MAAM,QAAQ,CAAC,CAC9E;CACF;AACF,CAAC;AAED,MAAa,0BAA0B,gBAAgB;CACrD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,oBAAoB;EAEhC,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC7G;AACF,CAAC;AAED,MAAa,yBAAyB,gBAAgB;CACpD,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,oBAAoB;EAChC,aAAa,EAAE,SAAS,IAAI,IAAI,MAAM,oBAAoB,CAA4B;CACxF;AACF,CAAC"}
@@ -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"}
@@ -1,11 +1,11 @@
1
1
  import { PayloadOf } from "../../runtime/payload.js";
2
2
  import { PropType, SlotsType, VNode } from "vue";
3
3
  import { ControlVariant, Direction, Placement, Size, Tone } from "@xihan-ui/core";
4
- import { TimeGranularity, TimeHourCycle, TimePickerApi, TimePickerColumn, TimePickerColumnUnit, TimePickerPreset, TimePickerPresetState, TimePickerSchema, TimeSegmentType, TimeStep, TimeUnavailablePredicate } from "@xihan-ui/headless";
4
+ import { TimeGranularity, TimeHourCycle, TimePickerApi, TimePickerColumn, TimePickerColumnUnit, TimePickerPreset, TimePickerPresetState, TimePickerSchema, TimePickerSelectionMode, TimeSegmentType, TimeStep, TimeUnavailablePredicate } from "@xihan-ui/headless";
5
5
  //#region src/components/time-picker/time-picker.d.ts
6
6
  type TimePickerProps = TimePickerSchema['props'];
7
7
  /** 默认插槽的载荷:浮层开合与当前值、值状态标志、当前的段与列,以及开合、写值、清空的动作。 */
8
- type TimePickerRootSlotProps = Pick<TimePickerApi, 'open' | 'value' | 'empty' | 'outOfRange' | 'segments' | 'columns' | 'canClear' | 'setOpen' | 'setValue' | 'clear'>;
8
+ type TimePickerRootSlotProps = Pick<TimePickerApi, 'open' | 'value' | 'empty' | 'outOfRange' | 'segments' | 'columns' | 'canClear' | 'canAdd' | 'setOpen' | 'setValue' | 'clear' | 'add'>;
9
9
  /** 默认插槽的载荷:该列当前的可选值。 */
10
10
  interface TimePickerColumnSlotProps {
11
11
  options: TimePickerColumn['options'];
@@ -15,11 +15,24 @@ interface TimePickerPresetsSlotProps {
15
15
  presets: readonly TimePickerPresetState[];
16
16
  }
17
17
  declare const XhTimePickerRoot: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
18
+ /** 选中的时刻,ISO 时间串数组;单选可写裸串。 */
18
19
  value: {
19
- type: StringConstructor;
20
+ type: PropType<string | string[]>;
20
21
  };
21
22
  defaultValue: {
22
- type: StringConstructor;
23
+ type: PropType<string | string[]>;
24
+ };
25
+ /** 选择模式,默认 single;multiple 时列上拼草稿、按「添加」收进值,输入行里排成标签。 */
26
+ selectionMode: {
27
+ type: PropType<TimePickerSelectionMode>;
28
+ };
29
+ /** multiple 下最多选几个时刻。 */
30
+ maxSelected: {
31
+ type: NumberConstructor;
32
+ };
33
+ /** 多选时输入行最多摆几枚标签,其余折进 +N 那一枚;默认 3。 */
34
+ maxTagCount: {
35
+ type: NumberConstructor;
23
36
  };
24
37
  open: {
25
38
  type: BooleanConstructor;
@@ -97,16 +110,30 @@ declare const XhTimePickerRoot: import("vue").DefineComponent<import("vue").Extr
97
110
  }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
98
111
  [key: string]: any;
99
112
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
113
+ clear: () => true;
100
114
  'value-change': (_details: PayloadOf<TimePickerProps, "onValueChange">) => true;
101
115
  'open-change': (_details: PayloadOf<TimePickerProps, "onOpenChange">) => true;
102
116
  'update:value': (_value: PayloadOf<TimePickerProps, "onValueChange">["value"]) => true;
103
117
  'update:open': (_open: PayloadOf<TimePickerProps, "onOpenChange">["open"]) => true;
104
118
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
119
+ /** 选中的时刻,ISO 时间串数组;单选可写裸串。 */
105
120
  value: {
106
- type: StringConstructor;
121
+ type: PropType<string | string[]>;
107
122
  };
108
123
  defaultValue: {
109
- type: StringConstructor;
124
+ type: PropType<string | string[]>;
125
+ };
126
+ /** 选择模式,默认 single;multiple 时列上拼草稿、按「添加」收进值,输入行里排成标签。 */
127
+ selectionMode: {
128
+ type: PropType<TimePickerSelectionMode>;
129
+ };
130
+ /** multiple 下最多选几个时刻。 */
131
+ maxSelected: {
132
+ type: NumberConstructor;
133
+ };
134
+ /** 多选时输入行最多摆几枚标签,其余折进 +N 那一枚;默认 3。 */
135
+ maxTagCount: {
136
+ type: NumberConstructor;
110
137
  };
111
138
  open: {
112
139
  type: BooleanConstructor;
@@ -183,7 +210,8 @@ declare const XhTimePickerRoot: import("vue").DefineComponent<import("vue").Extr
183
210
  };
184
211
  }>> & Readonly<{
185
212
  "onValue-change"?: ((_details: import("@xihan-ui/headless").TimePickerValueChangeDetails) => any) | undefined;
186
- "onUpdate:value"?: ((_value: string) => any) | undefined;
213
+ "onUpdate:value"?: ((_value: string[]) => any) | undefined;
214
+ onClear?: (() => any) | undefined;
187
215
  "onOpen-change"?: ((_details: import("@xihan-ui/headless").TimePickerOpenChangeDetails) => any) | undefined;
188
216
  "onUpdate:open"?: ((_open: boolean) => any) | undefined;
189
217
  }>, {
@@ -202,6 +230,41 @@ declare const XhTimePickerLabel: import("vue").DefineComponent<{}, () => VNode<i
202
230
  declare const XhTimePickerControl: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
203
231
  [key: string]: any;
204
232
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
233
+ /** 标签文字所在的块(tag 的 label)。 */
234
+ declare const XhTimePickerTagLabel: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
235
+ [key: string]: any;
236
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
237
+ /** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger,可及名使用 translations.deleteItem;点按摘掉所在标签的选中值,焦点不动。 */
238
+ declare const XhTimePickerItemDeleteTrigger: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
239
+ [key: string]: any;
240
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
241
+ /** 多选时一个选中值一个标签,即库内 tag 的 root(data-scope="tag")。 */
242
+ declare const XhTimePickerTag: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
243
+ /** 它代表哪个选中值。 */
244
+ value: {
245
+ type: StringConstructor;
246
+ required: true;
247
+ };
248
+ }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
249
+ [key: string]: any;
250
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
251
+ /** 它代表哪个选中值。 */
252
+ value: {
253
+ type: StringConstructor;
254
+ required: true;
255
+ };
256
+ }>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
257
+ /** 折叠的标签合成的一个标签:有插槽时使用插槽,否则显示 +N。没有折叠的标签时连接层写 hidden。 */
258
+ declare const XhTimePickerOverflowTag: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
259
+ [key: string]: any;
260
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
261
+ /**
262
+ * 标签行:多选时放在盒里、触发钮之前;单选时连接层给 hidden。
263
+ * 不写插槽即按 tags 铺出带删除钮的标签与 +N 那一枚,写了插槽由作者自己铺。
264
+ */
265
+ declare const XhTimePickerTagList: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
266
+ [key: string]: any;
267
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
205
268
  declare const XhTimePickerSegmentGroup: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
206
269
  [key: string]: any;
207
270
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -294,9 +357,15 @@ declare const XhTimePickerItem: import("vue").DefineComponent<import("vue").Extr
294
357
  required: true;
295
358
  };
296
359
  }>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
297
- declare const XhTimePickerHiddenInput: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
360
+ /** 「添加」:多选时把浮层里拼好的草稿收进值,浮层不收;单选时连接层给 hidden。文字由作者写。 */
361
+ declare const XhTimePickerConfirmTrigger: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
298
362
  [key: string]: any;
299
363
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
364
+ declare const XhTimePickerHiddenInput: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
365
+ [key: string]: any;
366
+ }> | VNode<import("vue").RendererNode, import("vue").RendererElement, {
367
+ [key: string]: any;
368
+ }>[], {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
300
369
  //#endregion
301
- export { TimePickerColumnSlotProps, TimePickerPresetsSlotProps, TimePickerRootSlotProps, XhTimePickerClearTrigger, XhTimePickerColumn, XhTimePickerContent, XhTimePickerControl, XhTimePickerHiddenInput, XhTimePickerItem, XhTimePickerLabel, XhTimePickerPositioner, XhTimePickerPreset, XhTimePickerPresetGroup, XhTimePickerRoot, XhTimePickerSegment, XhTimePickerSegmentGroup, XhTimePickerTrigger };
370
+ export { TimePickerColumnSlotProps, TimePickerPresetsSlotProps, TimePickerRootSlotProps, XhTimePickerClearTrigger, XhTimePickerColumn, XhTimePickerConfirmTrigger, XhTimePickerContent, XhTimePickerControl, XhTimePickerHiddenInput, XhTimePickerItem, XhTimePickerItemDeleteTrigger, XhTimePickerLabel, XhTimePickerOverflowTag, XhTimePickerPositioner, XhTimePickerPreset, XhTimePickerPresetGroup, XhTimePickerRoot, XhTimePickerSegment, XhTimePickerSegmentGroup, XhTimePickerTag, XhTimePickerTagLabel, XhTimePickerTagList, XhTimePickerTrigger };
302
371
  //# sourceMappingURL=time-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time-picker.d.ts","names":[],"sources":["../../../src/components/time-picker/time-picker.ts"],"mappings":";;;;;KAsCK,kBAAkB;;KAGX,0BAA0B,KACpC;;UAce;EACf,SAAS;;;UAIM;EACf,kBAAkB;;cAGP,gCAAgB,8BAAA;;;;;;;;;;;;;;;;;;;;;;IAWI,MAAA,SAAS;;;IACP,MAAA,SAAS;;;;IAEZ,MAAA,SAAS;;;;IAEX,MAAA,SAAS;;;;;;;IAEH,MAAA,SAAS;;;;IAEF,MAAA,SAAS;;;;;;;;;;;;;;;;;;IAKrB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACJ,MAAA,SAAS;;;;;;;IAGf,MAAA,SAAS;;;;;EAIL,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;EACZ,gBAAA,OAAA,UAAU;;;;;;;;;;;;;;;;;;;;;;;IA3BJ,MAAA,SAAS;;;IACP,MAAA,SAAS;;;;IAEZ,MAAA,SAAS;;;;IAEX,MAAA,SAAS;;;;;;;IAEH,MAAA,SAAS;;;;IAEF,MAAA,SAAS;;;;;;;;;;;;;;;;;;IAKrB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACJ,MAAA,SAAS;;;;;;;IAGf,MAAA,SAAS;;;;;;;;;;;;;;;EAUtB,WAAC,OAAO,4BAA4B;kCA8BhD;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAO5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAS9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,8BAAA;;IAID,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;;MAWtC,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAe9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,wCAAwB,0BAAA,oBAAA,4BAAA;;8BAMnC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,8BAAA;;;IAIF,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;MAcxC,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAY9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;;;EAItB,WAAC,OAAO,+BAA+B;kCAoCnD;cAEW,kCAAkB,8BAAA;;;;;;;;;;;;;;;;EAQjB,gBAAM;kCAclB;cAEW,kCAAkB,8BAAA;;IAGH,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;;;EAGvB,WAAC,OAAO,8BAA8B;kCA6BlD;cAEW,gCAAgB,8BAAA;;;;;;;;;;;;;;MAgB3B,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAMlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
1
+ {"version":3,"file":"time-picker.d.ts","names":[],"sources":["../../../src/components/time-picker/time-picker.ts"],"mappings":"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"}
@@ -1,18 +1,26 @@
1
1
  import { withXhConfig } from "../../config/config.js";
2
2
  import { XhPortal } from "../../runtime/portal.js";
3
- import { slotPaints } from "../../runtime/slot-content.js";
3
+ import { slotIsPlainText, slotPaints } from "../../runtime/slot-content.js";
4
4
  import { useScrollbars } from "../../runtime/use-scrollbars.js";
5
+ import { withHandlers } from "../../runtime/with-handlers.js";
5
6
  import { useFormControlProps } from "../form/use-form-control.js";
6
7
  import { useFieldLabelWiring, useFieldStateWiring } from "../field/use-field-control.js";
7
- import { provideTimePicker, provideTimePickerColumn, useTimePickerColumnContext, useTimePickerContext } from "./context.js";
8
+ import { provideTimePicker, provideTimePickerColumn, provideTimePickerTag, useTimePickerColumnContext, useTimePickerContext, useTimePickerTagContext } from "./context.js";
8
9
  import { useTimePicker } from "./use-time-picker.js";
9
10
  import { computed, defineComponent, h, mergeProps, onUpdated, ref } from "vue";
10
11
  //#region src/components/time-picker/time-picker.ts
11
12
  const XhTimePickerRoot = defineComponent({
12
13
  name: "XhTimePickerRoot",
13
14
  props: {
14
- value: { type: String },
15
- defaultValue: { type: String },
15
+ /** 选中的时刻,ISO 时间串数组;单选可写裸串。 */
16
+ value: { type: [String, Array] },
17
+ defaultValue: { type: [String, Array] },
18
+ /** 选择模式,默认 single;multiple 时列上拼草稿、按「添加」收进值,输入行里排成标签。 */
19
+ selectionMode: { type: String },
20
+ /** multiple 下最多选几个时刻。 */
21
+ maxSelected: { type: Number },
22
+ /** 多选时输入行最多摆几枚标签,其余折进 +N 那一枚;默认 3。 */
23
+ maxTagCount: { type: Number },
16
24
  open: {
17
25
  type: Boolean,
18
26
  default: void 0
@@ -56,6 +64,7 @@ const XhTimePickerRoot = defineComponent({
56
64
  dir: { type: String }
57
65
  },
58
66
  emits: {
67
+ "clear": () => true,
59
68
  "value-change": (_details) => true,
60
69
  "open-change": (_details) => true,
61
70
  "update:value": (_value) => true,
@@ -71,7 +80,7 @@ const XhTimePickerRoot = defineComponent({
71
80
  emit("open-change", details);
72
81
  emit("update:open", details.open);
73
82
  };
74
- const ctx = useTimePicker(withXhConfig("time-picker", useFormControlProps(props)), {
83
+ const ctx = useTimePicker(withHandlers(withXhConfig("time-picker", useFormControlProps(props)), { onClear: () => emit("clear") }), {
75
84
  onValueChange: notifyValue,
76
85
  onOpenChange: notifyOpen
77
86
  });
@@ -84,9 +93,11 @@ const XhTimePickerRoot = defineComponent({
84
93
  segments: ctx.api.value.segments,
85
94
  columns: ctx.api.value.columns,
86
95
  canClear: ctx.api.value.canClear,
96
+ canAdd: ctx.api.value.canAdd,
87
97
  setOpen: ctx.api.value.setOpen,
88
98
  setValue: ctx.api.value.setValue,
89
- clear: ctx.api.value.clear
99
+ clear: ctx.api.value.clear,
100
+ add: ctx.api.value.add
90
101
  }));
91
102
  }
92
103
  });
@@ -109,6 +120,65 @@ const XhTimePickerControl = defineComponent({
109
120
  }, slots.default?.());
110
121
  }
111
122
  });
123
+ /** 标签文字所在的块(tag 的 label)。 */
124
+ const XhTimePickerTagLabel = defineComponent({
125
+ name: "XhTimePickerTagLabel",
126
+ setup(_, { slots }) {
127
+ const ctx = useTimePickerContext();
128
+ return () => h("span", ctx.api.value.getTagLabelProps(), slots.default?.());
129
+ }
130
+ });
131
+ /** 标签内容:只有文字时替它包一层 label;作者自己写了节点则原样放行。库自身填入的文字(+N)恒包 label。 */
132
+ function tagChildren(content) {
133
+ if (typeof content === "string") return [h(XhTimePickerTagLabel, null, () => content)];
134
+ return slotIsPlainText(content) ? [h(XhTimePickerTagLabel, null, () => content)] : content;
135
+ }
136
+ /** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger,可及名使用 translations.deleteItem;点按摘掉所在标签的选中值,焦点不动。 */
137
+ const XhTimePickerItemDeleteTrigger = defineComponent({
138
+ name: "XhTimePickerItemDeleteTrigger",
139
+ setup(_, { slots }) {
140
+ const ctx = useTimePickerContext();
141
+ const tag = useTimePickerTagContext();
142
+ return () => h("button", ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }), slots.default?.());
143
+ }
144
+ });
145
+ /** 多选时一个选中值一个标签,即库内 tag 的 root(data-scope="tag")。 */
146
+ const XhTimePickerTag = defineComponent({
147
+ name: "XhTimePickerTag",
148
+ props: {
149
+ /** 它代表哪个选中值。 */
150
+ value: {
151
+ type: String,
152
+ required: true
153
+ } },
154
+ setup(props, { slots }) {
155
+ const ctx = useTimePickerContext();
156
+ provideTimePickerTag({ value: () => props.value });
157
+ return () => h("span", ctx.api.value.getTagProps({ value: props.value }), tagChildren(slots.default?.()));
158
+ }
159
+ });
160
+ /** 折叠的标签合成的一个标签:有插槽时使用插槽,否则显示 +N。没有折叠的标签时连接层写 hidden。 */
161
+ const XhTimePickerOverflowTag = defineComponent({
162
+ name: "XhTimePickerOverflowTag",
163
+ setup(_, { slots }) {
164
+ const ctx = useTimePickerContext();
165
+ return () => h("span", ctx.api.value.getOverflowTagProps(), tagChildren(slots.default?.() ?? ctx.api.value.overflowText));
166
+ }
167
+ });
168
+ /**
169
+ * 标签行:多选时放在盒里、触发钮之前;单选时连接层给 hidden。
170
+ * 不写插槽即按 tags 铺出带删除钮的标签与 +N 那一枚,写了插槽由作者自己铺。
171
+ */
172
+ const XhTimePickerTagList = defineComponent({
173
+ name: "XhTimePickerTagList",
174
+ setup(_, { slots }) {
175
+ const ctx = useTimePickerContext();
176
+ return () => h("span", ctx.api.value.getTagListProps(), slots.default ? slots.default() : [...ctx.api.value.tags.map((tag) => h(XhTimePickerTag, {
177
+ key: tag.value,
178
+ value: tag.value
179
+ }, () => [h(XhTimePickerTagLabel, null, () => tag.label), h(XhTimePickerItemDeleteTrigger)])), h(XhTimePickerOverflowTag)]);
180
+ }
181
+ });
112
182
  const XhTimePickerSegmentGroup = defineComponent({
113
183
  name: "XhTimePickerSegmentGroup",
114
184
  setup(_, { slots }) {
@@ -279,14 +349,25 @@ value: {
279
349
  }));
280
350
  }
281
351
  });
352
+ /** 「添加」:多选时把浮层里拼好的草稿收进值,浮层不收;单选时连接层给 hidden。文字由作者写。 */
353
+ const XhTimePickerConfirmTrigger = defineComponent({
354
+ name: "XhTimePickerConfirmTrigger",
355
+ setup(_, { slots }) {
356
+ const ctx = useTimePickerContext();
357
+ return () => h("button", ctx.api.value.getConfirmTriggerProps(), slots.default?.());
358
+ }
359
+ });
282
360
  const XhTimePickerHiddenInput = defineComponent({
283
361
  name: "XhTimePickerHiddenInput",
284
362
  setup() {
285
363
  const ctx = useTimePickerContext();
286
- return () => h("input", ctx.api.value.getHiddenInputProps());
364
+ return () => ctx.api.value.selectionMode === "multiple" ? ctx.api.value.value.map((value) => h("input", {
365
+ key: value,
366
+ ...ctx.api.value.getHiddenInputProps({ value })
367
+ })) : h("input", ctx.api.value.getHiddenInputProps());
287
368
  }
288
369
  });
289
370
  //#endregion
290
- export { XhTimePickerClearTrigger, XhTimePickerColumn, XhTimePickerContent, XhTimePickerControl, XhTimePickerHiddenInput, XhTimePickerItem, XhTimePickerLabel, XhTimePickerPositioner, XhTimePickerPreset, XhTimePickerPresetGroup, XhTimePickerRoot, XhTimePickerSegment, XhTimePickerSegmentGroup, XhTimePickerTrigger };
371
+ export { XhTimePickerClearTrigger, XhTimePickerColumn, XhTimePickerConfirmTrigger, XhTimePickerContent, XhTimePickerControl, XhTimePickerHiddenInput, XhTimePickerItem, XhTimePickerItemDeleteTrigger, XhTimePickerLabel, XhTimePickerOverflowTag, XhTimePickerPositioner, XhTimePickerPreset, XhTimePickerPresetGroup, XhTimePickerRoot, XhTimePickerSegment, XhTimePickerSegmentGroup, XhTimePickerTag, XhTimePickerTagLabel, XhTimePickerTagList, XhTimePickerTrigger };
291
372
 
292
373
  //# sourceMappingURL=time-picker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"time-picker.js","names":[],"sources":["../../../src/components/time-picker/time-picker.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 time picker 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n TimeGranularity,\n TimeHourCycle,\n TimePickerApi,\n TimePickerColumn,\n TimePickerColumnUnit,\n TimePickerPreset,\n TimePickerPresetState,\n TimePickerSchema,\n TimeSegmentType,\n TimeStep,\n TimeUnavailablePredicate,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, mergeProps, onUpdated, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotPaints } from '../../runtime/slot-content'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport {\n provideTimePicker,\n provideTimePickerColumn,\n useTimePickerColumnContext,\n useTimePickerContext,\n} from './context'\nimport { useTimePicker } from './use-time-picker'\n\ntype TimePickerProps = TimePickerSchema['props']\n\n/** 默认插槽的载荷:浮层开合与当前值、值状态标志、当前的段与列,以及开合、写值、清空的动作。 */\nexport type TimePickerRootSlotProps = Pick<\n TimePickerApi,\n | 'open'\n | 'value'\n | 'empty'\n | 'outOfRange'\n | 'segments'\n | 'columns'\n | 'canClear'\n | 'setOpen'\n | 'setValue'\n | 'clear'\n>\n\n/** 默认插槽的载荷:该列当前的可选值。 */\nexport interface TimePickerColumnSlotProps {\n options: TimePickerColumn['options']\n}\n\n/** 快捷选项列默认插槽的载荷:逐条的投影,作者据此自行铺设条目。 */\nexport interface TimePickerPresetsSlotProps {\n presets: readonly TimePickerPresetState[]\n}\n\nexport const XhTimePickerRoot = defineComponent({\n name: 'XhTimePickerRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n value: { type: String },\n defaultValue: { type: String },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n min: { type: String },\n max: { type: String },\n locale: { type: String },\n hourCycle: { type: Number as PropType<TimeHourCycle> },\n granularity: { type: String as PropType<TimeGranularity> },\n /** 按单位的步进:`{ hour?, minute?, second? }`,各单位缺省 1。 */\n timeStep: { type: Object as PropType<TimeStep> },\n /** 快捷选项;提供后浮层中多出一列,时刻要在自己的 computed 中计算后再传入。 */\n presets: { type: Array as PropType<TimePickerPreset[]> },\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<TimePickerProps['translations']> },\n /** 逐格可选性:时列按 24 小时制给值,第三个参数带已选的时与分。 */\n isTimeUnavailable: { type: Function as PropType<TimeUnavailablePredicate> },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'value-change': (_details: PayloadOf<TimePickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<TimePickerProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<TimePickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<TimePickerProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TimePickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: TimePickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: TimePickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useTimePicker(withXhConfig('time-picker', useFormControlProps(props)) as TimePickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideTimePicker(ctx)\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n empty: ctx.api.value.empty,\n outOfRange: ctx.api.value.outOfRange,\n segments: ctx.api.value.segments,\n columns: ctx.api.value.columns,\n canClear: ctx.api.value.canClear,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n }))\n },\n})\n\nexport const XhTimePickerLabel = defineComponent({\n name: 'XhTimePickerLabel',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n // 仍用原生 label 保持表单语义,点标题聚焦第一段由连接层的 click 接管\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerControl = defineComponent({\n name: 'XhTimePickerControl',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('div', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.controlRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhTimePickerSegmentGroup = defineComponent({\n name: 'XhTimePickerSegmentGroup',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('div', ctx.api.value.getSegmentGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerSegment = defineComponent({\n name: 'XhTimePickerSegment',\n props: {\n // 段的身份由作者声明\n segment: { type: String as PropType<TimeSegmentType>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n // 有插槽用插槽,否则显示该段的文字,空段为占位串\n return () => h(\n 'span',\n ctx.api.value.getSegmentProps({ segment: props.segment }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getSegmentText({ segment: props.segment }),\n )\n },\n})\n\nexport const XhTimePickerTrigger = defineComponent({\n name: 'XhTimePickerTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTimePickerContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n // 归还焦点要落到它身上:锚点取的是整个输入行,那一层不可聚焦\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhTimePickerClearTrigger = defineComponent({\n name: 'XhTimePickerClearTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerPositioner = defineComponent({\n name: 'XhTimePickerPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useTimePickerContext()\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.controlRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhTimePickerContent = defineComponent({\n name: 'XhTimePickerContent',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhTimePickerPresetGroup = defineComponent({\n name: 'XhTimePickerPresetGroup',\n slots: Object as SlotsType<{\n /** 自行铺设条目;未写时按 presets 数据自动铺设,两者产出的 DOM 一致。 */\n default?: (props: TimePickerPresetsSlotProps) => VNode[]\n }>,\n // 根是片段(选项列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTimePickerContext()\n const presetGroupRef = ref<HTMLElement | null>(null)\n // 快捷选项列定高自己竖滚:条子贴在它的盒子上、紧跟在它后面(浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => presetGroupRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n onUpdated(() => bars.measure())\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.({ presets: api.presets })\n return [\n h(\n 'div',\n {\n ...mergeProps(api.getPresetGroupProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { presetGroupRef.value = el as HTMLElement },\n },\n slotPaints(authored)\n ? authored\n : api.presets.map(preset => h(\n 'div',\n { ...api.getPresetProps({ value: preset.value }) as Record<string, unknown>, key: preset.value },\n preset.label,\n )),\n ),\n ...bars.render(),\n ]\n }\n },\n})\n\nexport const XhTimePickerPreset = defineComponent({\n name: 'XhTimePickerPreset',\n props: {\n /** 该条目的身份,与 presets 数据中的 value 逐字对应。 */\n value: { type: String, required: true },\n },\n slots: Object as SlotsType<{\n /** 条目内容;未写时使用数据中的 label。 */\n default?: () => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.()\n return h(\n 'div',\n api.getPresetProps({ value: props.value }) as Record<string, unknown>,\n slotPaints(authored) ? authored : api.presets.find(p => p.value === props.value)?.label,\n )\n }\n },\n})\n\nexport const XhTimePickerColumn = defineComponent({\n name: 'XhTimePickerColumn',\n props: {\n unit: { type: String as PropType<TimePickerColumnUnit>, required: true },\n },\n slots: Object as SlotsType<{\n default?: (props: TimePickerColumnSlotProps) => VNode[]\n }>,\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useTimePickerContext()\n const unit = computed(() => props.unit)\n // 下传单位,供列内选项取到自己归哪一列\n provideTimePickerColumn({ unit })\n const columnRef = ref<HTMLElement | null>(null)\n // 定高的时间列自己竖滚:条子贴在本列的盒子上、紧跟在它后面(浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => columnRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n onUpdated(() => bars.measure())\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ unit: props.unit }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n slots.default?.({ options: ctx.api.value.columns.find(c => c.unit === props.unit)?.options ?? [] }),\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhTimePickerItem = defineComponent({\n name: 'XhTimePickerItem',\n props: {\n /** 两位补零的显示串('09' / '30');上下午列写 '00' / '01'。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n const { unit } = useTimePickerColumnContext()\n // 有插槽用插槽,否则显示这一格该显示的文字(上下午列按 locale 译成「上午 / 下午」)\n return () => h(\n 'div',\n ctx.api.value.getItemProps({ unit: unit.value, value: props.value }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getItemText({ unit: unit.value, value: props.value }),\n )\n },\n})\n\nexport const XhTimePickerHiddenInput = defineComponent({\n name: 'XhTimePickerHiddenInput',\n setup() {\n const ctx = useTimePickerContext()\n return () => h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"time-picker.js","names":[],"sources":["../../../src/components/time-picker/time-picker.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 time picker 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n TimeGranularity,\n TimeHourCycle,\n TimePickerApi,\n TimePickerColumn,\n TimePickerColumnUnit,\n TimePickerPreset,\n TimePickerPresetState,\n TimePickerSchema,\n TimePickerSelectionMode,\n TimeSegmentType,\n TimeStep,\n TimeUnavailablePredicate,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { computed, defineComponent, h, mergeProps, onUpdated, ref } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { slotIsPlainText, slotPaints } from '../../runtime/slot-content'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { withHandlers } from '../../runtime/with-handlers'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport {\n provideTimePicker,\n provideTimePickerColumn,\n provideTimePickerTag,\n useTimePickerColumnContext,\n useTimePickerContext,\n useTimePickerTagContext,\n} from './context'\nimport { useTimePicker } from './use-time-picker'\n\ntype TimePickerProps = TimePickerSchema['props']\n\n/** 默认插槽的载荷:浮层开合与当前值、值状态标志、当前的段与列,以及开合、写值、清空的动作。 */\nexport type TimePickerRootSlotProps = Pick<\n TimePickerApi,\n | 'open'\n | 'value'\n | 'empty'\n | 'outOfRange'\n | 'segments'\n | 'columns'\n | 'canClear'\n | 'canAdd'\n | 'setOpen'\n | 'setValue'\n | 'clear'\n | 'add'\n>\n\n/** 默认插槽的载荷:该列当前的可选值。 */\nexport interface TimePickerColumnSlotProps {\n options: TimePickerColumn['options']\n}\n\n/** 快捷选项列默认插槽的载荷:逐条的投影,作者据此自行铺设条目。 */\nexport interface TimePickerPresetsSlotProps {\n presets: readonly TimePickerPresetState[]\n}\n\nexport const XhTimePickerRoot = defineComponent({\n name: 'XhTimePickerRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n /** 选中的时刻,ISO 时间串数组;单选可写裸串。 */\n value: { type: [String, Array] as PropType<string | string[]> },\n defaultValue: { type: [String, Array] as PropType<string | string[]> },\n /** 选择模式,默认 single;multiple 时列上拼草稿、按「添加」收进值,输入行里排成标签。 */\n selectionMode: { type: String as PropType<TimePickerSelectionMode> },\n /** multiple 下最多选几个时刻。 */\n maxSelected: { type: Number },\n /** 多选时输入行最多摆几枚标签,其余折进 +N 那一枚;默认 3。 */\n maxTagCount: { type: Number },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n min: { type: String },\n max: { type: String },\n locale: { type: String },\n hourCycle: { type: Number as PropType<TimeHourCycle> },\n granularity: { type: String as PropType<TimeGranularity> },\n /** 按单位的步进:`{ hour?, minute?, second? }`,各单位缺省 1。 */\n timeStep: { type: Object as PropType<TimeStep> },\n /** 快捷选项;提供后浮层中多出一列,时刻要在自己的 computed 中计算后再传入。 */\n presets: { type: Array as PropType<TimePickerPreset[]> },\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<TimePickerProps['translations']> },\n /** 逐格可选性:时列按 24 小时制给值,第三个参数带已选的时与分。 */\n isTimeUnavailable: { type: Function as PropType<TimeUnavailablePredicate> },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n required: { type: Boolean, default: undefined },\n name: { type: String },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值\n emits: {\n 'clear': () => true,\n 'value-change': (_details: PayloadOf<TimePickerProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<TimePickerProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<TimePickerProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<TimePickerProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: TimePickerRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: TimePickerProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: TimePickerProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useTimePicker(withHandlers(withXhConfig('time-picker', useFormControlProps(props)), { onClear: () => emit('clear') }) as TimePickerProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideTimePicker(ctx)\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n value: ctx.api.value.value,\n empty: ctx.api.value.empty,\n outOfRange: ctx.api.value.outOfRange,\n segments: ctx.api.value.segments,\n columns: ctx.api.value.columns,\n canClear: ctx.api.value.canClear,\n canAdd: ctx.api.value.canAdd,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n clear: ctx.api.value.clear,\n add: ctx.api.value.add,\n }))\n },\n})\n\nexport const XhTimePickerLabel = defineComponent({\n name: 'XhTimePickerLabel',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n // 仍用原生 label 保持表单语义,点标题聚焦第一段由连接层的 click 接管\n return () => h('label', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerControl = defineComponent({\n name: 'XhTimePickerControl',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('div', {\n ...ctx.api.value.getControlProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.controlRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/** 标签文字所在的块(tag 的 label)。 */\nexport const XhTimePickerTagLabel = defineComponent({\n name: 'XhTimePickerTagLabel',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('span', ctx.api.value.getTagLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 标签内容:只有文字时替它包一层 label;作者自己写了节点则原样放行。库自身填入的文字(+N)恒包 label。 */\nfunction tagChildren(content: VNode[] | string | undefined): VNode[] | string | undefined {\n if (typeof content === 'string')\n return [h(XhTimePickerTagLabel, null, () => content)]\n return slotIsPlainText(content) ? [h(XhTimePickerTagLabel, null, () => content)] : content\n}\n\n/** 标签中的删除按钮:即所在标签那份 tag 的 close-trigger,可及名使用 translations.deleteItem;点按摘掉所在标签的选中值,焦点不动。 */\nexport const XhTimePickerItemDeleteTrigger = defineComponent({\n name: 'XhTimePickerItemDeleteTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n const tag = useTimePickerTagContext()\n return () => h('button', ctx.api.value.getItemDeleteTriggerProps({ value: tag.value() }) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 多选时一个选中值一个标签,即库内 tag 的 root(data-scope=\"tag\")。 */\nexport const XhTimePickerTag = defineComponent({\n name: 'XhTimePickerTag',\n props: {\n /** 它代表哪个选中值。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n provideTimePickerTag({ value: () => props.value })\n return () => h('span', ctx.api.value.getTagProps({ value: props.value }) as Record<string, unknown>, tagChildren(slots.default?.()))\n },\n})\n\n/** 折叠的标签合成的一个标签:有插槽时使用插槽,否则显示 +N。没有折叠的标签时连接层写 hidden。 */\nexport const XhTimePickerOverflowTag = defineComponent({\n name: 'XhTimePickerOverflowTag',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h(\n 'span',\n ctx.api.value.getOverflowTagProps() as Record<string, unknown>,\n tagChildren(slots.default?.() ?? ctx.api.value.overflowText),\n )\n },\n})\n\n/**\n * 标签行:多选时放在盒里、触发钮之前;单选时连接层给 hidden。\n * 不写插槽即按 tags 铺出带删除钮的标签与 +N 那一枚,写了插槽由作者自己铺。\n */\nexport const XhTimePickerTagList = defineComponent({\n name: 'XhTimePickerTagList',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('span', ctx.api.value.getTagListProps() as Record<string, unknown>, slots.default\n ? slots.default()\n : [\n ...ctx.api.value.tags.map(tag => h(XhTimePickerTag, { key: tag.value, value: tag.value }, () => [\n h(XhTimePickerTagLabel, null, () => tag.label),\n h(XhTimePickerItemDeleteTrigger),\n ])),\n h(XhTimePickerOverflowTag),\n ])\n },\n})\n\nexport const XhTimePickerSegmentGroup = defineComponent({\n name: 'XhTimePickerSegmentGroup',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('div', ctx.api.value.getSegmentGroupProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerSegment = defineComponent({\n name: 'XhTimePickerSegment',\n props: {\n // 段的身份由作者声明\n segment: { type: String as PropType<TimeSegmentType>, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n // 有插槽用插槽,否则显示该段的文字,空段为占位串\n return () => h(\n 'span',\n ctx.api.value.getSegmentProps({ segment: props.segment }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getSegmentText({ segment: props.segment }),\n )\n },\n})\n\nexport const XhTimePickerTrigger = defineComponent({\n name: 'XhTimePickerTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useTimePickerContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n // 归还焦点要落到它身上:锚点取的是整个输入行,那一层不可聚焦\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhTimePickerClearTrigger = defineComponent({\n name: 'XhTimePickerClearTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerPositioner = defineComponent({\n name: 'XhTimePickerPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useTimePickerContext()\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.controlRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, slots.default?.()),\n ])\n },\n})\n\nexport const XhTimePickerContent = defineComponent({\n name: 'XhTimePickerContent',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhTimePickerPresetGroup = defineComponent({\n name: 'XhTimePickerPresetGroup',\n slots: Object as SlotsType<{\n /** 自行铺设条目;未写时按 presets 数据自动铺设,两者产出的 DOM 一致。 */\n default?: (props: TimePickerPresetsSlotProps) => VNode[]\n }>,\n // 根是片段(选项列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useTimePickerContext()\n const presetGroupRef = ref<HTMLElement | null>(null)\n // 快捷选项列定高自己竖滚:条子贴在它的盒子上、紧跟在它后面(浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => presetGroupRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n onUpdated(() => bars.measure())\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.({ presets: api.presets })\n return [\n h(\n 'div',\n {\n ...mergeProps(api.getPresetGroupProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { presetGroupRef.value = el as HTMLElement },\n },\n slotPaints(authored)\n ? authored\n : api.presets.map(preset => h(\n 'div',\n { ...api.getPresetProps({ value: preset.value }) as Record<string, unknown>, key: preset.value },\n preset.label,\n )),\n ),\n ...bars.render(),\n ]\n }\n },\n})\n\nexport const XhTimePickerPreset = defineComponent({\n name: 'XhTimePickerPreset',\n props: {\n /** 该条目的身份,与 presets 数据中的 value 逐字对应。 */\n value: { type: String, required: true },\n },\n slots: Object as SlotsType<{\n /** 条目内容;未写时使用数据中的 label。 */\n default?: () => VNode[]\n }>,\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n return () => {\n const api = ctx.api.value\n const authored = slots.default?.()\n return h(\n 'div',\n api.getPresetProps({ value: props.value }) as Record<string, unknown>,\n slotPaints(authored) ? authored : api.presets.find(p => p.value === props.value)?.label,\n )\n }\n },\n})\n\nexport const XhTimePickerColumn = defineComponent({\n name: 'XhTimePickerColumn',\n props: {\n unit: { type: String as PropType<TimePickerColumnUnit>, required: true },\n },\n slots: Object as SlotsType<{\n default?: (props: TimePickerColumnSlotProps) => VNode[]\n }>,\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useTimePickerContext()\n const unit = computed(() => props.unit)\n // 下传单位,供列内选项取到自己归哪一列\n provideTimePickerColumn({ unit })\n const columnRef = ref<HTMLElement | null>(null)\n // 定高的时间列自己竖滚:条子贴在本列的盒子上、紧跟在它后面(浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => columnRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n onUpdated(() => bars.measure())\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ unit: props.unit }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n slots.default?.({ options: ctx.api.value.columns.find(c => c.unit === props.unit)?.options ?? [] }),\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhTimePickerItem = defineComponent({\n name: 'XhTimePickerItem',\n props: {\n /** 两位补零的显示串('09' / '30');上下午列写 '00' / '01'。 */\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useTimePickerContext()\n const { unit } = useTimePickerColumnContext()\n // 有插槽用插槽,否则显示这一格该显示的文字(上下午列按 locale 译成「上午 / 下午」)\n return () => h(\n 'div',\n ctx.api.value.getItemProps({ unit: unit.value, value: props.value }) as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.getItemText({ unit: unit.value, value: props.value }),\n )\n },\n})\n\n/** 「添加」:多选时把浮层里拼好的草稿收进值,浮层不收;单选时连接层给 hidden。文字由作者写。 */\nexport const XhTimePickerConfirmTrigger = defineComponent({\n name: 'XhTimePickerConfirmTrigger',\n setup(_, { slots }) {\n const ctx = useTimePickerContext()\n return () => h('button', ctx.api.value.getConfirmTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhTimePickerHiddenInput = defineComponent({\n name: 'XhTimePickerHiddenInput',\n setup() {\n const ctx = useTimePickerContext()\n // 多选时一个选中值一份同名输入,表单按原生多值收;单选仍是一份\n return () => ctx.api.value.selectionMode === 'multiple'\n ? ctx.api.value.value.map(value => h('input', { key: value, ...ctx.api.value.getHiddenInputProps({ value }) as Record<string, unknown> }))\n : h('input', ctx.api.value.getHiddenInputProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}