@marktiderman/genesis-forms-web 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -5
- package/dist/index.d.ts +29 -3
- package/dist/index.js +642 -6
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/presentation.ts","../src/renderers.tsx","../src/Form.tsx"],"names":["jsx","jsxs","cn","useRef"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\n\n/**\n * How `<Form>` sits on the page. `\"embedded\"` is a block inside your app's own\n * page. `\"page\"` is the respondent's whole screen (a QR code, a shared link):\n * it fills the viewport and draws no card around the form.\n */\nexport type FormPresentation = \"embedded\" | \"page\";\n\nexport interface FormPresentationValue {\n presentation: FormPresentation;\n layout: \"focus\" | \"classic\";\n}\n\nconst FormPresentationContext = createContext<FormPresentationValue>({ presentation: \"embedded\", layout: \"classic\" });\n\nexport const FormPresentationProvider = FormPresentationContext.Provider;\n\n/**\n * The presentation and layout of the enclosing `<Form>`, so a custom slot or\n * renderer can match the built-in ones (larger type and tap targets in page\n * mode, for example). Outside a `<Form>` it reads embedded and classic.\n */\nexport function useFormPresentation(): FormPresentationValue {\n return useContext(FormPresentationContext);\n}\n","import { useRef, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Checkbox } from \"@marktiderman/genesis-ui/checkbox\";\nimport { FormDescription, FormError, FormLabel } from \"@marktiderman/genesis-ui/form-field\";\nimport { Input } from \"@marktiderman/genesis-ui/input\";\nimport { Label } from \"@marktiderman/genesis-ui/label\";\nimport { RadioGroup, RadioGroupItem } from \"@marktiderman/genesis-ui/radio-group\";\nimport { Textarea } from \"@marktiderman/genesis-ui/textarea\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport { choiceOptions, getFieldType, type Json } from \"@marktiderman/genesis-forms\";\nimport { createRendererRegistry, type FieldRendererProps, type RendererEntry } from \"@marktiderman/genesis-forms-react\";\nimport { useFormPresentation } from \"./presentation\";\n\n/** The visible question text takes focus in the focus layout, so it needs a focus ring of its own. */\nconst questionFocus =\n \"rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background\";\n\n// ── Field chrome ─────────────────────────────────────────────────────────────\n\nexport interface FieldChromeProps {\n props: FieldRendererProps;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Label, description and error around a control. Group types (radio,\n * checkbox list, rating, scale) get a real `fieldset`/`legend`, so a screen\n * reader announces the question with every option; the fieldset carries the\n * field's `inputId` (an error summary links to it) and `aria-describedby`.\n * `aria-invalid` sits on the controls: ARIA 1.2 doesn't allow it on a group.\n *\n * The legend or label is the question text: it has `id=\"${inputId}-label\"`\n * and `tabIndex={-1}` and is marked `data-gf-question`, which the focus\n * layout focuses on each new question unless the control is marked\n * `data-gf-focus` (text fields mark their input, so typing just works).\n */\nexport function FieldChrome({ props, children, className }: FieldChromeProps) {\n const { binding, inputId } = props;\n const { field, error, label } = binding;\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const pageClassic = presentation === \"page\" && layout === \"classic\";\n const group = getFieldType(field.type)?.a11y.semantics === \"group\";\n const description = field.description ? props.engine.text(field.description) : undefined;\n // Page focus: the question is the headline, the answer sits well below it.\n const questionSize = pageFocus\n ? \"text-2xl font-semibold leading-tight tracking-tight text-balance sm:text-3xl\"\n : pageClassic\n ? \"text-lg font-medium leading-snug\"\n : \"text-base\";\n const body = (\n <>\n {description ? (\n <FormDescription id={`${inputId}-desc`} className={cn(pageFocus && \"text-base sm:text-lg text-pretty\")}>\n {description}\n </FormDescription>\n ) : null}\n {pageFocus ? <div className=\"pt-6 sm:pt-8\">{children}</div> : children}\n {/* No role=\"alert\": the layout announces errors once (focus layout) or focuses a summary (classic). */}\n {pageFocus ? (\n // A calm note under the answer, Typeform style; the question keeps its colour.\n error ? (\n <FormError\n id={`${inputId}-error`}\n // Solid fill: the dark theme's destructive is a background shade, too dim as text.\n className=\"mt-4 inline-flex items-center gap-2 rounded-md bg-destructive px-3 py-2 text-sm text-destructive-foreground\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4M12 16h.01\" strokeLinecap=\"round\" />\n </svg>\n {error}\n </FormError>\n ) : null\n ) : (\n <FormError id={`${inputId}-error`}>{error}</FormError>\n )}\n </>\n );\n if (group) {\n return (\n <fieldset\n id={inputId}\n data-slot=\"form-field\"\n aria-describedby={describedBy(props)}\n className={cn(\"space-y-3 border-0 p-0 m-0 min-w-0\", className)}\n >\n <legend\n id={`${inputId}-label`}\n tabIndex={-1}\n data-gf-question=\"\"\n className={cn(\n \"mb-3 font-medium\",\n questionSize,\n pageFocus && \"mb-0\",\n questionFocus,\n error && !pageFocus && \"text-destructive\",\n )}\n >\n {label}\n {field.required ? (\n <span className=\"text-destructive ml-1\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </legend>\n {body}\n </fieldset>\n );\n }\n return (\n <div data-slot=\"form-field\" className={cn(\"space-y-2\", pageFocus && \"space-y-3\", className)}>\n <FormLabel\n id={`${inputId}-label`}\n htmlFor={inputId}\n tabIndex={-1}\n data-gf-question=\"\"\n error={Boolean(error) && !pageFocus}\n required={field.required}\n className={cn(presentation === \"page\" && \"block\", questionSize, questionFocus)}\n >\n {label}\n </FormLabel>\n {body}\n </div>\n );\n}\n\nexport function describedBy(props: FieldRendererProps): string | undefined {\n const ids = [\n props.binding.field.description ? `${props.inputId}-desc` : null,\n props.binding.error ? `${props.inputId}-error` : null,\n ].filter(Boolean);\n return ids.length ? ids.join(\" \") : undefined;\n}\n\n/** The ARIA a radio group root needs to be named by the legend and report its state. */\nfunction groupAria(props: FieldRendererProps) {\n return {\n \"aria-labelledby\": `${props.inputId}-label`,\n \"aria-required\": props.binding.field.required || undefined,\n \"aria-invalid\": props.binding.error ? true : undefined,\n } as const;\n}\n\n// ── Deliberate picks ─────────────────────────────────────────────────────────\n\nconst NAVIGATION_KEYS = new Set([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\"]);\n/** Radix checks the newly focused radio a tick after the key, so allow a short window. */\nconst NAVIGATION_WINDOW_MS = 500;\n\n/**\n * A radio group checks whichever option arrow keys move to (WAI-ARIA APG),\n * and Radix does it by clicking that option. Only a pick the respondent meant\n * (a click or tap, Space, Enter, assistive tech activating it) may advance,\n * so this remembers whether a navigation key just went down and ignores the\n * click it causes. Clicking the option that is already checked still counts,\n * so after Back a respondent can confirm the same answer and move on.\n */\nfunction useDeliberatePick(onAdvance: (() => void) | undefined) {\n const lastKey = useRef<{ key: string; at: number } | null>(null);\n return {\n rootProps: {\n onKeyDownCapture: (e: KeyboardEvent) => {\n lastKey.current = { key: e.key, at: Date.now() };\n },\n onPointerDownCapture: () => {\n lastKey.current = null;\n },\n },\n onItemClick: () => {\n const last = lastKey.current;\n const navigating = last && NAVIGATION_KEYS.has(last.key) && Date.now() - last.at < NAVIGATION_WINDOW_MS;\n if (!navigating) onAdvance?.();\n },\n };\n}\n\n// ── Renderers ────────────────────────────────────────────────────────────────\n\nfunction TextField(\n props: FieldRendererProps & {\n type?: string;\n multiline?: boolean;\n inputMode?: \"text\" | \"email\" | \"tel\";\n /** Used when the field type's manifest names no autocomplete token. */\n autoComplete?: string;\n },\n) {\n const { binding, inputId, type = \"text\", multiline, inputMode, autoComplete } = props;\n const manifest = getFieldType(binding.field.type);\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const common = {\n id: inputId,\n value: typeof binding.value === \"string\" ? binding.value : \"\",\n placeholder: binding.field.placeholder ?? (pageFocus ? \"Type your answer here…\" : undefined),\n // Page focus: a large underlined answer line, Typeform style. The underline turns primary on focus.\n className: pageFocus\n ? \"h-auto rounded-none border-0 border-b-2 border-input bg-transparent px-0 py-2 text-xl shadow-none md:text-2xl sm:text-2xl placeholder:text-muted-foreground/70 focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-offset-0 aria-invalid:border-destructive\"\n : presentation === \"page\"\n ? \"h-11 md:text-base\"\n : undefined,\n // The focus layout focuses the input itself, so a respondent can type straight away.\n \"data-gf-focus\": \"\",\n \"aria-invalid\": binding.error ? true : undefined,\n \"aria-required\": binding.field.required || undefined,\n \"aria-describedby\": describedBy(props),\n } as const;\n return (\n <FieldChrome props={props}>\n {multiline ? (\n <Textarea\n {...common}\n rows={pageFocus ? 1 : 4}\n className={cn(common.className, pageFocus && \"min-h-12 resize-none\")}\n onChange={(e) => binding.setValue(e.target.value)}\n />\n ) : (\n <Input\n {...common}\n type={type}\n inputMode={manifest?.a11y.inputMode ?? inputMode}\n autoComplete={manifest?.a11y.autocomplete ?? autoComplete}\n onChange={(e) => binding.setValue(e.target.value)}\n />\n )}\n </FieldChrome>\n );\n}\n\ninterface ButtonOption {\n value: string;\n label: string;\n /** Id of extra text read with this option (the NPS end labels). */\n describedBy?: string;\n}\n\n/**\n * A radio group drawn as a row of buttons (rating, NPS, yes/no). It is a real\n * `radiogroup`: Tab enters it once, arrows move and select, Space selects.\n */\nfunction ButtonRadioGroup({\n props,\n options,\n value,\n onValueChange,\n itemClassName,\n}: {\n props: FieldRendererProps;\n options: ButtonOption[];\n value: string;\n onValueChange: (value: string) => void;\n itemClassName?: string;\n}) {\n const pick = useDeliberatePick(props.onAdvance);\n const { presentation, layout } = useFormPresentation();\n const page = presentation === \"page\";\n // Tall targets when there's room; a long scale (NPS) or a classic page stays squarer.\n const size = layout === \"classic\" ? \"h-12\" : options.length <= 6 ? \"h-14 sm:h-16\" : \"h-14\";\n return (\n <RadioGroup\n {...groupAria(props)}\n {...pick.rootProps}\n value={value}\n onValueChange={onValueChange}\n // Page mode: an even grid of large targets that fills the column.\n className={page ? cn(\"grid gap-2\", options.length <= 6 && \"sm:gap-3\", gridColumns(options.length)) : \"flex flex-wrap justify-start gap-2\"}\n >\n {options.map((o) => (\n <div key={o.value} className=\"relative\">\n <RadioGroupItem\n value={o.value}\n aria-label={o.label}\n aria-describedby={o.describedBy}\n onClick={pick.onItemClick}\n className={cn(\n \"peer h-11 w-11 aspect-auto rounded-md border-input bg-background shadow-sm transition-colors hover:bg-accent motion-reduce:transition-none\",\n page && cn(size, \"w-full rounded-lg border-primary/30 bg-primary/5 shadow-none hover:bg-primary/10\"),\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:hover:bg-primary\",\n \"[&_svg]:hidden\",\n page ? undefined : itemClassName,\n )}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 flex items-center justify-center text-base font-medium peer-disabled:opacity-50 peer-data-[state=checked]:text-primary-foreground\",\n page && \"text-lg font-semibold\",\n )}\n >\n {o.label}\n </span>\n </div>\n ))}\n </RadioGroup>\n );\n}\n\n// Spelled out so Tailwind's scanner sees every class. Phones get at most six\n// columns (NPS wraps 0–5 / 6–10); from `sm` every option sits in one row.\nconst PHONE_COLUMNS: Record<number, string> = {\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n 7: \"grid-cols-4\",\n 8: \"grid-cols-4\",\n 9: \"grid-cols-5\",\n 10: \"grid-cols-5\",\n 11: \"grid-cols-6\",\n};\nconst WIDE_COLUMNS: Record<number, string> = {\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n 7: \"sm:grid-cols-7\",\n 8: \"sm:grid-cols-8\",\n 9: \"sm:grid-cols-9\",\n 10: \"sm:grid-cols-10\",\n 11: \"sm:grid-cols-11\",\n};\nfunction gridColumns(count: number): string {\n return cn(PHONE_COLUMNS[count] ?? \"grid-cols-6\", WIDE_COLUMNS[count] ?? \"sm:grid-cols-11\");\n}\n\nfunction scaleValues(type: string, max: number): number[] {\n if (type === \"nps\") return Array.from({ length: 11 }, (_, i) => i);\n return Array.from({ length: max }, (_, i) => i + 1);\n}\n\nfunction ScaleField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const max = typeof binding.field.props?.max === \"number\" ? binding.field.props.max : 5;\n const values = scaleValues(binding.field.type, max);\n const nps = binding.field.type === \"nps\";\n const options = values.map((n, i) => ({\n value: String(n),\n label: String(n),\n describedBy: nps && i === 0 ? `${inputId}-low` : nps && i === values.length - 1 ? `${inputId}-high` : undefined,\n }));\n return (\n <FieldChrome props={props}>\n <ButtonRadioGroup\n props={props}\n options={options}\n value={typeof binding.value === \"number\" ? String(binding.value) : \"\"}\n onValueChange={(v) => binding.setValue(Number(v))}\n />\n {nps ? (\n <div className=\"flex justify-between text-sm text-muted-foreground\">\n <span id={`${inputId}-low`}>Not likely</span>\n <span id={`${inputId}-high`}>Very likely</span>\n </div>\n ) : null}\n </FieldChrome>\n );\n}\n\nfunction YesNoField(props: FieldRendererProps) {\n const { binding } = props;\n const current = binding.value === true ? \"yes\" : binding.value === false ? \"no\" : \"\";\n return (\n <FieldChrome props={props}>\n <ButtonRadioGroup\n props={props}\n options={[\n { value: \"yes\", label: \"Yes\" },\n { value: \"no\", label: \"No\" },\n ]}\n value={current}\n onValueChange={(v) => binding.setValue(v === \"yes\")}\n itemClassName=\"w-20\"\n />\n </FieldChrome>\n );\n}\n\n/** The whole row is the label, so the tap target is the full width (WCAG 2.5.8). */\nconst choiceRow =\n \"flex min-h-11 w-full cursor-pointer items-center gap-3 rounded-md border border-input px-3 py-2 text-base font-normal leading-snug transition-colors hover:bg-accent motion-reduce:transition-none has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50 has-[:disabled]:hover:bg-transparent\";\n\n/**\n * Page focus rows, Typeform style: a tinted full-width row with a letter key,\n * a clear selected fill and a check mark. The focus ring is drawn on the row,\n * since the real control is the small key box inside it.\n */\nconst pageChoiceRow =\n \"group/choice min-h-13 gap-3 rounded-lg border-primary/30 bg-primary/5 px-3 py-2.5 text-lg hover:bg-primary/10 has-[[data-state=checked]]:border-primary has-[[data-state=checked]]:bg-primary/15 has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-ring has-[:focus-visible]:ring-offset-2 ring-offset-background\";\nconst pageChoiceKey =\n \"peer size-7 shrink-0 rounded-md border border-primary/50 bg-background shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 data-[state=checked]:border-primary data-[state=checked]:bg-primary [&_svg]:hidden\";\nconst KEYS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\ninterface ChoiceLook {\n pageFocus: boolean;\n row: string;\n control: string | undefined;\n /** Letter keys pick an option while focus is in the group (WCAG 2.1.4: active only on focus). */\n onKeyDown: ((e: KeyboardEvent) => void) | undefined;\n}\n\nfunction useChoiceLook(inputId: string, count: number): ChoiceLook {\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const page = presentation === \"page\";\n return {\n pageFocus,\n row: cn(\n choiceRow,\n \"has-[[data-state=checked]]:border-primary\",\n page && \"min-h-12 text-base\",\n pageFocus && pageChoiceRow,\n ),\n control: pageFocus ? pageChoiceKey : undefined,\n onKeyDown: pageFocus\n ? (e) => {\n if (e.altKey || e.ctrlKey || e.metaKey || e.key.length !== 1) return;\n const index = KEYS.indexOf(e.key.toUpperCase());\n if (index < 0 || index >= count) return;\n const option = document.getElementById(`${inputId}-${index}`);\n if (!option || (option as HTMLButtonElement).disabled) return;\n e.preventDefault();\n option.focus();\n option.click();\n }\n : undefined,\n };\n}\n\nfunction ChoiceContent({ look, index, label }: { look: ChoiceLook; index: number; label: string }) {\n if (!look.pageFocus) return <span>{label}</span>;\n return (\n <>\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute flex size-7 items-center justify-center text-xs font-bold text-primary group-has-[[data-state=checked]]/choice:text-primary-foreground\"\n >\n {KEYS[index] ?? \"\"}\n </span>\n <span className=\"flex-1\">{label}</span>\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"size-5 shrink-0 text-primary opacity-0 transition-opacity group-has-[[data-state=checked]]/choice:opacity-100 motion-reduce:transition-none\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </>\n );\n}\n\nfunction SingleChoiceField(props: FieldRendererProps) {\n const { binding, inputId, onAdvance } = props;\n const pick = useDeliberatePick(onAdvance);\n const options = choiceOptions(binding.field);\n const look = useChoiceLook(inputId, options.length);\n return (\n <FieldChrome props={props}>\n <RadioGroup\n {...groupAria(props)}\n {...pick.rootProps}\n onKeyDown={look.onKeyDown}\n className={look.pageFocus ? \"gap-2.5\" : undefined}\n value={typeof binding.value === \"string\" ? binding.value : \"\"}\n onValueChange={(v) => binding.setValue(v)}\n >\n {options.map((o, i) => (\n <Label key={o.value} htmlFor={`${inputId}-${i}`} className={look.row}>\n <RadioGroupItem\n id={`${inputId}-${i}`}\n value={o.value}\n onClick={pick.onItemClick}\n className={look.control}\n />\n <ChoiceContent look={look} index={i} label={o.label ?? o.value} />\n </Label>\n ))}\n </RadioGroup>\n </FieldChrome>\n );\n}\n\nfunction MultiChoiceField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const selected = Array.isArray(binding.value) ? (binding.value as string[]) : [];\n const options = choiceOptions(binding.field);\n const look = useChoiceLook(inputId, options.length);\n const toggle = (value: string, on: boolean) => {\n const next = on ? [...selected, value] : selected.filter((v) => v !== value);\n binding.setValue(next.length ? (next as Json) : undefined);\n };\n // The fieldset from FieldChrome is the group: it is named by the legend and\n // carries the description and error, so the list needs no wrapper role.\n return (\n <FieldChrome props={props}>\n <div className={cn(\"grid gap-2\", look.pageFocus && \"gap-2.5\")} onKeyDown={look.onKeyDown}>\n {look.pageFocus ? <p className=\"-mt-2 mb-1 text-sm text-muted-foreground\">Choose as many as you like</p> : null}\n {options.map((o, i) => (\n <Label key={o.value} htmlFor={`${inputId}-${i}`} className={look.row}>\n <Checkbox\n id={`${inputId}-${i}`}\n checked={selected.includes(o.value)}\n aria-invalid={binding.error ? true : undefined}\n onCheckedChange={(c) => toggle(o.value, c === true)}\n className={look.control}\n />\n <ChoiceContent look={look} index={i} label={o.label ?? o.value} />\n </Label>\n ))}\n </div>\n </FieldChrome>\n );\n}\n\nexport const builtInRenderers: RendererEntry[] = [\n { type: \"short-text\", Component: (p) => <TextField {...p} /> },\n { type: \"long-text\", Component: (p) => <TextField {...p} multiline /> },\n { type: \"email\", Component: (p) => <TextField {...p} type=\"email\" /> },\n // The engine's `phone` type (string value). Registered by name so it works\n // with any engine that defines it; the tel hints don't depend on its manifest.\n { type: \"phone\", Component: (p) => <TextField {...p} type=\"tel\" inputMode=\"tel\" autoComplete=\"tel\" /> },\n { type: \"rating\", Component: ScaleField },\n { type: \"nps\", Component: ScaleField },\n { type: \"single-choice\", Component: SingleChoiceField },\n { type: \"multi-choice\", Component: MultiChoiceField },\n { type: \"yes-no\", Component: YesNoField },\n];\n\n/**\n * The built-in web renderers, shared by every `<Form>` that gets no\n * `registry`. `extend()` returns a new registry and leaves this one alone;\n * `register()` changes this one in place, for every form in the app.\n */\nexport const defaultRegistry = createRendererRegistry(builtInRenderers);\n","import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentType,\n type FormEvent as ReactFormEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"@marktiderman/genesis-ui/button\";\nimport { Progress } from \"@marktiderman/genesis-ui/progress\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport type { CreateFormOptions, FormDefinition, FormEngine, FormState } from \"@marktiderman/genesis-forms\";\nimport {\n FieldRenderer,\n FormRuntime,\n useForm,\n useFormContext,\n useFormSelector,\n type RendererRegistry,\n} from \"@marktiderman/genesis-forms-react\";\nimport { FormPresentationProvider, useFormPresentation, type FormPresentation } from \"./presentation\";\nimport { defaultRegistry } from \"./renderers\";\n\n// ── Slots (the Genesis extension ladder, EXTENDING.md) ──────────────────────\n\ntype SlotOverride<P> = ComponentType<P> | null;\n\nfunction renderSlot<P extends object>(\n Default: ComponentType<P>,\n override: SlotOverride<P> | undefined,\n props: P,\n extra?: Partial<P>,\n): ReactNode {\n if (override === null) return null;\n const Component = override ?? Default;\n return <Component {...props} {...(extra as P)} />;\n}\n\nexport interface HeaderSlotProps {\n title: string;\n description?: string;\n className?: string;\n}\nexport interface BrandSlotProps {\n /** The practice or business name, shown beside the logo. */\n name: string;\n /** An image URL or your own element. Without one, the name's initials are shown. */\n logo?: ReactNode;\n className?: string;\n}\nexport interface ProgressSlotProps {\n step: number;\n total: number;\n className?: string;\n}\nexport interface NavigationSlotProps {\n canGoBack: boolean;\n isLast: boolean;\n /** True while `onSubmit` is running. */\n busy: boolean;\n /** True after `onSubmit` failed. The answers are kept, and submitting again resends them. */\n failed: boolean;\n onBack: () => void;\n submitLabel: string;\n nextLabel: string;\n retryLabel: string;\n /**\n * The key that continues from this question (\"Enter ↵\", or \"Ctrl + Enter\" in\n * long text). Set in page presentation's focus layout; the default\n * navigation shows it only on devices with a fine pointer (mouse, trackpad).\n */\n keyHint?: string;\n className?: string;\n}\nexport interface EndingSlotProps {\n title: string;\n description?: string;\n className?: string;\n}\nexport interface ErrorSummaryItem {\n /** The field's block id. */\n id: string;\n /** The question, with recall resolved. */\n label: string;\n message: string;\n /** `#` + the field's element id: the control, or the fieldset of a group. */\n href: string;\n}\nexport interface ErrorSummarySlotProps {\n count: number;\n /** Every invalid field, in form order. */\n errors: ErrorSummaryItem[];\n className?: string;\n}\n\n/** Every interior part of `<Form>`. Replace one with `slots`, feed one with `slotProps`, drop one with `null`. */\nexport interface FormSlotMap {\n header: HeaderSlotProps;\n brand: BrandSlotProps;\n progress: ProgressSlotProps;\n navigation: NavigationSlotProps;\n ending: EndingSlotProps;\n errorSummary: ErrorSummarySlotProps;\n}\n\nconst focusRing = \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background\";\n\nfunction DefaultHeader({ title, description, className }: HeaderSlotProps) {\n const { presentation, layout } = useFormPresentation();\n if (presentation === \"page\" && layout === \"focus\") {\n // A quiet line above the first question: the question is the headline.\n return (\n <header className={cn(\"space-y-1\", className)}>\n <h1 className=\"text-sm font-medium text-muted-foreground\">{title}</h1>\n {description ? <p className=\"text-sm text-muted-foreground\">{description}</p> : null}\n </header>\n );\n }\n if (presentation === \"page\") {\n return (\n <header\n className={cn(\n \"rounded-xl border border-t-8 border-t-primary bg-card px-5 py-6 text-card-foreground sm:px-8 sm:py-8\",\n className,\n )}\n >\n <h1 className=\"text-3xl font-semibold tracking-tight text-balance sm:text-4xl\">{title}</h1>\n {description ? <p className=\"mt-3 text-base text-muted-foreground text-pretty\">{description}</p> : null}\n </header>\n );\n }\n return (\n <header className={cn(\"space-y-1\", className)}>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description ? <p className=\"text-muted-foreground\">{description}</p> : null}\n </header>\n );\n}\n\nfunction initials(name: string): string {\n return name\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((word) => word[0]!.toUpperCase())\n .join(\"\");\n}\n\nfunction DefaultBrand({ name, logo, className }: BrandSlotProps) {\n return (\n <div className={cn(\"flex min-w-0 items-center gap-2.5\", className)} data-gf-brand=\"\">\n {typeof logo === \"string\" ? (\n <img src={logo} alt=\"\" className=\"size-8 shrink-0 rounded-md object-contain\" />\n ) : logo ? (\n <span className=\"flex shrink-0 items-center\" aria-hidden=\"true\">\n {logo}\n </span>\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-primary text-xs font-bold tracking-wide text-primary-foreground\"\n >\n {initials(name)}\n </span>\n )}\n <span className=\"truncate text-sm font-semibold tracking-tight\">{name}</span>\n </div>\n );\n}\n\nfunction DefaultProgress({ step, total, className }: ProgressSlotProps) {\n const { presentation } = useFormPresentation();\n const page = presentation === \"page\";\n // In page mode the bar fills with questions answered (empty on the first), like Typeform.\n const percent = total ? Math.round(((page ? step - 1 : step) / total) * 100) : 0;\n // Not a live region: focus moving to the question is the announcement.\n const bar = (\n <Progress\n value={percent}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-valuetext={`Question ${step} of ${total}`}\n aria-label=\"Progress\"\n className={cn(\"motion-reduce:[&>div]:transition-none\", page && \"h-1 rounded-none bg-primary/15\")}\n />\n );\n if (page) {\n return (\n <div className={cn(\"fixed inset-x-0 top-0 z-10\", className)} data-gf-progress=\"\">\n {bar}\n </div>\n );\n }\n return (\n <div className={cn(\"space-y-1\", className)} data-gf-progress=\"\">\n {bar}\n <p className=\"text-sm text-muted-foreground\">\n Question {step} of {total}\n </p>\n </div>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction DefaultNavigation({\n canGoBack,\n isLast,\n busy,\n failed,\n onBack,\n submitLabel,\n nextLabel,\n retryLabel,\n keyHint,\n className,\n}: NavigationSlotProps) {\n const { presentation, layout } = useFormPresentation();\n const label = busy ? \"Sending…\" : failed ? retryLabel : isLast ? submitLabel : nextLabel;\n if (presentation === \"page\") {\n return (\n <div className={cn(\"flex flex-wrap items-center gap-x-4 gap-y-2\", layout === \"classic\" && \"pt-2\", className)}>\n <Button\n type=\"submit\"\n size=\"lg\"\n loading={busy}\n className=\"h-12 min-w-28 px-6 text-base font-semibold motion-reduce:[&_.animate-spin]:animate-none [&_svg]:size-5\"\n >\n {label}\n {!busy && !failed && !isLast ? <CheckIcon /> : null}\n </Button>\n {keyHint && !busy ? (\n <span className=\"hidden text-sm text-muted-foreground pointer-fine:inline\" data-gf-key-hint=\"\">\n press <kbd className=\"font-sans font-semibold text-foreground\">{keyHint}</kbd>\n </span>\n ) : null}\n {canGoBack ? (\n // After OK in the tab order, drawn quietly at the page's top-left.\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Back\"\n onClick={onBack}\n disabled={busy}\n // Centred on the brand row: h-16 (sm:h-20) minus its own 44px, halved.\n className=\"absolute left-2 top-2.5 size-11 text-muted-foreground sm:left-4 sm:top-4.5 [&_svg]:size-6\"\n >\n <ChevronLeftIcon />\n </Button>\n ) : null}\n </div>\n );\n }\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n {canGoBack ? (\n <Button type=\"button\" variant=\"outline\" size=\"lg\" onClick={onBack} disabled={busy}>\n Back\n </Button>\n ) : null}\n <Button type=\"submit\" size=\"lg\" loading={busy} className=\"motion-reduce:[&_.animate-spin]:animate-none\">\n {label}\n </Button>\n </div>\n );\n}\n\nfunction DefaultEnding({ title, description, className }: EndingSlotProps) {\n const { presentation } = useFormPresentation();\n if (presentation === \"page\") {\n return (\n <div className={cn(\"flex flex-col items-center gap-4 text-center\", className)}>\n <span\n aria-hidden=\"true\"\n className=\"mb-2 flex size-16 items-center justify-center rounded-full bg-primary/10 text-primary\"\n >\n <CheckIcon className=\"size-8\" />\n </span>\n {/* `<Form>` focuses the element marked data-gf-focus when the ending appears. */}\n <h2\n tabIndex={-1}\n data-gf-focus=\"\"\n className={cn(\n \"rounded-sm text-3xl font-semibold leading-tight tracking-tight text-balance sm:text-4xl\",\n focusRing,\n )}\n >\n {title}\n </h2>\n {description ? <p className=\"max-w-md text-lg text-muted-foreground text-pretty\">{description}</p> : null}\n </div>\n );\n }\n return (\n <div className={cn(\"space-y-2 py-8 text-center\", className)}>\n {/* `<Form>` focuses the element marked data-gf-focus when the ending appears. */}\n <h2 tabIndex={-1} data-gf-focus=\"\" className={cn(\"rounded-sm text-2xl font-semibold\", focusRing)}>\n {title}\n </h2>\n {description ? <p className=\"text-muted-foreground\">{description}</p> : null}\n </div>\n );\n}\n\n/** Follow a summary link: focus the control, or the first (checked) option of a group. */\nfunction focusErrorTarget(event: MouseEvent<HTMLAnchorElement>) {\n const id = event.currentTarget.hash.slice(1);\n const target = id ? document.getElementById(id) : null;\n if (!target) return;\n event.preventDefault();\n const control = target.matches(\"input, textarea, select, button\")\n ? target\n : (target.querySelector<HTMLElement>('[aria-checked=\"true\"]:not(:disabled)') ??\n target.querySelector<HTMLElement>(\"input:not(:disabled), textarea:not(:disabled), button:not(:disabled)\"));\n (control ?? target).focus();\n}\n\nfunction DefaultErrorSummary({ count, errors, className }: ErrorSummarySlotProps) {\n const titleId = useId();\n return (\n // `<Form>` focuses the element marked data-gf-error-summary after a failed submit.\n <div\n role=\"group\"\n aria-labelledby={titleId}\n tabIndex={-1}\n data-gf-error-summary=\"\"\n className={cn(\"space-y-2 rounded-md border border-destructive p-4\", focusRing, className)}\n >\n <h2 id={titleId} className=\"text-base font-semibold text-destructive\">\n {count === 1 ? \"One answer needs attention.\" : `${count} answers need attention.`}\n </h2>\n <ul className=\"list-disc space-y-1 pl-5 text-sm\">\n {errors.map((e) => (\n <li key={e.id}>\n <a href={e.href} onClick={focusErrorTarget} className=\"font-medium text-destructive underline underline-offset-4\">\n {e.label}: {e.message}\n </a>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\n// ── Form ─────────────────────────────────────────────────────────────────────\n\nexport interface FormBrand {\n name: string;\n /** An image URL or your own element (decorative: the name is the text). Without one, the name's initials are shown. */\n logo?: ReactNode | undefined;\n}\n\nexport interface FormProps {\n /** A `defineForm` result or a canonical definition. */\n form: FormDefinition | { definition: FormDefinition };\n /** Bring your own engine (from `useForm`) to read state outside the form. `form` and `options` are then unused. */\n engine?: FormEngine | undefined;\n options?: CreateFormOptions | undefined;\n /** Overrides the definition's layout. */\n layout?: \"focus\" | \"classic\" | undefined;\n /**\n * `\"embedded\"` (default): a block inside your own page. `\"page\"`: the\n * respondent's whole screen, for a QR code or a shared link. It fills the\n * viewport with no card around it; in focus layout each question is centred\n * under a thin progress bar with large type and tap targets, and in classic\n * layout the questions are sections on one scrolling page.\n */\n presentation?: FormPresentation | undefined;\n /** A practice's name and logo, shown small at the top of every step and on the ending. */\n brand?: FormBrand | undefined;\n registry?: RendererRegistry | undefined;\n /**\n * Called once the form completes. The ending shows only after it resolves.\n * If it rejects, the answers stay on screen, read-only (a completed response\n * is final), with an error and a \"Try again\" button that sends them again.\n */\n onSubmit?: ((engine: FormEngine) => void | Promise<void>) | undefined;\n /**\n * Called on every state change: an answer, a step forward or back, a\n * submit attempt (debounce it to save drafts).\n */\n onChange?: ((state: FormState, engine: FormEngine) => void) | undefined;\n /**\n * In focus layout, move on after a single pick (rating, yes/no, one choice).\n * Arrow keys only move through the options; a click, tap or Space picks.\n * Never moves on from the last question. Default true.\n */\n autoAdvance?: boolean | undefined;\n submitLabel?: string | undefined;\n nextLabel?: string | undefined;\n /** The submit button's label after `onSubmit` failed. Default \"Try again\". */\n retryLabel?: string | undefined;\n slots?: { [K in keyof FormSlotMap]?: SlotOverride<FormSlotMap[K]> } | undefined;\n slotProps?: { [K in keyof FormSlotMap]?: Partial<FormSlotMap[K]> } | undefined;\n className?: string | undefined;\n testID?: string | undefined;\n}\n\nconst ADVANCE_DELAY_MS = 250;\n\n// A stable key per engine, so a new engine starts the form body over.\nconst engineKeys = new WeakMap<FormEngine, number>();\nlet nextEngineKey = 0;\nfunction keyOf(engine: FormEngine): number {\n let key = engineKeys.get(engine);\n if (key === undefined) {\n key = nextEngineKey++;\n engineKeys.set(engine, key);\n }\n return key;\n}\n\nexport function Form(props: FormProps) {\n return props.engine ? <FormWithEngine {...props} engine={props.engine} /> : <OwnedForm {...props} />;\n}\n\nfunction OwnedForm(props: FormProps) {\n const engine = useForm(props.form, props.options);\n return <FormWithEngine {...props} engine={engine} />;\n}\n\nfunction FormWithEngine(props: FormProps & { engine: FormEngine }) {\n return (\n <FormRuntime engine={props.engine} registry={props.registry ?? defaultRegistry}>\n <FormBody key={keyOf(props.engine)} {...props} />\n </FormRuntime>\n );\n}\n\n/** Focus what a step or an ending marks, else its question text, else the container. */\nfunction focusWithin(root: HTMLElement | null) {\n if (!root) return;\n const target =\n root.querySelector<HTMLElement>(\"[data-gf-focus]\") ??\n root.querySelector<HTMLElement>(\"[data-gf-question]\") ??\n root.querySelector<HTMLElement>(\"h1, h2, h3\");\n if (target && target.tabIndex < 0 && !target.hasAttribute(\"tabindex\")) target.tabIndex = -1;\n (target ?? root).focus();\n}\n\nfunction FormBody({\n engine,\n layout: layoutProp,\n presentation = \"embedded\",\n brand,\n onSubmit,\n onChange,\n autoAdvance = true,\n submitLabel = \"Submit\",\n nextLabel = \"OK\",\n retryLabel = \"Try again\",\n slots,\n slotProps,\n className,\n testID,\n}: FormProps & { engine: FormEngine }) {\n const { idPrefix } = useFormContext();\n const def = engine.definition;\n const layout = layoutProp ?? def.layout?.mode ?? \"classic\";\n const status = useFormSelector(engine, (s) => s.status);\n const current = useFormSelector(engine, (s) => s.current);\n const pathKey = useFormSelector(engine, (s) => JSON.stringify(s.path));\n // A string, so typing (which builds a new errors object) doesn't re-render the whole form.\n const errorsKey = useFormSelector(engine, (s) => JSON.stringify(s.errors));\n const ending = useFormSelector(engine, (s) => s.ending);\n const historyLength = useFormSelector(engine, (s) => s.history.length);\n // The introduction recalls like endings do ({{field:name}}, {{hidden:coach}}), so it follows\n // the answers; a string, so it re-renders only when the recalled text changes.\n const description = useFormSelector(engine, () => (def.description ? engine.text(def.description) : undefined));\n const path = JSON.parse(pathKey) as string[];\n const errors = JSON.parse(errorsKey) as Record<string, string>;\n const formRef = useRef<HTMLFormElement>(null);\n const stepRef = useRef<HTMLDivElement>(null);\n const endingRef = useRef<HTMLDivElement>(null);\n const advanceTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const previousCurrent = useRef(current);\n const [phase, setPhase] = useState<\"idle\" | \"sending\" | \"sent\" | \"failed\">(\"idle\");\n const [announcement, setAnnouncement] = useState(\"\");\n const [summaryRequest, setSummaryRequest] = useState(0);\n const sending = useRef(false);\n // Which way the last step went, so page mode slides the new question in from that side.\n const direction = useRef<\"forward\" | \"back\">(\"forward\");\n // \"Ctrl\" until mounted, so the server and the first client render agree.\n const [modKey, setModKey] = useState(\"Ctrl\");\n const page = presentation === \"page\";\n\n useEffect(() => {\n if (/Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent)) setModKey(\"⌘\");\n }, []);\n\n const showEnding = status === \"completed\" && (phase === \"sent\" || !onSubmit);\n // A completed response is final: the engine ignores edits, so the fields say so.\n const locked = status === \"completed\";\n\n useEffect(() => {\n if (!onChange) return;\n return engine.subscribe(() => onChange(engine.getState(), engine));\n }, [engine, onChange]);\n\n // A new question cancels a pending auto-advance and, in focus layout, takes\n // focus: the input of a text field, otherwise the visible question. Comparing\n // with the previous question (not a \"mounted\" flag) keeps StrictMode's\n // double effect run from stealing focus on first render. A layout effect, so\n // keys typed right after advancing land in the new input.\n useLayoutEffect(() => {\n if (previousCurrent.current === current) return;\n previousCurrent.current = current;\n clearTimeout(advanceTimer.current);\n if (layout === \"focus\") focusWithin(stepRef.current);\n }, [current, layout]);\n\n useLayoutEffect(() => {\n if (showEnding) focusWithin(endingRef.current);\n }, [showEnding]);\n\n useLayoutEffect(() => {\n if (!summaryRequest) return;\n const form = formRef.current;\n const summary = form?.querySelector<HTMLElement>(\"[data-gf-error-summary]\");\n if (summary) summary.focus();\n else form?.querySelector<HTMLElement>('[aria-invalid=\"true\"]')?.focus();\n }, [summaryRequest]);\n\n // The submit button is disabled while sending, which drops focus; put it back on \"Try again\".\n useLayoutEffect(() => {\n if (phase !== \"failed\") return;\n const form = formRef.current;\n if (form && !form.contains(document.activeElement)) form.querySelector<HTMLElement>('[type=\"submit\"]')?.focus();\n }, [phase]);\n\n useEffect(() => () => clearTimeout(advanceTimer.current), []);\n\n /** Say something once in the persistent live region, even if it's the same text as last time. */\n const announce = (message: string) =>\n setAnnouncement((previous) => (previous === message ? `${message} ` : message));\n const announceStepError = () => {\n const state = engine.getState();\n const message = state.current ? state.errors[state.current] : undefined;\n if (message) announce(message);\n };\n\n const finish = async () => {\n if (sending.current) return;\n // A retry after a failed onSubmit finds the response already completed.\n if (engine.getState().status !== \"completed\" && !engine.submit()) {\n if (layout === \"classic\") setSummaryRequest((n) => n + 1);\n else announceStepError();\n return;\n }\n if (!onSubmit) {\n setPhase(\"sent\");\n return;\n }\n sending.current = true;\n setPhase(\"sending\");\n try {\n await onSubmit(engine);\n setPhase(\"sent\");\n } catch {\n setPhase(\"failed\");\n } finally {\n sending.current = false;\n }\n };\n\n const isLastStep = (state: FormState) => state.current === state.path[state.path.length - 1];\n\n const advance = () => {\n direction.current = \"forward\";\n if (isLastStep(engine.getState())) void finish();\n else if (!engine.next()) announceStepError();\n };\n\n const submit = () => {\n clearTimeout(advanceTimer.current);\n if (layout === \"focus\") advance();\n else void finish();\n };\n\n const handleSubmit = (e: ReactFormEvent) => {\n e.preventDefault();\n submit();\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing) return;\n const target = e.target as HTMLElement;\n // In long text, Enter is a newline; Ctrl/Cmd+Enter moves on.\n if (target instanceof HTMLTextAreaElement) {\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n submit();\n }\n return;\n }\n // Radios and checkboxes leave Enter unused (WAI-ARIA APG); in focus layout\n // it continues, like the OK button. A text input submits natively.\n if (layout === \"focus\" && target.matches('[role=\"radio\"], [role=\"checkbox\"]')) {\n e.preventDefault();\n submit();\n }\n };\n\n // Auto-advance never submits: on the last question the respondent presses Submit.\n const scheduleAdvance =\n layout === \"focus\" && autoAdvance\n ? () => {\n clearTimeout(advanceTimer.current);\n advanceTimer.current = setTimeout(() => {\n const state = engine.getState();\n if (state.status === \"completed\" || isLastStep(state)) return;\n direction.current = \"forward\";\n if (!engine.next()) announceStepError();\n }, ADVANCE_DELAY_MS);\n }\n : undefined;\n\n const goBack = () => {\n clearTimeout(advanceTimer.current);\n direction.current = \"back\";\n engine.back();\n };\n\n // Rendered in both branches at the same position, so it exists before anything is announced.\n const liveRegion = (\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\" data-gf-live=\"\">\n {announcement}\n </div>\n );\n\n const presentationValue = { presentation, layout };\n const brandNode = brand\n ? renderSlot(DefaultBrand, slots?.brand, { name: brand.name, logo: brand.logo }, slotProps?.brand)\n : null;\n\n if (showEnding) {\n const end = def.endings?.find((x) => x.id === ending) ?? def.endings?.[0];\n const endingNode = renderSlot(\n DefaultEnding,\n slots?.ending,\n {\n title: engine.text(end?.title ?? \"Thank you.\"),\n description: end?.description ? engine.text(end.description) : undefined,\n },\n slotProps?.ending,\n );\n return (\n <FormPresentationProvider value={presentationValue}>\n {liveRegion}\n {page ? (\n <div\n ref={endingRef}\n data-presentation=\"page\"\n data-testid={testID}\n className={cn(\"flex min-h-dvh w-full flex-col bg-background text-foreground\", className)}\n >\n {brandNode ? (\n <div className=\"flex h-16 shrink-0 items-center justify-center px-16 sm:h-20\">{brandNode}</div>\n ) : null}\n <div className=\"flex flex-1 items-center justify-center px-4 pb-24 pt-8 sm:px-6\">\n <div className=\"w-full max-w-xl\">{endingNode}</div>\n </div>\n </div>\n ) : (\n <div ref={endingRef} className={cn(\"mx-auto w-full max-w-xl space-y-6\", className)} data-testid={testID}>\n {brandNode}\n {endingNode}\n </div>\n )}\n </FormPresentationProvider>\n );\n }\n\n const pageFocus = page && layout === \"focus\";\n const pageClassic = page && layout === \"classic\";\n\n const renderBlock = (id: string, focus: boolean) => {\n const block = engine.block(id);\n if (!block || block.kind === \"page-break\") return null;\n if (block.kind === \"content\") {\n // In focus layout a content step is its own question text, so it takes focus.\n const focusable = focus ? { tabIndex: -1, \"data-gf-question\": \"\" } : {};\n const content =\n block.type === \"heading\" ? (\n <h2\n key={id}\n className={cn(\n \"rounded-sm text-xl font-semibold\",\n pageFocus && \"text-2xl leading-tight tracking-tight text-balance sm:text-3xl\",\n focusRing,\n )}\n {...focusable}\n >\n {engine.text(block.text)}\n </h2>\n ) : (\n <p\n key={id}\n className={cn(\"rounded-sm text-muted-foreground\", pageFocus && \"text-lg sm:text-xl text-pretty\", focusRing)}\n {...focusable}\n >\n {engine.text(block.text)}\n </p>\n );\n return pageClassic ? (\n <section key={id} className={classicSection}>\n {content}\n </section>\n ) : (\n content\n );\n }\n const field = <FieldRenderer id={id} onAdvance={focus ? scheduleAdvance : undefined} />;\n return (\n <div key={id} data-block={id} className={pageClassic ? classicSection : undefined}>\n {field}\n </div>\n );\n };\n\n const step = current ? Math.max(1, path.indexOf(current) + 1) : 1;\n const isLast = layout === \"classic\" || current === path[path.length - 1];\n const errorItems: ErrorSummaryItem[] = path\n .filter((id) => errors[id])\n .map((id) => ({\n id,\n label: engine.text(engine.field(id)?.label ?? id),\n message: errors[id]!,\n href: `#${idPrefix}-${id}`,\n }));\n const currentField = pageFocus && current ? engine.field(current) : undefined;\n const keyHint = currentField ? (currentField.type === \"long-text\" ? `${modKey} + Enter` : \"Enter ↵\") : undefined;\n\n const header = renderSlot(\n DefaultHeader,\n slots?.header,\n { title: def.title, description },\n slotProps?.header,\n );\n const errorSummary =\n errorItems.length > 0 && layout === \"classic\"\n ? renderSlot(\n DefaultErrorSummary,\n slots?.errorSummary,\n {\n count: errorItems.length,\n errors: errorItems,\n className: page ? \"bg-card\" : undefined,\n },\n slotProps?.errorSummary,\n )\n : null;\n const progress =\n layout === \"focus\"\n ? renderSlot(DefaultProgress, slots?.progress, { step, total: path.length }, slotProps?.progress)\n : null;\n const fields = (\n // Disabled once the response is completed (sending, or after a failed send): read-only, not dead.\n <fieldset disabled={locked} className=\"min-w-0 border-0 p-0\">\n {layout === \"focus\" ? (\n <div\n // A new element per question, so page mode's entry transition runs for each one.\n key={pageFocus ? (current ?? \"\") : undefined}\n ref={stepRef}\n tabIndex={-1}\n className={cn(\n \"outline-none\",\n pageFocus &&\n \"transition-[opacity,translate] duration-300 ease-out starting:opacity-0 motion-reduce:transition-none\",\n pageFocus && (direction.current === \"back\" ? \"starting:-translate-y-6\" : \"starting:translate-y-6\"),\n )}\n >\n {current ? renderBlock(current, true) : null}\n </div>\n ) : (\n <div className={pageClassic ? \"space-y-4\" : \"space-y-8\"}>{path.map((id) => renderBlock(id, false))}</div>\n )}\n </fieldset>\n );\n const failure =\n phase === \"failed\" ? (\n <p role=\"alert\" className={cn(\"text-sm font-medium text-destructive\", page && \"text-base\")}>\n We couldn't send your answers. They're kept here: press {retryLabel} to send them again.\n </p>\n ) : null;\n const navigation = renderSlot(\n DefaultNavigation,\n slots?.navigation,\n {\n canGoBack: layout === \"focus\" && historyLength > 0 && !locked,\n isLast: isLast || status === \"completed\",\n busy: phase === \"sending\",\n failed: phase === \"failed\",\n onBack: goBack,\n submitLabel,\n nextLabel,\n retryLabel,\n keyHint,\n },\n slotProps?.navigation,\n );\n\n const formProps = {\n ref: formRef,\n noValidate: true,\n onSubmit: handleSubmit,\n onKeyDown: handleKeyDown,\n \"data-layout\": layout,\n \"data-presentation\": presentation,\n \"data-testid\": testID,\n };\n\n return (\n <FormPresentationProvider value={presentationValue}>\n {liveRegion}\n {pageFocus ? (\n <form\n {...formProps}\n className={cn(\"relative flex min-h-dvh w-full flex-col bg-background text-foreground\", className)}\n >\n {progress}\n {/* Side padding keeps the brand clear of the Back button at the top-left. */}\n <div className=\"flex h-16 shrink-0 items-center justify-center px-16 sm:h-20\">{brandNode}</div>\n <div className=\"flex flex-1 flex-col justify-center px-4 pb-20 pt-4 sm:px-6 sm:pb-28\">\n <div className=\"mx-auto w-full max-w-xl\">\n {/* The form's name introduces the first question, then stays for assistive tech only. */}\n <div className={historyLength === 0 ? \"mb-5\" : \"sr-only\"}>{header}</div>\n {fields}\n {failure ? <div className=\"mt-6\">{failure}</div> : null}\n <div className=\"mt-10\">{navigation}</div>\n </div>\n </div>\n </form>\n ) : pageClassic ? (\n <form\n {...formProps}\n className={cn(\"min-h-dvh w-full bg-muted/40 px-4 py-8 text-foreground sm:py-12\", className)}\n >\n <div className=\"mx-auto w-full max-w-2xl space-y-4\">\n {brandNode ? <div className=\"flex justify-center pb-2\">{brandNode}</div> : null}\n {header}\n {errorSummary}\n {fields}\n {failure}\n {navigation}\n </div>\n </form>\n ) : (\n <form {...formProps} className={cn(\"mx-auto w-full max-w-xl space-y-8\", className)}>\n {brandNode}\n {header}\n {errorSummary}\n {progress}\n {fields}\n {failure}\n {navigation}\n </form>\n )}\n </FormPresentationProvider>\n );\n}\n\n/** One question per section on a classic page, Google Forms style; an invalid one gets a red edge. */\nconst classicSection =\n \"rounded-xl border bg-card px-5 py-6 text-card-foreground sm:px-8 has-[[aria-invalid=true]]:border-destructive\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/presentation.ts","../src/chrome.tsx","../src/source.ts","../src/structured.tsx","../src/renderers.tsx","../src/Form.tsx"],"names":["createContext","useContext","jsx","jsxs","cn","useRef","getFieldType","Textarea","Input","Fragment","Label","Button","useId","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\n\n/**\n * How `<Form>` sits on the page. `\"embedded\"` is a block inside your app's own\n * page. `\"page\"` is the respondent's whole screen (a QR code, a shared link):\n * it fills the viewport and draws no card around the form.\n */\nexport type FormPresentation = \"embedded\" | \"page\";\n\nexport interface FormPresentationValue {\n presentation: FormPresentation;\n layout: \"focus\" | \"classic\";\n}\n\nconst FormPresentationContext = createContext<FormPresentationValue>({ presentation: \"embedded\", layout: \"classic\" });\n\nexport const FormPresentationProvider = FormPresentationContext.Provider;\n\n/**\n * The presentation and layout of the enclosing `<Form>`, so a custom slot or\n * renderer can match the built-in ones (larger type and tap targets in page\n * mode, for example). Outside a `<Form>` it reads embedded and classic.\n */\nexport function useFormPresentation(): FormPresentationValue {\n return useContext(FormPresentationContext);\n}\n","import type { ReactNode } from \"react\";\nimport { FormDescription, FormError, FormLabel } from \"@marktiderman/genesis-ui/form-field\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport { getFieldType } from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps } from \"@marktiderman/genesis-forms-react\";\nimport { useFormPresentation } from \"./presentation\";\n\n/** The visible question text takes focus in the focus layout, so it needs a focus ring of its own. */\nconst questionFocus =\n \"rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background\";\n\n// ── Field chrome ─────────────────────────────────────────────────────────────\n\nexport interface FieldChromeProps {\n props: FieldRendererProps;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Label, description and error around a control. Group types (radio,\n * checkbox list, rating, scale) get a real `fieldset`/`legend`, so a screen\n * reader announces the question with every option; the fieldset carries the\n * field's `inputId` (an error summary links to it) and `aria-describedby`.\n * `aria-invalid` sits on the controls: ARIA 1.2 doesn't allow it on a group.\n *\n * The legend or label is the question text: it has `id=\"${inputId}-label\"`\n * and `tabIndex={-1}` and is marked `data-gf-question`, which the focus\n * layout focuses on each new question unless the control is marked\n * `data-gf-focus` (text fields mark their input, so typing just works).\n */\nexport function FieldChrome({ props, children, className }: FieldChromeProps) {\n const { binding, inputId } = props;\n const { field, error, label } = binding;\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const pageClassic = presentation === \"page\" && layout === \"classic\";\n const group = getFieldType(field.type)?.a11y.semantics === \"group\";\n const description = field.description ? props.engine.text(field.description) : undefined;\n // Page focus: the question is the headline, the answer sits well below it.\n const questionSize = pageFocus\n ? \"text-2xl font-semibold leading-tight tracking-tight text-balance sm:text-3xl\"\n : pageClassic\n ? \"text-lg font-medium leading-snug\"\n : \"text-base\";\n const body = (\n <>\n {description ? (\n <FormDescription id={`${inputId}-desc`} className={cn(pageFocus && \"text-base sm:text-lg text-pretty\")}>\n {description}\n </FormDescription>\n ) : null}\n {pageFocus ? <div className=\"pt-6 sm:pt-8\">{children}</div> : children}\n {/* No role=\"alert\": the layout announces errors once (focus layout) or focuses a summary (classic). */}\n {pageFocus ? (\n // A calm note under the answer, Typeform style; the question keeps its colour.\n error ? (\n <FormError\n id={`${inputId}-error`}\n // Solid fill: the dark theme's destructive is a background shade, too dim as text.\n className=\"mt-4 inline-flex items-center gap-2 rounded-md bg-destructive px-3 py-2 text-sm text-destructive-foreground\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4M12 16h.01\" strokeLinecap=\"round\" />\n </svg>\n {error}\n </FormError>\n ) : null\n ) : (\n <FormError id={`${inputId}-error`}>{error}</FormError>\n )}\n </>\n );\n if (group) {\n return (\n <fieldset\n id={inputId}\n data-slot=\"form-field\"\n aria-describedby={describedBy(props)}\n className={cn(\"space-y-3 border-0 p-0 m-0 min-w-0\", className)}\n >\n <legend\n id={`${inputId}-label`}\n tabIndex={-1}\n data-gf-question=\"\"\n className={cn(\n \"mb-3 font-medium\",\n questionSize,\n pageFocus && \"mb-0\",\n questionFocus,\n error && !pageFocus && \"text-destructive\",\n )}\n >\n {label}\n {field.required ? (\n <span className=\"text-destructive ml-1\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </legend>\n {body}\n </fieldset>\n );\n }\n return (\n <div data-slot=\"form-field\" className={cn(\"space-y-2\", pageFocus && \"space-y-3\", className)}>\n <FormLabel\n id={`${inputId}-label`}\n htmlFor={inputId}\n tabIndex={-1}\n data-gf-question=\"\"\n error={Boolean(error) && !pageFocus}\n required={field.required}\n className={cn(presentation === \"page\" && \"block\", questionSize, questionFocus)}\n >\n {label}\n </FormLabel>\n {body}\n </div>\n );\n}\n\nexport function describedBy(props: FieldRendererProps): string | undefined {\n const ids = [\n props.binding.field.description ? `${props.inputId}-desc` : null,\n props.binding.error ? `${props.inputId}-error` : null,\n ].filter(Boolean);\n return ids.length ? ids.join(\" \") : undefined;\n}\n","import { createContext, useContext } from \"react\";\n\n/**\n * The video or audio a form is about, as the host app plays it. `media-notes`\n * fields read it: with `currentTime` the add row starts at the current moment\n * (\"Add note at 1:23\"), with `seek` a note's time plays the media from there.\n * Both are in seconds from the start of the full recording.\n */\nexport interface MediaTime {\n /** The playhead now, or undefined when it isn't known yet. */\n currentTime?: (() => number | undefined) | undefined;\n /** Move the playhead. */\n seek?: ((seconds: number) => void) | undefined;\n}\n\n/** Provide it around `<Form>` to link `media-notes` fields to a media player. */\nexport const MediaTimeContext = createContext<MediaTime | null>(null);\n\n/** The enclosing `MediaTimeContext` value, or null. */\nexport function useMediaTime(): MediaTime | null {\n return useContext(MediaTimeContext);\n}\n\n/**\n * The text a form is about (an article, a policy, a contract). `text-highlights`\n * fields highlight passages of it; a field's own `props.text` is used when no\n * host provides one. Offsets are UTF-16 indices into this exact string.\n */\nexport const SourceTextContext = createContext<string | null>(null);\n\n/** The enclosing `SourceTextContext` value, or null. */\nexport function useSourceText(): string | null {\n return useContext(SourceTextContext);\n}\n","/**\n * Renderers for the structured field types: `list`, `table`, `media-notes`\n * and `text-highlights`. Each is a group (FieldChrome draws the fieldset and\n * legend); every control inside has its own visible or accessible name.\n */\nimport { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Button } from \"@marktiderman/genesis-ui/button\";\nimport { Input } from \"@marktiderman/genesis-ui/input\";\nimport { Label } from \"@marktiderman/genesis-ui/label\";\nimport { Stack } from \"@marktiderman/genesis-ui/layout\";\nimport { SortableList } from \"@marktiderman/genesis-ui/sortable-list\";\nimport { Textarea } from \"@marktiderman/genesis-ui/textarea\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport {\n formatTimestamp,\n listLimits,\n parseTimestamp,\n tableColumns,\n tableLimits,\n type Highlight,\n type Json,\n type MediaNote,\n} from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps, RendererEntry } from \"@marktiderman/genesis-forms-react\";\nimport { FieldChrome } from \"./chrome\";\nimport { useSourceText, useMediaTime } from \"./source\";\n\n// ── Shared ───────────────────────────────────────────────────────────────────\n\nfunction PlusIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n );\n}\n\nfunction XIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nfunction move<T>(list: readonly T[], from: number, to: number): T[] {\n const next = list.slice();\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item as T);\n return next;\n}\n\n/**\n * Stable React keys for the entries of a list value, which has none of its\n * own (two list items may hold the same text). Kept in step with every add,\n * remove and move; a value replaced from outside (a draft restored) just gets\n * keys for its new length.\n */\nfunction useEntryKeys(count: number) {\n const keys = useRef<string[]>([]);\n const next = useRef(0);\n const make = () => `e${next.current++}`;\n while (keys.current.length < count) keys.current.push(make());\n if (keys.current.length > count) keys.current = keys.current.slice(0, count);\n return {\n keys: keys.current,\n /** Add a key at `at` and return it. */\n insert(at: number): string {\n const key = make();\n keys.current = [...keys.current.slice(0, at), key, ...keys.current.slice(at)];\n return key;\n },\n remove(at: number) {\n keys.current = keys.current.filter((_, i) => i !== at);\n },\n move(from: number, to: number) {\n keys.current = move(keys.current, from, to);\n },\n };\n}\n\n/** Focus the element registered under a key once it has rendered. */\nfunction useFocusLater() {\n const elements = useRef(new Map<string, HTMLElement>());\n const [target, setTarget] = useState<string | null>(null);\n useEffect(() => {\n if (target === null) return;\n elements.current.get(target)?.focus();\n setTarget(null);\n }, [target]);\n return {\n ref: (key: string) => (el: HTMLElement | null) => {\n if (el) elements.current.set(key, el);\n else elements.current.delete(key);\n },\n focus: setTarget,\n };\n}\n\nconst invalid = (props: FieldRendererProps) => (props.binding.error ? true : undefined);\n\nfunction RemoveButton({ label, onClick, disabled }: { label: string; onClick: () => void; disabled?: boolean }) {\n return (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={label} disabled={disabled} onClick={onClick} className=\"shrink-0\">\n <XIcon />\n </Button>\n );\n}\n\nfunction AddButton({ children, onClick, disabled }: { children: ReactNode; onClick: () => void; disabled?: boolean }) {\n return (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={disabled} onClick={onClick} className=\"self-start\">\n <PlusIcon /> {children}\n </Button>\n );\n}\n\n/** A short form of a passage, for labels (\"Remove highlight “The quick brown…”\"). */\nfunction excerpt(text: string, max = 40): string {\n const t = text.replace(/\\s+/g, \" \").trim();\n return t.length > max ? `${t.slice(0, max - 1)}…` : t;\n}\n\n// ── list ─────────────────────────────────────────────────────────────────────\n\nfunction ListField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const field = binding.field;\n const { max, itemMaxLength } = listLimits(field);\n const stored = Array.isArray(binding.value) ? binding.value.map((v) => (typeof v === \"string\" ? v : \"\")) : [];\n // An unanswered list still shows one empty line to type in.\n const items = stored.length ? stored : [\"\"];\n const entries = useEntryKeys(items.length);\n const focusLater = useFocusLater();\n const addRef = useRef<HTMLButtonElement>(null);\n const placeholder =\n typeof field.props?.placeholder === \"string\" ? field.props.placeholder : (field.placeholder ?? undefined);\n const save = (next: string[]) => binding.setValue(next.length ? (next as Json) : undefined);\n\n const add = () => {\n if (items.length >= max) return;\n const key = entries.insert(items.length);\n save([...items, \"\"]);\n focusLater.focus(key);\n };\n const remove = (i: number) => {\n entries.remove(i);\n const next = items.filter((_, j) => j !== i);\n save(next);\n const neighbour = entries.keys[Math.min(i, next.length - 1)];\n if (neighbour !== undefined && next.length) focusLater.focus(neighbour);\n else addRef.current?.focus();\n };\n const onKeyDown = (i: number) => (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing || e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) return;\n if (i < items.length - 1) {\n e.preventDefault();\n focusLater.focus(entries.keys[i + 1]!);\n } else if (items.length < max) {\n // Enter in the last item starts the next one instead of moving on.\n e.preventDefault();\n add();\n }\n };\n\n const rows = items.map((text, index) => ({ key: entries.keys[index]!, text, index }));\n return (\n <FieldChrome props={props}>\n <Stack gap=\"sm\">\n <SortableList\n items={rows}\n getKey={(r) => r.key}\n getItemLabel={(r) => (r.text.trim() ? excerpt(r.text, 30) : `Item ${r.index + 1}`)}\n label={`${binding.label}: items`}\n disabled={items.length < 2}\n onReorder={(from, to) => {\n entries.move(from, to);\n save(move(items, from, to));\n }}\n renderItem={(r, { handle, index }) => (\n <Stack direction=\"row\" align=\"center\" gap=\"sm\" className=\"w-full min-w-0\">\n {handle}\n <Input\n ref={focusLater.ref(r.key)}\n id={index === 0 ? `${inputId}-0` : undefined}\n data-gf-focus={index === 0 ? \"\" : undefined}\n aria-label={`Item ${index + 1}`}\n aria-invalid={invalid(props)}\n maxLength={itemMaxLength}\n placeholder={placeholder}\n value={r.text}\n onChange={(e) => save(items.map((t, j) => (j === index ? e.target.value : t)))}\n onKeyDown={onKeyDown(index)}\n />\n <RemoveButton\n label={`Remove item ${index + 1}`}\n disabled={items.length === 1 && r.text === \"\"}\n onClick={() => remove(index)}\n />\n </Stack>\n )}\n />\n <Button\n ref={addRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={items.length >= max}\n onClick={add}\n >\n <PlusIcon /> Add item\n </Button>\n </Stack>\n </FieldChrome>\n );\n}\n\n// ── table ────────────────────────────────────────────────────────────────────\n\ntype Row = Record<string, string>;\n\nfunction toRow(value: Json | undefined): Row {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n return Object.fromEntries(Object.entries(value).filter((e): e is [string, string] => typeof e[1] === \"string\"));\n}\n\nfunction TableField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const columns = tableColumns(binding.field);\n const { minRows, maxRows } = tableLimits(binding.field);\n const stored = Array.isArray(binding.value) ? binding.value.map(toRow) : [];\n // Show at least the rows asked for (one when none are), never more than allowed.\n const shown = Math.min(Math.max(stored.length, minRows, 1), Math.max(maxRows, 1));\n const rows = Array.from({ length: shown }, (_, i) => stored[i] ?? {});\n const entries = useEntryKeys(rows.length);\n const focusLater = useFocusLater();\n const addRef = useRef<HTMLButtonElement>(null);\n const save = (next: Row[]) => binding.setValue(next.length ? (next as Json) : undefined);\n const firstKey = columns[0]?.key;\n\n const add = () => {\n if (rows.length >= maxRows) return;\n const key = entries.insert(rows.length);\n save([...rows, {}]);\n focusLater.focus(key);\n };\n const remove = (i: number) => {\n entries.remove(i);\n const next = rows.filter((_, j) => j !== i);\n save(next);\n const neighbour = entries.keys[Math.min(i, next.length - 1)];\n if (neighbour !== undefined && next.length) focusLater.focus(neighbour);\n else addRef.current?.focus();\n };\n\n if (!columns.length) {\n return (\n <FieldChrome props={props}>\n <p className=\"text-sm text-muted-foreground\">This question has no columns yet.</p>\n </FieldChrome>\n );\n }\n const items = rows.map((row, index) => ({ key: entries.keys[index]!, row, index }));\n return (\n <FieldChrome props={props}>\n <Stack gap=\"md\">\n <SortableList\n items={items}\n getKey={(r) => r.key}\n getItemLabel={(r) => `Row ${r.index + 1}`}\n label={`${binding.label}: rows`}\n disabled={rows.length < 2}\n onReorder={(from, to) => {\n entries.move(from, to);\n save(move(rows, from, to));\n }}\n renderItem={(r, { handle, index }) => (\n <Stack direction=\"row\" align=\"start\" gap=\"sm\" className=\"w-full min-w-0\">\n {handle ? <div className=\"pt-7\">{handle}</div> : null}\n <fieldset className=\"m-0 min-w-0 flex-1 rounded-md border border-input p-3\">\n <legend className=\"px-1 text-sm font-medium\">{`Row ${index + 1}`}</legend>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {columns.map((column, c) => {\n const id = `${inputId}-${r.key}-${column.key}`;\n const common = {\n id,\n // The first cell of the first row is what an error summary link and the focus layout reach.\n \"data-gf-focus\": index === 0 && c === 0 ? \"\" : undefined,\n \"aria-invalid\": invalid(props),\n value: r.row[column.key] ?? \"\",\n maxLength: 2000,\n } as const;\n const set = (text: string) =>\n save(rows.map((row, j) => (j === index ? { ...row, [column.key]: text } : row)));\n return (\n <div key={column.key} className={cn(\"space-y-1.5\", column.long && \"sm:col-span-2\")}>\n <Label htmlFor={id}>{column.label}</Label>\n {column.long ? (\n <Textarea\n {...common}\n ref={column.key === firstKey ? focusLater.ref(r.key) : undefined}\n rows={2}\n onChange={(e) => set(e.target.value)}\n />\n ) : (\n <Input\n {...common}\n ref={column.key === firstKey ? focusLater.ref(r.key) : undefined}\n onChange={(e) => set(e.target.value)}\n />\n )}\n </div>\n );\n })}\n </div>\n </fieldset>\n <div className=\"pt-7\">\n <RemoveButton\n label={`Remove row ${index + 1}`}\n disabled={rows.length <= Math.max(minRows, 1)}\n onClick={() => remove(index)}\n />\n </div>\n </Stack>\n )}\n />\n <Button\n ref={addRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={rows.length >= maxRows}\n onClick={add}\n >\n <PlusIcon /> Add row\n </Button>\n </Stack>\n </FieldChrome>\n );\n}\n\n// ── media-notes ──────────────────────────────────────────────────────────────\n\nfunction toNote(value: Json): MediaNote {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { at: 0, text: \"\" };\n return { at: typeof value.at === \"number\" ? value.at : 0, text: typeof value.text === \"string\" ? value.text : \"\" };\n}\n\nfunction MediaNotesField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const media = useMediaTime();\n const maxNotes = typeof binding.field.props?.maxNotes === \"number\" ? binding.field.props.maxNotes : 20;\n const textMaxLength = typeof binding.field.props?.textMaxLength === \"number\" ? binding.field.props.textMaxLength : 1000;\n const notes = Array.isArray(binding.value) ? binding.value.map(toNote) : [];\n const entries = useEntryKeys(notes.length);\n const now = () => {\n const t = media?.currentTime?.();\n return typeof t === \"number\" && Number.isFinite(t) && t >= 0 ? formatTimestamp(t) : \"\";\n };\n const [time, setTime] = useState(now);\n // Once the respondent types a time, the player no longer overwrites it.\n const [timeTouched, setTimeTouched] = useState(false);\n const [text, setText] = useState(\"\");\n const [timeError, setTimeError] = useState<string | null>(null);\n const textRef = useRef<HTMLInputElement>(null);\n const save = (next: MediaNote[]) => binding.setValue(next.length ? (next as unknown as Json) : undefined);\n const full = notes.length >= maxNotes;\n const follow = () => {\n if (timeTouched || !media?.currentTime) return;\n const t = now();\n if (t) setTime(t);\n };\n\n const parsed = parseTimestamp(time);\n const add = () => {\n if (full || !text.trim()) return;\n const at = time.trim() === \"\" && !media?.currentTime ? 0 : parsed;\n if (at === null) {\n setTimeError(\"Enter a time like 1:23 or 1:02:03.\");\n return;\n }\n // Keep notes in time order; a new note goes after others at the same moment.\n const at_ = notes.findIndex((n) => n.at > at);\n const index = at_ === -1 ? notes.length : at_;\n entries.insert(index);\n save([...notes.slice(0, index), { at, text: text.trim() }, ...notes.slice(index)]);\n setText(\"\");\n setTimeError(null);\n setTimeTouched(false);\n setTime(now());\n textRef.current?.focus();\n };\n const onEnter = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing) return;\n // Enter adds the note rather than moving on to the next question.\n e.preventDefault();\n add();\n };\n const addLabel =\n media?.currentTime && parsed !== null ? `Add note at ${formatTimestamp(parsed)}` : \"Add note\";\n const timeId = `${inputId}-time`;\n const textId = `${inputId}-text`;\n\n return (\n <FieldChrome props={props}>\n <Stack gap=\"md\">\n {notes.length ? (\n <ol aria-label={`${binding.label}: notes`} className=\"m-0 list-none space-y-2 p-0\">\n {notes.map((note, index) => {\n const at = formatTimestamp(note.at);\n return (\n <li key={entries.keys[index]}>\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n {media?.seek ? (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n className=\"shrink-0 px-0 tabular-nums\"\n aria-label={`Play from ${at}`}\n onClick={() => media.seek?.(note.at)}\n >\n {at}\n </Button>\n ) : (\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{at}</span>\n )}\n <Input\n aria-label={`Note at ${at}`}\n aria-invalid={invalid(props)}\n maxLength={textMaxLength}\n value={note.text}\n onChange={(e) => save(notes.map((n, j) => (j === index ? { ...n, text: e.target.value } : n)))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.preventDefault();\n }}\n />\n <RemoveButton\n label={`Remove note at ${at}`}\n onClick={() => {\n entries.remove(index);\n save(notes.filter((_, j) => j !== index));\n textRef.current?.focus();\n }}\n />\n </Stack>\n </li>\n );\n })}\n </ol>\n ) : null}\n {full ? (\n <p className=\"text-sm text-muted-foreground\">{`You've added the most notes this question takes (${maxNotes}).`}</p>\n ) : (\n <div className=\"grid gap-2 sm:grid-cols-[7rem_1fr_auto] sm:items-end\">\n <div className=\"space-y-1.5\">\n <Label htmlFor={timeId}>Time</Label>\n <Input\n id={timeId}\n inputMode=\"numeric\"\n placeholder=\"m:ss\"\n value={time}\n aria-invalid={timeError ? true : undefined}\n aria-describedby={timeError ? `${timeId}-error` : undefined}\n onChange={(e) => {\n setTime(e.target.value);\n setTimeTouched(true);\n setTimeError(null);\n }}\n onKeyDown={onEnter}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor={textId}>Note</Label>\n <Input\n ref={textRef}\n id={textId}\n data-gf-focus=\"\"\n maxLength={textMaxLength}\n value={text}\n onFocus={follow}\n onChange={(e) => {\n if (!text) follow();\n setText(e.target.value);\n }}\n onKeyDown={onEnter}\n />\n </div>\n <AddButton onClick={add} disabled={!text.trim()}>\n {addLabel}\n </AddButton>\n {timeError ? (\n <p id={`${timeId}-error`} className=\"text-sm text-destructive sm:col-span-3\">\n {timeError}\n </p>\n ) : null}\n </div>\n )}\n </Stack>\n </FieldChrome>\n );\n}\n\n// ── text-highlights ──────────────────────────────────────────────────────────\n\nfunction toHighlight(value: Json): Highlight | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const { start, end, quote, note } = value;\n if (typeof start !== \"number\" || typeof end !== \"number\" || typeof quote !== \"string\") return null;\n return { start, end, quote, note: typeof note === \"string\" ? note : \"\" };\n}\n\n/** The text in pieces, each marked when some highlight covers it. */\nfunction segments(text: string, highlights: readonly Highlight[]) {\n const cuts = new Set([0, text.length]);\n for (const h of highlights) {\n if (h.start >= 0 && h.end <= text.length && h.start < h.end) {\n cuts.add(h.start);\n cuts.add(h.end);\n }\n }\n const points = [...cuts].sort((a, b) => a - b);\n const out: { start: number; text: string; marked: boolean }[] = [];\n for (let i = 0; i < points.length - 1; i++) {\n const start = points[i]!;\n const end = points[i + 1]!;\n if (end <= start) continue;\n out.push({ start, text: text.slice(start, end), marked: highlights.some((h) => h.start <= start && h.end >= end) });\n }\n return out;\n}\n\n/** The offset within `root`'s text of a DOM position inside it. */\nfunction textOffset(root: Node, node: Node, offset: number): number {\n const range = document.createRange();\n range.selectNodeContents(root);\n range.setEnd(node, offset);\n return range.toString().length;\n}\n\nfunction TextHighlightsField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const hosted = useSourceText();\n const own = typeof binding.field.props?.text === \"string\" ? binding.field.props.text : \"\";\n const text = hosted ?? own;\n const maxHighlights =\n typeof binding.field.props?.maxHighlights === \"number\" ? binding.field.props.maxHighlights : 20;\n const highlights = (Array.isArray(binding.value) ? binding.value : []).flatMap((v) => {\n const h = toHighlight(v);\n return h ? [h] : [];\n });\n const entries = useEntryKeys(highlights.length);\n const textRef = useRef<HTMLParagraphElement>(null);\n const noteRef = useRef<HTMLTextAreaElement>(null);\n const toggleRef = useRef<HTMLButtonElement>(null);\n const [selection, setSelection] = useState<{ start: number; end: number } | null>(null);\n const [typing, setTyping] = useState(false);\n const [passage, setPassage] = useState(\"\");\n const [note, setNote] = useState(\"\");\n const full = highlights.length >= maxHighlights;\n const save = (next: Highlight[]) => binding.setValue(next.length ? (next as unknown as Json) : undefined);\n const hintId = useId();\n\n // The keyboard way: the first place the typed passage appears.\n const typed = passage.trim();\n const found = typing && typed ? text.indexOf(typed) : -1;\n const draft = typing ? (found >= 0 ? { start: found, end: found + typed.length } : null) : selection;\n\n const draftKey = draft ? `${draft.start}:${draft.end}` : \"\";\n const wasSelection = useRef(false);\n useEffect(() => {\n // A new selection moves focus to its note; a typed passage keeps focus where the typing is.\n if (draftKey && wasSelection.current) noteRef.current?.focus();\n }, [draftKey]);\n\n const readSelection = () => {\n const root = textRef.current;\n const sel = typeof window === \"undefined\" ? null : window.getSelection();\n if (!root || !sel || sel.rangeCount === 0 || sel.isCollapsed || full) return;\n const range = sel.getRangeAt(0);\n if (!root.contains(range.startContainer) || !root.contains(range.endContainer)) return;\n let start = textOffset(root, range.startContainer, range.startOffset);\n let end = textOffset(root, range.endContainer, range.endOffset);\n if (start > end) [start, end] = [end, start];\n // Leave out the spaces a double-click or drag picks up at the edges.\n while (start < end && /\\s/.test(text[start]!)) start++;\n while (end > start && /\\s/.test(text[end - 1]!)) end--;\n if (end <= start) return;\n wasSelection.current = true;\n setTyping(false);\n setSelection({ start, end });\n };\n\n const reset = () => {\n setSelection(null);\n setPassage(\"\");\n setNote(\"\");\n setTyping(false);\n wasSelection.current = false;\n };\n const commit = () => {\n if (!draft || !note.trim() || full) return;\n const h: Highlight = { start: draft.start, end: draft.end, quote: text.slice(draft.start, draft.end), note: note.trim() };\n const at = highlights.findIndex((x) => x.start > h.start);\n const index = at === -1 ? highlights.length : at;\n entries.insert(index);\n save([...highlights.slice(0, index), h, ...highlights.slice(index)]);\n reset();\n window.getSelection?.()?.removeAllRanges();\n toggleRef.current?.focus();\n };\n\n if (!text) {\n return (\n <FieldChrome props={props}>\n <p className=\"text-sm text-muted-foreground\">There is no passage to highlight.</p>\n </FieldChrome>\n );\n }\n\n return (\n <FieldChrome props={props}>\n <Stack gap=\"md\">\n <p\n ref={textRef}\n id={`${inputId}-text`}\n aria-describedby={hintId}\n className=\"m-0 whitespace-pre-wrap rounded-md border border-input bg-muted/30 p-3 text-base leading-relaxed\"\n onMouseUp={readSelection}\n onTouchEnd={readSelection}\n onKeyUp={readSelection}\n >\n {segments(text, highlights).map((s) =>\n s.marked ? (\n <mark key={s.start} className=\"rounded-sm bg-primary/20 text-foreground\">\n {s.text}\n </mark>\n ) : (\n <span key={s.start}>{s.text}</span>\n ),\n )}\n </p>\n <p id={hintId} className=\"m-0 text-sm text-muted-foreground\">\n {full\n ? `You've added the most highlights this question takes (${maxHighlights}).`\n : \"Select words in the passage to highlight them, or use Highlight a passage to type them.\"}\n </p>\n {!full ? (\n <Button\n ref={toggleRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n aria-expanded={typing}\n onClick={() => {\n setSelection(null);\n wasSelection.current = false;\n setTyping((t) => !t);\n }}\n >\n Highlight a passage\n </Button>\n ) : null}\n {typing && !full ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor={`${inputId}-passage`}>Passage</Label>\n <Input\n id={`${inputId}-passage`}\n value={passage}\n aria-describedby={`${inputId}-passage-hint`}\n aria-invalid={typed && found < 0 ? true : undefined}\n onChange={(e) => setPassage(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (found >= 0) noteRef.current?.focus();\n }\n }}\n />\n <p id={`${inputId}-passage-hint`} className=\"m-0 text-sm text-muted-foreground\">\n {typed && found < 0 ? \"Not found in the passage. Type the words exactly as they appear.\" : \"Type the words exactly as they appear.\"}\n </p>\n </div>\n ) : null}\n {draft && !full ? (\n <div role=\"group\" aria-label=\"New highlight\" className=\"space-y-2 rounded-md border border-input p-3\">\n <blockquote className=\"m-0 border-l-2 border-primary pl-3 text-sm\">\n <mark className=\"bg-primary/20 text-foreground\">{text.slice(draft.start, draft.end)}</mark>\n </blockquote>\n <Label htmlFor={`${inputId}-note`}>Your note</Label>\n <Textarea\n ref={noteRef}\n id={`${inputId}-note`}\n rows={2}\n maxLength={1000}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n <Stack direction=\"row\" gap=\"sm\">\n <Button type=\"button\" size=\"sm\" disabled={!note.trim()} onClick={commit}>\n Highlight\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={reset}>\n Cancel\n </Button>\n </Stack>\n </div>\n ) : null}\n {highlights.length ? (\n <ol aria-label={`${binding.label}: highlights`} className=\"m-0 list-none space-y-3 p-0\">\n {highlights.map((h, index) => {\n const name = `“${excerpt(h.quote)}”`;\n return (\n <li key={entries.keys[index]} className=\"space-y-1.5\">\n <blockquote className=\"m-0 border-l-2 border-primary pl-3 text-sm\">{h.quote}</blockquote>\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n <Input\n aria-label={`Note on ${name}`}\n aria-invalid={invalid(props) || (h.note.trim() ? undefined : true)}\n maxLength={1000}\n value={h.note}\n onChange={(e) => save(highlights.map((x, j) => (j === index ? { ...x, note: e.target.value } : x)))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.preventDefault();\n }}\n />\n <RemoveButton\n label={`Remove highlight ${name}`}\n onClick={() => {\n entries.remove(index);\n save(highlights.filter((_, j) => j !== index));\n toggleRef.current?.focus();\n }}\n />\n </Stack>\n </li>\n );\n })}\n </ol>\n ) : null}\n </Stack>\n </FieldChrome>\n );\n}\n\nexport const structuredRenderers: RendererEntry[] = [\n { type: \"list\", Component: ListField },\n { type: \"table\", Component: TableField },\n { type: \"media-notes\", Component: MediaNotesField },\n { type: \"text-highlights\", Component: TextHighlightsField },\n];\n","import { useRef, type KeyboardEvent } from \"react\";\nimport { Checkbox } from \"@marktiderman/genesis-ui/checkbox\";\nimport { Input } from \"@marktiderman/genesis-ui/input\";\nimport { Label } from \"@marktiderman/genesis-ui/label\";\nimport { RadioGroup, RadioGroupItem } from \"@marktiderman/genesis-ui/radio-group\";\nimport { Textarea } from \"@marktiderman/genesis-ui/textarea\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport { choiceOptions, getFieldType, type Json } from \"@marktiderman/genesis-forms\";\nimport { createRendererRegistry, type FieldRendererProps, type RendererEntry } from \"@marktiderman/genesis-forms-react\";\nimport { useFormPresentation } from \"./presentation\";\nimport { describedBy, FieldChrome } from \"./chrome\";\nimport { structuredRenderers } from \"./structured\";\n\nexport { describedBy, FieldChrome, type FieldChromeProps } from \"./chrome\";\n\n/** The ARIA a radio group root needs to be named by the legend and report its state. */\nfunction groupAria(props: FieldRendererProps) {\n return {\n \"aria-labelledby\": `${props.inputId}-label`,\n \"aria-required\": props.binding.field.required || undefined,\n \"aria-invalid\": props.binding.error ? true : undefined,\n } as const;\n}\n\n// ── Deliberate picks ─────────────────────────────────────────────────────────\n\nconst NAVIGATION_KEYS = new Set([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\"]);\n/** Radix checks the newly focused radio a tick after the key, so allow a short window. */\nconst NAVIGATION_WINDOW_MS = 500;\n\n/**\n * A radio group checks whichever option arrow keys move to (WAI-ARIA APG),\n * and Radix does it by clicking that option. Only a pick the respondent meant\n * (a click or tap, Space, Enter, assistive tech activating it) may advance,\n * so this remembers whether a navigation key just went down and ignores the\n * click it causes. Clicking the option that is already checked still counts,\n * so after Back a respondent can confirm the same answer and move on.\n */\nfunction useDeliberatePick(onAdvance: (() => void) | undefined) {\n const lastKey = useRef<{ key: string; at: number } | null>(null);\n return {\n rootProps: {\n onKeyDownCapture: (e: KeyboardEvent) => {\n lastKey.current = { key: e.key, at: Date.now() };\n },\n onPointerDownCapture: () => {\n lastKey.current = null;\n },\n },\n onItemClick: () => {\n const last = lastKey.current;\n const navigating = last && NAVIGATION_KEYS.has(last.key) && Date.now() - last.at < NAVIGATION_WINDOW_MS;\n if (!navigating) onAdvance?.();\n },\n };\n}\n\n// ── Renderers ────────────────────────────────────────────────────────────────\n\nfunction TextField(\n props: FieldRendererProps & {\n type?: string;\n multiline?: boolean;\n inputMode?: \"text\" | \"email\" | \"tel\";\n /** Used when the field type's manifest names no autocomplete token. */\n autoComplete?: string;\n },\n) {\n const { binding, inputId, type = \"text\", multiline, inputMode, autoComplete } = props;\n const manifest = getFieldType(binding.field.type);\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const common = {\n id: inputId,\n value: typeof binding.value === \"string\" ? binding.value : \"\",\n placeholder: binding.field.placeholder ?? (pageFocus ? \"Type your answer here…\" : undefined),\n // Page focus: a large underlined answer line, Typeform style. The underline turns primary on focus.\n className: pageFocus\n ? \"h-auto rounded-none border-0 border-b-2 border-input bg-transparent px-0 py-2 text-xl shadow-none md:text-2xl sm:text-2xl placeholder:text-muted-foreground/70 focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-offset-0 aria-invalid:border-destructive\"\n : presentation === \"page\"\n ? \"h-11 md:text-base\"\n : undefined,\n // The focus layout focuses the input itself, so a respondent can type straight away.\n \"data-gf-focus\": \"\",\n \"aria-invalid\": binding.error ? true : undefined,\n \"aria-required\": binding.field.required || undefined,\n \"aria-describedby\": describedBy(props),\n } as const;\n return (\n <FieldChrome props={props}>\n {multiline ? (\n <Textarea\n {...common}\n rows={pageFocus ? 1 : 4}\n className={cn(common.className, pageFocus && \"min-h-12 resize-none\")}\n onChange={(e) => binding.setValue(e.target.value)}\n />\n ) : (\n <Input\n {...common}\n type={type}\n inputMode={manifest?.a11y.inputMode ?? inputMode}\n autoComplete={manifest?.a11y.autocomplete ?? autoComplete}\n onChange={(e) => binding.setValue(e.target.value)}\n />\n )}\n </FieldChrome>\n );\n}\n\ninterface ButtonOption {\n value: string;\n label: string;\n /** Id of extra text read with this option (the NPS end labels). */\n describedBy?: string;\n}\n\n/**\n * A radio group drawn as a row of buttons (rating, NPS, yes/no). It is a real\n * `radiogroup`: Tab enters it once, arrows move and select, Space selects.\n */\nfunction ButtonRadioGroup({\n props,\n options,\n value,\n onValueChange,\n itemClassName,\n}: {\n props: FieldRendererProps;\n options: ButtonOption[];\n value: string;\n onValueChange: (value: string) => void;\n itemClassName?: string;\n}) {\n const pick = useDeliberatePick(props.onAdvance);\n const { presentation, layout } = useFormPresentation();\n const page = presentation === \"page\";\n // Tall targets when there's room; a long scale (NPS) or a classic page stays squarer.\n const size = layout === \"classic\" ? \"h-12\" : options.length <= 6 ? \"h-14 sm:h-16\" : \"h-14\";\n return (\n <RadioGroup\n {...groupAria(props)}\n {...pick.rootProps}\n value={value}\n onValueChange={onValueChange}\n // Page mode: an even grid of large targets that fills the column.\n className={page ? cn(\"grid gap-2\", options.length <= 6 && \"sm:gap-3\", gridColumns(options.length)) : \"flex flex-wrap justify-start gap-2\"}\n >\n {options.map((o) => (\n <div key={o.value} className=\"relative\">\n <RadioGroupItem\n value={o.value}\n aria-label={o.label}\n aria-describedby={o.describedBy}\n onClick={pick.onItemClick}\n className={cn(\n \"peer h-11 w-11 aspect-auto rounded-md border-input bg-background shadow-sm transition-colors hover:bg-accent motion-reduce:transition-none\",\n page && cn(size, \"w-full rounded-lg border-primary/30 bg-primary/5 shadow-none hover:bg-primary/10\"),\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:hover:bg-primary\",\n \"[&_svg]:hidden\",\n page ? undefined : itemClassName,\n )}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 flex items-center justify-center text-base font-medium peer-disabled:opacity-50 peer-data-[state=checked]:text-primary-foreground\",\n page && \"text-lg font-semibold\",\n )}\n >\n {o.label}\n </span>\n </div>\n ))}\n </RadioGroup>\n );\n}\n\n// Spelled out so Tailwind's scanner sees every class. Phones get at most six\n// columns (NPS wraps 0–5 / 6–10); from `sm` every option sits in one row.\nconst PHONE_COLUMNS: Record<number, string> = {\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n 7: \"grid-cols-4\",\n 8: \"grid-cols-4\",\n 9: \"grid-cols-5\",\n 10: \"grid-cols-5\",\n 11: \"grid-cols-6\",\n};\nconst WIDE_COLUMNS: Record<number, string> = {\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n 7: \"sm:grid-cols-7\",\n 8: \"sm:grid-cols-8\",\n 9: \"sm:grid-cols-9\",\n 10: \"sm:grid-cols-10\",\n 11: \"sm:grid-cols-11\",\n};\nfunction gridColumns(count: number): string {\n return cn(PHONE_COLUMNS[count] ?? \"grid-cols-6\", WIDE_COLUMNS[count] ?? \"sm:grid-cols-11\");\n}\n\nfunction scaleValues(type: string, max: number): number[] {\n if (type === \"nps\") return Array.from({ length: 11 }, (_, i) => i);\n return Array.from({ length: max }, (_, i) => i + 1);\n}\n\nfunction ScaleField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const max = typeof binding.field.props?.max === \"number\" ? binding.field.props.max : 5;\n const values = scaleValues(binding.field.type, max);\n const nps = binding.field.type === \"nps\";\n const options = values.map((n, i) => ({\n value: String(n),\n label: String(n),\n describedBy: nps && i === 0 ? `${inputId}-low` : nps && i === values.length - 1 ? `${inputId}-high` : undefined,\n }));\n return (\n <FieldChrome props={props}>\n <ButtonRadioGroup\n props={props}\n options={options}\n value={typeof binding.value === \"number\" ? String(binding.value) : \"\"}\n onValueChange={(v) => binding.setValue(Number(v))}\n />\n {nps ? (\n <div className=\"flex justify-between text-sm text-muted-foreground\">\n <span id={`${inputId}-low`}>Not likely</span>\n <span id={`${inputId}-high`}>Very likely</span>\n </div>\n ) : null}\n </FieldChrome>\n );\n}\n\nfunction YesNoField(props: FieldRendererProps) {\n const { binding } = props;\n const current = binding.value === true ? \"yes\" : binding.value === false ? \"no\" : \"\";\n return (\n <FieldChrome props={props}>\n <ButtonRadioGroup\n props={props}\n options={[\n { value: \"yes\", label: \"Yes\" },\n { value: \"no\", label: \"No\" },\n ]}\n value={current}\n onValueChange={(v) => binding.setValue(v === \"yes\")}\n itemClassName=\"w-20\"\n />\n </FieldChrome>\n );\n}\n\n/** The whole row is the label, so the tap target is the full width (WCAG 2.5.8). */\nconst choiceRow =\n \"flex min-h-11 w-full cursor-pointer items-center gap-3 rounded-md border border-input px-3 py-2 text-base font-normal leading-snug transition-colors hover:bg-accent motion-reduce:transition-none has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50 has-[:disabled]:hover:bg-transparent\";\n\n/**\n * Page focus rows, Typeform style: a tinted full-width row with a letter key,\n * a clear selected fill and a check mark. The focus ring is drawn on the row,\n * since the real control is the small key box inside it.\n */\nconst pageChoiceRow =\n \"group/choice min-h-13 gap-3 rounded-lg border-primary/30 bg-primary/5 px-3 py-2.5 text-lg hover:bg-primary/10 has-[[data-state=checked]]:border-primary has-[[data-state=checked]]:bg-primary/15 has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-ring has-[:focus-visible]:ring-offset-2 ring-offset-background\";\nconst pageChoiceKey =\n \"peer size-7 shrink-0 rounded-md border border-primary/50 bg-background shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 data-[state=checked]:border-primary data-[state=checked]:bg-primary [&_svg]:hidden\";\nconst KEYS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\ninterface ChoiceLook {\n pageFocus: boolean;\n row: string;\n control: string | undefined;\n /** Letter keys pick an option while focus is in the group (WCAG 2.1.4: active only on focus). */\n onKeyDown: ((e: KeyboardEvent) => void) | undefined;\n}\n\nfunction useChoiceLook(inputId: string, count: number): ChoiceLook {\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const page = presentation === \"page\";\n return {\n pageFocus,\n row: cn(\n choiceRow,\n \"has-[[data-state=checked]]:border-primary\",\n page && \"min-h-12 text-base\",\n pageFocus && pageChoiceRow,\n ),\n control: pageFocus ? pageChoiceKey : undefined,\n onKeyDown: pageFocus\n ? (e) => {\n if (e.altKey || e.ctrlKey || e.metaKey || e.key.length !== 1) return;\n const index = KEYS.indexOf(e.key.toUpperCase());\n if (index < 0 || index >= count) return;\n const option = document.getElementById(`${inputId}-${index}`);\n if (!option || (option as HTMLButtonElement).disabled) return;\n e.preventDefault();\n option.focus();\n option.click();\n }\n : undefined,\n };\n}\n\nfunction ChoiceContent({ look, index, label }: { look: ChoiceLook; index: number; label: string }) {\n if (!look.pageFocus) return <span>{label}</span>;\n return (\n <>\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute flex size-7 items-center justify-center text-xs font-bold text-primary group-has-[[data-state=checked]]/choice:text-primary-foreground\"\n >\n {KEYS[index] ?? \"\"}\n </span>\n <span className=\"flex-1\">{label}</span>\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"size-5 shrink-0 text-primary opacity-0 transition-opacity group-has-[[data-state=checked]]/choice:opacity-100 motion-reduce:transition-none\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </>\n );\n}\n\nfunction SingleChoiceField(props: FieldRendererProps) {\n const { binding, inputId, onAdvance } = props;\n const pick = useDeliberatePick(onAdvance);\n const options = choiceOptions(binding.field);\n const look = useChoiceLook(inputId, options.length);\n return (\n <FieldChrome props={props}>\n <RadioGroup\n {...groupAria(props)}\n {...pick.rootProps}\n onKeyDown={look.onKeyDown}\n className={look.pageFocus ? \"gap-2.5\" : undefined}\n value={typeof binding.value === \"string\" ? binding.value : \"\"}\n onValueChange={(v) => binding.setValue(v)}\n >\n {options.map((o, i) => (\n <Label key={o.value} htmlFor={`${inputId}-${i}`} className={look.row}>\n <RadioGroupItem\n id={`${inputId}-${i}`}\n value={o.value}\n onClick={pick.onItemClick}\n className={look.control}\n />\n <ChoiceContent look={look} index={i} label={o.label ?? o.value} />\n </Label>\n ))}\n </RadioGroup>\n </FieldChrome>\n );\n}\n\nfunction MultiChoiceField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const selected = Array.isArray(binding.value) ? (binding.value as string[]) : [];\n const options = choiceOptions(binding.field);\n const look = useChoiceLook(inputId, options.length);\n const toggle = (value: string, on: boolean) => {\n const next = on ? [...selected, value] : selected.filter((v) => v !== value);\n binding.setValue(next.length ? (next as Json) : undefined);\n };\n // The fieldset from FieldChrome is the group: it is named by the legend and\n // carries the description and error, so the list needs no wrapper role.\n return (\n <FieldChrome props={props}>\n <div className={cn(\"grid gap-2\", look.pageFocus && \"gap-2.5\")} onKeyDown={look.onKeyDown}>\n {look.pageFocus ? <p className=\"-mt-2 mb-1 text-sm text-muted-foreground\">Choose as many as you like</p> : null}\n {options.map((o, i) => (\n <Label key={o.value} htmlFor={`${inputId}-${i}`} className={look.row}>\n <Checkbox\n id={`${inputId}-${i}`}\n checked={selected.includes(o.value)}\n aria-invalid={binding.error ? true : undefined}\n onCheckedChange={(c) => toggle(o.value, c === true)}\n className={look.control}\n />\n <ChoiceContent look={look} index={i} label={o.label ?? o.value} />\n </Label>\n ))}\n </div>\n </FieldChrome>\n );\n}\n\nexport const builtInRenderers: RendererEntry[] = [\n { type: \"short-text\", Component: (p) => <TextField {...p} /> },\n { type: \"long-text\", Component: (p) => <TextField {...p} multiline /> },\n { type: \"email\", Component: (p) => <TextField {...p} type=\"email\" /> },\n // The engine's `phone` type (string value). Registered by name so it works\n // with any engine that defines it; the tel hints don't depend on its manifest.\n { type: \"phone\", Component: (p) => <TextField {...p} type=\"tel\" inputMode=\"tel\" autoComplete=\"tel\" /> },\n { type: \"rating\", Component: ScaleField },\n { type: \"nps\", Component: ScaleField },\n { type: \"single-choice\", Component: SingleChoiceField },\n { type: \"multi-choice\", Component: MultiChoiceField },\n { type: \"yes-no\", Component: YesNoField },\n ...structuredRenderers,\n];\n\n/**\n * The built-in web renderers, shared by every `<Form>` that gets no\n * `registry`. `extend()` returns a new registry and leaves this one alone;\n * `register()` changes this one in place, for every form in the app.\n */\nexport const defaultRegistry = createRendererRegistry(builtInRenderers);\n","import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentType,\n type FormEvent as ReactFormEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"@marktiderman/genesis-ui/button\";\nimport { Progress } from \"@marktiderman/genesis-ui/progress\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport type { CreateFormOptions, FormDefinition, FormEngine, FormState } from \"@marktiderman/genesis-forms\";\nimport {\n FieldRenderer,\n FormRuntime,\n useForm,\n useFormContext,\n useFormSelector,\n type RendererRegistry,\n} from \"@marktiderman/genesis-forms-react\";\nimport { FormPresentationProvider, useFormPresentation, type FormPresentation } from \"./presentation\";\nimport { defaultRegistry } from \"./renderers\";\n\n// ── Slots (the Genesis extension ladder, EXTENDING.md) ──────────────────────\n\ntype SlotOverride<P> = ComponentType<P> | null;\n\nfunction renderSlot<P extends object>(\n Default: ComponentType<P>,\n override: SlotOverride<P> | undefined,\n props: P,\n extra?: Partial<P>,\n): ReactNode {\n if (override === null) return null;\n const Component = override ?? Default;\n return <Component {...props} {...(extra as P)} />;\n}\n\nexport interface HeaderSlotProps {\n title: string;\n description?: string;\n className?: string;\n}\nexport interface BrandSlotProps {\n /** The organisation or business name, shown beside the logo. */\n name: string;\n /** An image URL or your own element. Without one, the name's initials are shown. */\n logo?: ReactNode;\n className?: string;\n}\nexport interface ProgressSlotProps {\n step: number;\n total: number;\n className?: string;\n}\nexport interface NavigationSlotProps {\n canGoBack: boolean;\n isLast: boolean;\n /** True while `onSubmit` is running. */\n busy: boolean;\n /** True after `onSubmit` failed. The answers are kept, and submitting again resends them. */\n failed: boolean;\n onBack: () => void;\n submitLabel: string;\n nextLabel: string;\n retryLabel: string;\n /**\n * The key that continues from this question (\"Enter ↵\", or \"Ctrl + Enter\" in\n * long text). Set in page presentation's focus layout; the default\n * navigation shows it only on devices with a fine pointer (mouse, trackpad).\n */\n keyHint?: string;\n className?: string;\n}\nexport interface EndingSlotProps {\n title: string;\n description?: string;\n className?: string;\n}\nexport interface ErrorSummaryItem {\n /** The field's block id. */\n id: string;\n /** The question, with recall resolved. */\n label: string;\n message: string;\n /** `#` + the field's element id: the control, or the fieldset of a group. */\n href: string;\n}\nexport interface ErrorSummarySlotProps {\n count: number;\n /** Every invalid field, in form order. */\n errors: ErrorSummaryItem[];\n className?: string;\n}\n\n/** Every interior part of `<Form>`. Replace one with `slots`, feed one with `slotProps`, drop one with `null`. */\nexport interface FormSlotMap {\n header: HeaderSlotProps;\n brand: BrandSlotProps;\n progress: ProgressSlotProps;\n navigation: NavigationSlotProps;\n ending: EndingSlotProps;\n errorSummary: ErrorSummarySlotProps;\n}\n\nconst focusRing = \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background\";\n\nfunction DefaultHeader({ title, description, className }: HeaderSlotProps) {\n const { presentation, layout } = useFormPresentation();\n if (presentation === \"page\" && layout === \"focus\") {\n // A quiet line above the first question: the question is the headline.\n return (\n <header className={cn(\"space-y-1\", className)}>\n <h1 className=\"text-sm font-medium text-muted-foreground\">{title}</h1>\n {description ? <p className=\"text-sm text-muted-foreground\">{description}</p> : null}\n </header>\n );\n }\n if (presentation === \"page\") {\n return (\n <header\n className={cn(\n \"rounded-xl border border-t-8 border-t-primary bg-card px-5 py-6 text-card-foreground sm:px-8 sm:py-8\",\n className,\n )}\n >\n <h1 className=\"text-3xl font-semibold tracking-tight text-balance sm:text-4xl\">{title}</h1>\n {description ? <p className=\"mt-3 text-base text-muted-foreground text-pretty\">{description}</p> : null}\n </header>\n );\n }\n return (\n <header className={cn(\"space-y-1\", className)}>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description ? <p className=\"text-muted-foreground\">{description}</p> : null}\n </header>\n );\n}\n\nfunction initials(name: string): string {\n return name\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((word) => word[0]!.toUpperCase())\n .join(\"\");\n}\n\nfunction DefaultBrand({ name, logo, className }: BrandSlotProps) {\n return (\n <div className={cn(\"flex min-w-0 items-center gap-2.5\", className)} data-gf-brand=\"\">\n {typeof logo === \"string\" ? (\n <img src={logo} alt=\"\" className=\"size-8 shrink-0 rounded-md object-contain\" />\n ) : logo ? (\n <span className=\"flex shrink-0 items-center\" aria-hidden=\"true\">\n {logo}\n </span>\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-primary text-xs font-bold tracking-wide text-primary-foreground\"\n >\n {initials(name)}\n </span>\n )}\n <span className=\"truncate text-sm font-semibold tracking-tight\">{name}</span>\n </div>\n );\n}\n\nfunction DefaultProgress({ step, total, className }: ProgressSlotProps) {\n const { presentation } = useFormPresentation();\n const page = presentation === \"page\";\n if (!total) return null;\n // In page mode the bar fills with questions answered (empty on the first), like Typeform.\n const percent = total ? Math.round(((page ? step - 1 : step) / total) * 100) : 0;\n // Not a live region: focus moving to the question is the announcement.\n const bar = (\n <Progress\n value={percent}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-valuetext={`Question ${step} of ${total}`}\n aria-label=\"Progress\"\n className={cn(\"motion-reduce:[&>div]:transition-none\", page && \"h-1 rounded-none bg-primary/15\")}\n />\n );\n if (page) {\n return (\n <div className={cn(\"fixed inset-x-0 top-0 z-10\", className)} data-gf-progress=\"\">\n {bar}\n </div>\n );\n }\n return (\n <div className={cn(\"space-y-1\", className)} data-gf-progress=\"\">\n {bar}\n <p className=\"text-sm text-muted-foreground\">\n Question {step} of {total}\n </p>\n </div>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction DefaultNavigation({\n canGoBack,\n isLast,\n busy,\n failed,\n onBack,\n submitLabel,\n nextLabel,\n retryLabel,\n keyHint,\n className,\n}: NavigationSlotProps) {\n const { presentation, layout } = useFormPresentation();\n const label = busy ? \"Sending…\" : failed ? retryLabel : isLast ? submitLabel : nextLabel;\n if (presentation === \"page\") {\n return (\n <div className={cn(\"flex flex-wrap items-center gap-x-4 gap-y-2\", layout === \"classic\" && \"pt-2\", className)}>\n <Button\n type=\"submit\"\n size=\"lg\"\n loading={busy}\n className=\"h-12 min-w-28 px-6 text-base font-semibold motion-reduce:[&_.animate-spin]:animate-none [&_svg]:size-5\"\n >\n {label}\n {!busy && !failed && !isLast ? <CheckIcon /> : null}\n </Button>\n {keyHint && !busy ? (\n <span className=\"hidden text-sm text-muted-foreground pointer-fine:inline\" data-gf-key-hint=\"\">\n press <kbd className=\"font-sans font-semibold text-foreground\">{keyHint}</kbd>\n </span>\n ) : null}\n {canGoBack ? (\n // After OK in the tab order, drawn quietly at the page's top-left.\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Back\"\n onClick={onBack}\n disabled={busy}\n // Centred on the brand row: h-16 (sm:h-20) minus its own 44px, halved.\n className=\"absolute left-2 top-2.5 size-11 text-muted-foreground sm:left-4 sm:top-4.5 [&_svg]:size-6\"\n >\n <ChevronLeftIcon />\n </Button>\n ) : null}\n </div>\n );\n }\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n {canGoBack ? (\n <Button type=\"button\" variant=\"outline\" size=\"lg\" onClick={onBack} disabled={busy}>\n Back\n </Button>\n ) : null}\n <Button type=\"submit\" size=\"lg\" loading={busy} className=\"motion-reduce:[&_.animate-spin]:animate-none\">\n {label}\n </Button>\n </div>\n );\n}\n\nfunction DefaultEnding({ title, description, className }: EndingSlotProps) {\n const { presentation } = useFormPresentation();\n if (presentation === \"page\") {\n return (\n <div className={cn(\"flex flex-col items-center gap-4 text-center\", className)}>\n <span\n aria-hidden=\"true\"\n className=\"mb-2 flex size-16 items-center justify-center rounded-full bg-primary/10 text-primary\"\n >\n <CheckIcon className=\"size-8\" />\n </span>\n {/* `<Form>` focuses the element marked data-gf-focus when the ending appears. */}\n <h2\n tabIndex={-1}\n data-gf-focus=\"\"\n className={cn(\n \"rounded-sm text-3xl font-semibold leading-tight tracking-tight text-balance sm:text-4xl\",\n focusRing,\n )}\n >\n {title}\n </h2>\n {description ? <p className=\"max-w-md text-lg text-muted-foreground text-pretty\">{description}</p> : null}\n </div>\n );\n }\n return (\n <div className={cn(\"space-y-2 py-8 text-center\", className)}>\n {/* `<Form>` focuses the element marked data-gf-focus when the ending appears. */}\n <h2 tabIndex={-1} data-gf-focus=\"\" className={cn(\"rounded-sm text-2xl font-semibold\", focusRing)}>\n {title}\n </h2>\n {description ? <p className=\"text-muted-foreground\">{description}</p> : null}\n </div>\n );\n}\n\n/** Follow a summary link: focus the control, or the first (checked) option of a group. */\nfunction focusErrorTarget(event: MouseEvent<HTMLAnchorElement>) {\n const id = event.currentTarget.hash.slice(1);\n const target = id ? document.getElementById(id) : null;\n if (!target) return;\n event.preventDefault();\n const control = target.matches(\"input, textarea, select, button\")\n ? target\n : (target.querySelector<HTMLElement>('[aria-checked=\"true\"]:not(:disabled)') ??\n target.querySelector<HTMLElement>(\"input:not(:disabled), textarea:not(:disabled), button:not(:disabled)\"));\n (control ?? target).focus();\n}\n\nfunction DefaultErrorSummary({ count, errors, className }: ErrorSummarySlotProps) {\n const titleId = useId();\n return (\n // `<Form>` focuses the element marked data-gf-error-summary after a failed submit.\n <div\n role=\"group\"\n aria-labelledby={titleId}\n tabIndex={-1}\n data-gf-error-summary=\"\"\n className={cn(\"space-y-2 rounded-md border border-destructive p-4\", focusRing, className)}\n >\n <h2 id={titleId} className=\"text-base font-semibold text-destructive\">\n {count === 1 ? \"One answer needs attention.\" : `${count} answers need attention.`}\n </h2>\n <ul className=\"list-disc space-y-1 pl-5 text-sm\">\n {errors.map((e) => (\n <li key={e.id}>\n <a href={e.href} onClick={focusErrorTarget} className=\"font-medium text-destructive underline underline-offset-4\">\n {e.label}: {e.message}\n </a>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\n// ── Form ─────────────────────────────────────────────────────────────────────\n\nexport interface FormBrand {\n name: string;\n /** An image URL or your own element (decorative: the name is the text). Without one, the name's initials are shown. */\n logo?: ReactNode | undefined;\n}\n\nexport interface FormProps {\n /** A `defineForm` result or a canonical definition. */\n form: FormDefinition | { definition: FormDefinition };\n /** Bring your own engine (from `useForm`) to read state outside the form. `form` and `options` are then unused. */\n engine?: FormEngine | undefined;\n options?: CreateFormOptions | undefined;\n /** Overrides the definition's layout. */\n layout?: \"focus\" | \"classic\" | undefined;\n /**\n * `\"embedded\"` (default): a block inside your own page. `\"page\"`: the\n * respondent's whole screen, for a QR code or a shared link. It fills the\n * viewport with no card around it; in focus layout each question is centred\n * under a thin progress bar with large type and tap targets, and in classic\n * layout the questions are sections on one scrolling page.\n */\n presentation?: FormPresentation | undefined;\n /** An organisation's or business's name and logo, shown small at the top of every step and on the ending. */\n brand?: FormBrand | undefined;\n registry?: RendererRegistry | undefined;\n /**\n * Called once the form completes. The ending shows only after it resolves.\n * If it rejects, the answers stay on screen, read-only (a completed response\n * is final), with an error and a \"Try again\" button that sends them again.\n */\n onSubmit?: ((engine: FormEngine) => void | Promise<void>) | undefined;\n /**\n * Called on every state change: an answer, a step forward or back, a\n * submit attempt (debounce it to save drafts).\n */\n onChange?: ((state: FormState, engine: FormEngine) => void) | undefined;\n /**\n * In focus layout, move on after a single pick (rating, yes/no, one choice).\n * Arrow keys only move through the options; a click, tap or Space picks.\n * Never moves on from the last question. Default true.\n */\n autoAdvance?: boolean | undefined;\n submitLabel?: string | undefined;\n nextLabel?: string | undefined;\n /** The submit button's label after `onSubmit` failed. Default \"Try again\". */\n retryLabel?: string | undefined;\n slots?: { [K in keyof FormSlotMap]?: SlotOverride<FormSlotMap[K]> } | undefined;\n slotProps?: { [K in keyof FormSlotMap]?: Partial<FormSlotMap[K]> } | undefined;\n className?: string | undefined;\n testID?: string | undefined;\n}\n\nconst ADVANCE_DELAY_MS = 250;\n\n// A stable key per engine, so a new engine starts the form body over.\nconst engineKeys = new WeakMap<FormEngine, number>();\nlet nextEngineKey = 0;\nfunction keyOf(engine: FormEngine): number {\n let key = engineKeys.get(engine);\n if (key === undefined) {\n key = nextEngineKey++;\n engineKeys.set(engine, key);\n }\n return key;\n}\n\nexport function Form(props: FormProps) {\n return props.engine ? <FormWithEngine {...props} engine={props.engine} /> : <OwnedForm {...props} />;\n}\n\nfunction OwnedForm(props: FormProps) {\n const engine = useForm(props.form, props.options);\n return <FormWithEngine {...props} engine={engine} />;\n}\n\nfunction FormWithEngine(props: FormProps & { engine: FormEngine }) {\n return (\n <FormRuntime engine={props.engine} registry={props.registry ?? defaultRegistry}>\n <FormBody key={keyOf(props.engine)} {...props} />\n </FormRuntime>\n );\n}\n\n/** Focus what a step or an ending marks, else its question text, else the container. */\nfunction focusWithin(root: HTMLElement | null) {\n if (!root) return;\n const target =\n root.querySelector<HTMLElement>(\"[data-gf-focus]\") ??\n root.querySelector<HTMLElement>(\"[data-gf-question]\") ??\n root.querySelector<HTMLElement>(\"h1, h2, h3\");\n if (target && target.tabIndex < 0 && !target.hasAttribute(\"tabindex\")) target.tabIndex = -1;\n (target ?? root).focus();\n}\n\nfunction FormBody({\n engine,\n layout: layoutProp,\n presentation = \"embedded\",\n brand,\n onSubmit,\n onChange,\n autoAdvance = true,\n submitLabel = \"Submit\",\n nextLabel = \"OK\",\n retryLabel = \"Try again\",\n slots,\n slotProps,\n className,\n testID,\n}: FormProps & { engine: FormEngine }) {\n const { idPrefix } = useFormContext();\n const def = engine.definition;\n const layout = layoutProp ?? def.layout?.mode ?? \"classic\";\n const status = useFormSelector(engine, (s) => s.status);\n const current = useFormSelector(engine, (s) => s.current);\n const pathKey = useFormSelector(engine, (s) => JSON.stringify(s.path));\n // A string, so typing (which builds a new errors object) doesn't re-render the whole form.\n const errorsKey = useFormSelector(engine, (s) => JSON.stringify(s.errors));\n const ending = useFormSelector(engine, (s) => s.ending);\n const historyLength = useFormSelector(engine, (s) => s.history.length);\n // The introduction recalls like endings do ({{field:name}}, {{hidden:owner}}), so it follows\n // the answers; a string, so it re-renders only when the recalled text changes.\n const description = useFormSelector(engine, () => (def.description ? engine.text(def.description) : undefined));\n const path = JSON.parse(pathKey) as string[];\n const errors = JSON.parse(errorsKey) as Record<string, string>;\n const formRef = useRef<HTMLFormElement>(null);\n const stepRef = useRef<HTMLDivElement>(null);\n const endingRef = useRef<HTMLDivElement>(null);\n const advanceTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const previousCurrent = useRef(current);\n const [phase, setPhase] = useState<\"idle\" | \"sending\" | \"sent\" | \"failed\">(\"idle\");\n const [announcement, setAnnouncement] = useState(\"\");\n const [summaryRequest, setSummaryRequest] = useState(0);\n const sending = useRef(false);\n // Which way the last step went, so page mode slides the new question in from that side.\n const direction = useRef<\"forward\" | \"back\">(\"forward\");\n // \"Ctrl\" until mounted, so the server and the first client render agree.\n const [modKey, setModKey] = useState(\"Ctrl\");\n const page = presentation === \"page\";\n\n useEffect(() => {\n if (/Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent)) setModKey(\"⌘\");\n }, []);\n\n const showEnding = status === \"completed\" && (phase === \"sent\" || !onSubmit);\n // A completed response is final: the engine ignores edits, so the fields say so.\n const locked = status === \"completed\";\n\n useEffect(() => {\n if (!onChange) return;\n return engine.subscribe(() => onChange(engine.getState(), engine));\n }, [engine, onChange]);\n\n // A new question cancels a pending auto-advance and, in focus layout, takes\n // focus: the input of a text field, otherwise the visible question. Comparing\n // with the previous question (not a \"mounted\" flag) keeps StrictMode's\n // double effect run from stealing focus on first render. A layout effect, so\n // keys typed right after advancing land in the new input.\n useLayoutEffect(() => {\n if (previousCurrent.current === current) return;\n previousCurrent.current = current;\n clearTimeout(advanceTimer.current);\n if (layout === \"focus\") focusWithin(stepRef.current);\n }, [current, layout]);\n\n useLayoutEffect(() => {\n if (showEnding) focusWithin(endingRef.current);\n }, [showEnding]);\n\n useLayoutEffect(() => {\n if (!summaryRequest) return;\n const form = formRef.current;\n const summary = form?.querySelector<HTMLElement>(\"[data-gf-error-summary]\");\n if (summary) summary.focus();\n else form?.querySelector<HTMLElement>('[aria-invalid=\"true\"]')?.focus();\n }, [summaryRequest]);\n\n // The submit button is disabled while sending, which drops focus; put it back on \"Try again\".\n useLayoutEffect(() => {\n if (phase !== \"failed\") return;\n const form = formRef.current;\n if (form && !form.contains(document.activeElement)) form.querySelector<HTMLElement>('[type=\"submit\"]')?.focus();\n }, [phase]);\n\n useEffect(() => () => clearTimeout(advanceTimer.current), []);\n\n /** Say something once in the persistent live region, even if it's the same text as last time. */\n const announce = (message: string) =>\n setAnnouncement((previous) => (previous === message ? `${message} ` : message));\n const announceStepError = () => {\n const state = engine.getState();\n const message = state.current ? state.errors[state.current] : undefined;\n if (message) announce(message);\n };\n\n const finish = async () => {\n if (sending.current) return;\n // A retry after a failed onSubmit finds the response already completed.\n if (engine.getState().status !== \"completed\" && !engine.submit()) {\n if (layout === \"classic\") setSummaryRequest((n) => n + 1);\n else announceStepError();\n return;\n }\n if (!onSubmit) {\n setPhase(\"sent\");\n return;\n }\n sending.current = true;\n setPhase(\"sending\");\n try {\n await onSubmit(engine);\n setPhase(\"sent\");\n } catch {\n setPhase(\"failed\");\n } finally {\n sending.current = false;\n }\n };\n\n const isLastStep = (state: FormState) => state.current === state.path[state.path.length - 1];\n\n const advance = () => {\n direction.current = \"forward\";\n if (isLastStep(engine.getState())) void finish();\n else if (!engine.next()) announceStepError();\n };\n\n const submit = () => {\n clearTimeout(advanceTimer.current);\n if (layout === \"focus\") advance();\n else void finish();\n };\n\n const handleSubmit = (e: ReactFormEvent) => {\n e.preventDefault();\n submit();\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing) return;\n const target = e.target as HTMLElement;\n // In long text, Enter is a newline; Ctrl/Cmd+Enter moves on.\n if (target instanceof HTMLTextAreaElement) {\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n submit();\n }\n return;\n }\n // Radios and checkboxes leave Enter unused (WAI-ARIA APG); in focus layout\n // it continues, like the OK button. A text input submits natively.\n if (layout === \"focus\" && target.matches('[role=\"radio\"], [role=\"checkbox\"]')) {\n e.preventDefault();\n submit();\n }\n };\n\n // Auto-advance never submits: on the last question the respondent presses Submit.\n const scheduleAdvance =\n layout === \"focus\" && autoAdvance\n ? () => {\n clearTimeout(advanceTimer.current);\n advanceTimer.current = setTimeout(() => {\n const state = engine.getState();\n if (state.status === \"completed\" || isLastStep(state)) return;\n direction.current = \"forward\";\n if (!engine.next()) announceStepError();\n }, ADVANCE_DELAY_MS);\n }\n : undefined;\n\n const goBack = () => {\n clearTimeout(advanceTimer.current);\n direction.current = \"back\";\n engine.back();\n };\n\n // Rendered in both branches at the same position, so it exists before anything is announced.\n const liveRegion = (\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\" data-gf-live=\"\">\n {announcement}\n </div>\n );\n\n const presentationValue = { presentation, layout };\n const brandNode = brand\n ? renderSlot(DefaultBrand, slots?.brand, { name: brand.name, logo: brand.logo }, slotProps?.brand)\n : null;\n\n if (showEnding) {\n const end = def.endings?.find((x) => x.id === ending) ?? def.endings?.[0];\n const endingNode = renderSlot(\n DefaultEnding,\n slots?.ending,\n {\n title: engine.text(end?.title ?? \"Thank you.\"),\n description: end?.description ? engine.text(end.description) : undefined,\n },\n slotProps?.ending,\n );\n return (\n <FormPresentationProvider value={presentationValue}>\n {liveRegion}\n {page ? (\n <div\n ref={endingRef}\n data-presentation=\"page\"\n data-testid={testID}\n className={cn(\"flex min-h-dvh w-full flex-col bg-background text-foreground\", className)}\n >\n {brandNode ? (\n <div className=\"flex h-16 shrink-0 items-center justify-center px-16 sm:h-20\">{brandNode}</div>\n ) : null}\n <div className=\"flex flex-1 items-center justify-center px-4 pb-24 pt-8 sm:px-6\">\n <div className=\"w-full max-w-xl\">{endingNode}</div>\n </div>\n </div>\n ) : (\n <div ref={endingRef} className={cn(\"mx-auto w-full max-w-xl space-y-6\", className)} data-testid={testID}>\n {brandNode}\n {endingNode}\n </div>\n )}\n </FormPresentationProvider>\n );\n }\n\n const pageFocus = page && layout === \"focus\";\n const pageClassic = page && layout === \"classic\";\n\n const renderBlock = (id: string, focus: boolean) => {\n const block = engine.block(id);\n if (!block || block.kind === \"page-break\") return null;\n if (block.kind === \"content\") {\n // In focus layout a content step is its own question text, so it takes focus.\n const focusable = focus ? { tabIndex: -1, \"data-gf-question\": \"\" } : {};\n const content =\n block.type === \"heading\" ? (\n <h2\n key={id}\n className={cn(\n \"rounded-sm text-xl font-semibold\",\n pageFocus && \"text-2xl leading-tight tracking-tight text-balance sm:text-3xl\",\n focusRing,\n )}\n {...focusable}\n >\n {engine.text(block.text)}\n </h2>\n ) : (\n <p\n key={id}\n className={cn(\"rounded-sm text-muted-foreground\", pageFocus && \"text-lg sm:text-xl text-pretty\", focusRing)}\n {...focusable}\n >\n {engine.text(block.text)}\n </p>\n );\n return pageClassic ? (\n <section key={id} className={classicSection}>\n {content}\n </section>\n ) : (\n content\n );\n }\n const field = <FieldRenderer id={id} onAdvance={focus ? scheduleAdvance : undefined} />;\n return (\n <div key={id} data-block={id} className={pageClassic ? classicSection : undefined}>\n {field}\n </div>\n );\n };\n\n const step = current ? Math.max(1, path.indexOf(current) + 1) : 1;\n const isLast = layout === \"classic\" || current === path[path.length - 1];\n const errorItems: ErrorSummaryItem[] = path\n .filter((id) => errors[id])\n .map((id) => ({\n id,\n label: engine.text(engine.field(id)?.label ?? id),\n message: errors[id]!,\n href: `#${idPrefix}-${id}`,\n }));\n const currentField = pageFocus && current ? engine.field(current) : undefined;\n const keyHint = currentField ? (currentField.type === \"long-text\" ? `${modKey} + Enter` : \"Enter ↵\") : undefined;\n\n const header = renderSlot(\n DefaultHeader,\n slots?.header,\n { title: def.title, description },\n slotProps?.header,\n );\n const errorSummary =\n errorItems.length > 0 && layout === \"classic\"\n ? renderSlot(\n DefaultErrorSummary,\n slots?.errorSummary,\n {\n count: errorItems.length,\n errors: errorItems,\n className: page ? \"bg-card\" : undefined,\n },\n slotProps?.errorSummary,\n )\n : null;\n const progress =\n // No questions on the path: no \"Question 1 of 0\".\n layout === \"focus\" && path.length > 0\n ? renderSlot(DefaultProgress, slots?.progress, { step, total: path.length }, slotProps?.progress)\n : null;\n const fields = (\n // Disabled once the response is completed (sending, or after a failed send): read-only, not dead.\n <fieldset disabled={locked} className=\"min-w-0 border-0 p-0\">\n {layout === \"focus\" ? (\n <div\n // A new element per question, so page mode's entry transition runs for each one.\n key={pageFocus ? (current ?? \"\") : undefined}\n ref={stepRef}\n tabIndex={-1}\n className={cn(\n \"outline-none\",\n pageFocus &&\n \"transition-[opacity,translate] duration-300 ease-out starting:opacity-0 motion-reduce:transition-none\",\n pageFocus && (direction.current === \"back\" ? \"starting:-translate-y-6\" : \"starting:translate-y-6\"),\n )}\n >\n {current ? renderBlock(current, true) : null}\n </div>\n ) : (\n <div className={pageClassic ? \"space-y-4\" : \"space-y-8\"}>{path.map((id) => renderBlock(id, false))}</div>\n )}\n </fieldset>\n );\n const failure =\n phase === \"failed\" ? (\n <p role=\"alert\" className={cn(\"text-sm font-medium text-destructive\", page && \"text-base\")}>\n We couldn't send your answers. They're kept here: press {retryLabel} to send them again.\n </p>\n ) : null;\n const navigation = renderSlot(\n DefaultNavigation,\n slots?.navigation,\n {\n canGoBack: layout === \"focus\" && historyLength > 0 && !locked,\n isLast: isLast || status === \"completed\",\n busy: phase === \"sending\",\n failed: phase === \"failed\",\n onBack: goBack,\n submitLabel,\n nextLabel,\n retryLabel,\n keyHint,\n },\n slotProps?.navigation,\n );\n\n const formProps = {\n ref: formRef,\n noValidate: true,\n onSubmit: handleSubmit,\n onKeyDown: handleKeyDown,\n \"data-layout\": layout,\n \"data-presentation\": presentation,\n \"data-testid\": testID,\n };\n\n return (\n <FormPresentationProvider value={presentationValue}>\n {liveRegion}\n {pageFocus ? (\n <form\n {...formProps}\n className={cn(\"relative flex min-h-dvh w-full flex-col bg-background text-foreground\", className)}\n >\n {progress}\n {/* Side padding keeps the brand clear of the Back button at the top-left. */}\n <div className=\"flex h-16 shrink-0 items-center justify-center px-16 sm:h-20\">{brandNode}</div>\n <div className=\"flex flex-1 flex-col justify-center px-4 pb-20 pt-4 sm:px-6 sm:pb-28\">\n <div className=\"mx-auto w-full max-w-xl\">\n {/* The form's name introduces the first question, then stays for assistive tech only. */}\n <div className={historyLength === 0 ? \"mb-5\" : \"sr-only\"}>{header}</div>\n {fields}\n {failure ? <div className=\"mt-6\">{failure}</div> : null}\n <div className=\"mt-10\">{navigation}</div>\n </div>\n </div>\n </form>\n ) : pageClassic ? (\n <form\n {...formProps}\n className={cn(\"min-h-dvh w-full bg-muted/40 px-4 py-8 text-foreground sm:py-12\", className)}\n >\n <div className=\"mx-auto w-full max-w-2xl space-y-4\">\n {brandNode ? <div className=\"flex justify-center pb-2\">{brandNode}</div> : null}\n {header}\n {errorSummary}\n {fields}\n {failure}\n {navigation}\n </div>\n </form>\n ) : (\n <form {...formProps} className={cn(\"mx-auto w-full max-w-xl space-y-8\", className)}>\n {brandNode}\n {header}\n {errorSummary}\n {progress}\n {fields}\n {failure}\n {navigation}\n </form>\n )}\n </FormPresentationProvider>\n );\n}\n\n/** One question per section on a classic page, Google Forms style; an invalid one gets a red edge. */\nconst classicSection =\n \"rounded-xl border bg-card px-5 py-6 text-card-foreground sm:px-8 has-[[aria-invalid=true]]:border-destructive\";\n"]}
|