@vuecs/forms 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +43 -0
  3. package/dist/components/constants.d.ts +5 -0
  4. package/dist/components/constants.d.ts.map +1 -0
  5. package/dist/components/form-checkbox/FormCheckbox.vue.d.ts +205 -0
  6. package/dist/components/form-checkbox/FormCheckbox.vue.d.ts.map +1 -0
  7. package/dist/components/form-checkbox/index.d.ts +5 -0
  8. package/dist/components/form-checkbox/index.d.ts.map +1 -0
  9. package/dist/components/form-checkbox-group/FormCheckboxGroup.vue.d.ts +170 -0
  10. package/dist/components/form-checkbox-group/FormCheckboxGroup.vue.d.ts.map +1 -0
  11. package/dist/components/form-checkbox-group/index.d.ts +5 -0
  12. package/dist/components/form-checkbox-group/index.d.ts.map +1 -0
  13. package/dist/components/form-group/FormGroup.vue.d.ts +218 -0
  14. package/dist/components/form-group/FormGroup.vue.d.ts.map +1 -0
  15. package/dist/components/form-group/index.d.ts +5 -0
  16. package/dist/components/form-group/index.d.ts.map +1 -0
  17. package/dist/components/form-input/FormInput.vue.d.ts +195 -0
  18. package/dist/components/form-input/FormInput.vue.d.ts.map +1 -0
  19. package/dist/components/form-input/index.d.ts +5 -0
  20. package/dist/components/form-input/index.d.ts.map +1 -0
  21. package/dist/components/form-number/FormNumber.vue.d.ts +268 -0
  22. package/dist/components/form-number/FormNumber.vue.d.ts.map +1 -0
  23. package/dist/components/form-number/index.d.ts +5 -0
  24. package/dist/components/form-number/index.d.ts.map +1 -0
  25. package/dist/components/form-pin/FormPin.vue.d.ts +221 -0
  26. package/dist/components/form-pin/FormPin.vue.d.ts.map +1 -0
  27. package/dist/components/form-pin/index.d.ts +5 -0
  28. package/dist/components/form-pin/index.d.ts.map +1 -0
  29. package/dist/components/form-radio/FormRadio.vue.d.ts +170 -0
  30. package/dist/components/form-radio/FormRadio.vue.d.ts.map +1 -0
  31. package/dist/components/form-radio/index.d.ts +5 -0
  32. package/dist/components/form-radio/index.d.ts.map +1 -0
  33. package/dist/components/form-radio-group/FormRadioGroup.vue.d.ts +172 -0
  34. package/dist/components/form-radio-group/FormRadioGroup.vue.d.ts.map +1 -0
  35. package/dist/components/form-radio-group/index.d.ts +5 -0
  36. package/dist/components/form-radio-group/index.d.ts.map +1 -0
  37. package/dist/components/form-select/FormSelect.vue.d.ts +172 -0
  38. package/dist/components/form-select/FormSelect.vue.d.ts.map +1 -0
  39. package/dist/components/form-select/index.d.ts +5 -0
  40. package/dist/components/form-select/index.d.ts.map +1 -0
  41. package/dist/components/form-select-search/FormSelectSearch.vue.d.ts +272 -0
  42. package/dist/components/form-select-search/FormSelectSearch.vue.d.ts.map +1 -0
  43. package/dist/components/form-select-search/FormSelectSearchEntry.vue.d.ts +40 -0
  44. package/dist/components/form-select-search/FormSelectSearchEntry.vue.d.ts.map +1 -0
  45. package/dist/components/form-select-search/index.d.ts +6 -0
  46. package/dist/components/form-select-search/index.d.ts.map +1 -0
  47. package/dist/components/form-select-search/type.d.ts +10 -0
  48. package/dist/components/form-select-search/type.d.ts.map +1 -0
  49. package/dist/components/form-slider/FormSlider.vue.d.ts +227 -0
  50. package/dist/components/form-slider/FormSlider.vue.d.ts.map +1 -0
  51. package/dist/components/form-slider/index.d.ts +5 -0
  52. package/dist/components/form-slider/index.d.ts.map +1 -0
  53. package/dist/components/form-switch/FormSwitch.vue.d.ts +204 -0
  54. package/dist/components/form-switch/FormSwitch.vue.d.ts.map +1 -0
  55. package/dist/components/form-switch/index.d.ts +5 -0
  56. package/dist/components/form-switch/index.d.ts.map +1 -0
  57. package/dist/components/form-tags/FormTags.vue.d.ts +255 -0
  58. package/dist/components/form-tags/FormTags.vue.d.ts.map +1 -0
  59. package/dist/components/form-tags/index.d.ts +5 -0
  60. package/dist/components/form-tags/index.d.ts.map +1 -0
  61. package/dist/components/form-textarea/FormTextarea.vue.d.ts +89 -0
  62. package/dist/components/form-textarea/FormTextarea.vue.d.ts.map +1 -0
  63. package/dist/components/form-textarea/index.d.ts +5 -0
  64. package/dist/components/form-textarea/index.d.ts.map +1 -0
  65. package/dist/components/index.d.ts +18 -0
  66. package/dist/components/index.d.ts.map +1 -0
  67. package/dist/components/type.d.ts +17 -0
  68. package/dist/components/type.d.ts.map +1 -0
  69. package/dist/components/validation-group/ValidationGroup.vue.d.ts +119 -0
  70. package/dist/components/validation-group/ValidationGroup.vue.d.ts.map +1 -0
  71. package/dist/components/validation-group/index.d.ts +5 -0
  72. package/dist/components/validation-group/index.d.ts.map +1 -0
  73. package/dist/composables/index.d.ts +2 -0
  74. package/dist/composables/index.d.ts.map +1 -0
  75. package/dist/composables/use-submit-button.d.ts +63 -0
  76. package/dist/composables/use-submit-button.d.ts.map +1 -0
  77. package/dist/index.d.ts +24 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.mjs +1764 -0
  80. package/dist/index.mjs.map +1 -0
  81. package/dist/style.css +791 -0
  82. package/dist/type.d.ts +3 -0
  83. package/dist/type.d.ts.map +1 -0
  84. package/dist/types/index.d.ts +2 -0
  85. package/dist/types/index.d.ts.map +1 -0
  86. package/dist/types/option.d.ts +40 -0
  87. package/dist/types/option.d.ts.map +1 -0
  88. package/dist/vue.d.ts +20 -0
  89. package/dist/vue.d.ts.map +1 -0
  90. package/package.json +68 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/components/form-checkbox/FormCheckbox.vue","../src/components/form-checkbox/FormCheckbox.vue","../src/components/form-checkbox-group/FormCheckboxGroup.vue","../src/components/form-checkbox-group/FormCheckboxGroup.vue","../src/components/constants.ts","../src/components/validation-group/ValidationGroup.vue","../src/components/validation-group/ValidationGroup.vue","../src/components/form-group/FormGroup.vue","../src/components/form-group/FormGroup.vue","../src/components/form-input/FormInput.vue","../src/components/form-input/FormInput.vue","../src/components/form-number/FormNumber.vue","../src/components/form-number/FormNumber.vue","../src/components/form-pin/FormPin.vue","../src/components/form-pin/FormPin.vue","../src/components/form-radio/FormRadio.vue","../src/components/form-radio/FormRadio.vue","../src/components/form-radio-group/FormRadioGroup.vue","../src/components/form-radio-group/FormRadioGroup.vue","../src/types/option.ts","../src/components/form-select/FormSelect.vue","../src/components/form-select/FormSelect.vue","../src/components/form-select-search/FormSelectSearchEntry.vue","../src/components/form-select-search/FormSelectSearchEntry.vue","../src/components/form-select-search/FormSelectSearch.vue","../src/components/form-select-search/FormSelectSearch.vue","../src/components/form-slider/FormSlider.vue","../src/components/form-slider/FormSlider.vue","../src/components/form-switch/FormSwitch.vue","../src/components/form-switch/FormSwitch.vue","../src/components/form-tags/FormTags.vue","../src/components/form-tags/FormTags.vue","../src/components/form-textarea/FormTextarea.vue","../src/components/form-textarea/FormTextarea.vue","../src/composables/use-submit-button.ts","../src/index.ts"],"sourcesContent":["<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme, useId } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { CheckboxIndicator, CheckboxRoot } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType, SlotsType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormCheckboxThemeClasses = {\n root: string;\n indicator: string;\n label: string;\n group: string;\n};\n\nexport type FormCheckboxDefaults = {\n labelContent: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formCheckbox?: ThemeElementDefinition<FormCheckboxThemeClasses>;\n }\n interface ComponentDefaults {\n formCheckbox?: ComponentDefaultValues<FormCheckboxDefaults>;\n }\n}\n\nexport const formCheckboxThemeDefaults: ComponentThemeDefinition<FormCheckboxThemeClasses> = {\n classes: {\n root: 'vc-form-checkbox',\n indicator: 'vc-form-checkbox-indicator',\n label: 'vc-form-checkbox-label',\n // See FormRadio.vue — collides with `vc-form-checkbox-group`\n // used by `<VCFormCheckboxGroup>` (column layout).\n group: 'vc-form-checkbox-wrapper',\n },\n};\n\nconst behavioralDefaults: FormCheckboxDefaults = { labelContent: 'Input' };\n\nexport type FormCheckboxLabelSlotProps = {\n class: string;\n id: string;\n};\n\nexport type FormCheckboxIndicatorSlotProps = {\n class: string;\n};\n\nexport type FormCheckboxModelValue = boolean | 'indeterminate' | null;\n\nconst formCheckboxProps = {\n /** Controlled checked state. `null` is accepted as the documented \"unset\" value. */\n modelValue: {\n type: [Boolean, String, null] as PropType<FormCheckboxModelValue>,\n default: undefined,\n },\n /** Form-submission value when the checkbox is checked. */\n value: { type: [String, Number, Boolean, Object] as PropType<unknown>, default: 'on' },\n /** When `true`, prevents the user from interacting with the checkbox. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Element id; falls back to an SSR-safe generated id. */\n id: { type: String, default: undefined },\n /** Vuecs convention: render the label by default. Internal control flow, not forwarded to Reka. */\n label: { type: Boolean, default: true },\n /** Default label text (resolved through DefaultsManager). */\n labelContent: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormCheckboxThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormCheckboxProps = ExtractPublicPropTypes<typeof formCheckboxProps>;\n\nexport default defineComponent({\n name: 'VCFormCheckbox',\n inheritAttrs: false,\n props: formCheckboxProps,\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n label: FormCheckboxLabelSlotProps;\n indicator: FormCheckboxIndicatorSlotProps;\n }>,\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formCheckbox', props, formCheckboxThemeDefaults);\n const defaults = useComponentDefaults('formCheckbox', props, behavioralDefaults);\n // SSR-safe stable id (Vue 3.5's native `useId` under the hood).\n // Replaces a `Math.random()` fallback that caused hydration\n // mismatches and made IDs non-deterministic across renders.\n const fallbackId = useId(undefined, 'vc-form-checkbox');\n\n return () => {\n const resolved = theme.value;\n const resolvedDefaults = defaults.value;\n const id = props.id ?? fallbackId;\n\n const checkbox = h(\n CheckboxRoot,\n mergeProps(attrs, {\n id,\n value: props.value,\n name: props.name,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue': (value: FormCheckboxModelValue) => emit('update:modelValue', value),\n class: resolved.root || undefined,\n }),\n {\n default: () => h(\n CheckboxIndicator,\n { class: resolved.indicator || undefined },\n { default: () => slots.indicator?.({ class: resolved.indicator }) ?? '' },\n ),\n },\n );\n\n if (!props.label) {\n return checkbox;\n }\n\n const labelNode = slots.label ?\n slots.label({ class: resolved.label, id }) :\n h('label', { class: resolved.label || undefined, for: id }, [resolvedDefaults.labelContent]);\n\n return h('div', { class: resolved.group || undefined }, [checkbox, labelNode]);\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme, useId } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { CheckboxIndicator, CheckboxRoot } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType, SlotsType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormCheckboxThemeClasses = {\n root: string;\n indicator: string;\n label: string;\n group: string;\n};\n\nexport type FormCheckboxDefaults = {\n labelContent: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formCheckbox?: ThemeElementDefinition<FormCheckboxThemeClasses>;\n }\n interface ComponentDefaults {\n formCheckbox?: ComponentDefaultValues<FormCheckboxDefaults>;\n }\n}\n\nexport const formCheckboxThemeDefaults: ComponentThemeDefinition<FormCheckboxThemeClasses> = {\n classes: {\n root: 'vc-form-checkbox',\n indicator: 'vc-form-checkbox-indicator',\n label: 'vc-form-checkbox-label',\n // See FormRadio.vue — collides with `vc-form-checkbox-group`\n // used by `<VCFormCheckboxGroup>` (column layout).\n group: 'vc-form-checkbox-wrapper',\n },\n};\n\nconst behavioralDefaults: FormCheckboxDefaults = { labelContent: 'Input' };\n\nexport type FormCheckboxLabelSlotProps = {\n class: string;\n id: string;\n};\n\nexport type FormCheckboxIndicatorSlotProps = {\n class: string;\n};\n\nexport type FormCheckboxModelValue = boolean | 'indeterminate' | null;\n\nconst formCheckboxProps = {\n /** Controlled checked state. `null` is accepted as the documented \"unset\" value. */\n modelValue: {\n type: [Boolean, String, null] as PropType<FormCheckboxModelValue>,\n default: undefined,\n },\n /** Form-submission value when the checkbox is checked. */\n value: { type: [String, Number, Boolean, Object] as PropType<unknown>, default: 'on' },\n /** When `true`, prevents the user from interacting with the checkbox. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Element id; falls back to an SSR-safe generated id. */\n id: { type: String, default: undefined },\n /** Vuecs convention: render the label by default. Internal control flow, not forwarded to Reka. */\n label: { type: Boolean, default: true },\n /** Default label text (resolved through DefaultsManager). */\n labelContent: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormCheckboxThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormCheckboxProps = ExtractPublicPropTypes<typeof formCheckboxProps>;\n\nexport default defineComponent({\n name: 'VCFormCheckbox',\n inheritAttrs: false,\n props: formCheckboxProps,\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n label: FormCheckboxLabelSlotProps;\n indicator: FormCheckboxIndicatorSlotProps;\n }>,\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formCheckbox', props, formCheckboxThemeDefaults);\n const defaults = useComponentDefaults('formCheckbox', props, behavioralDefaults);\n // SSR-safe stable id (Vue 3.5's native `useId` under the hood).\n // Replaces a `Math.random()` fallback that caused hydration\n // mismatches and made IDs non-deterministic across renders.\n const fallbackId = useId(undefined, 'vc-form-checkbox');\n\n return () => {\n const resolved = theme.value;\n const resolvedDefaults = defaults.value;\n const id = props.id ?? fallbackId;\n\n const checkbox = h(\n CheckboxRoot,\n mergeProps(attrs, {\n id,\n value: props.value,\n name: props.name,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue': (value: FormCheckboxModelValue) => emit('update:modelValue', value),\n class: resolved.root || undefined,\n }),\n {\n default: () => h(\n CheckboxIndicator,\n { class: resolved.indicator || undefined },\n { default: () => slots.indicator?.({ class: resolved.indicator }) ?? '' },\n ),\n },\n );\n\n if (!props.label) {\n return checkbox;\n }\n\n const labelNode = slots.label ?\n slots.label({ class: resolved.label, id }) :\n h('label', { class: resolved.label || undefined, for: id }, [resolvedDefaults.labelContent]);\n\n return h('div', { class: resolved.group || undefined }, [checkbox, labelNode]);\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { CheckboxGroupRoot } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormCheckboxGroupThemeClasses = {\n root: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formCheckboxGroup?: ThemeElementDefinition<FormCheckboxGroupThemeClasses>;\n }\n}\n\nexport const formCheckboxGroupThemeDefaults: ComponentThemeDefinition<FormCheckboxGroupThemeClasses> = { classes: { root: 'vc-form-checkbox-group' } };\n\nexport type FormCheckboxGroupOrientation = 'vertical' | 'horizontal';\n\nconst formCheckboxGroupProps = {\n /** Controlled array of selected values. */\n modelValue: { type: Array as PropType<unknown[]>, default: undefined },\n /** Disables every checkbox in the group. */\n disabled: { type: Boolean, default: false },\n /** Marks the group as required for native form validation. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Vuecs convention: vertical-stacked layout (Reka leaves this unset; the column layout is what `vc-form-checkbox-group` styles for). */\n orientation: {\n type: String as PropType<FormCheckboxGroupOrientation>,\n default: 'vertical',\n },\n /** Vuecs convention: arrow-key navigation wraps (Reka has no default). */\n loop: { type: Boolean, default: true },\n /** When `false`, disables roving focus on group items. */\n rovingFocus: { type: Boolean, default: true },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormCheckboxGroupThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormCheckboxGroupProps = ExtractPublicPropTypes<typeof formCheckboxGroupProps>;\n\nexport default defineComponent({\n name: 'VCFormCheckboxGroup',\n inheritAttrs: false,\n props: formCheckboxGroupProps,\n emits: ['update:modelValue'],\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formCheckboxGroup', props, formCheckboxGroupThemeDefaults);\n\n return () => h(\n CheckboxGroupRoot,\n mergeProps(attrs, {\n name: props.name,\n orientation: props.orientation,\n loop: props.loop,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n rovingFocus: props.rovingFocus,\n 'onUpdate:modelValue': (value: unknown[]) => emit('update:modelValue', value),\n class: theme.value.root || undefined,\n }),\n { default: () => slots.default?.() },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { CheckboxGroupRoot } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormCheckboxGroupThemeClasses = {\n root: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formCheckboxGroup?: ThemeElementDefinition<FormCheckboxGroupThemeClasses>;\n }\n}\n\nexport const formCheckboxGroupThemeDefaults: ComponentThemeDefinition<FormCheckboxGroupThemeClasses> = { classes: { root: 'vc-form-checkbox-group' } };\n\nexport type FormCheckboxGroupOrientation = 'vertical' | 'horizontal';\n\nconst formCheckboxGroupProps = {\n /** Controlled array of selected values. */\n modelValue: { type: Array as PropType<unknown[]>, default: undefined },\n /** Disables every checkbox in the group. */\n disabled: { type: Boolean, default: false },\n /** Marks the group as required for native form validation. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Vuecs convention: vertical-stacked layout (Reka leaves this unset; the column layout is what `vc-form-checkbox-group` styles for). */\n orientation: {\n type: String as PropType<FormCheckboxGroupOrientation>,\n default: 'vertical',\n },\n /** Vuecs convention: arrow-key navigation wraps (Reka has no default). */\n loop: { type: Boolean, default: true },\n /** When `false`, disables roving focus on group items. */\n rovingFocus: { type: Boolean, default: true },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormCheckboxGroupThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormCheckboxGroupProps = ExtractPublicPropTypes<typeof formCheckboxGroupProps>;\n\nexport default defineComponent({\n name: 'VCFormCheckboxGroup',\n inheritAttrs: false,\n props: formCheckboxGroupProps,\n emits: ['update:modelValue'],\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formCheckboxGroup', props, formCheckboxGroupThemeDefaults);\n\n return () => h(\n CheckboxGroupRoot,\n mergeProps(attrs, {\n name: props.name,\n orientation: props.orientation,\n loop: props.loop,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n rovingFocus: props.rovingFocus,\n 'onUpdate:modelValue': (value: unknown[]) => emit('update:modelValue', value),\n class: theme.value.root || undefined,\n }),\n { default: () => slots.default?.() },\n );\n },\n});\n</script>\n","export enum ValidationSeverity {\n ERROR = 'error',\n WARNING = 'warning',\n}\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport type {\n ExtractPublicPropTypes,\n PropType,\n SlotsType,\n VNodeArrayChildren,\n VNodeChild,\n} from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { ValidationSeverity } from '../constants';\nimport type { ValidationMessages, ValidationMessagesArrayStyle } from '../type';\n\nexport type ValidationGroupThemeClasses = {\n item: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n validationGroup?: ThemeElementDefinition<ValidationGroupThemeClasses>;\n }\n}\n\nexport const validationGroupThemeDefaults: ComponentThemeDefinition<ValidationGroupThemeClasses> = { classes: { item: 'form-group-hint group-required' } };\n\nexport type ValidationGroupDefaultSlotProps = {\n data: ValidationMessagesArrayStyle;\n severity: `${ValidationSeverity}`;\n itemClass: string;\n itemTag: string;\n};\n\nexport type ValidationGroupItemSlotProps = {\n key: string;\n value: string;\n class: string;\n tag: string;\n severity: `${ValidationSeverity}`;\n};\n\nconst validationGroupProps = {\n /** Severity used to colour the rendered messages (`error` / `warning`). */\n severity: { type: String as PropType<`${ValidationSeverity}`>, default: ValidationSeverity.ERROR },\n /** Validation messages — keyed object or ordered array of `{ key, value }`. */\n messages: { type: [Object, Array] as PropType<ValidationMessages>, default: () => ({}) },\n /** HTML tag used for each rendered message. */\n itemTag: { type: String, default: 'div' },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<ValidationGroupThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type ValidationGroupProps = ExtractPublicPropTypes<typeof validationGroupProps>;\n\nexport default defineComponent({\n name: 'VCValidationGroup',\n props: validationGroupProps,\n slots: Object as SlotsType<{\n default: ValidationGroupDefaultSlotProps;\n item: ValidationGroupItemSlotProps;\n }>,\n setup(props, { slots }) {\n const theme = useComponentTheme('validationGroup', props, validationGroupThemeDefaults);\n\n return () => {\n const resolved = theme.value;\n\n let errors: ValidationMessagesArrayStyle;\n if (Array.isArray(props.messages)) {\n errors = props.messages;\n } else {\n errors = [];\n const keys = Object.keys(props.messages);\n for (const key of keys) {\n errors.push({ key, value: props.messages[key] });\n }\n }\n\n if (slots.default) {\n return slots.default({\n data: errors,\n severity: props.severity,\n itemClass: resolved.item,\n itemTag: props.itemTag,\n });\n }\n\n const children: VNodeArrayChildren = [];\n\n for (const error of errors) {\n if (slots.item) {\n children.push(slots.item({\n key: error.key,\n value: error.value,\n class: resolved.item,\n tag: props.itemTag,\n severity: props.severity,\n }));\n } else {\n children.push(h(props.itemTag, { class: resolved.item || undefined }, [error.value]));\n }\n }\n\n return children as VNodeChild;\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport type {\n ExtractPublicPropTypes,\n PropType,\n SlotsType,\n VNodeArrayChildren,\n VNodeChild,\n} from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { ValidationSeverity } from '../constants';\nimport type { ValidationMessages, ValidationMessagesArrayStyle } from '../type';\n\nexport type ValidationGroupThemeClasses = {\n item: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n validationGroup?: ThemeElementDefinition<ValidationGroupThemeClasses>;\n }\n}\n\nexport const validationGroupThemeDefaults: ComponentThemeDefinition<ValidationGroupThemeClasses> = { classes: { item: 'form-group-hint group-required' } };\n\nexport type ValidationGroupDefaultSlotProps = {\n data: ValidationMessagesArrayStyle;\n severity: `${ValidationSeverity}`;\n itemClass: string;\n itemTag: string;\n};\n\nexport type ValidationGroupItemSlotProps = {\n key: string;\n value: string;\n class: string;\n tag: string;\n severity: `${ValidationSeverity}`;\n};\n\nconst validationGroupProps = {\n /** Severity used to colour the rendered messages (`error` / `warning`). */\n severity: { type: String as PropType<`${ValidationSeverity}`>, default: ValidationSeverity.ERROR },\n /** Validation messages — keyed object or ordered array of `{ key, value }`. */\n messages: { type: [Object, Array] as PropType<ValidationMessages>, default: () => ({}) },\n /** HTML tag used for each rendered message. */\n itemTag: { type: String, default: 'div' },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<ValidationGroupThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type ValidationGroupProps = ExtractPublicPropTypes<typeof validationGroupProps>;\n\nexport default defineComponent({\n name: 'VCValidationGroup',\n props: validationGroupProps,\n slots: Object as SlotsType<{\n default: ValidationGroupDefaultSlotProps;\n item: ValidationGroupItemSlotProps;\n }>,\n setup(props, { slots }) {\n const theme = useComponentTheme('validationGroup', props, validationGroupThemeDefaults);\n\n return () => {\n const resolved = theme.value;\n\n let errors: ValidationMessagesArrayStyle;\n if (Array.isArray(props.messages)) {\n errors = props.messages;\n } else {\n errors = [];\n const keys = Object.keys(props.messages);\n for (const key of keys) {\n errors.push({ key, value: props.messages[key] });\n }\n }\n\n if (slots.default) {\n return slots.default({\n data: errors,\n severity: props.severity,\n itemClass: resolved.item,\n itemTag: props.itemTag,\n });\n }\n\n const children: VNodeArrayChildren = [];\n\n for (const error of errors) {\n if (slots.item) {\n children.push(slots.item({\n key: error.key,\n value: error.value,\n class: resolved.item,\n tag: props.itemTag,\n severity: props.severity,\n }));\n } else {\n children.push(h(props.itemTag, { class: resolved.item || undefined }, [error.value]));\n }\n }\n\n return children as VNodeChild;\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport type {\n ExtractPublicPropTypes,\n PropType,\n SlotsType,\n VNodeChild,\n} from 'vue';\nimport { defineComponent, h, mergeProps } from 'vue';\nimport { ValidationSeverity } from '../constants';\nimport type { ValidationMessages } from '../type';\nimport {\n VCValidationGroup,\n type ValidationGroupDefaultSlotProps,\n type ValidationGroupItemSlotProps,\n} from '../validation-group';\n\nexport type FormGroupThemeClasses = {\n root: string;\n label: string;\n hint: string;\n validationError: string;\n validationWarning: string;\n};\n\nexport type FormGroupDefaults = {\n validation: boolean;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formGroup?: ThemeElementDefinition<FormGroupThemeClasses>;\n }\n interface ComponentDefaults {\n formGroup?: ComponentDefaultValues<FormGroupDefaults>;\n }\n}\n\nexport const formGroupThemeDefaults: ComponentThemeDefinition<FormGroupThemeClasses> = {\n classes: {\n root: '',\n label: '',\n hint: '',\n validationError: '',\n validationWarning: '',\n },\n};\n\nconst behavioralDefaults: FormGroupDefaults = { validation: true };\n\nconst formGroupProps = {\n /** When `true`/`false`, force-render or hide the label. When `undefined`, label visibility follows slot/content presence. */\n label: { type: Boolean, default: undefined },\n /** HTML tag used for the label element. */\n labelTag: { type: String, default: 'label' },\n /** Default text rendered when no `label` slot is provided. */\n labelContent: { type: String, default: undefined },\n\n /** When `true`/`false`, force-render or hide the hint. When `undefined`, hint visibility follows slot/content presence. */\n hint: { type: Boolean, default: undefined },\n /** HTML tag used for the hint element. */\n hintTag: { type: String, default: 'div' },\n /** Default text rendered when no `hint` slot is provided. */\n hintContent: { type: String, default: undefined },\n\n /** When `true`, render the validation messages section. Falls back to the global `formGroup.validation` default. */\n validation: { type: Boolean, default: undefined },\n /** Severity used to colour the validation messages (`error` / `warning`). */\n validationSeverity: { type: String as PropType<`${ValidationSeverity}` | undefined>, default: undefined },\n /** Validation messages — keyed object or ordered array of `{ key, value }`. */\n validationMessages: { type: [Object, Array] as PropType<ValidationMessages>, default: undefined },\n\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormGroupThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormGroupProps = ExtractPublicPropTypes<typeof formGroupProps>;\n\nexport default defineComponent({\n name: 'VCFormGroup',\n inheritAttrs: false,\n props: formGroupProps,\n slots: Object as SlotsType<{\n default: Record<string, never>;\n label: Record<string, never>;\n hint: Record<string, never>;\n validationGroup: ValidationGroupDefaultSlotProps;\n validationItem: ValidationGroupItemSlotProps;\n }>,\n setup(props, { attrs, slots }) {\n const theme = useComponentTheme('formGroup', props, formGroupThemeDefaults);\n const defaults = useComponentDefaults('formGroup', props, behavioralDefaults);\n\n return () => {\n const resolved = theme.value;\n const resolvedDefaults = defaults.value;\n const children: VNodeChild[] = [];\n\n // Label\n const showLabel = typeof props.label === 'boolean' ?\n props.label :\n (!!props.labelContent || !!slots.label);\n\n if (showLabel) {\n if (slots.label) {\n children.push(h(props.labelTag, { class: resolved.label || undefined }, slots.label({})));\n } else if (props.labelContent) {\n children.push(h(props.labelTag, { class: resolved.label || undefined }, [props.labelContent]));\n }\n }\n\n // Default slot content\n if (slots.default) {\n children.push(slots.default({}));\n }\n\n // Validation\n if (resolvedDefaults.validation) {\n children.push(h(VCValidationGroup, {\n severity: props.validationSeverity,\n messages: props.validationMessages || {},\n }, {\n ...(slots.validationGroup ? { default: slots.validationGroup } : {}),\n ...(slots.validationItem ? { item: slots.validationItem } : {}),\n }));\n }\n\n // Hint\n const showHint = typeof props.hint === 'boolean' ?\n props.hint :\n (!!props.hintContent || !!slots.hint);\n\n if (showHint) {\n if (slots.hint) {\n children.push(h(props.hintTag, { class: resolved.hint || undefined }, slots.hint({})));\n } else if (props.hintContent) {\n children.push(h(props.hintTag, { class: resolved.hint || undefined }, [props.hintContent]));\n }\n }\n\n // Determine validation class\n let validationClass: string | undefined;\n if (resolvedDefaults.validation && props.validationMessages) {\n const hasMessages = Array.isArray(props.validationMessages) ?\n props.validationMessages.length > 0 :\n Object.keys(props.validationMessages).length > 0;\n\n if (hasMessages) {\n validationClass = props.validationSeverity === ValidationSeverity.WARNING ?\n resolved.validationWarning :\n resolved.validationError;\n }\n }\n\n return h(\n 'div',\n mergeProps(attrs, { class: [resolved.root || undefined, validationClass || undefined] }),\n children,\n );\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport type {\n ExtractPublicPropTypes,\n PropType,\n SlotsType,\n VNodeChild,\n} from 'vue';\nimport { defineComponent, h, mergeProps } from 'vue';\nimport { ValidationSeverity } from '../constants';\nimport type { ValidationMessages } from '../type';\nimport {\n VCValidationGroup,\n type ValidationGroupDefaultSlotProps,\n type ValidationGroupItemSlotProps,\n} from '../validation-group';\n\nexport type FormGroupThemeClasses = {\n root: string;\n label: string;\n hint: string;\n validationError: string;\n validationWarning: string;\n};\n\nexport type FormGroupDefaults = {\n validation: boolean;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formGroup?: ThemeElementDefinition<FormGroupThemeClasses>;\n }\n interface ComponentDefaults {\n formGroup?: ComponentDefaultValues<FormGroupDefaults>;\n }\n}\n\nexport const formGroupThemeDefaults: ComponentThemeDefinition<FormGroupThemeClasses> = {\n classes: {\n root: '',\n label: '',\n hint: '',\n validationError: '',\n validationWarning: '',\n },\n};\n\nconst behavioralDefaults: FormGroupDefaults = { validation: true };\n\nconst formGroupProps = {\n /** When `true`/`false`, force-render or hide the label. When `undefined`, label visibility follows slot/content presence. */\n label: { type: Boolean, default: undefined },\n /** HTML tag used for the label element. */\n labelTag: { type: String, default: 'label' },\n /** Default text rendered when no `label` slot is provided. */\n labelContent: { type: String, default: undefined },\n\n /** When `true`/`false`, force-render or hide the hint. When `undefined`, hint visibility follows slot/content presence. */\n hint: { type: Boolean, default: undefined },\n /** HTML tag used for the hint element. */\n hintTag: { type: String, default: 'div' },\n /** Default text rendered when no `hint` slot is provided. */\n hintContent: { type: String, default: undefined },\n\n /** When `true`, render the validation messages section. Falls back to the global `formGroup.validation` default. */\n validation: { type: Boolean, default: undefined },\n /** Severity used to colour the validation messages (`error` / `warning`). */\n validationSeverity: { type: String as PropType<`${ValidationSeverity}` | undefined>, default: undefined },\n /** Validation messages — keyed object or ordered array of `{ key, value }`. */\n validationMessages: { type: [Object, Array] as PropType<ValidationMessages>, default: undefined },\n\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormGroupThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormGroupProps = ExtractPublicPropTypes<typeof formGroupProps>;\n\nexport default defineComponent({\n name: 'VCFormGroup',\n inheritAttrs: false,\n props: formGroupProps,\n slots: Object as SlotsType<{\n default: Record<string, never>;\n label: Record<string, never>;\n hint: Record<string, never>;\n validationGroup: ValidationGroupDefaultSlotProps;\n validationItem: ValidationGroupItemSlotProps;\n }>,\n setup(props, { attrs, slots }) {\n const theme = useComponentTheme('formGroup', props, formGroupThemeDefaults);\n const defaults = useComponentDefaults('formGroup', props, behavioralDefaults);\n\n return () => {\n const resolved = theme.value;\n const resolvedDefaults = defaults.value;\n const children: VNodeChild[] = [];\n\n // Label\n const showLabel = typeof props.label === 'boolean' ?\n props.label :\n (!!props.labelContent || !!slots.label);\n\n if (showLabel) {\n if (slots.label) {\n children.push(h(props.labelTag, { class: resolved.label || undefined }, slots.label({})));\n } else if (props.labelContent) {\n children.push(h(props.labelTag, { class: resolved.label || undefined }, [props.labelContent]));\n }\n }\n\n // Default slot content\n if (slots.default) {\n children.push(slots.default({}));\n }\n\n // Validation\n if (resolvedDefaults.validation) {\n children.push(h(VCValidationGroup, {\n severity: props.validationSeverity,\n messages: props.validationMessages || {},\n }, {\n ...(slots.validationGroup ? { default: slots.validationGroup } : {}),\n ...(slots.validationItem ? { item: slots.validationItem } : {}),\n }));\n }\n\n // Hint\n const showHint = typeof props.hint === 'boolean' ?\n props.hint :\n (!!props.hintContent || !!slots.hint);\n\n if (showHint) {\n if (slots.hint) {\n children.push(h(props.hintTag, { class: resolved.hint || undefined }, slots.hint({})));\n } else if (props.hintContent) {\n children.push(h(props.hintTag, { class: resolved.hint || undefined }, [props.hintContent]));\n }\n }\n\n // Determine validation class\n let validationClass: string | undefined;\n if (resolvedDefaults.validation && props.validationMessages) {\n const hasMessages = Array.isArray(props.validationMessages) ?\n props.validationMessages.length > 0 :\n Object.keys(props.validationMessages).length > 0;\n\n if (hasMessages) {\n validationClass = props.validationSeverity === ValidationSeverity.WARNING ?\n resolved.validationWarning :\n resolved.validationError;\n }\n }\n\n return h(\n 'div',\n mergeProps(attrs, { class: [resolved.root || undefined, validationClass || undefined] }),\n children,\n );\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { useDebounceFn } from '@vueuse/core';\nimport type {\n ExtractPublicPropTypes,\n PropType,\n SlotsType,\n VNodeChild,\n} from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n ref,\n watch,\n} from 'vue';\n\nexport type FormInputThemeClasses = {\n root: string;\n group: string;\n groupAppend: string;\n groupPrepend: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formInput?: ThemeElementDefinition<FormInputThemeClasses>;\n }\n}\n\nexport const formInputThemeDefaults: ComponentThemeDefinition<FormInputThemeClasses> = {\n classes: {\n root: 'vc-form-input',\n group: 'vc-form-input-group',\n groupAppend: 'vc-form-input-group-append',\n groupPrepend: 'vc-form-input-group-prepend',\n },\n};\n\nexport type FormInputGroupSlotProps = {\n class: string;\n tag: string;\n};\n\nconst formInputProps = {\n /** Controlled string value (v-model). */\n modelValue: { type: String, default: '' },\n /** Native `<input type>` attribute. */\n type: { type: String, default: 'text' },\n /** Force-render the input-group wrapper even without prepend/append content. */\n group: { type: Boolean, default: false },\n /** When `true`, render a prepended group element using `groupPrependContent` (or the `groupPrepend` slot). */\n groupPrepend: { type: Boolean, default: false },\n /** Default text/HTML rendered inside the prepend slot. */\n groupPrependContent: { type: String, default: undefined },\n /** When `true`, render an appended group element using `groupAppendContent` (or the `groupAppend` slot). */\n groupAppend: { type: Boolean, default: false },\n /** Default text/HTML rendered inside the append slot. */\n groupAppendContent: { type: String, default: undefined },\n /** Debounce window (ms) for `update:modelValue` emissions. `0` disables debouncing. */\n debounce: { type: Number, default: 0 },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormInputThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormInputProps = ExtractPublicPropTypes<typeof formInputProps>;\n\nexport default defineComponent({\n name: 'VCFormInput',\n // attrs are explicitly merged onto the `<input>` below via\n // `mergeProps(..., attrs)`. Without `inheritAttrs: false`, the\n // group-wrapper `<div>` (when rendered) also receives them, so\n // `id` / `disabled` / `placeholder` end up on both elements.\n inheritAttrs: false,\n props: formInputProps,\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n groupAppend: FormInputGroupSlotProps;\n groupPrepend: FormInputGroupSlotProps;\n }>,\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formInput', props, formInputThemeDefaults);\n\n const localValue = ref(props.modelValue);\n watch(() => props.modelValue, (value) => {\n localValue.value = value;\n });\n\n const emitUpdate = (value: string) => emit('update:modelValue', value);\n const emitUpdateDebounced = useDebounceFn(emitUpdate, () => props.debounce);\n\n const onInput = ($event: Event) => {\n // Vue patches `composing` onto the target during IME composition;\n // skip the emit until composition ends to avoid duplicate updates.\n const target = $event.target as globalThis.HTMLInputElement & { composing?: boolean };\n if (target.composing) return;\n const { value } = target;\n localValue.value = value;\n if (props.debounce > 0) {\n emitUpdateDebounced(value);\n } else {\n emitUpdate(value);\n }\n };\n\n return () => {\n const resolved = theme.value;\n const children: VNodeChild[] = [];\n\n // Group prepend\n if (slots.groupPrepend) {\n children.push(slots.groupPrepend({ class: resolved.groupPrepend, tag: 'div' }));\n } else if (props.groupPrepend) {\n children.push(h('div', { class: resolved.groupPrepend || undefined }, [props.groupPrependContent]));\n }\n\n // Input element\n children.push(h('input', mergeProps({\n type: props.type,\n class: resolved.root || undefined,\n onInput,\n value: localValue.value,\n }, attrs)));\n\n // Group append\n if (slots.groupAppend) {\n children.push(slots.groupAppend({ class: resolved.groupAppend, tag: 'div' }));\n } else if (props.groupAppend) {\n children.push(h('div', { class: resolved.groupAppend || undefined }, [props.groupAppendContent]));\n }\n\n // Wrap in group if needed\n if (children.length > 1 || props.group) {\n return h('div', { class: resolved.group || undefined }, children);\n }\n\n return children[0];\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { useDebounceFn } from '@vueuse/core';\nimport type {\n ExtractPublicPropTypes,\n PropType,\n SlotsType,\n VNodeChild,\n} from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n ref,\n watch,\n} from 'vue';\n\nexport type FormInputThemeClasses = {\n root: string;\n group: string;\n groupAppend: string;\n groupPrepend: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formInput?: ThemeElementDefinition<FormInputThemeClasses>;\n }\n}\n\nexport const formInputThemeDefaults: ComponentThemeDefinition<FormInputThemeClasses> = {\n classes: {\n root: 'vc-form-input',\n group: 'vc-form-input-group',\n groupAppend: 'vc-form-input-group-append',\n groupPrepend: 'vc-form-input-group-prepend',\n },\n};\n\nexport type FormInputGroupSlotProps = {\n class: string;\n tag: string;\n};\n\nconst formInputProps = {\n /** Controlled string value (v-model). */\n modelValue: { type: String, default: '' },\n /** Native `<input type>` attribute. */\n type: { type: String, default: 'text' },\n /** Force-render the input-group wrapper even without prepend/append content. */\n group: { type: Boolean, default: false },\n /** When `true`, render a prepended group element using `groupPrependContent` (or the `groupPrepend` slot). */\n groupPrepend: { type: Boolean, default: false },\n /** Default text/HTML rendered inside the prepend slot. */\n groupPrependContent: { type: String, default: undefined },\n /** When `true`, render an appended group element using `groupAppendContent` (or the `groupAppend` slot). */\n groupAppend: { type: Boolean, default: false },\n /** Default text/HTML rendered inside the append slot. */\n groupAppendContent: { type: String, default: undefined },\n /** Debounce window (ms) for `update:modelValue` emissions. `0` disables debouncing. */\n debounce: { type: Number, default: 0 },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormInputThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormInputProps = ExtractPublicPropTypes<typeof formInputProps>;\n\nexport default defineComponent({\n name: 'VCFormInput',\n // attrs are explicitly merged onto the `<input>` below via\n // `mergeProps(..., attrs)`. Without `inheritAttrs: false`, the\n // group-wrapper `<div>` (when rendered) also receives them, so\n // `id` / `disabled` / `placeholder` end up on both elements.\n inheritAttrs: false,\n props: formInputProps,\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n groupAppend: FormInputGroupSlotProps;\n groupPrepend: FormInputGroupSlotProps;\n }>,\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formInput', props, formInputThemeDefaults);\n\n const localValue = ref(props.modelValue);\n watch(() => props.modelValue, (value) => {\n localValue.value = value;\n });\n\n const emitUpdate = (value: string) => emit('update:modelValue', value);\n const emitUpdateDebounced = useDebounceFn(emitUpdate, () => props.debounce);\n\n const onInput = ($event: Event) => {\n // Vue patches `composing` onto the target during IME composition;\n // skip the emit until composition ends to avoid duplicate updates.\n const target = $event.target as globalThis.HTMLInputElement & { composing?: boolean };\n if (target.composing) return;\n const { value } = target;\n localValue.value = value;\n if (props.debounce > 0) {\n emitUpdateDebounced(value);\n } else {\n emitUpdate(value);\n }\n };\n\n return () => {\n const resolved = theme.value;\n const children: VNodeChild[] = [];\n\n // Group prepend\n if (slots.groupPrepend) {\n children.push(slots.groupPrepend({ class: resolved.groupPrepend, tag: 'div' }));\n } else if (props.groupPrepend) {\n children.push(h('div', { class: resolved.groupPrepend || undefined }, [props.groupPrependContent]));\n }\n\n // Input element\n children.push(h('input', mergeProps({\n type: props.type,\n class: resolved.root || undefined,\n onInput,\n value: localValue.value,\n }, attrs)));\n\n // Group append\n if (slots.groupAppend) {\n children.push(slots.groupAppend({ class: resolved.groupAppend, tag: 'div' }));\n } else if (props.groupAppend) {\n children.push(h('div', { class: resolved.groupAppend || undefined }, [props.groupAppendContent]));\n }\n\n // Wrap in group if needed\n if (children.length > 1 || props.group) {\n return h('div', { class: resolved.group || undefined }, children);\n }\n\n return children[0];\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n NumberFieldDecrement,\n NumberFieldIncrement,\n NumberFieldInput,\n NumberFieldRoot,\n} from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormNumberThemeClasses = {\n root: string;\n input: string;\n decrement: string;\n increment: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formNumber?: ThemeElementDefinition<FormNumberThemeClasses>;\n }\n}\n\nexport const formNumberThemeDefaults: ComponentThemeDefinition<FormNumberThemeClasses> = {\n classes: {\n root: 'vc-form-number',\n input: 'vc-form-number-input',\n decrement: 'vc-form-number-decrement',\n increment: 'vc-form-number-increment',\n },\n};\n\nconst formNumberProps = {\n /** Controlled numeric value. `null` is the documented \"unset\" value. */\n modelValue: { type: [Number, null] as PropType<number | null | undefined>, default: undefined },\n /** Smallest allowed value. */\n min: { type: Number, default: undefined },\n /** Largest allowed value. */\n max: { type: Number, default: undefined },\n /** Increment / decrement step. */\n step: { type: Number, default: 1 },\n /** When `true`, snap typed values to the nearest step. */\n stepSnapping: { type: Boolean, default: true },\n /** Vuecs convention: do NOT focus the input on programmatic value change (Reka defaults to `true`; this avoids surprising focus jumps). */\n focusOnChange: { type: Boolean, default: false },\n /** `Intl.NumberFormat` options for display + parsing. */\n formatOptions: { type: Object as PropType<Intl.NumberFormatOptions>, default: undefined },\n /** BCP-47 locale used for formatting and currency. */\n locale: { type: String, default: undefined },\n /** When `true`, prevents the user from interacting with the field. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Element id for the root number field. */\n id: { type: String, default: undefined },\n /** Vuecs internal: show ± stepper buttons. Drives the in-template render branch; not forwarded to Reka. */\n steppers: { type: Boolean, default: true },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormNumberThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormNumberProps = ExtractPublicPropTypes<typeof formNumberProps>;\n\nexport default defineComponent({\n name: 'VCFormNumber',\n inheritAttrs: false,\n props: formNumberProps,\n emits: ['update:modelValue'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formNumber', props, formNumberThemeDefaults);\n\n return () => h(\n NumberFieldRoot,\n mergeProps(attrs, {\n focusOnChange: props.focusOnChange,\n name: props.name,\n id: props.id,\n modelValue: props.modelValue,\n min: props.min,\n max: props.max,\n step: props.step,\n stepSnapping: props.stepSnapping,\n formatOptions: props.formatOptions,\n locale: props.locale,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue': (value: number) => emit('update:modelValue', value),\n class: theme.value.root || undefined,\n }),\n {\n default: () => {\n const children = [];\n if (props.steppers) {\n children.push(h(NumberFieldDecrement, { class: theme.value.decrement || undefined }, { default: () => '−' }));\n }\n children.push(h(NumberFieldInput, { class: theme.value.input || undefined }));\n if (props.steppers) {\n children.push(h(NumberFieldIncrement, { class: theme.value.increment || undefined }, { default: () => '+' }));\n }\n return children;\n },\n },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n NumberFieldDecrement,\n NumberFieldIncrement,\n NumberFieldInput,\n NumberFieldRoot,\n} from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormNumberThemeClasses = {\n root: string;\n input: string;\n decrement: string;\n increment: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formNumber?: ThemeElementDefinition<FormNumberThemeClasses>;\n }\n}\n\nexport const formNumberThemeDefaults: ComponentThemeDefinition<FormNumberThemeClasses> = {\n classes: {\n root: 'vc-form-number',\n input: 'vc-form-number-input',\n decrement: 'vc-form-number-decrement',\n increment: 'vc-form-number-increment',\n },\n};\n\nconst formNumberProps = {\n /** Controlled numeric value. `null` is the documented \"unset\" value. */\n modelValue: { type: [Number, null] as PropType<number | null | undefined>, default: undefined },\n /** Smallest allowed value. */\n min: { type: Number, default: undefined },\n /** Largest allowed value. */\n max: { type: Number, default: undefined },\n /** Increment / decrement step. */\n step: { type: Number, default: 1 },\n /** When `true`, snap typed values to the nearest step. */\n stepSnapping: { type: Boolean, default: true },\n /** Vuecs convention: do NOT focus the input on programmatic value change (Reka defaults to `true`; this avoids surprising focus jumps). */\n focusOnChange: { type: Boolean, default: false },\n /** `Intl.NumberFormat` options for display + parsing. */\n formatOptions: { type: Object as PropType<Intl.NumberFormatOptions>, default: undefined },\n /** BCP-47 locale used for formatting and currency. */\n locale: { type: String, default: undefined },\n /** When `true`, prevents the user from interacting with the field. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Element id for the root number field. */\n id: { type: String, default: undefined },\n /** Vuecs internal: show ± stepper buttons. Drives the in-template render branch; not forwarded to Reka. */\n steppers: { type: Boolean, default: true },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormNumberThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormNumberProps = ExtractPublicPropTypes<typeof formNumberProps>;\n\nexport default defineComponent({\n name: 'VCFormNumber',\n inheritAttrs: false,\n props: formNumberProps,\n emits: ['update:modelValue'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formNumber', props, formNumberThemeDefaults);\n\n return () => h(\n NumberFieldRoot,\n mergeProps(attrs, {\n focusOnChange: props.focusOnChange,\n name: props.name,\n id: props.id,\n modelValue: props.modelValue,\n min: props.min,\n max: props.max,\n step: props.step,\n stepSnapping: props.stepSnapping,\n formatOptions: props.formatOptions,\n locale: props.locale,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue': (value: number) => emit('update:modelValue', value),\n class: theme.value.root || undefined,\n }),\n {\n default: () => {\n const children = [];\n if (props.steppers) {\n children.push(h(NumberFieldDecrement, { class: theme.value.decrement || undefined }, { default: () => '−' }));\n }\n children.push(h(NumberFieldInput, { class: theme.value.input || undefined }));\n if (props.steppers) {\n children.push(h(NumberFieldIncrement, { class: theme.value.increment || undefined }, { default: () => '+' }));\n }\n return children;\n },\n },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { PinInputInput, PinInputRoot } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormPinThemeClasses = {\n root: string;\n input: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formPin?: ThemeElementDefinition<FormPinThemeClasses>;\n }\n}\n\nexport const formPinThemeDefaults: ComponentThemeDefinition<FormPinThemeClasses> = {\n classes: {\n root: 'vc-form-pin',\n input: 'vc-form-pin-input',\n },\n};\n\nexport type FormPinType = 'text' | 'number';\nexport type FormPinModelValue = string[] | number[];\n\nconst formPinProps = {\n /** Controlled value (per-cell array). `null` is accepted as the documented \"unset\" value. */\n modelValue: {\n type: [Array, null] as PropType<FormPinModelValue | null>,\n default: undefined,\n },\n /** Vuecs internal: number of input cells rendered. Drives the cell-render loop in setup; not forwarded to Reka. */\n length: { type: Number, default: 6 },\n /** Input type for each cell. Drives `inputmode` and modelValue array element type. */\n type: { type: String as PropType<FormPinType>, default: 'text' },\n /** Per-cell placeholder character. */\n placeholder: { type: String, default: '' },\n /** When `true`, render values as `<input type=\"password\">` (dots). */\n mask: { type: Boolean, default: false },\n /** Enable mobile OTP autofill (sets `autocomplete=\"one-time-code\"`). */\n otp: { type: Boolean, default: false },\n /** When `true`, prevents the user from interacting with the pin input. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Element id for the root pin input. */\n id: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormPinThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormPinProps = ExtractPublicPropTypes<typeof formPinProps>;\n\nexport default defineComponent({\n name: 'VCFormPin',\n inheritAttrs: false,\n props: formPinProps,\n emits: ['update:modelValue', 'complete'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formPin', props, formPinThemeDefaults);\n\n return () => h(\n PinInputRoot,\n mergeProps(attrs, {\n name: props.name,\n id: props.id,\n modelValue: props.modelValue,\n type: props.type,\n placeholder: props.placeholder,\n mask: props.mask,\n otp: props.otp,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue': (value: FormPinModelValue) => emit('update:modelValue', value),\n onComplete: (value: FormPinModelValue) => emit('complete', value),\n class: theme.value.root || undefined,\n }),\n {\n default: () => {\n const cells = [];\n for (let i = 0; i < props.length; i += 1) {\n cells.push(h(PinInputInput, {\n key: i,\n index: i,\n class: theme.value.input || undefined,\n }));\n }\n return cells;\n },\n },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { PinInputInput, PinInputRoot } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormPinThemeClasses = {\n root: string;\n input: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formPin?: ThemeElementDefinition<FormPinThemeClasses>;\n }\n}\n\nexport const formPinThemeDefaults: ComponentThemeDefinition<FormPinThemeClasses> = {\n classes: {\n root: 'vc-form-pin',\n input: 'vc-form-pin-input',\n },\n};\n\nexport type FormPinType = 'text' | 'number';\nexport type FormPinModelValue = string[] | number[];\n\nconst formPinProps = {\n /** Controlled value (per-cell array). `null` is accepted as the documented \"unset\" value. */\n modelValue: {\n type: [Array, null] as PropType<FormPinModelValue | null>,\n default: undefined,\n },\n /** Vuecs internal: number of input cells rendered. Drives the cell-render loop in setup; not forwarded to Reka. */\n length: { type: Number, default: 6 },\n /** Input type for each cell. Drives `inputmode` and modelValue array element type. */\n type: { type: String as PropType<FormPinType>, default: 'text' },\n /** Per-cell placeholder character. */\n placeholder: { type: String, default: '' },\n /** When `true`, render values as `<input type=\"password\">` (dots). */\n mask: { type: Boolean, default: false },\n /** Enable mobile OTP autofill (sets `autocomplete=\"one-time-code\"`). */\n otp: { type: Boolean, default: false },\n /** When `true`, prevents the user from interacting with the pin input. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Element id for the root pin input. */\n id: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormPinThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormPinProps = ExtractPublicPropTypes<typeof formPinProps>;\n\nexport default defineComponent({\n name: 'VCFormPin',\n inheritAttrs: false,\n props: formPinProps,\n emits: ['update:modelValue', 'complete'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formPin', props, formPinThemeDefaults);\n\n return () => h(\n PinInputRoot,\n mergeProps(attrs, {\n name: props.name,\n id: props.id,\n modelValue: props.modelValue,\n type: props.type,\n placeholder: props.placeholder,\n mask: props.mask,\n otp: props.otp,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue': (value: FormPinModelValue) => emit('update:modelValue', value),\n onComplete: (value: FormPinModelValue) => emit('complete', value),\n class: theme.value.root || undefined,\n }),\n {\n default: () => {\n const cells = [];\n for (let i = 0; i < props.length; i += 1) {\n cells.push(h(PinInputInput, {\n key: i,\n index: i,\n class: theme.value.input || undefined,\n }));\n }\n return cells;\n },\n },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme, useId } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { RadioGroupIndicator, RadioGroupItem } from 'reka-ui';\nimport type { AcceptableValue } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType, SlotsType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormRadioThemeClasses = {\n root: string;\n indicator: string;\n label: string;\n group: string;\n};\n\nexport type FormRadioDefaults = {\n labelContent: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formRadio?: ThemeElementDefinition<FormRadioThemeClasses>;\n }\n interface ComponentDefaults {\n formRadio?: ComponentDefaultValues<FormRadioDefaults>;\n }\n}\n\nexport const formRadioThemeDefaults: ComponentThemeDefinition<FormRadioThemeClasses> = {\n classes: {\n root: 'vc-form-radio',\n indicator: 'vc-form-radio-indicator',\n label: 'vc-form-radio-label',\n // `wrapper` (not `group`) — collides with `vc-form-radio-group`\n // used by `<VCFormRadioGroup>` for the multi-radio container,\n // which has `flex-direction: column` and would stack the radio\n // above its label.\n group: 'vc-form-radio-wrapper',\n },\n};\n\nconst behavioralDefaults: FormRadioDefaults = { labelContent: 'Option' };\n\nexport type FormRadioLabelSlotProps = {\n class: string;\n id: string;\n};\n\nexport type FormRadioIndicatorSlotProps = {\n class: string;\n};\n\nconst formRadioProps = {\n /** Form-submission value identifying this radio option. */\n value: {\n type: [String, Number, Boolean, Object, null] as PropType<AcceptableValue>,\n required: true,\n },\n /** When `true`, prevents the user from interacting with the radio. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Element id; falls back to an SSR-safe generated id. */\n id: { type: String, default: undefined },\n /** Vuecs convention: render the label by default. Internal control flow, not forwarded to Reka. */\n label: { type: Boolean, default: true },\n /** Default label text (resolved through DefaultsManager). */\n labelContent: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormRadioThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormRadioProps = ExtractPublicPropTypes<typeof formRadioProps>;\n\nexport default defineComponent({\n name: 'VCFormRadio',\n inheritAttrs: false,\n props: formRadioProps,\n slots: Object as SlotsType<{\n label: FormRadioLabelSlotProps;\n indicator: FormRadioIndicatorSlotProps;\n }>,\n setup(props, { attrs, slots }) {\n const theme = useComponentTheme('formRadio', props, formRadioThemeDefaults);\n const defaults = useComponentDefaults('formRadio', props, behavioralDefaults);\n // SSR-safe stable id (Vue 3.5's native `useId` under the hood) —\n // see FormCheckbox.vue.\n const fallbackId = useId(undefined, 'vc-form-radio');\n\n return () => {\n const resolved = theme.value;\n const resolvedDefaults = defaults.value;\n const id = props.id ?? fallbackId;\n\n const radio = h(\n RadioGroupItem,\n mergeProps(attrs, {\n id,\n value: props.value,\n disabled: props.disabled,\n required: props.required,\n class: resolved.root || undefined,\n }),\n {\n default: () => h(\n RadioGroupIndicator,\n { class: resolved.indicator || undefined },\n { default: () => slots.indicator?.({ class: resolved.indicator }) ?? '' },\n ),\n },\n );\n\n if (!props.label) {\n return radio;\n }\n\n const labelNode = slots.label ?\n slots.label({ class: resolved.label, id }) :\n h('label', { class: resolved.label || undefined, for: id }, [resolvedDefaults.labelContent]);\n\n return h('div', { class: resolved.group || undefined }, [radio, labelNode]);\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme, useId } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { RadioGroupIndicator, RadioGroupItem } from 'reka-ui';\nimport type { AcceptableValue } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType, SlotsType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormRadioThemeClasses = {\n root: string;\n indicator: string;\n label: string;\n group: string;\n};\n\nexport type FormRadioDefaults = {\n labelContent: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formRadio?: ThemeElementDefinition<FormRadioThemeClasses>;\n }\n interface ComponentDefaults {\n formRadio?: ComponentDefaultValues<FormRadioDefaults>;\n }\n}\n\nexport const formRadioThemeDefaults: ComponentThemeDefinition<FormRadioThemeClasses> = {\n classes: {\n root: 'vc-form-radio',\n indicator: 'vc-form-radio-indicator',\n label: 'vc-form-radio-label',\n // `wrapper` (not `group`) — collides with `vc-form-radio-group`\n // used by `<VCFormRadioGroup>` for the multi-radio container,\n // which has `flex-direction: column` and would stack the radio\n // above its label.\n group: 'vc-form-radio-wrapper',\n },\n};\n\nconst behavioralDefaults: FormRadioDefaults = { labelContent: 'Option' };\n\nexport type FormRadioLabelSlotProps = {\n class: string;\n id: string;\n};\n\nexport type FormRadioIndicatorSlotProps = {\n class: string;\n};\n\nconst formRadioProps = {\n /** Form-submission value identifying this radio option. */\n value: {\n type: [String, Number, Boolean, Object, null] as PropType<AcceptableValue>,\n required: true,\n },\n /** When `true`, prevents the user from interacting with the radio. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Element id; falls back to an SSR-safe generated id. */\n id: { type: String, default: undefined },\n /** Vuecs convention: render the label by default. Internal control flow, not forwarded to Reka. */\n label: { type: Boolean, default: true },\n /** Default label text (resolved through DefaultsManager). */\n labelContent: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormRadioThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormRadioProps = ExtractPublicPropTypes<typeof formRadioProps>;\n\nexport default defineComponent({\n name: 'VCFormRadio',\n inheritAttrs: false,\n props: formRadioProps,\n slots: Object as SlotsType<{\n label: FormRadioLabelSlotProps;\n indicator: FormRadioIndicatorSlotProps;\n }>,\n setup(props, { attrs, slots }) {\n const theme = useComponentTheme('formRadio', props, formRadioThemeDefaults);\n const defaults = useComponentDefaults('formRadio', props, behavioralDefaults);\n // SSR-safe stable id (Vue 3.5's native `useId` under the hood) —\n // see FormCheckbox.vue.\n const fallbackId = useId(undefined, 'vc-form-radio');\n\n return () => {\n const resolved = theme.value;\n const resolvedDefaults = defaults.value;\n const id = props.id ?? fallbackId;\n\n const radio = h(\n RadioGroupItem,\n mergeProps(attrs, {\n id,\n value: props.value,\n disabled: props.disabled,\n required: props.required,\n class: resolved.root || undefined,\n }),\n {\n default: () => h(\n RadioGroupIndicator,\n { class: resolved.indicator || undefined },\n { default: () => slots.indicator?.({ class: resolved.indicator }) ?? '' },\n ),\n },\n );\n\n if (!props.label) {\n return radio;\n }\n\n const labelNode = slots.label ?\n slots.label({ class: resolved.label, id }) :\n h('label', { class: resolved.label || undefined, for: id }, [resolvedDefaults.labelContent]);\n\n return h('div', { class: resolved.group || undefined }, [radio, labelNode]);\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { RadioGroupRoot } from 'reka-ui';\nimport type { AcceptableValue } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\nimport type { FormOption } from '../../types/option';\nimport FormRadio from '../form-radio/FormRadio.vue';\n\nexport type FormRadioGroupThemeClasses = {\n root: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formRadioGroup?: ThemeElementDefinition<FormRadioGroupThemeClasses>;\n }\n}\n\nexport const formRadioGroupThemeDefaults: ComponentThemeDefinition<FormRadioGroupThemeClasses> = { classes: { root: 'vc-form-radio-group' } };\n\nexport type FormRadioGroupOrientation = 'vertical' | 'horizontal';\n\nconst formRadioGroupProps = {\n /** Controlled selected value. */\n modelValue: {\n type: [String, Number, Boolean, Object, null] as PropType<AcceptableValue | undefined>,\n default: undefined,\n },\n /** Optional declarative shorthand — when set, renders one `<VCFormRadio>` per option. Mutually exclusive with the default slot. */\n options: { type: Array as PropType<FormOption[]>, default: undefined },\n /** Disables every radio in the group. */\n disabled: { type: Boolean, default: false },\n /** Marks the group as required for native form validation. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Vuecs convention: vertical-stacked layout (Reka leaves this unset; vuecs styles the column variant in `vc-form-radio-group`). */\n orientation: {\n type: String as PropType<FormRadioGroupOrientation>,\n default: 'vertical',\n },\n /** When `true`, arrow-key navigation wraps from last to first item. */\n loop: { type: Boolean, default: true },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormRadioGroupThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormRadioGroupProps = ExtractPublicPropTypes<typeof formRadioGroupProps>;\n\nexport default defineComponent({\n name: 'VCFormRadioGroup',\n inheritAttrs: false,\n props: formRadioGroupProps,\n emits: ['update:modelValue'],\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formRadioGroup', props, formRadioGroupThemeDefaults);\n\n return () => h(\n RadioGroupRoot,\n mergeProps(attrs, {\n name: props.name,\n orientation: props.orientation,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n loop: props.loop,\n 'onUpdate:modelValue': (value: AcceptableValue) => emit('update:modelValue', value),\n class: theme.value.root || undefined,\n }),\n {\n default: () => {\n if (props.options) {\n return props.options.map((option) => h(FormRadio, {\n key: String(option.value),\n value: option.value,\n disabled: option.disabled,\n labelContent: option.label,\n }));\n }\n return slots.default?.();\n },\n },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { RadioGroupRoot } from 'reka-ui';\nimport type { AcceptableValue } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\nimport type { FormOption } from '../../types/option';\nimport FormRadio from '../form-radio/FormRadio.vue';\n\nexport type FormRadioGroupThemeClasses = {\n root: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formRadioGroup?: ThemeElementDefinition<FormRadioGroupThemeClasses>;\n }\n}\n\nexport const formRadioGroupThemeDefaults: ComponentThemeDefinition<FormRadioGroupThemeClasses> = { classes: { root: 'vc-form-radio-group' } };\n\nexport type FormRadioGroupOrientation = 'vertical' | 'horizontal';\n\nconst formRadioGroupProps = {\n /** Controlled selected value. */\n modelValue: {\n type: [String, Number, Boolean, Object, null] as PropType<AcceptableValue | undefined>,\n default: undefined,\n },\n /** Optional declarative shorthand — when set, renders one `<VCFormRadio>` per option. Mutually exclusive with the default slot. */\n options: { type: Array as PropType<FormOption[]>, default: undefined },\n /** Disables every radio in the group. */\n disabled: { type: Boolean, default: false },\n /** Marks the group as required for native form validation. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Vuecs convention: vertical-stacked layout (Reka leaves this unset; vuecs styles the column variant in `vc-form-radio-group`). */\n orientation: {\n type: String as PropType<FormRadioGroupOrientation>,\n default: 'vertical',\n },\n /** When `true`, arrow-key navigation wraps from last to first item. */\n loop: { type: Boolean, default: true },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormRadioGroupThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormRadioGroupProps = ExtractPublicPropTypes<typeof formRadioGroupProps>;\n\nexport default defineComponent({\n name: 'VCFormRadioGroup',\n inheritAttrs: false,\n props: formRadioGroupProps,\n emits: ['update:modelValue'],\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formRadioGroup', props, formRadioGroupThemeDefaults);\n\n return () => h(\n RadioGroupRoot,\n mergeProps(attrs, {\n name: props.name,\n orientation: props.orientation,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n loop: props.loop,\n 'onUpdate:modelValue': (value: AcceptableValue) => emit('update:modelValue', value),\n class: theme.value.root || undefined,\n }),\n {\n default: () => {\n if (props.options) {\n return props.options.map((option) => h(FormRadio, {\n key: String(option.value),\n value: option.value,\n disabled: option.disabled,\n labelContent: option.label,\n }));\n }\n return slots.default?.();\n },\n },\n );\n },\n});\n</script>\n","import type { AcceptableValue } from 'reka-ui';\n\n/**\n * A single selectable option in a form control (Select, SelectSearch, …).\n *\n * `value` is the bound value (what flows through `v-model`); `label` is the\n * display string. This matches HTML `<option value=\"...\">label</option>`,\n * Reka UI, and every mainstream form-library convention.\n */\nexport type FormOption<T extends AcceptableValue = AcceptableValue> = {\n /** Bound value — flows through `v-model`. */\n value: T;\n /** Display string the user sees. */\n label: string;\n /** When `true`, the option is rendered but not selectable. */\n disabled?: boolean;\n /** Optional secondary line shown below or beside the label. */\n description?: string;\n /** Optional icon — class string, URL, or any token a consumer slot can render. */\n icon?: string;\n /** Free-form metadata for custom rendering / filtering / consumer-side logic. */\n meta?: Record<string, unknown>;\n};\n\n/**\n * A group of options rendered under a shared label (HTML `<optgroup>`).\n */\nexport type FormOptionGroup<T extends AcceptableValue = AcceptableValue> = {\n /** Group heading text. */\n label: string;\n /** Options inside this group. */\n options: FormOption<T>[];\n /** When `true`, every option in the group is non-selectable. */\n disabled?: boolean;\n};\n\n/**\n * What `<VCFormSelect>` and friends accept — flat options, groups, or a mix.\n */\nexport type FormOptionItems<T extends AcceptableValue = AcceptableValue> = (FormOption<T> | FormOptionGroup<T>)[];\n\n/** Type guard for narrowing in render code. */\nexport const isFormOptionGroup = <T extends AcceptableValue>(\n item: FormOption<T> | FormOptionGroup<T>,\n): item is FormOptionGroup<T> => Array.isArray((item as FormOptionGroup<T>).options);\n","<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n SelectContent,\n SelectGroup,\n SelectIcon,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n SelectLabel,\n SelectPortal,\n SelectRoot,\n SelectTrigger,\n SelectValue,\n SelectViewport,\n} from 'reka-ui';\nimport type { AcceptableValue } from 'reka-ui';\nimport type {\n ExtractPublicPropTypes,\n PropType,\n VNode,\n VNodeChild,\n} from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\nimport {\n type FormOption,\n type FormOptionGroup,\n type FormOptionItems,\n isFormOptionGroup,\n} from '../../types/option';\n\nexport type FormSelectThemeClasses = {\n trigger: string;\n value: string;\n icon: string;\n content: string;\n viewport: string;\n item: string;\n itemIndicator: string;\n group: string;\n groupLabel: string;\n separator: string;\n};\n\nexport type FormSelectDefaults = {\n /**\n * Placeholder text rendered inside the trigger when no option is selected.\n */\n placeholder: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formSelect?: ThemeElementDefinition<FormSelectThemeClasses>;\n }\n interface ComponentDefaults {\n formSelect?: ComponentDefaultValues<FormSelectDefaults>;\n }\n}\n\nexport const formSelectThemeDefaults: ComponentThemeDefinition<FormSelectThemeClasses> = {\n classes: {\n trigger: 'vc-form-select-trigger',\n value: 'vc-form-select-value',\n icon: 'vc-form-select-icon',\n content: 'vc-form-select-content',\n viewport: 'vc-form-select-viewport',\n item: 'vc-form-select-item',\n itemIndicator: 'vc-form-select-item-indicator',\n group: 'vc-form-select-group',\n groupLabel: 'vc-form-select-group-label',\n separator: 'vc-form-select-separator',\n },\n};\n\nconst behavioralDefaults: FormSelectDefaults = { placeholder: '' };\n\nconst renderItem = (\n option: FormOption,\n classes: FormSelectThemeClasses,\n groupDisabled = false,\n): VNode => h(\n SelectItem,\n {\n key: String(option.value),\n value: option.value,\n disabled: groupDisabled || option.disabled,\n class: classes.item,\n },\n {\n default: () => [\n h(SelectItemText, null, () => [option.label]),\n h(SelectItemIndicator, { class: classes.itemIndicator }, () => '✓'),\n ],\n },\n);\n\nconst renderGroup = (group: FormOptionGroup, classes: FormSelectThemeClasses): VNode => h(\n SelectGroup,\n { key: group.label, class: classes.group },\n {\n default: () => [\n h(SelectLabel, { class: classes.groupLabel }, () => [group.label]),\n ...group.options.map((option) => renderItem(option, classes, !!group.disabled)),\n ],\n },\n);\n\nconst formSelectProps = {\n /** Controlled selected value. */\n modelValue: {\n type: [String, Number, Boolean, Object, null] as PropType<AcceptableValue | undefined>,\n default: undefined,\n },\n /** Options rendered inside the dropdown (flat list or grouped). */\n options: {\n type: Array as PropType<FormOptionItems>,\n required: true,\n },\n /** Placeholder text rendered inside the trigger when no option is selected. Falls back to the global `formSelect.placeholder` default. */\n placeholder: { type: String, default: undefined },\n /** When `true`, blocks user interaction with the trigger. */\n disabled: { type: Boolean, default: false },\n /** `name` attribute submitted with the owning form. */\n name: { type: String, default: undefined },\n /** When `true`, the field must be set before the owning form can submit. */\n required: { type: Boolean, default: false },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormSelectThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormSelectProps = ExtractPublicPropTypes<typeof formSelectProps>;\n\nexport default defineComponent({\n name: 'VCFormSelect',\n inheritAttrs: false,\n props: formSelectProps,\n emits: ['update:modelValue'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formSelect', props, formSelectThemeDefaults);\n const defaults = useComponentDefaults('formSelect', props, behavioralDefaults);\n\n return () => {\n const resolved = theme.value;\n const { placeholder } = defaults.value;\n\n const items: VNodeChild[] = [];\n for (const item of props.options) {\n if (isFormOptionGroup(item)) {\n items.push(renderGroup(item, resolved));\n } else {\n items.push(renderItem(item, resolved));\n }\n }\n\n return h(SelectRoot, {\n name: props.name,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue'(value: AcceptableValue) {\n emit('update:modelValue', value);\n },\n }, {\n default: () => [\n h(SelectTrigger, mergeProps({ class: resolved.trigger || undefined }, attrs), () => [\n h(SelectValue, { class: resolved.value || undefined, placeholder }),\n h(SelectIcon, { class: resolved.icon || undefined }, () => '▾'),\n ]),\n h(SelectPortal, null, () => [\n h(SelectContent, { class: resolved.content || undefined, position: 'popper' }, () => [\n h(SelectViewport, { class: resolved.viewport || undefined }, () => items),\n ]),\n ]),\n ],\n });\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n SelectContent,\n SelectGroup,\n SelectIcon,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n SelectLabel,\n SelectPortal,\n SelectRoot,\n SelectTrigger,\n SelectValue,\n SelectViewport,\n} from 'reka-ui';\nimport type { AcceptableValue } from 'reka-ui';\nimport type {\n ExtractPublicPropTypes,\n PropType,\n VNode,\n VNodeChild,\n} from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\nimport {\n type FormOption,\n type FormOptionGroup,\n type FormOptionItems,\n isFormOptionGroup,\n} from '../../types/option';\n\nexport type FormSelectThemeClasses = {\n trigger: string;\n value: string;\n icon: string;\n content: string;\n viewport: string;\n item: string;\n itemIndicator: string;\n group: string;\n groupLabel: string;\n separator: string;\n};\n\nexport type FormSelectDefaults = {\n /**\n * Placeholder text rendered inside the trigger when no option is selected.\n */\n placeholder: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formSelect?: ThemeElementDefinition<FormSelectThemeClasses>;\n }\n interface ComponentDefaults {\n formSelect?: ComponentDefaultValues<FormSelectDefaults>;\n }\n}\n\nexport const formSelectThemeDefaults: ComponentThemeDefinition<FormSelectThemeClasses> = {\n classes: {\n trigger: 'vc-form-select-trigger',\n value: 'vc-form-select-value',\n icon: 'vc-form-select-icon',\n content: 'vc-form-select-content',\n viewport: 'vc-form-select-viewport',\n item: 'vc-form-select-item',\n itemIndicator: 'vc-form-select-item-indicator',\n group: 'vc-form-select-group',\n groupLabel: 'vc-form-select-group-label',\n separator: 'vc-form-select-separator',\n },\n};\n\nconst behavioralDefaults: FormSelectDefaults = { placeholder: '' };\n\nconst renderItem = (\n option: FormOption,\n classes: FormSelectThemeClasses,\n groupDisabled = false,\n): VNode => h(\n SelectItem,\n {\n key: String(option.value),\n value: option.value,\n disabled: groupDisabled || option.disabled,\n class: classes.item,\n },\n {\n default: () => [\n h(SelectItemText, null, () => [option.label]),\n h(SelectItemIndicator, { class: classes.itemIndicator }, () => '✓'),\n ],\n },\n);\n\nconst renderGroup = (group: FormOptionGroup, classes: FormSelectThemeClasses): VNode => h(\n SelectGroup,\n { key: group.label, class: classes.group },\n {\n default: () => [\n h(SelectLabel, { class: classes.groupLabel }, () => [group.label]),\n ...group.options.map((option) => renderItem(option, classes, !!group.disabled)),\n ],\n },\n);\n\nconst formSelectProps = {\n /** Controlled selected value. */\n modelValue: {\n type: [String, Number, Boolean, Object, null] as PropType<AcceptableValue | undefined>,\n default: undefined,\n },\n /** Options rendered inside the dropdown (flat list or grouped). */\n options: {\n type: Array as PropType<FormOptionItems>,\n required: true,\n },\n /** Placeholder text rendered inside the trigger when no option is selected. Falls back to the global `formSelect.placeholder` default. */\n placeholder: { type: String, default: undefined },\n /** When `true`, blocks user interaction with the trigger. */\n disabled: { type: Boolean, default: false },\n /** `name` attribute submitted with the owning form. */\n name: { type: String, default: undefined },\n /** When `true`, the field must be set before the owning form can submit. */\n required: { type: Boolean, default: false },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormSelectThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormSelectProps = ExtractPublicPropTypes<typeof formSelectProps>;\n\nexport default defineComponent({\n name: 'VCFormSelect',\n inheritAttrs: false,\n props: formSelectProps,\n emits: ['update:modelValue'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formSelect', props, formSelectThemeDefaults);\n const defaults = useComponentDefaults('formSelect', props, behavioralDefaults);\n\n return () => {\n const resolved = theme.value;\n const { placeholder } = defaults.value;\n\n const items: VNodeChild[] = [];\n for (const item of props.options) {\n if (isFormOptionGroup(item)) {\n items.push(renderGroup(item, resolved));\n } else {\n items.push(renderItem(item, resolved));\n }\n }\n\n return h(SelectRoot, {\n name: props.name,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue'(value: AcceptableValue) {\n emit('update:modelValue', value);\n },\n }, {\n default: () => [\n h(SelectTrigger, mergeProps({ class: resolved.trigger || undefined }, attrs), () => [\n h(SelectValue, { class: resolved.value || undefined, placeholder }),\n h(SelectIcon, { class: resolved.icon || undefined }, () => '▾'),\n ]),\n h(SelectPortal, null, () => [\n h(SelectContent, { class: resolved.content || undefined, position: 'popper' }, () => [\n h(SelectViewport, { class: resolved.viewport || undefined }, () => items),\n ]),\n ]),\n ],\n });\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\nimport type { FormOption } from '../../types/option';\n\nconst formSelectSearchEntryProps = {\n /** The option this row represents. */\n entry: {\n type: Object as PropType<FormOption>,\n required: true,\n },\n /** The currently-selected options — used to compute `active` state. */\n selected: { type: Array as PropType<FormOption[]> },\n};\n\nexport type FormSelectSearchEntryProps = ExtractPublicPropTypes<typeof formSelectSearchEntryProps>;\n\nexport default defineComponent({\n props: formSelectSearchEntryProps,\n setup(props) {\n const active = computed(\n () => props.selected &&\n props.selected.findIndex((el) => el.value === props.entry.value) !== -1,\n );\n\n return { active };\n },\n});\n</script>\n<template>\n <slot\n name=\"default\"\n :entry=\"entry\"\n :active=\"active\"\n >\n {{ entry.label }}\n </slot>\n</template>\n","<script lang=\"ts\">\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport { computed, defineComponent } from 'vue';\nimport type { FormOption } from '../../types/option';\n\nconst formSelectSearchEntryProps = {\n /** The option this row represents. */\n entry: {\n type: Object as PropType<FormOption>,\n required: true,\n },\n /** The currently-selected options — used to compute `active` state. */\n selected: { type: Array as PropType<FormOption[]> },\n};\n\nexport type FormSelectSearchEntryProps = ExtractPublicPropTypes<typeof formSelectSearchEntryProps>;\n\nexport default defineComponent({\n props: formSelectSearchEntryProps,\n setup(props) {\n const active = computed(\n () => props.selected &&\n props.selected.findIndex((el) => el.value === props.entry.value) !== -1,\n );\n\n return { active };\n },\n});\n</script>\n<template>\n <slot\n name=\"default\"\n :entry=\"entry\"\n :active=\"active\"\n >\n {{ entry.label }}\n </slot>\n</template>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n onClickOutside,\n useInfiniteScroll,\n} from '@vueuse/core';\nimport type { AcceptableValue } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n computed,\n defineComponent,\n ref,\n toRef,\n watch,\n} from 'vue';\nimport type { FormOption } from '../../types/option';\nimport FormSelectSearchEntry from './FormSelectSearchEntry.vue';\n\nexport type FormSelectSearchThemeClasses = {\n root: string;\n input: string;\n content: string;\n item: string;\n itemActive: string;\n itemCurrent: string;\n itemDescription: string;\n selected: string;\n selectedItem: string;\n selectedItemRemove: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formSelectSearch?: ThemeElementDefinition<FormSelectSearchThemeClasses>;\n }\n}\n\nexport const formSelectSearchThemeDefaults: ComponentThemeDefinition<FormSelectSearchThemeClasses> = {\n classes: {\n root: 'vc-form-select-search',\n input: 'vc-form-select-search-input',\n content: 'vc-form-select-search-content',\n item: 'vc-form-select-search-item',\n itemActive: 'active',\n itemCurrent: 'current',\n itemDescription: 'vc-form-select-search-item-description',\n selected: 'vc-form-select-search-selected',\n selectedItem: 'vc-form-select-search-selected-item',\n selectedItemRemove: 'vc-form-select-search-selected-item-remove',\n },\n};\n\nconst formSelectSearchProps = {\n /** Controlled selected value(s) — single value or array for multi-select. */\n modelValue: {\n type: [String, Number, Boolean, Object, Array, null] as PropType<\n AcceptableValue | AcceptableValue[] | undefined\n >,\n default: undefined,\n },\n /** Options shown in the dropdown. */\n options: {\n type: Array as PropType<FormOption[]>,\n default: () => [],\n },\n /** Placeholder shown in the search input when empty. */\n placeholder: {\n type: String,\n required: false,\n default: '...',\n },\n /** When `true`, blocks user interaction with the input and chips. */\n disabled: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Initial page size for the virtualised dropdown list. */\n maxItems: {\n type: Number,\n required: false,\n default: 10,\n },\n /** Number of items to append per infinite-scroll step. */\n scrollDistance: {\n type: Number,\n required: false,\n default: 10,\n },\n /**\n * Whether to close the dropdown after a pick. When unset:\n * - single-select closes (matches the native `<select>` mental model)\n * - multi-select stays open (so the user can pick several without re-opening)\n *\n * Set explicitly (`true` / `false`) to override the mode-default.\n */\n closeOnSelect: {\n type: Boolean as PropType<boolean | undefined>,\n default: undefined,\n },\n /** Theme-class overrides for this component instance. */\n themeClass: {\n type: Object as PropType<ThemeClassesOverride<FormSelectSearchThemeClasses>>,\n default: undefined,\n },\n /** Theme variant values for this component instance. */\n themeVariant: {\n type: Object as PropType<VariantValues>,\n default: undefined,\n },\n};\n\nexport type FormSelectSearchProps = ExtractPublicPropTypes<typeof formSelectSearchProps>;\n\nexport default defineComponent({\n components: { FormSelectSearchEntry },\n props: formSelectSearchProps,\n emits: ['update:modelValue', 'change'],\n setup(props, { emit }) {\n const theme = useComponentTheme('formSelectSearch', props, formSelectSearchThemeDefaults);\n\n const listElement = ref<globalThis.HTMLElement | null>(null);\n const inputElement = ref<globalThis.HTMLElement | null>(null);\n\n const q = ref('');\n const currentIndex = ref(-1);\n\n const selected = ref<FormOption[]>([]);\n\n const modelValue = toRef(props, 'modelValue');\n\n const findOption = (value: AcceptableValue): FormOption | undefined => props.options.find(\n (option) => option.value === value,\n );\n\n const reset = () => {\n if (Array.isArray(props.modelValue)) {\n selected.value = props.modelValue\n .map((value) => findOption(value))\n .filter((option): option is FormOption => option !== undefined);\n return;\n }\n\n if (typeof props.modelValue === 'undefined' || props.modelValue === null) {\n selected.value = [];\n q.value = '';\n return;\n }\n\n const found = findOption(props.modelValue);\n if (found) {\n selected.value = [found];\n q.value = found.label;\n } else {\n selected.value = [];\n q.value = '';\n }\n };\n\n reset();\n\n watch(modelValue, () => {\n reset();\n }, { deep: true });\n\n const isMulti = computed(() => Array.isArray(modelValue.value));\n\n const items = computed(() => {\n if (!q.value || q.value.length < 1) {\n return props.options;\n }\n // User input goes straight into a RegExp — escape special\n // chars so typing `(`, `[`, `*`, `+`, `?` etc. doesn't\n // throw SyntaxError and crash the filter mid-render.\n const escaped = q.value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(escaped, 'ig');\n return props.options.filter((option) => option.label.match(pattern));\n });\n\n // Clamp pagination knobs to a sane minimum: a 0/negative `maxItems`\n // would render nothing on open, and a 0/negative `scrollDistance`\n // would stall infinite-scroll because each load step would advance\n // by zero (or rewind).\n const pageSize = computed(() => Math.max(1, props.maxItems));\n const pageStep = computed(() => Math.max(1, props.scrollDistance));\n\n const itemsDisplayed = ref<FormOption[]>([]);\n const setItemsDisplayed = () => {\n itemsDisplayed.value = items.value.slice(0, pageSize.value);\n };\n\n const showMoreItemsDisplayed = () => {\n const startIndex = itemsDisplayed.value.length;\n const endIndex = Math.min(startIndex + pageStep.value, items.value.length);\n if (startIndex >= endIndex) {\n return;\n }\n itemsDisplayed.value.push(...items.value.slice(startIndex, endIndex));\n };\n\n setItemsDisplayed();\n\n // Watch the filtered set itself, not just its length — two queries can\n // return the same number of matches but different items, and the\n // length-only watcher would miss the content swap, leaving the\n // dropdown showing the previous query's results.\n //\n // Reset currentIndex to -1 (no item highlighted) instead of 0 — the\n // visual \"current\" highlight should only appear after the user\n // explicitly arrow-keys. The Enter handler still falls back to the\n // first item when nothing is highlighted (see selected.length === 0\n // branch), so keyboard-first selection still works.\n watch(items, () => {\n currentIndex.value = -1;\n setItemsDisplayed();\n });\n\n useInfiniteScroll(listElement, () => {\n showMoreItemsDisplayed();\n }, {\n canLoadMore() {\n return itemsDisplayed.value.length < items.value.length;\n },\n });\n\n const isDisplayed = ref(false);\n\n // `closeOnSelect === undefined` falls back to the mode-default:\n // single-select closes, multi stays open.\n const shouldCloseOnSelect = () => (\n typeof props.closeOnSelect === 'boolean' ? props.closeOnSelect : !isMulti.value\n );\n\n const toggle = (option: FormOption) => {\n // Disabled-form semantics: a disabled control must not mutate\n // its bound value or emit change events. Mouse picks on dropdown\n // items are gated by `display()` (which short-circuits when\n // disabled), but the multi-select chip-remove buttons render\n // outside the dropdown and were still callable.\n if (props.disabled) {\n return;\n }\n\n if (isMulti.value) {\n const index = selected.value.findIndex((el) => el.value === option.value);\n if (index === -1) {\n selected.value.push(option);\n } else {\n selected.value.splice(index, 1);\n }\n\n const values = selected.value.map((el) => el.value);\n emit('update:modelValue', values);\n emit('change', values);\n\n if (shouldCloseOnSelect()) {\n isDisplayed.value = false;\n }\n return;\n }\n\n let isBlank = false;\n const [selectedValue] = selected.value;\n if (selectedValue) {\n if (selectedValue.value === option.value) {\n q.value = '';\n selected.value.length = 0;\n isBlank = true;\n } else {\n q.value = option.label;\n selected.value = [option];\n }\n } else {\n q.value = option.label;\n selected.value = [option];\n }\n\n if (shouldCloseOnSelect()) {\n isDisplayed.value = false;\n }\n\n if (isBlank) {\n emit('update:modelValue', null);\n emit('change', null);\n return;\n }\n\n emit('update:modelValue', option.value);\n emit('change', option.value);\n };\n\n const display = () => {\n if (props.disabled) return;\n\n isDisplayed.value = true;\n };\n\n const hide = () => {\n if (\n !isMulti.value &&\n selected.value.length === 1\n ) {\n q.value = selected.value[0].label;\n }\n\n isDisplayed.value = false;\n };\n\n onClickOutside(listElement, () => {\n hide();\n }, { ignore: [inputElement] });\n\n const onFocus = () => {\n q.value = '';\n display();\n };\n\n const onKeyUp = (ev: globalThis.KeyboardEvent) => {\n if (ev.key === 'ArrowUp' || ev.key === 'ArrowDown') {\n display();\n\n if (ev.key === 'ArrowUp') {\n if (currentIndex.value > 0) {\n currentIndex.value--;\n }\n\n return;\n }\n\n if (currentIndex.value < itemsDisplayed.value.length - 1) {\n currentIndex.value++;\n }\n }\n\n if (ev.key !== 'Enter') {\n display();\n }\n };\n\n const onKeyDown = (ev: globalThis.KeyboardEvent) => {\n if (ev.key === 'Enter') {\n if (!isDisplayed.value) {\n return;\n }\n\n if (itemsDisplayed.value.length === 1) {\n toggle(itemsDisplayed.value[0]);\n return;\n }\n\n if (\n currentIndex.value >= 0 &&\n itemsDisplayed.value[currentIndex.value]\n ) {\n toggle(itemsDisplayed.value[currentIndex.value]);\n\n return;\n }\n\n if (selected.value.length === 0) {\n if (itemsDisplayed.value[0]) {\n toggle(itemsDisplayed.value[0]);\n }\n\n return;\n }\n\n hide();\n\n return;\n }\n\n if (ev.key === 'Tab') {\n hide();\n }\n };\n\n return {\n theme,\n listElement,\n inputElement,\n\n isMulti,\n toggle,\n currentIndex,\n q,\n items: itemsDisplayed,\n selected,\n display,\n onFocus,\n onKeyUp,\n onKeyDown,\n isDisplayed,\n };\n },\n});\n</script>\n<template>\n <div :class=\"theme.root\">\n <input\n ref=\"inputElement\"\n v-model=\"q\"\n :class=\"theme.input\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n @focus=\"onFocus\"\n @keyup=\"onKeyUp\"\n @keydown=\"onKeyDown\"\n >\n\n <div\n v-show=\"isDisplayed\"\n ref=\"listElement\"\n :class=\"theme.content\"\n >\n <template\n v-for=\"(option, index) in items\"\n :key=\"String(option.value)\"\n >\n <FormSelectSearchEntry\n :entry=\"option\"\n :selected=\"selected\"\n >\n <template #default=\"{ entry, active }\">\n <div\n :class=\"[\n theme.item,\n {\n [theme.itemActive]: active,\n [theme.itemCurrent]: index === currentIndex,\n },\n ]\"\n @mousedown=\"toggle(entry)\"\n >\n {{ entry.label }}\n <span\n v-if=\"entry.description\"\n :class=\"theme.itemDescription\"\n >\n {{ entry.description }}\n </span>\n </div>\n </template>\n </FormSelectSearchEntry>\n </template>\n </div>\n\n <div\n v-if=\"isMulti\"\n :class=\"theme.selected\"\n >\n <slot\n name=\"selected\"\n :items=\"selected\"\n :toggle=\"toggle\"\n >\n <button\n v-for=\"item in selected\"\n :key=\"String(item.value)\"\n type=\"button\"\n :class=\"theme.selectedItem\"\n :disabled=\"disabled\"\n @click=\"toggle(item)\"\n >\n {{ item.label }}\n <span\n :class=\"theme.selectedItemRemove\"\n aria-hidden=\"true\"\n >&times;</span>\n </button>\n </slot>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n onClickOutside,\n useInfiniteScroll,\n} from '@vueuse/core';\nimport type { AcceptableValue } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n computed,\n defineComponent,\n ref,\n toRef,\n watch,\n} from 'vue';\nimport type { FormOption } from '../../types/option';\nimport FormSelectSearchEntry from './FormSelectSearchEntry.vue';\n\nexport type FormSelectSearchThemeClasses = {\n root: string;\n input: string;\n content: string;\n item: string;\n itemActive: string;\n itemCurrent: string;\n itemDescription: string;\n selected: string;\n selectedItem: string;\n selectedItemRemove: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formSelectSearch?: ThemeElementDefinition<FormSelectSearchThemeClasses>;\n }\n}\n\nexport const formSelectSearchThemeDefaults: ComponentThemeDefinition<FormSelectSearchThemeClasses> = {\n classes: {\n root: 'vc-form-select-search',\n input: 'vc-form-select-search-input',\n content: 'vc-form-select-search-content',\n item: 'vc-form-select-search-item',\n itemActive: 'active',\n itemCurrent: 'current',\n itemDescription: 'vc-form-select-search-item-description',\n selected: 'vc-form-select-search-selected',\n selectedItem: 'vc-form-select-search-selected-item',\n selectedItemRemove: 'vc-form-select-search-selected-item-remove',\n },\n};\n\nconst formSelectSearchProps = {\n /** Controlled selected value(s) — single value or array for multi-select. */\n modelValue: {\n type: [String, Number, Boolean, Object, Array, null] as PropType<\n AcceptableValue | AcceptableValue[] | undefined\n >,\n default: undefined,\n },\n /** Options shown in the dropdown. */\n options: {\n type: Array as PropType<FormOption[]>,\n default: () => [],\n },\n /** Placeholder shown in the search input when empty. */\n placeholder: {\n type: String,\n required: false,\n default: '...',\n },\n /** When `true`, blocks user interaction with the input and chips. */\n disabled: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Initial page size for the virtualised dropdown list. */\n maxItems: {\n type: Number,\n required: false,\n default: 10,\n },\n /** Number of items to append per infinite-scroll step. */\n scrollDistance: {\n type: Number,\n required: false,\n default: 10,\n },\n /**\n * Whether to close the dropdown after a pick. When unset:\n * - single-select closes (matches the native `<select>` mental model)\n * - multi-select stays open (so the user can pick several without re-opening)\n *\n * Set explicitly (`true` / `false`) to override the mode-default.\n */\n closeOnSelect: {\n type: Boolean as PropType<boolean | undefined>,\n default: undefined,\n },\n /** Theme-class overrides for this component instance. */\n themeClass: {\n type: Object as PropType<ThemeClassesOverride<FormSelectSearchThemeClasses>>,\n default: undefined,\n },\n /** Theme variant values for this component instance. */\n themeVariant: {\n type: Object as PropType<VariantValues>,\n default: undefined,\n },\n};\n\nexport type FormSelectSearchProps = ExtractPublicPropTypes<typeof formSelectSearchProps>;\n\nexport default defineComponent({\n components: { FormSelectSearchEntry },\n props: formSelectSearchProps,\n emits: ['update:modelValue', 'change'],\n setup(props, { emit }) {\n const theme = useComponentTheme('formSelectSearch', props, formSelectSearchThemeDefaults);\n\n const listElement = ref<globalThis.HTMLElement | null>(null);\n const inputElement = ref<globalThis.HTMLElement | null>(null);\n\n const q = ref('');\n const currentIndex = ref(-1);\n\n const selected = ref<FormOption[]>([]);\n\n const modelValue = toRef(props, 'modelValue');\n\n const findOption = (value: AcceptableValue): FormOption | undefined => props.options.find(\n (option) => option.value === value,\n );\n\n const reset = () => {\n if (Array.isArray(props.modelValue)) {\n selected.value = props.modelValue\n .map((value) => findOption(value))\n .filter((option): option is FormOption => option !== undefined);\n return;\n }\n\n if (typeof props.modelValue === 'undefined' || props.modelValue === null) {\n selected.value = [];\n q.value = '';\n return;\n }\n\n const found = findOption(props.modelValue);\n if (found) {\n selected.value = [found];\n q.value = found.label;\n } else {\n selected.value = [];\n q.value = '';\n }\n };\n\n reset();\n\n watch(modelValue, () => {\n reset();\n }, { deep: true });\n\n const isMulti = computed(() => Array.isArray(modelValue.value));\n\n const items = computed(() => {\n if (!q.value || q.value.length < 1) {\n return props.options;\n }\n // User input goes straight into a RegExp — escape special\n // chars so typing `(`, `[`, `*`, `+`, `?` etc. doesn't\n // throw SyntaxError and crash the filter mid-render.\n const escaped = q.value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(escaped, 'ig');\n return props.options.filter((option) => option.label.match(pattern));\n });\n\n // Clamp pagination knobs to a sane minimum: a 0/negative `maxItems`\n // would render nothing on open, and a 0/negative `scrollDistance`\n // would stall infinite-scroll because each load step would advance\n // by zero (or rewind).\n const pageSize = computed(() => Math.max(1, props.maxItems));\n const pageStep = computed(() => Math.max(1, props.scrollDistance));\n\n const itemsDisplayed = ref<FormOption[]>([]);\n const setItemsDisplayed = () => {\n itemsDisplayed.value = items.value.slice(0, pageSize.value);\n };\n\n const showMoreItemsDisplayed = () => {\n const startIndex = itemsDisplayed.value.length;\n const endIndex = Math.min(startIndex + pageStep.value, items.value.length);\n if (startIndex >= endIndex) {\n return;\n }\n itemsDisplayed.value.push(...items.value.slice(startIndex, endIndex));\n };\n\n setItemsDisplayed();\n\n // Watch the filtered set itself, not just its length — two queries can\n // return the same number of matches but different items, and the\n // length-only watcher would miss the content swap, leaving the\n // dropdown showing the previous query's results.\n //\n // Reset currentIndex to -1 (no item highlighted) instead of 0 — the\n // visual \"current\" highlight should only appear after the user\n // explicitly arrow-keys. The Enter handler still falls back to the\n // first item when nothing is highlighted (see selected.length === 0\n // branch), so keyboard-first selection still works.\n watch(items, () => {\n currentIndex.value = -1;\n setItemsDisplayed();\n });\n\n useInfiniteScroll(listElement, () => {\n showMoreItemsDisplayed();\n }, {\n canLoadMore() {\n return itemsDisplayed.value.length < items.value.length;\n },\n });\n\n const isDisplayed = ref(false);\n\n // `closeOnSelect === undefined` falls back to the mode-default:\n // single-select closes, multi stays open.\n const shouldCloseOnSelect = () => (\n typeof props.closeOnSelect === 'boolean' ? props.closeOnSelect : !isMulti.value\n );\n\n const toggle = (option: FormOption) => {\n // Disabled-form semantics: a disabled control must not mutate\n // its bound value or emit change events. Mouse picks on dropdown\n // items are gated by `display()` (which short-circuits when\n // disabled), but the multi-select chip-remove buttons render\n // outside the dropdown and were still callable.\n if (props.disabled) {\n return;\n }\n\n if (isMulti.value) {\n const index = selected.value.findIndex((el) => el.value === option.value);\n if (index === -1) {\n selected.value.push(option);\n } else {\n selected.value.splice(index, 1);\n }\n\n const values = selected.value.map((el) => el.value);\n emit('update:modelValue', values);\n emit('change', values);\n\n if (shouldCloseOnSelect()) {\n isDisplayed.value = false;\n }\n return;\n }\n\n let isBlank = false;\n const [selectedValue] = selected.value;\n if (selectedValue) {\n if (selectedValue.value === option.value) {\n q.value = '';\n selected.value.length = 0;\n isBlank = true;\n } else {\n q.value = option.label;\n selected.value = [option];\n }\n } else {\n q.value = option.label;\n selected.value = [option];\n }\n\n if (shouldCloseOnSelect()) {\n isDisplayed.value = false;\n }\n\n if (isBlank) {\n emit('update:modelValue', null);\n emit('change', null);\n return;\n }\n\n emit('update:modelValue', option.value);\n emit('change', option.value);\n };\n\n const display = () => {\n if (props.disabled) return;\n\n isDisplayed.value = true;\n };\n\n const hide = () => {\n if (\n !isMulti.value &&\n selected.value.length === 1\n ) {\n q.value = selected.value[0].label;\n }\n\n isDisplayed.value = false;\n };\n\n onClickOutside(listElement, () => {\n hide();\n }, { ignore: [inputElement] });\n\n const onFocus = () => {\n q.value = '';\n display();\n };\n\n const onKeyUp = (ev: globalThis.KeyboardEvent) => {\n if (ev.key === 'ArrowUp' || ev.key === 'ArrowDown') {\n display();\n\n if (ev.key === 'ArrowUp') {\n if (currentIndex.value > 0) {\n currentIndex.value--;\n }\n\n return;\n }\n\n if (currentIndex.value < itemsDisplayed.value.length - 1) {\n currentIndex.value++;\n }\n }\n\n if (ev.key !== 'Enter') {\n display();\n }\n };\n\n const onKeyDown = (ev: globalThis.KeyboardEvent) => {\n if (ev.key === 'Enter') {\n if (!isDisplayed.value) {\n return;\n }\n\n if (itemsDisplayed.value.length === 1) {\n toggle(itemsDisplayed.value[0]);\n return;\n }\n\n if (\n currentIndex.value >= 0 &&\n itemsDisplayed.value[currentIndex.value]\n ) {\n toggle(itemsDisplayed.value[currentIndex.value]);\n\n return;\n }\n\n if (selected.value.length === 0) {\n if (itemsDisplayed.value[0]) {\n toggle(itemsDisplayed.value[0]);\n }\n\n return;\n }\n\n hide();\n\n return;\n }\n\n if (ev.key === 'Tab') {\n hide();\n }\n };\n\n return {\n theme,\n listElement,\n inputElement,\n\n isMulti,\n toggle,\n currentIndex,\n q,\n items: itemsDisplayed,\n selected,\n display,\n onFocus,\n onKeyUp,\n onKeyDown,\n isDisplayed,\n };\n },\n});\n</script>\n<template>\n <div :class=\"theme.root\">\n <input\n ref=\"inputElement\"\n v-model=\"q\"\n :class=\"theme.input\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n @focus=\"onFocus\"\n @keyup=\"onKeyUp\"\n @keydown=\"onKeyDown\"\n >\n\n <div\n v-show=\"isDisplayed\"\n ref=\"listElement\"\n :class=\"theme.content\"\n >\n <template\n v-for=\"(option, index) in items\"\n :key=\"String(option.value)\"\n >\n <FormSelectSearchEntry\n :entry=\"option\"\n :selected=\"selected\"\n >\n <template #default=\"{ entry, active }\">\n <div\n :class=\"[\n theme.item,\n {\n [theme.itemActive]: active,\n [theme.itemCurrent]: index === currentIndex,\n },\n ]\"\n @mousedown=\"toggle(entry)\"\n >\n {{ entry.label }}\n <span\n v-if=\"entry.description\"\n :class=\"theme.itemDescription\"\n >\n {{ entry.description }}\n </span>\n </div>\n </template>\n </FormSelectSearchEntry>\n </template>\n </div>\n\n <div\n v-if=\"isMulti\"\n :class=\"theme.selected\"\n >\n <slot\n name=\"selected\"\n :items=\"selected\"\n :toggle=\"toggle\"\n >\n <button\n v-for=\"item in selected\"\n :key=\"String(item.value)\"\n type=\"button\"\n :class=\"theme.selectedItem\"\n :disabled=\"disabled\"\n @click=\"toggle(item)\"\n >\n {{ item.label }}\n <span\n :class=\"theme.selectedItemRemove\"\n aria-hidden=\"true\"\n >&times;</span>\n </button>\n </slot>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n SliderRange,\n SliderRoot,\n SliderThumb,\n SliderTrack,\n} from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n computed,\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormSliderThemeClasses = {\n root: string;\n track: string;\n range: string;\n thumb: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formSlider?: ThemeElementDefinition<FormSliderThemeClasses>;\n }\n}\n\nexport const formSliderThemeDefaults: ComponentThemeDefinition<FormSliderThemeClasses> = {\n classes: {\n root: 'vc-form-slider',\n track: 'vc-form-slider-track',\n range: 'vc-form-slider-range',\n thumb: 'vc-form-slider-thumb',\n },\n};\n\nexport type FormSliderOrientation = 'horizontal' | 'vertical';\n/**\n * `modelValue` accepts a single number (one thumb) or an array (one thumb per\n * entry — the \"range\" case for length 2, multi-thumb for longer arrays).\n */\nexport type FormSliderModelValue = number | number[];\n\nconst formSliderProps = {\n /** Controlled value — number for single-thumb, array for range / multi-thumb. `null` is the documented \"unset\" value. */\n modelValue: {\n type: [Number, Array, null] as PropType<FormSliderModelValue | null>,\n default: undefined,\n },\n /** Minimum value for the range. */\n min: { type: Number, default: 0 },\n /** Maximum value for the range. */\n max: { type: Number, default: 100 },\n /** Stepping interval between values. */\n step: { type: Number, default: 1 },\n /** Slider axis. */\n orientation: {\n type: String as PropType<FormSliderOrientation>,\n default: 'horizontal',\n },\n /** When `true`, the slider is visually inverted. */\n inverted: { type: Boolean, default: false },\n /** When `true`, prevents the user from interacting with the slider. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Minimum permitted steps between adjacent thumbs (multi-thumb mode). */\n minStepsBetweenThumbs: { type: Number, default: 0 },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormSliderThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormSliderProps = ExtractPublicPropTypes<typeof formSliderProps>;\n\nexport default defineComponent({\n name: 'VCFormSlider',\n inheritAttrs: false,\n props: formSliderProps,\n emits: ['update:modelValue', 'valueCommit'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formSlider', props, formSliderThemeDefaults);\n\n // Reka's SliderRoot only accepts number[]; we support a scalar for the\n // common single-thumb case and bridge here. The shape we emit on\n // update mirrors the shape we received so v-model round-trips cleanly.\n const isScalar = computed(() => typeof props.modelValue === 'number');\n\n const internalValue = computed<number[]>(() => {\n if (props.modelValue === undefined || props.modelValue === null) {\n return [props.min];\n }\n return Array.isArray(props.modelValue) ? props.modelValue : [props.modelValue];\n });\n\n const handleUpdate = (next: number[]) => {\n if (isScalar.value) {\n emit('update:modelValue', next[0]);\n } else {\n emit('update:modelValue', next);\n }\n };\n\n const handleCommit = (next: number[]) => {\n if (isScalar.value) {\n emit('valueCommit', next[0]);\n } else {\n emit('valueCommit', next);\n }\n };\n\n return () => h(\n SliderRoot,\n mergeProps(attrs, {\n modelValue: internalValue.value,\n name: props.name,\n min: props.min,\n max: props.max,\n step: props.step,\n orientation: props.orientation,\n inverted: props.inverted,\n disabled: props.disabled,\n required: props.required,\n minStepsBetweenThumbs: props.minStepsBetweenThumbs,\n 'onUpdate:modelValue': handleUpdate,\n onValueCommit: handleCommit,\n class: theme.value.root || undefined,\n }),\n {\n default: () => [\n h(\n SliderTrack,\n { class: theme.value.track || undefined },\n { default: () => h(SliderRange, { class: theme.value.range || undefined }) },\n ),\n ...internalValue.value.map((_, index) => h(SliderThumb, {\n key: index,\n class: theme.value.thumb || undefined,\n })),\n ],\n },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n SliderRange,\n SliderRoot,\n SliderThumb,\n SliderTrack,\n} from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n computed,\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormSliderThemeClasses = {\n root: string;\n track: string;\n range: string;\n thumb: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formSlider?: ThemeElementDefinition<FormSliderThemeClasses>;\n }\n}\n\nexport const formSliderThemeDefaults: ComponentThemeDefinition<FormSliderThemeClasses> = {\n classes: {\n root: 'vc-form-slider',\n track: 'vc-form-slider-track',\n range: 'vc-form-slider-range',\n thumb: 'vc-form-slider-thumb',\n },\n};\n\nexport type FormSliderOrientation = 'horizontal' | 'vertical';\n/**\n * `modelValue` accepts a single number (one thumb) or an array (one thumb per\n * entry — the \"range\" case for length 2, multi-thumb for longer arrays).\n */\nexport type FormSliderModelValue = number | number[];\n\nconst formSliderProps = {\n /** Controlled value — number for single-thumb, array for range / multi-thumb. `null` is the documented \"unset\" value. */\n modelValue: {\n type: [Number, Array, null] as PropType<FormSliderModelValue | null>,\n default: undefined,\n },\n /** Minimum value for the range. */\n min: { type: Number, default: 0 },\n /** Maximum value for the range. */\n max: { type: Number, default: 100 },\n /** Stepping interval between values. */\n step: { type: Number, default: 1 },\n /** Slider axis. */\n orientation: {\n type: String as PropType<FormSliderOrientation>,\n default: 'horizontal',\n },\n /** When `true`, the slider is visually inverted. */\n inverted: { type: Boolean, default: false },\n /** When `true`, prevents the user from interacting with the slider. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Minimum permitted steps between adjacent thumbs (multi-thumb mode). */\n minStepsBetweenThumbs: { type: Number, default: 0 },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormSliderThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormSliderProps = ExtractPublicPropTypes<typeof formSliderProps>;\n\nexport default defineComponent({\n name: 'VCFormSlider',\n inheritAttrs: false,\n props: formSliderProps,\n emits: ['update:modelValue', 'valueCommit'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formSlider', props, formSliderThemeDefaults);\n\n // Reka's SliderRoot only accepts number[]; we support a scalar for the\n // common single-thumb case and bridge here. The shape we emit on\n // update mirrors the shape we received so v-model round-trips cleanly.\n const isScalar = computed(() => typeof props.modelValue === 'number');\n\n const internalValue = computed<number[]>(() => {\n if (props.modelValue === undefined || props.modelValue === null) {\n return [props.min];\n }\n return Array.isArray(props.modelValue) ? props.modelValue : [props.modelValue];\n });\n\n const handleUpdate = (next: number[]) => {\n if (isScalar.value) {\n emit('update:modelValue', next[0]);\n } else {\n emit('update:modelValue', next);\n }\n };\n\n const handleCommit = (next: number[]) => {\n if (isScalar.value) {\n emit('valueCommit', next[0]);\n } else {\n emit('valueCommit', next);\n }\n };\n\n return () => h(\n SliderRoot,\n mergeProps(attrs, {\n modelValue: internalValue.value,\n name: props.name,\n min: props.min,\n max: props.max,\n step: props.step,\n orientation: props.orientation,\n inverted: props.inverted,\n disabled: props.disabled,\n required: props.required,\n minStepsBetweenThumbs: props.minStepsBetweenThumbs,\n 'onUpdate:modelValue': handleUpdate,\n onValueCommit: handleCommit,\n class: theme.value.root || undefined,\n }),\n {\n default: () => [\n h(\n SliderTrack,\n { class: theme.value.track || undefined },\n { default: () => h(SliderRange, { class: theme.value.range || undefined }) },\n ),\n ...internalValue.value.map((_, index) => h(SliderThumb, {\n key: index,\n class: theme.value.thumb || undefined,\n })),\n ],\n },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme, useId } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { SwitchRoot, SwitchThumb } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType, SlotsType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormSwitchThemeClasses = {\n root: string;\n thumb: string;\n label: string;\n group: string;\n};\n\nexport type FormSwitchDefaults = {\n labelContent: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formSwitch?: ThemeElementDefinition<FormSwitchThemeClasses>;\n }\n interface ComponentDefaults {\n formSwitch?: ComponentDefaultValues<FormSwitchDefaults>;\n }\n}\n\nexport const formSwitchThemeDefaults: ComponentThemeDefinition<FormSwitchThemeClasses> = {\n classes: {\n root: 'vc-form-switch',\n thumb: 'vc-form-switch-thumb',\n label: 'vc-form-switch-label',\n // See FormRadio.vue / FormCheckbox.vue — name collision avoidance.\n group: 'vc-form-switch-wrapper',\n },\n};\n\nconst behavioralDefaults: FormSwitchDefaults = { labelContent: 'Toggle' };\n\nexport type FormSwitchLabelSlotProps = {\n class: string;\n id: string;\n};\n\nexport type FormSwitchThumbSlotProps = {\n class: string;\n};\n\nconst formSwitchProps = {\n /** Controlled checked state. `null` is accepted as the documented \"unset\" value. */\n modelValue: { type: [Boolean, null] as PropType<boolean | null | undefined>, default: undefined },\n /** When `true`, prevents the user from interacting with the switch. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Form-submission value when the switch is on. */\n value: { type: String, default: 'on' },\n /** Element id; falls back to an SSR-safe generated id. */\n id: { type: String, default: undefined },\n /** Vuecs convention: render the label by default. Internal control flow, not forwarded to Reka. */\n label: { type: Boolean, default: true },\n /** Default label text (resolved through DefaultsManager). */\n labelContent: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormSwitchThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormSwitchProps = ExtractPublicPropTypes<typeof formSwitchProps>;\n\nexport default defineComponent({\n name: 'VCFormSwitch',\n inheritAttrs: false,\n props: formSwitchProps,\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n label: FormSwitchLabelSlotProps;\n thumb: FormSwitchThumbSlotProps;\n }>,\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formSwitch', props, formSwitchThemeDefaults);\n const defaults = useComponentDefaults('formSwitch', props, behavioralDefaults);\n // SSR-safe stable id (Vue 3.5's native `useId` under the hood) —\n // see FormCheckbox.vue.\n const fallbackId = useId(undefined, 'vc-form-switch');\n\n return () => {\n const resolved = theme.value;\n const resolvedDefaults = defaults.value;\n const id = props.id ?? fallbackId;\n\n const switchEl = h(\n SwitchRoot,\n mergeProps(attrs, {\n id,\n value: props.value,\n name: props.name,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue': (value: boolean) => emit('update:modelValue', value),\n class: resolved.root || undefined,\n }),\n {\n default: () => h(\n SwitchThumb,\n { class: resolved.thumb || undefined },\n { default: () => slots.thumb?.({ class: resolved.thumb }) ?? '' },\n ),\n },\n );\n\n if (!props.label) {\n return switchEl;\n }\n\n const labelNode = slots.label ?\n slots.label({ class: resolved.label, id }) :\n h('label', { class: resolved.label || undefined, for: id }, [resolvedDefaults.labelContent]);\n\n return h('div', { class: resolved.group || undefined }, [switchEl, labelNode]);\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentDefaults, useComponentTheme, useId } from '@vuecs/core';\nimport type {\n ComponentDefaultValues,\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { SwitchRoot, SwitchThumb } from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType, SlotsType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormSwitchThemeClasses = {\n root: string;\n thumb: string;\n label: string;\n group: string;\n};\n\nexport type FormSwitchDefaults = {\n labelContent: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formSwitch?: ThemeElementDefinition<FormSwitchThemeClasses>;\n }\n interface ComponentDefaults {\n formSwitch?: ComponentDefaultValues<FormSwitchDefaults>;\n }\n}\n\nexport const formSwitchThemeDefaults: ComponentThemeDefinition<FormSwitchThemeClasses> = {\n classes: {\n root: 'vc-form-switch',\n thumb: 'vc-form-switch-thumb',\n label: 'vc-form-switch-label',\n // See FormRadio.vue / FormCheckbox.vue — name collision avoidance.\n group: 'vc-form-switch-wrapper',\n },\n};\n\nconst behavioralDefaults: FormSwitchDefaults = { labelContent: 'Toggle' };\n\nexport type FormSwitchLabelSlotProps = {\n class: string;\n id: string;\n};\n\nexport type FormSwitchThumbSlotProps = {\n class: string;\n};\n\nconst formSwitchProps = {\n /** Controlled checked state. `null` is accepted as the documented \"unset\" value. */\n modelValue: { type: [Boolean, null] as PropType<boolean | null | undefined>, default: undefined },\n /** When `true`, prevents the user from interacting with the switch. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Form-submission value when the switch is on. */\n value: { type: String, default: 'on' },\n /** Element id; falls back to an SSR-safe generated id. */\n id: { type: String, default: undefined },\n /** Vuecs convention: render the label by default. Internal control flow, not forwarded to Reka. */\n label: { type: Boolean, default: true },\n /** Default label text (resolved through DefaultsManager). */\n labelContent: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormSwitchThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormSwitchProps = ExtractPublicPropTypes<typeof formSwitchProps>;\n\nexport default defineComponent({\n name: 'VCFormSwitch',\n inheritAttrs: false,\n props: formSwitchProps,\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n label: FormSwitchLabelSlotProps;\n thumb: FormSwitchThumbSlotProps;\n }>,\n setup(props, {\n attrs,\n emit,\n slots,\n }) {\n const theme = useComponentTheme('formSwitch', props, formSwitchThemeDefaults);\n const defaults = useComponentDefaults('formSwitch', props, behavioralDefaults);\n // SSR-safe stable id (Vue 3.5's native `useId` under the hood) —\n // see FormCheckbox.vue.\n const fallbackId = useId(undefined, 'vc-form-switch');\n\n return () => {\n const resolved = theme.value;\n const resolvedDefaults = defaults.value;\n const id = props.id ?? fallbackId;\n\n const switchEl = h(\n SwitchRoot,\n mergeProps(attrs, {\n id,\n value: props.value,\n name: props.name,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n 'onUpdate:modelValue': (value: boolean) => emit('update:modelValue', value),\n class: resolved.root || undefined,\n }),\n {\n default: () => h(\n SwitchThumb,\n { class: resolved.thumb || undefined },\n { default: () => slots.thumb?.({ class: resolved.thumb }) ?? '' },\n ),\n },\n );\n\n if (!props.label) {\n return switchEl;\n }\n\n const labelNode = slots.label ?\n slots.label({ class: resolved.label, id }) :\n h('label', { class: resolved.label || undefined, for: id }, [resolvedDefaults.labelContent]);\n\n return h('div', { class: resolved.group || undefined }, [switchEl, labelNode]);\n };\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n TagsInputInput,\n TagsInputItem,\n TagsInputItemDelete,\n TagsInputItemText,\n TagsInputRoot,\n} from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormTagsThemeClasses = {\n root: string;\n item: string;\n itemText: string;\n itemDelete: string;\n input: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formTags?: ThemeElementDefinition<FormTagsThemeClasses>;\n }\n}\n\nexport const formTagsThemeDefaults: ComponentThemeDefinition<FormTagsThemeClasses> = {\n classes: {\n root: 'vc-form-tags',\n item: 'vc-form-tags-item',\n itemText: 'vc-form-tags-item-text',\n itemDelete: 'vc-form-tags-item-delete',\n input: 'vc-form-tags-input',\n },\n};\n\nexport type FormTagsModelValue = string[] | number[];\n\nconst formTagsProps = {\n /** Controlled list of tag values. `null` is the documented \"unset\" value. */\n modelValue: {\n type: [Array, null] as PropType<FormTagsModelValue | null>,\n default: undefined,\n },\n /** Placeholder shown in the empty input field. */\n placeholder: { type: String, default: undefined },\n /** When `true`, prevents the user from interacting with the input. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Maximum number of tags (0 = unlimited). */\n max: { type: Number, default: 0 },\n /** When `true`, paste events split on the delimiter and commit the parts. */\n addOnPaste: { type: Boolean, default: false },\n /** When `true`, pressing Tab commits the pending tag. */\n addOnTab: { type: Boolean, default: false },\n /** Vuecs convention: commit a pending tag when the input loses focus (Reka has no default; vuecs opts in so blur-to-commit \"just works\"). */\n addOnBlur: { type: Boolean, default: true },\n /** When `true`, allow duplicate tag values. */\n duplicate: { type: Boolean, default: false },\n /** Character or regular expression that triggers a new tag (and splits pasted text). */\n delimiter: { type: [String, RegExp] as PropType<string | RegExp>, default: ',' },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Element id for the root tags input. */\n id: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormTagsThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormTagsProps = ExtractPublicPropTypes<typeof formTagsProps>;\n\nexport default defineComponent({\n name: 'VCFormTags',\n inheritAttrs: false,\n props: formTagsProps,\n emits: ['update:modelValue', 'invalid'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formTags', props, formTagsThemeDefaults);\n\n return () => h(\n TagsInputRoot,\n mergeProps(attrs, {\n placeholder: props.placeholder,\n addOnBlur: props.addOnBlur,\n name: props.name,\n id: props.id,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n max: props.max,\n addOnPaste: props.addOnPaste,\n addOnTab: props.addOnTab,\n duplicate: props.duplicate,\n delimiter: props.delimiter,\n 'onUpdate:modelValue': (value: FormTagsModelValue) => emit('update:modelValue', value),\n onInvalid: (value: string) => emit('invalid', value),\n class: theme.value.root || undefined,\n }),\n {\n default: ({ modelValue }: { modelValue: FormTagsModelValue }) => [\n ...(modelValue ?? []).map((tag) => h(TagsInputItem, {\n key: String(tag),\n value: tag,\n class: theme.value.item || undefined,\n }, {\n default: () => [\n h(TagsInputItemText, { class: theme.value.itemText || undefined }),\n h(TagsInputItemDelete, { class: theme.value.itemDelete || undefined }, { default: () => '×' }),\n ],\n })),\n h(TagsInputInput, {\n placeholder: props.placeholder,\n class: theme.value.input || undefined,\n }),\n ],\n },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport {\n TagsInputInput,\n TagsInputItem,\n TagsInputItemDelete,\n TagsInputItemText,\n TagsInputRoot,\n} from 'reka-ui';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n} from 'vue';\n\nexport type FormTagsThemeClasses = {\n root: string;\n item: string;\n itemText: string;\n itemDelete: string;\n input: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formTags?: ThemeElementDefinition<FormTagsThemeClasses>;\n }\n}\n\nexport const formTagsThemeDefaults: ComponentThemeDefinition<FormTagsThemeClasses> = {\n classes: {\n root: 'vc-form-tags',\n item: 'vc-form-tags-item',\n itemText: 'vc-form-tags-item-text',\n itemDelete: 'vc-form-tags-item-delete',\n input: 'vc-form-tags-input',\n },\n};\n\nexport type FormTagsModelValue = string[] | number[];\n\nconst formTagsProps = {\n /** Controlled list of tag values. `null` is the documented \"unset\" value. */\n modelValue: {\n type: [Array, null] as PropType<FormTagsModelValue | null>,\n default: undefined,\n },\n /** Placeholder shown in the empty input field. */\n placeholder: { type: String, default: undefined },\n /** When `true`, prevents the user from interacting with the input. */\n disabled: { type: Boolean, default: false },\n /** Marks the underlying form field as required. */\n required: { type: Boolean, default: false },\n /** Maximum number of tags (0 = unlimited). */\n max: { type: Number, default: 0 },\n /** When `true`, paste events split on the delimiter and commit the parts. */\n addOnPaste: { type: Boolean, default: false },\n /** When `true`, pressing Tab commits the pending tag. */\n addOnTab: { type: Boolean, default: false },\n /** Vuecs convention: commit a pending tag when the input loses focus (Reka has no default; vuecs opts in so blur-to-commit \"just works\"). */\n addOnBlur: { type: Boolean, default: true },\n /** When `true`, allow duplicate tag values. */\n duplicate: { type: Boolean, default: false },\n /** Character or regular expression that triggers a new tag (and splits pasted text). */\n delimiter: { type: [String, RegExp] as PropType<string | RegExp>, default: ',' },\n /** Form-field name for HTML form submission. */\n name: { type: String, default: undefined },\n /** Element id for the root tags input. */\n id: { type: String, default: undefined },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormTagsThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormTagsProps = ExtractPublicPropTypes<typeof formTagsProps>;\n\nexport default defineComponent({\n name: 'VCFormTags',\n inheritAttrs: false,\n props: formTagsProps,\n emits: ['update:modelValue', 'invalid'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formTags', props, formTagsThemeDefaults);\n\n return () => h(\n TagsInputRoot,\n mergeProps(attrs, {\n placeholder: props.placeholder,\n addOnBlur: props.addOnBlur,\n name: props.name,\n id: props.id,\n modelValue: props.modelValue,\n disabled: props.disabled,\n required: props.required,\n max: props.max,\n addOnPaste: props.addOnPaste,\n addOnTab: props.addOnTab,\n duplicate: props.duplicate,\n delimiter: props.delimiter,\n 'onUpdate:modelValue': (value: FormTagsModelValue) => emit('update:modelValue', value),\n onInvalid: (value: string) => emit('invalid', value),\n class: theme.value.root || undefined,\n }),\n {\n default: ({ modelValue }: { modelValue: FormTagsModelValue }) => [\n ...(modelValue ?? []).map((tag) => h(TagsInputItem, {\n key: String(tag),\n value: tag,\n class: theme.value.item || undefined,\n }, {\n default: () => [\n h(TagsInputItemText, { class: theme.value.itemText || undefined }),\n h(TagsInputItemDelete, { class: theme.value.itemDelete || undefined }, { default: () => '×' }),\n ],\n })),\n h(TagsInputInput, {\n placeholder: props.placeholder,\n class: theme.value.input || undefined,\n }),\n ],\n },\n );\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { useDebounceFn } from '@vueuse/core';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n ref,\n watch,\n} from 'vue';\n\nexport type FormTextareaThemeClasses = {\n root: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formTextarea?: ThemeElementDefinition<FormTextareaThemeClasses>;\n }\n}\n\nexport const formTextareaThemeDefaults: ComponentThemeDefinition<FormTextareaThemeClasses> = { classes: { root: '' } };\n\nconst formTextareaProps = {\n /** Controlled string value (v-model). */\n modelValue: { type: String, default: '' },\n /** Debounce window (ms) for `update:modelValue` emissions. `0` disables debouncing. */\n debounce: { type: Number, default: 0 },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormTextareaThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormTextareaProps = ExtractPublicPropTypes<typeof formTextareaProps>;\n\nexport default defineComponent({\n name: 'VCFormTextarea',\n props: formTextareaProps,\n emits: ['update:modelValue'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formTextarea', props, formTextareaThemeDefaults);\n\n const localValue = ref(props.modelValue);\n watch(() => props.modelValue, (value) => {\n localValue.value = value;\n });\n\n const emitUpdate = (value: string) => emit('update:modelValue', value);\n const emitUpdateDebounced = useDebounceFn(emitUpdate, () => props.debounce);\n\n const onInput = ($event: Event) => {\n // Vue patches `composing` onto the target during IME composition;\n // skip the emit until composition ends to avoid duplicate updates.\n const target = $event.target as globalThis.HTMLTextAreaElement & { composing?: boolean };\n if (target.composing) return;\n const { value } = target;\n localValue.value = value;\n if (props.debounce > 0) {\n emitUpdateDebounced(value);\n } else {\n emitUpdate(value);\n }\n };\n\n return () => h('textarea', mergeProps({\n placeholder: '...',\n class: theme.value.root || undefined,\n onInput,\n value: localValue.value,\n }, attrs));\n },\n});\n</script>\n","<script lang=\"ts\">\nimport { useComponentTheme } from '@vuecs/core';\nimport type {\n ComponentThemeDefinition,\n ThemeClassesOverride,\n ThemeElementDefinition,\n VariantValues,\n} from '@vuecs/core';\nimport { useDebounceFn } from '@vueuse/core';\nimport type { ExtractPublicPropTypes, PropType } from 'vue';\nimport {\n defineComponent,\n h,\n mergeProps,\n ref,\n watch,\n} from 'vue';\n\nexport type FormTextareaThemeClasses = {\n root: string;\n};\n\ndeclare module '@vuecs/core' {\n interface ThemeElements {\n formTextarea?: ThemeElementDefinition<FormTextareaThemeClasses>;\n }\n}\n\nexport const formTextareaThemeDefaults: ComponentThemeDefinition<FormTextareaThemeClasses> = { classes: { root: '' } };\n\nconst formTextareaProps = {\n /** Controlled string value (v-model). */\n modelValue: { type: String, default: '' },\n /** Debounce window (ms) for `update:modelValue` emissions. `0` disables debouncing. */\n debounce: { type: Number, default: 0 },\n /** Theme-class overrides for this component instance. */\n themeClass: { type: Object as PropType<ThemeClassesOverride<FormTextareaThemeClasses>>, default: undefined },\n /** Theme variant values for this component instance. */\n themeVariant: { type: Object as PropType<VariantValues>, default: undefined },\n};\n\nexport type FormTextareaProps = ExtractPublicPropTypes<typeof formTextareaProps>;\n\nexport default defineComponent({\n name: 'VCFormTextarea',\n props: formTextareaProps,\n emits: ['update:modelValue'],\n setup(props, { attrs, emit }) {\n const theme = useComponentTheme('formTextarea', props, formTextareaThemeDefaults);\n\n const localValue = ref(props.modelValue);\n watch(() => props.modelValue, (value) => {\n localValue.value = value;\n });\n\n const emitUpdate = (value: string) => emit('update:modelValue', value);\n const emitUpdateDebounced = useDebounceFn(emitUpdate, () => props.debounce);\n\n const onInput = ($event: Event) => {\n // Vue patches `composing` onto the target during IME composition;\n // skip the emit until composition ends to avoid duplicate updates.\n const target = $event.target as globalThis.HTMLTextAreaElement & { composing?: boolean };\n if (target.composing) return;\n const { value } = target;\n localValue.value = value;\n if (props.debounce > 0) {\n emitUpdateDebounced(value);\n } else {\n emitUpdate(value);\n }\n };\n\n return () => h('textarea', mergeProps({\n placeholder: '...',\n class: theme.value.root || undefined,\n onInput,\n value: localValue.value,\n }, attrs));\n },\n});\n</script>\n","import { useComponentDefaults } from '@vuecs/core';\nimport type { ComponentDefaultValues } from '@vuecs/core';\nimport type { ComputedRef, MaybeRefOrGetter } from 'vue';\nimport { computed, toValue } from 'vue';\n\n/**\n * Color set the submit-button composable resolves through DefaultsManager.\n * Mirrors `@vuecs/button`'s `ButtonColor` — duplicated locally so\n * `@vuecs/forms` doesn't pull `@vuecs/button` into its dependency\n * graph for consumers who don't use the submit-button sugar.\n */\nexport type SubmitButtonColor = 'primary' | 'neutral' | 'success' | 'warning' | 'error' | 'info';\n\nexport type SubmitButtonDefaults = {\n createText: string;\n updateText: string;\n createIcon: string;\n updateIcon: string;\n createColor: SubmitButtonColor;\n updateColor: SubmitButtonColor;\n};\n\ndeclare module '@vuecs/core' {\n interface ComponentDefaults {\n submitButton?: ComponentDefaultValues<SubmitButtonDefaults>;\n }\n}\n\nconst hardcodedDefaults: SubmitButtonDefaults = {\n createText: 'Create',\n updateText: 'Update',\n createIcon: '',\n updateIcon: '',\n createColor: 'success',\n updateColor: 'primary',\n};\n\nexport type UseSubmitButtonOptions = {\n /** When true the composable returns the update-mode bindings; defaults to `false`. */\n isEditing?: MaybeRefOrGetter<boolean>;\n /** Forwarded to the returned `loading` field; defaults to `false`. */\n loading?: MaybeRefOrGetter<boolean>;\n /** Forwarded to the returned `disabled` field; defaults to `false`. */\n disabled?: MaybeRefOrGetter<boolean>;\n};\n\nexport type SubmitButtonBindings = {\n type: 'submit';\n label: string;\n iconLeft: string | undefined;\n color: SubmitButtonColor;\n loading: boolean;\n disabled: boolean;\n};\n\n/**\n * @experimental\n *\n * Reactive `v-bind` source for `<VCButton>` that swaps label / icon /\n * color between create and update modes based on `isEditing`. All four\n * customization knobs (`createText`, `updateText`, `createIcon`,\n * `updateIcon`, `createColor`, `updateColor`) resolve through the\n * `DefaultsManager` under the `submitButton` key, so consumers can wire\n * i18n labels and per-app color/icon choices once at `app.use()` time.\n *\n * The API surface (option names, return shape, defaults key) may change\n * in a future minor release while this stays experimental — pin a\n * version if you depend on the exact shape.\n *\n * @example\n * ```ts\n * const submit = useSubmitButton({ isEditing: () => isEditing.value, loading });\n * ```\n *\n * ```vue\n * <VCButton v-bind=\"submit\" />\n * ```\n */\nexport function useSubmitButton(\n options: UseSubmitButtonOptions = {},\n): ComputedRef<SubmitButtonBindings> {\n // useComponentDefaults reads `props[key]` per hardcoded key. We don't\n // pass per-instance overrides through this composable today (consumers\n // wanting one-off overrides set them on the spread call site), so the\n // \"props\" object is empty — every key falls through to the global\n // defaults layer or the hardcoded fallback.\n const defaults = useComponentDefaults('submitButton', {}, hardcodedDefaults);\n\n return computed<SubmitButtonBindings>(() => {\n const editing = toValue(options.isEditing) ?? false;\n const resolved = defaults.value;\n\n const label = editing ? resolved.updateText : resolved.createText;\n const iconClass = editing ? resolved.updateIcon : resolved.createIcon;\n const color = editing ? resolved.updateColor : resolved.createColor;\n\n return {\n type: 'submit',\n label,\n // Empty icon class would render an unwanted phantom <i> in\n // VCButton — coerce to undefined so the leading slot is skipped.\n iconLeft: iconClass || undefined,\n color,\n loading: toValue(options.loading) ?? false,\n disabled: toValue(options.disabled) ?? false,\n };\n });\n}\n","import { installDefaultsManager, installThemeManager } from '@vuecs/core';\nimport type { App, Plugin } from 'vue';\n\nimport '../assets/form-checkbox.css';\nimport '../assets/form-checkbox-group.css';\nimport '../assets/form-input.css';\nimport '../assets/form-number.css';\nimport '../assets/form-pin.css';\nimport '../assets/form-radio.css';\nimport '../assets/form-select.css';\nimport '../assets/form-select-search.css';\nimport '../assets/form-slider.css';\nimport '../assets/form-switch.css';\nimport '../assets/form-tags.css';\nimport './vue';\n\nimport {\n VCFormCheckbox,\n VCFormCheckboxGroup,\n VCFormGroup,\n VCFormInput,\n VCFormNumber,\n VCFormPin,\n VCFormRadio,\n VCFormRadioGroup,\n VCFormSelect,\n VCFormSelectSearch,\n VCFormSlider,\n VCFormSwitch,\n VCFormTags,\n VCFormTextarea,\n} from './components';\nimport type { Options } from './type';\n\nexport * from './components';\nexport * from './composables';\nexport * from './type';\nexport * from './types';\n\nexport function install(instance: App, options: Options = {}): void {\n installThemeManager(instance, options);\n installDefaultsManager(instance, options);\n\n Object.entries({\n VCFormCheckbox,\n VCFormCheckboxGroup,\n VCFormGroup,\n VCFormInput,\n VCFormNumber,\n VCFormPin,\n VCFormRadio,\n VCFormRadioGroup,\n VCFormSelect,\n VCFormSelectSearch,\n VCFormSlider,\n VCFormSwitch,\n VCFormTags,\n VCFormTextarea,\n }).forEach(([componentName, component]) => {\n instance.component(componentName, component);\n });\n}\n\nexport default { install } satisfies Plugin<[Options?]>;\n"],"mappings":"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"}