@vantageos/mosaic 0.3.0-alpha.1 → 0.3.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 (97) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/README.md +12 -0
  3. package/dist/{Alert.schema-BQsZGG6P.d.cts → Alert.schema-LPJE5gFP.d.cts} +31 -1
  4. package/dist/{Alert.schema-BQsZGG6P.d.ts → Alert.schema-LPJE5gFP.d.ts} +31 -1
  5. package/dist/MarkdownRenderer.schema-Rx7kIeVA.d.cts +22 -0
  6. package/dist/MarkdownRenderer.schema-Rx7kIeVA.d.ts +22 -0
  7. package/dist/ProgressBar.schema-CdVYx0Wq.d.cts +22 -0
  8. package/dist/ProgressBar.schema-CdVYx0Wq.d.ts +22 -0
  9. package/dist/StatusBadge.schema-1tOjB4Ir.d.cts +22 -0
  10. package/dist/StatusBadge.schema-1tOjB4Ir.d.ts +22 -0
  11. package/dist/artifacts.cjs +126 -2
  12. package/dist/artifacts.cjs.map +1 -1
  13. package/dist/artifacts.d.cts +3 -21
  14. package/dist/artifacts.d.ts +3 -21
  15. package/dist/artifacts.js +126 -2
  16. package/dist/artifacts.js.map +1 -1
  17. package/dist/confirmation.cjs +126 -2
  18. package/dist/confirmation.cjs.map +1 -1
  19. package/dist/confirmation.d.cts +3 -32
  20. package/dist/confirmation.d.ts +3 -32
  21. package/dist/confirmation.js +126 -2
  22. package/dist/confirmation.js.map +1 -1
  23. package/dist/display.cjs +129 -2
  24. package/dist/display.cjs.map +1 -1
  25. package/dist/display.d.cts +132 -2
  26. package/dist/display.d.ts +132 -2
  27. package/dist/display.js +129 -2
  28. package/dist/display.js.map +1 -1
  29. package/dist/forms.cjs +20 -17
  30. package/dist/forms.cjs.map +1 -1
  31. package/dist/forms.js +20 -17
  32. package/dist/forms.js.map +1 -1
  33. package/dist/index.cjs +129 -2
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +9 -7
  36. package/dist/index.d.ts +9 -7
  37. package/dist/index.js +129 -2
  38. package/dist/index.js.map +1 -1
  39. package/dist/media.cjs +126 -2
  40. package/dist/media.cjs.map +1 -1
  41. package/dist/media.d.cts +3 -21
  42. package/dist/media.d.ts +3 -21
  43. package/dist/media.js +126 -2
  44. package/dist/media.js.map +1 -1
  45. package/dist/preact/artifacts.d.ts +39 -1
  46. package/dist/preact/artifacts.js +234 -0
  47. package/dist/preact/artifacts.js.map +1 -1
  48. package/dist/preact/confirmation.d.ts +31 -1
  49. package/dist/preact/confirmation.js +245 -5
  50. package/dist/preact/confirmation.js.map +1 -1
  51. package/dist/preact/display.d.ts +127 -1
  52. package/dist/preact/display.js +419 -11
  53. package/dist/preact/display.js.map +1 -1
  54. package/dist/preact/forms.js +22 -19
  55. package/dist/preact/forms.js.map +1 -1
  56. package/dist/preact/input.js +2 -2
  57. package/dist/preact/progress.d.ts +35 -1
  58. package/dist/preact/progress.js +263 -0
  59. package/dist/preact/progress.js.map +1 -1
  60. package/dist/progress.cjs +126 -2
  61. package/dist/progress.cjs.map +1 -1
  62. package/dist/progress.d.cts +3 -21
  63. package/dist/progress.d.ts +3 -21
  64. package/dist/progress.js +126 -2
  65. package/dist/progress.js.map +1 -1
  66. package/dist/react/artifacts.cjs +241 -0
  67. package/dist/react/artifacts.cjs.map +1 -1
  68. package/dist/react/artifacts.d.cts +20 -1
  69. package/dist/react/artifacts.d.ts +20 -1
  70. package/dist/react/artifacts.js +234 -0
  71. package/dist/react/artifacts.js.map +1 -1
  72. package/dist/react/confirmation.cjs +248 -2
  73. package/dist/react/confirmation.cjs.map +1 -1
  74. package/dist/react/confirmation.d.cts +3 -3
  75. package/dist/react/confirmation.d.ts +3 -3
  76. package/dist/react/confirmation.js +244 -4
  77. package/dist/react/confirmation.js.map +1 -1
  78. package/dist/react/display.cjs +418 -2
  79. package/dist/react/display.cjs.map +1 -1
  80. package/dist/react/display.d.cts +20 -3
  81. package/dist/react/display.d.ts +20 -3
  82. package/dist/react/display.js +413 -4
  83. package/dist/react/display.js.map +1 -1
  84. package/dist/react/forms.cjs +20 -17
  85. package/dist/react/forms.cjs.map +1 -1
  86. package/dist/react/forms.js +20 -17
  87. package/dist/react/forms.js.map +1 -1
  88. package/dist/react/progress.cjs +266 -0
  89. package/dist/react/progress.cjs.map +1 -1
  90. package/dist/react/progress.d.cts +17 -1
  91. package/dist/react/progress.d.ts +17 -1
  92. package/dist/react/progress.js +263 -0
  93. package/dist/react/progress.js.map +1 -1
  94. package/package.json +15 -13
  95. package/registry.yaml +34 -21
  96. package/dist/Skeleton.schema-BO0ca2UX.d.cts +0 -135
  97. package/dist/Skeleton.schema-BO0ca2UX.d.ts +0 -135
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/forms/useMosaicForm.logic.ts","../../src/components/forms/useMosaicForm.schema.ts","../../src/runtimes/react/components/forms/useMosaicForm.tsx","../../src/components/forms/FormProvider.logic.ts","../../src/runtimes/react/components/forms/FormProvider.tsx","../../src/runtimes/react/components/forms/FormField.tsx","../../src/components/forms/ErrorDisplay.logic.ts","../../src/runtimes/react/components/forms/ErrorDisplay.tsx","../../src/components/forms/SubmitButton.logic.ts","../../src/components/forms/SubmitButton.schema.ts","../../src/runtimes/react/components/forms/SubmitButton.tsx","../../src/components/forms/Input.logic.ts","../../src/runtimes/react/components/forms/Input.tsx","../../src/components/forms/Textarea.logic.ts","../../src/runtimes/react/components/forms/Textarea.tsx","../../src/components/forms/FieldArray.logic.ts","../../src/runtimes/react/components/forms/FieldArray.tsx","../../src/components/forms/Checkbox.logic.ts","../../src/runtimes/react/components/forms/Checkbox.tsx","../../src/components/forms/MultiSelect.logic.ts","../../src/components/forms/MultiSelect.schema.ts","../../src/runtimes/react/components/forms/MultiSelect.tsx","../../src/components/forms/RadioGroup.logic.ts","../../src/components/forms/RadioGroup.schema.ts","../../src/runtimes/react/components/forms/RadioGroup.tsx","../../src/components/forms/Select.logic.ts","../../src/runtimes/react/components/forms/Select.tsx","../../src/components/forms/ErrorDisplay.schema.ts","../../src/components/forms/FormField.schema.ts","../../src/components/forms/FormProvider.schema.ts","../../src/components/forms/Input.schema.ts","../../src/components/forms/Textarea.schema.ts","../../src/components/forms/FieldArray.schema.ts","../../src/components/forms/Checkbox.schema.ts","../../src/components/forms/Select.schema.ts"],"names":["RhfFormProvider","jsx","z","Controller","useId","jsxs","useRhfFieldArray","useRef","useEffect","useCallback","findNextEnabledIndex","findFirstEnabledIndex","findLastEnabledIndex","useState","useMemo"],"mappings":"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","file":"forms.js","sourcesContent":["import type { MosaicFormMode } from \"./useMosaicForm.schema.js\";\n\n/**\n * Map Mosaic public mode → react-hook-form `mode` config value.\n *\n * RHF accepts the same three strings (`\"onBlur\" | \"onChange\" | \"onSubmit\"`)\n * but a future Mosaic mode could be aliased here (e.g. `\"realtime\"` →\n * `\"onChange\"`). Keeping the mapping in pure logic makes the hook itself\n * trivial and unit-testable without a renderer.\n */\nexport function toRhfMode(mode: MosaicFormMode): \"onBlur\" | \"onChange\" | \"onSubmit\" {\n return mode;\n}\n","import { z } from \"zod\";\n\n/**\n * Validation timing modes. Mosaic default is \"onBlur\" — Chi co-validated decision\n * (Day 102 DM). RHF's full Mode union supports more values; we narrow to the three\n * timings that are safe and predictable for cross-runtime consumers.\n */\nexport const MosaicFormModeSchema = z.enum([\"onBlur\", \"onChange\", \"onSubmit\"]);\nexport type MosaicFormMode = z.infer<typeof MosaicFormModeSchema>;\n\n/**\n * Options accepted by `useMosaicForm`. The Zod schema for the form payload is\n * passed separately (not parsed inside this schema) because it carries runtime\n * type information that the consumer's TSchema generic propagates through.\n */\nexport const UseMosaicFormOptionsSchema = z.object({\n mode: MosaicFormModeSchema.default(\"onBlur\"),\n});\n\nexport type UseMosaicFormOptions = z.infer<typeof UseMosaicFormOptionsSchema>;\n\nexport function validateOptions(raw: unknown): UseMosaicFormOptions {\n return UseMosaicFormOptionsSchema.parse(raw);\n}\n","\"use client\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { type FieldValues, type UseFormReturn, useForm } from \"react-hook-form\";\nimport type { ZodSchema, ZodType } from \"zod\";\nimport { toRhfMode } from \"../../../../components/forms/useMosaicForm.logic.js\";\nimport {\n type MosaicFormMode,\n validateOptions,\n} from \"../../../../components/forms/useMosaicForm.schema.js\";\n\n/**\n * Public options to {@link useMosaicForm}. The Zod `schema` is the runtime\n * validator (and the source of truth for the form payload type). `mode`\n * defaults to `\"onBlur\"` per Chi co-validated decision (Day 102).\n */\nexport interface UseMosaicFormOptions<TSchema extends ZodType> {\n schema: TSchema;\n defaultValues: Partial<ReturnType<TSchema[\"parse\"]>> | ReturnType<TSchema[\"parse\"]>;\n mode?: MosaicFormMode;\n}\n\n/**\n * Return type — the standard RHF `UseFormReturn` extended with two Mosaic\n * metadata fields so consumers (FormField, SubmitButton, FormProvider) can\n * inspect the active schema + timing without re-deriving them.\n */\nexport type UseMosaicFormReturn<TFieldValues extends FieldValues = FieldValues> =\n UseFormReturn<TFieldValues> & {\n mosaicSchema: ZodSchema;\n mosaicMode: MosaicFormMode;\n };\n\n/**\n * Cross-runtime wrapper around `react-hook-form` + `@hookform/resolvers/zod`.\n *\n * - Validates options through Zod (`UseMosaicFormOptionsSchema`) so an invalid\n * `mode` fails loudly at hook-call time rather than silently degrading.\n * - Attaches the schema + mode to the return object as `mosaicSchema` and\n * `mosaicMode` for downstream Mosaic consumers (FieldArray will read these).\n *\n * Compatible with FieldArray (T16) — the return shape extends RHF's, so\n * `useFieldArray({ control: form.control, name: ... })` works verbatim.\n */\nexport function useMosaicForm<TSchema extends ZodType>(\n options: UseMosaicFormOptions<TSchema>,\n): UseMosaicFormReturn<ReturnType<TSchema[\"parse\"]> & FieldValues> {\n const parsedOptions = validateOptions({ mode: options.mode });\n type TValues = ReturnType<TSchema[\"parse\"]> & FieldValues;\n\n const form = useForm<TValues>({\n // biome-ignore lint/suspicious/noExplicitAny: zodResolver's generic shape forces a cast at this boundary\n resolver: zodResolver(options.schema as any),\n defaultValues: options.defaultValues as TValues,\n mode: toRhfMode(parsedOptions.mode),\n });\n\n const extended = form as UseMosaicFormReturn<TValues>;\n extended.mosaicSchema = options.schema as ZodSchema;\n extended.mosaicMode = parsedOptions.mode;\n return extended;\n}\n","/**\n * Shared error messages for the FormProvider runtime layer.\n */\nexport const FORM_PROVIDER_CONTEXT_MISSING =\n \"useMosaicFormContext must be used inside <FormProvider>. Wrap your tree with <FormProvider form={...}> from @vantageos/mosaic/{react,preact}/forms.\";\n","\"use client\";\n\nimport { type ReactNode, createContext, useContext } from \"react\";\nimport { type FieldValues, FormProvider as RhfFormProvider } from \"react-hook-form\";\nimport { FORM_PROVIDER_CONTEXT_MISSING } from \"../../../../components/forms/FormProvider.logic.js\";\nimport type { UseMosaicFormReturn } from \"./useMosaicForm.js\";\n\n// The context value is erased to the default `FieldValues` generic — callers\n// of `useMosaicFormContext()` cast back to their narrow form shape when needed.\n// This avoids the invariance pitfall of trying to store a typed-narrow form\n// in a global context typed at the loose default.\nconst MosaicFormContext = createContext<UseMosaicFormReturn | null>(null);\n\nexport interface FormProviderProps<TValues extends FieldValues = FieldValues> {\n form: UseMosaicFormReturn<TValues>;\n children: ReactNode;\n}\n\n/**\n * Wraps `react-hook-form`'s native `<FormProvider>` AND a Mosaic-specific\n * context that carries the extended metadata (`mosaicSchema`, `mosaicMode`).\n * Consumer components read either context — Mosaic's own for metadata,\n * RHF's for register/control/handleSubmit access.\n */\nexport function FormProvider<TValues extends FieldValues = FieldValues>({\n form,\n children,\n}: FormProviderProps<TValues>) {\n return (\n <MosaicFormContext.Provider value={form as unknown as UseMosaicFormReturn}>\n <RhfFormProvider {...form}>{children}</RhfFormProvider>\n </MosaicFormContext.Provider>\n );\n}\n\n/**\n * Read the Mosaic-extended form context. Throws if called outside a\n * `<FormProvider>` so consumer bugs surface immediately.\n *\n * Generic `TValues` lets callers narrow back to their original form shape.\n */\nexport function useMosaicFormContext<\n TValues extends FieldValues = FieldValues,\n>(): UseMosaicFormReturn<TValues> {\n const ctx = useContext(MosaicFormContext);\n if (!ctx) {\n throw new Error(FORM_PROVIDER_CONTEXT_MISSING);\n }\n return ctx as unknown as UseMosaicFormReturn<TValues>;\n}\n","\"use client\";\n\nimport type { ReactElement } from \"react\";\nimport {\n Controller,\n type ControllerFieldState,\n type ControllerRenderProps,\n type FieldValues,\n type Path,\n type UseFormStateReturn,\n} from \"react-hook-form\";\nimport { useMosaicFormContext } from \"./FormProvider.js\";\n\nexport interface FormFieldRenderArgs<TValues extends FieldValues = FieldValues> {\n field: ControllerRenderProps<TValues>;\n fieldState: ControllerFieldState;\n formState: UseFormStateReturn<TValues>;\n}\n\nexport interface FormFieldProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n children: (args: FormFieldRenderArgs<TValues>) => ReactElement;\n}\n\n/**\n * Render-prop wrapper around RHF's `Controller`. Pulls `control` from the\n * surrounding `<FormProvider>` so consumers never thread it manually.\n */\nexport function FormField<TValues extends FieldValues = FieldValues>({\n name,\n children,\n}: FormFieldProps<TValues>) {\n const form = useMosaicFormContext() as unknown as { control: unknown };\n return (\n <Controller\n // biome-ignore lint/suspicious/noExplicitAny: bridging FormProvider's erased generic to Controller\n control={form.control as any}\n name={name as never}\n render={({ field, fieldState, formState }) =>\n children({\n field: field as unknown as ControllerRenderProps<TValues>,\n fieldState,\n formState: formState as unknown as UseFormStateReturn<TValues>,\n })\n }\n />\n );\n}\n","import type { FieldErrorShape } from \"./ErrorDisplay.schema.js\";\n\n/**\n * Pure formatter shared by React + Preact runtimes.\n *\n * Priority order:\n * 1. `error.message` set by Zod/RHF → win (explicit wins).\n * 2. `messageMap[error.type]` → consumer-controlled i18n fallback.\n * 3. Generic fallback string (\"Invalid value\").\n */\nexport function formatErrorMessage(\n error: FieldErrorShape | undefined,\n messageMap: Record<string, string> | undefined,\n): string | undefined {\n if (!error) return undefined;\n if (error.message && error.message.length > 0) return error.message;\n const mapped = messageMap?.[error.type];\n if (mapped && mapped.length > 0) return mapped;\n return \"Invalid value\";\n}\n","\"use client\";\n\nimport { formatErrorMessage } from \"../../../../components/forms/ErrorDisplay.logic.js\";\nimport type { FieldErrorShape } from \"../../../../components/forms/ErrorDisplay.schema.js\";\n\nexport interface ErrorDisplayProps {\n error?: FieldErrorShape;\n messageMap?: Record<string, string>;\n className?: string;\n}\n\n/**\n * Single-field error formatter. Renders nothing when `error` is undefined\n * (no error to show), otherwise emits a `role=\"alert\"` element with the\n * resolved message. Message resolution is delegated to the pure\n * `formatErrorMessage` helper so React and Preact runtimes share behavior.\n */\nexport function ErrorDisplay({ error, messageMap, className }: ErrorDisplayProps) {\n const message = formatErrorMessage(error, messageMap);\n if (!message) return null;\n return (\n <span role=\"alert\" className={className ?? \"mosaic-forms-error\"}>\n {message}\n </span>\n );\n}\n","/**\n * Pure state machine for SubmitButton, shared by React + Preact runtimes.\n *\n * | isValid | isSubmitting | disabled | loading |\n * |---------|--------------|----------|---------|\n * | false | false | true | false |\n * | false | true | true | true |\n * | true | false | false | false |\n * | true | true | true | true |\n *\n * `loading` reflects the submit-in-flight state regardless of validity, so\n * consumers can show a spinner even if downstream validation rejects.\n */\nexport function computeSubmitButtonState(input: {\n isValid: boolean;\n isSubmitting: boolean;\n}): { disabled: boolean; loading: boolean } {\n return {\n disabled: input.isSubmitting || !input.isValid,\n loading: input.isSubmitting,\n };\n}\n","import { z } from \"zod\";\n\nexport const SubmitButtonPropsSchema = z.object({\n label: z.string().min(1).default(\"Submit\"),\n loadingLabel: z.string().min(1).default(\"Submitting…\"),\n});\n\nexport type SubmitButtonPropsValidated = z.infer<typeof SubmitButtonPropsSchema>;\n\nexport function validateSubmitButtonProps(raw: unknown): SubmitButtonPropsValidated {\n return SubmitButtonPropsSchema.parse(raw);\n}\n","\"use client\";\n\nimport { computeSubmitButtonState } from \"../../../../components/forms/SubmitButton.logic.js\";\nimport { validateSubmitButtonProps } from \"../../../../components/forms/SubmitButton.schema.js\";\nimport { useMosaicFormContext } from \"./FormProvider.js\";\n\nexport interface SubmitButtonProps {\n label?: string;\n loadingLabel?: string;\n className?: string;\n}\n\n/**\n * Form submit button bound to the surrounding `<FormProvider>` form state.\n * Disabled while `formState.isValid` is false OR `formState.isSubmitting`\n * is true. While submitting, the loading label replaces the default label.\n */\nexport function SubmitButton(props: SubmitButtonProps) {\n const { label, loadingLabel } = validateSubmitButtonProps({\n label: props.label,\n loadingLabel: props.loadingLabel,\n });\n const form = useMosaicFormContext();\n const { isValid, isSubmitting } = form.formState;\n const { disabled, loading } = computeSubmitButtonState({ isValid, isSubmitting });\n\n return (\n <button\n type=\"submit\"\n disabled={disabled}\n aria-busy={loading || undefined}\n className={props.className ?? \"mosaic-forms-submit\"}\n >\n {loading ? loadingLabel : label}\n </button>\n );\n}\n","/**\n * Pure helpers for Input. Runtime-agnostic — shared between React and Preact\n * runtimes via the `src/components/forms/` co-location pattern (Standard §18.2).\n */\n\nimport type { InputType } from \"./Input.schema.js\";\n\n/**\n * Build the deterministic input element id from form name + field name.\n * Used to wire `<label htmlFor>`, `aria-describedby` and the error element id.\n *\n * Mirrors `buildFieldId` from `FormField.logic.ts` but namespaced for Input so\n * future primitives (Textarea, Select) can compose their own id conventions.\n */\nexport function buildInputId(formName: string | undefined, fieldName: string): string {\n return formName ? `${formName}-${fieldName}` : `mosaic-input-${fieldName}`;\n}\n\n/**\n * `aria-describedby` value — the id of the error element, only emitted when an\n * error exists. Otherwise undefined (omit the attribute entirely).\n */\nexport function buildErrorDescribedBy(inputId: string, hasError: boolean): string | undefined {\n return hasError ? `${inputId}-error` : undefined;\n}\n\n/**\n * Map our public `type` prop to the HTML `type` attribute. Currently a 1:1\n * passthrough — the indirection exists so future types (e.g. `search`,\n * `tel`) can be widened without touching the runtime components.\n */\nexport function resolveHtmlType(type: InputType | undefined): InputType {\n return type ?? \"text\";\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport {\n Controller,\n type ControllerRenderProps,\n type FieldValues,\n type Path,\n} from \"react-hook-form\";\nimport { formatErrorMessage } from \"../../../../components/forms/ErrorDisplay.logic.js\";\nimport {\n buildErrorDescribedBy,\n resolveHtmlType,\n} from \"../../../../components/forms/Input.logic.js\";\nimport type { InputType } from \"../../../../components/forms/Input.schema.js\";\nimport { useMosaicFormContext } from \"./FormProvider.js\";\n\nexport interface InputProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n /** HTML input type. Defaults to `\"text\"`. */\n type?: InputType;\n /** Consumer-driven i18n label. Wired via `<label htmlFor>` to the input. */\n label: string;\n placeholder?: string;\n disabled?: boolean;\n autoComplete?: string;\n /** Optional consumer override for the wrapping element id. */\n id?: string;\n /** Optional error code → message map for i18n. */\n messageMap?: Record<string, string>;\n className?: string;\n inputClassName?: string;\n errorClassName?: string;\n}\n\n/**\n * Cross-runtime Input primitive (forms category, T11). Binds an `<input>` to\n * the surrounding `<FormProvider>` via `react-hook-form`'s `Controller`.\n *\n * - Consumer-driven i18n: every user-visible string flows in as a prop.\n * - a11y: `<label htmlFor>` pair, `aria-invalid` toggled by validation state,\n * `aria-describedby` linking the error element when present.\n * - Validation timing inherits the form's `mode` (default `\"onBlur\"`, Day 102 DM).\n */\nexport function Input<TValues extends FieldValues = FieldValues>({\n name,\n type,\n label,\n placeholder,\n disabled,\n autoComplete,\n id,\n messageMap,\n className,\n inputClassName,\n errorClassName,\n}: InputProps<TValues>) {\n const form = useMosaicFormContext() as unknown as { control: unknown };\n const reactId = useId();\n const inputId = id ?? `mosaic-input-${reactId.replace(/[^a-zA-Z0-9_-]/g, \"\")}-${String(name)}`;\n const htmlType = resolveHtmlType(type);\n\n return (\n <Controller\n // biome-ignore lint/suspicious/noExplicitAny: bridging FormProvider's erased generic to Controller\n control={form.control as any}\n name={name as never}\n render={({ field, fieldState }) => {\n const f = field as unknown as ControllerRenderProps<TValues>;\n const hasError = Boolean(fieldState.error);\n const describedBy = buildErrorDescribedBy(inputId, hasError);\n const message = formatErrorMessage(\n fieldState.error\n ? { type: fieldState.error.type, message: fieldState.error.message }\n : undefined,\n messageMap,\n );\n const value = (f.value as string | number | undefined) ?? \"\";\n return (\n <div className={className ?? \"mosaic-forms-input\"}>\n <label htmlFor={inputId}>{label}</label>\n <input\n id={inputId}\n name={f.name}\n type={htmlType}\n value={value}\n onChange={f.onChange}\n onBlur={f.onBlur}\n ref={f.ref}\n placeholder={placeholder}\n disabled={disabled ?? false}\n autoComplete={autoComplete}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={inputClassName}\n />\n {hasError && message ? (\n <span\n id={`${inputId}-error`}\n role=\"alert\"\n className={errorClassName ?? \"mosaic-forms-error\"}\n >\n {message}\n </span>\n ) : null}\n </div>\n );\n }}\n />\n );\n}\n","/**\n * Pure helpers for Textarea, shared by React + Preact runtimes.\n *\n * No DOM, no framework imports. Keeps the runtime surface a thin shell so\n * Standard §18 cross-runtime parity holds by reference.\n */\n\nexport const DEFAULT_TEXTAREA_ROWS = 3;\n\n/**\n * Clamp an input value to `maxLength` characters. When `maxLength` is undefined\n * (no cap), returns the value unchanged. When the input already fits, returns\n * the value unchanged (identity — avoids needless state churn in RHF).\n */\nexport function clampToMaxLength(value: string, maxLength: number | undefined): string {\n if (maxLength === undefined) return value;\n if (value.length <= maxLength) return value;\n return value.slice(0, maxLength);\n}\n\n/**\n * Resolve the effective `rows` attribute for the rendered <textarea>.\n * Returns `DEFAULT_TEXTAREA_ROWS` when undefined or invalid (≤ 0).\n */\nexport function resolveRows(rows: number | undefined): number {\n if (rows === undefined) return DEFAULT_TEXTAREA_ROWS;\n if (!Number.isFinite(rows) || rows < 1) return DEFAULT_TEXTAREA_ROWS;\n return Math.floor(rows);\n}\n\n/**\n * Compute the next height (in pixels) for an autoResize textarea given the\n * `scrollHeight` reported by the DOM. Returned as a number; runtime applies it\n * via `style.height = `${n}px``. Keeps the math testable without a DOM.\n *\n * Min height honored when scrollHeight is implausible (≤ 0 in jsdom).\n */\nexport function computeAutoResizeHeight(scrollHeight: number, minHeightPx: number): number {\n if (!Number.isFinite(scrollHeight) || scrollHeight <= 0) return minHeightPx;\n return Math.max(scrollHeight, minHeightPx);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useId, useRef } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport {\n DEFAULT_TEXTAREA_ROWS,\n clampToMaxLength,\n computeAutoResizeHeight,\n resolveRows,\n} from \"../../../../components/forms/Textarea.logic.js\";\nimport { ErrorDisplay } from \"./ErrorDisplay.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface TextareaProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n rows?: number;\n maxLength?: number;\n autoResize?: boolean;\n placeholder?: string;\n disabled?: boolean;\n label?: string;\n className?: string;\n /** Optional i18n map passed through to `ErrorDisplay` for error type → message. */\n errorMessageMap?: Record<string, string>;\n}\n\n/**\n * Multi-line text input form primitive.\n *\n * Wraps `FormField` (RHF Controller) and renders a native `<textarea>` with:\n * - `rows` default 3 (see `resolveRows`).\n * - `maxLength` enforcement at the onChange boundary via `clampToMaxLength`.\n * - Optional `autoResize` — grows the element to fit content on each input event.\n * - `aria-invalid` toggled when the field has a validation error.\n * - `aria-describedby` wired to the `ErrorDisplay` element when an error exists.\n * - Bilingual-ready: `label`, `placeholder`, and `errorMessageMap` are caller-supplied\n * strings — Mosaic does not bake locale-specific copy into the component.\n */\nexport function Textarea<TValues extends FieldValues = FieldValues>(props: TextareaProps<TValues>) {\n const {\n name,\n rows,\n maxLength,\n autoResize = false,\n placeholder,\n disabled,\n label,\n className,\n errorMessageMap,\n } = props;\n const effectiveRows = resolveRows(rows);\n const reactId = useId();\n const fieldId = `mosaic-textarea-${reactId}`;\n const errorId = `${fieldId}-error`;\n\n return (\n <FormField<TValues> name={name}>\n {({ field, fieldState }) => {\n const hasError = Boolean(fieldState.error);\n return (\n <TextareaInner\n id={fieldId}\n errorId={errorId}\n label={label}\n value={(field.value as string | undefined) ?? \"\"}\n onChange={(next) => field.onChange(clampToMaxLength(next, maxLength))}\n onBlur={field.onBlur}\n rows={effectiveRows}\n maxLength={maxLength}\n autoResize={autoResize}\n placeholder={placeholder}\n disabled={disabled}\n hasError={hasError}\n className={className}\n >\n <ErrorDisplay\n error={\n fieldState.error\n ? {\n type: fieldState.error.type ?? \"validation\",\n message: fieldState.error.message,\n }\n : undefined\n }\n messageMap={errorMessageMap}\n className=\"mosaic-forms-error\"\n />\n </TextareaInner>\n );\n }}\n </FormField>\n );\n}\n\ninterface TextareaInnerProps {\n id: string;\n errorId: string;\n label: string | undefined;\n value: string;\n onChange: (next: string) => void;\n onBlur: () => void;\n rows: number;\n maxLength: number | undefined;\n autoResize: boolean;\n placeholder: string | undefined;\n disabled: boolean | undefined;\n hasError: boolean;\n className: string | undefined;\n children: React.ReactNode;\n}\n\nfunction TextareaInner(props: TextareaInnerProps) {\n const {\n id,\n errorId,\n label,\n value,\n onChange,\n onBlur,\n rows,\n maxLength,\n autoResize,\n placeholder,\n disabled,\n hasError,\n className,\n children,\n } = props;\n const ref = useRef<HTMLTextAreaElement | null>(null);\n\n const resize = useCallback(() => {\n if (!autoResize) return;\n const el = ref.current;\n if (!el) return;\n // Reset first so scrollHeight reflects the *content*, not the previous box.\n el.style.height = \"auto\";\n const minPx = rows * 20; // ~20px per row baseline (jsdom-friendly fallback).\n const next = computeAutoResizeHeight(el.scrollHeight, minPx);\n el.style.height = `${next}px`;\n }, [autoResize, rows]);\n\n // Resize on mount + whenever the bound value changes (covers external updates).\n useEffect(() => {\n resize();\n }, [resize]);\n\n return (\n <div className={className ?? \"mosaic-forms-textarea\"}>\n {label ? (\n <label htmlFor={id} className=\"mosaic-forms-textarea-label\">\n {label}\n </label>\n ) : null}\n <textarea\n ref={ref}\n id={id}\n value={value}\n rows={rows}\n maxLength={maxLength}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n onChange={(e) => {\n onChange(e.target.value);\n resize();\n }}\n onBlur={onBlur}\n />\n <div id={errorId}>{children}</div>\n </div>\n );\n}\n\nexport { DEFAULT_TEXTAREA_ROWS };\n","/**\n * Pure helpers for FieldArray. Runtime-agnostic — covers ARIA id generation\n * and aria-label conventions used by the React + Preact runtimes.\n *\n * `useFieldArray` itself is a thin wrapper around RHF's hook (live in the\n * runtime layer) — these helpers are the cross-runtime contract that the\n * wrapper and Storybook stories share.\n */\n\n/** Default aria-label for the wrapping list element. */\nexport function buildListAriaLabel(name: string): string {\n return `${name} items`;\n}\n\n/** Default aria-label for the per-item Remove button. */\nexport function buildRemoveAriaLabel(name: string, index: number): string {\n return `Remove ${name} item ${index + 1}`;\n}\n\n/** Default aria-label for the Add button (consumer-rendered). */\nexport function buildAddAriaLabel(name: string): string {\n return `Add ${name} item`;\n}\n\n/**\n * After removing item at `removedIndex` from an array of `previousLength`\n * items, return the index that should receive focus. Clamps to the last\n * remaining index, or `-1` if the list became empty.\n */\nexport function nextFocusIndexAfterRemove(previousLength: number, removedIndex: number): number {\n if (previousLength <= 1) return -1;\n const newLength = previousLength - 1;\n return Math.min(removedIndex, newLength - 1);\n}\n","\"use client\";\n\nimport type { ReactElement } from \"react\";\nimport {\n type ArrayPath,\n type FieldArrayWithId,\n type FieldValues,\n type FieldArray as RhfFieldArray,\n useFieldArray as useRhfFieldArray,\n} from \"react-hook-form\";\nimport {\n buildListAriaLabel,\n buildRemoveAriaLabel,\n} from \"../../../../components/forms/FieldArray.logic.js\";\nimport { useMosaicFormContext } from \"./FormProvider.js\";\n\n// ─── Hook: thin RHF wrapper ───────────────────────────────────────────────────\n\nexport interface UseFieldArrayOptions<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> {\n name: TName;\n /**\n * Optional control override. When omitted, `useFieldArray` reads control\n * from the surrounding `<FormProvider>`, mirroring `FormField`'s contract.\n */\n // biome-ignore lint/suspicious/noExplicitAny: bridging FormProvider's erased generic to RHF control\n control?: any;\n}\n\n/**\n * Public return type for `useFieldArray` — mirrors RHF's native return\n * (`fields`, `append`, `remove`, `move`, `swap`, plus `insert`, `prepend`,\n * `replace`, `update` for advanced cases).\n */\nexport type UseFieldArrayReturn<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> = ReturnType<typeof useRhfFieldArray<TValues, TName, \"id\">>;\n\n/**\n * Thin wrapper around RHF's `useFieldArray`. Reads `control` from the\n * surrounding `<FormProvider>` when not provided, mirroring `FormField`.\n * Exposes `{ fields, append, remove, move, swap }` and the rest of RHF's\n * native return for advanced cases (insert, prepend, replace, update).\n */\nexport function useFieldArray<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n>({ name, control }: UseFieldArrayOptions<TValues, TName>) {\n const ctx = useMosaicFormContext() as unknown as { control: unknown };\n const resolvedControl = control ?? ctx.control;\n return useRhfFieldArray<TValues, TName, \"id\">({\n // biome-ignore lint/suspicious/noExplicitAny: bridging erased generic\n control: resolvedControl as any,\n name: name as never,\n });\n}\n\n// ─── Component: render-prop wrapper ───────────────────────────────────────────\n\nexport interface FieldArrayRenderItemArgs<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> {\n field: FieldArrayWithId<TValues, TName, \"id\">;\n index: number;\n}\n\nexport interface FieldArrayControls<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> {\n fields: ReadonlyArray<FieldArrayWithId<TValues, TName, \"id\">>;\n append: (value: RhfFieldArray<TValues, TName> | RhfFieldArray<TValues, TName>[]) => void;\n remove: (index?: number | number[]) => void;\n move: (from: number, to: number) => void;\n swap: (a: number, b: number) => void;\n}\n\nexport interface FieldArrayProps<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> {\n name: TName;\n /**\n * Render-prop called for each item. Receives the RHF field (with stable\n * `.id`), the current index, and the controls bag for inline buttons.\n */\n children: (\n args: FieldArrayRenderItemArgs<TValues, TName>,\n controls: FieldArrayControls<TValues, TName>,\n ) => ReactElement;\n /** Override the default `aria-label` on the list root. */\n ariaLabel?: string;\n}\n\n/**\n * Render-prop wrapper around RHF's `useFieldArray`. Reads control from the\n * surrounding `<FormProvider>`. Emits an a11y-compliant `role=\"list\"` shell\n * with `role=\"listitem\"` rows keyed by RHF's stable `field.id` (NOT array\n * index — required for stable React reconciliation across move/remove).\n */\nexport function FieldArray<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n>({ name, children, ariaLabel }: FieldArrayProps<TValues, TName>) {\n const ctx = useMosaicFormContext() as unknown as { control: unknown };\n const { fields, append, remove, move, swap } = useRhfFieldArray<TValues, TName, \"id\">({\n // biome-ignore lint/suspicious/noExplicitAny: bridging erased generic\n control: ctx.control as any,\n name: name as never,\n });\n const controls: FieldArrayControls<TValues, TName> = {\n fields: fields as ReadonlyArray<FieldArrayWithId<TValues, TName, \"id\">>,\n append,\n remove,\n move,\n swap,\n };\n return (\n <ul\n aria-label={ariaLabel ?? buildListAriaLabel(name as string)}\n style={{ listStyle: \"none\", padding: 0, margin: 0 }}\n >\n {fields.map((field, index) => (\n <li\n key={field.id}\n data-mosaic-fieldarray-item\n data-mosaic-fieldarray-name={name as string}\n data-mosaic-fieldarray-index={index}\n >\n {children(\n {\n field: field as FieldArrayWithId<TValues, TName, \"id\">,\n index,\n },\n controls,\n )}\n </li>\n ))}\n </ul>\n );\n}\n\n// Re-export a11y helpers so consumers can label their Add/Remove buttons\n// consistently with the runtime defaults.\nexport { buildListAriaLabel, buildRemoveAriaLabel };\n","/**\n * Pure helpers for Checkbox, shared by React + Preact runtimes.\n *\n * No DOM, no framework imports. Keeps the runtime surface a thin shell so\n * Standard §18 cross-runtime parity holds by reference.\n */\n\n/**\n * Resolve the effective `aria-checked` attribute value for the rendered\n * `<input type=\"checkbox\">`.\n *\n * - `indeterminate=true` → `\"mixed\"` (ARIA tri-state semantics).\n * - `checked=true` → `true`.\n * - otherwise → `false`.\n *\n * The DOM `.indeterminate` property must be set via a ref — it is not an HTML\n * attribute and cannot be set declaratively. This helper only computes the\n * ARIA value; the runtime is responsible for the DOM side-effect.\n */\nexport function resolveAriaChecked(\n checked: boolean,\n indeterminate: boolean | undefined,\n): boolean | \"mixed\" {\n if (indeterminate) return \"mixed\";\n return checked;\n}\n\n/**\n * Compute the accessible description ID to wire into `aria-describedby`.\n *\n * Returns the `descriptionId` when a `description` string is provided,\n * or `undefined` when no description is present so the attribute is omitted.\n * A falsy description short-circuits to prevent empty `aria-describedby=\"\"`.\n */\nexport function resolveDescribedBy(\n descriptionId: string,\n description: string | undefined,\n hasError: boolean,\n errorId: string,\n): string | undefined {\n const parts: string[] = [];\n if (description) parts.push(descriptionId);\n if (hasError) parts.push(errorId);\n return parts.length > 0 ? parts.join(\" \") : undefined;\n}\n","\"use client\";\n\nimport { useEffect, useId, useRef } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport {\n resolveAriaChecked,\n resolveDescribedBy,\n} from \"../../../../components/forms/Checkbox.logic.js\";\nimport { ErrorDisplay } from \"./ErrorDisplay.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface CheckboxProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n label: string;\n disabled?: boolean;\n indeterminate?: boolean;\n description?: string;\n className?: string;\n /** Optional i18n map passed through to `ErrorDisplay` for error type → message. */\n errorMessageMap?: Record<string, string>;\n}\n\n/**\n * Boolean checkbox form primitive with indeterminate state support.\n *\n * Wraps `FormField` (RHF Controller) and renders a native `<input type=\"checkbox\">` with:\n * - `indeterminate` prop — sets DOM `.indeterminate = true` via ref + `aria-checked=\"mixed\"`.\n * - `description` — rendered in a `<span>` and wired via `aria-describedby`.\n * - `aria-invalid` toggled when the field has a validation error.\n * - `aria-describedby` includes the error ID when an error exists.\n * - Bilingual-ready: `label`, `description`, and `errorMessageMap` are caller-supplied.\n */\nexport function Checkbox<TValues extends FieldValues = FieldValues>(props: CheckboxProps<TValues>) {\n const { name, label, disabled, indeterminate, description, className, errorMessageMap } = props;\n const reactId = useId();\n const fieldId = `mosaic-checkbox-${reactId}`;\n const errorId = `${fieldId}-error`;\n const descriptionId = `${fieldId}-description`;\n\n return (\n <FormField<TValues> name={name}>\n {({ field, fieldState }) => {\n const hasError = Boolean(fieldState.error);\n return (\n <CheckboxInner\n id={fieldId}\n errorId={errorId}\n descriptionId={descriptionId}\n label={label}\n checked={(field.value as boolean | undefined) ?? false}\n onChange={(next) => field.onChange(next)}\n onBlur={field.onBlur}\n disabled={disabled}\n indeterminate={indeterminate}\n description={description}\n hasError={hasError}\n className={className}\n >\n <ErrorDisplay\n error={\n fieldState.error\n ? {\n type: fieldState.error.type ?? \"validation\",\n message: fieldState.error.message,\n }\n : undefined\n }\n messageMap={errorMessageMap}\n className=\"mosaic-forms-error\"\n />\n </CheckboxInner>\n );\n }}\n </FormField>\n );\n}\n\ninterface CheckboxInnerProps {\n id: string;\n errorId: string;\n descriptionId: string;\n label: string;\n checked: boolean;\n onChange: (next: boolean) => void;\n onBlur: () => void;\n disabled: boolean | undefined;\n indeterminate: boolean | undefined;\n description: string | undefined;\n hasError: boolean;\n className: string | undefined;\n children: React.ReactNode;\n}\n\nfunction CheckboxInner(props: CheckboxInnerProps) {\n const {\n id,\n errorId,\n descriptionId,\n label,\n checked,\n onChange,\n onBlur,\n disabled,\n indeterminate,\n description,\n hasError,\n className,\n children,\n } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n\n // DOM .indeterminate is not a declarative HTML attribute — must be set via ref.\n useEffect(() => {\n if (ref.current) {\n ref.current.indeterminate = Boolean(indeterminate);\n }\n }, [indeterminate]);\n\n const ariaChecked = resolveAriaChecked(checked, indeterminate);\n const describedBy = resolveDescribedBy(descriptionId, description, hasError, errorId);\n\n return (\n <div className={className ?? \"mosaic-forms-checkbox\"}>\n <label htmlFor={id} className=\"mosaic-forms-checkbox-label\">\n <input\n ref={ref}\n type=\"checkbox\"\n id={id}\n checked={checked}\n disabled={disabled}\n aria-checked={ariaChecked}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.checked)}\n onBlur={onBlur}\n />\n {label}\n </label>\n {description ? (\n <span id={descriptionId} className=\"mosaic-forms-checkbox-description\">\n {description}\n </span>\n ) : null}\n <div id={errorId}>{children}</div>\n </div>\n );\n}\n","import type { MultiSelectOption } from \"./MultiSelect.schema.js\";\n\n/**\n * Returns the list of options that are still available for selection.\n * Filters out options already present in `selected` so they don't appear\n * twice in the dropdown.\n */\nexport function getAvailableOptions(\n options: ReadonlyArray<MultiSelectOption>,\n selected: ReadonlyArray<string>,\n): MultiSelectOption[] {\n const set = new Set(selected);\n return options.filter((opt) => !set.has(opt.value));\n}\n\n/**\n * Returns the matching `MultiSelectOption` records for the currently selected\n * values, preserving the order of `selected`. Unknown values are silently\n * dropped (graceful — schema may have shrunk under the field).\n */\nexport function getSelectedOptions(\n options: ReadonlyArray<MultiSelectOption>,\n selected: ReadonlyArray<string>,\n): MultiSelectOption[] {\n const byValue = new Map(options.map((opt) => [opt.value, opt]));\n const out: MultiSelectOption[] = [];\n for (const value of selected) {\n const opt = byValue.get(value);\n if (opt) out.push(opt);\n }\n return out;\n}\n\n/**\n * Search filter applied when `searchable=true`. Case-insensitive substring\n * match on both `label` and `value`. Empty query returns the input as-is.\n */\nexport function filterBySearch(\n options: ReadonlyArray<MultiSelectOption>,\n query: string,\n): MultiSelectOption[] {\n const q = query.trim().toLowerCase();\n if (q.length === 0) return [...options];\n return options.filter(\n (opt) => opt.label.toLowerCase().includes(q) || opt.value.toLowerCase().includes(q),\n );\n}\n\n/**\n * Adds a value to the selected list, enforcing `maxItems` (when set) and\n * de-duplicating. Returns the same array reference when the value is already\n * present OR the cap is reached — callers can compare identity to detect\n * the no-op.\n */\nexport function addValue(\n current: ReadonlyArray<string>,\n value: string,\n maxItems?: number,\n): string[] {\n if (current.includes(value)) return current as string[];\n if (typeof maxItems === \"number\" && current.length >= maxItems) return current as string[];\n return [...current, value];\n}\n\n/**\n * Removes a value from the selected list. Returns a fresh array even when\n * the value is absent so callers always see a stable shape.\n */\nexport function removeValue(current: ReadonlyArray<string>, value: string): string[] {\n return current.filter((v) => v !== value);\n}\n\n/**\n * True when the cap is reached. Used to gate further selections AND to\n * announce the locked state to the dropdown trigger via `aria-disabled`\n * semantics (the trigger itself stays focusable to preserve removal flows).\n */\nexport function isAtMaxItems(\n current: ReadonlyArray<string>,\n maxItems: number | undefined,\n): boolean {\n return typeof maxItems === \"number\" && current.length >= maxItems;\n}\n","import { z } from \"zod\";\n\n/**\n * MultiSelect props — multi-value dropdown with removable chip rendering for\n * the currently selected items. The schema validates static, serializable\n * props only. Runtime callbacks (RHF `field.onChange`, `field.onBlur`) are\n * threaded by `FormField` and live on the React/Preact interface.\n */\nexport const MultiSelectOptionSchema = z.object({\n value: z.string().min(1),\n label: z.string().min(1),\n});\n\nexport const MultiSelectPropsSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n options: z.array(MultiSelectOptionSchema).min(1),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n searchable: z.boolean().optional(),\n maxItems: z.number().int().positive().optional(),\n});\n\nexport type MultiSelectOption = z.infer<typeof MultiSelectOptionSchema>;\nexport type MultiSelectPropsValidated = z.infer<typeof MultiSelectPropsSchema>;\n","\"use client\";\n\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport {\n addValue,\n filterBySearch,\n getAvailableOptions,\n getSelectedOptions,\n isAtMaxItems,\n removeValue,\n} from \"../../../../components/forms/MultiSelect.logic.js\";\nimport { MultiSelectPropsSchema } from \"../../../../components/forms/MultiSelect.schema.js\";\nimport type { MultiSelectOption } from \"../../../../components/forms/MultiSelect.schema.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface MultiSelectProps {\n name: string;\n label: string;\n options: MultiSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n searchable?: boolean;\n maxItems?: number;\n className?: string;\n}\n\n/**\n * Multi-value dropdown. Bound to RHF via `FormField` — value lives at\n * `form.values[name]` as `string[]`. Selected values render as removable\n * chips; the dropdown lists only unselected options. WCAG-AA combobox\n * pattern: `role=combobox aria-multiselectable=true`, chip removal via\n * Backspace / Delete / per-chip close icon, Tab + Arrow nav.\n */\nexport function MultiSelect(props: MultiSelectProps) {\n const parsed = MultiSelectPropsSchema.parse({\n name: props.name,\n label: props.label,\n options: props.options,\n placeholder: props.placeholder,\n disabled: props.disabled,\n searchable: props.searchable,\n maxItems: props.maxItems,\n });\n const { name, label, options, placeholder, disabled, searchable, maxItems } = parsed;\n\n const reactId = useId();\n const triggerId = `${reactId}-trigger`;\n const listboxId = `${reactId}-listbox`;\n const labelId = `${reactId}-label`;\n\n return (\n <FormField name={name}>\n {({ field }) => {\n // RHF field.value is `unknown` (erased generic). We tighten to string[].\n const value: string[] = Array.isArray(field.value) ? (field.value as string[]) : [];\n return (\n <Inner\n triggerId={triggerId}\n listboxId={listboxId}\n labelId={labelId}\n label={label}\n options={options}\n value={value}\n disabled={disabled}\n searchable={searchable}\n maxItems={maxItems}\n placeholder={placeholder}\n onChange={(next) => field.onChange(next)}\n onBlur={() => field.onBlur()}\n className={props.className}\n />\n );\n }}\n </FormField>\n );\n}\n\ninterface InnerProps {\n triggerId: string;\n listboxId: string;\n labelId: string;\n label: string;\n options: MultiSelectOption[];\n value: string[];\n disabled?: boolean;\n searchable?: boolean;\n maxItems?: number;\n placeholder?: string;\n className?: string;\n onChange: (next: string[]) => void;\n onBlur: () => void;\n}\n\nfunction Inner(p: InnerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n\n const selectedOptions = useMemo(\n () => getSelectedOptions(p.options, p.value),\n [p.options, p.value],\n );\n const availableAfterSelect = useMemo(\n () => getAvailableOptions(p.options, p.value),\n [p.options, p.value],\n );\n const visibleOptions = useMemo(\n () => (p.searchable ? filterBySearch(availableAfterSelect, query) : availableAfterSelect),\n [availableAfterSelect, p.searchable, query],\n );\n const atMax = isAtMaxItems(p.value, p.maxItems);\n\n const handleSelect = useCallback(\n (val: string) => {\n const next = addValue(p.value, val, p.maxItems);\n if (next !== p.value) {\n p.onChange(next);\n }\n setQuery(\"\");\n },\n [p],\n );\n\n const handleRemove = useCallback(\n (val: string) => {\n p.onChange(removeValue(p.value, val));\n },\n [p],\n );\n\n const handleTriggerKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (p.disabled) return;\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\n const last = p.value[p.value.length - 1];\n if (last !== undefined) {\n e.preventDefault();\n handleRemove(last);\n }\n return;\n }\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setOpen(true);\n setActiveIndex(0);\n return;\n }\n if (e.key === \"Escape\") {\n setOpen(false);\n }\n },\n [p.disabled, p.value, handleRemove],\n );\n\n const handleListKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLUListElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, Math.max(visibleOptions.length - 1, 0)));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n const opt = visibleOptions[activeIndex];\n if (opt) handleSelect(opt.value);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n }\n },\n [visibleOptions, activeIndex, handleSelect],\n );\n\n return (\n <div className={p.className ?? \"mosaic-multiselect\"} onBlur={p.onBlur}>\n <span id={p.labelId} className=\"mosaic-multiselect-label\">\n {p.label}\n </span>\n <div className=\"mosaic-multiselect-chips\" data-testid=\"multiselect-chips\">\n {selectedOptions.map((opt) => (\n <span key={opt.value} className=\"mosaic-multiselect-chip\" data-chip-value={opt.value}>\n {opt.label}\n <button\n type=\"button\"\n aria-label={`Remove ${opt.label}`}\n data-testid={`chip-remove-${opt.value}`}\n className=\"mosaic-multiselect-chip-remove\"\n disabled={p.disabled}\n onClick={() => handleRemove(opt.value)}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n <button\n ref={triggerRef}\n id={p.triggerId}\n type=\"button\"\n // biome-ignore lint/a11y/useSemanticElements: WAI-ARIA combobox pattern requires role=combobox on the trigger element (button is the recommended host element per APG 1.2 — there is no semantic HTML equivalent for a multi-select combobox).\n role=\"combobox\"\n aria-multiselectable={true}\n aria-expanded={open}\n aria-controls={p.listboxId}\n aria-labelledby={p.labelId}\n aria-disabled={p.disabled || atMax || undefined}\n disabled={p.disabled}\n data-testid=\"multiselect-trigger\"\n className=\"mosaic-multiselect-trigger\"\n onClick={() => !p.disabled && setOpen((o) => !o)}\n onKeyDown={handleTriggerKeyDown}\n >\n {p.value.length === 0 ? (p.placeholder ?? \"Select…\") : `${p.value.length} selected`}\n </button>\n {open ? (\n <div className=\"mosaic-multiselect-panel\">\n {p.searchable ? (\n <input\n type=\"text\"\n aria-label=\"Search options\"\n data-testid=\"multiselect-search\"\n className=\"mosaic-multiselect-search\"\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setActiveIndex(0);\n }}\n />\n ) : null}\n <ul\n id={p.listboxId}\n // biome-ignore lint/a11y/useSemanticElements: APG combobox requires role=listbox on a ul container.\n // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: APG combobox listbox pattern.\n role=\"listbox\"\n aria-multiselectable={true}\n aria-labelledby={p.labelId}\n tabIndex={-1}\n className=\"mosaic-multiselect-listbox\"\n onKeyDown={handleListKeyDown}\n >\n {visibleOptions.length === 0 ? (\n <li className=\"mosaic-multiselect-empty\">No options</li>\n ) : (\n visibleOptions.map((opt, i) => (\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the listbox; APG combobox active-descendant pattern.\n // biome-ignore lint/a11y/useKeyWithClickEvents: keyboard handled at listbox level per APG.\n <li\n key={opt.value}\n // biome-ignore lint/a11y/useSemanticElements: APG combobox-listbox pattern.\n // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: APG combobox-listbox pattern.\n role=\"option\"\n aria-selected={false}\n data-testid={`option-${opt.value}`}\n data-active={i === activeIndex || undefined}\n className=\"mosaic-multiselect-option\"\n onClick={() => handleSelect(opt.value)}\n >\n {opt.label}\n </li>\n ))\n )}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n","/**\n * RadioGroup.logic.ts — pure, framework-agnostic logic.\n * No JSX here — shared between React 19 and Preact 10 runtimes.\n *\n * WCAG-AA ARIA + roving tabindex spec (WAI-ARIA Authoring Practices §3.10):\n *\n * - role=\"radiogroup\" on container\n * - role=\"radio\" + aria-checked on each radio\n * - aria-labelledby on container points to the visible group label id\n * - aria-labelledby on each radio points to its own option label span id\n * - aria-describedby on a radio points to its description span id (if present)\n * - Roving tabindex:\n * * If a value is selected → the SELECTED radio has tabIndex 0, all\n * others tabIndex -1.\n * * If nothing is selected → the FIRST enabled radio has tabIndex 0,\n * all others tabIndex -1 (so Tab can enter the group).\n * - Arrow keys (Up/Down vertical, Left/Right horizontal) MOVE focus to the\n * next/previous enabled radio AND select it (focus + selection sync — this\n * is the radiogroup pattern, distinct from tabs).\n * - Home / End jump to first / last enabled radio AND select it.\n * - Space / Enter on a non-selected focused radio selects it (no-op when\n * already selected).\n * - Disabled radios are skipped during arrow nav (findNextEnabledIndex).\n */\n\nimport type { RadioGroupOption } from \"./RadioGroup.schema.js\";\n\nexport type RadioOrientation = \"vertical\" | \"horizontal\";\n\n/**\n * Returns the prev/next key pair for the given orientation.\n *\n * Vertical group → ArrowUp/ArrowDown.\n * Horizontal group → ArrowLeft/ArrowRight.\n *\n * (Per WAI-ARIA radiogroup pattern, only one axis is used; the perpendicular\n * arrow keys are NOT intercepted — they let the user move out of the group.)\n */\nexport function getNavKeys(orientation: RadioOrientation): {\n prev: string;\n next: string;\n} {\n return orientation === \"vertical\"\n ? { prev: \"ArrowUp\", next: \"ArrowDown\" }\n : { prev: \"ArrowLeft\", next: \"ArrowRight\" };\n}\n\n/**\n * Finds the next enabled (non-disabled) option index in `direction`,\n * wrapping around at boundaries. Returns `currentIndex` if every option\n * is disabled (defensive — Zod schema requires options.length ≥ 1 but does\n * not forbid all-disabled).\n */\nexport function findNextEnabledIndex(\n options: Array<Pick<RadioGroupOption, \"disabled\">>,\n currentIndex: number,\n direction: 1 | -1,\n): number {\n const len = options.length;\n if (len === 0) return currentIndex;\n let i = (currentIndex + direction + len) % len;\n for (let tries = 0; tries < len; tries++) {\n if (!options[i]?.disabled) return i;\n i = (i + direction + len) % len;\n }\n return currentIndex;\n}\n\n/** First enabled option index, or 0 if all are disabled. */\nexport function findFirstEnabledIndex(\n options: Array<Pick<RadioGroupOption, \"disabled\">>,\n): number {\n const idx = options.findIndex((o) => !o.disabled);\n return idx === -1 ? 0 : idx;\n}\n\n/** Last enabled option index, or `options.length - 1` if all are disabled. */\nexport function findLastEnabledIndex(\n options: Array<Pick<RadioGroupOption, \"disabled\">>,\n): number {\n for (let i = options.length - 1; i >= 0; i--) {\n if (!options[i]?.disabled) return i;\n }\n return options.length - 1;\n}\n\n/**\n * Returns the index of the option whose `value` matches `selectedValue`,\n * or -1 if no option is selected (or the selected value points to a disabled\n * option — selected-but-disabled is a valid state, so we DON'T filter here).\n */\nexport function findSelectedIndex(\n options: Array<Pick<RadioGroupOption, \"value\">>,\n selectedValue: string | undefined,\n): number {\n if (selectedValue === undefined || selectedValue === \"\") return -1;\n return options.findIndex((o) => o.value === selectedValue);\n}\n\n/**\n * Roving tabindex resolver — returns the index that should carry tabIndex=0.\n *\n * - If something is selected → the selected index (focus follows selection).\n * - Otherwise → the first enabled option (so Tab can enter the group).\n */\nexport function getRovingTabIndex(\n options: Array<Pick<RadioGroupOption, \"value\" | \"disabled\">>,\n selectedValue: string | undefined,\n): number {\n const selectedIdx = findSelectedIndex(options, selectedValue);\n if (selectedIdx >= 0) return selectedIdx;\n return findFirstEnabledIndex(options);\n}\n\n/** Stable DOM id for the group label (linked by container aria-labelledby). */\nexport function getGroupLabelId(instanceId: string, name: string): string {\n return `${instanceId}-${name}-label`;\n}\n\n/** Stable DOM id for an option label span (linked by radio aria-labelledby). */\nexport function getOptionLabelId(\n instanceId: string,\n name: string,\n optionValue: string,\n): string {\n return `${instanceId}-${name}-${optionValue}-label`;\n}\n\n/** Stable DOM id for an option description span (linked by radio aria-describedby). */\nexport function getOptionDescriptionId(\n instanceId: string,\n name: string,\n optionValue: string,\n): string {\n return `${instanceId}-${name}-${optionValue}-desc`;\n}\n\n/** Tailwind classes for the root radiogroup container. */\nexport function getGroupClasses(orientation: RadioOrientation): string {\n return orientation === \"vertical\"\n ? \"flex flex-col gap-2\"\n : \"flex flex-row flex-wrap gap-4\";\n}\n\n/** Tailwind classes for a single radio row (label + control + description). */\nexport function getOptionRowClasses(\n isDisabled: boolean,\n orientation: RadioOrientation,\n): string {\n const base = \"flex items-start gap-2\";\n const orient = orientation === \"vertical\" ? \"flex-row\" : \"flex-row\";\n const state = isDisabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\";\n return [base, orient, state].join(\" \");\n}\n\n/** Tailwind classes for the visible radio control (the round dot). */\nexport function getRadioControlClasses(\n isSelected: boolean,\n isDisabled: boolean,\n): string {\n const base =\n \"inline-flex items-center justify-center w-4 h-4 mt-0.5 rounded-full border-2 transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 shrink-0\";\n const state = isDisabled\n ? \"border-slate-300 bg-slate-100\"\n : isSelected\n ? \"border-blue-600 bg-white\"\n : \"border-slate-400 bg-white hover:border-slate-600\";\n return [base, state].join(\" \");\n}\n\n/** Whether a keyboard event should activate the focused radio (Space / Enter). */\nexport function isActivationKey(key: string): boolean {\n return key === \" \" || key === \"Space\" || key === \"Enter\";\n}\n","import { z } from \"zod\";\n\n// i18nKeys: RadioGroup.error.invalidProps\n\n/**\n * RadioGroup — mutually exclusive single-choice form primitive.\n *\n * - `name` RHF field name (must match `<FormField name=\"…\">` parent).\n * - `options` Ordered list of radio descriptors. Each carries a stable\n * `value` (the form value when selected), a visible `label`,\n * and an optional `description` exposed via aria-describedby.\n * - `orientation` Visual layout — vertical (default) or horizontal. Controls\n * Arrow key mapping (Up/Down vs Left/Right per WAI-ARIA).\n * - `disabled` Disables the whole group; individual options can also be\n * disabled via `options[i].disabled`.\n * - `label` Visible group label rendered above the radios; wired to\n * `role=\"radiogroup\"` via `aria-labelledby`.\n *\n * WCAG-AA contract is asserted by the runtime layer:\n * - container has `role=\"radiogroup\"` + `aria-labelledby` + `aria-orientation`.\n * - each radio has `role=\"radio\"` + `aria-checked` + `tabIndex` roving.\n * - Arrow keys move focus AND selection (WAI-ARIA radiogroup pattern §3.10).\n * - Space/Enter activates the currently focused radio.\n * - Disabled radios are skipped during keyboard navigation.\n */\nexport const RadioGroupOptionSchema = z.object({\n value: z.string().min(1),\n label: z.string().min(1),\n description: z.string().optional(),\n disabled: z.boolean().optional().default(false),\n});\n\nexport type RadioGroupOption = z.infer<typeof RadioGroupOptionSchema>;\n\nexport const RadioGroupPropsSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n options: z.array(RadioGroupOptionSchema).min(1),\n orientation: z.enum([\"vertical\", \"horizontal\"]).default(\"vertical\"),\n disabled: z.boolean().optional().default(false),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type RadioGroupPropsValidated = z.infer<typeof RadioGroupPropsSchema>;\n\n/** Runtime props — RHF Controller field+fieldState are not serialisable so live outside the Zod schema. */\nexport type RadioGroupProps = RadioGroupPropsValidated;\n\nexport function validateRadioGroupProps(raw: unknown): RadioGroupPropsValidated {\n return RadioGroupPropsSchema.parse(raw);\n}\n","\"use client\";\n\nimport { useCallback, useId, useRef } from \"react\";\nimport {\n findFirstEnabledIndex,\n findLastEnabledIndex,\n findNextEnabledIndex,\n getGroupClasses,\n getGroupLabelId,\n getNavKeys,\n getOptionDescriptionId,\n getOptionLabelId,\n getOptionRowClasses,\n getRovingTabIndex,\n isActivationKey,\n} from \"../../../../components/forms/RadioGroup.logic.js\";\nimport { validateRadioGroupProps } from \"../../../../components/forms/RadioGroup.schema.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface RadioGroupProps {\n name: string;\n label: string;\n options: Array<{\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n }>;\n orientation?: \"vertical\" | \"horizontal\";\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * RadioGroup — mutually exclusive single-choice primitive, WCAG-AA compliant.\n *\n * Uses native `<input type=\"radio\">` elements for browser-native semantics\n * while implementing roving tabIndex + Arrow key selection sync per the\n * WAI-ARIA radiogroup pattern (§3.10).\n *\n * ARIA contract:\n * - `role=\"radiogroup\"` + `aria-labelledby` on the container (fieldset equivalent)\n * - Native `<input type=\"radio\">` per option — browser provides role + aria-checked\n * - `aria-labelledby` per input → its `<label>` span id\n * - `aria-describedby` per input → its description span id (when present)\n * - Roving tabIndex — selected radio has tabIndex 0, all others -1\n * - Arrow keys move focus AND selection (WAI-ARIA §3.10)\n * - Home/End jump to first/last enabled option\n * - Space/Enter activate the focused radio\n * - Disabled radios are skipped during arrow navigation\n */\nexport function RadioGroup(props: RadioGroupProps) {\n const validated = validateRadioGroupProps({\n name: props.name,\n label: props.label,\n options: props.options,\n orientation: props.orientation,\n disabled: props.disabled,\n });\n\n const { name, label, options, orientation, disabled } = validated;\n\n const instanceId = useId();\n const groupLabelId = getGroupLabelId(instanceId, name);\n const { prev: prevKey, next: nextKey } = getNavKeys(orientation);\n\n const radioRefs = useRef<Array<HTMLInputElement | null>>([]);\n\n const focusAndSelect = useCallback(\n (index: number, onChange: (value: string) => void) => {\n const el = radioRefs.current[index];\n if (el) el.focus();\n const opt = options[index];\n if (opt && !opt.disabled) {\n onChange(opt.value);\n }\n },\n [options],\n );\n\n return (\n <FormField name={name}>\n {({ field, fieldState }) => {\n const selectedValue = field.value as string | undefined;\n const rovingIdx = getRovingTabIndex(options, selectedValue);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, currentIndex: number) => {\n const { key } = e;\n\n if (key === prevKey || key === nextKey) {\n e.preventDefault();\n const direction = key === nextKey ? 1 : -1;\n const nextIdx = findNextEnabledIndex(options, currentIndex, direction);\n focusAndSelect(nextIdx, field.onChange);\n return;\n }\n\n if (key === \"Home\") {\n e.preventDefault();\n focusAndSelect(findFirstEnabledIndex(options), field.onChange);\n return;\n }\n\n if (key === \"End\") {\n e.preventDefault();\n focusAndSelect(findLastEnabledIndex(options), field.onChange);\n return;\n }\n\n if (isActivationKey(key)) {\n e.preventDefault();\n const opt = options[currentIndex];\n if (opt && !opt.disabled) {\n field.onChange(opt.value);\n }\n }\n };\n\n return (\n <div className={props.className ?? \"mosaic-forms-radiogroup\"}>\n <span id={groupLabelId} className=\"mosaic-forms-radiogroup-label\">\n {label}\n </span>\n <div\n role=\"radiogroup\"\n aria-labelledby={groupLabelId}\n aria-orientation={orientation}\n aria-disabled={disabled || undefined}\n className={getGroupClasses(orientation)}\n >\n {options.map((option, index) => {\n const isSelected = selectedValue === option.value;\n const isDisabled = !!(disabled || option.disabled);\n const optLabelId = getOptionLabelId(instanceId, name, option.value);\n const optDescId = option.description\n ? getOptionDescriptionId(instanceId, name, option.value)\n : undefined;\n const tabIdx = index === rovingIdx ? 0 : -1;\n\n return (\n <div key={option.value} className={getOptionRowClasses(isDisabled, orientation)}>\n <input\n ref={(el) => {\n radioRefs.current[index] = el;\n }}\n type=\"radio\"\n id={`${instanceId}-${name}-${option.value}`}\n name={field.name}\n value={option.value}\n checked={isSelected}\n disabled={isDisabled}\n aria-labelledby={optLabelId}\n aria-describedby={optDescId}\n tabIndex={isDisabled ? -1 : tabIdx}\n className=\"mosaic-forms-radiogroup-input sr-only\"\n onChange={() => {\n field.onChange(option.value);\n }}\n onKeyDown={(e) => {\n if (!isDisabled) handleKeyDown(e, index);\n }}\n onBlur={field.onBlur}\n />\n <div className=\"flex flex-col gap-0.5\">\n <span id={optLabelId} className=\"mosaic-forms-radiogroup-option-label\">\n {option.label}\n </span>\n {option.description ? (\n <span\n id={optDescId}\n className=\"mosaic-forms-radiogroup-option-description text-sm text-slate-500\"\n >\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n {fieldState.error ? (\n <span role=\"alert\" className=\"mosaic-forms-radiogroup-error text-sm text-red-600\">\n {fieldState.error.message}\n </span>\n ) : null}\n </div>\n );\n }}\n </FormField>\n );\n}\n","/**\n * Select.logic.ts — pure, framework-agnostic logic for the Select primitive.\n * Shared between React 19 and Preact 10 runtimes.\n *\n * WCAG-AA Combobox-with-listbox-popup pattern (APG 2024):\n * - Trigger: role=combobox + aria-haspopup=listbox + aria-expanded + aria-controls\n * - Popup: role=listbox + aria-activedescendant pointing at active option\n * - Option: role=option + aria-selected=true on the selected one\n * - Keyboard:\n * ArrowDown → next enabled option (wrap)\n * ArrowUp → prev enabled option (wrap)\n * Home → first enabled option\n * End → last enabled option\n * Enter → commit active option, close popup\n * Esc → close popup, restore value, focus trigger\n * Printable type-ahead → jump to first option whose label starts with the buffer\n */\n\nimport type { SelectOption } from \"./Select.schema.js\";\n\nexport function getTriggerId(instanceId: string): string {\n return `${instanceId}-trigger`;\n}\nexport function getListboxId(instanceId: string): string {\n return `${instanceId}-listbox`;\n}\nexport function getOptionId(instanceId: string, value: string): string {\n return `${instanceId}-opt-${value}`;\n}\n\n/**\n * Filters options by case-insensitive substring on `label`. Empty query → all.\n * Disabled flags are preserved (they're still rendered, just not selectable).\n */\nexport function filterOptions(options: SelectOption[], query: string): SelectOption[] {\n const q = query.trim().toLowerCase();\n if (q === \"\") return options;\n return options.filter((o) => o.label.toLowerCase().includes(q));\n}\n\n/**\n * Finds the index of the option with `value`, or -1.\n */\nexport function indexOfValue(options: SelectOption[], value: string | null | undefined): number {\n if (value == null) return -1;\n return options.findIndex((o) => o.value === value);\n}\n\n/**\n * Walk forward/backward to the next enabled option, wrapping. Returns -1\n * if no enabled option exists (defensive — schema requires min(1)).\n */\nexport function findNextEnabledIndex(\n options: SelectOption[],\n startIndex: number,\n direction: 1 | -1,\n): number {\n const len = options.length;\n if (len === 0) return -1;\n let i = startIndex;\n for (let tries = 0; tries < len; tries++) {\n i = (i + direction + len) % len;\n if (!options[i]?.disabled) return i;\n }\n return -1;\n}\n\nexport function findFirstEnabledIndex(options: SelectOption[]): number {\n const idx = options.findIndex((o) => !o.disabled);\n return idx === -1 ? -1 : idx;\n}\n\nexport function findLastEnabledIndex(options: SelectOption[]): number {\n for (let i = options.length - 1; i >= 0; i--) {\n if (!options[i]?.disabled) return i;\n }\n return -1;\n}\n\n/**\n * Type-ahead: given a buffer string, find first option whose label starts with\n * the buffer (case-insensitive). Skips disabled options.\n */\nexport function findByTypeAhead(options: SelectOption[], buffer: string): number {\n if (buffer === \"\") return -1;\n const needle = buffer.toLowerCase();\n for (let i = 0; i < options.length; i++) {\n const o = options[i];\n if (!o || o.disabled) continue;\n if (o.label.toLowerCase().startsWith(needle)) return i;\n }\n return -1;\n}\n\n/**\n * Tailwind class for the trigger button.\n */\nexport function getTriggerClasses(isDisabled: boolean, isOpen: boolean): string {\n const base =\n \"inline-flex items-center justify-between gap-2 w-full rounded-md border px-3 py-2 text-sm transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600\";\n const state = isDisabled\n ? \"border-slate-200 text-slate-400 bg-slate-50 cursor-not-allowed\"\n : isOpen\n ? \"border-blue-600 bg-white text-slate-900\"\n : \"border-slate-300 bg-white text-slate-900 hover:border-slate-400\";\n return `${base} ${state}`;\n}\n\nexport function getListboxClasses(): string {\n return \"absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-md border border-slate-200 bg-white py-1 shadow-lg focus:outline-none\";\n}\n\nexport function getOptionClasses(\n isActive: boolean,\n isSelected: boolean,\n isDisabled: boolean,\n): string {\n const base = \"flex items-center px-3 py-2 text-sm select-none\";\n if (isDisabled) return `${base} text-slate-400 cursor-not-allowed`;\n const active = isActive ? \"bg-blue-50 text-blue-900\" : \"text-slate-900\";\n const selected = isSelected ? \"font-medium\" : \"\";\n return `${base} ${active} ${selected} cursor-pointer`;\n}\n\nexport function getSearchInputClasses(): string {\n return \"w-full px-3 py-2 text-sm border-b border-slate-200 focus:outline-none focus:border-blue-600\";\n}\n\n/**\n * Resolves the label of the currently selected option for display in the trigger.\n * Returns null when no value selected (caller shows placeholder).\n */\nexport function resolveSelectedLabel(\n options: SelectOption[],\n value: string | null | undefined,\n): string | null {\n if (value == null) return null;\n const o = options.find((opt) => opt.value === value);\n return o?.label ?? null;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport {\n filterOptions,\n findByTypeAhead,\n findFirstEnabledIndex,\n findLastEnabledIndex,\n findNextEnabledIndex,\n getListboxClasses,\n getListboxId,\n getOptionClasses,\n getOptionId,\n getSearchInputClasses,\n getTriggerClasses,\n getTriggerId,\n indexOfValue,\n resolveSelectedLabel,\n} from \"../../../../components/forms/Select.logic.js\";\nimport type { SelectOption } from \"../../../../components/forms/Select.schema.js\";\nimport { ErrorDisplay } from \"./ErrorDisplay.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface SelectProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n label: string;\n options: SelectOption[];\n placeholder?: string;\n disabled?: boolean;\n searchable?: boolean;\n className?: string;\n /** Optional i18n map passed through to `ErrorDisplay` for error type → message. */\n errorMessageMap?: Record<string, string>;\n}\n\n/**\n * Single-select dropdown primitive — combobox+listbox APG pattern.\n * Wraps `FormField` (RHF Controller) and exposes error state via `ErrorDisplay`.\n * WCAG-AA strict.\n *\n * The visible value-label is shown in the trigger button; the listbox popup\n * uses `aria-activedescendant` to track keyboard focus without moving DOM focus\n * (focus stays on the trigger or the search input).\n */\nexport function Select<TValues extends FieldValues = FieldValues>({\n name,\n label,\n options,\n placeholder,\n disabled = false,\n searchable = false,\n className,\n errorMessageMap,\n}: SelectProps<TValues>) {\n const reactId = useId();\n const instanceId = `mosaic-select-${reactId.replace(/[^a-zA-Z0-9-]/g, \"\")}`;\n const triggerId = getTriggerId(instanceId);\n const listboxId = getListboxId(instanceId);\n const labelId = `${instanceId}-label`;\n const errorId = `${instanceId}-error`;\n\n return (\n <FormField<TValues> name={name}>\n {({ field, fieldState }) => {\n const hasError = Boolean(fieldState.error);\n return (\n <SelectInner\n field={\n field as unknown as {\n value: string | null;\n onChange: (v: string) => void;\n onBlur: () => void;\n ref: (el: HTMLElement | null) => void;\n }\n }\n label={label}\n labelId={labelId}\n triggerId={triggerId}\n listboxId={listboxId}\n errorId={errorId}\n instanceId={instanceId}\n options={options}\n placeholder={placeholder}\n disabled={disabled}\n searchable={searchable}\n className={className}\n hasError={hasError}\n >\n <ErrorDisplay\n error={\n fieldState.error\n ? {\n type: fieldState.error.type ?? \"validation\",\n message: fieldState.error.message,\n }\n : undefined\n }\n messageMap={errorMessageMap}\n className=\"mosaic-forms-error\"\n />\n </SelectInner>\n );\n }}\n </FormField>\n );\n}\n\ninterface InnerProps {\n field: {\n value: string | null;\n onChange: (v: string) => void;\n onBlur: () => void;\n ref: (el: HTMLElement | null) => void;\n };\n label: string;\n labelId: string;\n triggerId: string;\n listboxId: string;\n errorId: string;\n instanceId: string;\n options: SelectOption[];\n placeholder?: string;\n disabled: boolean;\n searchable: boolean;\n className?: string;\n hasError: boolean;\n children: React.ReactNode;\n}\n\nfunction SelectInner({\n field,\n label,\n labelId,\n triggerId,\n listboxId,\n errorId,\n instanceId,\n options,\n placeholder,\n disabled,\n searchable,\n className,\n hasError,\n children,\n}: InnerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n const typeAheadRef = useRef<{ buffer: string; timer: ReturnType<typeof setTimeout> | null }>({\n buffer: \"\",\n timer: null,\n });\n\n const visibleOptions = useMemo(\n () => (searchable ? filterOptions(options, query) : options),\n [options, query, searchable],\n );\n\n // Keep activeIndex coherent when popup opens or filter changes\n useEffect(() => {\n if (!isOpen) return;\n const selectedIdx = indexOfValue(visibleOptions, field.value);\n if (selectedIdx >= 0 && !visibleOptions[selectedIdx]?.disabled) {\n setActiveIndex(selectedIdx);\n } else {\n setActiveIndex(findFirstEnabledIndex(visibleOptions));\n }\n }, [isOpen, visibleOptions, field.value]);\n\n const closePopup = useCallback((restoreFocus = true) => {\n setIsOpen(false);\n setQuery(\"\");\n if (restoreFocus) triggerRef.current?.focus();\n }, []);\n\n const commitOption = useCallback(\n (idx: number) => {\n const opt = visibleOptions[idx];\n if (!opt || opt.disabled) return;\n field.onChange(opt.value);\n closePopup(true);\n field.onBlur();\n },\n [visibleOptions, field, closePopup],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n if (!isOpen) {\n // Closed: open on Enter/Space/ArrowDown/ArrowUp\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n setIsOpen(true);\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const start = activeIndex < 0 ? -1 : activeIndex;\n const next = findNextEnabledIndex(visibleOptions, start, 1);\n if (next >= 0) setActiveIndex(next);\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const start = activeIndex < 0 ? visibleOptions.length : activeIndex;\n const prev = findNextEnabledIndex(visibleOptions, start, -1);\n if (prev >= 0) setActiveIndex(prev);\n break;\n }\n case \"Home\": {\n e.preventDefault();\n const first = findFirstEnabledIndex(visibleOptions);\n if (first >= 0) setActiveIndex(first);\n break;\n }\n case \"End\": {\n e.preventDefault();\n const last = findLastEnabledIndex(visibleOptions);\n if (last >= 0) setActiveIndex(last);\n break;\n }\n case \"Enter\": {\n e.preventDefault();\n if (activeIndex >= 0) commitOption(activeIndex);\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n closePopup(true);\n break;\n }\n default: {\n // Type-ahead when search input is not the active typing surface\n if (!searchable && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n e.preventDefault();\n const ta = typeAheadRef.current;\n ta.buffer += e.key.toLowerCase();\n if (ta.timer) clearTimeout(ta.timer);\n ta.timer = setTimeout(() => {\n ta.buffer = \"\";\n }, 500);\n const idx = findByTypeAhead(visibleOptions, ta.buffer);\n if (idx >= 0) setActiveIndex(idx);\n }\n break;\n }\n }\n },\n [activeIndex, closePopup, commitOption, disabled, isOpen, searchable, visibleOptions],\n );\n\n // Close on outside click\n const rootRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!isOpen) return;\n function onDocClick(e: MouseEvent) {\n if (!rootRef.current) return;\n if (!rootRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n setQuery(\"\");\n field.onBlur();\n }\n }\n document.addEventListener(\"mousedown\", onDocClick);\n return () => document.removeEventListener(\"mousedown\", onDocClick);\n }, [isOpen, field]);\n\n const selectedLabel = resolveSelectedLabel(options, field.value);\n const activeId =\n activeIndex >= 0\n ? getOptionId(instanceId, visibleOptions[activeIndex]?.value ?? \"\")\n : undefined;\n\n return (\n <div ref={rootRef} className={className ?? \"relative inline-block w-full\"}>\n <label\n id={labelId}\n htmlFor={triggerId}\n className=\"block text-sm font-medium text-slate-700 mb-1\"\n >\n {label}\n </label>\n <button\n type=\"button\"\n id={triggerId}\n ref={(el) => {\n triggerRef.current = el;\n field.ref(el);\n }}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-labelledby={labelId}\n aria-activedescendant={isOpen ? activeId : undefined}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n disabled={disabled}\n className={getTriggerClasses(disabled, isOpen)}\n onClick={() => !disabled && setIsOpen((o) => !o)}\n onKeyDown={handleKeyDown}\n onBlur={(e) => {\n // Don't blur if focus moves into the popup\n if (rootRef.current?.contains(e.relatedTarget as Node | null)) return;\n if (!isOpen) field.onBlur();\n }}\n >\n <span className={selectedLabel ? \"\" : \"text-slate-400\"}>\n {selectedLabel ?? placeholder ?? \"\"}\n </span>\n <span aria-hidden=\"true\">▾</span>\n </button>\n\n {isOpen ? (\n <div className={getListboxClasses()}>\n {searchable ? (\n <input\n ref={searchRef}\n type=\"text\"\n className={getSearchInputClasses()}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Search…\"\n // biome-ignore lint/a11y/noAutofocus: focus follows popup open per APG combobox pattern\n autoFocus\n aria-label=\"Search options\"\n />\n ) : null}\n <ul id={listboxId} role=\"listbox\" aria-labelledby={labelId} tabIndex={-1}>\n {visibleOptions.length === 0 ? (\n <li className=\"px-3 py-2 text-sm text-slate-500\" role=\"presentation\">\n No options\n </li>\n ) : (\n visibleOptions.map((opt, idx) => {\n const isSelected = opt.value === field.value;\n const isActive = idx === activeIndex;\n return (\n <li\n key={opt.value}\n id={getOptionId(instanceId, opt.value)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={opt.disabled || undefined}\n className={getOptionClasses(isActive, isSelected, !!opt.disabled)}\n onMouseDown={(e) => {\n e.preventDefault(); // keep trigger focus\n if (!opt.disabled) commitOption(idx);\n }}\n onMouseEnter={() => {\n if (!opt.disabled) setActiveIndex(idx);\n }}\n >\n {opt.label}\n </li>\n );\n })\n )}\n </ul>\n </div>\n ) : null}\n\n <div id={errorId}>{children}</div>\n </div>\n );\n}\n","import { z } from \"zod\";\n\n/**\n * ErrorDisplay accepts an RHF-shaped field error plus an optional consumer\n * message map for i18n. The structure mirrors RHF `FieldError`:\n * `{ type: string, message?: string }`.\n */\nexport const FieldErrorShapeSchema = z.object({\n type: z.string(),\n message: z.string().optional(),\n});\n\nexport const ErrorDisplayPropsSchema = z.object({\n error: FieldErrorShapeSchema.optional(),\n messageMap: z.record(z.string(), z.string()).optional(),\n});\n\nexport type ErrorDisplayPropsValidated = z.infer<typeof ErrorDisplayPropsSchema>;\nexport type FieldErrorShape = z.infer<typeof FieldErrorShapeSchema>;\n","import { z } from \"zod\";\n\n/**\n * FormField props — the field `name` selects a property on the form values.\n * Children are a render-prop receiving `field`, `fieldState`, `formState`\n * from RHF Controller; that contract is enforced at the TypeScript layer.\n */\nexport const FormFieldPropsSchema = z.object({\n name: z.string().min(1),\n});\n\nexport type FormFieldPropsValidated = z.infer<typeof FormFieldPropsSchema>;\n","import { z } from \"zod\";\n\n/**\n * FormProvider props that need runtime validation are minimal — the `form`\n * object comes from `useMosaicForm()` and carries its own typed contract,\n * while `children` are framework JSX. This schema exists for future-proofing\n * (e.g. optional `name` for nested form contexts).\n */\nexport const FormProviderPropsSchema = z.object({\n name: z.string().optional(),\n});\n\nexport type FormProviderPropsValidated = z.infer<typeof FormProviderPropsSchema>;\n","import { z } from \"zod\";\n\n/**\n * Input primitive props — bound to the surrounding `FormProvider` by `name`.\n *\n * - `name` selects a property on the form values (RHF path).\n * - `type` covers the 5 baseline text-like HTML input types (T11 scope).\n * - `placeholder` / `disabled` / `autoComplete` are passthrough DOM props.\n * - `label` is consumer-driven i18n: the caller supplies the localized string,\n * the component never renders raw alphabetic text as JSXText children.\n *\n * Field primitives outside this 5-type baseline (checkbox/radio/file/etc.)\n * land in dedicated T12-T20 components per `docs/v0.3.0-plan.md` §7.\n */\nexport const InputTypeSchema = z.enum([\"text\", \"email\", \"password\", \"number\", \"url\"]);\n\nexport const InputPropsSchema = z.object({\n name: z.string().min(1),\n type: InputTypeSchema.default(\"text\").optional(),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n autoComplete: z.string().optional(),\n label: z.string().min(1),\n});\n\nexport type InputType = z.infer<typeof InputTypeSchema>;\nexport type InputPropsValidated = z.infer<typeof InputPropsSchema>;\n","import { z } from \"zod\";\n\n/**\n * Textarea — multi-line text input form primitive.\n *\n * Props contract (Zod-validated at boundary, mirrors React/Preact runtime types).\n *\n * - `name` — required, non-empty. Selects a property on the surrounding form values.\n * - `rows` — default 3, integer ≥ 1. Maps to native textarea `rows` attribute.\n * - `maxLength` — optional, integer ≥ 1. Caller-controlled length cap. Enforced by\n * pure logic helpers so React and Preact runtimes share gating semantics.\n * - `autoResize` — default false. When true, runtime grows the textarea to fit\n * content (capped by CSS `max-height` if set by consumer).\n * - `placeholder` — optional string.\n * - `disabled` — optional boolean.\n * - `label` — optional string (rendered above the textarea, bilingual-ready).\n */\nexport const TextareaPropsSchema = z.object({\n name: z.string().min(1),\n rows: z.number().int().min(1).default(3),\n maxLength: z.number().int().min(1).optional(),\n autoResize: z.boolean().default(false),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n label: z.string().optional(),\n});\n\nexport type TextareaPropsValidated = z.infer<typeof TextareaPropsSchema>;\n\nexport function validateTextareaProps(raw: unknown): TextareaPropsValidated {\n return TextareaPropsSchema.parse(raw);\n}\n","import { z } from \"zod\";\n\n/**\n * FieldArray props — `name` selects the array path on the form values.\n * `children` is a render-prop receiving `(field, index)` for each entry\n * AND a third arg with the controls `{ append, remove, move, swap, fields }`.\n * That contract is enforced at the TypeScript layer.\n */\nexport const FieldArrayPropsSchema = z.object({\n name: z.string().min(1),\n});\n\nexport type FieldArrayPropsValidated = z.infer<typeof FieldArrayPropsSchema>;\n\n/**\n * Options accepted by `useFieldArray` — thin re-export of the underlying\n * RHF shape. We validate `name` here for parity with FieldArray.\n */\nexport const UseFieldArrayOptionsSchema = z.object({\n name: z.string().min(1),\n});\n\nexport type UseFieldArrayOptionsValidated = z.infer<typeof UseFieldArrayOptionsSchema>;\n","import { z } from \"zod\";\n\n/**\n * Checkbox — boolean form primitive with indeterminate state support.\n *\n * Props contract (Zod-validated at boundary, mirrors React/Preact runtime types).\n *\n * - `name` — required, non-empty. Selects a property on the surrounding form values.\n * - `label` — required, non-empty. Rendered adjacent to the checkbox (bilingual-ready).\n * - `disabled` — optional boolean. Maps to native `disabled` attribute.\n * - `indeterminate` — optional boolean. When true, sets DOM `.indeterminate = true`\n * via ref and aria-checked=\"mixed\". Controlled externally — the component does not\n * manage this state internally.\n * - `description` — optional string. Wired via `aria-describedby` for screen readers.\n */\nexport const CheckboxPropsSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n disabled: z.boolean().optional(),\n indeterminate: z.boolean().optional(),\n description: z.string().optional(),\n});\n\nexport type CheckboxPropsValidated = z.infer<typeof CheckboxPropsSchema>;\n\nexport function validateCheckboxProps(raw: unknown): CheckboxPropsValidated {\n return CheckboxPropsSchema.parse(raw);\n}\n","import { z } from \"zod\";\n\n// i18nKeys: Select.placeholder, Select.search.placeholder, Select.empty\n\n/**\n * Select primitive — single-select dropdown with optional search.\n *\n * Combobox-pattern (APG): a trigger button (role=combobox) opens a listbox\n * popup containing option rows. Optional in-popup search filters the visible\n * options client-side. Cross-runtime (React 19 + Preact 10).\n *\n * The `name` is the react-hook-form field name used by the surrounding\n * `<FormProvider>`. The render-prop wiring lives in FormField/Controller; this\n * component is rendered INSIDE a FormField render prop and consumes the\n * `field` callbacks directly (see Select.stories.tsx).\n */\nexport const SelectOptionSchema = z.object({\n value: z.string().min(1),\n label: z.string().min(1),\n disabled: z.boolean().optional().default(false),\n});\n\nexport type SelectOption = z.infer<typeof SelectOptionSchema>;\n\nexport const SelectPropsSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n options: z.array(SelectOptionSchema).min(1),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional().default(false),\n searchable: z.boolean().optional().default(false),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type SelectPropsValidated = z.infer<typeof SelectPropsSchema>;\n\nexport function validateSelectProps(raw: unknown): SelectPropsValidated {\n return SelectPropsSchema.parse(raw);\n}\n"]}
1
+ {"version":3,"sources":["../../src/components/forms/useMosaicForm.logic.ts","../../src/components/forms/useMosaicForm.schema.ts","../../src/runtimes/react/components/forms/useMosaicForm.tsx","../../src/components/forms/FormProvider.logic.ts","../../src/runtimes/react/components/forms/FormProvider.tsx","../../src/runtimes/react/components/forms/FormField.tsx","../../src/components/forms/ErrorDisplay.logic.ts","../../src/runtimes/react/components/forms/ErrorDisplay.tsx","../../src/components/forms/SubmitButton.logic.ts","../../src/components/forms/SubmitButton.schema.ts","../../src/runtimes/react/components/forms/SubmitButton.tsx","../../src/components/forms/Input.logic.ts","../../src/runtimes/react/components/forms/Input.tsx","../../src/components/forms/Textarea.logic.ts","../../src/runtimes/react/components/forms/Textarea.tsx","../../src/components/forms/FieldArray.logic.ts","../../src/runtimes/react/components/forms/FieldArray.tsx","../../src/components/forms/Checkbox.logic.ts","../../src/runtimes/react/components/forms/Checkbox.tsx","../../src/components/forms/MultiSelect.logic.ts","../../src/components/forms/MultiSelect.schema.ts","../../src/runtimes/react/components/forms/MultiSelect.tsx","../../src/components/forms/RadioGroup.logic.ts","../../src/components/forms/RadioGroup.schema.ts","../../src/runtimes/react/components/forms/RadioGroup.tsx","../../src/components/forms/Select.logic.ts","../../src/runtimes/react/components/forms/Select.tsx","../../src/components/forms/ErrorDisplay.schema.ts","../../src/components/forms/FormField.schema.ts","../../src/components/forms/FormProvider.schema.ts","../../src/components/forms/Input.schema.ts","../../src/components/forms/Textarea.schema.ts","../../src/components/forms/FieldArray.schema.ts","../../src/components/forms/Checkbox.schema.ts","../../src/components/forms/Select.schema.ts"],"names":["RhfFormProvider","jsx","z","Controller","useId","jsxs","useRhfFieldArray","useRef","useEffect","useCallback","findNextEnabledIndex","findFirstEnabledIndex","findLastEnabledIndex","useState","useMemo"],"mappings":"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","file":"forms.js","sourcesContent":["import type { MosaicFormMode } from \"./useMosaicForm.schema.js\";\n\n/**\n * Map Mosaic public mode → react-hook-form `mode` config value.\n *\n * RHF accepts the same three strings (`\"onBlur\" | \"onChange\" | \"onSubmit\"`)\n * but a future Mosaic mode could be aliased here (e.g. `\"realtime\"` →\n * `\"onChange\"`). Keeping the mapping in pure logic makes the hook itself\n * trivial and unit-testable without a renderer.\n */\nexport function toRhfMode(mode: MosaicFormMode): \"onBlur\" | \"onChange\" | \"onSubmit\" {\n return mode;\n}\n","import { z } from \"zod\";\n\n/**\n * Validation timing modes. Mosaic default is \"onBlur\" — Chi co-validated decision\n * (Day 102 DM). RHF's full Mode union supports more values; we narrow to the three\n * timings that are safe and predictable for cross-runtime consumers.\n */\nexport const MosaicFormModeSchema = z.enum([\"onBlur\", \"onChange\", \"onSubmit\"]);\nexport type MosaicFormMode = z.infer<typeof MosaicFormModeSchema>;\n\n/**\n * Options accepted by `useMosaicForm`. The Zod schema for the form payload is\n * passed separately (not parsed inside this schema) because it carries runtime\n * type information that the consumer's TSchema generic propagates through.\n */\nexport const UseMosaicFormOptionsSchema = z.object({\n mode: MosaicFormModeSchema.default(\"onBlur\"),\n});\n\nexport type UseMosaicFormOptions = z.infer<typeof UseMosaicFormOptionsSchema>;\n\nexport function validateOptions(raw: unknown): UseMosaicFormOptions {\n return UseMosaicFormOptionsSchema.parse(raw);\n}\n","\"use client\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { type FieldValues, type UseFormReturn, useForm } from \"react-hook-form\";\nimport type { ZodSchema, ZodType } from \"zod\";\nimport { toRhfMode } from \"../../../../components/forms/useMosaicForm.logic.js\";\nimport {\n type MosaicFormMode,\n validateOptions,\n} from \"../../../../components/forms/useMosaicForm.schema.js\";\n\n/**\n * Public options to {@link useMosaicForm}. The Zod `schema` is the runtime\n * validator (and the source of truth for the form payload type). `mode`\n * defaults to `\"onBlur\"` per Chi co-validated decision (Day 102).\n */\nexport interface UseMosaicFormOptions<TSchema extends ZodType> {\n schema: TSchema;\n defaultValues: Partial<ReturnType<TSchema[\"parse\"]>> | ReturnType<TSchema[\"parse\"]>;\n mode?: MosaicFormMode;\n}\n\n/**\n * Return type — the standard RHF `UseFormReturn` extended with two Mosaic\n * metadata fields so consumers (FormField, SubmitButton, FormProvider) can\n * inspect the active schema + timing without re-deriving them.\n */\nexport type UseMosaicFormReturn<TFieldValues extends FieldValues = FieldValues> =\n UseFormReturn<TFieldValues> & {\n mosaicSchema: ZodSchema;\n mosaicMode: MosaicFormMode;\n };\n\n/**\n * Cross-runtime wrapper around `react-hook-form` + `@hookform/resolvers/zod`.\n *\n * - Validates options through Zod (`UseMosaicFormOptionsSchema`) so an invalid\n * `mode` fails loudly at hook-call time rather than silently degrading.\n * - Attaches the schema + mode to the return object as `mosaicSchema` and\n * `mosaicMode` for downstream Mosaic consumers (FieldArray will read these).\n *\n * Compatible with FieldArray (T16) — the return shape extends RHF's, so\n * `useFieldArray({ control: form.control, name: ... })` works verbatim.\n */\nexport function useMosaicForm<TSchema extends ZodType>(\n options: UseMosaicFormOptions<TSchema>,\n): UseMosaicFormReturn<ReturnType<TSchema[\"parse\"]> & FieldValues> {\n const parsedOptions = validateOptions({ mode: options.mode });\n type TValues = ReturnType<TSchema[\"parse\"]> & FieldValues;\n\n const form = useForm<TValues>({\n // biome-ignore lint/suspicious/noExplicitAny: zodResolver's generic shape forces a cast at this boundary\n resolver: zodResolver(options.schema as any),\n defaultValues: options.defaultValues as TValues,\n mode: toRhfMode(parsedOptions.mode),\n });\n\n const extended = form as UseMosaicFormReturn<TValues>;\n extended.mosaicSchema = options.schema as ZodSchema;\n extended.mosaicMode = parsedOptions.mode;\n return extended;\n}\n","/**\n * Shared error messages for the FormProvider runtime layer.\n */\nexport const FORM_PROVIDER_CONTEXT_MISSING =\n \"useMosaicFormContext must be used inside <FormProvider>. Wrap your tree with <FormProvider form={...}> from @vantageos/mosaic/{react,preact}/forms.\";\n","\"use client\";\n\nimport { type ReactNode, createContext, useContext } from \"react\";\nimport { type FieldValues, FormProvider as RhfFormProvider } from \"react-hook-form\";\nimport { FORM_PROVIDER_CONTEXT_MISSING } from \"../../../../components/forms/FormProvider.logic.js\";\nimport type { UseMosaicFormReturn } from \"./useMosaicForm.js\";\n\n// The context value is erased to the default `FieldValues` generic — callers\n// of `useMosaicFormContext()` cast back to their narrow form shape when needed.\n// This avoids the invariance pitfall of trying to store a typed-narrow form\n// in a global context typed at the loose default.\nconst MosaicFormContext = createContext<UseMosaicFormReturn | null>(null);\n\nexport interface FormProviderProps<TValues extends FieldValues = FieldValues> {\n form: UseMosaicFormReturn<TValues>;\n children: ReactNode;\n}\n\n/**\n * Wraps `react-hook-form`'s native `<FormProvider>` AND a Mosaic-specific\n * context that carries the extended metadata (`mosaicSchema`, `mosaicMode`).\n * Consumer components read either context — Mosaic's own for metadata,\n * RHF's for register/control/handleSubmit access.\n */\nexport function FormProvider<TValues extends FieldValues = FieldValues>({\n form,\n children,\n}: FormProviderProps<TValues>) {\n return (\n <MosaicFormContext.Provider value={form as unknown as UseMosaicFormReturn}>\n <RhfFormProvider {...form}>{children}</RhfFormProvider>\n </MosaicFormContext.Provider>\n );\n}\n\n/**\n * Read the Mosaic-extended form context. Throws if called outside a\n * `<FormProvider>` so consumer bugs surface immediately.\n *\n * Generic `TValues` lets callers narrow back to their original form shape.\n */\nexport function useMosaicFormContext<\n TValues extends FieldValues = FieldValues,\n>(): UseMosaicFormReturn<TValues> {\n const ctx = useContext(MosaicFormContext);\n if (!ctx) {\n throw new Error(FORM_PROVIDER_CONTEXT_MISSING);\n }\n return ctx as unknown as UseMosaicFormReturn<TValues>;\n}\n","\"use client\";\n\nimport type { ReactElement } from \"react\";\nimport {\n Controller,\n type ControllerFieldState,\n type ControllerRenderProps,\n type FieldValues,\n type Path,\n type UseFormStateReturn,\n} from \"react-hook-form\";\nimport { useMosaicFormContext } from \"./FormProvider.js\";\n\nexport interface FormFieldRenderArgs<TValues extends FieldValues = FieldValues> {\n field: ControllerRenderProps<TValues>;\n fieldState: ControllerFieldState;\n formState: UseFormStateReturn<TValues>;\n}\n\nexport interface FormFieldProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n children: (args: FormFieldRenderArgs<TValues>) => ReactElement;\n}\n\n/**\n * Render-prop wrapper around RHF's `Controller`. Pulls `control` from the\n * surrounding `<FormProvider>` so consumers never thread it manually.\n */\nexport function FormField<TValues extends FieldValues = FieldValues>({\n name,\n children,\n}: FormFieldProps<TValues>) {\n const form = useMosaicFormContext() as unknown as { control: unknown };\n return (\n <Controller\n // biome-ignore lint/suspicious/noExplicitAny: bridging FormProvider's erased generic to Controller\n control={form.control as any}\n name={name as never}\n render={({ field, fieldState, formState }) =>\n children({\n field: field as unknown as ControllerRenderProps<TValues>,\n fieldState,\n formState: formState as unknown as UseFormStateReturn<TValues>,\n })\n }\n />\n );\n}\n","import type { FieldErrorShape } from \"./ErrorDisplay.schema.js\";\n\n/**\n * Pure formatter shared by React + Preact runtimes.\n *\n * Priority order:\n * 1. `error.message` set by Zod/RHF → win (explicit wins).\n * 2. `messageMap[error.type]` → consumer-controlled i18n fallback.\n * 3. Generic fallback string (\"Invalid value\").\n */\nexport function formatErrorMessage(\n error: FieldErrorShape | undefined,\n messageMap: Record<string, string> | undefined,\n): string | undefined {\n if (!error) return undefined;\n if (error.message && error.message.length > 0) return error.message;\n const mapped = messageMap?.[error.type];\n if (mapped && mapped.length > 0) return mapped;\n return \"Invalid value\";\n}\n","\"use client\";\n\nimport { formatErrorMessage } from \"../../../../components/forms/ErrorDisplay.logic.js\";\nimport type { FieldErrorShape } from \"../../../../components/forms/ErrorDisplay.schema.js\";\n\nexport interface ErrorDisplayProps {\n error?: FieldErrorShape;\n messageMap?: Record<string, string>;\n className?: string;\n}\n\n/**\n * Single-field error formatter. Renders nothing when `error` is undefined\n * (no error to show), otherwise emits a `role=\"alert\"` element with the\n * resolved message. Message resolution is delegated to the pure\n * `formatErrorMessage` helper so React and Preact runtimes share behavior.\n */\nexport function ErrorDisplay({ error, messageMap, className }: ErrorDisplayProps) {\n const message = formatErrorMessage(error, messageMap);\n if (!message) return null;\n return (\n <span role=\"alert\" className={className ?? \"mosaic-forms-error\"}>\n {message}\n </span>\n );\n}\n","/**\n * Pure state machine for SubmitButton, shared by React + Preact runtimes.\n *\n * | isValid | isSubmitting | disabled | loading |\n * |---------|--------------|----------|---------|\n * | false | false | true | false |\n * | false | true | true | true |\n * | true | false | false | false |\n * | true | true | true | true |\n *\n * `loading` reflects the submit-in-flight state regardless of validity, so\n * consumers can show a spinner even if downstream validation rejects.\n */\nexport function computeSubmitButtonState(input: {\n isValid: boolean;\n isSubmitting: boolean;\n}): { disabled: boolean; loading: boolean } {\n return {\n disabled: input.isSubmitting || !input.isValid,\n loading: input.isSubmitting,\n };\n}\n","import { z } from \"zod\";\n\nexport const SubmitButtonPropsSchema = z.object({\n label: z.string().min(1).default(\"Submit\"),\n loadingLabel: z.string().min(1).default(\"Submitting…\"),\n});\n\nexport type SubmitButtonPropsValidated = z.infer<typeof SubmitButtonPropsSchema>;\n\nexport function validateSubmitButtonProps(raw: unknown): SubmitButtonPropsValidated {\n return SubmitButtonPropsSchema.parse(raw);\n}\n","\"use client\";\n\nimport { computeSubmitButtonState } from \"../../../../components/forms/SubmitButton.logic.js\";\nimport { validateSubmitButtonProps } from \"../../../../components/forms/SubmitButton.schema.js\";\nimport { useMosaicFormContext } from \"./FormProvider.js\";\n\nexport interface SubmitButtonProps {\n label?: string;\n loadingLabel?: string;\n className?: string;\n}\n\n/**\n * Form submit button bound to the surrounding `<FormProvider>` form state.\n * Disabled while `formState.isValid` is false OR `formState.isSubmitting`\n * is true. While submitting, the loading label replaces the default label.\n */\nexport function SubmitButton(props: SubmitButtonProps) {\n const { label, loadingLabel } = validateSubmitButtonProps({\n label: props.label,\n loadingLabel: props.loadingLabel,\n });\n const form = useMosaicFormContext();\n const { isValid, isSubmitting } = form.formState;\n const { disabled, loading } = computeSubmitButtonState({ isValid, isSubmitting });\n\n return (\n <button\n type=\"submit\"\n disabled={disabled}\n aria-busy={loading || undefined}\n className={props.className ?? \"mosaic-forms-submit\"}\n >\n {loading ? loadingLabel : label}\n </button>\n );\n}\n","/**\n * Pure helpers for Input. Runtime-agnostic — shared between React and Preact\n * runtimes via the `src/components/forms/` co-location pattern (Standard §18.2).\n */\n\nimport type { InputType } from \"./Input.schema.js\";\n\n/**\n * Build the deterministic input element id from form name + field name.\n * Used to wire `<label htmlFor>`, `aria-describedby` and the error element id.\n *\n * Mirrors `buildFieldId` from `FormField.logic.ts` but namespaced for Input so\n * future primitives (Textarea, Select) can compose their own id conventions.\n */\nexport function buildInputId(formName: string | undefined, fieldName: string): string {\n return formName ? `${formName}-${fieldName}` : `mosaic-input-${fieldName}`;\n}\n\n/**\n * `aria-describedby` value — the id of the error element, only emitted when an\n * error exists. Otherwise undefined (omit the attribute entirely).\n */\nexport function buildErrorDescribedBy(inputId: string, hasError: boolean): string | undefined {\n return hasError ? `${inputId}-error` : undefined;\n}\n\n/**\n * Map our public `type` prop to the HTML `type` attribute. Currently a 1:1\n * passthrough — the indirection exists so future types (e.g. `search`,\n * `tel`) can be widened without touching the runtime components.\n */\nexport function resolveHtmlType(type: InputType | undefined): InputType {\n return type ?? \"text\";\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport {\n Controller,\n type ControllerRenderProps,\n type FieldValues,\n type Path,\n} from \"react-hook-form\";\nimport { formatErrorMessage } from \"../../../../components/forms/ErrorDisplay.logic.js\";\nimport {\n buildErrorDescribedBy,\n resolveHtmlType,\n} from \"../../../../components/forms/Input.logic.js\";\nimport type { InputType } from \"../../../../components/forms/Input.schema.js\";\nimport { useMosaicFormContext } from \"./FormProvider.js\";\n\nexport interface InputProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n /** HTML input type. Defaults to `\"text\"`. */\n type?: InputType;\n /** Consumer-driven i18n label. Wired via `<label htmlFor>` to the input. */\n label: string;\n placeholder?: string;\n disabled?: boolean;\n autoComplete?: string;\n /** Optional consumer override for the wrapping element id. */\n id?: string;\n /** Optional error code → message map for i18n. */\n messageMap?: Record<string, string>;\n className?: string;\n inputClassName?: string;\n errorClassName?: string;\n}\n\n/**\n * Cross-runtime Input primitive (forms category, T11). Binds an `<input>` to\n * the surrounding `<FormProvider>` via `react-hook-form`'s `Controller`.\n *\n * - Consumer-driven i18n: every user-visible string flows in as a prop.\n * - a11y: `<label htmlFor>` pair, `aria-invalid` toggled by validation state,\n * `aria-describedby` linking the error element when present.\n * - Validation timing inherits the form's `mode` (default `\"onBlur\"`, Day 102 DM).\n */\nexport function Input<TValues extends FieldValues = FieldValues>({\n name,\n type,\n label,\n placeholder,\n disabled,\n autoComplete,\n id,\n messageMap,\n className,\n inputClassName,\n errorClassName,\n}: InputProps<TValues>) {\n const form = useMosaicFormContext() as unknown as { control: unknown };\n const reactId = useId();\n const inputId = id ?? `mosaic-input-${reactId.replace(/[^a-zA-Z0-9_-]/g, \"\")}-${String(name)}`;\n const htmlType = resolveHtmlType(type);\n\n return (\n <Controller\n // biome-ignore lint/suspicious/noExplicitAny: bridging FormProvider's erased generic to Controller\n control={form.control as any}\n name={name as never}\n render={({ field, fieldState }) => {\n const f = field as unknown as ControllerRenderProps<TValues>;\n const hasError = Boolean(fieldState.error);\n const describedBy = buildErrorDescribedBy(inputId, hasError);\n const message = formatErrorMessage(\n fieldState.error\n ? { type: fieldState.error.type, message: fieldState.error.message }\n : undefined,\n messageMap,\n );\n const value = (f.value as string | number | undefined) ?? \"\";\n return (\n <div className={className ?? \"mosaic-forms-input\"}>\n <label htmlFor={inputId}>{label}</label>\n <input\n id={inputId}\n name={f.name}\n type={htmlType}\n value={value}\n onChange={f.onChange}\n onBlur={f.onBlur}\n ref={f.ref}\n placeholder={placeholder}\n disabled={disabled ?? false}\n autoComplete={autoComplete}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n className={inputClassName}\n />\n {hasError && message ? (\n <span\n id={`${inputId}-error`}\n role=\"alert\"\n className={errorClassName ?? \"mosaic-forms-error\"}\n >\n {message}\n </span>\n ) : null}\n </div>\n );\n }}\n />\n );\n}\n","/**\n * Pure helpers for Textarea, shared by React + Preact runtimes.\n *\n * No DOM, no framework imports. Keeps the runtime surface a thin shell so\n * Standard §18 cross-runtime parity holds by reference.\n */\n\nexport const DEFAULT_TEXTAREA_ROWS = 3;\n\n/**\n * Clamp an input value to `maxLength` characters. When `maxLength` is undefined\n * (no cap), returns the value unchanged. When the input already fits, returns\n * the value unchanged (identity — avoids needless state churn in RHF).\n */\nexport function clampToMaxLength(value: string, maxLength: number | undefined): string {\n if (maxLength === undefined) return value;\n if (value.length <= maxLength) return value;\n return value.slice(0, maxLength);\n}\n\n/**\n * Resolve the effective `rows` attribute for the rendered <textarea>.\n * Returns `DEFAULT_TEXTAREA_ROWS` when undefined or invalid (≤ 0).\n */\nexport function resolveRows(rows: number | undefined): number {\n if (rows === undefined) return DEFAULT_TEXTAREA_ROWS;\n if (!Number.isFinite(rows) || rows < 1) return DEFAULT_TEXTAREA_ROWS;\n return Math.floor(rows);\n}\n\n/**\n * Compute the next height (in pixels) for an autoResize textarea given the\n * `scrollHeight` reported by the DOM. Returned as a number; runtime applies it\n * via `style.height = `${n}px``. Keeps the math testable without a DOM.\n *\n * Min height honored when scrollHeight is implausible (≤ 0 in jsdom).\n */\nexport function computeAutoResizeHeight(scrollHeight: number, minHeightPx: number): number {\n if (!Number.isFinite(scrollHeight) || scrollHeight <= 0) return minHeightPx;\n return Math.max(scrollHeight, minHeightPx);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useId, useRef } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport {\n DEFAULT_TEXTAREA_ROWS,\n clampToMaxLength,\n computeAutoResizeHeight,\n resolveRows,\n} from \"../../../../components/forms/Textarea.logic.js\";\nimport { ErrorDisplay } from \"./ErrorDisplay.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface TextareaProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n rows?: number;\n maxLength?: number;\n autoResize?: boolean;\n placeholder?: string;\n disabled?: boolean;\n label?: string;\n className?: string;\n /** Optional i18n map passed through to `ErrorDisplay` for error type → message. */\n errorMessageMap?: Record<string, string>;\n}\n\n/**\n * Multi-line text input form primitive.\n *\n * Wraps `FormField` (RHF Controller) and renders a native `<textarea>` with:\n * - `rows` default 3 (see `resolveRows`).\n * - `maxLength` enforcement at the onChange boundary via `clampToMaxLength`.\n * - Optional `autoResize` — grows the element to fit content on each input event.\n * - `aria-invalid` toggled when the field has a validation error.\n * - `aria-describedby` wired to the `ErrorDisplay` element when an error exists.\n * - Bilingual-ready: `label`, `placeholder`, and `errorMessageMap` are caller-supplied\n * strings — Mosaic does not bake locale-specific copy into the component.\n */\nexport function Textarea<TValues extends FieldValues = FieldValues>(props: TextareaProps<TValues>) {\n const {\n name,\n rows,\n maxLength,\n autoResize = false,\n placeholder,\n disabled,\n label,\n className,\n errorMessageMap,\n } = props;\n const effectiveRows = resolveRows(rows);\n const reactId = useId();\n const fieldId = `mosaic-textarea-${reactId}`;\n const errorId = `${fieldId}-error`;\n\n return (\n <FormField<TValues> name={name}>\n {({ field, fieldState }) => {\n const hasError = Boolean(fieldState.error);\n return (\n <TextareaInner\n id={fieldId}\n errorId={errorId}\n label={label}\n value={(field.value as string | undefined) ?? \"\"}\n onChange={(next) => field.onChange(clampToMaxLength(next, maxLength))}\n onBlur={field.onBlur}\n rows={effectiveRows}\n maxLength={maxLength}\n autoResize={autoResize}\n placeholder={placeholder}\n disabled={disabled}\n hasError={hasError}\n className={className}\n >\n <ErrorDisplay\n error={\n fieldState.error\n ? {\n type: fieldState.error.type ?? \"validation\",\n message: fieldState.error.message,\n }\n : undefined\n }\n messageMap={errorMessageMap}\n className=\"mosaic-forms-error\"\n />\n </TextareaInner>\n );\n }}\n </FormField>\n );\n}\n\ninterface TextareaInnerProps {\n id: string;\n errorId: string;\n label: string | undefined;\n value: string;\n onChange: (next: string) => void;\n onBlur: () => void;\n rows: number;\n maxLength: number | undefined;\n autoResize: boolean;\n placeholder: string | undefined;\n disabled: boolean | undefined;\n hasError: boolean;\n className: string | undefined;\n children: React.ReactNode;\n}\n\nfunction TextareaInner(props: TextareaInnerProps) {\n const {\n id,\n errorId,\n label,\n value,\n onChange,\n onBlur,\n rows,\n maxLength,\n autoResize,\n placeholder,\n disabled,\n hasError,\n className,\n children,\n } = props;\n const ref = useRef<HTMLTextAreaElement | null>(null);\n\n const resize = useCallback(() => {\n if (!autoResize) return;\n const el = ref.current;\n if (!el) return;\n // Reset first so scrollHeight reflects the *content*, not the previous box.\n el.style.height = \"auto\";\n const minPx = rows * 20; // ~20px per row baseline (jsdom-friendly fallback).\n const next = computeAutoResizeHeight(el.scrollHeight, minPx);\n el.style.height = `${next}px`;\n }, [autoResize, rows]);\n\n // Resize on mount + whenever the bound value changes (covers external updates).\n useEffect(() => {\n resize();\n }, [resize]);\n\n return (\n <div className={className ?? \"mosaic-forms-textarea\"}>\n {label ? (\n <label htmlFor={id} className=\"mosaic-forms-textarea-label\">\n {label}\n </label>\n ) : null}\n <textarea\n ref={ref}\n id={id}\n value={value}\n rows={rows}\n maxLength={maxLength}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n onChange={(e) => {\n onChange(e.target.value);\n resize();\n }}\n onBlur={onBlur}\n />\n <div id={errorId}>{children}</div>\n </div>\n );\n}\n\nexport { DEFAULT_TEXTAREA_ROWS };\n","/**\n * Pure helpers for FieldArray. Runtime-agnostic — covers ARIA id generation\n * and aria-label conventions used by the React + Preact runtimes.\n *\n * `useFieldArray` itself is a thin wrapper around RHF's hook (live in the\n * runtime layer) — these helpers are the cross-runtime contract that the\n * wrapper and Storybook stories share.\n */\n\n/** Default aria-label for the wrapping list element. */\nexport function buildListAriaLabel(name: string): string {\n return `${name} items`;\n}\n\n/** Default aria-label for the per-item Remove button. */\nexport function buildRemoveAriaLabel(name: string, index: number): string {\n return `Remove ${name} item ${index + 1}`;\n}\n\n/** Default aria-label for the Add button (consumer-rendered). */\nexport function buildAddAriaLabel(name: string): string {\n return `Add ${name} item`;\n}\n\n/**\n * After removing item at `removedIndex` from an array of `previousLength`\n * items, return the index that should receive focus. Clamps to the last\n * remaining index, or `-1` if the list became empty.\n */\nexport function nextFocusIndexAfterRemove(previousLength: number, removedIndex: number): number {\n if (previousLength <= 1) return -1;\n const newLength = previousLength - 1;\n return Math.min(removedIndex, newLength - 1);\n}\n","\"use client\";\n\nimport type { ReactElement } from \"react\";\nimport {\n type ArrayPath,\n type FieldArrayWithId,\n type FieldValues,\n type FieldArray as RhfFieldArray,\n useFieldArray as useRhfFieldArray,\n} from \"react-hook-form\";\nimport {\n buildListAriaLabel,\n buildRemoveAriaLabel,\n} from \"../../../../components/forms/FieldArray.logic.js\";\nimport { useMosaicFormContext } from \"./FormProvider.js\";\n\n// ─── Hook: thin RHF wrapper ───────────────────────────────────────────────────\n\nexport interface UseFieldArrayOptions<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> {\n name: TName;\n /**\n * Optional control override. When omitted, `useFieldArray` reads control\n * from the surrounding `<FormProvider>`, mirroring `FormField`'s contract.\n */\n // biome-ignore lint/suspicious/noExplicitAny: bridging FormProvider's erased generic to RHF control\n control?: any;\n}\n\n/**\n * Public return type for `useFieldArray` — mirrors RHF's native return\n * (`fields`, `append`, `remove`, `move`, `swap`, plus `insert`, `prepend`,\n * `replace`, `update` for advanced cases).\n */\nexport type UseFieldArrayReturn<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> = ReturnType<typeof useRhfFieldArray<TValues, TName, \"id\">>;\n\n/**\n * Thin wrapper around RHF's `useFieldArray`. Reads `control` from the\n * surrounding `<FormProvider>` when not provided, mirroring `FormField`.\n * Exposes `{ fields, append, remove, move, swap }` and the rest of RHF's\n * native return for advanced cases (insert, prepend, replace, update).\n */\nexport function useFieldArray<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n>({ name, control }: UseFieldArrayOptions<TValues, TName>) {\n const ctx = useMosaicFormContext() as unknown as { control: unknown };\n const resolvedControl = control ?? ctx.control;\n return useRhfFieldArray<TValues, TName, \"id\">({\n // biome-ignore lint/suspicious/noExplicitAny: bridging erased generic\n control: resolvedControl as any,\n name: name as never,\n });\n}\n\n// ─── Component: render-prop wrapper ───────────────────────────────────────────\n\nexport interface FieldArrayRenderItemArgs<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> {\n field: FieldArrayWithId<TValues, TName, \"id\">;\n index: number;\n}\n\nexport interface FieldArrayControls<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> {\n fields: ReadonlyArray<FieldArrayWithId<TValues, TName, \"id\">>;\n append: (value: RhfFieldArray<TValues, TName> | RhfFieldArray<TValues, TName>[]) => void;\n remove: (index?: number | number[]) => void;\n move: (from: number, to: number) => void;\n swap: (a: number, b: number) => void;\n}\n\nexport interface FieldArrayProps<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n> {\n name: TName;\n /**\n * Render-prop called for each item. Receives the RHF field (with stable\n * `.id`), the current index, and the controls bag for inline buttons.\n */\n children: (\n args: FieldArrayRenderItemArgs<TValues, TName>,\n controls: FieldArrayControls<TValues, TName>,\n ) => ReactElement;\n /** Override the default `aria-label` on the list root. */\n ariaLabel?: string;\n}\n\n/**\n * Render-prop wrapper around RHF's `useFieldArray`. Reads control from the\n * surrounding `<FormProvider>`. Emits an a11y-compliant `role=\"list\"` shell\n * with `role=\"listitem\"` rows keyed by RHF's stable `field.id` (NOT array\n * index — required for stable React reconciliation across move/remove).\n */\nexport function FieldArray<\n TValues extends FieldValues = FieldValues,\n TName extends ArrayPath<TValues> = ArrayPath<TValues>,\n>({ name, children, ariaLabel }: FieldArrayProps<TValues, TName>) {\n const ctx = useMosaicFormContext() as unknown as { control: unknown };\n const { fields, append, remove, move, swap } = useRhfFieldArray<TValues, TName, \"id\">({\n // biome-ignore lint/suspicious/noExplicitAny: bridging erased generic\n control: ctx.control as any,\n name: name as never,\n });\n const controls: FieldArrayControls<TValues, TName> = {\n fields: fields as ReadonlyArray<FieldArrayWithId<TValues, TName, \"id\">>,\n append,\n remove,\n move,\n swap,\n };\n return (\n <ul\n aria-label={ariaLabel ?? buildListAriaLabel(name as string)}\n style={{ listStyle: \"none\", padding: 0, margin: 0 }}\n >\n {fields.map((field, index) => (\n <li\n key={field.id}\n data-mosaic-fieldarray-item\n data-mosaic-fieldarray-name={name as string}\n data-mosaic-fieldarray-index={index}\n >\n {children(\n {\n field: field as FieldArrayWithId<TValues, TName, \"id\">,\n index,\n },\n controls,\n )}\n </li>\n ))}\n </ul>\n );\n}\n\n// Re-export a11y helpers so consumers can label their Add/Remove buttons\n// consistently with the runtime defaults.\nexport { buildListAriaLabel, buildRemoveAriaLabel };\n","/**\n * Pure helpers for Checkbox, shared by React + Preact runtimes.\n *\n * No DOM, no framework imports. Keeps the runtime surface a thin shell so\n * Standard §18 cross-runtime parity holds by reference.\n */\n\n/**\n * Resolve the effective `aria-checked` attribute value for the rendered\n * `<input type=\"checkbox\">`.\n *\n * - `indeterminate=true` → `\"mixed\"` (ARIA tri-state semantics).\n * - `checked=true` → `true`.\n * - otherwise → `false`.\n *\n * The DOM `.indeterminate` property must be set via a ref — it is not an HTML\n * attribute and cannot be set declaratively. This helper only computes the\n * ARIA value; the runtime is responsible for the DOM side-effect.\n */\nexport function resolveAriaChecked(\n checked: boolean,\n indeterminate: boolean | undefined,\n): boolean | \"mixed\" {\n if (indeterminate) return \"mixed\";\n return checked;\n}\n\n/**\n * Compute the accessible description ID to wire into `aria-describedby`.\n *\n * Returns the `descriptionId` when a `description` string is provided,\n * or `undefined` when no description is present so the attribute is omitted.\n * A falsy description short-circuits to prevent empty `aria-describedby=\"\"`.\n */\nexport function resolveDescribedBy(\n descriptionId: string,\n description: string | undefined,\n hasError: boolean,\n errorId: string,\n): string | undefined {\n const parts: string[] = [];\n if (description) parts.push(descriptionId);\n if (hasError) parts.push(errorId);\n return parts.length > 0 ? parts.join(\" \") : undefined;\n}\n","\"use client\";\n\nimport { useEffect, useId, useRef } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport {\n resolveAriaChecked,\n resolveDescribedBy,\n} from \"../../../../components/forms/Checkbox.logic.js\";\nimport { ErrorDisplay } from \"./ErrorDisplay.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface CheckboxProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n label: string;\n disabled?: boolean;\n indeterminate?: boolean;\n description?: string;\n className?: string;\n /** Optional i18n map passed through to `ErrorDisplay` for error type → message. */\n errorMessageMap?: Record<string, string>;\n}\n\n/**\n * Boolean checkbox form primitive with indeterminate state support.\n *\n * Wraps `FormField` (RHF Controller) and renders a native `<input type=\"checkbox\">` with:\n * - `indeterminate` prop — sets DOM `.indeterminate = true` via ref + `aria-checked=\"mixed\"`.\n * - `description` — rendered in a `<span>` and wired via `aria-describedby`.\n * - `aria-invalid` toggled when the field has a validation error.\n * - `aria-describedby` includes the error ID when an error exists.\n * - Bilingual-ready: `label`, `description`, and `errorMessageMap` are caller-supplied.\n */\nexport function Checkbox<TValues extends FieldValues = FieldValues>(props: CheckboxProps<TValues>) {\n const { name, label, disabled, indeterminate, description, className, errorMessageMap } = props;\n const reactId = useId();\n const fieldId = `mosaic-checkbox-${reactId}`;\n const errorId = `${fieldId}-error`;\n const descriptionId = `${fieldId}-description`;\n\n return (\n <FormField<TValues> name={name}>\n {({ field, fieldState }) => {\n const hasError = Boolean(fieldState.error);\n return (\n <CheckboxInner\n id={fieldId}\n errorId={errorId}\n descriptionId={descriptionId}\n label={label}\n checked={(field.value as boolean | undefined) ?? false}\n onChange={(next) => field.onChange(next)}\n onBlur={field.onBlur}\n disabled={disabled}\n indeterminate={indeterminate}\n description={description}\n hasError={hasError}\n className={className}\n >\n <ErrorDisplay\n error={\n fieldState.error\n ? {\n type: fieldState.error.type ?? \"validation\",\n message: fieldState.error.message,\n }\n : undefined\n }\n messageMap={errorMessageMap}\n className=\"mosaic-forms-error\"\n />\n </CheckboxInner>\n );\n }}\n </FormField>\n );\n}\n\ninterface CheckboxInnerProps {\n id: string;\n errorId: string;\n descriptionId: string;\n label: string;\n checked: boolean;\n onChange: (next: boolean) => void;\n onBlur: () => void;\n disabled: boolean | undefined;\n indeterminate: boolean | undefined;\n description: string | undefined;\n hasError: boolean;\n className: string | undefined;\n children: React.ReactNode;\n}\n\nfunction CheckboxInner(props: CheckboxInnerProps) {\n const {\n id,\n errorId,\n descriptionId,\n label,\n checked,\n onChange,\n onBlur,\n disabled,\n indeterminate,\n description,\n hasError,\n className,\n children,\n } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n\n // DOM .indeterminate is not a declarative HTML attribute — must be set via ref.\n useEffect(() => {\n if (ref.current) {\n ref.current.indeterminate = Boolean(indeterminate);\n }\n }, [indeterminate]);\n\n const ariaChecked = resolveAriaChecked(checked, indeterminate);\n const describedBy = resolveDescribedBy(descriptionId, description, hasError, errorId);\n\n return (\n <div className={className ?? \"mosaic-forms-checkbox\"}>\n <label htmlFor={id} className=\"mosaic-forms-checkbox-label\">\n <input\n ref={ref}\n type=\"checkbox\"\n id={id}\n checked={checked}\n disabled={disabled}\n aria-checked={ariaChecked}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.checked)}\n onBlur={onBlur}\n />\n {label}\n </label>\n {description ? (\n <span id={descriptionId} className=\"mosaic-forms-checkbox-description\">\n {description}\n </span>\n ) : null}\n <div id={errorId}>{children}</div>\n </div>\n );\n}\n","import type { MultiSelectOption } from \"./MultiSelect.schema.js\";\n\n/**\n * Returns the list of options that are still available for selection.\n * Filters out options already present in `selected` so they don't appear\n * twice in the dropdown.\n */\nexport function getAvailableOptions(\n options: ReadonlyArray<MultiSelectOption>,\n selected: ReadonlyArray<string>,\n): MultiSelectOption[] {\n const set = new Set(selected);\n return options.filter((opt) => !set.has(opt.value));\n}\n\n/**\n * Returns the matching `MultiSelectOption` records for the currently selected\n * values, preserving the order of `selected`. Unknown values are silently\n * dropped (graceful — schema may have shrunk under the field).\n */\nexport function getSelectedOptions(\n options: ReadonlyArray<MultiSelectOption>,\n selected: ReadonlyArray<string>,\n): MultiSelectOption[] {\n const byValue = new Map(options.map((opt) => [opt.value, opt]));\n const out: MultiSelectOption[] = [];\n for (const value of selected) {\n const opt = byValue.get(value);\n if (opt) out.push(opt);\n }\n return out;\n}\n\n/**\n * Search filter applied when `searchable=true`. Case-insensitive substring\n * match on both `label` and `value`. Empty query returns the input as-is.\n */\nexport function filterBySearch(\n options: ReadonlyArray<MultiSelectOption>,\n query: string,\n): MultiSelectOption[] {\n const q = query.trim().toLowerCase();\n if (q.length === 0) return [...options];\n return options.filter(\n (opt) => opt.label.toLowerCase().includes(q) || opt.value.toLowerCase().includes(q),\n );\n}\n\n/**\n * Adds a value to the selected list, enforcing `maxItems` (when set) and\n * de-duplicating. Returns the same array reference when the value is already\n * present OR the cap is reached — callers can compare identity to detect\n * the no-op.\n */\nexport function addValue(\n current: ReadonlyArray<string>,\n value: string,\n maxItems?: number,\n): string[] {\n if (current.includes(value)) return current as string[];\n if (typeof maxItems === \"number\" && current.length >= maxItems) return current as string[];\n return [...current, value];\n}\n\n/**\n * Removes a value from the selected list. Returns a fresh array even when\n * the value is absent so callers always see a stable shape.\n */\nexport function removeValue(current: ReadonlyArray<string>, value: string): string[] {\n return current.filter((v) => v !== value);\n}\n\n/**\n * True when the cap is reached. Used to gate further selections AND to\n * announce the locked state to the dropdown trigger via `aria-disabled`\n * semantics (the trigger itself stays focusable to preserve removal flows).\n */\nexport function isAtMaxItems(\n current: ReadonlyArray<string>,\n maxItems: number | undefined,\n): boolean {\n return typeof maxItems === \"number\" && current.length >= maxItems;\n}\n","import { z } from \"zod\";\n\n/**\n * MultiSelect props — multi-value dropdown with removable chip rendering for\n * the currently selected items. The schema validates static, serializable\n * props only. Runtime callbacks (RHF `field.onChange`, `field.onBlur`) are\n * threaded by `FormField` and live on the React/Preact interface.\n */\nexport const MultiSelectOptionSchema = z.object({\n value: z.string().min(1),\n label: z.string().min(1),\n});\n\nexport const MultiSelectPropsSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n options: z.array(MultiSelectOptionSchema).min(1),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n searchable: z.boolean().optional(),\n maxItems: z.number().int().positive().optional(),\n});\n\nexport type MultiSelectOption = z.infer<typeof MultiSelectOptionSchema>;\nexport type MultiSelectPropsValidated = z.infer<typeof MultiSelectPropsSchema>;\n","\"use client\";\n\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport {\n addValue,\n filterBySearch,\n getAvailableOptions,\n getSelectedOptions,\n isAtMaxItems,\n removeValue,\n} from \"../../../../components/forms/MultiSelect.logic.js\";\nimport { MultiSelectPropsSchema } from \"../../../../components/forms/MultiSelect.schema.js\";\nimport type { MultiSelectOption } from \"../../../../components/forms/MultiSelect.schema.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface MultiSelectProps {\n name: string;\n label: string;\n options: MultiSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n searchable?: boolean;\n maxItems?: number;\n className?: string;\n}\n\n/**\n * Multi-value dropdown. Bound to RHF via `FormField` — value lives at\n * `form.values[name]` as `string[]`. Selected values render as removable\n * chips; the dropdown lists only unselected options. WCAG-AA combobox\n * pattern: `role=combobox aria-multiselectable=true`, chip removal via\n * Backspace / Delete / per-chip close icon, Tab + Arrow nav.\n */\nexport function MultiSelect(props: MultiSelectProps) {\n const parsed = MultiSelectPropsSchema.parse({\n name: props.name,\n label: props.label,\n options: props.options,\n placeholder: props.placeholder,\n disabled: props.disabled,\n searchable: props.searchable,\n maxItems: props.maxItems,\n });\n const { name, label, options, placeholder, disabled, searchable, maxItems } = parsed;\n\n const reactId = useId();\n const triggerId = `${reactId}-trigger`;\n const listboxId = `${reactId}-listbox`;\n const labelId = `${reactId}-label`;\n\n return (\n <FormField name={name}>\n {({ field }) => {\n // RHF field.value is `unknown` (erased generic). We tighten to string[].\n const value: string[] = Array.isArray(field.value) ? (field.value as string[]) : [];\n return (\n <Inner\n triggerId={triggerId}\n listboxId={listboxId}\n labelId={labelId}\n label={label}\n options={options}\n value={value}\n disabled={disabled}\n searchable={searchable}\n maxItems={maxItems}\n placeholder={placeholder}\n onChange={(next) => field.onChange(next)}\n onBlur={() => field.onBlur()}\n className={props.className}\n />\n );\n }}\n </FormField>\n );\n}\n\ninterface InnerProps {\n triggerId: string;\n listboxId: string;\n labelId: string;\n label: string;\n options: MultiSelectOption[];\n value: string[];\n disabled?: boolean;\n searchable?: boolean;\n maxItems?: number;\n placeholder?: string;\n className?: string;\n onChange: (next: string[]) => void;\n onBlur: () => void;\n}\n\nfunction Inner(p: InnerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n\n const selectedOptions = useMemo(\n () => getSelectedOptions(p.options, p.value),\n [p.options, p.value],\n );\n const availableAfterSelect = useMemo(\n () => getAvailableOptions(p.options, p.value),\n [p.options, p.value],\n );\n const visibleOptions = useMemo(\n () => (p.searchable ? filterBySearch(availableAfterSelect, query) : availableAfterSelect),\n [availableAfterSelect, p.searchable, query],\n );\n const atMax = isAtMaxItems(p.value, p.maxItems);\n\n const handleSelect = useCallback(\n (val: string) => {\n const next = addValue(p.value, val, p.maxItems);\n if (next !== p.value) {\n p.onChange(next);\n }\n setQuery(\"\");\n },\n [p],\n );\n\n const handleRemove = useCallback(\n (val: string) => {\n p.onChange(removeValue(p.value, val));\n },\n [p],\n );\n\n const handleTriggerKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (p.disabled) return;\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\n const last = p.value[p.value.length - 1];\n if (last !== undefined) {\n e.preventDefault();\n handleRemove(last);\n }\n return;\n }\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setOpen(true);\n setActiveIndex(0);\n return;\n }\n if (e.key === \"Escape\") {\n setOpen(false);\n }\n },\n [p.disabled, p.value, handleRemove],\n );\n\n const handleListKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLUListElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, Math.max(visibleOptions.length - 1, 0)));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n const opt = visibleOptions[activeIndex];\n if (opt) handleSelect(opt.value);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n }\n },\n [visibleOptions, activeIndex, handleSelect],\n );\n\n return (\n <div className={p.className ?? \"mosaic-multiselect\"} onBlur={p.onBlur}>\n <span id={p.labelId} className=\"mosaic-multiselect-label\">\n {p.label}\n </span>\n <div className=\"mosaic-multiselect-chips\" data-testid=\"multiselect-chips\">\n {selectedOptions.map((opt) => (\n <span key={opt.value} className=\"mosaic-multiselect-chip\" data-chip-value={opt.value}>\n {opt.label}\n <button\n type=\"button\"\n aria-label={`Remove ${opt.label}`}\n data-testid={`chip-remove-${opt.value}`}\n className=\"mosaic-multiselect-chip-remove\"\n disabled={p.disabled}\n onClick={() => handleRemove(opt.value)}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n <button\n ref={triggerRef}\n id={p.triggerId}\n type=\"button\"\n // biome-ignore lint/a11y/useSemanticElements: WAI-ARIA combobox pattern requires role=combobox on the trigger element (button is the recommended host element per APG 1.2 — there is no semantic HTML equivalent for a multi-select combobox).\n role=\"combobox\"\n aria-multiselectable={true}\n aria-expanded={open}\n aria-controls={p.listboxId}\n aria-labelledby={p.labelId}\n aria-disabled={p.disabled || atMax || undefined}\n disabled={p.disabled}\n data-testid=\"multiselect-trigger\"\n className=\"mosaic-multiselect-trigger\"\n onClick={() => !p.disabled && setOpen((o) => !o)}\n onKeyDown={handleTriggerKeyDown}\n >\n {p.value.length === 0 ? (p.placeholder ?? \"Select…\") : `${p.value.length} selected`}\n </button>\n {open ? (\n <div className=\"mosaic-multiselect-panel\">\n {p.searchable ? (\n <input\n type=\"text\"\n aria-label=\"Search options\"\n data-testid=\"multiselect-search\"\n className=\"mosaic-multiselect-search\"\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setActiveIndex(0);\n }}\n />\n ) : null}\n <ul\n id={p.listboxId}\n // biome-ignore lint/a11y/useSemanticElements: APG combobox requires role=listbox on a ul container.\n // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: APG combobox listbox pattern.\n role=\"listbox\"\n aria-multiselectable={true}\n aria-labelledby={p.labelId}\n tabIndex={-1}\n className=\"mosaic-multiselect-listbox\"\n onKeyDown={handleListKeyDown}\n >\n {visibleOptions.length === 0 ? (\n <li className=\"mosaic-multiselect-empty\">No options</li>\n ) : (\n visibleOptions.map((opt, i) => (\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the listbox; APG combobox active-descendant pattern.\n // biome-ignore lint/a11y/useKeyWithClickEvents: keyboard handled at listbox level per APG.\n <li\n key={opt.value}\n // biome-ignore lint/a11y/useSemanticElements: APG combobox-listbox pattern.\n // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: APG combobox-listbox pattern.\n role=\"option\"\n aria-selected={false}\n data-testid={`option-${opt.value}`}\n data-active={i === activeIndex || undefined}\n className=\"mosaic-multiselect-option\"\n onClick={() => handleSelect(opt.value)}\n >\n {opt.label}\n </li>\n ))\n )}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n","/**\n * RadioGroup.logic.ts — pure, framework-agnostic logic.\n * No JSX here — shared between React 19 and Preact 10 runtimes.\n *\n * WCAG-AA ARIA + roving tabindex spec (WAI-ARIA Authoring Practices §3.10):\n *\n * - role=\"radiogroup\" on container\n * - role=\"radio\" + aria-checked on each radio\n * - aria-labelledby on container points to the visible group label id\n * - aria-labelledby on each radio points to its own option label span id\n * - aria-describedby on a radio points to its description span id (if present)\n * - Roving tabindex:\n * * If a value is selected → the SELECTED radio has tabIndex 0, all\n * others tabIndex -1.\n * * If nothing is selected → the FIRST enabled radio has tabIndex 0,\n * all others tabIndex -1 (so Tab can enter the group).\n * - Arrow keys (Up/Down vertical, Left/Right horizontal) MOVE focus to the\n * next/previous enabled radio AND select it (focus + selection sync — this\n * is the radiogroup pattern, distinct from tabs).\n * - Home / End jump to first / last enabled radio AND select it.\n * - Space / Enter on a non-selected focused radio selects it (no-op when\n * already selected).\n * - Disabled radios are skipped during arrow nav (findNextEnabledIndex).\n */\n\nimport type { RadioGroupOption } from \"./RadioGroup.schema.js\";\n\nexport type RadioOrientation = \"vertical\" | \"horizontal\";\n\n/**\n * Returns the prev/next key pair for the given orientation.\n *\n * Vertical group → ArrowUp/ArrowDown.\n * Horizontal group → ArrowLeft/ArrowRight.\n *\n * (Per WAI-ARIA radiogroup pattern, only one axis is used; the perpendicular\n * arrow keys are NOT intercepted — they let the user move out of the group.)\n */\nexport function getNavKeys(orientation: RadioOrientation): {\n prev: string;\n next: string;\n} {\n return orientation === \"vertical\"\n ? { prev: \"ArrowUp\", next: \"ArrowDown\" }\n : { prev: \"ArrowLeft\", next: \"ArrowRight\" };\n}\n\n/**\n * Finds the next enabled (non-disabled) option index in `direction`,\n * wrapping around at boundaries. Returns `currentIndex` if every option\n * is disabled (defensive — Zod schema requires options.length ≥ 1 but does\n * not forbid all-disabled).\n */\nexport function findNextEnabledIndex(\n options: Array<Pick<RadioGroupOption, \"disabled\">>,\n currentIndex: number,\n direction: 1 | -1,\n): number {\n const len = options.length;\n if (len === 0) return currentIndex;\n let i = (currentIndex + direction + len) % len;\n for (let tries = 0; tries < len; tries++) {\n if (!options[i]?.disabled) return i;\n i = (i + direction + len) % len;\n }\n return currentIndex;\n}\n\n/** First enabled option index, or 0 if all are disabled. */\nexport function findFirstEnabledIndex(options: Array<Pick<RadioGroupOption, \"disabled\">>): number {\n const idx = options.findIndex((o) => !o.disabled);\n return idx === -1 ? 0 : idx;\n}\n\n/** Last enabled option index, or `options.length - 1` if all are disabled. */\nexport function findLastEnabledIndex(options: Array<Pick<RadioGroupOption, \"disabled\">>): number {\n for (let i = options.length - 1; i >= 0; i--) {\n if (!options[i]?.disabled) return i;\n }\n return options.length - 1;\n}\n\n/**\n * Returns the index of the option whose `value` matches `selectedValue`,\n * or -1 if no option is selected (or the selected value points to a disabled\n * option — selected-but-disabled is a valid state, so we DON'T filter here).\n */\nexport function findSelectedIndex(\n options: Array<Pick<RadioGroupOption, \"value\">>,\n selectedValue: string | undefined,\n): number {\n if (selectedValue === undefined || selectedValue === \"\") return -1;\n return options.findIndex((o) => o.value === selectedValue);\n}\n\n/**\n * Roving tabindex resolver — returns the index that should carry tabIndex=0.\n *\n * - If something is selected → the selected index (focus follows selection).\n * - Otherwise → the first enabled option (so Tab can enter the group).\n */\nexport function getRovingTabIndex(\n options: Array<Pick<RadioGroupOption, \"value\" | \"disabled\">>,\n selectedValue: string | undefined,\n): number {\n const selectedIdx = findSelectedIndex(options, selectedValue);\n if (selectedIdx >= 0) return selectedIdx;\n return findFirstEnabledIndex(options);\n}\n\n/** Stable DOM id for the group label (linked by container aria-labelledby). */\nexport function getGroupLabelId(instanceId: string, name: string): string {\n return `${instanceId}-${name}-label`;\n}\n\n/** Stable DOM id for an option label span (linked by radio aria-labelledby). */\nexport function getOptionLabelId(instanceId: string, name: string, optionValue: string): string {\n return `${instanceId}-${name}-${optionValue}-label`;\n}\n\n/** Stable DOM id for an option description span (linked by radio aria-describedby). */\nexport function getOptionDescriptionId(\n instanceId: string,\n name: string,\n optionValue: string,\n): string {\n return `${instanceId}-${name}-${optionValue}-desc`;\n}\n\n/** Tailwind classes for the root radiogroup container. */\nexport function getGroupClasses(orientation: RadioOrientation): string {\n return orientation === \"vertical\" ? \"flex flex-col gap-2\" : \"flex flex-row flex-wrap gap-4\";\n}\n\n/** Tailwind classes for a single radio row (label + control + description). */\nexport function getOptionRowClasses(isDisabled: boolean, orientation: RadioOrientation): string {\n const base = \"flex items-start gap-2\";\n const orient = orientation === \"vertical\" ? \"flex-row\" : \"flex-row\";\n const state = isDisabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\";\n return [base, orient, state].join(\" \");\n}\n\n/** Tailwind classes for the visible radio control (the round dot). */\nexport function getRadioControlClasses(isSelected: boolean, isDisabled: boolean): string {\n const base =\n \"inline-flex items-center justify-center w-4 h-4 mt-0.5 rounded-full border-2 transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 shrink-0\";\n const state = isDisabled\n ? \"border-slate-300 bg-slate-100\"\n : isSelected\n ? \"border-blue-600 bg-white\"\n : \"border-slate-400 bg-white hover:border-slate-600\";\n return [base, state].join(\" \");\n}\n\n/** Whether a keyboard event should activate the focused radio (Space / Enter). */\nexport function isActivationKey(key: string): boolean {\n return key === \" \" || key === \"Space\" || key === \"Enter\";\n}\n","import { z } from \"zod\";\n\n// i18nKeys: RadioGroup.error.invalidProps\n\n/**\n * RadioGroup — mutually exclusive single-choice form primitive.\n *\n * - `name` RHF field name (must match `<FormField name=\"…\">` parent).\n * - `options` Ordered list of radio descriptors. Each carries a stable\n * `value` (the form value when selected), a visible `label`,\n * and an optional `description` exposed via aria-describedby.\n * - `orientation` Visual layout — vertical (default) or horizontal. Controls\n * Arrow key mapping (Up/Down vs Left/Right per WAI-ARIA).\n * - `disabled` Disables the whole group; individual options can also be\n * disabled via `options[i].disabled`.\n * - `label` Visible group label rendered above the radios; wired to\n * `role=\"radiogroup\"` via `aria-labelledby`.\n *\n * WCAG-AA contract is asserted by the runtime layer:\n * - container has `role=\"radiogroup\"` + `aria-labelledby` + `aria-orientation`.\n * - each radio has `role=\"radio\"` + `aria-checked` + `tabIndex` roving.\n * - Arrow keys move focus AND selection (WAI-ARIA radiogroup pattern §3.10).\n * - Space/Enter activates the currently focused radio.\n * - Disabled radios are skipped during keyboard navigation.\n */\nexport const RadioGroupOptionSchema = z.object({\n value: z.string().min(1),\n label: z.string().min(1),\n description: z.string().optional(),\n disabled: z.boolean().optional().default(false),\n});\n\nexport type RadioGroupOption = z.infer<typeof RadioGroupOptionSchema>;\n\nexport const RadioGroupPropsSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n options: z.array(RadioGroupOptionSchema).min(1),\n orientation: z.enum([\"vertical\", \"horizontal\"]).default(\"vertical\"),\n disabled: z.boolean().optional().default(false),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type RadioGroupPropsValidated = z.infer<typeof RadioGroupPropsSchema>;\n\n/** Runtime props — RHF Controller field+fieldState are not serialisable so live outside the Zod schema. */\nexport type RadioGroupProps = RadioGroupPropsValidated;\n\nexport function validateRadioGroupProps(raw: unknown): RadioGroupPropsValidated {\n return RadioGroupPropsSchema.parse(raw);\n}\n","\"use client\";\n\nimport { useCallback, useId, useRef } from \"react\";\nimport {\n findFirstEnabledIndex,\n findLastEnabledIndex,\n findNextEnabledIndex,\n getGroupClasses,\n getGroupLabelId,\n getNavKeys,\n getOptionDescriptionId,\n getOptionLabelId,\n getOptionRowClasses,\n getRovingTabIndex,\n isActivationKey,\n} from \"../../../../components/forms/RadioGroup.logic.js\";\nimport { validateRadioGroupProps } from \"../../../../components/forms/RadioGroup.schema.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface RadioGroupProps {\n name: string;\n label: string;\n options: Array<{\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n }>;\n orientation?: \"vertical\" | \"horizontal\";\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * RadioGroup — mutually exclusive single-choice primitive, WCAG-AA compliant.\n *\n * Uses native `<input type=\"radio\">` elements for browser-native semantics\n * while implementing roving tabIndex + Arrow key selection sync per the\n * WAI-ARIA radiogroup pattern (§3.10).\n *\n * ARIA contract:\n * - `role=\"radiogroup\"` + `aria-labelledby` on the container (fieldset equivalent)\n * - Native `<input type=\"radio\">` per option — browser provides role + aria-checked\n * - `aria-labelledby` per input → its `<label>` span id\n * - `aria-describedby` per input → its description span id (when present)\n * - Roving tabIndex — selected radio has tabIndex 0, all others -1\n * - Arrow keys move focus AND selection (WAI-ARIA §3.10)\n * - Home/End jump to first/last enabled option\n * - Space/Enter activate the focused radio\n * - Disabled radios are skipped during arrow navigation\n */\nexport function RadioGroup(props: RadioGroupProps) {\n const validated = validateRadioGroupProps({\n name: props.name,\n label: props.label,\n options: props.options,\n orientation: props.orientation,\n disabled: props.disabled,\n });\n\n const { name, label, options, orientation, disabled } = validated;\n\n const instanceId = useId();\n const groupLabelId = getGroupLabelId(instanceId, name);\n const { prev: prevKey, next: nextKey } = getNavKeys(orientation);\n\n const radioRefs = useRef<Array<HTMLInputElement | null>>([]);\n\n const focusAndSelect = useCallback(\n (index: number, onChange: (value: string) => void) => {\n const el = radioRefs.current[index];\n if (el) el.focus();\n const opt = options[index];\n if (opt && !opt.disabled) {\n onChange(opt.value);\n }\n },\n [options],\n );\n\n return (\n <FormField name={name}>\n {({ field, fieldState }) => {\n const selectedValue = field.value as string | undefined;\n const rovingIdx = getRovingTabIndex(options, selectedValue);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, currentIndex: number) => {\n const { key } = e;\n\n if (key === prevKey || key === nextKey) {\n e.preventDefault();\n const direction = key === nextKey ? 1 : -1;\n const nextIdx = findNextEnabledIndex(options, currentIndex, direction);\n focusAndSelect(nextIdx, field.onChange);\n return;\n }\n\n if (key === \"Home\") {\n e.preventDefault();\n focusAndSelect(findFirstEnabledIndex(options), field.onChange);\n return;\n }\n\n if (key === \"End\") {\n e.preventDefault();\n focusAndSelect(findLastEnabledIndex(options), field.onChange);\n return;\n }\n\n if (isActivationKey(key)) {\n e.preventDefault();\n const opt = options[currentIndex];\n if (opt && !opt.disabled) {\n field.onChange(opt.value);\n }\n }\n };\n\n return (\n <div className={props.className ?? \"mosaic-forms-radiogroup\"}>\n <span id={groupLabelId} className=\"mosaic-forms-radiogroup-label\">\n {label}\n </span>\n <div\n role=\"radiogroup\"\n aria-labelledby={groupLabelId}\n aria-orientation={orientation}\n aria-disabled={disabled || undefined}\n className={getGroupClasses(orientation)}\n >\n {options.map((option, index) => {\n const isSelected = selectedValue === option.value;\n const isDisabled = !!(disabled || option.disabled);\n const optLabelId = getOptionLabelId(instanceId, name, option.value);\n const optDescId = option.description\n ? getOptionDescriptionId(instanceId, name, option.value)\n : undefined;\n const tabIdx = index === rovingIdx ? 0 : -1;\n\n return (\n <div key={option.value} className={getOptionRowClasses(isDisabled, orientation)}>\n <input\n ref={(el) => {\n radioRefs.current[index] = el;\n }}\n type=\"radio\"\n id={`${instanceId}-${name}-${option.value}`}\n name={field.name}\n value={option.value}\n checked={isSelected}\n disabled={isDisabled}\n aria-labelledby={optLabelId}\n aria-describedby={optDescId}\n tabIndex={isDisabled ? -1 : tabIdx}\n className=\"mosaic-forms-radiogroup-input sr-only\"\n onChange={() => {\n field.onChange(option.value);\n }}\n onKeyDown={(e) => {\n if (!isDisabled) handleKeyDown(e, index);\n }}\n onBlur={field.onBlur}\n />\n <div className=\"flex flex-col gap-0.5\">\n <span id={optLabelId} className=\"mosaic-forms-radiogroup-option-label\">\n {option.label}\n </span>\n {option.description ? (\n <span\n id={optDescId}\n className=\"mosaic-forms-radiogroup-option-description text-sm text-slate-500\"\n >\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n {fieldState.error ? (\n <span role=\"alert\" className=\"mosaic-forms-radiogroup-error text-sm text-red-600\">\n {fieldState.error.message}\n </span>\n ) : null}\n </div>\n );\n }}\n </FormField>\n );\n}\n","/**\n * Select.logic.ts — pure, framework-agnostic logic for the Select primitive.\n * Shared between React 19 and Preact 10 runtimes.\n *\n * WCAG-AA Combobox-with-listbox-popup pattern (APG 2024):\n * - Trigger: role=combobox + aria-haspopup=listbox + aria-expanded + aria-controls\n * - Popup: role=listbox + aria-activedescendant pointing at active option\n * - Option: role=option + aria-selected=true on the selected one\n * - Keyboard:\n * ArrowDown → next enabled option (wrap)\n * ArrowUp → prev enabled option (wrap)\n * Home → first enabled option\n * End → last enabled option\n * Enter → commit active option, close popup\n * Esc → close popup, restore value, focus trigger\n * Printable type-ahead → jump to first option whose label starts with the buffer\n */\n\nimport type { SelectOption } from \"./Select.schema.js\";\n\nexport function getTriggerId(instanceId: string): string {\n return `${instanceId}-trigger`;\n}\nexport function getListboxId(instanceId: string): string {\n return `${instanceId}-listbox`;\n}\nexport function getOptionId(instanceId: string, value: string): string {\n return `${instanceId}-opt-${value}`;\n}\n\n/**\n * Filters options by case-insensitive substring on `label`. Empty query → all.\n * Disabled flags are preserved (they're still rendered, just not selectable).\n */\nexport function filterOptions(options: SelectOption[], query: string): SelectOption[] {\n const q = query.trim().toLowerCase();\n if (q === \"\") return options;\n return options.filter((o) => o.label.toLowerCase().includes(q));\n}\n\n/**\n * Finds the index of the option with `value`, or -1.\n */\nexport function indexOfValue(options: SelectOption[], value: string | null | undefined): number {\n if (value == null) return -1;\n return options.findIndex((o) => o.value === value);\n}\n\n/**\n * Walk forward/backward to the next enabled option, wrapping. Returns -1\n * if no enabled option exists (defensive — schema requires min(1)).\n */\nexport function findNextEnabledIndex(\n options: SelectOption[],\n startIndex: number,\n direction: 1 | -1,\n): number {\n const len = options.length;\n if (len === 0) return -1;\n let i = startIndex;\n for (let tries = 0; tries < len; tries++) {\n i = (i + direction + len) % len;\n if (!options[i]?.disabled) return i;\n }\n return -1;\n}\n\nexport function findFirstEnabledIndex(options: SelectOption[]): number {\n const idx = options.findIndex((o) => !o.disabled);\n return idx === -1 ? -1 : idx;\n}\n\nexport function findLastEnabledIndex(options: SelectOption[]): number {\n for (let i = options.length - 1; i >= 0; i--) {\n if (!options[i]?.disabled) return i;\n }\n return -1;\n}\n\n/**\n * Type-ahead: given a buffer string, find first option whose label starts with\n * the buffer (case-insensitive). Skips disabled options.\n */\nexport function findByTypeAhead(options: SelectOption[], buffer: string): number {\n if (buffer === \"\") return -1;\n const needle = buffer.toLowerCase();\n for (let i = 0; i < options.length; i++) {\n const o = options[i];\n if (!o || o.disabled) continue;\n if (o.label.toLowerCase().startsWith(needle)) return i;\n }\n return -1;\n}\n\n/**\n * Tailwind class for the trigger button.\n */\nexport function getTriggerClasses(isDisabled: boolean, isOpen: boolean): string {\n const base =\n \"inline-flex items-center justify-between gap-2 w-full rounded-md border px-3 py-2 text-sm transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600\";\n const state = isDisabled\n ? \"border-slate-200 text-slate-400 bg-slate-50 cursor-not-allowed\"\n : isOpen\n ? \"border-blue-600 bg-white text-slate-900\"\n : \"border-slate-300 bg-white text-slate-900 hover:border-slate-400\";\n return `${base} ${state}`;\n}\n\nexport function getListboxClasses(): string {\n return \"absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-md border border-slate-200 bg-white py-1 shadow-lg focus:outline-none\";\n}\n\nexport function getOptionClasses(\n isActive: boolean,\n isSelected: boolean,\n isDisabled: boolean,\n): string {\n const base = \"flex items-center px-3 py-2 text-sm select-none\";\n if (isDisabled) return `${base} text-slate-400 cursor-not-allowed`;\n const active = isActive ? \"bg-blue-50 text-blue-900\" : \"text-slate-900\";\n const selected = isSelected ? \"font-medium\" : \"\";\n return `${base} ${active} ${selected} cursor-pointer`;\n}\n\nexport function getSearchInputClasses(): string {\n return \"w-full px-3 py-2 text-sm border-b border-slate-200 focus:outline-none focus:border-blue-600\";\n}\n\n/**\n * Resolves the label of the currently selected option for display in the trigger.\n * Returns null when no value selected (caller shows placeholder).\n */\nexport function resolveSelectedLabel(\n options: SelectOption[],\n value: string | null | undefined,\n): string | null {\n if (value == null) return null;\n const o = options.find((opt) => opt.value === value);\n return o?.label ?? null;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport type { FieldValues, Path } from \"react-hook-form\";\nimport {\n filterOptions,\n findByTypeAhead,\n findFirstEnabledIndex,\n findLastEnabledIndex,\n findNextEnabledIndex,\n getListboxClasses,\n getListboxId,\n getOptionClasses,\n getOptionId,\n getSearchInputClasses,\n getTriggerClasses,\n getTriggerId,\n indexOfValue,\n resolveSelectedLabel,\n} from \"../../../../components/forms/Select.logic.js\";\nimport type { SelectOption } from \"../../../../components/forms/Select.schema.js\";\nimport { ErrorDisplay } from \"./ErrorDisplay.js\";\nimport { FormField } from \"./FormField.js\";\n\nexport interface SelectProps<TValues extends FieldValues = FieldValues> {\n name: Path<TValues>;\n label: string;\n options: SelectOption[];\n placeholder?: string;\n disabled?: boolean;\n searchable?: boolean;\n className?: string;\n /** Optional i18n map passed through to `ErrorDisplay` for error type → message. */\n errorMessageMap?: Record<string, string>;\n}\n\n/**\n * Single-select dropdown primitive — combobox+listbox APG pattern.\n * Wraps `FormField` (RHF Controller) and exposes error state via `ErrorDisplay`.\n * WCAG-AA strict.\n *\n * The visible value-label is shown in the trigger button; the listbox popup\n * uses `aria-activedescendant` to track keyboard focus without moving DOM focus\n * (focus stays on the trigger or the search input).\n */\nexport function Select<TValues extends FieldValues = FieldValues>({\n name,\n label,\n options,\n placeholder,\n disabled = false,\n searchable = false,\n className,\n errorMessageMap,\n}: SelectProps<TValues>) {\n const reactId = useId();\n const instanceId = `mosaic-select-${reactId.replace(/[^a-zA-Z0-9-]/g, \"\")}`;\n const triggerId = getTriggerId(instanceId);\n const listboxId = getListboxId(instanceId);\n const labelId = `${instanceId}-label`;\n const errorId = `${instanceId}-error`;\n\n return (\n <FormField<TValues> name={name}>\n {({ field, fieldState }) => {\n const hasError = Boolean(fieldState.error);\n return (\n <SelectInner\n field={\n field as unknown as {\n value: string | null;\n onChange: (v: string) => void;\n onBlur: () => void;\n ref: (el: HTMLElement | null) => void;\n }\n }\n label={label}\n labelId={labelId}\n triggerId={triggerId}\n listboxId={listboxId}\n errorId={errorId}\n instanceId={instanceId}\n options={options}\n placeholder={placeholder}\n disabled={disabled}\n searchable={searchable}\n className={className}\n hasError={hasError}\n >\n <ErrorDisplay\n error={\n fieldState.error\n ? {\n type: fieldState.error.type ?? \"validation\",\n message: fieldState.error.message,\n }\n : undefined\n }\n messageMap={errorMessageMap}\n className=\"mosaic-forms-error\"\n />\n </SelectInner>\n );\n }}\n </FormField>\n );\n}\n\ninterface InnerProps {\n field: {\n value: string | null;\n onChange: (v: string) => void;\n onBlur: () => void;\n ref: (el: HTMLElement | null) => void;\n };\n label: string;\n labelId: string;\n triggerId: string;\n listboxId: string;\n errorId: string;\n instanceId: string;\n options: SelectOption[];\n placeholder?: string;\n disabled: boolean;\n searchable: boolean;\n className?: string;\n hasError: boolean;\n children: React.ReactNode;\n}\n\nfunction SelectInner({\n field,\n label,\n labelId,\n triggerId,\n listboxId,\n errorId,\n instanceId,\n options,\n placeholder,\n disabled,\n searchable,\n className,\n hasError,\n children,\n}: InnerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n const typeAheadRef = useRef<{ buffer: string; timer: ReturnType<typeof setTimeout> | null }>({\n buffer: \"\",\n timer: null,\n });\n\n const visibleOptions = useMemo(\n () => (searchable ? filterOptions(options, query) : options),\n [options, query, searchable],\n );\n\n // Keep activeIndex coherent when popup opens or filter changes\n useEffect(() => {\n if (!isOpen) return;\n const selectedIdx = indexOfValue(visibleOptions, field.value);\n if (selectedIdx >= 0 && !visibleOptions[selectedIdx]?.disabled) {\n setActiveIndex(selectedIdx);\n } else {\n setActiveIndex(findFirstEnabledIndex(visibleOptions));\n }\n }, [isOpen, visibleOptions, field.value]);\n\n const closePopup = useCallback((restoreFocus = true) => {\n setIsOpen(false);\n setQuery(\"\");\n if (restoreFocus) triggerRef.current?.focus();\n }, []);\n\n const commitOption = useCallback(\n (idx: number) => {\n const opt = visibleOptions[idx];\n if (!opt || opt.disabled) return;\n field.onChange(opt.value);\n closePopup(true);\n field.onBlur();\n },\n [visibleOptions, field, closePopup],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n if (!isOpen) {\n // Closed: open on Enter/Space/ArrowDown/ArrowUp\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n setIsOpen(true);\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const start = activeIndex < 0 ? -1 : activeIndex;\n const next = findNextEnabledIndex(visibleOptions, start, 1);\n if (next >= 0) setActiveIndex(next);\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const start = activeIndex < 0 ? visibleOptions.length : activeIndex;\n const prev = findNextEnabledIndex(visibleOptions, start, -1);\n if (prev >= 0) setActiveIndex(prev);\n break;\n }\n case \"Home\": {\n e.preventDefault();\n const first = findFirstEnabledIndex(visibleOptions);\n if (first >= 0) setActiveIndex(first);\n break;\n }\n case \"End\": {\n e.preventDefault();\n const last = findLastEnabledIndex(visibleOptions);\n if (last >= 0) setActiveIndex(last);\n break;\n }\n case \"Enter\": {\n e.preventDefault();\n if (activeIndex >= 0) commitOption(activeIndex);\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n closePopup(true);\n break;\n }\n default: {\n // Type-ahead when search input is not the active typing surface\n if (!searchable && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n e.preventDefault();\n const ta = typeAheadRef.current;\n ta.buffer += e.key.toLowerCase();\n if (ta.timer) clearTimeout(ta.timer);\n ta.timer = setTimeout(() => {\n ta.buffer = \"\";\n }, 500);\n const idx = findByTypeAhead(visibleOptions, ta.buffer);\n if (idx >= 0) setActiveIndex(idx);\n }\n break;\n }\n }\n },\n [activeIndex, closePopup, commitOption, disabled, isOpen, searchable, visibleOptions],\n );\n\n // Close on outside click\n const rootRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!isOpen) return;\n function onDocClick(e: MouseEvent) {\n if (!rootRef.current) return;\n if (!rootRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n setQuery(\"\");\n field.onBlur();\n }\n }\n document.addEventListener(\"mousedown\", onDocClick);\n return () => document.removeEventListener(\"mousedown\", onDocClick);\n }, [isOpen, field]);\n\n const selectedLabel = resolveSelectedLabel(options, field.value);\n const activeId =\n activeIndex >= 0\n ? getOptionId(instanceId, visibleOptions[activeIndex]?.value ?? \"\")\n : undefined;\n\n return (\n <div ref={rootRef} className={className ?? \"relative inline-block w-full\"}>\n <label\n id={labelId}\n htmlFor={triggerId}\n className=\"block text-sm font-medium text-slate-700 mb-1\"\n >\n {label}\n </label>\n <button\n type=\"button\"\n id={triggerId}\n ref={(el) => {\n triggerRef.current = el;\n field.ref(el);\n }}\n // biome-ignore lint/a11y/useSemanticElements: APG combobox pattern — native <select> cannot host a searchable custom listbox; the ARIA combobox role is the spec-correct construct\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-labelledby={labelId}\n aria-activedescendant={isOpen ? activeId : undefined}\n aria-invalid={hasError || undefined}\n aria-describedby={hasError ? errorId : undefined}\n disabled={disabled}\n className={getTriggerClasses(disabled, isOpen)}\n onClick={() => !disabled && setIsOpen((o) => !o)}\n onKeyDown={handleKeyDown}\n onBlur={(e) => {\n // Don't blur if focus moves into the popup\n if (rootRef.current?.contains(e.relatedTarget as Node | null)) return;\n if (!isOpen) field.onBlur();\n }}\n >\n <span className={selectedLabel ? \"\" : \"text-slate-400\"}>\n {selectedLabel ?? placeholder ?? \"\"}\n </span>\n <span aria-hidden=\"true\">▾</span>\n </button>\n\n {isOpen ? (\n <div className={getListboxClasses()}>\n {searchable ? (\n <input\n ref={searchRef}\n type=\"text\"\n className={getSearchInputClasses()}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Search…\"\n // biome-ignore lint/a11y/noAutofocus: focus follows popup open per APG combobox pattern\n autoFocus\n aria-label=\"Search options\"\n />\n ) : null}\n {/* biome-ignore lint/a11y/useSemanticElements: APG listbox pattern — ul/li with listbox/option roles is the WAI-ARIA APG canonical structure */}\n {/* biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: APG listbox pattern — ul/li with listbox/option roles is the WAI-ARIA APG canonical structure */}\n <ul id={listboxId} role=\"listbox\" aria-labelledby={labelId} tabIndex={-1}>\n {visibleOptions.length === 0 ? (\n <li className=\"px-3 py-2 text-sm text-slate-500\" role=\"presentation\">\n No options\n </li>\n ) : (\n visibleOptions.map((opt, idx) => {\n const isSelected = opt.value === field.value;\n const isActive = idx === activeIndex;\n return (\n // biome-ignore lint/a11y/useFocusableInteractive: APG combobox — options are managed via aria-activedescendant on the combobox and are intentionally not in the tab order\n <li\n key={opt.value}\n id={getOptionId(instanceId, opt.value)}\n // biome-ignore lint/a11y/useSemanticElements: APG listbox pattern — ul/li with listbox/option roles is the WAI-ARIA APG canonical structure\n // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: APG listbox pattern — ul/li with listbox/option roles is the WAI-ARIA APG canonical structure\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={opt.disabled || undefined}\n className={getOptionClasses(isActive, isSelected, !!opt.disabled)}\n onMouseDown={(e) => {\n e.preventDefault(); // keep trigger focus\n if (!opt.disabled) commitOption(idx);\n }}\n onMouseEnter={() => {\n if (!opt.disabled) setActiveIndex(idx);\n }}\n >\n {opt.label}\n </li>\n );\n })\n )}\n </ul>\n </div>\n ) : null}\n\n <div id={errorId}>{children}</div>\n </div>\n );\n}\n","import { z } from \"zod\";\n\n/**\n * ErrorDisplay accepts an RHF-shaped field error plus an optional consumer\n * message map for i18n. The structure mirrors RHF `FieldError`:\n * `{ type: string, message?: string }`.\n */\nexport const FieldErrorShapeSchema = z.object({\n type: z.string(),\n message: z.string().optional(),\n});\n\nexport const ErrorDisplayPropsSchema = z.object({\n error: FieldErrorShapeSchema.optional(),\n messageMap: z.record(z.string(), z.string()).optional(),\n});\n\nexport type ErrorDisplayPropsValidated = z.infer<typeof ErrorDisplayPropsSchema>;\nexport type FieldErrorShape = z.infer<typeof FieldErrorShapeSchema>;\n","import { z } from \"zod\";\n\n/**\n * FormField props — the field `name` selects a property on the form values.\n * Children are a render-prop receiving `field`, `fieldState`, `formState`\n * from RHF Controller; that contract is enforced at the TypeScript layer.\n */\nexport const FormFieldPropsSchema = z.object({\n name: z.string().min(1),\n});\n\nexport type FormFieldPropsValidated = z.infer<typeof FormFieldPropsSchema>;\n","import { z } from \"zod\";\n\n/**\n * FormProvider props that need runtime validation are minimal — the `form`\n * object comes from `useMosaicForm()` and carries its own typed contract,\n * while `children` are framework JSX. This schema exists for future-proofing\n * (e.g. optional `name` for nested form contexts).\n */\nexport const FormProviderPropsSchema = z.object({\n name: z.string().optional(),\n});\n\nexport type FormProviderPropsValidated = z.infer<typeof FormProviderPropsSchema>;\n","import { z } from \"zod\";\n\n/**\n * Input primitive props — bound to the surrounding `FormProvider` by `name`.\n *\n * - `name` selects a property on the form values (RHF path).\n * - `type` covers the 5 baseline text-like HTML input types (T11 scope).\n * - `placeholder` / `disabled` / `autoComplete` are passthrough DOM props.\n * - `label` is consumer-driven i18n: the caller supplies the localized string,\n * the component never renders raw alphabetic text as JSXText children.\n *\n * Field primitives outside this 5-type baseline (checkbox/radio/file/etc.)\n * land in dedicated T12-T20 components per `docs/v0.3.0-plan.md` §7.\n */\nexport const InputTypeSchema = z.enum([\"text\", \"email\", \"password\", \"number\", \"url\"]);\n\nexport const InputPropsSchema = z.object({\n name: z.string().min(1),\n type: InputTypeSchema.default(\"text\").optional(),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n autoComplete: z.string().optional(),\n label: z.string().min(1),\n});\n\nexport type InputType = z.infer<typeof InputTypeSchema>;\nexport type InputPropsValidated = z.infer<typeof InputPropsSchema>;\n","import { z } from \"zod\";\n\n/**\n * Textarea — multi-line text input form primitive.\n *\n * Props contract (Zod-validated at boundary, mirrors React/Preact runtime types).\n *\n * - `name` — required, non-empty. Selects a property on the surrounding form values.\n * - `rows` — default 3, integer ≥ 1. Maps to native textarea `rows` attribute.\n * - `maxLength` — optional, integer ≥ 1. Caller-controlled length cap. Enforced by\n * pure logic helpers so React and Preact runtimes share gating semantics.\n * - `autoResize` — default false. When true, runtime grows the textarea to fit\n * content (capped by CSS `max-height` if set by consumer).\n * - `placeholder` — optional string.\n * - `disabled` — optional boolean.\n * - `label` — optional string (rendered above the textarea, bilingual-ready).\n */\nexport const TextareaPropsSchema = z.object({\n name: z.string().min(1),\n rows: z.number().int().min(1).default(3),\n maxLength: z.number().int().min(1).optional(),\n autoResize: z.boolean().default(false),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional(),\n label: z.string().optional(),\n});\n\nexport type TextareaPropsValidated = z.infer<typeof TextareaPropsSchema>;\n\nexport function validateTextareaProps(raw: unknown): TextareaPropsValidated {\n return TextareaPropsSchema.parse(raw);\n}\n","import { z } from \"zod\";\n\n/**\n * FieldArray props — `name` selects the array path on the form values.\n * `children` is a render-prop receiving `(field, index)` for each entry\n * AND a third arg with the controls `{ append, remove, move, swap, fields }`.\n * That contract is enforced at the TypeScript layer.\n */\nexport const FieldArrayPropsSchema = z.object({\n name: z.string().min(1),\n});\n\nexport type FieldArrayPropsValidated = z.infer<typeof FieldArrayPropsSchema>;\n\n/**\n * Options accepted by `useFieldArray` — thin re-export of the underlying\n * RHF shape. We validate `name` here for parity with FieldArray.\n */\nexport const UseFieldArrayOptionsSchema = z.object({\n name: z.string().min(1),\n});\n\nexport type UseFieldArrayOptionsValidated = z.infer<typeof UseFieldArrayOptionsSchema>;\n","import { z } from \"zod\";\n\n/**\n * Checkbox — boolean form primitive with indeterminate state support.\n *\n * Props contract (Zod-validated at boundary, mirrors React/Preact runtime types).\n *\n * - `name` — required, non-empty. Selects a property on the surrounding form values.\n * - `label` — required, non-empty. Rendered adjacent to the checkbox (bilingual-ready).\n * - `disabled` — optional boolean. Maps to native `disabled` attribute.\n * - `indeterminate` — optional boolean. When true, sets DOM `.indeterminate = true`\n * via ref and aria-checked=\"mixed\". Controlled externally — the component does not\n * manage this state internally.\n * - `description` — optional string. Wired via `aria-describedby` for screen readers.\n */\nexport const CheckboxPropsSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n disabled: z.boolean().optional(),\n indeterminate: z.boolean().optional(),\n description: z.string().optional(),\n});\n\nexport type CheckboxPropsValidated = z.infer<typeof CheckboxPropsSchema>;\n\nexport function validateCheckboxProps(raw: unknown): CheckboxPropsValidated {\n return CheckboxPropsSchema.parse(raw);\n}\n","import { z } from \"zod\";\n\n// i18nKeys: Select.placeholder, Select.search.placeholder, Select.empty\n\n/**\n * Select primitive — single-select dropdown with optional search.\n *\n * Combobox-pattern (APG): a trigger button (role=combobox) opens a listbox\n * popup containing option rows. Optional in-popup search filters the visible\n * options client-side. Cross-runtime (React 19 + Preact 10).\n *\n * The `name` is the react-hook-form field name used by the surrounding\n * `<FormProvider>`. The render-prop wiring lives in FormField/Controller; this\n * component is rendered INSIDE a FormField render prop and consumes the\n * `field` callbacks directly (see Select.stories.tsx).\n */\nexport const SelectOptionSchema = z.object({\n value: z.string().min(1),\n label: z.string().min(1),\n disabled: z.boolean().optional().default(false),\n});\n\nexport type SelectOption = z.infer<typeof SelectOptionSchema>;\n\nexport const SelectPropsSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n options: z.array(SelectOptionSchema).min(1),\n placeholder: z.string().optional(),\n disabled: z.boolean().optional().default(false),\n searchable: z.boolean().optional().default(false),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type SelectPropsValidated = z.infer<typeof SelectPropsSchema>;\n\nexport function validateSelectProps(raw: unknown): SelectPropsValidated {\n return SelectPropsSchema.parse(raw);\n}\n"]}