@marktiderman/genesis-forms-web 0.6.0 → 0.6.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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/presentation.ts","../src/chrome.tsx","../src/calculated.tsx","../src/source.ts","../src/structured.tsx","../src/upload.ts","../src/photo.tsx","../src/searchable.tsx","../src/renderers.tsx","../src/theme.ts","../src/Form.tsx","../src/signed-upload.ts","../src/clean-url.ts"],"names":["jsx","cn","createContext","useContext","jsxs","XIcon","useState","useRef","useEffect","Button","Input","FormError","getFieldType","Textarea","Fragment","invalid","Label","useId","useFormSelector"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\n\n/**\n * How `<Form>` sits on the page. `\"embedded\"` is a block inside your app's own\n * page. `\"page\"` is the respondent's whole screen (a QR code, a shared link):\n * it fills the viewport and draws no card around the form.\n */\nexport type FormPresentation = \"embedded\" | \"page\";\n\nexport interface FormPresentationValue {\n presentation: FormPresentation;\n layout: \"focus\" | \"classic\";\n}\n\nconst FormPresentationContext = createContext<FormPresentationValue>({ presentation: \"embedded\", layout: \"classic\" });\n\nexport const FormPresentationProvider = FormPresentationContext.Provider;\n\n/**\n * The presentation and layout of the enclosing `<Form>`, so a custom slot or\n * renderer can match the built-in ones (larger type and tap targets in page\n * mode, for example). Outside a `<Form>` it reads embedded and classic.\n */\nexport function useFormPresentation(): FormPresentationValue {\n return useContext(FormPresentationContext);\n}\n","import type { ReactNode } from \"react\";\nimport { FormDescription, FormError, FormLabel } from \"@marktiderman/genesis-ui/form-field\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport { getFieldType } from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps } from \"@marktiderman/genesis-forms-react\";\nimport { useFormPresentation } from \"./presentation\";\n\n/** The visible question text takes focus in the focus layout, so it needs a focus ring of its own. */\nconst questionFocus =\n \"rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background\";\n\n// ── Field chrome ─────────────────────────────────────────────────────────────\n\nexport interface FieldChromeProps {\n props: FieldRendererProps;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Label, description and error around a control. Group types (radio,\n * checkbox list, rating, scale) get a real `fieldset`/`legend`, so a screen\n * reader announces the question with every option; the fieldset carries the\n * field's `inputId` (an error summary links to it) and `aria-describedby`.\n * `aria-invalid` sits on the controls: ARIA 1.2 doesn't allow it on a group.\n *\n * The legend or label is the question text: it has `id=\"${inputId}-label\"`\n * and `tabIndex={-1}` and is marked `data-gf-question`, which the focus\n * layout focuses on each new question unless the control is marked\n * `data-gf-focus` (text fields mark their input, so typing just works).\n */\nexport function FieldChrome({ props, children, className }: FieldChromeProps) {\n const { binding, inputId } = props;\n const { field, error, label } = binding;\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const pageClassic = presentation === \"page\" && layout === \"classic\";\n const group = getFieldType(field.type)?.a11y.semantics === \"group\";\n const description = field.description ? props.engine.text(field.description) : undefined;\n // Page focus: the question is the headline, the answer sits well below it.\n const questionSize = pageFocus\n ? \"text-2xl font-semibold leading-tight tracking-tight text-balance sm:text-3xl\"\n : pageClassic\n ? \"text-lg font-medium leading-snug\"\n : \"text-base\";\n const body = (\n <>\n {description ? (\n <FormDescription id={`${inputId}-desc`} className={cn(pageFocus && \"text-base sm:text-lg text-pretty\")}>\n {description}\n </FormDescription>\n ) : null}\n {pageFocus ? <div className=\"pt-6 sm:pt-8\">{children}</div> : children}\n {/* No role=\"alert\": the layout announces errors once (focus layout) or focuses a summary (classic). */}\n {pageFocus ? (\n // A calm note under the answer, Typeform style; the question keeps its colour.\n error ? (\n <FormError\n id={`${inputId}-error`}\n // Solid fill: the dark theme's destructive is a background shade, too dim as text.\n className=\"mt-4 inline-flex items-center gap-2 rounded-md bg-destructive px-3 py-2 text-sm text-destructive-foreground\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4M12 16h.01\" strokeLinecap=\"round\" />\n </svg>\n {error}\n </FormError>\n ) : null\n ) : (\n <FormError id={`${inputId}-error`}>{error}</FormError>\n )}\n </>\n );\n if (group) {\n return (\n <fieldset\n id={inputId}\n data-slot=\"form-field\"\n aria-describedby={describedBy(props)}\n className={cn(\"space-y-3 border-0 p-0 m-0 min-w-0\", className)}\n >\n <legend\n id={`${inputId}-label`}\n tabIndex={-1}\n data-gf-question=\"\"\n className={cn(\n \"mb-3 font-medium\",\n questionSize,\n pageFocus && \"mb-0\",\n questionFocus,\n error && !pageFocus && \"text-destructive\",\n )}\n >\n {label}\n {field.required ? (\n <span className=\"text-destructive ml-1\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </legend>\n {body}\n </fieldset>\n );\n }\n return (\n <div data-slot=\"form-field\" className={cn(\"space-y-2\", pageFocus && \"space-y-3\", className)}>\n <FormLabel\n id={`${inputId}-label`}\n htmlFor={inputId}\n tabIndex={-1}\n data-gf-question=\"\"\n error={Boolean(error) && !pageFocus}\n required={field.required}\n className={cn(presentation === \"page\" && \"block\", questionSize, questionFocus)}\n >\n {label}\n </FormLabel>\n {body}\n </div>\n );\n}\n\nexport function describedBy(props: FieldRendererProps): string | undefined {\n const ids = [\n props.binding.field.description ? `${props.inputId}-desc` : null,\n props.binding.error ? `${props.inputId}-error` : null,\n ].filter(Boolean);\n return ids.length ? ids.join(\" \") : undefined;\n}\n","import { formatCalculated } from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps, RendererEntry } from \"@marktiderman/genesis-forms-react\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport { describedBy, FieldChrome } from \"./chrome\";\nimport { useFormPresentation } from \"./presentation\";\n\n/**\n * A `calculated` field: the value the engine worked out, read-only. It is an\n * `<output>` named by the question, and polite live region, so a screen\n * reader hears the new value as the answers it reads change.\n */\nfunction CalculatedField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const text = formatCalculated(binding.value, binding.field);\n return (\n <FieldChrome props={props}>\n <output\n id={inputId}\n aria-labelledby={`${inputId}-label`}\n aria-describedby={describedBy(props)}\n aria-live=\"polite\"\n data-gf-calculated=\"\"\n className={cn(\n \"block rounded-md border border-dashed bg-muted/40 px-3 py-2 font-medium tabular-nums\",\n pageFocus ? \"text-2xl sm:text-3xl\" : \"text-base\",\n !text && \"text-muted-foreground\",\n )}\n >\n {text || \"—\"}\n </output>\n </FieldChrome>\n );\n}\n\nexport const calculatedRenderers: RendererEntry[] = [{ type: \"calculated\", Component: CalculatedField }];\n","import { createContext, useContext } from \"react\";\n\n/**\n * The video or audio a form is about, as the host app plays it. `media-notes`\n * fields read it: with `currentTime` the add row starts at the current moment\n * (\"Add note at 1:23\"), with `seek` a note's time plays the media from there.\n * Both are in seconds from the start of the full recording.\n */\nexport interface MediaTime {\n /** The playhead now, or undefined when it isn't known yet. */\n currentTime?: (() => number | undefined) | undefined;\n /** Move the playhead. */\n seek?: ((seconds: number) => void) | undefined;\n}\n\n/** Provide it around `<Form>` to link `media-notes` fields to a media player. */\nexport const MediaTimeContext = createContext<MediaTime | null>(null);\n\n/** The enclosing `MediaTimeContext` value, or null. */\nexport function useMediaTime(): MediaTime | null {\n return useContext(MediaTimeContext);\n}\n\n/**\n * The text a form is about (an article, a policy, a contract). `text-highlights`\n * fields highlight passages of it; a field's own `props.text` is used when no\n * host provides one. Offsets are UTF-16 indices into this exact string.\n */\nexport const SourceTextContext = createContext<string | null>(null);\n\n/** The enclosing `SourceTextContext` value, or null. */\nexport function useSourceText(): string | null {\n return useContext(SourceTextContext);\n}\n","/**\n * Renderers for the structured field types: `list`, `table`, `media-notes`\n * and `text-highlights`. Each is a group (FieldChrome draws the fieldset and\n * legend); every control inside has its own visible or accessible name.\n */\nimport { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Button } from \"@marktiderman/genesis-ui/button\";\nimport { Input } from \"@marktiderman/genesis-ui/input\";\nimport { Label } from \"@marktiderman/genesis-ui/label\";\nimport { Stack } from \"@marktiderman/genesis-ui/layout\";\nimport { SortableList } from \"@marktiderman/genesis-ui/sortable-list\";\nimport { Textarea } from \"@marktiderman/genesis-ui/textarea\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport {\n formatTimestamp,\n listLimits,\n parseTimestamp,\n tableColumns,\n tableLimits,\n type Highlight,\n type Json,\n type MediaNote,\n} from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps, RendererEntry } from \"@marktiderman/genesis-forms-react\";\nimport { FieldChrome } from \"./chrome\";\nimport { useSourceText, useMediaTime } from \"./source\";\n\n// ── Shared ───────────────────────────────────────────────────────────────────\n\nfunction PlusIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n );\n}\n\nfunction XIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nfunction move<T>(list: readonly T[], from: number, to: number): T[] {\n const next = list.slice();\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item as T);\n return next;\n}\n\n/**\n * Stable React keys for the entries of a list value, which has none of its\n * own (two list items may hold the same text). Kept in step with every add,\n * remove and move; a value replaced from outside (a draft restored) just gets\n * keys for its new length.\n */\nfunction useEntryKeys(count: number) {\n const keys = useRef<string[]>([]);\n const next = useRef(0);\n const make = () => `e${next.current++}`;\n while (keys.current.length < count) keys.current.push(make());\n if (keys.current.length > count) keys.current = keys.current.slice(0, count);\n return {\n keys: keys.current,\n /** Add a key at `at` and return it. */\n insert(at: number): string {\n const key = make();\n keys.current = [...keys.current.slice(0, at), key, ...keys.current.slice(at)];\n return key;\n },\n remove(at: number) {\n keys.current = keys.current.filter((_, i) => i !== at);\n },\n move(from: number, to: number) {\n keys.current = move(keys.current, from, to);\n },\n };\n}\n\n/** Focus the element registered under a key once it has rendered. */\nfunction useFocusLater() {\n const elements = useRef(new Map<string, HTMLElement>());\n const [target, setTarget] = useState<string | null>(null);\n useEffect(() => {\n if (target === null) return;\n elements.current.get(target)?.focus();\n setTarget(null);\n }, [target]);\n return {\n ref: (key: string) => (el: HTMLElement | null) => {\n if (el) elements.current.set(key, el);\n else elements.current.delete(key);\n },\n focus: setTarget,\n };\n}\n\nconst invalid = (props: FieldRendererProps) => (props.binding.error ? true : undefined);\n\nfunction RemoveButton({ label, onClick, disabled }: { label: string; onClick: () => void; disabled?: boolean }) {\n return (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={label} disabled={disabled} onClick={onClick} className=\"shrink-0\">\n <XIcon />\n </Button>\n );\n}\n\nfunction AddButton({ children, onClick, disabled }: { children: ReactNode; onClick: () => void; disabled?: boolean }) {\n return (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={disabled} onClick={onClick} className=\"self-start\">\n <PlusIcon /> {children}\n </Button>\n );\n}\n\n/** A short form of a passage, for labels (\"Remove highlight “The quick brown…”\"). */\nfunction excerpt(text: string, max = 40): string {\n const t = text.replace(/\\s+/g, \" \").trim();\n return t.length > max ? `${t.slice(0, max - 1)}…` : t;\n}\n\n// ── list ─────────────────────────────────────────────────────────────────────\n\nfunction ListField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const field = binding.field;\n const { max, itemMaxLength } = listLimits(field);\n const stored = Array.isArray(binding.value) ? binding.value.map((v) => (typeof v === \"string\" ? v : \"\")) : [];\n // An unanswered list still shows one empty line to type in.\n const items = stored.length ? stored : [\"\"];\n const entries = useEntryKeys(items.length);\n const focusLater = useFocusLater();\n const addRef = useRef<HTMLButtonElement>(null);\n const placeholder =\n typeof field.props?.placeholder === \"string\" ? field.props.placeholder : (field.placeholder ?? undefined);\n const save = (next: string[]) => binding.setValue(next.length ? (next as Json) : undefined);\n\n const add = () => {\n if (items.length >= max) return;\n const key = entries.insert(items.length);\n save([...items, \"\"]);\n focusLater.focus(key);\n };\n const remove = (i: number) => {\n entries.remove(i);\n const next = items.filter((_, j) => j !== i);\n save(next);\n const neighbour = entries.keys[Math.min(i, next.length - 1)];\n if (neighbour !== undefined && next.length) focusLater.focus(neighbour);\n else addRef.current?.focus();\n };\n const onKeyDown = (i: number) => (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing || e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) return;\n if (i < items.length - 1) {\n e.preventDefault();\n focusLater.focus(entries.keys[i + 1]!);\n } else if (items.length < max) {\n // Enter in the last item starts the next one instead of moving on.\n e.preventDefault();\n add();\n }\n };\n\n const rows = items.map((text, index) => ({ key: entries.keys[index]!, text, index }));\n return (\n <FieldChrome props={props}>\n <Stack gap=\"sm\">\n <SortableList\n items={rows}\n getKey={(r) => r.key}\n getItemLabel={(r) => (r.text.trim() ? excerpt(r.text, 30) : `Item ${r.index + 1}`)}\n label={`${binding.label}: items`}\n disabled={items.length < 2}\n onReorder={(from, to) => {\n entries.move(from, to);\n save(move(items, from, to));\n }}\n renderItem={(r, { handle, index }) => (\n <Stack direction=\"row\" align=\"center\" gap=\"sm\" className=\"w-full min-w-0\">\n {handle}\n <Input\n ref={focusLater.ref(r.key)}\n id={index === 0 ? `${inputId}-0` : undefined}\n data-gf-focus={index === 0 ? \"\" : undefined}\n aria-label={`Item ${index + 1}`}\n aria-invalid={invalid(props)}\n maxLength={itemMaxLength}\n placeholder={placeholder}\n value={r.text}\n onChange={(e) => save(items.map((t, j) => (j === index ? e.target.value : t)))}\n onKeyDown={onKeyDown(index)}\n />\n <RemoveButton\n label={`Remove item ${index + 1}`}\n disabled={items.length === 1 && r.text === \"\"}\n onClick={() => remove(index)}\n />\n </Stack>\n )}\n />\n <Button\n ref={addRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={items.length >= max}\n onClick={add}\n >\n <PlusIcon /> Add item\n </Button>\n </Stack>\n </FieldChrome>\n );\n}\n\n// ── table ────────────────────────────────────────────────────────────────────\n\ntype Row = Record<string, string>;\n\nfunction toRow(value: Json | undefined): Row {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n return Object.fromEntries(Object.entries(value).filter((e): e is [string, string] => typeof e[1] === \"string\"));\n}\n\nfunction TableField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const columns = tableColumns(binding.field);\n const { minRows, maxRows } = tableLimits(binding.field);\n const stored = Array.isArray(binding.value) ? binding.value.map(toRow) : [];\n // Show at least the rows asked for (one when none are), never more than allowed.\n const shown = Math.min(Math.max(stored.length, minRows, 1), Math.max(maxRows, 1));\n const rows = Array.from({ length: shown }, (_, i) => stored[i] ?? {});\n const entries = useEntryKeys(rows.length);\n const focusLater = useFocusLater();\n const addRef = useRef<HTMLButtonElement>(null);\n const save = (next: Row[]) => binding.setValue(next.length ? (next as Json) : undefined);\n const firstKey = columns[0]?.key;\n\n const add = () => {\n if (rows.length >= maxRows) return;\n const key = entries.insert(rows.length);\n save([...rows, {}]);\n focusLater.focus(key);\n };\n const remove = (i: number) => {\n entries.remove(i);\n const next = rows.filter((_, j) => j !== i);\n save(next);\n const neighbour = entries.keys[Math.min(i, next.length - 1)];\n if (neighbour !== undefined && next.length) focusLater.focus(neighbour);\n else addRef.current?.focus();\n };\n\n if (!columns.length) {\n return (\n <FieldChrome props={props}>\n <p className=\"text-sm text-muted-foreground\">This question has no columns yet.</p>\n </FieldChrome>\n );\n }\n const items = rows.map((row, index) => ({ key: entries.keys[index]!, row, index }));\n return (\n <FieldChrome props={props}>\n <Stack gap=\"md\">\n <SortableList\n items={items}\n getKey={(r) => r.key}\n getItemLabel={(r) => `Row ${r.index + 1}`}\n label={`${binding.label}: rows`}\n disabled={rows.length < 2}\n onReorder={(from, to) => {\n entries.move(from, to);\n save(move(rows, from, to));\n }}\n renderItem={(r, { handle, index }) => (\n <Stack direction=\"row\" align=\"start\" gap=\"sm\" className=\"w-full min-w-0\">\n {handle ? <div className=\"pt-7\">{handle}</div> : null}\n <fieldset className=\"m-0 min-w-0 flex-1 rounded-md border border-input p-3\">\n <legend className=\"px-1 text-sm font-medium\">{`Row ${index + 1}`}</legend>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {columns.map((column, c) => {\n const id = `${inputId}-${r.key}-${column.key}`;\n const common = {\n id,\n // The first cell of the first row is what an error summary link and the focus layout reach.\n \"data-gf-focus\": index === 0 && c === 0 ? \"\" : undefined,\n \"aria-invalid\": invalid(props),\n value: r.row[column.key] ?? \"\",\n maxLength: 2000,\n } as const;\n const set = (text: string) =>\n save(rows.map((row, j) => (j === index ? { ...row, [column.key]: text } : row)));\n return (\n <div key={column.key} className={cn(\"space-y-1.5\", column.long && \"sm:col-span-2\")}>\n <Label htmlFor={id}>{column.label}</Label>\n {column.long ? (\n <Textarea\n {...common}\n ref={column.key === firstKey ? focusLater.ref(r.key) : undefined}\n rows={2}\n onChange={(e) => set(e.target.value)}\n />\n ) : (\n <Input\n {...common}\n ref={column.key === firstKey ? focusLater.ref(r.key) : undefined}\n onChange={(e) => set(e.target.value)}\n />\n )}\n </div>\n );\n })}\n </div>\n </fieldset>\n <div className=\"pt-7\">\n <RemoveButton\n label={`Remove row ${index + 1}`}\n disabled={rows.length <= Math.max(minRows, 1)}\n onClick={() => remove(index)}\n />\n </div>\n </Stack>\n )}\n />\n <Button\n ref={addRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={rows.length >= maxRows}\n onClick={add}\n >\n <PlusIcon /> Add row\n </Button>\n </Stack>\n </FieldChrome>\n );\n}\n\n// ── media-notes ──────────────────────────────────────────────────────────────\n\nfunction toNote(value: Json): MediaNote {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { at: 0, text: \"\" };\n return { at: typeof value.at === \"number\" ? value.at : 0, text: typeof value.text === \"string\" ? value.text : \"\" };\n}\n\nfunction MediaNotesField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const media = useMediaTime();\n const maxNotes = typeof binding.field.props?.maxNotes === \"number\" ? binding.field.props.maxNotes : 20;\n const textMaxLength = typeof binding.field.props?.textMaxLength === \"number\" ? binding.field.props.textMaxLength : 1000;\n const notes = Array.isArray(binding.value) ? binding.value.map(toNote) : [];\n const entries = useEntryKeys(notes.length);\n const now = () => {\n const t = media?.currentTime?.();\n return typeof t === \"number\" && Number.isFinite(t) && t >= 0 ? formatTimestamp(t) : \"\";\n };\n const [time, setTime] = useState(now);\n // Once the respondent types a time, the player no longer overwrites it.\n const [timeTouched, setTimeTouched] = useState(false);\n const [text, setText] = useState(\"\");\n const [timeError, setTimeError] = useState<string | null>(null);\n const textRef = useRef<HTMLInputElement>(null);\n const save = (next: MediaNote[]) => binding.setValue(next.length ? (next as unknown as Json) : undefined);\n const full = notes.length >= maxNotes;\n const follow = () => {\n if (timeTouched || !media?.currentTime) return;\n const t = now();\n if (t) setTime(t);\n };\n\n const parsed = parseTimestamp(time);\n const add = () => {\n if (full || !text.trim()) return;\n const at = time.trim() === \"\" && !media?.currentTime ? 0 : parsed;\n if (at === null) {\n setTimeError(\"Enter a time like 1:23 or 1:02:03.\");\n return;\n }\n // Keep notes in time order; a new note goes after others at the same moment.\n const at_ = notes.findIndex((n) => n.at > at);\n const index = at_ === -1 ? notes.length : at_;\n entries.insert(index);\n save([...notes.slice(0, index), { at, text: text.trim() }, ...notes.slice(index)]);\n setText(\"\");\n setTimeError(null);\n setTimeTouched(false);\n setTime(now());\n textRef.current?.focus();\n };\n const onEnter = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing) return;\n // Enter adds the note rather than moving on to the next question.\n e.preventDefault();\n add();\n };\n const addLabel =\n media?.currentTime && parsed !== null ? `Add note at ${formatTimestamp(parsed)}` : \"Add note\";\n const timeId = `${inputId}-time`;\n const textId = `${inputId}-text`;\n\n return (\n <FieldChrome props={props}>\n <Stack gap=\"md\">\n {notes.length ? (\n <ol aria-label={`${binding.label}: notes`} className=\"m-0 list-none space-y-2 p-0\">\n {notes.map((note, index) => {\n const at = formatTimestamp(note.at);\n return (\n <li key={entries.keys[index]}>\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n {media?.seek ? (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n className=\"shrink-0 px-0 tabular-nums\"\n aria-label={`Play from ${at}`}\n onClick={() => media.seek?.(note.at)}\n >\n {at}\n </Button>\n ) : (\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{at}</span>\n )}\n <Input\n aria-label={`Note at ${at}`}\n aria-invalid={invalid(props)}\n maxLength={textMaxLength}\n value={note.text}\n onChange={(e) => save(notes.map((n, j) => (j === index ? { ...n, text: e.target.value } : n)))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.preventDefault();\n }}\n />\n <RemoveButton\n label={`Remove note at ${at}`}\n onClick={() => {\n entries.remove(index);\n save(notes.filter((_, j) => j !== index));\n textRef.current?.focus();\n }}\n />\n </Stack>\n </li>\n );\n })}\n </ol>\n ) : null}\n {full ? (\n <p className=\"text-sm text-muted-foreground\">{`You've added the most notes this question takes (${maxNotes}).`}</p>\n ) : (\n <div className=\"grid gap-2 sm:grid-cols-[7rem_1fr_auto] sm:items-end\">\n <div className=\"space-y-1.5\">\n <Label htmlFor={timeId}>Time</Label>\n <Input\n id={timeId}\n inputMode=\"numeric\"\n placeholder=\"m:ss\"\n value={time}\n aria-invalid={timeError ? true : undefined}\n aria-describedby={timeError ? `${timeId}-error` : undefined}\n onChange={(e) => {\n setTime(e.target.value);\n setTimeTouched(true);\n setTimeError(null);\n }}\n onKeyDown={onEnter}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor={textId}>Note</Label>\n <Input\n ref={textRef}\n id={textId}\n data-gf-focus=\"\"\n maxLength={textMaxLength}\n value={text}\n onFocus={follow}\n onChange={(e) => {\n if (!text) follow();\n setText(e.target.value);\n }}\n onKeyDown={onEnter}\n />\n </div>\n <AddButton onClick={add} disabled={!text.trim()}>\n {addLabel}\n </AddButton>\n {timeError ? (\n <p id={`${timeId}-error`} className=\"text-sm text-destructive sm:col-span-3\">\n {timeError}\n </p>\n ) : null}\n </div>\n )}\n </Stack>\n </FieldChrome>\n );\n}\n\n// ── text-highlights ──────────────────────────────────────────────────────────\n\nfunction toHighlight(value: Json): Highlight | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const { start, end, quote, note } = value;\n if (typeof start !== \"number\" || typeof end !== \"number\" || typeof quote !== \"string\") return null;\n return { start, end, quote, note: typeof note === \"string\" ? note : \"\" };\n}\n\n/** The text in pieces, each marked when some highlight covers it. */\nfunction segments(text: string, highlights: readonly Highlight[]) {\n const cuts = new Set([0, text.length]);\n for (const h of highlights) {\n if (h.start >= 0 && h.end <= text.length && h.start < h.end) {\n cuts.add(h.start);\n cuts.add(h.end);\n }\n }\n const points = [...cuts].sort((a, b) => a - b);\n const out: { start: number; text: string; marked: boolean }[] = [];\n for (let i = 0; i < points.length - 1; i++) {\n const start = points[i]!;\n const end = points[i + 1]!;\n if (end <= start) continue;\n out.push({ start, text: text.slice(start, end), marked: highlights.some((h) => h.start <= start && h.end >= end) });\n }\n return out;\n}\n\n/** The offset within `root`'s text of a DOM position inside it. */\nfunction textOffset(root: Node, node: Node, offset: number): number {\n const range = document.createRange();\n range.selectNodeContents(root);\n range.setEnd(node, offset);\n return range.toString().length;\n}\n\nfunction TextHighlightsField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const hosted = useSourceText();\n const own = typeof binding.field.props?.text === \"string\" ? binding.field.props.text : \"\";\n const text = hosted ?? own;\n const maxHighlights =\n typeof binding.field.props?.maxHighlights === \"number\" ? binding.field.props.maxHighlights : 20;\n const highlights = (Array.isArray(binding.value) ? binding.value : []).flatMap((v) => {\n const h = toHighlight(v);\n return h ? [h] : [];\n });\n const entries = useEntryKeys(highlights.length);\n const textRef = useRef<HTMLParagraphElement>(null);\n const noteRef = useRef<HTMLTextAreaElement>(null);\n const toggleRef = useRef<HTMLButtonElement>(null);\n const [selection, setSelection] = useState<{ start: number; end: number } | null>(null);\n const [typing, setTyping] = useState(false);\n const [passage, setPassage] = useState(\"\");\n const [note, setNote] = useState(\"\");\n const full = highlights.length >= maxHighlights;\n const save = (next: Highlight[]) => binding.setValue(next.length ? (next as unknown as Json) : undefined);\n const hintId = useId();\n\n // The keyboard way: the first place the typed passage appears.\n const typed = passage.trim();\n const found = typing && typed ? text.indexOf(typed) : -1;\n const draft = typing ? (found >= 0 ? { start: found, end: found + typed.length } : null) : selection;\n\n const draftKey = draft ? `${draft.start}:${draft.end}` : \"\";\n const wasSelection = useRef(false);\n useEffect(() => {\n // A new selection moves focus to its note; a typed passage keeps focus where the typing is.\n if (draftKey && wasSelection.current) noteRef.current?.focus();\n }, [draftKey]);\n\n const readSelection = () => {\n const root = textRef.current;\n const sel = typeof window === \"undefined\" ? null : window.getSelection();\n if (!root || !sel || sel.rangeCount === 0 || sel.isCollapsed || full) return;\n const range = sel.getRangeAt(0);\n if (!root.contains(range.startContainer) || !root.contains(range.endContainer)) return;\n let start = textOffset(root, range.startContainer, range.startOffset);\n let end = textOffset(root, range.endContainer, range.endOffset);\n if (start > end) [start, end] = [end, start];\n // Leave out the spaces a double-click or drag picks up at the edges.\n while (start < end && /\\s/.test(text[start]!)) start++;\n while (end > start && /\\s/.test(text[end - 1]!)) end--;\n if (end <= start) return;\n wasSelection.current = true;\n setTyping(false);\n setSelection({ start, end });\n };\n\n const reset = () => {\n setSelection(null);\n setPassage(\"\");\n setNote(\"\");\n setTyping(false);\n wasSelection.current = false;\n };\n const commit = () => {\n if (!draft || !note.trim() || full) return;\n const h: Highlight = { start: draft.start, end: draft.end, quote: text.slice(draft.start, draft.end), note: note.trim() };\n const at = highlights.findIndex((x) => x.start > h.start);\n const index = at === -1 ? highlights.length : at;\n entries.insert(index);\n save([...highlights.slice(0, index), h, ...highlights.slice(index)]);\n reset();\n window.getSelection?.()?.removeAllRanges();\n toggleRef.current?.focus();\n };\n\n if (!text) {\n return (\n <FieldChrome props={props}>\n <p className=\"text-sm text-muted-foreground\">There is no passage to highlight.</p>\n </FieldChrome>\n );\n }\n\n return (\n <FieldChrome props={props}>\n <Stack gap=\"md\">\n <p\n ref={textRef}\n id={`${inputId}-text`}\n aria-describedby={hintId}\n className=\"m-0 whitespace-pre-wrap rounded-md border border-input bg-muted/30 p-3 text-base leading-relaxed\"\n onMouseUp={readSelection}\n onTouchEnd={readSelection}\n onKeyUp={readSelection}\n >\n {segments(text, highlights).map((s) =>\n s.marked ? (\n <mark key={s.start} className=\"rounded-sm bg-primary/20 text-foreground\">\n {s.text}\n </mark>\n ) : (\n <span key={s.start}>{s.text}</span>\n ),\n )}\n </p>\n <p id={hintId} className=\"m-0 text-sm text-muted-foreground\">\n {full\n ? `You've added the most highlights this question takes (${maxHighlights}).`\n : \"Select words in the passage to highlight them, or use Highlight a passage to type them.\"}\n </p>\n {!full ? (\n <Button\n ref={toggleRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n aria-expanded={typing}\n onClick={() => {\n setSelection(null);\n wasSelection.current = false;\n setTyping((t) => !t);\n }}\n >\n Highlight a passage\n </Button>\n ) : null}\n {typing && !full ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor={`${inputId}-passage`}>Passage</Label>\n <Input\n id={`${inputId}-passage`}\n value={passage}\n aria-describedby={`${inputId}-passage-hint`}\n aria-invalid={typed && found < 0 ? true : undefined}\n onChange={(e) => setPassage(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (found >= 0) noteRef.current?.focus();\n }\n }}\n />\n <p id={`${inputId}-passage-hint`} className=\"m-0 text-sm text-muted-foreground\">\n {typed && found < 0 ? \"Not found in the passage. Type the words exactly as they appear.\" : \"Type the words exactly as they appear.\"}\n </p>\n </div>\n ) : null}\n {draft && !full ? (\n <div role=\"group\" aria-label=\"New highlight\" className=\"space-y-2 rounded-md border border-input p-3\">\n <blockquote className=\"m-0 border-l-2 border-primary pl-3 text-sm\">\n <mark className=\"bg-primary/20 text-foreground\">{text.slice(draft.start, draft.end)}</mark>\n </blockquote>\n <Label htmlFor={`${inputId}-note`}>Your note</Label>\n <Textarea\n ref={noteRef}\n id={`${inputId}-note`}\n rows={2}\n maxLength={1000}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n <Stack direction=\"row\" gap=\"sm\">\n <Button type=\"button\" size=\"sm\" disabled={!note.trim()} onClick={commit}>\n Highlight\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={reset}>\n Cancel\n </Button>\n </Stack>\n </div>\n ) : null}\n {highlights.length ? (\n <ol aria-label={`${binding.label}: highlights`} className=\"m-0 list-none space-y-3 p-0\">\n {highlights.map((h, index) => {\n const name = `“${excerpt(h.quote)}”`;\n return (\n <li key={entries.keys[index]} className=\"space-y-1.5\">\n <blockquote className=\"m-0 border-l-2 border-primary pl-3 text-sm\">{h.quote}</blockquote>\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n <Input\n aria-label={`Note on ${name}`}\n aria-invalid={invalid(props) || (h.note.trim() ? undefined : true)}\n maxLength={1000}\n value={h.note}\n onChange={(e) => save(highlights.map((x, j) => (j === index ? { ...x, note: e.target.value } : x)))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.preventDefault();\n }}\n />\n <RemoveButton\n label={`Remove highlight ${name}`}\n onClick={() => {\n entries.remove(index);\n save(highlights.filter((_, j) => j !== index));\n toggleRef.current?.focus();\n }}\n />\n </Stack>\n </li>\n );\n })}\n </ol>\n ) : null}\n </Stack>\n </FieldChrome>\n );\n}\n\nexport const structuredRenderers: RendererEntry[] = [\n { type: \"list\", Component: ListField },\n { type: \"table\", Component: TableField },\n { type: \"media-notes\", Component: MediaNotesField },\n { type: \"text-highlights\", Component: TextHighlightsField },\n];\n","import { createContext, useContext } from \"react\";\nimport type { FieldBlock, PhotoRef } from \"@marktiderman/genesis-forms\";\n\n/**\n * Where a form's files go. The host stores each file (its own bucket, its own\n * rules) and resolves to a reference, which is all the answer keeps; a\n * rejection is shown under the field. `photo` fields read it.\n */\nexport interface UploadHost {\n upload(file: File, field: FieldBlock): Promise<PhotoRef>;\n /** A link to read a stored file (the host's storage signs it), or null when it can't be read. */\n url?(ref: PhotoRef, field?: FieldBlock): Promise<string | null>;\n}\n\n/** Provide it around `<Form>` (or pass `onUpload`) so `photo` fields can store files. */\nexport const UploadContext = createContext<UploadHost | null>(null);\n\n/** The enclosing `UploadContext` value, or null when no host stores files. */\nexport function useUpload(): UploadHost | null {\n return useContext(UploadContext);\n}\n\n/** What `<Form>` asks while a file is on its way: it neither moves on nor sends until every one is done. */\nexport interface PendingUploads {\n /** Call when an upload starts; call the function it returns once it ends (it counts once). */\n start(): () => void;\n count(): number;\n}\n\nexport const PendingUploadsContext = createContext<PendingUploads | null>(null);\n\n/** A fresh counter of uploads in flight. */\nexport function createPendingUploads(): PendingUploads {\n let n = 0;\n return {\n start() {\n n++;\n let done = false;\n return () => {\n if (done) return;\n done = true;\n n--;\n };\n },\n count: () => n,\n };\n}\n\n/** Said when the respondent tries to move on or send while a photo is still uploading. */\nexport const UPLOAD_WAIT_MESSAGE = \"Wait for the photo to finish uploading.\";\n","/**\n * The `photo` renderer: choose a photo (or, on a phone or tablet, take one),\n * see it as a thumbnail, remove it. The file goes to the host's `upload`\n * (`UploadContext`, or `onUpload` on `<Form>`); the answer keeps only the\n * reference the host returns. Type, size and count are checked here first,\n * so a respondent hears why at once; the host's server checks them again.\n */\nimport { useContext, useEffect, useRef, useState, type ChangeEvent } from \"react\";\nimport { Button } from \"@marktiderman/genesis-ui/button\";\nimport { FormError } from \"@marktiderman/genesis-ui/form-field\";\nimport { Input } from \"@marktiderman/genesis-ui/input\";\nimport { Spinner } from \"@marktiderman/genesis-ui/spinner\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport {\n isPhotoRef,\n photoCountMessage,\n photoLimits,\n photoRefs,\n photoSizeMessage,\n photoTypeMessage,\n type FieldBlock,\n type PhotoRef,\n} from \"@marktiderman/genesis-forms\";\nimport { useFormSelector, type FieldRendererProps, type RendererEntry } from \"@marktiderman/genesis-forms-react\";\nimport { FieldChrome } from \"./chrome\";\nimport { PendingUploadsContext, useUpload } from \"./upload\";\n\nfunction CameraIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\" />\n <circle cx=\"12\" cy=\"13\" r=\"3\" />\n </svg>\n );\n}\n\nfunction ImageIcon({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className={className}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.1-3.1a2 2 0 0 0-2.8 0L6 21\" />\n </svg>\n );\n}\n\nfunction XIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nconst HEIC_NAME = /\\.hei[cf]$/i;\n\n/** The file's type as the field judges it: some browsers give a HEIC photo no type, so its name decides. */\nexport function photoFileType(file: { name: string; type: string }): string {\n const type = file.type.toLowerCase();\n if (type) return type;\n return HEIC_NAME.test(file.name) ? (file.name.toLowerCase().endsWith(\".heif\") ? \"image/heif\" : \"image/heic\") : \"\";\n}\n\n/** Why a picked file can't be added, or null when it can. */\nexport function photoFileProblem(field: FieldBlock, file: { name: string; type: string; size: number }): string | null {\n const limits = photoLimits(field);\n if (!limits.mimeTypes.includes(photoFileType(file))) return photoTypeMessage(field);\n if (file.size <= 0 || file.size > limits.maxBytes) return photoSizeMessage(field);\n return null;\n}\n\n/** The `accept` attribute for a field: its MIME types, plus HEIC's file names for browsers that give it no type. */\nexport function photoAccept(field: FieldBlock): string {\n const limits = photoLimits(field);\n return [...limits.mimeTypes, ...(limits.formats.includes(\"heic\") ? [\".heic\", \".heif\"] : [])].join(\",\");\n}\n\ninterface Uploading {\n key: string;\n name: string;\n preview: string | null;\n}\n\n/** The thumbnail of one photo: its picture when there is a preview the browser can draw, else its name. */\nfunction Tile({ name, preview, busy }: { name: string; preview: string | null; busy?: boolean }) {\n const [failed, setFailed] = useState(false);\n return (\n <div className=\"relative size-24 overflow-hidden rounded-md border bg-muted sm:size-28\">\n {preview && !failed ? (\n <img src={preview} alt={name} className={cn(\"size-full object-cover\", busy && \"opacity-60\")} onError={() => setFailed(true)} />\n ) : (\n <div className=\"flex size-full flex-col items-center justify-center gap-1 p-2 text-center text-xs text-muted-foreground\">\n <ImageIcon className=\"size-6\" />\n <span className=\"line-clamp-2 break-all\">{name}</span>\n </div>\n )}\n {busy ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner size=\"sm\" aria-hidden=\"true\" />\n </div>\n ) : null}\n </div>\n );\n}\n\nlet nextKey = 0;\n\nfunction PhotoField(props: FieldRendererProps) {\n const { binding, inputId, engine } = props;\n const { field } = binding;\n const host = useUpload();\n const pending = useContext(PendingUploadsContext);\n const locked = useFormSelector(engine, (s) => s.status === \"completed\");\n const limits = photoLimits(field);\n const refs = photoRefs(binding.value);\n const [uploading, setUploading] = useState<Uploading[]>([]);\n const [problem, setProblem] = useState<string | null>(null);\n const [coarse, setCoarse] = useState(false);\n // Previews of photos picked here, by reference id; revoked when removed or unmounted.\n const previews = useRef(new Map<string, string>());\n // Uploads still counted as in flight, released on unmount so a form left mid-upload can still send.\n const releases = useRef(new Set<() => void>());\n // An upload can finish after unmount: its preview is then revoked, not kept.\n const mounted = useRef(true);\n const chooseRef = useRef<HTMLInputElement>(null);\n const takeRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n setCoarse(typeof window !== \"undefined\" && !!window.matchMedia?.(\"(pointer: coarse)\").matches);\n }, []);\n\n useEffect(() => {\n const urls = previews.current;\n const pendingReleases = releases.current;\n mounted.current = true;\n return () => {\n mounted.current = false;\n for (const url of urls.values()) URL.revokeObjectURL(url);\n urls.clear();\n for (const release of pendingReleases) release();\n pendingReleases.clear();\n };\n }, []);\n\n const currentRefs = () => photoRefs(engine.getState().values[field.id]);\n const full = refs.length + uploading.length >= limits.maxFiles;\n const disabled = !host || locked;\n\n const add = (files: File[]) => {\n if (!host) return;\n setProblem(null);\n let room = limits.maxFiles - currentRefs().length - uploading.length;\n for (const file of files) {\n if (room <= 0) {\n setProblem(photoCountMessage(field));\n break;\n }\n const why = photoFileProblem(field, file);\n if (why) {\n setProblem(why);\n continue;\n }\n room--;\n const key = `u${nextKey++}`;\n const preview = typeof URL.createObjectURL === \"function\" ? URL.createObjectURL(file) : null;\n setUploading((list) => [...list, { key, name: file.name, preview }]);\n const release = pending?.start() ?? (() => {});\n releases.current.add(release);\n const finish = () => {\n release();\n releases.current.delete(release);\n setUploading((list) => list.filter((u) => u.key !== key));\n };\n // Through a promise, so an upload that throws before returning one is caught too.\n Promise.resolve()\n .then(() => host.upload(file, field))\n .then((ref: PhotoRef) => {\n if (!isPhotoRef(ref)) throw new Error(\"The upload returned no photo reference.\");\n if (preview) {\n const old = previews.current.get(ref.id);\n if (old && old !== preview) URL.revokeObjectURL(old);\n if (mounted.current) previews.current.set(ref.id, preview);\n else URL.revokeObjectURL(preview);\n }\n const next = [...currentRefs().filter((r) => r.id !== ref.id), { id: ref.id, name: ref.name, type: ref.type, size: ref.size }];\n binding.setValue(next);\n finish();\n })\n .catch(() => {\n if (preview) URL.revokeObjectURL(preview);\n setProblem(`“${file.name}” didn't upload. Try again.`);\n finish();\n });\n }\n };\n\n const onPick = (e: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files ?? []);\n // Cleared, so picking the same file again after removing it still fires.\n e.target.value = \"\";\n add(files);\n };\n\n const remove = (ref: PhotoRef) => {\n const url = previews.current.get(ref.id);\n if (url) URL.revokeObjectURL(url);\n previews.current.delete(ref.id);\n const next = currentRefs().filter((r) => r.id !== ref.id);\n binding.setValue(next.length ? next : undefined);\n setProblem(null);\n };\n\n const accept = photoAccept(field);\n const errorId = `${inputId}-upload-error`;\n const hasAny = refs.length > 0 || uploading.length > 0;\n\n return (\n <FieldChrome props={props}>\n <div className=\"space-y-3\">\n {hasAny ? (\n <ul className=\"flex flex-wrap gap-3\" aria-label=\"Photos\">\n {refs.map((ref) => (\n <li key={ref.id} className=\"relative\">\n <Tile name={ref.name} preview={previews.current.get(ref.id) ?? null} />\n {locked ? null : (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"icon\"\n aria-label={`Remove ${ref.name}`}\n onClick={() => remove(ref)}\n className=\"absolute right-1 top-1 size-7 rounded-full shadow-sm\"\n >\n <XIcon />\n </Button>\n )}\n </li>\n ))}\n {uploading.map((u) => (\n <li key={u.key} aria-label={`Uploading ${u.name}`}>\n <Tile name={u.name} preview={u.preview} busy />\n </li>\n ))}\n </ul>\n ) : null}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled || full}\n aria-invalid={binding.error ? true : undefined}\n onClick={() => chooseRef.current?.click()}\n >\n <ImageIcon /> {refs.length ? \"Add another photo\" : \"Choose a photo\"}\n </Button>\n {coarse ? (\n <Button type=\"button\" variant=\"outline\" disabled={disabled || full} onClick={() => takeRef.current?.click()}>\n <CameraIcon /> Take a photo\n </Button>\n ) : null}\n </div>\n <Input\n ref={chooseRef}\n type=\"file\"\n accept={accept}\n multiple={limits.maxFiles > 1}\n className=\"hidden\"\n tabIndex={-1}\n aria-hidden=\"true\"\n disabled={disabled}\n onChange={onPick}\n />\n <Input\n ref={takeRef}\n type=\"file\"\n accept={accept}\n capture=\"environment\"\n className=\"hidden\"\n tabIndex={-1}\n aria-hidden=\"true\"\n disabled={disabled}\n onChange={onPick}\n />\n {!host ? (\n <p className=\"text-sm text-muted-foreground\">Photos can't be added here.</p>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n {`Up to ${limits.maxFiles} ${limits.maxFiles === 1 ? \"photo\" : \"photos\"}, ${limits.maxSizeMb} MB each.`}\n </p>\n )}\n {problem ? (\n <FormError id={errorId} role=\"alert\">\n {problem}\n </FormError>\n ) : null}\n </div>\n </FieldChrome>\n );\n}\n\nexport const photoRenderers: RendererEntry[] = [{ type: \"photo\", Component: PhotoField }];\n","import { useState } from \"react\";\nimport { Command, CommandEmpty, CommandInput, CommandItem, CommandList } from \"@marktiderman/genesis-ui/command\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport { searchOptions, type ChoiceOption } from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps } from \"@marktiderman/genesis-forms-react\";\nimport { useFormPresentation } from \"./presentation\";\n\n/** A small picture beside an option's label: decorative, since the label says what it is. */\nexport function OptionImage({ src, large }: { src: string; large?: boolean }) {\n return (\n <img\n src={src}\n alt=\"\"\n loading=\"lazy\"\n data-gf-option-image=\"\"\n className={cn(\"shrink-0 rounded-md bg-muted object-cover\", large ? \"size-12\" : \"size-10\")}\n />\n );\n}\n\n/** An option's label with its description as a muted line under it. */\nexport function OptionText({ label, description }: { label: string; description?: string | undefined }) {\n return (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span>{label}</span>\n {description ? (\n <span className=\"text-sm text-muted-foreground\" data-gf-option-description=\"\">\n {description}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction CheckMark({ on }: { on: boolean }) {\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={cn(\"size-4 shrink-0 text-primary\", on ? \"opacity-100\" : \"opacity-0\")}\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\n/** The value of the \"Other\" row in the list: never stored. */\nexport const SEARCH_OTHER_VALUE = \"\\u0000other\";\n\n/**\n * A long option list with a search box over it (genesis-ui `Command`): typing narrows the list\n * (`searchOptions`, the same match on every platform), arrow keys move through it, and Enter or a\n * tap picks. One pick for a single choice or dropdown, several for a multiple choice. It sits in\n * the page rather than a popover, so it works the same in classic and focus layouts and on a\n * phone. `selected` holds the values picked; `onPick` gets the value tapped (or\n * `SEARCH_OTHER_VALUE` for the \"Other\" row).\n */\nexport function SearchableOptions({\n props,\n options,\n selected,\n multiple,\n otherLabel,\n otherOn,\n onPick,\n}: {\n props: FieldRendererProps;\n options: readonly ChoiceOption[];\n selected: readonly string[];\n multiple: boolean;\n otherLabel?: string | undefined;\n otherOn?: boolean | undefined;\n onPick: (value: string) => void;\n}) {\n const { binding, inputId } = props;\n const [query, setQuery] = useState(\"\");\n const { presentation } = useFormPresentation();\n const page = presentation === \"page\";\n const shown = searchOptions(options, query);\n const chosen = options.filter((o) => selected.includes(o.value));\n const labelOf = (o: ChoiceOption) => o.label ?? o.value;\n return (\n <div\n className=\"space-y-2\"\n data-gf-searchable=\"\"\n // Enter in the search box picks the highlighted option (the list handles it first); it must\n // never also send the form, as Enter in a text box would.\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && (e.target as HTMLElement).tagName === \"INPUT\") e.preventDefault();\n }}\n >\n <Command shouldFilter={false} label={binding.label} className=\"rounded-md border border-input bg-background\">\n <CommandInput\n id={inputId}\n data-gf-focus=\"\"\n value={query}\n onValueChange={setQuery}\n placeholder=\"Type to search\"\n aria-label={`Search: ${binding.label}`}\n aria-invalid={binding.error ? true : undefined}\n aria-required={binding.field.required || undefined}\n className={cn(page && \"text-base\")}\n />\n <CommandList className=\"max-h-72\" aria-multiselectable={multiple || undefined}>\n <CommandEmpty>No matches.</CommandEmpty>\n {shown.map((o) => {\n const on = selected.includes(o.value);\n return (\n <CommandItem\n key={o.value}\n value={o.value}\n keywords={[labelOf(o)]}\n aria-checked={on}\n onSelect={() => onPick(o.value)}\n className={cn(\"min-h-11 gap-3 text-base\", page && \"min-h-12\")}\n data-gf-option={o.value}\n >\n <CheckMark on={on} />\n {o.image ? <OptionImage src={o.image} /> : null}\n <OptionText label={labelOf(o)} description={o.description} />\n </CommandItem>\n );\n })}\n {otherLabel ? (\n <CommandItem\n value={SEARCH_OTHER_VALUE}\n aria-checked={!!otherOn}\n onSelect={() => onPick(SEARCH_OTHER_VALUE)}\n className={cn(\"min-h-11 gap-3 text-base\", page && \"min-h-12\")}\n >\n <CheckMark on={!!otherOn} />\n <OptionText label={otherLabel} />\n </CommandItem>\n ) : null}\n </CommandList>\n </Command>\n {chosen.length ? (\n <p className=\"text-sm text-muted-foreground\" aria-live=\"polite\" data-gf-chosen=\"\">\n {multiple ? \"Chosen\" : \"Your choice\"}: {chosen.map(labelOf).join(\", \")}\n </p>\n ) : null}\n </div>\n );\n}\n","import { useEffect, useRef, useState, type KeyboardEvent } from \"react\";\nimport { Checkbox } from \"@marktiderman/genesis-ui/checkbox\";\nimport { Input } from \"@marktiderman/genesis-ui/input\";\nimport { Label } from \"@marktiderman/genesis-ui/label\";\nimport { RadioGroup, RadioGroupItem } from \"@marktiderman/genesis-ui/radio-group\";\nimport { Textarea } from \"@marktiderman/genesis-ui/textarea\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport {\n choiceOptions,\n dateLimits,\n getFieldType,\n isSearchable,\n numberLimits,\n otherOption,\n OTHER_MAX_LENGTH,\n ratingDisplay,\n scaleLabels,\n type Json,\n} from \"@marktiderman/genesis-forms\";\nimport {\n createRendererRegistry,\n useChoiceOptions,\n type FieldRendererProps,\n type RendererEntry,\n} from \"@marktiderman/genesis-forms-react\";\nimport { useFormPresentation } from \"./presentation\";\nimport { describedBy, FieldChrome } from \"./chrome\";\nimport { calculatedRenderers } from \"./calculated\";\nimport { structuredRenderers } from \"./structured\";\nimport { photoRenderers } from \"./photo\";\nimport { OptionImage, OptionText, SearchableOptions, SEARCH_OTHER_VALUE } from \"./searchable\";\n\nexport { describedBy, FieldChrome, type FieldChromeProps } from \"./chrome\";\n\n/** The ARIA a radio group root needs to be named by the legend and report its state. */\nfunction groupAria(props: FieldRendererProps) {\n return {\n \"aria-labelledby\": `${props.inputId}-label`,\n \"aria-required\": props.binding.field.required || undefined,\n \"aria-invalid\": props.binding.error ? true : undefined,\n } as const;\n}\n\n// ── Deliberate picks ─────────────────────────────────────────────────────────\n\nconst NAVIGATION_KEYS = new Set([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\"]);\n/** Radix checks the newly focused radio a tick after the key, so allow a short window. */\nconst NAVIGATION_WINDOW_MS = 500;\n\n/**\n * A radio group checks whichever option arrow keys move to (WAI-ARIA APG),\n * and Radix does it by clicking that option. Only a pick the respondent meant\n * (a click or tap, Space, Enter, assistive tech activating it) may advance,\n * so this remembers whether a navigation key just went down and ignores the\n * click it causes. Clicking the option that is already checked still counts,\n * so after Back a respondent can confirm the same answer and move on.\n */\nfunction useDeliberatePick(onAdvance: (() => void) | undefined) {\n const lastKey = useRef<{ key: string; at: number } | null>(null);\n return {\n rootProps: {\n onKeyDownCapture: (e: KeyboardEvent) => {\n lastKey.current = { key: e.key, at: Date.now() };\n },\n onPointerDownCapture: () => {\n lastKey.current = null;\n },\n },\n onItemClick: () => {\n const last = lastKey.current;\n const navigating = last && NAVIGATION_KEYS.has(last.key) && Date.now() - last.at < NAVIGATION_WINDOW_MS;\n if (!navigating) onAdvance?.();\n },\n };\n}\n\n// ── Renderers ────────────────────────────────────────────────────────────────\n\nfunction TextField(\n props: FieldRendererProps & {\n type?: string;\n multiline?: boolean;\n inputMode?: \"text\" | \"email\" | \"tel\";\n /** Used when the field type's manifest names no autocomplete token. */\n autoComplete?: string;\n },\n) {\n const { binding, inputId, type = \"text\", multiline, inputMode, autoComplete } = props;\n const manifest = getFieldType(binding.field.type);\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const common = {\n id: inputId,\n value: typeof binding.value === \"string\" ? binding.value : \"\",\n placeholder: binding.field.placeholder ?? (pageFocus ? \"Type your answer here…\" : undefined),\n // Page focus: a large underlined answer line, Typeform style. The underline turns primary on focus.\n className: pageFocus\n ? \"h-auto rounded-none border-0 border-b-2 border-input bg-transparent px-0 py-2 text-xl shadow-none md:text-2xl sm:text-2xl placeholder:text-muted-foreground/70 focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-offset-0 aria-invalid:border-destructive\"\n : presentation === \"page\"\n ? \"h-11 md:text-base\"\n : undefined,\n // The focus layout focuses the input itself, so a respondent can type straight away.\n \"data-gf-focus\": \"\",\n \"aria-invalid\": binding.error ? true : undefined,\n \"aria-required\": binding.field.required || undefined,\n \"aria-describedby\": describedBy(props),\n } as const;\n return (\n <FieldChrome props={props}>\n {multiline ? (\n <Textarea\n {...common}\n rows={pageFocus ? 1 : 4}\n className={cn(common.className, pageFocus && \"min-h-12 resize-none\")}\n onChange={(e) => binding.setValue(e.target.value)}\n />\n ) : (\n <Input\n {...common}\n type={type}\n inputMode={manifest?.a11y.inputMode ?? inputMode}\n autoComplete={manifest?.a11y.autocomplete ?? autoComplete}\n onChange={(e) => binding.setValue(e.target.value)}\n />\n )}\n </FieldChrome>\n );\n}\n\ninterface ButtonOption {\n value: string;\n label: string;\n /** Id of extra text read with this option (the NPS end labels). */\n describedBy?: string;\n}\n\n/**\n * A radio group drawn as a row of buttons (rating, NPS, yes/no). It is a real\n * `radiogroup`: Tab enters it once, arrows move and select, Space selects.\n */\nfunction ButtonRadioGroup({\n props,\n options,\n value,\n onValueChange,\n itemClassName,\n}: {\n props: FieldRendererProps;\n options: ButtonOption[];\n value: string;\n onValueChange: (value: string) => void;\n itemClassName?: string;\n}) {\n const pick = useDeliberatePick(props.onAdvance);\n const { presentation, layout } = useFormPresentation();\n const page = presentation === \"page\";\n // Tall targets when there's room; a long scale (NPS) or a classic page stays squarer.\n const size = layout === \"classic\" ? \"h-12\" : options.length <= 6 ? \"h-14 sm:h-16\" : \"h-14\";\n return (\n <RadioGroup\n {...groupAria(props)}\n {...pick.rootProps}\n value={value}\n onValueChange={onValueChange}\n // Page mode: an even grid of large targets that fills the column.\n className={page ? cn(\"grid gap-2\", options.length <= 6 && \"sm:gap-3\", gridColumns(options.length)) : \"flex flex-wrap justify-start gap-2\"}\n >\n {options.map((o) => (\n <div key={o.value} className=\"relative\">\n <RadioGroupItem\n value={o.value}\n aria-label={o.label}\n aria-describedby={o.describedBy}\n onClick={pick.onItemClick}\n className={cn(\n \"peer h-11 w-11 aspect-auto rounded-md border-input bg-background shadow-sm transition-colors hover:bg-accent motion-reduce:transition-none\",\n page && cn(size, \"w-full rounded-lg border-primary/30 bg-primary/5 shadow-none hover:bg-primary/10\"),\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:hover:bg-primary\",\n \"[&_svg]:hidden\",\n page ? undefined : itemClassName,\n )}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 flex items-center justify-center text-base font-medium peer-disabled:opacity-50 peer-data-[state=checked]:text-primary-foreground\",\n page && \"text-lg font-semibold\",\n )}\n >\n {o.label}\n </span>\n </div>\n ))}\n </RadioGroup>\n );\n}\n\n// Spelled out so Tailwind's scanner sees every class. Phones get at most six\n// columns (NPS wraps 0–5 / 6–10); from `sm` every option sits in one row.\nconst PHONE_COLUMNS: Record<number, string> = {\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n 7: \"grid-cols-4\",\n 8: \"grid-cols-4\",\n 9: \"grid-cols-5\",\n 10: \"grid-cols-5\",\n 11: \"grid-cols-6\",\n};\nconst WIDE_COLUMNS: Record<number, string> = {\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n 7: \"sm:grid-cols-7\",\n 8: \"sm:grid-cols-8\",\n 9: \"sm:grid-cols-9\",\n 10: \"sm:grid-cols-10\",\n 11: \"sm:grid-cols-11\",\n};\nfunction gridColumns(count: number): string {\n return cn(PHONE_COLUMNS[count] ?? \"grid-cols-6\", WIDE_COLUMNS[count] ?? \"sm:grid-cols-11\");\n}\n\nfunction scaleValues(type: string, max: number): number[] {\n if (type === \"nps\") return Array.from({ length: 11 }, (_, i) => i);\n return Array.from({ length: max }, (_, i) => i + 1);\n}\n\n/** The words under a scale's ends: the field's `lowLabel` / `highLabel`, else NPS's defaults. */\nfunction endLabels(props: FieldRendererProps): { low?: string; high?: string } {\n const own = scaleLabels(props.binding.field);\n if (props.binding.field.type !== \"nps\") return own;\n return { low: own.low ?? \"Not likely\", high: own.high ?? \"Very likely\" };\n}\n\n/** The end labels row; each label is read with its end option (`aria-describedby`). */\nfunction EndLabels({ inputId, low, high }: { inputId: string; low?: string | undefined; high?: string | undefined }) {\n if (!low && !high) return null;\n return (\n <div className=\"flex justify-between gap-4 text-sm text-muted-foreground\" data-gf-scale-labels=\"\">\n <span id={`${inputId}-low`}>{low ?? \"\"}</span>\n <span id={`${inputId}-high`} className=\"text-right\">\n {high ?? \"\"}\n </span>\n </div>\n );\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 { low, high } = endLabels(props);\n const stars = binding.field.type === \"rating\" && ratingDisplay(binding.field) === \"stars\";\n const describe = (i: number) =>\n low && i === 0 ? `${inputId}-low` : high && i === values.length - 1 ? `${inputId}-high` : undefined;\n const value = typeof binding.value === \"number\" ? String(binding.value) : \"\";\n const onValueChange = (v: string) => binding.setValue(Number(v));\n if (stars) {\n return (\n <FieldChrome props={props}>\n <StarRadioGroup props={props} values={values} value={value} onValueChange={onValueChange} describe={describe} />\n <EndLabels inputId={inputId} low={low} high={high} />\n </FieldChrome>\n );\n }\n const options = values.map((n, i) => ({ value: String(n), label: String(n), describedBy: describe(i) }));\n return (\n <FieldChrome props={props}>\n <ButtonRadioGroup props={props} options={options} value={value} onValueChange={onValueChange} />\n <EndLabels inputId={inputId} low={low} high={high} />\n </FieldChrome>\n );\n}\n\nfunction StarIcon({ filled }: { filled: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className={cn(\"size-8 transition-colors motion-reduce:transition-none\", filled ? \"fill-primary text-primary\" : \"fill-transparent text-muted-foreground\")}\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2.5l2.9 6.1 6.6.8-4.9 4.6 1.3 6.6L12 17.3l-5.9 3.3 1.3-6.6-4.9-4.6 6.6-.8z\" />\n </svg>\n );\n}\n\n/**\n * A rating drawn as stars. Still a real `radiogroup` (one radio per star,\n * named \"3 of 5\"); the stars up to the chosen one are filled.\n */\nfunction StarRadioGroup({\n props,\n values,\n value,\n onValueChange,\n describe,\n}: {\n props: FieldRendererProps;\n values: number[];\n value: string;\n onValueChange: (value: string) => void;\n describe: (index: number) => string | undefined;\n}) {\n const pick = useDeliberatePick(props.onAdvance);\n const chosen = value === \"\" ? 0 : Number(value);\n const max = values[values.length - 1] ?? 5;\n return (\n <RadioGroup\n {...groupAria(props)}\n {...pick.rootProps}\n value={value}\n onValueChange={onValueChange}\n className=\"flex flex-wrap justify-start gap-1\"\n data-gf-stars=\"\"\n >\n {values.map((n, i) => (\n <div key={n} className=\"relative\">\n <RadioGroupItem\n value={String(n)}\n aria-label={`${n} of ${max}`}\n aria-describedby={describe(i)}\n onClick={pick.onItemClick}\n className=\"peer size-11 aspect-auto rounded-md border-0 bg-transparent shadow-none hover:bg-accent data-[state=checked]:bg-transparent [&_svg]:hidden\"\n />\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 flex items-center justify-center peer-disabled:opacity-50\">\n <StarIcon filled={n <= chosen} />\n </span>\n </div>\n ))}\n </RadioGroup>\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 // Typing an \"Other\" answer: letters are text, not shortcuts.\n if ((e.target as HTMLElement).tagName === \"INPUT\") 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({\n look,\n index,\n label,\n description,\n image,\n}: {\n look: ChoiceLook;\n index: number;\n label: string;\n description?: string | undefined;\n image?: string | undefined;\n}) {\n if (!look.pageFocus) {\n return (\n <>\n {image ? <OptionImage src={image} /> : null}\n <OptionText label={label} description={description} />\n </>\n );\n }\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 {image ? <OptionImage src={image} large /> : null}\n <OptionText label={label} description={description} />\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\n/** The radio and select value of an \"Other\" option while it is picked: never stored. */\nconst OTHER_VALUE = \"\\u0000other\";\n\n/** The text box of an \"Other\" option: what the respondent types is the answer. */\nfunction OtherText({\n id,\n label,\n value,\n onChange,\n invalid,\n}: {\n id: string;\n label: string;\n value: string;\n onChange: (text: string) => void;\n invalid: boolean;\n}) {\n const line = useLineClass();\n return (\n <Input\n id={id}\n value={value}\n maxLength={OTHER_MAX_LENGTH}\n aria-label={`${label}: your answer`}\n aria-invalid={invalid || undefined}\n placeholder=\"Type your answer\"\n onChange={(e) => onChange(e.target.value)}\n className={cn(\"mt-2\", line)}\n />\n );\n}\n\n/** Puts the cursor in the \"Other\" box once it is shown. */\nconst focusSoon = (id: string) =>\n requestAnimationFrame(() => (document.getElementById(id) as HTMLInputElement | null)?.focus());\n\n/**\n * A question's typed \"Other\" answer, kept while the respondent switches between options, so\n * picking \"Other\" again brings back what they wrote. `typed` is the stored answer's text.\n */\nfunction useOtherText(typed: string) {\n const [on, setOn] = useState(typed !== \"\");\n const [text, setText] = useState(typed);\n return { on, setOn, text, setText };\n}\n\n/**\n * One pick from a long list, with a search box (`isSearchable`): a single choice or dropdown\n * over more options than `SEARCHABLE_OPTION_COUNT`, or one with `props.searchable: true`.\n */\nfunction SearchableSingleField(props: FieldRendererProps) {\n const { binding, onAdvance } = props;\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const current = typeof binding.value === \"string\" ? binding.value : \"\";\n const typed = other && current && !choiceOptions(binding.field).some((o) => o.value === current) ? current : \"\";\n const otherText = useOtherText(typed);\n const textId = `${props.inputId}-other-text`;\n return (\n <FieldChrome props={props}>\n <SearchableOptions\n props={props}\n options={options}\n selected={otherText.on ? [] : [current]}\n multiple={false}\n otherLabel={other?.label}\n otherOn={otherText.on}\n onPick={(v) => {\n if (v === SEARCH_OTHER_VALUE) {\n otherText.setOn(true);\n binding.setValue(otherText.text.trim() ? otherText.text : undefined);\n focusSoon(textId);\n return;\n }\n otherText.setOn(false);\n binding.setValue(v);\n onAdvance?.();\n }}\n />\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n binding.setValue(text.trim() ? text : undefined);\n }}\n />\n ) : null}\n </FieldChrome>\n );\n}\n\n/** Several picks from a long list, with a search box (`isSearchable`). */\nfunction SearchableMultiField(props: FieldRendererProps) {\n const { binding } = props;\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const selected = Array.isArray(binding.value) ? (binding.value as string[]) : [];\n const known = new Set(choiceOptions(binding.field).map((o) => o.value));\n const chosen = selected.filter((v) => known.has(v));\n const otherText = useOtherText(other ? (selected.find((v) => !known.has(v)) ?? \"\") : \"\");\n const textId = `${props.inputId}-other-text`;\n const commit = (picked: string[], otherOn: boolean, text: string) => {\n const next = otherOn && text.trim() ? [...picked, text] : picked;\n binding.setValue(next.length ? (next as Json) : undefined);\n };\n return (\n <FieldChrome props={props}>\n <SearchableOptions\n props={props}\n options={options}\n selected={chosen}\n multiple\n otherLabel={other?.label}\n otherOn={otherText.on}\n onPick={(v) => {\n if (v === SEARCH_OTHER_VALUE) {\n const on = !otherText.on;\n otherText.setOn(on);\n commit(chosen, on, otherText.text);\n if (on) focusSoon(textId);\n return;\n }\n commit(chosen.includes(v) ? chosen.filter((x) => x !== v) : [...chosen, v], otherText.on, otherText.text);\n }}\n />\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n commit(chosen, true, text);\n }}\n />\n ) : null}\n </FieldChrome>\n );\n}\n\n/**\n * Whether to draw a question's options with a search box: `isSearchable` over all its options,\n * not just those a filter shows now, so the control doesn't change while the respondent answers.\n */\nfunction useSearchable(props: FieldRendererProps): boolean {\n return isSearchable(props.binding.field);\n}\n\nfunction SingleChoiceField(props: FieldRendererProps) {\n return useSearchable(props) ? <SearchableSingleField {...props} /> : <SingleChoiceList {...props} />;\n}\n\nfunction SingleChoiceList(props: FieldRendererProps) {\n const { binding, inputId, onAdvance } = props;\n const pick = useDeliberatePick(onAdvance);\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const current = typeof binding.value === \"string\" ? binding.value : \"\";\n const typed = other && current && !choiceOptions(binding.field).some((o) => o.value === current) ? current : \"\";\n const otherText = useOtherText(typed);\n const look = useChoiceLook(inputId, options.length + (other ? 1 : 0));\n const textId = `${inputId}-other-text`;\n const choose = (v: string) => {\n if (v !== OTHER_VALUE) {\n otherText.setOn(false);\n binding.setValue(v);\n return;\n }\n otherText.setOn(true);\n binding.setValue(otherText.text.trim() ? otherText.text : undefined);\n focusSoon(textId);\n };\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={otherText.on ? OTHER_VALUE : current}\n onValueChange={choose}\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} description={o.description} image={o.image} />\n </Label>\n ))}\n {other ? (\n // No auto-advance: the respondent still has to type.\n <Label htmlFor={`${inputId}-${options.length}`} className={look.row}>\n <RadioGroupItem id={`${inputId}-${options.length}`} value={OTHER_VALUE} className={look.control} />\n <ChoiceContent look={look} index={options.length} label={other.label} />\n </Label>\n ) : null}\n </RadioGroup>\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n binding.setValue(text.trim() ? text : undefined);\n }}\n />\n ) : null}\n </FieldChrome>\n );\n}\n\nfunction MultiChoiceField(props: FieldRendererProps) {\n return useSearchable(props) ? <SearchableMultiField {...props} /> : <MultiChoiceList {...props} />;\n}\n\nfunction MultiChoiceList(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const selected = Array.isArray(binding.value) ? (binding.value as string[]) : [];\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const known = new Set(choiceOptions(binding.field).map((o) => o.value));\n const chosen = selected.filter((v) => known.has(v));\n const otherText = useOtherText(other ? (selected.find((v) => !known.has(v)) ?? \"\") : \"\");\n const look = useChoiceLook(inputId, options.length + (other ? 1 : 0));\n const textId = `${inputId}-other-text`;\n // The picked options, then the typed \"Other\" answer while it is ticked and not blank.\n const commit = (picked: string[], otherOn: boolean, text: string) => {\n const next = otherOn && text.trim() ? [...picked, text] : picked;\n binding.setValue(next.length ? (next as Json) : undefined);\n };\n const toggle = (value: string, on: boolean) =>\n commit(on ? [...chosen, value] : chosen.filter((v) => v !== value), otherText.on, otherText.text);\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} description={o.description} image={o.image} />\n </Label>\n ))}\n {other ? (\n <Label htmlFor={`${inputId}-${options.length}`} className={look.row}>\n <Checkbox\n id={`${inputId}-${options.length}`}\n checked={otherText.on}\n aria-invalid={binding.error ? true : undefined}\n onCheckedChange={(c) => {\n otherText.setOn(c === true);\n commit(chosen, c === true, otherText.text);\n if (c === true) focusSoon(textId);\n }}\n className={look.control}\n />\n <ChoiceContent look={look} index={options.length} label={other.label} />\n </Label>\n ) : null}\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n commit(chosen, true, text);\n }}\n />\n ) : null}\n </div>\n </FieldChrome>\n );\n}\n\n// ── Dropdown, number, date, consent ─────────────────────────────────────────\n\n/** The look of a one-line control: a large underlined line in page focus, a taller box on a page. */\nfunction useLineClass(): string | undefined {\n const { presentation, layout } = useFormPresentation();\n if (presentation === \"page\" && layout === \"focus\") {\n return \"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 focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-offset-0 aria-invalid:border-destructive\";\n }\n return presentation === \"page\" ? \"h-11 md:text-base\" : undefined;\n}\n\nfunction controlAria(props: FieldRendererProps) {\n return {\n id: props.inputId,\n \"data-gf-focus\": \"\",\n \"aria-invalid\": props.binding.error ? true : undefined,\n \"aria-required\": props.binding.field.required || undefined,\n \"aria-describedby\": describedBy(props),\n } as const;\n}\n\n/**\n * One option from a native `<select>`: compact for a long list, and the\n * phone's own picker on touch devices. Over more options than\n * `SEARCHABLE_OPTION_COUNT` (or with `props.searchable: true`) it is a\n * searchable list instead, which also shows descriptions and pictures.\n */\nfunction DropdownField(props: FieldRendererProps) {\n return useSearchable(props) ? <SearchableSingleField {...props} /> : <DropdownSelect {...props} />;\n}\n\nfunction DropdownSelect(props: FieldRendererProps) {\n const { binding } = props;\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const line = useLineClass();\n const current = typeof binding.value === \"string\" ? binding.value : \"\";\n const typed = other && current && !choiceOptions(binding.field).some((o) => o.value === current) ? current : \"\";\n const otherText = useOtherText(typed);\n const value = otherText.on ? OTHER_VALUE : current;\n const textId = `${props.inputId}-other-text`;\n return (\n <FieldChrome props={props}>\n <select\n {...controlAria(props)}\n value={value}\n onChange={(e) => {\n const v = e.target.value;\n otherText.setOn(v === OTHER_VALUE);\n if (v === OTHER_VALUE) {\n binding.setValue(otherText.text.trim() ? otherText.text : undefined);\n focusSoon(textId);\n } else binding.setValue(v === \"\" ? undefined : v);\n }}\n className={cn(\n \"flex h-10 w-full min-w-0 rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm aria-invalid:border-destructive\",\n value === \"\" && \"text-muted-foreground\",\n line,\n )}\n >\n <option value=\"\">{binding.field.placeholder ?? \"Choose…\"}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label ?? o.value}\n </option>\n ))}\n {other ? <option value={OTHER_VALUE}>{other.label}</option> : null}\n </select>\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n binding.setValue(text.trim() ? text : undefined);\n }}\n />\n ) : null}\n </FieldChrome>\n );\n}\n\n/**\n * A number, typed as text with the decimal keypad: what was typed is kept\n * while it is not a number yet (\"-\", \"1.\"), and stored as a number once it is.\n * Text that never becomes a number is kept as text, so validation says so.\n */\nfunction NumberField(props: FieldRendererProps) {\n const { binding } = props;\n const { min, max, step } = numberLimits(binding.field);\n const line = useLineClass();\n const shown = typeof binding.value === \"number\" ? String(binding.value) : typeof binding.value === \"string\" ? binding.value : \"\";\n const [text, setText] = useState(shown);\n // A value set from outside (Back, a prefill, a restart) replaces what was typed.\n useEffect(() => {\n setText((typed) => (typed.trim() !== \"\" && Number(typed.trim().replace(\",\", \".\")) === binding.value ? typed : shown));\n }, [shown, binding.value]);\n return (\n <FieldChrome props={props}>\n <Input\n {...controlAria(props)}\n type=\"text\"\n inputMode={min !== undefined && min >= 0 && (step === undefined || Number.isInteger(step)) ? \"numeric\" : \"decimal\"}\n autoComplete=\"off\"\n value={text}\n placeholder={binding.field.placeholder}\n className={line}\n onChange={(e) => {\n const raw = e.target.value;\n setText(raw);\n const t = raw.trim().replace(\",\", \".\");\n if (t === \"\") binding.setValue(undefined);\n else {\n const n = Number(t);\n binding.setValue(Number.isFinite(n) && /^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(t) ? n : raw);\n }\n }}\n />\n {min !== undefined || max !== undefined ? (\n <p className=\"text-sm text-muted-foreground\" data-gf-number-range=\"\">\n {min !== undefined && max !== undefined ? `From ${min} to ${max}` : min !== undefined ? `${min} or more` : `${max} or less`}\n </p>\n ) : null}\n </FieldChrome>\n );\n}\n\n/** A calendar day from the browser's own date picker, stored as `YYYY-MM-DD`. */\nfunction DateField(props: FieldRendererProps) {\n const { binding } = props;\n const { min, max } = dateLimits(binding.field);\n const line = useLineClass();\n return (\n <FieldChrome props={props}>\n <Input\n {...controlAria(props)}\n type=\"date\"\n min={min}\n max={max}\n value={typeof binding.value === \"string\" ? binding.value : \"\"}\n className={cn(\"w-full sm:w-auto sm:min-w-48\", line)}\n onChange={(e) => binding.setValue(e.target.value === \"\" ? undefined : e.target.value)}\n />\n </FieldChrome>\n );\n}\n\n/**\n * One checkbox to agree to something. The question is the legend; the\n * checkbox's own words are `props.text` (\"I agree to the terms\"), else \"I agree\".\n */\nfunction ConsentField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const text = typeof binding.field.props?.text === \"string\" && binding.field.props.text.trim() ? binding.field.props.text : \"I agree\";\n const look = useChoiceLook(inputId, 1);\n return (\n <FieldChrome props={props}>\n <Label htmlFor={`${inputId}-0`} className={look.row}>\n <Checkbox\n id={`${inputId}-0`}\n checked={binding.value === true}\n aria-invalid={binding.error ? true : undefined}\n aria-required={binding.field.required || undefined}\n onCheckedChange={(c) => binding.setValue(c === true ? true : undefined)}\n />\n <span>{props.engine.text(text)}</span>\n </Label>\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 { type: \"dropdown\", Component: DropdownField },\n { type: \"number\", Component: NumberField },\n { type: \"date\", Component: DateField },\n { type: \"consent\", Component: ConsentField },\n ...structuredRenderers,\n ...calculatedRenderers,\n ...photoRenderers,\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","/**\n * A form's own look: an accent colour and a header image. The accent becomes\n * the Genesis `--primary` (and `--ring`) inside the form, so every primary\n * surface follows it: buttons, selected options, stars, progress, focus rings.\n */\nexport interface FormTheme {\n /**\n * The accent colour, as `#rgb`, `#rrggbb` or `rgb(r, g, b)`, such as a\n * brand's colour. It is adjusted only as far as needed for contrast: at\n * least 3:1 against the page (light and dark), with text on it at least\n * 4.5:1 (white or near-black, whichever reads better). Anything else is ignored.\n */\n accent?: string | undefined;\n /** A banner image URL shown over the form's title. */\n headerImage?: string | undefined;\n /** The banner's text alternative. Default \"\" (decorative). */\n headerImageAlt?: string | undefined;\n}\n\n/** Shadcn HSL components (`\"221 83% 53%\"`), as Genesis tokens hold them. */\nexport interface ThemeColors {\n primary: string;\n primaryForeground: string;\n}\n\ntype Rgb = [number, number, number];\n\n/** `#rgb`, `#rrggbb` or `rgb(r, g, b)` (0–255); null for anything else. */\nfunction parseColor(value: string): Rgb | null {\n const v = value.trim().toLowerCase();\n let m = /^#([0-9a-f]{3})$/.exec(v);\n if (m) return [...m[1]!].map((c) => parseInt(c + c, 16)) as Rgb;\n m = /^#([0-9a-f]{6})$/.exec(v);\n if (m) return [0, 2, 4].map((i) => parseInt(m![1]!.slice(i, i + 2), 16)) as Rgb;\n m = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/.exec(v);\n if (m) {\n const rgb = [m[1], m[2], m[3]].map(Number) as Rgb;\n return rgb.every((c) => c <= 255) ? rgb : null;\n }\n return null;\n}\n\nfunction rgbToHsl([r, g, b]: Rgb): [number, number, number] {\n const [rn, gn, bn] = [r / 255, g / 255, b / 255];\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l * 100];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n const h = max === rn ? (gn - bn) / d + (gn < bn ? 6 : 0) : max === gn ? (bn - rn) / d + 2 : (rn - gn) / d + 4;\n return [h * 60, s * 100, l * 100];\n}\n\nfunction hslToRgb(h: number, s: number, l: number): Rgb {\n const sn = s / 100;\n const ln = l / 100;\n const k = (n: number) => (n + h / 30) % 12;\n const a = sn * Math.min(ln, 1 - ln);\n const f = (n: number) => ln - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n return [f(0), f(8), f(4)].map((x) => Math.round(x * 255)) as Rgb;\n}\n\n/** WCAG relative luminance. */\nfunction luminance([r, g, b]: Rgb): number {\n const c = (x: number) => {\n const n = x / 255;\n return n <= 0.03928 ? n / 12.92 : ((n + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * c(r) + 0.7152 * c(g) + 0.0722 * c(b);\n}\n\nfunction contrast(a: Rgb, b: Rgb): number {\n const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p) as [number, number];\n return (x + 0.05) / (y + 0.05);\n}\n\nconst WHITE: Rgb = [255, 255, 255];\n/** Genesis's dark background and dark foreground, `240 10% 3.9%`. */\nconst NEAR_BLACK: Rgb = hslToRgb(240, 10, 3.9);\nconst WHITE_HSL = \"0 0% 100%\";\nconst NEAR_BLACK_HSL = \"240 10% 3.9%\";\n\nconst fmt = (h: number, s: number, l: number) => `${Math.round(h)} ${Math.round(s)}% ${Math.round(l * 10) / 10}%`;\n\nfunction fit(h: number, s: number, l: number, page: Rgb, darken: boolean): ThemeColors {\n let light = l;\n // At least 3:1 with the page (WCAG 1.4.11: borders, icons, focus rings).\n for (let i = 0; i < 100 && contrast(hslToRgb(h, s, light), page) < 3; i++) light = Math.max(0, Math.min(100, light + (darken ? -1 : 1)));\n // Text on the accent at least 4.5:1: white or near-black, whichever is higher;\n // in the narrow middle where neither reaches it, lighten under near-black text.\n const best = () => {\n const rgb = hslToRgb(h, s, light);\n const white = contrast(rgb, WHITE);\n const dark = contrast(rgb, NEAR_BLACK);\n return white >= dark ? { ratio: white, fg: WHITE_HSL } : { ratio: dark, fg: NEAR_BLACK_HSL };\n };\n let pick = best();\n for (let i = 0; i < 100 && pick.ratio < 4.5; i++) {\n light = Math.min(100, light + 1);\n pick = { ratio: contrast(hslToRgb(h, s, light), NEAR_BLACK), fg: NEAR_BLACK_HSL };\n }\n return { primary: fmt(h, s, light), primaryForeground: pick.fg };\n}\n\n/**\n * The accent as Genesis primary colours for a light and a dark page, each\n * adjusted only as far as contrast needs. Null when `accent` is not a colour\n * this understands.\n */\nexport function themeColors(accent: string): { light: ThemeColors; dark: ThemeColors } | null {\n const rgb = parseColor(accent);\n if (!rgb) return null;\n const [h, s, l] = rgbToHsl(rgb);\n return { light: fit(h, s, l, WHITE, true), dark: fit(h, s, l, NEAR_BLACK, false) };\n}\n\n/** The CSS that applies `theme` to the elements matching `selector`, or \"\" when it changes no colour. */\nexport function themeCss(theme: FormTheme | undefined, selector: string): string {\n const colors = theme?.accent ? themeColors(theme.accent) : null;\n if (!colors) return \"\";\n const block = (c: ThemeColors) => `--primary: ${c.primary}; --primary-foreground: ${c.primaryForeground}; --ring: ${c.primary};`;\n return `${selector} { ${block(colors.light)} }\\n.dark ${selector}, ${selector}.dark { ${block(colors.dark)} }`;\n}\n","import {\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\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 {\n formProgress,\n type CreateFormOptions,\n type FieldBlock,\n type FormDefinition,\n type FormEngine,\n type FormProgress,\n type FormState,\n type HostOptions,\n type PhotoRef,\n respondentPath,\n type LinkParams,\n} 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\";\nimport { themeCss, type FormTheme } from \"./theme\";\nimport { createPendingUploads, PendingUploadsContext, UPLOAD_WAIT_MESSAGE, UploadContext, type PendingUploads } from \"./upload\";\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 /** `theme.headerImage`: a banner over the title. */\n image?: { src: string; alt: string } | undefined;\n /**\n * The note that marks required questions (\"Required\", drawn as \"* Required\"),\n * set when the form has at least one required question. Empty when it has none\n * or `requiredLabel` is null.\n */\n requiredNote?: string | undefined;\n className?: string;\n}\nexport interface BrandSlotProps {\n /** The organisation or business name, shown beside the logo. */\n name: string;\n /** An image URL or your own element. Without one, the name's initials are shown. */\n logo?: ReactNode;\n className?: string;\n}\nexport interface ProgressSlotProps {\n step: number;\n total: number;\n className?: string;\n}\nexport interface NavigationSlotProps {\n canGoBack: boolean;\n isLast: boolean;\n /** True while `onSubmit` is running. */\n busy: boolean;\n /** True after `onSubmit` failed. The answers are kept, and submitting again resends them. */\n failed: boolean;\n onBack: () => void;\n submitLabel: string;\n nextLabel: string;\n retryLabel: string;\n /**\n * The key that continues from this question (\"Enter ↵\", or \"Ctrl + Enter\" in\n * long text). Set in page presentation's focus layout; the default\n * navigation shows it only on devices with a fine pointer (mouse, trackpad).\n */\n keyHint?: string;\n className?: string;\n}\nexport interface EndingSlotProps {\n title: string;\n description?: string;\n /**\n * Buttons or links under the ending, such as \"Send another response\" or \"Change your\n * answers\": pass them through `slotProps.ending`. The default ending shows them in a\n * centred row.\n */\n actions?: ReactNode;\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\n/** \"* Required\": the asterisk matches the one beside each required question. */\nfunction RequiredNote({ text, className }: { text: string; className?: string }) {\n return (\n <p className={cn(\"text-sm text-muted-foreground\", className)} data-gf-required-note=\"\">\n <span className=\"text-destructive\" aria-hidden=\"true\">\n *{\" \"}\n </span>\n {text}\n </p>\n );\n}\n\nfunction HeaderImage({ image, className }: { image: { src: string; alt: string }; className?: string }) {\n return (\n <img\n src={image.src}\n alt={image.alt}\n data-gf-header-image=\"\"\n className={cn(\"block h-32 w-full object-cover sm:h-44\", className)}\n />\n );\n}\n\nfunction DefaultHeader({ title, description, image, requiredNote, 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 {image ? <HeaderImage image={image} className=\"mb-4 rounded-lg\" /> : null}\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 {requiredNote ? <RequiredNote text={requiredNote} /> : null}\n </header>\n );\n }\n if (presentation === \"page\") {\n return (\n <header\n className={cn(\n \"overflow-hidden rounded-xl border bg-card text-card-foreground\",\n !image && \"border-t-8 border-t-primary\",\n className,\n )}\n >\n {image ? <HeaderImage image={image} /> : null}\n <div className={cn(\"px-5 py-6 sm:px-8 sm:py-8\", image && \"border-t-8 border-t-primary\")}>\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 {requiredNote ? <RequiredNote text={requiredNote} className=\"mt-4\" /> : null}\n </div>\n </header>\n );\n }\n return (\n <header className={cn(\"space-y-1\", className)}>\n {image ? <HeaderImage image={image} className=\"mb-4 rounded-lg\" /> : null}\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description ? <p className=\"text-muted-foreground\">{description}</p> : null}\n {requiredNote ? <RequiredNote text={requiredNote} className=\"pt-1\" /> : null}\n </header>\n );\n}\n\nfunction initials(name: string): string {\n return name\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((word) => word[0]!.toUpperCase())\n .join(\"\");\n}\n\nfunction DefaultBrand({ name, logo, className }: BrandSlotProps) {\n return (\n <div className={cn(\"flex min-w-0 items-center gap-2.5\", className)} data-gf-brand=\"\">\n {typeof logo === \"string\" ? (\n <img src={logo} alt=\"\" className=\"size-8 shrink-0 rounded-md object-contain\" />\n ) : logo ? (\n <span className=\"flex shrink-0 items-center\" aria-hidden=\"true\">\n {logo}\n </span>\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-primary text-xs font-bold tracking-wide text-primary-foreground\"\n >\n {initials(name)}\n </span>\n )}\n <span className=\"truncate text-sm font-semibold tracking-tight\">{name}</span>\n </div>\n );\n}\n\nfunction DefaultProgress({ step, total, className }: ProgressSlotProps) {\n const { presentation } = useFormPresentation();\n const page = presentation === \"page\";\n if (!total) return null;\n // In page mode the bar fills with questions answered (empty on the first), like Typeform.\n const percent = total ? Math.round(((page ? step - 1 : step) / total) * 100) : 0;\n // Not a live region: focus moving to the question is the announcement.\n const bar = (\n <Progress\n value={percent}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-valuetext={`Question ${step} of ${total}`}\n aria-label=\"Progress\"\n className={cn(\"motion-reduce:[&>div]:transition-none\", page && \"h-1 rounded-none bg-primary/15\")}\n />\n );\n if (page) {\n return (\n <div className={cn(\"fixed inset-x-0 top-0 z-10\", className)} data-gf-progress=\"\">\n {bar}\n </div>\n );\n }\n return (\n <div className={cn(\"space-y-1\", className)} data-gf-progress=\"\">\n {bar}\n <p className=\"text-sm text-muted-foreground\">\n Question {step} of {total}\n </p>\n </div>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction DefaultNavigation({\n canGoBack,\n isLast,\n busy,\n failed,\n onBack,\n submitLabel,\n nextLabel,\n retryLabel,\n keyHint,\n className,\n}: NavigationSlotProps) {\n const { presentation, layout } = useFormPresentation();\n const label = busy ? \"Sending…\" : failed ? retryLabel : isLast ? submitLabel : nextLabel;\n if (presentation === \"page\") {\n return (\n <div className={cn(\"flex flex-wrap items-center gap-x-4 gap-y-2\", layout === \"classic\" && \"pt-2\", className)}>\n <Button\n type=\"submit\"\n size=\"lg\"\n loading={busy}\n className=\"h-12 min-w-28 px-6 text-base font-semibold motion-reduce:[&_.animate-spin]:animate-none [&_svg]:size-5\"\n >\n {label}\n {!busy && !failed && !isLast ? <CheckIcon /> : null}\n </Button>\n {keyHint && !busy ? (\n <span className=\"hidden text-sm text-muted-foreground pointer-fine:inline\" data-gf-key-hint=\"\">\n press <kbd className=\"font-sans font-semibold text-foreground\">{keyHint}</kbd>\n </span>\n ) : null}\n {canGoBack ? (\n // After OK in the tab order, drawn quietly at the page's top-left.\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Back\"\n onClick={onBack}\n disabled={busy}\n // Centred on the brand row: h-16 (sm:h-20) minus its own 44px, halved.\n className=\"absolute left-2 top-2.5 size-11 text-muted-foreground sm:left-4 sm:top-4.5 [&_svg]:size-6\"\n >\n <ChevronLeftIcon />\n </Button>\n ) : null}\n </div>\n );\n }\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n {canGoBack ? (\n <Button type=\"button\" variant=\"outline\" size=\"lg\" onClick={onBack} disabled={busy}>\n Back\n </Button>\n ) : null}\n <Button type=\"submit\" size=\"lg\" loading={busy} className=\"motion-reduce:[&_.animate-spin]:animate-none\">\n {label}\n </Button>\n </div>\n );\n}\n\n/**\n * The built-in ending (a check, the title and description, then any `actions`). Exported\n * so a custom ending slot can wrap it rather than copy it.\n */\nexport function DefaultEnding({ title, description, actions, className }: EndingSlotProps) {\n const { presentation } = useFormPresentation();\n const actionRow = actions ? <div className=\"mt-4 flex flex-wrap justify-center gap-2\">{actions}</div> : null;\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 {actionRow}\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 {actionRow}\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 /**\n * Option lists this app supplies, by key, for choice questions whose\n * options come from the app (`props.optionsFrom: { source: \"host\", key }`),\n * such as `{ coaches: [{ value: \"8c1…\", label: \"Ada Lovelace\" }] }`. Shown\n * after the question's own options. Like `options`, read when the response\n * starts; unused with `engine` (pass `hostOptions` to `useForm` then). Check\n * answers on the server with the same lists (`validateSubmission`'s\n * `hostOptions`).\n */\n hostOptions?: HostOptions | undefined;\n /**\n * The query parameters of the link the form was opened from, such as\n * `new URLSearchParams(location.search)`. A choice question with\n * `props.prefill: { param }` starts with that parameter's value picked when\n * it is one of its options (`prefillFromLink`), and with\n * `hideWhenPrefilled` it isn't shown at all. Read when the response starts;\n * unused with `engine` (pass `linkParams` to `useForm` then).\n */\n linkParams?: LinkParams | undefined;\n /** Overrides the definition's layout. */\n layout?: \"focus\" | \"classic\" | undefined;\n /**\n * `\"embedded\"` (default): a block inside your own page. `\"page\"`: the\n * respondent's whole screen, for a QR code or a shared link. It fills the\n * viewport with no card around it; in focus layout each question is centred\n * under a thin progress bar with large type and tap targets, and in classic\n * layout the questions are sections on one scrolling page.\n */\n presentation?: FormPresentation | undefined;\n /** An organisation's or business's name and logo, shown small at the top of every step and on the ending. */\n brand?: FormBrand | undefined;\n /**\n * Colours and a header image: `accent` replaces the primary colour (buttons,\n * selected options, progress, focus ring), adjusted where needed so it keeps\n * at least 3:1 contrast with the page and its text 4.5:1; `headerImage` is a\n * banner over the title.\n */\n theme?: FormTheme | 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 * Save answers as they go: with the definition's `settings.saveProgress` on,\n * called a moment after each step forward (in classic layout, a moment after\n * the answers change) with how far the respondent got (`formProgress`); read\n * the answers so far with `engine.answers()`. It never holds them up: it runs\n * after the step, and a rejection is ignored (the next call carries every\n * answer again). A pending call goes at once when the page is hidden, and none\n * is made once the form is submitted.\n */\n onProgress?: ((engine: FormEngine, progress: FormProgress) => void | Promise<void>) | undefined;\n /**\n * The note under the first question while answers save as they go (only with\n * `onProgress` and `settings.saveProgress`). `null` hides it. Default\n * \"Your answers save as you go.\"\n */\n progressNotice?: string | null | 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 /** The send button's word, the same in every layout. Default \"Send\". */\n submitLabel?: string | undefined;\n /** The button that moves to the next question in focus layout. Default \"OK\". */\n nextLabel?: string | undefined;\n /**\n * The note shown with the title when any question is required, after an\n * asterisk (\"* Required\"). `null` hides it. Default \"Required\".\n */\n requiredLabel?: string | null | undefined;\n /** The submit button's label after `onSubmit` failed. Default \"Try again\". */\n retryLabel?: string | undefined;\n /**\n * Stores a file a respondent adds to a `photo` field and resolves to its\n * reference (`{ id, name, type, size }`), which is all the answer keeps; a\n * rejection shows under the field. While any upload is in flight the form\n * neither moves on nor sends. Without it (and without an `UploadContext`\n * above the form), photo fields say photos can't be added.\n */\n onUpload?: ((file: File, field: FieldBlock) => Promise<PhotoRef>) | 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/** How long after a step forward `onProgress` waits, so quick steps save once. */\nexport const PROGRESS_DELAY_MS = 400;\n/** In classic layout, how long after the last answer changed. */\nexport const CLASSIC_PROGRESS_DELAY_MS = 1500;\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 options =\n props.hostOptions || props.linkParams\n ? {\n ...props.options,\n ...(props.hostOptions ? { hostOptions: props.hostOptions } : {}),\n ...(props.linkParams ? { linkParams: props.linkParams } : {}),\n }\n : props.options;\n const engine = useForm(props.form, options);\n return <FormWithEngine {...props} engine={engine} />;\n}\n\nfunction FormWithEngine(props: FormProps & { engine: FormEngine }) {\n const { onUpload } = props;\n // `onUpload` wins; otherwise a host's own UploadContext above the form is kept.\n const outer = useContext(UploadContext);\n const host = useMemo(() => (onUpload ? { upload: onUpload } : outer), [onUpload, outer]);\n const [pending] = useState(createPendingUploads);\n return (\n <UploadContext.Provider value={host}>\n <PendingUploadsContext.Provider value={pending}>\n <FormRuntime engine={props.engine} registry={props.registry ?? defaultRegistry}>\n <FormBody key={keyOf(props.engine)} {...props} pendingUploads={pending} />\n </FormRuntime>\n </PendingUploadsContext.Provider>\n </UploadContext.Provider>\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 theme,\n onSubmit,\n onChange,\n onProgress,\n progressNotice = \"Your answers save as you go.\",\n autoAdvance = true,\n submitLabel = \"Send\",\n requiredLabel = \"Required\",\n nextLabel = \"OK\",\n retryLabel = \"Try again\",\n slots,\n slotProps,\n className,\n testID,\n pendingUploads,\n}: FormProps & { engine: FormEngine; pendingUploads: PendingUploads }) {\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 // The questions the respondent sees: the path without any a link prefilled and hides.\n const pathKey = useFormSelector(engine, (s) => JSON.stringify(respondentPath(def, s)));\n // A string, so typing (which builds a new errors object) doesn't re-render the whole form.\n const errorsKey = useFormSelector(engine, (s) => JSON.stringify(s.errors));\n const ending = useFormSelector(engine, (s) => s.ending);\n const historyLength = useFormSelector(engine, (s) => s.history.length);\n // The introduction recalls like endings do ({{field:name}}, {{hidden:owner}}), so it follows\n // the answers; a string, so it re-renders only when the recalled text changes.\n const description = useFormSelector(engine, () => (def.description ? engine.text(def.description) : undefined));\n const path = JSON.parse(pathKey) as string[];\n const errors = JSON.parse(errorsKey) as Record<string, string>;\n const formRef = useRef<HTMLFormElement>(null);\n const stepRef = useRef<HTMLDivElement>(null);\n const endingRef = useRef<HTMLDivElement>(null);\n const advanceTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const previousCurrent = useRef(current);\n const [phase, setPhase] = useState<\"idle\" | \"sending\" | \"sent\" | \"failed\">(\"idle\");\n const [announcement, setAnnouncement] = useState(\"\");\n const [summaryRequest, setSummaryRequest] = useState(0);\n const sending = useRef(false);\n // Which way the last step went, so page mode slides the new question in from that side.\n const direction = useRef<\"forward\" | \"back\">(\"forward\");\n // \"Ctrl\" until mounted, so the server and the first client render agree.\n const [modKey, setModKey] = useState(\"Ctrl\");\n const page = presentation === \"page\";\n\n useEffect(() => {\n if (/Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent)) setModKey(\"⌘\");\n }, []);\n\n const showEnding = status === \"completed\" && (phase === \"sent\" || !onSubmit);\n // A completed response is final: the engine ignores edits, so the fields say so.\n const locked = status === \"completed\";\n\n useEffect(() => {\n if (!onChange) return;\n return engine.subscribe(() => onChange(engine.getState(), engine));\n }, [engine, onChange]);\n\n // Save answers as they go: a moment after each step forward (or, in classic layout,\n // after the answers change), off the respondent's path. The latest onProgress is\n // read when it fires, so a host passing a new function each render keeps one timer.\n const saveProgress = def.settings?.saveProgress === true && !!onProgress;\n const onProgressRef = useRef(onProgress);\n onProgressRef.current = onProgress;\n useEffect(() => {\n if (!saveProgress) return;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let last = engine.getState();\n const fire = () => {\n timer = undefined;\n if (engine.getState().status === \"completed\") return;\n try {\n void Promise.resolve(onProgressRef.current?.(engine, formProgress(engine))).catch(() => {});\n } catch {\n // A host's error never reaches the respondent; the next step saves again.\n }\n };\n const schedule = (delay: number) => {\n clearTimeout(timer);\n timer = setTimeout(fire, delay);\n };\n const unsubscribe = engine.subscribe(() => {\n const state = engine.getState();\n const previous = last;\n last = state;\n if (state.status === \"completed\") {\n clearTimeout(timer);\n timer = undefined;\n return;\n }\n const event = state.events[state.events.length - 1];\n if (layout === \"focus\") {\n if (event?.type === \"next\" && state.current !== previous.current) schedule(PROGRESS_DELAY_MS);\n } else if (event?.type === \"answer\") schedule(CLASSIC_PROGRESS_DELAY_MS);\n });\n // Leaving the page (closing the tab, switching away on a phone) sends a pending save now.\n const flush = () => {\n if (timer === undefined) return;\n clearTimeout(timer);\n fire();\n };\n window.addEventListener(\"pagehide\", flush);\n return () => {\n unsubscribe();\n window.removeEventListener(\"pagehide\", flush);\n flush();\n };\n }, [engine, saveProgress, layout]);\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 /** True (and says so) while a photo is still on its way: the form waits for it. */\n const waitingForUploads = () => {\n if (pendingUploads.count() === 0) return false;\n announce(UPLOAD_WAIT_MESSAGE);\n return true;\n };\n\n const finish = async () => {\n if (sending.current) return;\n if (engine.getState().status !== \"completed\" && waitingForUploads()) 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) => {\n const shown = respondentPath(def, state);\n return state.current === shown[shown.length - 1];\n };\n\n const advance = () => {\n if (waitingForUploads()) return;\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 themeId = `gf-theme-${useId().replace(/[^a-zA-Z0-9_-]/g, \"\")}`;\n const themeStyle = themeCss(theme, `[data-gf-theme=\"${themeId}\"]`);\n // The theme's colours apply to everything inside: the form, or the ending in its place.\n const themed = themeStyle ? { \"data-gf-theme\": themeId } : {};\n const styleNode = themeStyle ? <style>{themeStyle}</style> : null;\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 {styleNode}\n {page ? (\n <div\n ref={endingRef}\n {...themed}\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} {...themed} 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 // Under the first question (focus layout) or the title (classic), until they move on.\n const notice =\n saveProgress && progressNotice && historyLength === 0 ? (\n <p className=\"text-sm text-muted-foreground\" data-gf-progress-notice=\"\">\n {progressNotice}\n </p>\n ) : null;\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 hasRequired = def.blocks.some((b) => b.kind === \"field\" && b.required === true);\n const header = renderSlot(\n DefaultHeader,\n slots?.header,\n {\n title: def.title,\n description,\n image: theme?.headerImage ? { src: theme.headerImage, alt: theme.headerImageAlt ?? \"\" } : undefined,\n requiredNote: hasRequired && requiredLabel ? requiredLabel : undefined,\n },\n slotProps?.header,\n );\n const errorSummary =\n errorItems.length > 0 && layout === \"classic\"\n ? renderSlot(\n DefaultErrorSummary,\n slots?.errorSummary,\n {\n count: errorItems.length,\n errors: errorItems,\n className: page ? \"bg-card\" : undefined,\n },\n slotProps?.errorSummary,\n )\n : null;\n const progress =\n // No questions on the path: no \"Question 1 of 0\".\n layout === \"focus\" && path.length > 0\n ? renderSlot(DefaultProgress, slots?.progress, { step, total: path.length }, slotProps?.progress)\n : null;\n const fields = (\n // Disabled once the response is completed (sending, or after a failed send): read-only, not dead.\n <fieldset disabled={locked} className=\"min-w-0 border-0 p-0\">\n {layout === \"focus\" ? (\n <div\n // A new element per question, so page mode's entry transition runs for each one.\n key={pageFocus ? (current ?? \"\") : undefined}\n ref={stepRef}\n tabIndex={-1}\n className={cn(\n \"outline-none\",\n pageFocus &&\n \"transition-[opacity,translate] duration-300 ease-out starting:opacity-0 motion-reduce:transition-none\",\n pageFocus && (direction.current === \"back\" ? \"starting:-translate-y-6\" : \"starting:translate-y-6\"),\n )}\n >\n {current ? renderBlock(current, true) : null}\n </div>\n ) : (\n <div className={pageClassic ? \"space-y-4\" : \"space-y-8\"}>{path.map((id) => renderBlock(id, false))}</div>\n )}\n </fieldset>\n );\n const failure =\n phase === \"failed\" ? (\n <p role=\"alert\" className={cn(\"text-sm font-medium text-destructive\", page && \"text-base\")}>\n We couldn't send your answers. They're kept here: press {retryLabel} to send them again.\n </p>\n ) : null;\n const navigation = renderSlot(\n DefaultNavigation,\n slots?.navigation,\n {\n canGoBack: layout === \"focus\" && historyLength > 0 && !locked,\n isLast: isLast || status === \"completed\",\n busy: phase === \"sending\",\n failed: phase === \"failed\",\n onBack: goBack,\n submitLabel,\n nextLabel,\n retryLabel,\n keyHint,\n },\n slotProps?.navigation,\n );\n\n const formProps = {\n ...themed,\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 {styleNode}\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 {notice ? <div className=\"mt-4\">{notice}</div> : null}\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 {notice}\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 {layout === \"classic\" ? notice : null}\n {errorSummary}\n {progress}\n {fields}\n {layout === \"focus\" ? notice : null}\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","import type { FieldBlock, PhotoRef, SignedUpload, UploadGrant, UploadRequest } from \"@marktiderman/genesis-forms\";\nimport { photoFileType } from \"./photo\";\nimport type { UploadHost } from \"./upload\";\n\n/**\n * Who is uploading: a new response's visit (`attemptId`, a UUID the page keeps for the\n * visit), or an edit link's token while changing a sent response.\n */\nexport type UploadClaim = { attemptId: string } | { edit: string };\n\nexport interface SignedUploadHostOptions {\n /** The app's upload endpoint (`createUploadHandler`'s route), or one per field. */\n endpoint: string | ((field: FieldBlock) => string);\n /** Who is uploading, read at each upload. */\n claim: UploadClaim | (() => UploadClaim);\n /**\n * Sends the bytes where the server signed. Default: PUT the file to `upload.url`\n * (with its type), which a store that signs plain URLs sets. Supabase Storage:\n * `supabase.storage.from(upload.bucket).uploadToSignedUrl(upload.path, upload.token, file, { contentType })`.\n * A throw (or rejection) is the upload failing.\n */\n send?: ((file: File, upload: SignedUpload, contentType: string) => Promise<void>) | undefined;\n /**\n * A link to read a stored file, for thumbnails and staff views: the app's storage signs\n * it. Null when the reader can't open it. Without it, `url` resolves null.\n */\n readUrl?: ((ref: PhotoRef, field?: FieldBlock) => Promise<string | null>) | undefined;\n /** Default the global `fetch`. */\n fetch?: typeof fetch | undefined;\n}\n\n/** An `UploadHost` that always has `url`. */\nexport interface SignedUploadHost extends UploadHost {\n url(ref: PhotoRef, field?: FieldBlock): Promise<string | null>;\n}\n\nasync function putToUrl(file: File, upload: SignedUpload, contentType: string, fetcher: typeof fetch) {\n if (!upload.url) throw new Error(\"The server signed no URL to send the file to; pass `send`.\");\n const res = await fetcher(upload.url, { method: \"PUT\", headers: { \"content-type\": contentType }, body: file });\n if (!res.ok) throw new Error(`The file wasn't stored (${res.status}).`);\n}\n\n/**\n * The browser half of the upload handshake (genesis-forms/server's `createUploadHandler`):\n * for each file it asks `endpoint` for a signed upload (`UploadRequest` as JSON), sends\n * the bytes with `send`, and resolves to the reference the server handed back, which is\n * all the answer keeps. A refusal rejects with the server's words. Pass it as `<Form\n * onUpload={host.upload}>` or in an `UploadContext`.\n */\nexport function signedUploadHost(options: SignedUploadHostOptions): SignedUploadHost {\n const fetcher = (...args: Parameters<typeof fetch>) => (options.fetch ?? fetch)(...args);\n return {\n async upload(file, field) {\n const type = photoFileType(file);\n const claim = typeof options.claim === \"function\" ? options.claim() : options.claim;\n const endpoint = typeof options.endpoint === \"function\" ? options.endpoint(field) : options.endpoint;\n const request: UploadRequest = { fieldId: field.id, name: file.name, type, size: file.size, ...claim };\n const response = await fetcher(endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(request),\n });\n const body = (await response.json().catch(() => ({}))) as Partial<UploadGrant> & { error?: unknown };\n if (!response.ok || !body.ref || !body.upload) {\n throw new Error(typeof body.error === \"string\" ? body.error : `The photo wasn't accepted (${response.status}).`);\n }\n if (options.send) await options.send(file, body.upload, type);\n else await putToUrl(file, body.upload, type, fetcher);\n return body.ref;\n },\n async url(ref, field) {\n if (!options.readUrl) return null;\n try {\n return await options.readUrl(ref, field);\n } catch {\n return null;\n }\n },\n };\n}\n","// A public form's address bar shows only its path: the link's query (?about=, ?coach=,\n// ?edit=, utm_…) is read on load, then taken out of the visible URL. The page keeps using\n// the values it read: the router isn't told, so its state keeps the query. A reload within\n// the same tab gets them back, since the query is kept in sessionStorage for a little while.\n//\n// Cosmetic, not security: the server checks every value it is sent, and anyone holding\n// the link still has it. It keeps the parameters out of screenshots, shared addresses and\n// over-the-shoulder reads. Moved up from the host app's src/lib/forms/clean-url.ts.\n\nconst KEY_PREFIX = \"form-query:\";\n/** How long a reload brings the query back: 30 minutes. */\nexport const HIDDEN_QUERY_KEEP_MS = 30 * 60 * 1000;\n\n/** The parts of `window` `hideQueryOnLoad` uses (pass `window`; tests pass a fake). */\nexport interface HiddenQueryWindow {\n location: { pathname: string; search: string; hash: string; replace(url: string): void };\n history: { state: unknown; replaceState(data: unknown, unused: string, url: string): void };\n sessionStorage: Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\n}\n\n/**\n * Run once when the page has read its query. Returns \"hidden\" when it took the query out\n * of the address bar, \"restoring\" when a reload is bringing a hidden query back (the page\n * is about to load again), else \"none\".\n */\nexport function hideQueryOnLoad(\n win: HiddenQueryWindow,\n isReload: boolean,\n now = Date.now(),\n): \"hidden\" | \"restoring\" | \"none\" {\n const { pathname, search, hash } = win.location;\n const key = KEY_PREFIX + pathname;\n try {\n if (search && search !== \"?\") {\n win.sessionStorage.setItem(key, JSON.stringify({ search, at: now }));\n // The browser's own replaceState: a router may patch the instance's and would re-read\n // the address, losing the query the page reads (link inputs, ?edit).\n const replace = nativeReplaceState(win.history);\n replace.call(win.history, win.history.state, \"\", pathname + hash);\n return \"hidden\";\n }\n const saved = win.sessionStorage.getItem(key);\n if (!saved) return \"none\";\n const { search: kept, at } = JSON.parse(saved) as { search?: unknown; at?: unknown };\n if (isReload && typeof kept === \"string\" && typeof at === \"number\" && now - at < HIDDEN_QUERY_KEEP_MS) {\n win.location.replace(pathname + kept + hash);\n return \"restoring\";\n }\n win.sessionStorage.removeItem(key);\n } catch {\n // Storage blocked (private windows): the query just stays visible.\n }\n return \"none\";\n}\n\n/** History's prototype replaceState when there is one (a real browser), else the instance's. */\nfunction nativeReplaceState(history: HiddenQueryWindow[\"history\"]): HiddenQueryWindow[\"history\"][\"replaceState\"] {\n const proto = Object.getPrototypeOf(history) as Partial<HiddenQueryWindow[\"history\"]> | null;\n return typeof proto?.replaceState === \"function\" ? proto.replaceState : history.replaceState;\n}\n\n/** Whether this page load was a reload (Navigation Timing), in the browser; false elsewhere. */\nexport const wasReload = (): boolean =>\n typeof performance !== \"undefined\" &&\n (performance.getEntriesByType?.(\"navigation\")[0] as PerformanceNavigationTiming | undefined)?.type === \"reload\";\n"]}
1
+ {"version":3,"sources":["../src/presentation.ts","../src/chrome.tsx","../src/calculated.tsx","../src/source.ts","../src/structured.tsx","../src/upload.ts","../src/photo.tsx","../src/searchable.tsx","../src/renderers.tsx","../src/theme.ts","../src/Form.tsx","../src/signed-upload.ts","../src/clean-url.ts"],"names":["jsx","cn","createContext","useContext","jsxs","XIcon","useState","useRef","useEffect","Button","Input","FormError","getFieldType","Textarea","Fragment","invalid","Label","useId","useFormSelector"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\n\n/**\n * How `<Form>` sits on the page. `\"embedded\"` is a block inside your app's own\n * page. `\"page\"` is the respondent's whole screen (a QR code, a shared link):\n * it fills the viewport and draws no card around the form.\n */\nexport type FormPresentation = \"embedded\" | \"page\";\n\nexport interface FormPresentationValue {\n presentation: FormPresentation;\n layout: \"focus\" | \"classic\";\n}\n\nconst FormPresentationContext = createContext<FormPresentationValue>({ presentation: \"embedded\", layout: \"classic\" });\n\nexport const FormPresentationProvider = FormPresentationContext.Provider;\n\n/**\n * The presentation and layout of the enclosing `<Form>`, so a custom slot or\n * renderer can match the built-in ones (larger type and tap targets in page\n * mode, for example). Outside a `<Form>` it reads embedded and classic.\n */\nexport function useFormPresentation(): FormPresentationValue {\n return useContext(FormPresentationContext);\n}\n","import type { ReactNode } from \"react\";\nimport { FormDescription, FormError, FormLabel } from \"@marktiderman/genesis-ui/form-field\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport { getFieldType } from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps } from \"@marktiderman/genesis-forms-react\";\nimport { useFormPresentation } from \"./presentation\";\n\n/** The visible question text takes focus in the focus layout, so it needs a focus ring of its own. */\nconst questionFocus =\n \"rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background\";\n\n// ── Field chrome ─────────────────────────────────────────────────────────────\n\nexport interface FieldChromeProps {\n props: FieldRendererProps;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Label, description and error around a control. Group types (radio,\n * checkbox list, rating, scale) get a real `fieldset`/`legend`, so a screen\n * reader announces the question with every option; the fieldset carries the\n * field's `inputId` (an error summary links to it) and `aria-describedby`.\n * `aria-invalid` sits on the controls: ARIA 1.2 doesn't allow it on a group.\n *\n * The legend or label is the question text: it has `id=\"${inputId}-label\"`\n * and `tabIndex={-1}` and is marked `data-gf-question`, which the focus\n * layout focuses on each new question unless the control is marked\n * `data-gf-focus` (text fields mark their input, so typing just works).\n */\nexport function FieldChrome({ props, children, className }: FieldChromeProps) {\n const { binding, inputId } = props;\n const { field, error, label } = binding;\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const pageClassic = presentation === \"page\" && layout === \"classic\";\n const group = getFieldType(field.type)?.a11y.semantics === \"group\";\n const description = field.description ? props.engine.text(field.description) : undefined;\n // Page focus: the question is the headline, the answer sits well below it.\n const questionSize = pageFocus\n ? \"text-2xl font-semibold leading-tight tracking-tight text-balance sm:text-3xl\"\n : pageClassic\n ? \"text-lg font-medium leading-snug\"\n : \"text-base\";\n const body = (\n <>\n {description ? (\n <FormDescription id={`${inputId}-desc`} className={cn(\"whitespace-pre-line\", pageFocus && \"text-base sm:text-lg text-pretty\")}>\n {description}\n </FormDescription>\n ) : null}\n {pageFocus ? <div className=\"pt-6 sm:pt-8\">{children}</div> : children}\n {/* No role=\"alert\": the layout announces errors once (focus layout) or focuses a summary (classic). */}\n {pageFocus ? (\n // A calm note under the answer, Typeform style; the question keeps its colour.\n error ? (\n <FormError\n id={`${inputId}-error`}\n // Solid fill: the dark theme's destructive is a background shade, too dim as text.\n className=\"mt-4 inline-flex items-center gap-2 rounded-md bg-destructive px-3 py-2 text-sm text-destructive-foreground\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4M12 16h.01\" strokeLinecap=\"round\" />\n </svg>\n {error}\n </FormError>\n ) : null\n ) : (\n <FormError id={`${inputId}-error`}>{error}</FormError>\n )}\n </>\n );\n if (group) {\n return (\n <fieldset\n id={inputId}\n data-slot=\"form-field\"\n aria-describedby={describedBy(props)}\n className={cn(\"space-y-3 border-0 p-0 m-0 min-w-0\", className)}\n >\n <legend\n id={`${inputId}-label`}\n tabIndex={-1}\n data-gf-question=\"\"\n className={cn(\n \"mb-3 font-medium\",\n questionSize,\n pageFocus && \"mb-0\",\n questionFocus,\n error && !pageFocus && \"text-destructive\",\n )}\n >\n {label}\n {field.required ? (\n <span className=\"text-destructive ml-1\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </legend>\n {body}\n </fieldset>\n );\n }\n return (\n <div data-slot=\"form-field\" className={cn(\"space-y-2\", pageFocus && \"space-y-3\", className)}>\n <FormLabel\n id={`${inputId}-label`}\n htmlFor={inputId}\n tabIndex={-1}\n data-gf-question=\"\"\n error={Boolean(error) && !pageFocus}\n required={field.required}\n className={cn(presentation === \"page\" && \"block\", questionSize, questionFocus)}\n >\n {label}\n </FormLabel>\n {body}\n </div>\n );\n}\n\nexport function describedBy(props: FieldRendererProps): string | undefined {\n const ids = [\n props.binding.field.description ? `${props.inputId}-desc` : null,\n props.binding.error ? `${props.inputId}-error` : null,\n ].filter(Boolean);\n return ids.length ? ids.join(\" \") : undefined;\n}\n","import { formatCalculated } from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps, RendererEntry } from \"@marktiderman/genesis-forms-react\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport { describedBy, FieldChrome } from \"./chrome\";\nimport { useFormPresentation } from \"./presentation\";\n\n/**\n * A `calculated` field: the value the engine worked out, read-only. It is an\n * `<output>` named by the question, and polite live region, so a screen\n * reader hears the new value as the answers it reads change.\n */\nfunction CalculatedField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const text = formatCalculated(binding.value, binding.field);\n return (\n <FieldChrome props={props}>\n <output\n id={inputId}\n aria-labelledby={`${inputId}-label`}\n aria-describedby={describedBy(props)}\n aria-live=\"polite\"\n data-gf-calculated=\"\"\n className={cn(\n \"block rounded-md border border-dashed bg-muted/40 px-3 py-2 font-medium tabular-nums\",\n pageFocus ? \"text-2xl sm:text-3xl\" : \"text-base\",\n !text && \"text-muted-foreground\",\n )}\n >\n {text || \"—\"}\n </output>\n </FieldChrome>\n );\n}\n\nexport const calculatedRenderers: RendererEntry[] = [{ type: \"calculated\", Component: CalculatedField }];\n","import { createContext, useContext } from \"react\";\n\n/**\n * The video or audio a form is about, as the host app plays it. `media-notes`\n * fields read it: with `currentTime` the add row starts at the current moment\n * (\"Add note at 1:23\"), with `seek` a note's time plays the media from there.\n * Both are in seconds from the start of the full recording.\n */\nexport interface MediaTime {\n /** The playhead now, or undefined when it isn't known yet. */\n currentTime?: (() => number | undefined) | undefined;\n /** Move the playhead. */\n seek?: ((seconds: number) => void) | undefined;\n}\n\n/** Provide it around `<Form>` to link `media-notes` fields to a media player. */\nexport const MediaTimeContext = createContext<MediaTime | null>(null);\n\n/** The enclosing `MediaTimeContext` value, or null. */\nexport function useMediaTime(): MediaTime | null {\n return useContext(MediaTimeContext);\n}\n\n/**\n * The text a form is about (an article, a policy, a contract). `text-highlights`\n * fields highlight passages of it; a field's own `props.text` is used when no\n * host provides one. Offsets are UTF-16 indices into this exact string.\n */\nexport const SourceTextContext = createContext<string | null>(null);\n\n/** The enclosing `SourceTextContext` value, or null. */\nexport function useSourceText(): string | null {\n return useContext(SourceTextContext);\n}\n","/**\n * Renderers for the structured field types: `list`, `table`, `media-notes`\n * and `text-highlights`. Each is a group (FieldChrome draws the fieldset and\n * legend); every control inside has its own visible or accessible name.\n */\nimport { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Button } from \"@marktiderman/genesis-ui/button\";\nimport { Input } from \"@marktiderman/genesis-ui/input\";\nimport { Label } from \"@marktiderman/genesis-ui/label\";\nimport { Stack } from \"@marktiderman/genesis-ui/layout\";\nimport { SortableList } from \"@marktiderman/genesis-ui/sortable-list\";\nimport { Textarea } from \"@marktiderman/genesis-ui/textarea\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport {\n formatTimestamp,\n listLimits,\n parseTimestamp,\n tableColumns,\n tableLimits,\n type Highlight,\n type Json,\n type MediaNote,\n} from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps, RendererEntry } from \"@marktiderman/genesis-forms-react\";\nimport { FieldChrome } from \"./chrome\";\nimport { useSourceText, useMediaTime } from \"./source\";\n\n// ── Shared ───────────────────────────────────────────────────────────────────\n\nfunction PlusIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n );\n}\n\nfunction XIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nfunction move<T>(list: readonly T[], from: number, to: number): T[] {\n const next = list.slice();\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item as T);\n return next;\n}\n\n/**\n * Stable React keys for the entries of a list value, which has none of its\n * own (two list items may hold the same text). Kept in step with every add,\n * remove and move; a value replaced from outside (a draft restored) just gets\n * keys for its new length.\n */\nfunction useEntryKeys(count: number) {\n const keys = useRef<string[]>([]);\n const next = useRef(0);\n const make = () => `e${next.current++}`;\n while (keys.current.length < count) keys.current.push(make());\n if (keys.current.length > count) keys.current = keys.current.slice(0, count);\n return {\n keys: keys.current,\n /** Add a key at `at` and return it. */\n insert(at: number): string {\n const key = make();\n keys.current = [...keys.current.slice(0, at), key, ...keys.current.slice(at)];\n return key;\n },\n remove(at: number) {\n keys.current = keys.current.filter((_, i) => i !== at);\n },\n move(from: number, to: number) {\n keys.current = move(keys.current, from, to);\n },\n };\n}\n\n/** Focus the element registered under a key once it has rendered. */\nfunction useFocusLater() {\n const elements = useRef(new Map<string, HTMLElement>());\n const [target, setTarget] = useState<string | null>(null);\n useEffect(() => {\n if (target === null) return;\n elements.current.get(target)?.focus();\n setTarget(null);\n }, [target]);\n return {\n ref: (key: string) => (el: HTMLElement | null) => {\n if (el) elements.current.set(key, el);\n else elements.current.delete(key);\n },\n focus: setTarget,\n };\n}\n\nconst invalid = (props: FieldRendererProps) => (props.binding.error ? true : undefined);\n\nfunction RemoveButton({ label, onClick, disabled }: { label: string; onClick: () => void; disabled?: boolean }) {\n return (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={label} disabled={disabled} onClick={onClick} className=\"shrink-0\">\n <XIcon />\n </Button>\n );\n}\n\nfunction AddButton({ children, onClick, disabled }: { children: ReactNode; onClick: () => void; disabled?: boolean }) {\n return (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={disabled} onClick={onClick} className=\"self-start\">\n <PlusIcon /> {children}\n </Button>\n );\n}\n\n/** A short form of a passage, for labels (\"Remove highlight “The quick brown…”\"). */\nfunction excerpt(text: string, max = 40): string {\n const t = text.replace(/\\s+/g, \" \").trim();\n return t.length > max ? `${t.slice(0, max - 1)}…` : t;\n}\n\n// ── list ─────────────────────────────────────────────────────────────────────\n\nfunction ListField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const field = binding.field;\n const { max, itemMaxLength } = listLimits(field);\n const stored = Array.isArray(binding.value) ? binding.value.map((v) => (typeof v === \"string\" ? v : \"\")) : [];\n // An unanswered list still shows one empty line to type in.\n const items = stored.length ? stored : [\"\"];\n const entries = useEntryKeys(items.length);\n const focusLater = useFocusLater();\n const addRef = useRef<HTMLButtonElement>(null);\n const placeholder =\n typeof field.props?.placeholder === \"string\" ? field.props.placeholder : (field.placeholder ?? undefined);\n const save = (next: string[]) => binding.setValue(next.length ? (next as Json) : undefined);\n\n const add = () => {\n if (items.length >= max) return;\n const key = entries.insert(items.length);\n save([...items, \"\"]);\n focusLater.focus(key);\n };\n const remove = (i: number) => {\n entries.remove(i);\n const next = items.filter((_, j) => j !== i);\n save(next);\n const neighbour = entries.keys[Math.min(i, next.length - 1)];\n if (neighbour !== undefined && next.length) focusLater.focus(neighbour);\n else addRef.current?.focus();\n };\n const onKeyDown = (i: number) => (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing || e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) return;\n if (i < items.length - 1) {\n e.preventDefault();\n focusLater.focus(entries.keys[i + 1]!);\n } else if (items.length < max) {\n // Enter in the last item starts the next one instead of moving on.\n e.preventDefault();\n add();\n }\n };\n\n const rows = items.map((text, index) => ({ key: entries.keys[index]!, text, index }));\n return (\n <FieldChrome props={props}>\n <Stack gap=\"sm\">\n <SortableList\n items={rows}\n getKey={(r) => r.key}\n getItemLabel={(r) => (r.text.trim() ? excerpt(r.text, 30) : `Item ${r.index + 1}`)}\n label={`${binding.label}: items`}\n disabled={items.length < 2}\n onReorder={(from, to) => {\n entries.move(from, to);\n save(move(items, from, to));\n }}\n renderItem={(r, { handle, index }) => (\n <Stack direction=\"row\" align=\"center\" gap=\"sm\" className=\"w-full min-w-0\">\n {handle}\n <Input\n ref={focusLater.ref(r.key)}\n id={index === 0 ? `${inputId}-0` : undefined}\n data-gf-focus={index === 0 ? \"\" : undefined}\n aria-label={`Item ${index + 1}`}\n aria-invalid={invalid(props)}\n maxLength={itemMaxLength}\n placeholder={placeholder}\n value={r.text}\n onChange={(e) => save(items.map((t, j) => (j === index ? e.target.value : t)))}\n onKeyDown={onKeyDown(index)}\n />\n <RemoveButton\n label={`Remove item ${index + 1}`}\n disabled={items.length === 1 && r.text === \"\"}\n onClick={() => remove(index)}\n />\n </Stack>\n )}\n />\n <Button\n ref={addRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={items.length >= max}\n onClick={add}\n >\n <PlusIcon /> Add item\n </Button>\n </Stack>\n </FieldChrome>\n );\n}\n\n// ── table ────────────────────────────────────────────────────────────────────\n\ntype Row = Record<string, string>;\n\nfunction toRow(value: Json | undefined): Row {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n return Object.fromEntries(Object.entries(value).filter((e): e is [string, string] => typeof e[1] === \"string\"));\n}\n\nfunction TableField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const columns = tableColumns(binding.field);\n const { minRows, maxRows } = tableLimits(binding.field);\n const stored = Array.isArray(binding.value) ? binding.value.map(toRow) : [];\n // Show at least the rows asked for (one when none are), never more than allowed.\n const shown = Math.min(Math.max(stored.length, minRows, 1), Math.max(maxRows, 1));\n const rows = Array.from({ length: shown }, (_, i) => stored[i] ?? {});\n const entries = useEntryKeys(rows.length);\n const focusLater = useFocusLater();\n const addRef = useRef<HTMLButtonElement>(null);\n const save = (next: Row[]) => binding.setValue(next.length ? (next as Json) : undefined);\n const firstKey = columns[0]?.key;\n\n const add = () => {\n if (rows.length >= maxRows) return;\n const key = entries.insert(rows.length);\n save([...rows, {}]);\n focusLater.focus(key);\n };\n const remove = (i: number) => {\n entries.remove(i);\n const next = rows.filter((_, j) => j !== i);\n save(next);\n const neighbour = entries.keys[Math.min(i, next.length - 1)];\n if (neighbour !== undefined && next.length) focusLater.focus(neighbour);\n else addRef.current?.focus();\n };\n\n if (!columns.length) {\n return (\n <FieldChrome props={props}>\n <p className=\"text-sm text-muted-foreground\">This question has no columns yet.</p>\n </FieldChrome>\n );\n }\n const items = rows.map((row, index) => ({ key: entries.keys[index]!, row, index }));\n return (\n <FieldChrome props={props}>\n <Stack gap=\"md\">\n <SortableList\n items={items}\n getKey={(r) => r.key}\n getItemLabel={(r) => `Row ${r.index + 1}`}\n label={`${binding.label}: rows`}\n disabled={rows.length < 2}\n onReorder={(from, to) => {\n entries.move(from, to);\n save(move(rows, from, to));\n }}\n renderItem={(r, { handle, index }) => (\n <Stack direction=\"row\" align=\"start\" gap=\"sm\" className=\"w-full min-w-0\">\n {handle ? <div className=\"pt-7\">{handle}</div> : null}\n <fieldset className=\"m-0 min-w-0 flex-1 rounded-md border border-input p-3\">\n <legend className=\"px-1 text-sm font-medium\">{`Row ${index + 1}`}</legend>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {columns.map((column, c) => {\n const id = `${inputId}-${r.key}-${column.key}`;\n const common = {\n id,\n // The first cell of the first row is what an error summary link and the focus layout reach.\n \"data-gf-focus\": index === 0 && c === 0 ? \"\" : undefined,\n \"aria-invalid\": invalid(props),\n value: r.row[column.key] ?? \"\",\n maxLength: 2000,\n } as const;\n const set = (text: string) =>\n save(rows.map((row, j) => (j === index ? { ...row, [column.key]: text } : row)));\n return (\n <div key={column.key} className={cn(\"space-y-1.5\", column.long && \"sm:col-span-2\")}>\n <Label htmlFor={id}>{column.label}</Label>\n {column.long ? (\n <Textarea\n {...common}\n ref={column.key === firstKey ? focusLater.ref(r.key) : undefined}\n rows={2}\n onChange={(e) => set(e.target.value)}\n />\n ) : (\n <Input\n {...common}\n ref={column.key === firstKey ? focusLater.ref(r.key) : undefined}\n onChange={(e) => set(e.target.value)}\n />\n )}\n </div>\n );\n })}\n </div>\n </fieldset>\n <div className=\"pt-7\">\n <RemoveButton\n label={`Remove row ${index + 1}`}\n disabled={rows.length <= Math.max(minRows, 1)}\n onClick={() => remove(index)}\n />\n </div>\n </Stack>\n )}\n />\n <Button\n ref={addRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={rows.length >= maxRows}\n onClick={add}\n >\n <PlusIcon /> Add row\n </Button>\n </Stack>\n </FieldChrome>\n );\n}\n\n// ── media-notes ──────────────────────────────────────────────────────────────\n\nfunction toNote(value: Json): MediaNote {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { at: 0, text: \"\" };\n return { at: typeof value.at === \"number\" ? value.at : 0, text: typeof value.text === \"string\" ? value.text : \"\" };\n}\n\nfunction MediaNotesField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const media = useMediaTime();\n const maxNotes = typeof binding.field.props?.maxNotes === \"number\" ? binding.field.props.maxNotes : 20;\n const textMaxLength = typeof binding.field.props?.textMaxLength === \"number\" ? binding.field.props.textMaxLength : 1000;\n const notes = Array.isArray(binding.value) ? binding.value.map(toNote) : [];\n const entries = useEntryKeys(notes.length);\n const now = () => {\n const t = media?.currentTime?.();\n return typeof t === \"number\" && Number.isFinite(t) && t >= 0 ? formatTimestamp(t) : \"\";\n };\n const [time, setTime] = useState(now);\n // Once the respondent types a time, the player no longer overwrites it.\n const [timeTouched, setTimeTouched] = useState(false);\n const [text, setText] = useState(\"\");\n const [timeError, setTimeError] = useState<string | null>(null);\n const textRef = useRef<HTMLInputElement>(null);\n const save = (next: MediaNote[]) => binding.setValue(next.length ? (next as unknown as Json) : undefined);\n const full = notes.length >= maxNotes;\n const follow = () => {\n if (timeTouched || !media?.currentTime) return;\n const t = now();\n if (t) setTime(t);\n };\n\n const parsed = parseTimestamp(time);\n const add = () => {\n if (full || !text.trim()) return;\n const at = time.trim() === \"\" && !media?.currentTime ? 0 : parsed;\n if (at === null) {\n setTimeError(\"Enter a time like 1:23 or 1:02:03.\");\n return;\n }\n // Keep notes in time order; a new note goes after others at the same moment.\n const at_ = notes.findIndex((n) => n.at > at);\n const index = at_ === -1 ? notes.length : at_;\n entries.insert(index);\n save([...notes.slice(0, index), { at, text: text.trim() }, ...notes.slice(index)]);\n setText(\"\");\n setTimeError(null);\n setTimeTouched(false);\n setTime(now());\n textRef.current?.focus();\n };\n const onEnter = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing) return;\n // Enter adds the note rather than moving on to the next question.\n e.preventDefault();\n add();\n };\n const addLabel =\n media?.currentTime && parsed !== null ? `Add note at ${formatTimestamp(parsed)}` : \"Add note\";\n const timeId = `${inputId}-time`;\n const textId = `${inputId}-text`;\n\n return (\n <FieldChrome props={props}>\n <Stack gap=\"md\">\n {notes.length ? (\n <ol aria-label={`${binding.label}: notes`} className=\"m-0 list-none space-y-2 p-0\">\n {notes.map((note, index) => {\n const at = formatTimestamp(note.at);\n return (\n <li key={entries.keys[index]}>\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n {media?.seek ? (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n className=\"shrink-0 px-0 tabular-nums\"\n aria-label={`Play from ${at}`}\n onClick={() => media.seek?.(note.at)}\n >\n {at}\n </Button>\n ) : (\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{at}</span>\n )}\n <Input\n aria-label={`Note at ${at}`}\n aria-invalid={invalid(props)}\n maxLength={textMaxLength}\n value={note.text}\n onChange={(e) => save(notes.map((n, j) => (j === index ? { ...n, text: e.target.value } : n)))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.preventDefault();\n }}\n />\n <RemoveButton\n label={`Remove note at ${at}`}\n onClick={() => {\n entries.remove(index);\n save(notes.filter((_, j) => j !== index));\n textRef.current?.focus();\n }}\n />\n </Stack>\n </li>\n );\n })}\n </ol>\n ) : null}\n {full ? (\n <p className=\"text-sm text-muted-foreground\">{`You've added the most notes this question takes (${maxNotes}).`}</p>\n ) : (\n <div className=\"grid gap-2 sm:grid-cols-[7rem_1fr_auto] sm:items-end\">\n <div className=\"space-y-1.5\">\n <Label htmlFor={timeId}>Time</Label>\n <Input\n id={timeId}\n inputMode=\"numeric\"\n placeholder=\"m:ss\"\n value={time}\n aria-invalid={timeError ? true : undefined}\n aria-describedby={timeError ? `${timeId}-error` : undefined}\n onChange={(e) => {\n setTime(e.target.value);\n setTimeTouched(true);\n setTimeError(null);\n }}\n onKeyDown={onEnter}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor={textId}>Note</Label>\n <Input\n ref={textRef}\n id={textId}\n data-gf-focus=\"\"\n maxLength={textMaxLength}\n value={text}\n onFocus={follow}\n onChange={(e) => {\n if (!text) follow();\n setText(e.target.value);\n }}\n onKeyDown={onEnter}\n />\n </div>\n <AddButton onClick={add} disabled={!text.trim()}>\n {addLabel}\n </AddButton>\n {timeError ? (\n <p id={`${timeId}-error`} className=\"text-sm text-destructive sm:col-span-3\">\n {timeError}\n </p>\n ) : null}\n </div>\n )}\n </Stack>\n </FieldChrome>\n );\n}\n\n// ── text-highlights ──────────────────────────────────────────────────────────\n\nfunction toHighlight(value: Json): Highlight | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const { start, end, quote, note } = value;\n if (typeof start !== \"number\" || typeof end !== \"number\" || typeof quote !== \"string\") return null;\n return { start, end, quote, note: typeof note === \"string\" ? note : \"\" };\n}\n\n/** The text in pieces, each marked when some highlight covers it. */\nfunction segments(text: string, highlights: readonly Highlight[]) {\n const cuts = new Set([0, text.length]);\n for (const h of highlights) {\n if (h.start >= 0 && h.end <= text.length && h.start < h.end) {\n cuts.add(h.start);\n cuts.add(h.end);\n }\n }\n const points = [...cuts].sort((a, b) => a - b);\n const out: { start: number; text: string; marked: boolean }[] = [];\n for (let i = 0; i < points.length - 1; i++) {\n const start = points[i]!;\n const end = points[i + 1]!;\n if (end <= start) continue;\n out.push({ start, text: text.slice(start, end), marked: highlights.some((h) => h.start <= start && h.end >= end) });\n }\n return out;\n}\n\n/** The offset within `root`'s text of a DOM position inside it. */\nfunction textOffset(root: Node, node: Node, offset: number): number {\n const range = document.createRange();\n range.selectNodeContents(root);\n range.setEnd(node, offset);\n return range.toString().length;\n}\n\nfunction TextHighlightsField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const hosted = useSourceText();\n const own = typeof binding.field.props?.text === \"string\" ? binding.field.props.text : \"\";\n const text = hosted ?? own;\n const maxHighlights =\n typeof binding.field.props?.maxHighlights === \"number\" ? binding.field.props.maxHighlights : 20;\n const highlights = (Array.isArray(binding.value) ? binding.value : []).flatMap((v) => {\n const h = toHighlight(v);\n return h ? [h] : [];\n });\n const entries = useEntryKeys(highlights.length);\n const textRef = useRef<HTMLParagraphElement>(null);\n const noteRef = useRef<HTMLTextAreaElement>(null);\n const toggleRef = useRef<HTMLButtonElement>(null);\n const [selection, setSelection] = useState<{ start: number; end: number } | null>(null);\n const [typing, setTyping] = useState(false);\n const [passage, setPassage] = useState(\"\");\n const [note, setNote] = useState(\"\");\n const full = highlights.length >= maxHighlights;\n const save = (next: Highlight[]) => binding.setValue(next.length ? (next as unknown as Json) : undefined);\n const hintId = useId();\n\n // The keyboard way: the first place the typed passage appears.\n const typed = passage.trim();\n const found = typing && typed ? text.indexOf(typed) : -1;\n const draft = typing ? (found >= 0 ? { start: found, end: found + typed.length } : null) : selection;\n\n const draftKey = draft ? `${draft.start}:${draft.end}` : \"\";\n const wasSelection = useRef(false);\n useEffect(() => {\n // A new selection moves focus to its note; a typed passage keeps focus where the typing is.\n if (draftKey && wasSelection.current) noteRef.current?.focus();\n }, [draftKey]);\n\n const readSelection = () => {\n const root = textRef.current;\n const sel = typeof window === \"undefined\" ? null : window.getSelection();\n if (!root || !sel || sel.rangeCount === 0 || sel.isCollapsed || full) return;\n const range = sel.getRangeAt(0);\n if (!root.contains(range.startContainer) || !root.contains(range.endContainer)) return;\n let start = textOffset(root, range.startContainer, range.startOffset);\n let end = textOffset(root, range.endContainer, range.endOffset);\n if (start > end) [start, end] = [end, start];\n // Leave out the spaces a double-click or drag picks up at the edges.\n while (start < end && /\\s/.test(text[start]!)) start++;\n while (end > start && /\\s/.test(text[end - 1]!)) end--;\n if (end <= start) return;\n wasSelection.current = true;\n setTyping(false);\n setSelection({ start, end });\n };\n\n const reset = () => {\n setSelection(null);\n setPassage(\"\");\n setNote(\"\");\n setTyping(false);\n wasSelection.current = false;\n };\n const commit = () => {\n if (!draft || !note.trim() || full) return;\n const h: Highlight = { start: draft.start, end: draft.end, quote: text.slice(draft.start, draft.end), note: note.trim() };\n const at = highlights.findIndex((x) => x.start > h.start);\n const index = at === -1 ? highlights.length : at;\n entries.insert(index);\n save([...highlights.slice(0, index), h, ...highlights.slice(index)]);\n reset();\n window.getSelection?.()?.removeAllRanges();\n toggleRef.current?.focus();\n };\n\n if (!text) {\n return (\n <FieldChrome props={props}>\n <p className=\"text-sm text-muted-foreground\">There is no passage to highlight.</p>\n </FieldChrome>\n );\n }\n\n return (\n <FieldChrome props={props}>\n <Stack gap=\"md\">\n <p\n ref={textRef}\n id={`${inputId}-text`}\n aria-describedby={hintId}\n className=\"m-0 whitespace-pre-wrap rounded-md border border-input bg-muted/30 p-3 text-base leading-relaxed\"\n onMouseUp={readSelection}\n onTouchEnd={readSelection}\n onKeyUp={readSelection}\n >\n {segments(text, highlights).map((s) =>\n s.marked ? (\n <mark key={s.start} className=\"rounded-sm bg-primary/20 text-foreground\">\n {s.text}\n </mark>\n ) : (\n <span key={s.start}>{s.text}</span>\n ),\n )}\n </p>\n <p id={hintId} className=\"m-0 text-sm text-muted-foreground\">\n {full\n ? `You've added the most highlights this question takes (${maxHighlights}).`\n : \"Select words in the passage to highlight them, or use Highlight a passage to type them.\"}\n </p>\n {!full ? (\n <Button\n ref={toggleRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n aria-expanded={typing}\n onClick={() => {\n setSelection(null);\n wasSelection.current = false;\n setTyping((t) => !t);\n }}\n >\n Highlight a passage\n </Button>\n ) : null}\n {typing && !full ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor={`${inputId}-passage`}>Passage</Label>\n <Input\n id={`${inputId}-passage`}\n value={passage}\n aria-describedby={`${inputId}-passage-hint`}\n aria-invalid={typed && found < 0 ? true : undefined}\n onChange={(e) => setPassage(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (found >= 0) noteRef.current?.focus();\n }\n }}\n />\n <p id={`${inputId}-passage-hint`} className=\"m-0 text-sm text-muted-foreground\">\n {typed && found < 0 ? \"Not found in the passage. Type the words exactly as they appear.\" : \"Type the words exactly as they appear.\"}\n </p>\n </div>\n ) : null}\n {draft && !full ? (\n <div role=\"group\" aria-label=\"New highlight\" className=\"space-y-2 rounded-md border border-input p-3\">\n <blockquote className=\"m-0 border-l-2 border-primary pl-3 text-sm\">\n <mark className=\"bg-primary/20 text-foreground\">{text.slice(draft.start, draft.end)}</mark>\n </blockquote>\n <Label htmlFor={`${inputId}-note`}>Your note</Label>\n <Textarea\n ref={noteRef}\n id={`${inputId}-note`}\n rows={2}\n maxLength={1000}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n <Stack direction=\"row\" gap=\"sm\">\n <Button type=\"button\" size=\"sm\" disabled={!note.trim()} onClick={commit}>\n Highlight\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={reset}>\n Cancel\n </Button>\n </Stack>\n </div>\n ) : null}\n {highlights.length ? (\n <ol aria-label={`${binding.label}: highlights`} className=\"m-0 list-none space-y-3 p-0\">\n {highlights.map((h, index) => {\n const name = `“${excerpt(h.quote)}”`;\n return (\n <li key={entries.keys[index]} className=\"space-y-1.5\">\n <blockquote className=\"m-0 border-l-2 border-primary pl-3 text-sm\">{h.quote}</blockquote>\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n <Input\n aria-label={`Note on ${name}`}\n aria-invalid={invalid(props) || (h.note.trim() ? undefined : true)}\n maxLength={1000}\n value={h.note}\n onChange={(e) => save(highlights.map((x, j) => (j === index ? { ...x, note: e.target.value } : x)))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.preventDefault();\n }}\n />\n <RemoveButton\n label={`Remove highlight ${name}`}\n onClick={() => {\n entries.remove(index);\n save(highlights.filter((_, j) => j !== index));\n toggleRef.current?.focus();\n }}\n />\n </Stack>\n </li>\n );\n })}\n </ol>\n ) : null}\n </Stack>\n </FieldChrome>\n );\n}\n\nexport const structuredRenderers: RendererEntry[] = [\n { type: \"list\", Component: ListField },\n { type: \"table\", Component: TableField },\n { type: \"media-notes\", Component: MediaNotesField },\n { type: \"text-highlights\", Component: TextHighlightsField },\n];\n","import { createContext, useContext } from \"react\";\nimport type { FieldBlock, PhotoRef } from \"@marktiderman/genesis-forms\";\n\n/**\n * Where a form's files go. The host stores each file (its own bucket, its own\n * rules) and resolves to a reference, which is all the answer keeps; a\n * rejection is shown under the field. `photo` fields read it.\n */\nexport interface UploadHost {\n upload(file: File, field: FieldBlock): Promise<PhotoRef>;\n /** A link to read a stored file (the host's storage signs it), or null when it can't be read. */\n url?(ref: PhotoRef, field?: FieldBlock): Promise<string | null>;\n}\n\n/** Provide it around `<Form>` (or pass `onUpload`) so `photo` fields can store files. */\nexport const UploadContext = createContext<UploadHost | null>(null);\n\n/** The enclosing `UploadContext` value, or null when no host stores files. */\nexport function useUpload(): UploadHost | null {\n return useContext(UploadContext);\n}\n\n/** What `<Form>` asks while a file is on its way: it neither moves on nor sends until every one is done. */\nexport interface PendingUploads {\n /** Call when an upload starts; call the function it returns once it ends (it counts once). */\n start(): () => void;\n count(): number;\n}\n\nexport const PendingUploadsContext = createContext<PendingUploads | null>(null);\n\n/** A fresh counter of uploads in flight. */\nexport function createPendingUploads(): PendingUploads {\n let n = 0;\n return {\n start() {\n n++;\n let done = false;\n return () => {\n if (done) return;\n done = true;\n n--;\n };\n },\n count: () => n,\n };\n}\n\n/** Said when the respondent tries to move on or send while a photo is still uploading. */\nexport const UPLOAD_WAIT_MESSAGE = \"Wait for the photo to finish uploading.\";\n","/**\n * The `photo` renderer: choose a photo (or, on a phone or tablet, take one),\n * see it as a thumbnail, remove it. The file goes to the host's `upload`\n * (`UploadContext`, or `onUpload` on `<Form>`); the answer keeps only the\n * reference the host returns. Type, size and count are checked here first,\n * so a respondent hears why at once; the host's server checks them again.\n */\nimport { useContext, useEffect, useRef, useState, type ChangeEvent } from \"react\";\nimport { Button } from \"@marktiderman/genesis-ui/button\";\nimport { FormError } from \"@marktiderman/genesis-ui/form-field\";\nimport { Input } from \"@marktiderman/genesis-ui/input\";\nimport { Spinner } from \"@marktiderman/genesis-ui/spinner\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport {\n isPhotoRef,\n photoCountMessage,\n photoLimits,\n photoRefs,\n photoSizeMessage,\n photoTypeMessage,\n type FieldBlock,\n type PhotoRef,\n} from \"@marktiderman/genesis-forms\";\nimport { useFormSelector, type FieldRendererProps, type RendererEntry } from \"@marktiderman/genesis-forms-react\";\nimport { FieldChrome } from \"./chrome\";\nimport { PendingUploadsContext, useUpload } from \"./upload\";\n\nfunction CameraIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\" />\n <circle cx=\"12\" cy=\"13\" r=\"3\" />\n </svg>\n );\n}\n\nfunction ImageIcon({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className={className}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.1-3.1a2 2 0 0 0-2.8 0L6 21\" />\n </svg>\n );\n}\n\nfunction XIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nconst HEIC_NAME = /\\.hei[cf]$/i;\n\n/** The file's type as the field judges it: some browsers give a HEIC photo no type, so its name decides. */\nexport function photoFileType(file: { name: string; type: string }): string {\n const type = file.type.toLowerCase();\n if (type) return type;\n return HEIC_NAME.test(file.name) ? (file.name.toLowerCase().endsWith(\".heif\") ? \"image/heif\" : \"image/heic\") : \"\";\n}\n\n/** Why a picked file can't be added, or null when it can. */\nexport function photoFileProblem(field: FieldBlock, file: { name: string; type: string; size: number }): string | null {\n const limits = photoLimits(field);\n if (!limits.mimeTypes.includes(photoFileType(file))) return photoTypeMessage(field);\n if (file.size <= 0 || file.size > limits.maxBytes) return photoSizeMessage(field);\n return null;\n}\n\n/** The `accept` attribute for a field: its MIME types, plus HEIC's file names for browsers that give it no type. */\nexport function photoAccept(field: FieldBlock): string {\n const limits = photoLimits(field);\n return [...limits.mimeTypes, ...(limits.formats.includes(\"heic\") ? [\".heic\", \".heif\"] : [])].join(\",\");\n}\n\ninterface Uploading {\n key: string;\n name: string;\n preview: string | null;\n}\n\n/** The thumbnail of one photo: its picture when there is a preview the browser can draw, else its name. */\nfunction Tile({ name, preview, busy }: { name: string; preview: string | null; busy?: boolean }) {\n const [failed, setFailed] = useState(false);\n return (\n <div className=\"relative size-24 overflow-hidden rounded-md border bg-muted sm:size-28\">\n {preview && !failed ? (\n <img src={preview} alt={name} className={cn(\"size-full object-cover\", busy && \"opacity-60\")} onError={() => setFailed(true)} />\n ) : (\n <div className=\"flex size-full flex-col items-center justify-center gap-1 p-2 text-center text-xs text-muted-foreground\">\n <ImageIcon className=\"size-6\" />\n <span className=\"line-clamp-2 break-all\">{name}</span>\n </div>\n )}\n {busy ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner size=\"sm\" aria-hidden=\"true\" />\n </div>\n ) : null}\n </div>\n );\n}\n\nlet nextKey = 0;\n\nfunction PhotoField(props: FieldRendererProps) {\n const { binding, inputId, engine } = props;\n const { field } = binding;\n const host = useUpload();\n const pending = useContext(PendingUploadsContext);\n const locked = useFormSelector(engine, (s) => s.status === \"completed\");\n const limits = photoLimits(field);\n const refs = photoRefs(binding.value);\n const [uploading, setUploading] = useState<Uploading[]>([]);\n const [problem, setProblem] = useState<string | null>(null);\n const [coarse, setCoarse] = useState(false);\n // Previews of photos picked here, by reference id; revoked when removed or unmounted.\n const previews = useRef(new Map<string, string>());\n // Uploads still counted as in flight, released on unmount so a form left mid-upload can still send.\n const releases = useRef(new Set<() => void>());\n // An upload can finish after unmount: its preview is then revoked, not kept.\n const mounted = useRef(true);\n const chooseRef = useRef<HTMLInputElement>(null);\n const takeRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n setCoarse(typeof window !== \"undefined\" && !!window.matchMedia?.(\"(pointer: coarse)\").matches);\n }, []);\n\n useEffect(() => {\n const urls = previews.current;\n const pendingReleases = releases.current;\n mounted.current = true;\n return () => {\n mounted.current = false;\n for (const url of urls.values()) URL.revokeObjectURL(url);\n urls.clear();\n for (const release of pendingReleases) release();\n pendingReleases.clear();\n };\n }, []);\n\n const currentRefs = () => photoRefs(engine.getState().values[field.id]);\n const full = refs.length + uploading.length >= limits.maxFiles;\n const disabled = !host || locked;\n\n const add = (files: File[]) => {\n if (!host) return;\n setProblem(null);\n let room = limits.maxFiles - currentRefs().length - uploading.length;\n for (const file of files) {\n if (room <= 0) {\n setProblem(photoCountMessage(field));\n break;\n }\n const why = photoFileProblem(field, file);\n if (why) {\n setProblem(why);\n continue;\n }\n room--;\n const key = `u${nextKey++}`;\n const preview = typeof URL.createObjectURL === \"function\" ? URL.createObjectURL(file) : null;\n setUploading((list) => [...list, { key, name: file.name, preview }]);\n const release = pending?.start() ?? (() => {});\n releases.current.add(release);\n const finish = () => {\n release();\n releases.current.delete(release);\n setUploading((list) => list.filter((u) => u.key !== key));\n };\n // Through a promise, so an upload that throws before returning one is caught too.\n Promise.resolve()\n .then(() => host.upload(file, field))\n .then((ref: PhotoRef) => {\n if (!isPhotoRef(ref)) throw new Error(\"The upload returned no photo reference.\");\n if (preview) {\n const old = previews.current.get(ref.id);\n if (old && old !== preview) URL.revokeObjectURL(old);\n if (mounted.current) previews.current.set(ref.id, preview);\n else URL.revokeObjectURL(preview);\n }\n const next = [...currentRefs().filter((r) => r.id !== ref.id), { id: ref.id, name: ref.name, type: ref.type, size: ref.size }];\n binding.setValue(next);\n finish();\n })\n .catch(() => {\n if (preview) URL.revokeObjectURL(preview);\n setProblem(`“${file.name}” didn't upload. Try again.`);\n finish();\n });\n }\n };\n\n const onPick = (e: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files ?? []);\n // Cleared, so picking the same file again after removing it still fires.\n e.target.value = \"\";\n add(files);\n };\n\n const remove = (ref: PhotoRef) => {\n const url = previews.current.get(ref.id);\n if (url) URL.revokeObjectURL(url);\n previews.current.delete(ref.id);\n const next = currentRefs().filter((r) => r.id !== ref.id);\n binding.setValue(next.length ? next : undefined);\n setProblem(null);\n };\n\n const accept = photoAccept(field);\n const errorId = `${inputId}-upload-error`;\n const hasAny = refs.length > 0 || uploading.length > 0;\n\n return (\n <FieldChrome props={props}>\n <div className=\"space-y-3\">\n {hasAny ? (\n <ul className=\"flex flex-wrap gap-3\" aria-label=\"Photos\">\n {refs.map((ref) => (\n <li key={ref.id} className=\"relative\">\n <Tile name={ref.name} preview={previews.current.get(ref.id) ?? null} />\n {locked ? null : (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"icon\"\n aria-label={`Remove ${ref.name}`}\n onClick={() => remove(ref)}\n className=\"absolute right-1 top-1 size-7 rounded-full shadow-sm\"\n >\n <XIcon />\n </Button>\n )}\n </li>\n ))}\n {uploading.map((u) => (\n <li key={u.key} aria-label={`Uploading ${u.name}`}>\n <Tile name={u.name} preview={u.preview} busy />\n </li>\n ))}\n </ul>\n ) : null}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled || full}\n aria-invalid={binding.error ? true : undefined}\n onClick={() => chooseRef.current?.click()}\n >\n <ImageIcon /> {refs.length ? \"Add another photo\" : \"Choose a photo\"}\n </Button>\n {coarse ? (\n <Button type=\"button\" variant=\"outline\" disabled={disabled || full} onClick={() => takeRef.current?.click()}>\n <CameraIcon /> Take a photo\n </Button>\n ) : null}\n </div>\n <Input\n ref={chooseRef}\n type=\"file\"\n accept={accept}\n multiple={limits.maxFiles > 1}\n className=\"hidden\"\n tabIndex={-1}\n aria-hidden=\"true\"\n disabled={disabled}\n onChange={onPick}\n />\n <Input\n ref={takeRef}\n type=\"file\"\n accept={accept}\n capture=\"environment\"\n className=\"hidden\"\n tabIndex={-1}\n aria-hidden=\"true\"\n disabled={disabled}\n onChange={onPick}\n />\n {!host ? (\n <p className=\"text-sm text-muted-foreground\">Photos can't be added here.</p>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n {`Up to ${limits.maxFiles} ${limits.maxFiles === 1 ? \"photo\" : \"photos\"}, ${limits.maxSizeMb} MB each.`}\n </p>\n )}\n {problem ? (\n <FormError id={errorId} role=\"alert\">\n {problem}\n </FormError>\n ) : null}\n </div>\n </FieldChrome>\n );\n}\n\nexport const photoRenderers: RendererEntry[] = [{ type: \"photo\", Component: PhotoField }];\n","import { useState } from \"react\";\nimport { Command, CommandEmpty, CommandInput, CommandItem, CommandList } from \"@marktiderman/genesis-ui/command\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport { searchOptions, type ChoiceOption } from \"@marktiderman/genesis-forms\";\nimport type { FieldRendererProps } from \"@marktiderman/genesis-forms-react\";\nimport { useFormPresentation } from \"./presentation\";\n\n/** A small picture beside an option's label: decorative, since the label says what it is. */\nexport function OptionImage({ src, large }: { src: string; large?: boolean }) {\n return (\n <img\n src={src}\n alt=\"\"\n loading=\"lazy\"\n data-gf-option-image=\"\"\n className={cn(\"shrink-0 rounded-md bg-muted object-cover\", large ? \"size-12\" : \"size-10\")}\n />\n );\n}\n\n/** An option's label with its description as a muted line under it. */\nexport function OptionText({ label, description }: { label: string; description?: string | undefined }) {\n return (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span>{label}</span>\n {description ? (\n <span className=\"text-sm text-muted-foreground\" data-gf-option-description=\"\">\n {description}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction CheckMark({ on }: { on: boolean }) {\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={cn(\"size-4 shrink-0 text-primary\", on ? \"opacity-100\" : \"opacity-0\")}\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\n/** The value of the \"Other\" row in the list: never stored. */\nexport const SEARCH_OTHER_VALUE = \"\\u0000other\";\n\n/**\n * A long option list with a search box over it (genesis-ui `Command`): typing narrows the list\n * (`searchOptions`, the same match on every platform), arrow keys move through it, and Enter or a\n * tap picks. One pick for a single choice or dropdown, several for a multiple choice. It sits in\n * the page rather than a popover, so it works the same in classic and focus layouts and on a\n * phone. `selected` holds the values picked; `onPick` gets the value tapped (or\n * `SEARCH_OTHER_VALUE` for the \"Other\" row).\n */\nexport function SearchableOptions({\n props,\n options,\n selected,\n multiple,\n otherLabel,\n otherOn,\n onPick,\n}: {\n props: FieldRendererProps;\n options: readonly ChoiceOption[];\n selected: readonly string[];\n multiple: boolean;\n otherLabel?: string | undefined;\n otherOn?: boolean | undefined;\n onPick: (value: string) => void;\n}) {\n const { binding, inputId } = props;\n const [query, setQuery] = useState(\"\");\n const { presentation } = useFormPresentation();\n const page = presentation === \"page\";\n const shown = searchOptions(options, query);\n const chosen = options.filter((o) => selected.includes(o.value));\n const labelOf = (o: ChoiceOption) => o.label ?? o.value;\n return (\n <div\n className=\"space-y-2\"\n data-gf-searchable=\"\"\n // Enter in the search box picks the highlighted option (the list handles it first); it must\n // never also send the form, as Enter in a text box would.\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && (e.target as HTMLElement).tagName === \"INPUT\") e.preventDefault();\n }}\n >\n <Command shouldFilter={false} label={binding.label} className=\"rounded-md border border-input bg-background\">\n <CommandInput\n id={inputId}\n data-gf-focus=\"\"\n value={query}\n onValueChange={setQuery}\n placeholder=\"Type to search\"\n aria-label={`Search: ${binding.label}`}\n aria-invalid={binding.error ? true : undefined}\n aria-required={binding.field.required || undefined}\n className={cn(page && \"text-base\")}\n />\n <CommandList className=\"max-h-72\" aria-multiselectable={multiple || undefined}>\n <CommandEmpty>No matches.</CommandEmpty>\n {shown.map((o) => {\n const on = selected.includes(o.value);\n return (\n <CommandItem\n key={o.value}\n value={o.value}\n keywords={[labelOf(o)]}\n aria-checked={on}\n onSelect={() => onPick(o.value)}\n className={cn(\"min-h-11 gap-3 text-base\", page && \"min-h-12\")}\n data-gf-option={o.value}\n >\n <CheckMark on={on} />\n {o.image ? <OptionImage src={o.image} /> : null}\n <OptionText label={labelOf(o)} description={o.description} />\n </CommandItem>\n );\n })}\n {otherLabel ? (\n <CommandItem\n value={SEARCH_OTHER_VALUE}\n aria-checked={!!otherOn}\n onSelect={() => onPick(SEARCH_OTHER_VALUE)}\n className={cn(\"min-h-11 gap-3 text-base\", page && \"min-h-12\")}\n >\n <CheckMark on={!!otherOn} />\n <OptionText label={otherLabel} />\n </CommandItem>\n ) : null}\n </CommandList>\n </Command>\n {chosen.length ? (\n <p className=\"text-sm text-muted-foreground\" aria-live=\"polite\" data-gf-chosen=\"\">\n {multiple ? \"Chosen\" : \"Your choice\"}: {chosen.map(labelOf).join(\", \")}\n </p>\n ) : null}\n </div>\n );\n}\n","import { useEffect, useRef, useState, type KeyboardEvent } from \"react\";\nimport { Checkbox } from \"@marktiderman/genesis-ui/checkbox\";\nimport { Input } from \"@marktiderman/genesis-ui/input\";\nimport { Label } from \"@marktiderman/genesis-ui/label\";\nimport { RadioGroup, RadioGroupItem } from \"@marktiderman/genesis-ui/radio-group\";\nimport { Textarea } from \"@marktiderman/genesis-ui/textarea\";\nimport { cn } from \"@marktiderman/genesis-ui/utils\";\nimport {\n choiceOptions,\n dateLimits,\n getFieldType,\n isSearchable,\n numberLimits,\n otherOption,\n OTHER_MAX_LENGTH,\n ratingDisplay,\n scaleLabels,\n type Json,\n} from \"@marktiderman/genesis-forms\";\nimport {\n createRendererRegistry,\n useChoiceOptions,\n type FieldRendererProps,\n type RendererEntry,\n} from \"@marktiderman/genesis-forms-react\";\nimport { useFormPresentation } from \"./presentation\";\nimport { describedBy, FieldChrome } from \"./chrome\";\nimport { calculatedRenderers } from \"./calculated\";\nimport { structuredRenderers } from \"./structured\";\nimport { photoRenderers } from \"./photo\";\nimport { OptionImage, OptionText, SearchableOptions, SEARCH_OTHER_VALUE } from \"./searchable\";\n\nexport { describedBy, FieldChrome, type FieldChromeProps } from \"./chrome\";\n\n/** The ARIA a radio group root needs to be named by the legend and report its state. */\nfunction groupAria(props: FieldRendererProps) {\n return {\n \"aria-labelledby\": `${props.inputId}-label`,\n \"aria-required\": props.binding.field.required || undefined,\n \"aria-invalid\": props.binding.error ? true : undefined,\n } as const;\n}\n\n// ── Deliberate picks ─────────────────────────────────────────────────────────\n\nconst NAVIGATION_KEYS = new Set([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\"]);\n/** Radix checks the newly focused radio a tick after the key, so allow a short window. */\nconst NAVIGATION_WINDOW_MS = 500;\n\n/**\n * A radio group checks whichever option arrow keys move to (WAI-ARIA APG),\n * and Radix does it by clicking that option. Only a pick the respondent meant\n * (a click or tap, Space, Enter, assistive tech activating it) may advance,\n * so this remembers whether a navigation key just went down and ignores the\n * click it causes. Clicking the option that is already checked still counts,\n * so after Back a respondent can confirm the same answer and move on.\n */\nfunction useDeliberatePick(onAdvance: (() => void) | undefined) {\n const lastKey = useRef<{ key: string; at: number } | null>(null);\n return {\n rootProps: {\n onKeyDownCapture: (e: KeyboardEvent) => {\n lastKey.current = { key: e.key, at: Date.now() };\n },\n onPointerDownCapture: () => {\n lastKey.current = null;\n },\n },\n onItemClick: () => {\n const last = lastKey.current;\n const navigating = last && NAVIGATION_KEYS.has(last.key) && Date.now() - last.at < NAVIGATION_WINDOW_MS;\n if (!navigating) onAdvance?.();\n },\n };\n}\n\n// ── Renderers ────────────────────────────────────────────────────────────────\n\nfunction TextField(\n props: FieldRendererProps & {\n type?: string;\n multiline?: boolean;\n inputMode?: \"text\" | \"email\" | \"tel\";\n /** Used when the field type's manifest names no autocomplete token. */\n autoComplete?: string;\n },\n) {\n const { binding, inputId, type = \"text\", multiline, inputMode, autoComplete } = props;\n const manifest = getFieldType(binding.field.type);\n const { presentation, layout } = useFormPresentation();\n const pageFocus = presentation === \"page\" && layout === \"focus\";\n const common = {\n id: inputId,\n value: typeof binding.value === \"string\" ? binding.value : \"\",\n placeholder: binding.field.placeholder ?? (pageFocus ? \"Type your answer here…\" : undefined),\n // Page focus: a large underlined answer line, Typeform style. The underline turns primary on focus.\n className: pageFocus\n ? \"h-auto rounded-none border-0 border-b-2 border-input bg-transparent px-0 py-2 text-xl shadow-none md:text-2xl sm:text-2xl placeholder:text-muted-foreground/70 focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-offset-0 aria-invalid:border-destructive\"\n : presentation === \"page\"\n ? \"h-11 md:text-base\"\n : undefined,\n // The focus layout focuses the input itself, so a respondent can type straight away.\n \"data-gf-focus\": \"\",\n \"aria-invalid\": binding.error ? true : undefined,\n \"aria-required\": binding.field.required || undefined,\n \"aria-describedby\": describedBy(props),\n } as const;\n return (\n <FieldChrome props={props}>\n {multiline ? (\n <Textarea\n {...common}\n rows={pageFocus ? 1 : 4}\n className={cn(common.className, pageFocus && \"min-h-12 resize-none\")}\n onChange={(e) => binding.setValue(e.target.value)}\n />\n ) : (\n <Input\n {...common}\n type={type}\n inputMode={manifest?.a11y.inputMode ?? inputMode}\n autoComplete={manifest?.a11y.autocomplete ?? autoComplete}\n onChange={(e) => binding.setValue(e.target.value)}\n />\n )}\n </FieldChrome>\n );\n}\n\ninterface ButtonOption {\n value: string;\n label: string;\n /** Id of extra text read with this option (the NPS end labels). */\n describedBy?: string;\n}\n\n/**\n * A radio group drawn as a row of buttons (rating, NPS, yes/no). It is a real\n * `radiogroup`: Tab enters it once, arrows move and select, Space selects.\n */\nfunction ButtonRadioGroup({\n props,\n options,\n value,\n onValueChange,\n itemClassName,\n}: {\n props: FieldRendererProps;\n options: ButtonOption[];\n value: string;\n onValueChange: (value: string) => void;\n itemClassName?: string;\n}) {\n const pick = useDeliberatePick(props.onAdvance);\n const { presentation, layout } = useFormPresentation();\n const page = presentation === \"page\";\n // Tall targets when there's room; a long scale (NPS) or a classic page stays squarer.\n const size = layout === \"classic\" ? \"h-12\" : options.length <= 6 ? \"h-14 sm:h-16\" : \"h-14\";\n return (\n <RadioGroup\n {...groupAria(props)}\n {...pick.rootProps}\n value={value}\n onValueChange={onValueChange}\n // Page mode: an even grid of large targets that fills the column.\n className={page ? cn(\"grid gap-2\", options.length <= 6 && \"sm:gap-3\", gridColumns(options.length)) : \"flex flex-wrap justify-start gap-2\"}\n >\n {options.map((o) => (\n <div key={o.value} className=\"relative\">\n <RadioGroupItem\n value={o.value}\n aria-label={o.label}\n aria-describedby={o.describedBy}\n onClick={pick.onItemClick}\n className={cn(\n \"peer h-11 w-11 aspect-auto rounded-md border-input bg-background shadow-sm transition-colors hover:bg-accent motion-reduce:transition-none\",\n page && cn(size, \"w-full rounded-lg border-primary/30 bg-primary/5 shadow-none hover:bg-primary/10\"),\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:hover:bg-primary\",\n \"[&_svg]:hidden\",\n page ? undefined : itemClassName,\n )}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 flex items-center justify-center text-base font-medium peer-disabled:opacity-50 peer-data-[state=checked]:text-primary-foreground\",\n page && \"text-lg font-semibold\",\n )}\n >\n {o.label}\n </span>\n </div>\n ))}\n </RadioGroup>\n );\n}\n\n// Spelled out so Tailwind's scanner sees every class. Phones get at most six\n// columns (NPS wraps 0–5 / 6–10); from `sm` every option sits in one row.\nconst PHONE_COLUMNS: Record<number, string> = {\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n 7: \"grid-cols-4\",\n 8: \"grid-cols-4\",\n 9: \"grid-cols-5\",\n 10: \"grid-cols-5\",\n 11: \"grid-cols-6\",\n};\nconst WIDE_COLUMNS: Record<number, string> = {\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n 7: \"sm:grid-cols-7\",\n 8: \"sm:grid-cols-8\",\n 9: \"sm:grid-cols-9\",\n 10: \"sm:grid-cols-10\",\n 11: \"sm:grid-cols-11\",\n};\nfunction gridColumns(count: number): string {\n return cn(PHONE_COLUMNS[count] ?? \"grid-cols-6\", WIDE_COLUMNS[count] ?? \"sm:grid-cols-11\");\n}\n\nfunction scaleValues(type: string, max: number): number[] {\n if (type === \"nps\") return Array.from({ length: 11 }, (_, i) => i);\n return Array.from({ length: max }, (_, i) => i + 1);\n}\n\n/** The words under a scale's ends: the field's `lowLabel` / `highLabel`, else NPS's defaults. */\nfunction endLabels(props: FieldRendererProps): { low?: string; high?: string } {\n const own = scaleLabels(props.binding.field);\n if (props.binding.field.type !== \"nps\") return own;\n return { low: own.low ?? \"Not likely\", high: own.high ?? \"Very likely\" };\n}\n\n/** The end labels row; each label is read with its end option (`aria-describedby`). */\nfunction EndLabels({ inputId, low, high }: { inputId: string; low?: string | undefined; high?: string | undefined }) {\n if (!low && !high) return null;\n return (\n <div className=\"flex justify-between gap-4 text-sm text-muted-foreground\" data-gf-scale-labels=\"\">\n <span id={`${inputId}-low`}>{low ?? \"\"}</span>\n <span id={`${inputId}-high`} className=\"text-right\">\n {high ?? \"\"}\n </span>\n </div>\n );\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 { low, high } = endLabels(props);\n const stars = binding.field.type === \"rating\" && ratingDisplay(binding.field) === \"stars\";\n const describe = (i: number) =>\n low && i === 0 ? `${inputId}-low` : high && i === values.length - 1 ? `${inputId}-high` : undefined;\n const value = typeof binding.value === \"number\" ? String(binding.value) : \"\";\n const onValueChange = (v: string) => binding.setValue(Number(v));\n if (stars) {\n return (\n <FieldChrome props={props}>\n <StarRadioGroup props={props} values={values} value={value} onValueChange={onValueChange} describe={describe} />\n <EndLabels inputId={inputId} low={low} high={high} />\n </FieldChrome>\n );\n }\n const options = values.map((n, i) => ({ value: String(n), label: String(n), describedBy: describe(i) }));\n return (\n <FieldChrome props={props}>\n <ButtonRadioGroup props={props} options={options} value={value} onValueChange={onValueChange} />\n <EndLabels inputId={inputId} low={low} high={high} />\n </FieldChrome>\n );\n}\n\nfunction StarIcon({ filled }: { filled: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className={cn(\"size-8 transition-colors motion-reduce:transition-none\", filled ? \"fill-primary text-primary\" : \"fill-transparent text-muted-foreground\")}\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2.5l2.9 6.1 6.6.8-4.9 4.6 1.3 6.6L12 17.3l-5.9 3.3 1.3-6.6-4.9-4.6 6.6-.8z\" />\n </svg>\n );\n}\n\n/**\n * A rating drawn as stars. Still a real `radiogroup` (one radio per star,\n * named \"3 of 5\"); the stars up to the chosen one are filled.\n */\nfunction StarRadioGroup({\n props,\n values,\n value,\n onValueChange,\n describe,\n}: {\n props: FieldRendererProps;\n values: number[];\n value: string;\n onValueChange: (value: string) => void;\n describe: (index: number) => string | undefined;\n}) {\n const pick = useDeliberatePick(props.onAdvance);\n const chosen = value === \"\" ? 0 : Number(value);\n const max = values[values.length - 1] ?? 5;\n return (\n <RadioGroup\n {...groupAria(props)}\n {...pick.rootProps}\n value={value}\n onValueChange={onValueChange}\n className=\"flex flex-wrap justify-start gap-1\"\n data-gf-stars=\"\"\n >\n {values.map((n, i) => (\n <div key={n} className=\"relative\">\n <RadioGroupItem\n value={String(n)}\n aria-label={`${n} of ${max}`}\n aria-describedby={describe(i)}\n onClick={pick.onItemClick}\n className=\"peer size-11 aspect-auto rounded-md border-0 bg-transparent shadow-none hover:bg-accent data-[state=checked]:bg-transparent [&_svg]:hidden\"\n />\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 flex items-center justify-center peer-disabled:opacity-50\">\n <StarIcon filled={n <= chosen} />\n </span>\n </div>\n ))}\n </RadioGroup>\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 // Typing an \"Other\" answer: letters are text, not shortcuts.\n if ((e.target as HTMLElement).tagName === \"INPUT\") 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({\n look,\n index,\n label,\n description,\n image,\n}: {\n look: ChoiceLook;\n index: number;\n label: string;\n description?: string | undefined;\n image?: string | undefined;\n}) {\n if (!look.pageFocus) {\n return (\n <>\n {image ? <OptionImage src={image} /> : null}\n <OptionText label={label} description={description} />\n </>\n );\n }\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 {image ? <OptionImage src={image} large /> : null}\n <OptionText label={label} description={description} />\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\n/** The radio and select value of an \"Other\" option while it is picked: never stored. */\nconst OTHER_VALUE = \"\\u0000other\";\n\n/** The text box of an \"Other\" option: what the respondent types is the answer. */\nfunction OtherText({\n id,\n label,\n value,\n onChange,\n invalid,\n}: {\n id: string;\n label: string;\n value: string;\n onChange: (text: string) => void;\n invalid: boolean;\n}) {\n const line = useLineClass();\n return (\n <Input\n id={id}\n value={value}\n maxLength={OTHER_MAX_LENGTH}\n aria-label={`${label}: your answer`}\n aria-invalid={invalid || undefined}\n placeholder=\"Type your answer\"\n onChange={(e) => onChange(e.target.value)}\n className={cn(\"mt-2\", line)}\n />\n );\n}\n\n/** Puts the cursor in the \"Other\" box once it is shown. */\nconst focusSoon = (id: string) =>\n requestAnimationFrame(() => (document.getElementById(id) as HTMLInputElement | null)?.focus());\n\n/**\n * A question's typed \"Other\" answer, kept while the respondent switches between options, so\n * picking \"Other\" again brings back what they wrote. `typed` is the stored answer's text.\n */\nfunction useOtherText(typed: string) {\n const [on, setOn] = useState(typed !== \"\");\n const [text, setText] = useState(typed);\n return { on, setOn, text, setText };\n}\n\n/**\n * One pick from a long list, with a search box (`isSearchable`): a single choice or dropdown\n * over more options than `SEARCHABLE_OPTION_COUNT`, or one with `props.searchable: true`.\n */\nfunction SearchableSingleField(props: FieldRendererProps) {\n const { binding, onAdvance } = props;\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const current = typeof binding.value === \"string\" ? binding.value : \"\";\n const typed = other && current && !choiceOptions(binding.field).some((o) => o.value === current) ? current : \"\";\n const otherText = useOtherText(typed);\n const textId = `${props.inputId}-other-text`;\n return (\n <FieldChrome props={props}>\n <SearchableOptions\n props={props}\n options={options}\n selected={otherText.on ? [] : [current]}\n multiple={false}\n otherLabel={other?.label}\n otherOn={otherText.on}\n onPick={(v) => {\n if (v === SEARCH_OTHER_VALUE) {\n otherText.setOn(true);\n binding.setValue(otherText.text.trim() ? otherText.text : undefined);\n focusSoon(textId);\n return;\n }\n otherText.setOn(false);\n binding.setValue(v);\n onAdvance?.();\n }}\n />\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n binding.setValue(text.trim() ? text : undefined);\n }}\n />\n ) : null}\n </FieldChrome>\n );\n}\n\n/** Several picks from a long list, with a search box (`isSearchable`). */\nfunction SearchableMultiField(props: FieldRendererProps) {\n const { binding } = props;\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const selected = Array.isArray(binding.value) ? (binding.value as string[]) : [];\n const known = new Set(choiceOptions(binding.field).map((o) => o.value));\n const chosen = selected.filter((v) => known.has(v));\n const otherText = useOtherText(other ? (selected.find((v) => !known.has(v)) ?? \"\") : \"\");\n const textId = `${props.inputId}-other-text`;\n const commit = (picked: string[], otherOn: boolean, text: string) => {\n const next = otherOn && text.trim() ? [...picked, text] : picked;\n binding.setValue(next.length ? (next as Json) : undefined);\n };\n return (\n <FieldChrome props={props}>\n <SearchableOptions\n props={props}\n options={options}\n selected={chosen}\n multiple\n otherLabel={other?.label}\n otherOn={otherText.on}\n onPick={(v) => {\n if (v === SEARCH_OTHER_VALUE) {\n const on = !otherText.on;\n otherText.setOn(on);\n commit(chosen, on, otherText.text);\n if (on) focusSoon(textId);\n return;\n }\n commit(chosen.includes(v) ? chosen.filter((x) => x !== v) : [...chosen, v], otherText.on, otherText.text);\n }}\n />\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n commit(chosen, true, text);\n }}\n />\n ) : null}\n </FieldChrome>\n );\n}\n\n/**\n * Whether to draw a question's options with a search box: `isSearchable` over all its options,\n * not just those a filter shows now, so the control doesn't change while the respondent answers.\n */\nfunction useSearchable(props: FieldRendererProps): boolean {\n return isSearchable(props.binding.field);\n}\n\nfunction SingleChoiceField(props: FieldRendererProps) {\n return useSearchable(props) ? <SearchableSingleField {...props} /> : <SingleChoiceList {...props} />;\n}\n\nfunction SingleChoiceList(props: FieldRendererProps) {\n const { binding, inputId, onAdvance } = props;\n const pick = useDeliberatePick(onAdvance);\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const current = typeof binding.value === \"string\" ? binding.value : \"\";\n const typed = other && current && !choiceOptions(binding.field).some((o) => o.value === current) ? current : \"\";\n const otherText = useOtherText(typed);\n const look = useChoiceLook(inputId, options.length + (other ? 1 : 0));\n const textId = `${inputId}-other-text`;\n const choose = (v: string) => {\n if (v !== OTHER_VALUE) {\n otherText.setOn(false);\n binding.setValue(v);\n return;\n }\n otherText.setOn(true);\n binding.setValue(otherText.text.trim() ? otherText.text : undefined);\n focusSoon(textId);\n };\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={otherText.on ? OTHER_VALUE : current}\n onValueChange={choose}\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} description={o.description} image={o.image} />\n </Label>\n ))}\n {other ? (\n // No auto-advance: the respondent still has to type.\n <Label htmlFor={`${inputId}-${options.length}`} className={look.row}>\n <RadioGroupItem id={`${inputId}-${options.length}`} value={OTHER_VALUE} className={look.control} />\n <ChoiceContent look={look} index={options.length} label={other.label} />\n </Label>\n ) : null}\n </RadioGroup>\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n binding.setValue(text.trim() ? text : undefined);\n }}\n />\n ) : null}\n </FieldChrome>\n );\n}\n\nfunction MultiChoiceField(props: FieldRendererProps) {\n return useSearchable(props) ? <SearchableMultiField {...props} /> : <MultiChoiceList {...props} />;\n}\n\nfunction MultiChoiceList(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const selected = Array.isArray(binding.value) ? (binding.value as string[]) : [];\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const known = new Set(choiceOptions(binding.field).map((o) => o.value));\n const chosen = selected.filter((v) => known.has(v));\n const otherText = useOtherText(other ? (selected.find((v) => !known.has(v)) ?? \"\") : \"\");\n const look = useChoiceLook(inputId, options.length + (other ? 1 : 0));\n const textId = `${inputId}-other-text`;\n // The picked options, then the typed \"Other\" answer while it is ticked and not blank.\n const commit = (picked: string[], otherOn: boolean, text: string) => {\n const next = otherOn && text.trim() ? [...picked, text] : picked;\n binding.setValue(next.length ? (next as Json) : undefined);\n };\n const toggle = (value: string, on: boolean) =>\n commit(on ? [...chosen, value] : chosen.filter((v) => v !== value), otherText.on, otherText.text);\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} description={o.description} image={o.image} />\n </Label>\n ))}\n {other ? (\n <Label htmlFor={`${inputId}-${options.length}`} className={look.row}>\n <Checkbox\n id={`${inputId}-${options.length}`}\n checked={otherText.on}\n aria-invalid={binding.error ? true : undefined}\n onCheckedChange={(c) => {\n otherText.setOn(c === true);\n commit(chosen, c === true, otherText.text);\n if (c === true) focusSoon(textId);\n }}\n className={look.control}\n />\n <ChoiceContent look={look} index={options.length} label={other.label} />\n </Label>\n ) : null}\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n commit(chosen, true, text);\n }}\n />\n ) : null}\n </div>\n </FieldChrome>\n );\n}\n\n// ── Dropdown, number, date, consent ─────────────────────────────────────────\n\n/** The look of a one-line control: a large underlined line in page focus, a taller box on a page. */\nfunction useLineClass(): string | undefined {\n const { presentation, layout } = useFormPresentation();\n if (presentation === \"page\" && layout === \"focus\") {\n return \"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 focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-offset-0 aria-invalid:border-destructive\";\n }\n return presentation === \"page\" ? \"h-11 md:text-base\" : undefined;\n}\n\nfunction controlAria(props: FieldRendererProps) {\n return {\n id: props.inputId,\n \"data-gf-focus\": \"\",\n \"aria-invalid\": props.binding.error ? true : undefined,\n \"aria-required\": props.binding.field.required || undefined,\n \"aria-describedby\": describedBy(props),\n } as const;\n}\n\n/**\n * One option from a native `<select>`: compact for a long list, and the\n * phone's own picker on touch devices. Over more options than\n * `SEARCHABLE_OPTION_COUNT` (or with `props.searchable: true`) it is a\n * searchable list instead, which also shows descriptions and pictures.\n */\nfunction DropdownField(props: FieldRendererProps) {\n return useSearchable(props) ? <SearchableSingleField {...props} /> : <DropdownSelect {...props} />;\n}\n\nfunction DropdownSelect(props: FieldRendererProps) {\n const { binding } = props;\n const options = useChoiceOptions(props.engine, binding.field.id);\n const other = otherOption(binding.field);\n const line = useLineClass();\n const current = typeof binding.value === \"string\" ? binding.value : \"\";\n const typed = other && current && !choiceOptions(binding.field).some((o) => o.value === current) ? current : \"\";\n const otherText = useOtherText(typed);\n const value = otherText.on ? OTHER_VALUE : current;\n const textId = `${props.inputId}-other-text`;\n return (\n <FieldChrome props={props}>\n <select\n {...controlAria(props)}\n value={value}\n onChange={(e) => {\n const v = e.target.value;\n otherText.setOn(v === OTHER_VALUE);\n if (v === OTHER_VALUE) {\n binding.setValue(otherText.text.trim() ? otherText.text : undefined);\n focusSoon(textId);\n } else binding.setValue(v === \"\" ? undefined : v);\n }}\n className={cn(\n \"flex h-10 w-full min-w-0 rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm aria-invalid:border-destructive\",\n value === \"\" && \"text-muted-foreground\",\n line,\n )}\n >\n <option value=\"\">{binding.field.placeholder ?? \"Choose…\"}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label ?? o.value}\n </option>\n ))}\n {other ? <option value={OTHER_VALUE}>{other.label}</option> : null}\n </select>\n {other && otherText.on ? (\n <OtherText\n id={textId}\n label={other.label}\n value={otherText.text}\n invalid={!!binding.error}\n onChange={(text) => {\n otherText.setText(text);\n binding.setValue(text.trim() ? text : undefined);\n }}\n />\n ) : null}\n </FieldChrome>\n );\n}\n\n/**\n * A number, typed as text with the decimal keypad: what was typed is kept\n * while it is not a number yet (\"-\", \"1.\"), and stored as a number once it is.\n * Text that never becomes a number is kept as text, so validation says so.\n */\nfunction NumberField(props: FieldRendererProps) {\n const { binding } = props;\n const { min, max, step } = numberLimits(binding.field);\n const line = useLineClass();\n const shown = typeof binding.value === \"number\" ? String(binding.value) : typeof binding.value === \"string\" ? binding.value : \"\";\n const [text, setText] = useState(shown);\n // A value set from outside (Back, a prefill, a restart) replaces what was typed.\n useEffect(() => {\n setText((typed) => (typed.trim() !== \"\" && Number(typed.trim().replace(\",\", \".\")) === binding.value ? typed : shown));\n }, [shown, binding.value]);\n return (\n <FieldChrome props={props}>\n <Input\n {...controlAria(props)}\n type=\"text\"\n inputMode={min !== undefined && min >= 0 && (step === undefined || Number.isInteger(step)) ? \"numeric\" : \"decimal\"}\n autoComplete=\"off\"\n value={text}\n placeholder={binding.field.placeholder}\n className={line}\n onChange={(e) => {\n const raw = e.target.value;\n setText(raw);\n const t = raw.trim().replace(\",\", \".\");\n if (t === \"\") binding.setValue(undefined);\n else {\n const n = Number(t);\n binding.setValue(Number.isFinite(n) && /^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(t) ? n : raw);\n }\n }}\n />\n {min !== undefined || max !== undefined ? (\n <p className=\"text-sm text-muted-foreground\" data-gf-number-range=\"\">\n {min !== undefined && max !== undefined ? `From ${min} to ${max}` : min !== undefined ? `${min} or more` : `${max} or less`}\n </p>\n ) : null}\n </FieldChrome>\n );\n}\n\n/** A calendar day from the browser's own date picker, stored as `YYYY-MM-DD`. */\nfunction DateField(props: FieldRendererProps) {\n const { binding } = props;\n const { min, max } = dateLimits(binding.field);\n const line = useLineClass();\n return (\n <FieldChrome props={props}>\n <Input\n {...controlAria(props)}\n type=\"date\"\n min={min}\n max={max}\n value={typeof binding.value === \"string\" ? binding.value : \"\"}\n className={cn(\"w-full sm:w-auto sm:min-w-48\", line)}\n onChange={(e) => binding.setValue(e.target.value === \"\" ? undefined : e.target.value)}\n />\n </FieldChrome>\n );\n}\n\n/**\n * One checkbox to agree to something. The question is the legend; the\n * checkbox's own words are `props.text` (\"I agree to the terms\"), else \"I agree\".\n */\nfunction ConsentField(props: FieldRendererProps) {\n const { binding, inputId } = props;\n const text = typeof binding.field.props?.text === \"string\" && binding.field.props.text.trim() ? binding.field.props.text : \"I agree\";\n const look = useChoiceLook(inputId, 1);\n return (\n <FieldChrome props={props}>\n <Label htmlFor={`${inputId}-0`} className={look.row}>\n <Checkbox\n id={`${inputId}-0`}\n checked={binding.value === true}\n aria-invalid={binding.error ? true : undefined}\n aria-required={binding.field.required || undefined}\n onCheckedChange={(c) => binding.setValue(c === true ? true : undefined)}\n />\n <span>{props.engine.text(text)}</span>\n </Label>\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 { type: \"dropdown\", Component: DropdownField },\n { type: \"number\", Component: NumberField },\n { type: \"date\", Component: DateField },\n { type: \"consent\", Component: ConsentField },\n ...structuredRenderers,\n ...calculatedRenderers,\n ...photoRenderers,\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","/**\n * A form's own look: an accent colour and a header image. The accent becomes\n * the Genesis `--primary` (and `--ring`) inside the form, so every primary\n * surface follows it: buttons, selected options, stars, progress, focus rings.\n */\nexport interface FormTheme {\n /**\n * The accent colour, as `#rgb`, `#rrggbb` or `rgb(r, g, b)`, such as a\n * brand's colour. It is adjusted only as far as needed for contrast: at\n * least 3:1 against the page (light and dark), with text on it at least\n * 4.5:1 (white or near-black, whichever reads better). Anything else is ignored.\n */\n accent?: string | undefined;\n /** A banner image URL shown over the form's title. */\n headerImage?: string | undefined;\n /** The banner's text alternative. Default \"\" (decorative). */\n headerImageAlt?: string | undefined;\n}\n\n/** Shadcn HSL components (`\"221 83% 53%\"`), as Genesis tokens hold them. */\nexport interface ThemeColors {\n primary: string;\n primaryForeground: string;\n}\n\ntype Rgb = [number, number, number];\n\n/** `#rgb`, `#rrggbb` or `rgb(r, g, b)` (0–255); null for anything else. */\nfunction parseColor(value: string): Rgb | null {\n const v = value.trim().toLowerCase();\n let m = /^#([0-9a-f]{3})$/.exec(v);\n if (m) return [...m[1]!].map((c) => parseInt(c + c, 16)) as Rgb;\n m = /^#([0-9a-f]{6})$/.exec(v);\n if (m) return [0, 2, 4].map((i) => parseInt(m![1]!.slice(i, i + 2), 16)) as Rgb;\n m = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/.exec(v);\n if (m) {\n const rgb = [m[1], m[2], m[3]].map(Number) as Rgb;\n return rgb.every((c) => c <= 255) ? rgb : null;\n }\n return null;\n}\n\nfunction rgbToHsl([r, g, b]: Rgb): [number, number, number] {\n const [rn, gn, bn] = [r / 255, g / 255, b / 255];\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l * 100];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n const h = max === rn ? (gn - bn) / d + (gn < bn ? 6 : 0) : max === gn ? (bn - rn) / d + 2 : (rn - gn) / d + 4;\n return [h * 60, s * 100, l * 100];\n}\n\nfunction hslToRgb(h: number, s: number, l: number): Rgb {\n const sn = s / 100;\n const ln = l / 100;\n const k = (n: number) => (n + h / 30) % 12;\n const a = sn * Math.min(ln, 1 - ln);\n const f = (n: number) => ln - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n return [f(0), f(8), f(4)].map((x) => Math.round(x * 255)) as Rgb;\n}\n\n/** WCAG relative luminance. */\nfunction luminance([r, g, b]: Rgb): number {\n const c = (x: number) => {\n const n = x / 255;\n return n <= 0.03928 ? n / 12.92 : ((n + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * c(r) + 0.7152 * c(g) + 0.0722 * c(b);\n}\n\nfunction contrast(a: Rgb, b: Rgb): number {\n const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p) as [number, number];\n return (x + 0.05) / (y + 0.05);\n}\n\nconst WHITE: Rgb = [255, 255, 255];\n/** Genesis's dark background and dark foreground, `240 10% 3.9%`. */\nconst NEAR_BLACK: Rgb = hslToRgb(240, 10, 3.9);\nconst WHITE_HSL = \"0 0% 100%\";\nconst NEAR_BLACK_HSL = \"240 10% 3.9%\";\n\nconst fmt = (h: number, s: number, l: number) => `${Math.round(h)} ${Math.round(s)}% ${Math.round(l * 10) / 10}%`;\n\nfunction fit(h: number, s: number, l: number, page: Rgb, darken: boolean): ThemeColors {\n let light = l;\n // At least 3:1 with the page (WCAG 1.4.11: borders, icons, focus rings).\n for (let i = 0; i < 100 && contrast(hslToRgb(h, s, light), page) < 3; i++) light = Math.max(0, Math.min(100, light + (darken ? -1 : 1)));\n // Text on the accent at least 4.5:1: white or near-black, whichever is higher;\n // in the narrow middle where neither reaches it, lighten under near-black text.\n const best = () => {\n const rgb = hslToRgb(h, s, light);\n const white = contrast(rgb, WHITE);\n const dark = contrast(rgb, NEAR_BLACK);\n return white >= dark ? { ratio: white, fg: WHITE_HSL } : { ratio: dark, fg: NEAR_BLACK_HSL };\n };\n let pick = best();\n for (let i = 0; i < 100 && pick.ratio < 4.5; i++) {\n light = Math.min(100, light + 1);\n pick = { ratio: contrast(hslToRgb(h, s, light), NEAR_BLACK), fg: NEAR_BLACK_HSL };\n }\n return { primary: fmt(h, s, light), primaryForeground: pick.fg };\n}\n\n/**\n * The accent as Genesis primary colours for a light and a dark page, each\n * adjusted only as far as contrast needs. Null when `accent` is not a colour\n * this understands.\n */\nexport function themeColors(accent: string): { light: ThemeColors; dark: ThemeColors } | null {\n const rgb = parseColor(accent);\n if (!rgb) return null;\n const [h, s, l] = rgbToHsl(rgb);\n return { light: fit(h, s, l, WHITE, true), dark: fit(h, s, l, NEAR_BLACK, false) };\n}\n\n/** The CSS that applies `theme` to the elements matching `selector`, or \"\" when it changes no colour. */\nexport function themeCss(theme: FormTheme | undefined, selector: string): string {\n const colors = theme?.accent ? themeColors(theme.accent) : null;\n if (!colors) return \"\";\n const block = (c: ThemeColors) => `--primary: ${c.primary}; --primary-foreground: ${c.primaryForeground}; --ring: ${c.primary};`;\n return `${selector} { ${block(colors.light)} }\\n.dark ${selector}, ${selector}.dark { ${block(colors.dark)} }`;\n}\n","import {\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\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 {\n formProgress,\n type CreateFormOptions,\n type FieldBlock,\n type FormDefinition,\n type FormEngine,\n type FormProgress,\n type FormState,\n type HostOptions,\n type PhotoRef,\n respondentPath,\n type LinkParams,\n} 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\";\nimport { themeCss, type FormTheme } from \"./theme\";\nimport { createPendingUploads, PendingUploadsContext, UPLOAD_WAIT_MESSAGE, UploadContext, type PendingUploads } from \"./upload\";\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 /** `theme.headerImage`: a banner over the title. */\n image?: { src: string; alt: string } | undefined;\n /**\n * The note that marks required questions (\"Required\", drawn as \"* Required\"),\n * set when the form has at least one required question. Empty when it has none\n * or `requiredLabel` is null.\n */\n requiredNote?: string | undefined;\n className?: string;\n}\nexport interface BrandSlotProps {\n /** The organisation or business name, shown beside the logo. */\n name: string;\n /** An image URL or your own element. Without one, the name's initials are shown. */\n logo?: ReactNode;\n className?: string;\n}\nexport interface ProgressSlotProps {\n step: number;\n total: number;\n className?: string;\n}\nexport interface NavigationSlotProps {\n canGoBack: boolean;\n isLast: boolean;\n /** True while `onSubmit` is running. */\n busy: boolean;\n /** True after `onSubmit` failed. The answers are kept, and submitting again resends them. */\n failed: boolean;\n onBack: () => void;\n submitLabel: string;\n nextLabel: string;\n retryLabel: string;\n /**\n * The key that continues from this question (\"Enter ↵\", or \"Ctrl + Enter\" in\n * long text). Set in page presentation's focus layout; the default\n * navigation shows it only on devices with a fine pointer (mouse, trackpad).\n */\n keyHint?: string;\n className?: string;\n}\nexport interface EndingSlotProps {\n title: string;\n description?: string;\n /**\n * Buttons or links under the ending, such as \"Send another response\" or \"Change your\n * answers\": pass them through `slotProps.ending`. The default ending shows them in a\n * centred row.\n */\n actions?: ReactNode;\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\n/** \"* Required\": the asterisk matches the one beside each required question. */\nfunction RequiredNote({ text, className }: { text: string; className?: string }) {\n return (\n <p className={cn(\"text-sm text-muted-foreground\", className)} data-gf-required-note=\"\">\n <span className=\"text-destructive\" aria-hidden=\"true\">\n *{\" \"}\n </span>\n {text}\n </p>\n );\n}\n\nfunction HeaderImage({ image, className }: { image: { src: string; alt: string }; className?: string }) {\n return (\n <img\n src={image.src}\n alt={image.alt}\n data-gf-header-image=\"\"\n className={cn(\"block h-32 w-full object-cover sm:h-44\", className)}\n />\n );\n}\n\nfunction DefaultHeader({ title, description, image, requiredNote, 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 {image ? <HeaderImage image={image} className=\"mb-4 rounded-lg\" /> : null}\n <h1 className=\"text-sm font-medium text-muted-foreground\">{title}</h1>\n {description ? <p className=\"text-sm text-muted-foreground whitespace-pre-line\">{description}</p> : null}\n {requiredNote ? <RequiredNote text={requiredNote} /> : null}\n </header>\n );\n }\n if (presentation === \"page\") {\n return (\n <header\n className={cn(\n \"overflow-hidden rounded-xl border bg-card text-card-foreground\",\n !image && \"border-t-8 border-t-primary\",\n className,\n )}\n >\n {image ? <HeaderImage image={image} /> : null}\n <div className={cn(\"px-5 py-6 sm:px-8 sm:py-8\", image && \"border-t-8 border-t-primary\")}>\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 whitespace-pre-line\">{description}</p> : null}\n {requiredNote ? <RequiredNote text={requiredNote} className=\"mt-4\" /> : null}\n </div>\n </header>\n );\n }\n return (\n <header className={cn(\"space-y-1\", className)}>\n {image ? <HeaderImage image={image} className=\"mb-4 rounded-lg\" /> : null}\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description ? <p className=\"text-muted-foreground whitespace-pre-line\">{description}</p> : null}\n {requiredNote ? <RequiredNote text={requiredNote} className=\"pt-1\" /> : null}\n </header>\n );\n}\n\nfunction initials(name: string): string {\n return name\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((word) => word[0]!.toUpperCase())\n .join(\"\");\n}\n\nfunction DefaultBrand({ name, logo, className }: BrandSlotProps) {\n return (\n <div className={cn(\"flex min-w-0 items-center gap-2.5\", className)} data-gf-brand=\"\">\n {typeof logo === \"string\" ? (\n <img src={logo} alt=\"\" className=\"size-8 shrink-0 rounded-md object-contain\" />\n ) : logo ? (\n <span className=\"flex shrink-0 items-center\" aria-hidden=\"true\">\n {logo}\n </span>\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-primary text-xs font-bold tracking-wide text-primary-foreground\"\n >\n {initials(name)}\n </span>\n )}\n <span className=\"truncate text-sm font-semibold tracking-tight\">{name}</span>\n </div>\n );\n}\n\nfunction DefaultProgress({ step, total, className }: ProgressSlotProps) {\n const { presentation } = useFormPresentation();\n const page = presentation === \"page\";\n if (!total) return null;\n // In page mode the bar fills with questions answered (empty on the first), like Typeform.\n const percent = total ? Math.round(((page ? step - 1 : step) / total) * 100) : 0;\n // Not a live region: focus moving to the question is the announcement.\n const bar = (\n <Progress\n value={percent}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-valuetext={`Question ${step} of ${total}`}\n aria-label=\"Progress\"\n className={cn(\"motion-reduce:[&>div]:transition-none\", page && \"h-1 rounded-none bg-primary/15\")}\n />\n );\n if (page) {\n return (\n <div className={cn(\"fixed inset-x-0 top-0 z-10\", className)} data-gf-progress=\"\">\n {bar}\n </div>\n );\n }\n return (\n <div className={cn(\"space-y-1\", className)} data-gf-progress=\"\">\n {bar}\n <p className=\"text-sm text-muted-foreground\">\n Question {step} of {total}\n </p>\n </div>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction DefaultNavigation({\n canGoBack,\n isLast,\n busy,\n failed,\n onBack,\n submitLabel,\n nextLabel,\n retryLabel,\n keyHint,\n className,\n}: NavigationSlotProps) {\n const { presentation, layout } = useFormPresentation();\n const label = busy ? \"Sending…\" : failed ? retryLabel : isLast ? submitLabel : nextLabel;\n if (presentation === \"page\") {\n return (\n <div className={cn(\"flex flex-wrap items-center gap-x-4 gap-y-2\", layout === \"classic\" && \"pt-2\", className)}>\n <Button\n type=\"submit\"\n size=\"lg\"\n loading={busy}\n className=\"h-12 min-w-28 px-6 text-base font-semibold motion-reduce:[&_.animate-spin]:animate-none [&_svg]:size-5\"\n >\n {label}\n {!busy && !failed && !isLast ? <CheckIcon /> : null}\n </Button>\n {keyHint && !busy ? (\n <span className=\"hidden text-sm text-muted-foreground pointer-fine:inline\" data-gf-key-hint=\"\">\n press <kbd className=\"font-sans font-semibold text-foreground\">{keyHint}</kbd>\n </span>\n ) : null}\n {canGoBack ? (\n // After OK in the tab order, drawn quietly at the page's top-left.\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Back\"\n onClick={onBack}\n disabled={busy}\n // Centred on the brand row: h-16 (sm:h-20) minus its own 44px, halved.\n className=\"absolute left-2 top-2.5 size-11 text-muted-foreground sm:left-4 sm:top-4.5 [&_svg]:size-6\"\n >\n <ChevronLeftIcon />\n </Button>\n ) : null}\n </div>\n );\n }\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n {canGoBack ? (\n <Button type=\"button\" variant=\"outline\" size=\"lg\" onClick={onBack} disabled={busy}>\n Back\n </Button>\n ) : null}\n <Button type=\"submit\" size=\"lg\" loading={busy} className=\"motion-reduce:[&_.animate-spin]:animate-none\">\n {label}\n </Button>\n </div>\n );\n}\n\n/**\n * The built-in ending (a check, the title and description, then any `actions`). Exported\n * so a custom ending slot can wrap it rather than copy it.\n */\nexport function DefaultEnding({ title, description, actions, className }: EndingSlotProps) {\n const { presentation } = useFormPresentation();\n const actionRow = actions ? <div className=\"mt-4 flex flex-wrap justify-center gap-2\">{actions}</div> : null;\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 whitespace-pre-line\">{description}</p> : null}\n {actionRow}\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 whitespace-pre-line\">{description}</p> : null}\n {actionRow}\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 /**\n * Option lists this app supplies, by key, for choice questions whose\n * options come from the app (`props.optionsFrom: { source: \"host\", key }`),\n * such as `{ coaches: [{ value: \"8c1…\", label: \"Ada Lovelace\" }] }`. Shown\n * after the question's own options. Like `options`, read when the response\n * starts; unused with `engine` (pass `hostOptions` to `useForm` then). Check\n * answers on the server with the same lists (`validateSubmission`'s\n * `hostOptions`).\n */\n hostOptions?: HostOptions | undefined;\n /**\n * The query parameters of the link the form was opened from, such as\n * `new URLSearchParams(location.search)`. A choice question with\n * `props.prefill: { param }` starts with that parameter's value picked when\n * it is one of its options (`prefillFromLink`), and with\n * `hideWhenPrefilled` it isn't shown at all. Read when the response starts;\n * unused with `engine` (pass `linkParams` to `useForm` then).\n */\n linkParams?: LinkParams | undefined;\n /** Overrides the definition's layout. */\n layout?: \"focus\" | \"classic\" | undefined;\n /**\n * `\"embedded\"` (default): a block inside your own page. `\"page\"`: the\n * respondent's whole screen, for a QR code or a shared link. It fills the\n * viewport with no card around it; in focus layout each question is centred\n * under a thin progress bar with large type and tap targets, and in classic\n * layout the questions are sections on one scrolling page.\n */\n presentation?: FormPresentation | undefined;\n /** An organisation's or business's name and logo, shown small at the top of every step and on the ending. */\n brand?: FormBrand | undefined;\n /**\n * Colours and a header image: `accent` replaces the primary colour (buttons,\n * selected options, progress, focus ring), adjusted where needed so it keeps\n * at least 3:1 contrast with the page and its text 4.5:1; `headerImage` is a\n * banner over the title.\n */\n theme?: FormTheme | 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 * Save answers as they go: with the definition's `settings.saveProgress` on,\n * called a moment after each step forward (in classic layout, a moment after\n * the answers change) with how far the respondent got (`formProgress`); read\n * the answers so far with `engine.answers()`. It never holds them up: it runs\n * after the step, and a rejection is ignored (the next call carries every\n * answer again). A pending call goes at once when the page is hidden, and none\n * is made once the form is submitted.\n */\n onProgress?: ((engine: FormEngine, progress: FormProgress) => void | Promise<void>) | undefined;\n /**\n * The note under the first question while answers save as they go (only with\n * `onProgress` and `settings.saveProgress`). `null` hides it. Default\n * \"Your answers save as you go.\"\n */\n progressNotice?: string | null | 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 /** The send button's word, the same in every layout. Default \"Send\". */\n submitLabel?: string | undefined;\n /** The button that moves to the next question in focus layout. Default \"OK\". */\n nextLabel?: string | undefined;\n /**\n * The note shown with the title when any question is required, after an\n * asterisk (\"* Required\"). `null` hides it. Default \"Required\".\n */\n requiredLabel?: string | null | undefined;\n /** The submit button's label after `onSubmit` failed. Default \"Try again\". */\n retryLabel?: string | undefined;\n /**\n * Stores a file a respondent adds to a `photo` field and resolves to its\n * reference (`{ id, name, type, size }`), which is all the answer keeps; a\n * rejection shows under the field. While any upload is in flight the form\n * neither moves on nor sends. Without it (and without an `UploadContext`\n * above the form), photo fields say photos can't be added.\n */\n onUpload?: ((file: File, field: FieldBlock) => Promise<PhotoRef>) | 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/** How long after a step forward `onProgress` waits, so quick steps save once. */\nexport const PROGRESS_DELAY_MS = 400;\n/** In classic layout, how long after the last answer changed. */\nexport const CLASSIC_PROGRESS_DELAY_MS = 1500;\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 options =\n props.hostOptions || props.linkParams\n ? {\n ...props.options,\n ...(props.hostOptions ? { hostOptions: props.hostOptions } : {}),\n ...(props.linkParams ? { linkParams: props.linkParams } : {}),\n }\n : props.options;\n const engine = useForm(props.form, options);\n return <FormWithEngine {...props} engine={engine} />;\n}\n\nfunction FormWithEngine(props: FormProps & { engine: FormEngine }) {\n const { onUpload } = props;\n // `onUpload` wins; otherwise a host's own UploadContext above the form is kept.\n const outer = useContext(UploadContext);\n const host = useMemo(() => (onUpload ? { upload: onUpload } : outer), [onUpload, outer]);\n const [pending] = useState(createPendingUploads);\n return (\n <UploadContext.Provider value={host}>\n <PendingUploadsContext.Provider value={pending}>\n <FormRuntime engine={props.engine} registry={props.registry ?? defaultRegistry}>\n <FormBody key={keyOf(props.engine)} {...props} pendingUploads={pending} />\n </FormRuntime>\n </PendingUploadsContext.Provider>\n </UploadContext.Provider>\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 theme,\n onSubmit,\n onChange,\n onProgress,\n progressNotice = \"Your answers save as you go.\",\n autoAdvance = true,\n submitLabel = \"Send\",\n requiredLabel = \"Required\",\n nextLabel = \"OK\",\n retryLabel = \"Try again\",\n slots,\n slotProps,\n className,\n testID,\n pendingUploads,\n}: FormProps & { engine: FormEngine; pendingUploads: PendingUploads }) {\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 // The questions the respondent sees: the path without any a link prefilled and hides.\n const pathKey = useFormSelector(engine, (s) => JSON.stringify(respondentPath(def, s)));\n // A string, so typing (which builds a new errors object) doesn't re-render the whole form.\n const errorsKey = useFormSelector(engine, (s) => JSON.stringify(s.errors));\n const ending = useFormSelector(engine, (s) => s.ending);\n const historyLength = useFormSelector(engine, (s) => s.history.length);\n // The introduction recalls like endings do ({{field:name}}, {{hidden:owner}}), so it follows\n // the answers; a string, so it re-renders only when the recalled text changes.\n const description = useFormSelector(engine, () => (def.description ? engine.text(def.description) : undefined));\n const path = JSON.parse(pathKey) as string[];\n const errors = JSON.parse(errorsKey) as Record<string, string>;\n const formRef = useRef<HTMLFormElement>(null);\n const stepRef = useRef<HTMLDivElement>(null);\n const endingRef = useRef<HTMLDivElement>(null);\n const advanceTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const previousCurrent = useRef(current);\n const [phase, setPhase] = useState<\"idle\" | \"sending\" | \"sent\" | \"failed\">(\"idle\");\n const [announcement, setAnnouncement] = useState(\"\");\n const [summaryRequest, setSummaryRequest] = useState(0);\n const sending = useRef(false);\n // Which way the last step went, so page mode slides the new question in from that side.\n const direction = useRef<\"forward\" | \"back\">(\"forward\");\n // \"Ctrl\" until mounted, so the server and the first client render agree.\n const [modKey, setModKey] = useState(\"Ctrl\");\n const page = presentation === \"page\";\n\n useEffect(() => {\n if (/Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent)) setModKey(\"⌘\");\n }, []);\n\n const showEnding = status === \"completed\" && (phase === \"sent\" || !onSubmit);\n // A completed response is final: the engine ignores edits, so the fields say so.\n const locked = status === \"completed\";\n\n useEffect(() => {\n if (!onChange) return;\n return engine.subscribe(() => onChange(engine.getState(), engine));\n }, [engine, onChange]);\n\n // Save answers as they go: a moment after each step forward (or, in classic layout,\n // after the answers change), off the respondent's path. The latest onProgress is\n // read when it fires, so a host passing a new function each render keeps one timer.\n const saveProgress = def.settings?.saveProgress === true && !!onProgress;\n const onProgressRef = useRef(onProgress);\n onProgressRef.current = onProgress;\n useEffect(() => {\n if (!saveProgress) return;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let last = engine.getState();\n const fire = () => {\n timer = undefined;\n if (engine.getState().status === \"completed\") return;\n try {\n void Promise.resolve(onProgressRef.current?.(engine, formProgress(engine))).catch(() => {});\n } catch {\n // A host's error never reaches the respondent; the next step saves again.\n }\n };\n const schedule = (delay: number) => {\n clearTimeout(timer);\n timer = setTimeout(fire, delay);\n };\n const unsubscribe = engine.subscribe(() => {\n const state = engine.getState();\n const previous = last;\n last = state;\n if (state.status === \"completed\") {\n clearTimeout(timer);\n timer = undefined;\n return;\n }\n const event = state.events[state.events.length - 1];\n if (layout === \"focus\") {\n if (event?.type === \"next\" && state.current !== previous.current) schedule(PROGRESS_DELAY_MS);\n } else if (event?.type === \"answer\") schedule(CLASSIC_PROGRESS_DELAY_MS);\n });\n // Leaving the page (closing the tab, switching away on a phone) sends a pending save now.\n const flush = () => {\n if (timer === undefined) return;\n clearTimeout(timer);\n fire();\n };\n window.addEventListener(\"pagehide\", flush);\n return () => {\n unsubscribe();\n window.removeEventListener(\"pagehide\", flush);\n flush();\n };\n }, [engine, saveProgress, layout]);\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 /** True (and says so) while a photo is still on its way: the form waits for it. */\n const waitingForUploads = () => {\n if (pendingUploads.count() === 0) return false;\n announce(UPLOAD_WAIT_MESSAGE);\n return true;\n };\n\n const finish = async () => {\n if (sending.current) return;\n if (engine.getState().status !== \"completed\" && waitingForUploads()) 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) => {\n const shown = respondentPath(def, state);\n return state.current === shown[shown.length - 1];\n };\n\n const advance = () => {\n if (waitingForUploads()) return;\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 themeId = `gf-theme-${useId().replace(/[^a-zA-Z0-9_-]/g, \"\")}`;\n const themeStyle = themeCss(theme, `[data-gf-theme=\"${themeId}\"]`);\n // The theme's colours apply to everything inside: the form, or the ending in its place.\n const themed = themeStyle ? { \"data-gf-theme\": themeId } : {};\n const styleNode = themeStyle ? <style>{themeStyle}</style> : null;\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 {styleNode}\n {page ? (\n <div\n ref={endingRef}\n {...themed}\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} {...themed} 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 // Under the first question (focus layout) or the title (classic), until they move on.\n const notice =\n saveProgress && progressNotice && historyLength === 0 ? (\n <p className=\"text-sm text-muted-foreground\" data-gf-progress-notice=\"\">\n {progressNotice}\n </p>\n ) : null;\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 hasRequired = def.blocks.some((b) => b.kind === \"field\" && b.required === true);\n const header = renderSlot(\n DefaultHeader,\n slots?.header,\n {\n title: def.title,\n description,\n image: theme?.headerImage ? { src: theme.headerImage, alt: theme.headerImageAlt ?? \"\" } : undefined,\n requiredNote: hasRequired && requiredLabel ? requiredLabel : undefined,\n },\n slotProps?.header,\n );\n const errorSummary =\n errorItems.length > 0 && layout === \"classic\"\n ? renderSlot(\n DefaultErrorSummary,\n slots?.errorSummary,\n {\n count: errorItems.length,\n errors: errorItems,\n className: page ? \"bg-card\" : undefined,\n },\n slotProps?.errorSummary,\n )\n : null;\n const progress =\n // No questions on the path: no \"Question 1 of 0\".\n layout === \"focus\" && path.length > 0\n ? renderSlot(DefaultProgress, slots?.progress, { step, total: path.length }, slotProps?.progress)\n : null;\n const fields = (\n // Disabled once the response is completed (sending, or after a failed send): read-only, not dead.\n <fieldset disabled={locked} className=\"min-w-0 border-0 p-0\">\n {layout === \"focus\" ? (\n <div\n // A new element per question, so page mode's entry transition runs for each one.\n key={pageFocus ? (current ?? \"\") : undefined}\n ref={stepRef}\n tabIndex={-1}\n className={cn(\n \"outline-none\",\n pageFocus &&\n \"transition-[opacity,translate] duration-300 ease-out starting:opacity-0 motion-reduce:transition-none\",\n pageFocus && (direction.current === \"back\" ? \"starting:-translate-y-6\" : \"starting:translate-y-6\"),\n )}\n >\n {current ? renderBlock(current, true) : null}\n </div>\n ) : (\n <div className={pageClassic ? \"space-y-4\" : \"space-y-8\"}>{path.map((id) => renderBlock(id, false))}</div>\n )}\n </fieldset>\n );\n const failure =\n phase === \"failed\" ? (\n <p role=\"alert\" className={cn(\"text-sm font-medium text-destructive\", page && \"text-base\")}>\n We couldn't send your answers. They're kept here: press {retryLabel} to send them again.\n </p>\n ) : null;\n const navigation = renderSlot(\n DefaultNavigation,\n slots?.navigation,\n {\n canGoBack: layout === \"focus\" && historyLength > 0 && !locked,\n isLast: isLast || status === \"completed\",\n busy: phase === \"sending\",\n failed: phase === \"failed\",\n onBack: goBack,\n submitLabel,\n nextLabel,\n retryLabel,\n keyHint,\n },\n slotProps?.navigation,\n );\n\n const formProps = {\n ...themed,\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 {styleNode}\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 {notice ? <div className=\"mt-4\">{notice}</div> : null}\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 {notice}\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 {layout === \"classic\" ? notice : null}\n {errorSummary}\n {progress}\n {fields}\n {layout === \"focus\" ? notice : null}\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","import type { FieldBlock, PhotoRef, SignedUpload, UploadGrant, UploadRequest } from \"@marktiderman/genesis-forms\";\nimport { photoFileType } from \"./photo\";\nimport type { UploadHost } from \"./upload\";\n\n/**\n * Who is uploading: a new response's visit (`attemptId`, a UUID the page keeps for the\n * visit), or an edit link's token while changing a sent response.\n */\nexport type UploadClaim = { attemptId: string } | { edit: string };\n\nexport interface SignedUploadHostOptions {\n /** The app's upload endpoint (`createUploadHandler`'s route), or one per field. */\n endpoint: string | ((field: FieldBlock) => string);\n /** Who is uploading, read at each upload. */\n claim: UploadClaim | (() => UploadClaim);\n /**\n * Sends the bytes where the server signed. Default: PUT the file to `upload.url`\n * (with its type), which a store that signs plain URLs sets. Supabase Storage:\n * `supabase.storage.from(upload.bucket).uploadToSignedUrl(upload.path, upload.token, file, { contentType })`.\n * A throw (or rejection) is the upload failing.\n */\n send?: ((file: File, upload: SignedUpload, contentType: string) => Promise<void>) | undefined;\n /**\n * A link to read a stored file, for thumbnails and staff views: the app's storage signs\n * it. Null when the reader can't open it. Without it, `url` resolves null.\n */\n readUrl?: ((ref: PhotoRef, field?: FieldBlock) => Promise<string | null>) | undefined;\n /** Default the global `fetch`. */\n fetch?: typeof fetch | undefined;\n}\n\n/** An `UploadHost` that always has `url`. */\nexport interface SignedUploadHost extends UploadHost {\n url(ref: PhotoRef, field?: FieldBlock): Promise<string | null>;\n}\n\nasync function putToUrl(file: File, upload: SignedUpload, contentType: string, fetcher: typeof fetch) {\n if (!upload.url) throw new Error(\"The server signed no URL to send the file to; pass `send`.\");\n const res = await fetcher(upload.url, { method: \"PUT\", headers: { \"content-type\": contentType }, body: file });\n if (!res.ok) throw new Error(`The file wasn't stored (${res.status}).`);\n}\n\n/**\n * The browser half of the upload handshake (genesis-forms/server's `createUploadHandler`):\n * for each file it asks `endpoint` for a signed upload (`UploadRequest` as JSON), sends\n * the bytes with `send`, and resolves to the reference the server handed back, which is\n * all the answer keeps. A refusal rejects with the server's words. Pass it as `<Form\n * onUpload={host.upload}>` or in an `UploadContext`.\n */\nexport function signedUploadHost(options: SignedUploadHostOptions): SignedUploadHost {\n const fetcher = (...args: Parameters<typeof fetch>) => (options.fetch ?? fetch)(...args);\n return {\n async upload(file, field) {\n const type = photoFileType(file);\n const claim = typeof options.claim === \"function\" ? options.claim() : options.claim;\n const endpoint = typeof options.endpoint === \"function\" ? options.endpoint(field) : options.endpoint;\n const request: UploadRequest = { fieldId: field.id, name: file.name, type, size: file.size, ...claim };\n const response = await fetcher(endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(request),\n });\n const body = (await response.json().catch(() => ({}))) as Partial<UploadGrant> & { error?: unknown };\n if (!response.ok || !body.ref || !body.upload) {\n throw new Error(typeof body.error === \"string\" ? body.error : `The photo wasn't accepted (${response.status}).`);\n }\n if (options.send) await options.send(file, body.upload, type);\n else await putToUrl(file, body.upload, type, fetcher);\n return body.ref;\n },\n async url(ref, field) {\n if (!options.readUrl) return null;\n try {\n return await options.readUrl(ref, field);\n } catch {\n return null;\n }\n },\n };\n}\n","// A public form's address bar shows only its path: the link's query (?about=, ?coach=,\n// ?edit=, utm_…) is read on load, then taken out of the visible URL. The page keeps using\n// the values it read: the router isn't told, so its state keeps the query. A reload within\n// the same tab gets them back, since the query is kept in sessionStorage for a little while.\n//\n// Cosmetic, not security: the server checks every value it is sent, and anyone holding\n// the link still has it. It keeps the parameters out of screenshots, shared addresses and\n// over-the-shoulder reads. Moved up from the host app's src/lib/forms/clean-url.ts.\n\nconst KEY_PREFIX = \"form-query:\";\n/** How long a reload brings the query back: 30 minutes. */\nexport const HIDDEN_QUERY_KEEP_MS = 30 * 60 * 1000;\n\n/** The parts of `window` `hideQueryOnLoad` uses (pass `window`; tests pass a fake). */\nexport interface HiddenQueryWindow {\n location: { pathname: string; search: string; hash: string; replace(url: string): void };\n history: { state: unknown; replaceState(data: unknown, unused: string, url: string): void };\n sessionStorage: Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\n}\n\n/**\n * Run once when the page has read its query. Returns \"hidden\" when it took the query out\n * of the address bar, \"restoring\" when a reload is bringing a hidden query back (the page\n * is about to load again), else \"none\".\n */\nexport function hideQueryOnLoad(\n win: HiddenQueryWindow,\n isReload: boolean,\n now = Date.now(),\n): \"hidden\" | \"restoring\" | \"none\" {\n const { pathname, search, hash } = win.location;\n const key = KEY_PREFIX + pathname;\n try {\n if (search && search !== \"?\") {\n win.sessionStorage.setItem(key, JSON.stringify({ search, at: now }));\n // The browser's own replaceState: a router may patch the instance's and would re-read\n // the address, losing the query the page reads (link inputs, ?edit).\n const replace = nativeReplaceState(win.history);\n replace.call(win.history, win.history.state, \"\", pathname + hash);\n return \"hidden\";\n }\n const saved = win.sessionStorage.getItem(key);\n if (!saved) return \"none\";\n const { search: kept, at } = JSON.parse(saved) as { search?: unknown; at?: unknown };\n if (isReload && typeof kept === \"string\" && typeof at === \"number\" && now - at < HIDDEN_QUERY_KEEP_MS) {\n win.location.replace(pathname + kept + hash);\n return \"restoring\";\n }\n win.sessionStorage.removeItem(key);\n } catch {\n // Storage blocked (private windows): the query just stays visible.\n }\n return \"none\";\n}\n\n/** History's prototype replaceState when there is one (a real browser), else the instance's. */\nfunction nativeReplaceState(history: HiddenQueryWindow[\"history\"]): HiddenQueryWindow[\"history\"][\"replaceState\"] {\n const proto = Object.getPrototypeOf(history) as Partial<HiddenQueryWindow[\"history\"]> | null;\n return typeof proto?.replaceState === \"function\" ? proto.replaceState : history.replaceState;\n}\n\n/** Whether this page load was a reload (Navigation Timing), in the browser; false elsewhere. */\nexport const wasReload = (): boolean =>\n typeof performance !== \"undefined\" &&\n (performance.getEntriesByType?.(\"navigation\")[0] as PerformanceNavigationTiming | undefined)?.type === \"reload\";\n"]}