@marktiderman/genesis-forms-web 0.1.0 → 0.1.1
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/dist/index.d.ts +21 -18
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/index.d.ts
CHANGED
|
@@ -90,7 +90,7 @@ interface FormSlotMap {
|
|
|
90
90
|
interface FormBrand {
|
|
91
91
|
name: string;
|
|
92
92
|
/** An image URL or your own element (decorative: the name is the text). Without one, the name's initials are shown. */
|
|
93
|
-
logo?: ReactNode;
|
|
93
|
+
logo?: ReactNode | undefined;
|
|
94
94
|
}
|
|
95
95
|
interface FormProps {
|
|
96
96
|
/** A `defineForm` result or a canonical definition. */
|
|
@@ -98,10 +98,10 @@ interface FormProps {
|
|
|
98
98
|
definition: FormDefinition;
|
|
99
99
|
};
|
|
100
100
|
/** Bring your own engine (from `useForm`) to read state outside the form. `form` and `options` are then unused. */
|
|
101
|
-
engine?: FormEngine;
|
|
102
|
-
options?: CreateFormOptions;
|
|
101
|
+
engine?: FormEngine | undefined;
|
|
102
|
+
options?: CreateFormOptions | undefined;
|
|
103
103
|
/** Overrides the definition's layout. */
|
|
104
|
-
layout?: "focus" | "classic";
|
|
104
|
+
layout?: "focus" | "classic" | undefined;
|
|
105
105
|
/**
|
|
106
106
|
* `"embedded"` (default): a block inside your own page. `"page"`: the
|
|
107
107
|
* respondent's whole screen, for a QR code or a shared link. It fills the
|
|
@@ -109,36 +109,39 @@ interface FormProps {
|
|
|
109
109
|
* under a thin progress bar with large type and tap targets, and in classic
|
|
110
110
|
* layout the questions are sections on one scrolling page.
|
|
111
111
|
*/
|
|
112
|
-
presentation?: FormPresentation;
|
|
112
|
+
presentation?: FormPresentation | undefined;
|
|
113
113
|
/** A practice's name and logo, shown small at the top of every step and on the ending. */
|
|
114
|
-
brand?: FormBrand;
|
|
115
|
-
registry?: RendererRegistry;
|
|
114
|
+
brand?: FormBrand | undefined;
|
|
115
|
+
registry?: RendererRegistry | undefined;
|
|
116
116
|
/**
|
|
117
117
|
* Called once the form completes. The ending shows only after it resolves.
|
|
118
118
|
* If it rejects, the answers stay on screen, read-only (a completed response
|
|
119
119
|
* is final), with an error and a "Try again" button that sends them again.
|
|
120
120
|
*/
|
|
121
|
-
onSubmit?: (engine: FormEngine) => void | Promise<void
|
|
122
|
-
/**
|
|
123
|
-
|
|
121
|
+
onSubmit?: ((engine: FormEngine) => void | Promise<void>) | undefined;
|
|
122
|
+
/**
|
|
123
|
+
* Called on every state change: an answer, a step forward or back, a
|
|
124
|
+
* submit attempt (debounce it to save drafts).
|
|
125
|
+
*/
|
|
126
|
+
onChange?: ((state: FormState, engine: FormEngine) => void) | undefined;
|
|
124
127
|
/**
|
|
125
128
|
* In focus layout, move on after a single pick (rating, yes/no, one choice).
|
|
126
129
|
* Arrow keys only move through the options; a click, tap or Space picks.
|
|
127
130
|
* Never moves on from the last question. Default true.
|
|
128
131
|
*/
|
|
129
|
-
autoAdvance?: boolean;
|
|
130
|
-
submitLabel?: string;
|
|
131
|
-
nextLabel?: string;
|
|
132
|
+
autoAdvance?: boolean | undefined;
|
|
133
|
+
submitLabel?: string | undefined;
|
|
134
|
+
nextLabel?: string | undefined;
|
|
132
135
|
/** The submit button's label after `onSubmit` failed. Default "Try again". */
|
|
133
|
-
retryLabel?: string;
|
|
136
|
+
retryLabel?: string | undefined;
|
|
134
137
|
slots?: {
|
|
135
138
|
[K in keyof FormSlotMap]?: SlotOverride<FormSlotMap[K]>;
|
|
136
|
-
};
|
|
139
|
+
} | undefined;
|
|
137
140
|
slotProps?: {
|
|
138
141
|
[K in keyof FormSlotMap]?: Partial<FormSlotMap[K]>;
|
|
139
|
-
};
|
|
140
|
-
className?: string;
|
|
141
|
-
testID?: string;
|
|
142
|
+
} | undefined;
|
|
143
|
+
className?: string | undefined;
|
|
144
|
+
testID?: string | undefined;
|
|
142
145
|
}
|
|
143
146
|
declare function Form(props: FormProps): react.JSX.Element;
|
|
144
147
|
|
package/dist/index.js
CHANGED
|
@@ -715,6 +715,7 @@ function FormBody({
|
|
|
715
715
|
const errorsKey = useFormSelector(engine, (s) => JSON.stringify(s.errors));
|
|
716
716
|
const ending = useFormSelector(engine, (s) => s.ending);
|
|
717
717
|
const historyLength = useFormSelector(engine, (s) => s.history.length);
|
|
718
|
+
const description = useFormSelector(engine, () => def.description ? engine.text(def.description) : void 0);
|
|
718
719
|
const path = JSON.parse(pathKey);
|
|
719
720
|
const errors = JSON.parse(errorsKey);
|
|
720
721
|
const formRef = useRef(null);
|
|
@@ -899,8 +900,7 @@ function FormBody({
|
|
|
899
900
|
const field = /* @__PURE__ */ jsx(FieldRenderer, { id, onAdvance: focus ? scheduleAdvance : void 0 });
|
|
900
901
|
return /* @__PURE__ */ jsx("div", { "data-block": id, className: pageClassic ? classicSection : void 0, children: field }, id);
|
|
901
902
|
};
|
|
902
|
-
const
|
|
903
|
-
const step = current ? Math.max(1, visiblePath.indexOf(current) + 1) : 1;
|
|
903
|
+
const step = current ? Math.max(1, path.indexOf(current) + 1) : 1;
|
|
904
904
|
const isLast = layout === "classic" || current === path[path.length - 1];
|
|
905
905
|
const errorItems = path.filter((id) => errors[id]).map((id) => ({
|
|
906
906
|
id,
|
|
@@ -913,7 +913,7 @@ function FormBody({
|
|
|
913
913
|
const header = renderSlot(
|
|
914
914
|
DefaultHeader,
|
|
915
915
|
slots?.header,
|
|
916
|
-
{ title: def.title, description
|
|
916
|
+
{ title: def.title, description },
|
|
917
917
|
slotProps?.header
|
|
918
918
|
);
|
|
919
919
|
const errorSummary = errorItems.length > 0 && layout === "classic" ? renderSlot(
|
|
@@ -926,7 +926,7 @@ function FormBody({
|
|
|
926
926
|
},
|
|
927
927
|
slotProps?.errorSummary
|
|
928
928
|
) : null;
|
|
929
|
-
const progress = layout === "focus" ? renderSlot(DefaultProgress, slots?.progress, { step, total:
|
|
929
|
+
const progress = layout === "focus" ? renderSlot(DefaultProgress, slots?.progress, { step, total: path.length }, slotProps?.progress) : null;
|
|
930
930
|
const fields = (
|
|
931
931
|
// Disabled once the response is completed (sending, or after a failed send): read-only, not dead.
|
|
932
932
|
/* @__PURE__ */ jsx("fieldset", { disabled: locked, className: "min-w-0 border-0 p-0", children: layout === "focus" ? /* @__PURE__ */ jsx(
|
|
@@ -942,7 +942,7 @@ function FormBody({
|
|
|
942
942
|
children: current ? renderBlock(current, true) : null
|
|
943
943
|
},
|
|
944
944
|
pageFocus ? current ?? "" : void 0
|
|
945
|
-
) : /* @__PURE__ */ jsx("div", { className: pageClassic ? "space-y-4" : "space-y-8", children:
|
|
945
|
+
) : /* @__PURE__ */ jsx("div", { className: pageClassic ? "space-y-4" : "space-y-8", children: path.map((id) => renderBlock(id, false)) }) })
|
|
946
946
|
);
|
|
947
947
|
const failure = phase === "failed" ? /* @__PURE__ */ jsxs("p", { role: "alert", className: cn("text-sm font-medium text-destructive", page && "text-base"), children: [
|
|
948
948
|
"We couldn't send your answers. They're kept here: press ",
|
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;\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;\n options?: CreateFormOptions;\n /** Overrides the definition's layout. */\n layout?: \"focus\" | \"classic\";\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;\n /** A practice's name and logo, shown small at the top of every step and on the ending. */\n brand?: FormBrand;\n registry?: RendererRegistry;\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>;\n /** Called after every answer (debounce it to save drafts). */\n onChange?: (state: FormState, engine: FormEngine) => void;\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;\n submitLabel?: string;\n nextLabel?: string;\n /** The submit button's label after `onSubmit` failed. Default \"Try again\". */\n retryLabel?: string;\n slots?: { [K in keyof FormSlotMap]?: SlotOverride<FormSlotMap[K]> };\n slotProps?: { [K in keyof FormSlotMap]?: Partial<FormSlotMap[K]> };\n className?: string;\n testID?: string;\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 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 visiblePath = path.filter((id) => engine.isVisible(id) || engine.block(id)?.kind === \"content\");\n const step = current ? Math.max(1, visiblePath.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: def.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: visiblePath.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\"}>{visiblePath.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/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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marktiderman/genesis-forms-web",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -33,17 +33,17 @@
|
|
|
33
33
|
"README.md"
|
|
34
34
|
],
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"@marktiderman/genesis-forms": "
|
|
37
|
-
"@marktiderman/genesis-forms-react": "
|
|
38
|
-
"@marktiderman/genesis-ui": "^2.
|
|
36
|
+
"@marktiderman/genesis-forms": ">=0.1.1 <1.0.0",
|
|
37
|
+
"@marktiderman/genesis-forms-react": ">=0.1.0 <1.0.0",
|
|
38
|
+
"@marktiderman/genesis-ui": "^2.7.0",
|
|
39
39
|
"react": "^19.0.0",
|
|
40
40
|
"react-dom": "^19.0.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@marktiderman/genesis-design-system": "^1.3.1",
|
|
44
|
-
"@marktiderman/genesis-forms": "^0.
|
|
45
|
-
"@marktiderman/genesis-forms-react": "^0.1.
|
|
46
|
-
"@marktiderman/genesis-ui": "^2.
|
|
44
|
+
"@marktiderman/genesis-forms": "^0.2.0",
|
|
45
|
+
"@marktiderman/genesis-forms-react": "^0.1.1",
|
|
46
|
+
"@marktiderman/genesis-ui": "^2.7.0",
|
|
47
47
|
"@testing-library/react": "^16.3.2",
|
|
48
48
|
"@types/react": "^19.2.14",
|
|
49
49
|
"@types/react-dom": "^19.2.3",
|
|
@@ -54,10 +54,10 @@
|
|
|
54
54
|
"react-dom": "^19.0.0",
|
|
55
55
|
"tsup": "^8.3.0",
|
|
56
56
|
"typescript": "^5.9.3",
|
|
57
|
-
"vitest": "^
|
|
57
|
+
"vitest": "^4.1.12"
|
|
58
58
|
},
|
|
59
59
|
"scripts": {
|
|
60
|
-
"build": "tsup && cp src/styles.css dist/styles.css && node ../../scripts/check-exports-resolve.mjs",
|
|
60
|
+
"build": "tsup && cp src/styles.css dist/styles.css && node ../../scripts/check-exports-resolve.mjs && tsc -p type-tests",
|
|
61
61
|
"clean": "rm -rf dist",
|
|
62
62
|
"typecheck": "tsc --noEmit",
|
|
63
63
|
"test": "vitest run"
|