@viveksinghind/narrative-form-react 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.css +571 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.mts +897 -0
- package/dist/index.d.ts +897 -0
- package/dist/index.js +1889 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1809 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useFormState.ts","../src/hooks/useDynamicForm.ts","../src/hooks/useTypewriter.ts","../src/components/Cursor.tsx","../src/components/Prose.tsx","../src/components/EnterButton.tsx","../src/components/InlineInput.tsx","../src/components/EditIcon.tsx","../src/components/FilledValue.tsx","../src/components/ErrorMessage.tsx","../src/components/fields/ChipsField.tsx","../src/components/fields/MultiChipsField.tsx","../src/components/fields/SelectField.tsx","../src/components/fields/OtpField.tsx","../src/components/fields/PasswordField.tsx","../src/components/fields/DateField.tsx","../src/components/ToastProvider.tsx","../src/components/Line.tsx","../src/components/ThemeProvider.tsx","../src/components/WelcomeScreen.tsx","../src/components/DoneScreen.tsx","../src/NarrativeForm.tsx","../src/components/fields/TextField.tsx","../src/components/fields/TelField.tsx","../src/components/fields/EmailField.tsx","../src/components/fields/NumberField.tsx"],"names":["useState","useRef","FormStateEngine","useCallback","useMemo","useEffect","fetchFormConfig","_a","React","Cursor","Prose","jsxs","jsx","EnterButton","InlineInput","EditIcon","FilledValue","ErrorMessage","ChipsField","MultiChipsField","SelectField","OtpField","PasswordField","DateField","createContext","useContext","Line","_b","_c","_d","validateField","hasAsyncValidation","validateFieldAsync","ThemeProvider","WelcomeScreen","DoneScreen","NarrativeFormInner","mergeStrings","NarrativeForm","TextField","TelField","EmailField","NumberField"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * React hook wrapping the core FormStateEngine.\r\n *\r\n * @remarks\r\n * Bridges the framework-agnostic FormStateEngine with React's\r\n * state management. Each state mutation in the engine triggers\r\n * a React re-render via `useSyncExternalStore`-like pattern.\r\n */\r\n\r\nimport { useState, useRef, useCallback, useMemo } from \"react\";\r\nimport type { NarrativeField, NarrativeFieldValues, NarrativeMeta } from \"@viveksinghind/narrative-form-core\";\r\nimport { FormStateEngine } from \"@viveksinghind/narrative-form-core\";\r\nimport type { FieldStatus, FormStateSnapshot } from \"@viveksinghind/narrative-form-core\";\r\n\r\n/** Return value of the useFormState hook. */\r\nexport interface UseFormStateResult {\r\n /** Current snapshot of the form state. */\r\n snapshot: FormStateSnapshot;\r\n /** Start the typewriter animation for a field. */\r\n startTyping: (key: string) => void;\r\n /** Mark a field as active (typewriter done, input visible). */\r\n activateField: (key: string) => void;\r\n /** Confirm a field with a value. */\r\n confirmField: (key: string, value: string | string[]) => void;\r\n /** Reopen a confirmed field for editing. */\r\n editField: (key: string) => void;\r\n /** Re-confirm a field after editing. */\r\n reconfirmField: (key: string, value: string | string[]) => void;\r\n /** Move to the next field. */\r\n next: () => void;\r\n /** Focus a specific field by key. */\r\n focusField: (key: string) => void;\r\n /** Reset all form state. */\r\n reset: () => void;\r\n /** Get all confirmed values. */\r\n getValues: () => NarrativeFieldValues;\r\n /** Get analytics metadata. */\r\n getMeta: (formId?: string, formVersion?: number) => NarrativeMeta;\r\n}\r\n\r\n/**\r\n * React hook that manages the narrative form state.\r\n *\r\n * @param fields - Ordered array of field configurations\r\n * @returns Form state and mutation methods\r\n */\r\nexport function useFormState(fields: readonly NarrativeField[]): UseFormStateResult {\r\n // Use a counter to force re-renders when the engine mutates\r\n const [, setTick] = useState(0);\r\n\r\n const engineRef = useRef<FormStateEngine | null>(null);\r\n\r\n // Lazily initialise the engine\r\n if (engineRef.current === null) {\r\n engineRef.current = new FormStateEngine(fields, () => {\r\n setTick((t) => t + 1);\r\n });\r\n }\r\n\r\n const engine = engineRef.current;\r\n\r\n // Stable method references\r\n const startTyping = useCallback((key: string) => engine.startTyping(key), [engine]);\r\n const activateField = useCallback((key: string) => engine.activateField(key), [engine]);\r\n const confirmField = useCallback(\r\n (key: string, value: string | string[]) => engine.confirmField(key, value),\r\n [engine],\r\n );\r\n const editField = useCallback((key: string) => engine.editField(key), [engine]);\r\n const reconfirmField = useCallback(\r\n (key: string, value: string | string[]) => engine.reconfirmField(key, value),\r\n [engine],\r\n );\r\n const next = useCallback(() => engine.next(), [engine]);\r\n const focusField = useCallback((key: string) => engine.focusField(key), [engine]);\r\n const reset = useCallback(() => engine.reset(), [engine]);\r\n const getValues = useCallback(() => engine.getValues(), [engine]);\r\n const getMeta = useCallback(\r\n (formId?: string, formVersion?: number) => engine.getMeta(formId, formVersion),\r\n [engine],\r\n );\r\n\r\n const snapshot = engine.getSnapshot();\r\n\r\n return useMemo(\r\n () => ({\r\n snapshot,\r\n startTyping,\r\n activateField,\r\n confirmField,\r\n editField,\r\n reconfirmField,\r\n next,\r\n focusField,\r\n reset,\r\n getValues,\r\n getMeta,\r\n }),\r\n // snapshot changes every tick, which is what we want\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [snapshot],\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from \"react\";\r\nimport type { NarrativeFormConfig } from \"@viveksinghind/narrative-form-core\";\r\nimport { fetchFormConfig, ConfigFetchError } from \"@viveksinghind/narrative-form-core\";\r\n\r\nexport interface UseDynamicFormProps {\r\n fieldsUrl?: string;\r\n fieldsUrlHeaders?: Record<string, string>;\r\n formConfig?: NarrativeFormConfig;\r\n onFetchError?: (error: Error) => void;\r\n}\r\n\r\nexport interface UseDynamicFormResult {\r\n config: NarrativeFormConfig | null;\r\n loading: boolean;\r\n error: Error | null;\r\n retry: () => void;\r\n}\r\n\r\n/**\r\n * Hook to manage fetching and parsing server-driven form configuration.\r\n */\r\nexport function useDynamicForm({\r\n fieldsUrl,\r\n fieldsUrlHeaders,\r\n formConfig,\r\n onFetchError,\r\n}: UseDynamicFormProps): UseDynamicFormResult {\r\n const [config, setConfig] = useState<NarrativeFormConfig | null>(formConfig ?? null);\r\n const [loading, setLoading] = useState<boolean>(!!fieldsUrl && !formConfig);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [retryCount, setRetryCount] = useState(0);\r\n\r\n useEffect(() => {\r\n // If a complete config is passed via props, use it immediately\r\n if (formConfig) {\r\n setConfig(formConfig);\r\n setLoading(false);\r\n setError(null);\r\n return;\r\n }\r\n\r\n if (!fieldsUrl) {\r\n return;\r\n }\r\n\r\n let isMounted = true;\r\n setLoading(true);\r\n setError(null);\r\n\r\n fetchFormConfig(fieldsUrl, { headers: fieldsUrlHeaders })\r\n .then((data) => {\r\n if (isMounted) {\r\n setConfig(data);\r\n setLoading(false);\r\n }\r\n })\r\n .catch((err: Error) => {\r\n if (isMounted) {\r\n setError(err);\r\n setLoading(false);\r\n onFetchError?.(err);\r\n }\r\n });\r\n\r\n return () => {\r\n isMounted = false;\r\n };\r\n }, [fieldsUrl, fieldsUrlHeaders, formConfig, retryCount, onFetchError]);\r\n\r\n const retry = useCallback(() => {\r\n if (fieldsUrl && !formConfig) {\r\n setRetryCount((c) => c + 1);\r\n }\r\n }, [fieldsUrl, formConfig]);\r\n\r\n return { config, loading, error, retry };\r\n}\r\n","/**\r\n * Core typewriter animation hook for narrative-form.\r\n *\r\n * @remarks\r\n * Animates a string character by character to create the \"letter being written\"\r\n * effect. Cleans up the interval on unmount to prevent memory leaks.\r\n * Respects `prefers-reduced-motion` — skips animation entirely if set.\r\n *\r\n * @example\r\n * ```tsx\r\n * const { displayedText, isTyping, isComplete } = useTypewriter({\r\n * text: \"My name is\",\r\n * speed: 38,\r\n * });\r\n * ```\r\n */\r\n\r\nimport { useState, useEffect, useRef, useCallback } from \"react\";\r\n\r\n/** Configuration options for the useTypewriter hook. */\r\nexport interface UseTypewriterOptions {\r\n /** The full text to type out. */\r\n text: string;\r\n /** Milliseconds per character. Default: 38 */\r\n speed?: number;\r\n /** Whether animation is enabled. Default: true */\r\n enabled?: boolean;\r\n /** Milliseconds to pause after typing completes before signalling done. Default: 100 */\r\n pauseAfter?: number;\r\n /** Callback fired when typing is fully complete (after pause). */\r\n onComplete?: () => void;\r\n}\r\n\r\n/** Return value of the useTypewriter hook. */\r\nexport interface UseTypewriterResult {\r\n /** The currently visible portion of the text. */\r\n displayedText: string;\r\n /** Whether the typewriter is actively typing characters. */\r\n isTyping: boolean;\r\n /** Whether typing is fully complete (including the post-typing pause). */\r\n isComplete: boolean;\r\n}\r\n\r\n/**\r\n * Check if the user prefers reduced motion.\r\n * Guarded for SSR — returns false if `window` is not available.\r\n */\r\nfunction prefersReducedMotion(): boolean {\r\n if (typeof window === \"undefined\") return false;\r\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\r\n}\r\n\r\n/**\r\n * React hook that animates text character by character.\r\n *\r\n * @param options - Typewriter configuration\r\n * @returns Object with displayedText, isTyping, and isComplete\r\n */\r\nexport function useTypewriter(options: UseTypewriterOptions): UseTypewriterResult {\r\n const { text, speed = 38, enabled = true, pauseAfter = 100, onComplete } = options;\r\n\r\n const [charIndex, setCharIndex] = useState(0);\r\n const [isComplete, setIsComplete] = useState(false);\r\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n const pauseTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const onCompleteRef = useRef(onComplete);\r\n\r\n // Keep onComplete ref fresh without triggering effect re-runs\r\n onCompleteRef.current = onComplete;\r\n\r\n // Clean up helper\r\n const cleanup = useCallback(() => {\r\n if (intervalRef.current !== null) {\r\n clearInterval(intervalRef.current);\r\n intervalRef.current = null;\r\n }\r\n if (pauseTimeoutRef.current !== null) {\r\n clearTimeout(pauseTimeoutRef.current);\r\n pauseTimeoutRef.current = null;\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n // If animation is disabled or user prefers reduced motion, show everything instantly\r\n if (!enabled || prefersReducedMotion() || text.length === 0) {\r\n setCharIndex(text.length);\r\n setIsComplete(true);\r\n onCompleteRef.current?.();\r\n return;\r\n }\r\n\r\n // Reset for new text\r\n setCharIndex(0);\r\n setIsComplete(false);\r\n\r\n intervalRef.current = setInterval(() => {\r\n setCharIndex((prev) => {\r\n const next = prev + 1;\r\n if (next >= text.length) {\r\n // All characters typed — clear interval, start pause\r\n if (intervalRef.current !== null) {\r\n clearInterval(intervalRef.current);\r\n intervalRef.current = null;\r\n }\r\n\r\n // Pause before signalling completion\r\n pauseTimeoutRef.current = setTimeout(() => {\r\n setIsComplete(true);\r\n onCompleteRef.current?.();\r\n }, pauseAfter);\r\n\r\n return text.length;\r\n }\r\n return next;\r\n });\r\n }, speed);\r\n\r\n // Cleanup on unmount or text/speed/enabled change\r\n return cleanup;\r\n }, [text, speed, enabled, pauseAfter, cleanup]);\r\n\r\n return {\r\n displayedText: text.slice(0, charIndex),\r\n isTyping: charIndex < text.length && !isComplete,\r\n isComplete,\r\n };\r\n}\r\n","/**\r\n * Blinking cursor component for the typewriter effect.\r\n *\r\n * @remarks\r\n * Renders a single character that blinks via CSS animation.\r\n * Visible only while the typewriter is actively typing.\r\n * CSS class: `ns-cursor`\r\n */\r\n\r\nimport React from \"react\";\r\n\r\n/** Props for the Cursor component. */\r\nexport interface CursorProps {\r\n /** The character to display as the cursor. Default: \"|\" */\r\n cursorChar?: string;\r\n /** Additional CSS class name. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A blinking cursor character displayed during typewriter animation.\r\n *\r\n * @param props - Cursor configuration\r\n */\r\nexport const Cursor: React.FC<CursorProps> = React.memo(function Cursor({\r\n cursorChar = \"|\",\r\n className,\r\n}) {\r\n const classes = [\"ns-cursor\", className].filter(Boolean).join(\" \");\r\n return <span className={classes} aria-hidden=\"true\">{cursorChar}</span>;\r\n});\r\n","/**\r\n * Typewriter prose text component.\r\n *\r\n * @remarks\r\n * Wraps the `useTypewriter` hook to render the sentence prefix\r\n * (e.g., \"My name is\") character by character, followed by a blinking cursor.\r\n * CSS classes: `ns-prose`, `ns-prose--typing`\r\n */\r\n\r\nimport React from \"react\";\r\nimport { useTypewriter } from \"../hooks/useTypewriter\";\r\nimport { Cursor } from \"./Cursor\";\r\n\r\n/** Props for the Prose component. */\r\nexport interface ProseProps {\r\n /** The full sentence text to type out. */\r\n text: string;\r\n /** Whether typewriter animation is enabled. Default: true */\r\n animate?: boolean;\r\n /** Milliseconds per character. Default: 38 */\r\n speed?: number;\r\n /** Whether to show a blinking cursor while typing. Default: true */\r\n cursor?: boolean;\r\n /** Custom cursor character. Default: \"|\" */\r\n cursorChar?: string;\r\n /** Milliseconds to pause after typing before input appears. Default: 100 */\r\n pauseAfter?: number;\r\n /** Callback fired when typing is fully complete. */\r\n onComplete?: () => void;\r\n /** Additional CSS class name. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Renders a sentence prefix with a typewriter animation.\r\n *\r\n * @param props - Prose configuration\r\n */\r\nexport const Prose: React.FC<ProseProps> = React.memo(function Prose({\r\n text,\r\n animate = true,\r\n speed = 38,\r\n cursor = true,\r\n cursorChar = \"|\",\r\n pauseAfter = 100,\r\n onComplete,\r\n className,\r\n}) {\r\n const { displayedText, isTyping, isComplete } = useTypewriter({\r\n text,\r\n speed,\r\n enabled: animate,\r\n pauseAfter,\r\n onComplete,\r\n });\r\n\r\n const classes = [\r\n \"ns-prose\",\r\n isTyping ? \"ns-prose--typing\" : undefined,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <span className={classes}>\r\n {displayedText}\r\n {cursor && isTyping && <Cursor cursorChar={cursorChar} />}\r\n </span>\r\n );\r\n});\r\n","/**\r\n * EnterButton — the ↵ confirm button displayed next to inline inputs.\r\n *\r\n * @remarks\r\n * Triggers field confirmation when clicked.\r\n * CSS class: `ns-enter-btn`\r\n */\r\n\r\nimport React from \"react\";\r\n\r\n/** Props for the EnterButton component. */\r\nexport interface EnterButtonProps {\r\n /** Callback fired when the button is clicked. */\r\n onConfirm: () => void;\r\n /** Button label. Default: \"↵\" */\r\n label?: string;\r\n /** Additional CSS class name. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A small inline button that confirms the current field value.\r\n *\r\n * @param props - Button configuration\r\n */\r\nexport const EnterButton: React.FC<EnterButtonProps> = React.memo(function EnterButton({\r\n onConfirm,\r\n label = \"↵\",\r\n className,\r\n}) {\r\n const classes = [\"ns-enter-btn\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={classes}\r\n onClick={onConfirm}\r\n aria-label=\"Confirm\"\r\n >\r\n {label}\r\n </button>\r\n );\r\n});\r\n","/**\r\n * Base inline input component for narrative-form.\r\n *\r\n * @remarks\r\n * Renders an inline text input that appears after the typewriter finishes.\r\n * Handles Enter key to confirm, Escape to cancel, and auto-focuses when it mounts.\r\n * Supports sanitise function on input and paste events.\r\n * CSS classes: `ns-input-wrap`, `ns-input`, `ns-input--[type]`, `ns-input--focused`\r\n */\r\n\r\nimport React, { useState, useRef, useEffect, useCallback } from \"react\";\r\nimport { EnterButton } from \"./EnterButton\";\r\n\r\n/** Props for the InlineInput component. */\r\nexport interface InlineInputProps {\r\n /** Unique field key used for identification. */\r\n fieldKey: string;\r\n /** HTML input type attribute. Default: \"text\" */\r\n type?: string;\r\n /** Placeholder text inside the input. */\r\n placeholder?: string;\r\n /** Initial value for the input. */\r\n defaultValue?: string;\r\n /** Suffix text displayed after the input. */\r\n suffix?: string;\r\n /** Sanitise function applied on input and paste. */\r\n sanitise?: (value: string) => string;\r\n /** Callback fired when the value is confirmed (Enter key or button). */\r\n onConfirm: (value: string) => void;\r\n /** Callback fired on every keystroke. */\r\n onChange?: (value: string) => void;\r\n /** Callback fired when input receives focus. */\r\n onFocus?: () => void;\r\n /** Callback fired when input loses focus. */\r\n onBlur?: (value: string) => void;\r\n /** Callback fired when Escape is pressed (cancel edit). */\r\n onEscape?: () => void;\r\n /** Additional CSS class for the input element. */\r\n inputClassName?: string;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * An inline input that lives within a sentence.\r\n * Auto-focuses on mount and confirms on Enter key press.\r\n *\r\n * @param props - Input configuration\r\n */\r\nexport const InlineInput: React.FC<InlineInputProps> = function InlineInput({\r\n fieldKey,\r\n type = \"text\",\r\n placeholder,\r\n defaultValue = \"\",\r\n suffix,\r\n sanitise,\r\n onConfirm,\r\n onChange,\r\n onFocus,\r\n onBlur,\r\n onEscape,\r\n inputClassName,\r\n className,\r\n}) {\r\n const [value, setValue] = useState(defaultValue);\r\n const [isFocused, setIsFocused] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Auto-focus when input appears\r\n useEffect(() => {\r\n inputRef.current?.focus();\r\n }, []);\r\n\r\n const applyValue = useCallback(\r\n (raw: string) => {\r\n const cleaned = sanitise ? sanitise(raw) : raw;\r\n setValue(cleaned);\r\n onChange?.(cleaned);\r\n },\r\n [sanitise, onChange],\r\n );\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n applyValue(e.target.value);\r\n };\r\n\r\n const handlePaste = useCallback(\r\n (e: React.ClipboardEvent<HTMLInputElement>) => {\r\n if (!sanitise) return; // Let default paste behaviour work\r\n e.preventDefault();\r\n const pasted = e.clipboardData.getData(\"text\");\r\n applyValue(pasted);\r\n },\r\n [sanitise, applyValue],\r\n );\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n onConfirm(value);\r\n } else if (e.key === \"Escape\") {\r\n e.preventDefault();\r\n onEscape?.();\r\n }\r\n };\r\n\r\n const handleFocus = () => {\r\n setIsFocused(true);\r\n onFocus?.();\r\n };\r\n\r\n const handleBlur = () => {\r\n setIsFocused(false);\r\n onBlur?.(value);\r\n };\r\n\r\n const handleConfirmClick = () => {\r\n onConfirm(value);\r\n };\r\n\r\n const wrapClasses = [\"ns-input-wrap\", className].filter(Boolean).join(\" \");\r\n const inputClasses = [\r\n \"ns-input\",\r\n `ns-input--${type}`,\r\n isFocused ? \"ns-input--focused\" : undefined,\r\n inputClassName,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n // Map field type to appropriate inputMode\r\n const inputMode = (() => {\r\n switch (type) {\r\n case \"tel\": return \"tel\" as const;\r\n case \"email\": return \"email\" as const;\r\n case \"number\": return \"numeric\" as const;\r\n default: return undefined;\r\n }\r\n })();\r\n\r\n return (\r\n <span className={wrapClasses}>\r\n <input\r\n ref={inputRef}\r\n id={`ns-field-${fieldKey}`}\r\n className={inputClasses}\r\n type={type === \"number\" ? \"text\" : type}\r\n inputMode={inputMode}\r\n value={value}\r\n placeholder={placeholder}\r\n onChange={handleChange}\r\n onKeyDown={handleKeyDown}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n onPaste={handlePaste}\r\n autoComplete=\"off\"\r\n aria-label={fieldKey}\r\n aria-invalid={undefined}\r\n />\r\n <EnterButton onConfirm={handleConfirmClick} />\r\n {suffix && <span className=\"ns-suffix\">{suffix}</span>}\r\n </span>\r\n );\r\n};\r\n","/**\r\n * Pencil edit icon button for confirmed fields.\r\n *\r\n * @remarks\r\n * Appears inline next to the filled value after a field is confirmed.\r\n * Clicking it reopens the field for editing.\r\n * CSS class: `ns-edit-btn`\r\n */\r\n\r\nimport React from \"react\";\r\n\r\n/** Props for the EditIcon component. */\r\nexport interface EditIconProps {\r\n /** Callback fired when the edit icon is clicked. */\r\n onEdit: () => void;\r\n /** Accessible label for the button. Default: \"Edit\" */\r\n label?: string;\r\n /** Additional CSS class name. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A small pencil icon button that triggers field editing.\r\n *\r\n * @param props - Edit icon configuration\r\n */\r\nexport const EditIcon: React.FC<EditIconProps> = React.memo(function EditIcon({\r\n onEdit,\r\n label = \"Edit\",\r\n className,\r\n}) {\r\n const classes = [\"ns-edit-btn\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={classes}\r\n onClick={onEdit}\r\n aria-label={label}\r\n title={label}\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\r\n <path d=\"m15 5 4 4\" />\r\n </svg>\r\n </button>\r\n );\r\n});\r\n","/**\r\n * Confirmed/filled value display component.\r\n *\r\n * @remarks\r\n * Renders the confirmed field value as styled italic text alongside\r\n * an edit icon. Shown after a field is confirmed.\r\n * CSS classes: `ns-filled-wrap`, `ns-filled-value`\r\n */\r\n\r\nimport React from \"react\";\r\nimport { EditIcon } from \"./EditIcon\";\r\n\r\n/** Props for the FilledValue component. */\r\nexport interface FilledValueProps {\r\n /** The confirmed value to display. */\r\n value: string;\r\n /** Suffix text displayed after the value. */\r\n suffix?: string;\r\n /** Whether the edit icon should be shown. Default: true */\r\n editable?: boolean;\r\n /** Callback fired when the edit icon is clicked. */\r\n onEdit?: () => void;\r\n /** Label for the edit button. Default: \"Edit\" */\r\n editLabel?: string;\r\n /** Additional CSS class name. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Displays a confirmed field value with an optional edit icon.\r\n *\r\n * @param props - FilledValue configuration\r\n */\r\nexport const FilledValue: React.FC<FilledValueProps> = React.memo(function FilledValue({\r\n value,\r\n suffix,\r\n editable = true,\r\n onEdit,\r\n editLabel = \"Edit\",\r\n className,\r\n}) {\r\n const classes = [\"ns-filled-wrap\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <span className={classes}>\r\n <span className=\"ns-filled-value\">{value}</span>\r\n {suffix && <span className=\"ns-suffix\">{suffix}</span>}\r\n {editable && onEdit && (\r\n <EditIcon onEdit={onEdit} label={editLabel} />\r\n )}\r\n </span>\r\n );\r\n});\r\n","/**\r\n * ErrorMessage — validation error display for narrative-form.\r\n *\r\n * @remarks\r\n * Displays validation errors based on the configured mode (inline, tooltip).\r\n * Supports animations (fadeUp, slideDown, shake) and optional icons.\r\n *\r\n * CSS classes:\r\n * - `ns-error-wrap` (base)\r\n * - `ns-error-wrap--tooltip` / `ns-error-wrap--inline`\r\n * - `ns-error-wrap--above` / `ns-error-wrap--below`\r\n * - `ns-error-text`\r\n * - `ns-error-text--shake`\r\n * - `ns-animate-fade-up` / `ns-animate-slide-down`\r\n */\r\n\r\nimport React from \"react\";\r\nimport type { NarrativeErrorDisplay } from \"@viveksinghind/narrative-form-core\";\r\n\r\n/** Props for the ErrorMessage component. */\r\nexport interface ErrorMessageProps {\r\n /** The error message to display. */\r\n message: string;\r\n /** Display configuration for the error. */\r\n display?: NarrativeErrorDisplay;\r\n /** Additional CSS class name. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Renders a validation error message.\r\n *\r\n * @param props - Error message configuration\r\n */\r\nexport const ErrorMessage: React.FC<ErrorMessageProps> = React.memo(function ErrorMessage({\r\n message,\r\n display = {},\r\n className,\r\n}) {\r\n const mode = display.mode ?? \"inline\";\r\n \r\n // If mode is toast, the error is handled by ToastProvider, so we don't render it here\r\n // (unless it's 'inline+shake', which means we render inline AND the parent handles shake)\r\n if (mode === \"toast\" || mode === \"shake\") {\r\n return null; \r\n }\r\n\r\n const position = display.position ?? \"below\";\r\n const animateIn = display.animateIn ?? \"fadeUp\";\r\n const showIcon = display.icon ?? false;\r\n const iconChar = display.iconChar ?? \"⚠\";\r\n const isTooltip = mode === \"tooltip\";\r\n const isInlineShake = mode === \"inline+shake\";\r\n\r\n const wrapClasses = [\r\n \"ns-error-wrap\",\r\n isTooltip ? \"ns-error-wrap--tooltip\" : \"ns-error-wrap--inline\",\r\n `ns-error-wrap--${position}`,\r\n animateIn === \"fadeUp\" ? \"ns-animate-fade-up\" : undefined,\r\n animateIn === \"slideDown\" ? \"ns-animate-slide-down\" : undefined,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const textClasses = [\r\n \"ns-error-text\",\r\n isInlineShake ? \"ns-error-text--shake\" : undefined,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={wrapClasses} role=\"alert\" aria-live=\"assertive\">\r\n <span className={textClasses}>\r\n {showIcon && <span className=\"ns-error-icon\" aria-hidden=\"true\">{iconChar} </span>}\r\n {message}\r\n </span>\r\n </div>\r\n );\r\n});\r\n","/**\r\n * ChipsField — tap to select one option for narrative-form.\r\n *\r\n * @remarks\r\n * Renders a row of pill-shaped chips. User taps one to select it.\r\n * Supports optional auto-advance, keyboard navigation (Arrow keys + Space),\r\n * and RTL layout.\r\n * CSS classes: `ns-chips-wrap`, `ns-chip`, `ns-chip--active`, `ns-chip--hover`\r\n */\r\n\r\nimport React, { useState, useCallback, useRef } from \"react\";\r\n\r\n/** Props for the ChipsField component. */\r\nexport interface ChipsFieldProps {\r\n /** Unique field key. */\r\n fieldKey: string;\r\n /** Array of option labels. */\r\n options: string[];\r\n /** Currently selected value (for edit mode). */\r\n defaultValue?: string;\r\n /** Whether to auto-confirm on selection. Default: false */\r\n autoAdvance?: boolean;\r\n /** Callback when a value is confirmed. */\r\n onConfirm: (value: string) => void;\r\n /** Callback on selection change. */\r\n onChange?: (value: string) => void;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A single-select chip field rendered inline within a sentence.\r\n * Supports Arrow Left/Right keyboard navigation and Space to select.\r\n *\r\n * @param props - ChipsField configuration\r\n */\r\nexport const ChipsField: React.FC<ChipsFieldProps> = function ChipsField({\r\n fieldKey,\r\n options,\r\n defaultValue,\r\n autoAdvance = false,\r\n onConfirm,\r\n onChange,\r\n className,\r\n}) {\r\n const [selected, setSelected] = useState<string | null>(defaultValue ?? null);\r\n const [focusedIndex, setFocusedIndex] = useState<number>(0);\r\n const chipsRef = useRef<(HTMLButtonElement | null)[]>([]);\r\n\r\n const handleSelect = useCallback(\r\n (option: string) => {\r\n setSelected(option);\r\n onChange?.(option);\r\n\r\n if (autoAdvance) {\r\n onConfirm(option);\r\n }\r\n },\r\n [autoAdvance, onConfirm, onChange],\r\n );\r\n\r\n const handleConfirm = useCallback(() => {\r\n if (selected !== null) {\r\n onConfirm(selected);\r\n }\r\n }, [selected, onConfirm]);\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent, index: number) => {\r\n switch (e.key) {\r\n case \"Enter\":\r\n case \" \": {\r\n e.preventDefault();\r\n const option = options[index];\r\n if (option) handleSelect(option);\r\n break;\r\n }\r\n case \"ArrowRight\":\r\n case \"ArrowDown\": {\r\n e.preventDefault();\r\n const nextIndex = (index + 1) % options.length;\r\n setFocusedIndex(nextIndex);\r\n chipsRef.current[nextIndex]?.focus();\r\n break;\r\n }\r\n case \"ArrowLeft\":\r\n case \"ArrowUp\": {\r\n e.preventDefault();\r\n const prevIndex = (index - 1 + options.length) % options.length;\r\n setFocusedIndex(prevIndex);\r\n chipsRef.current[prevIndex]?.focus();\r\n break;\r\n }\r\n }\r\n },\r\n [handleSelect, options],\r\n );\r\n\r\n const wrapClasses = [\"ns-chips-wrap\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <span className={wrapClasses} role=\"listbox\" aria-label={fieldKey}>\r\n {options.map((option, index) => {\r\n const chipClasses = [\r\n \"ns-chip\",\r\n selected === option ? \"ns-chip--active\" : undefined,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <button\r\n key={option}\r\n ref={(el) => { chipsRef.current[index] = el; }}\r\n type=\"button\"\r\n className={chipClasses}\r\n onClick={() => handleSelect(option)}\r\n onKeyDown={(e) => handleKeyDown(e, index)}\r\n aria-selected={selected === option}\r\n role=\"option\"\r\n tabIndex={index === focusedIndex ? 0 : -1}\r\n >\r\n {option}\r\n </button>\r\n );\r\n })}\r\n {!autoAdvance && selected !== null && (\r\n <button\r\n type=\"button\"\r\n className=\"ns-enter-btn\"\r\n onClick={handleConfirm}\r\n aria-label=\"Confirm\"\r\n style={{ opacity: 1, transform: \"none\" }}\r\n >\r\n ↵\r\n </button>\r\n )}\r\n </span>\r\n );\r\n};\r\n","/**\r\n * MultiChipsField — tap to select multiple options for narrative-form.\r\n *\r\n * @remarks\r\n * Renders a row of pill-shaped chips. User can tap multiple to select them.\r\n * Confirmed value is an array of selected option strings.\r\n * CSS classes: `ns-chips-wrap`, `ns-chip`, `ns-chip--active`, `ns-chip--hover`\r\n */\r\n\r\nimport React, { useState, useCallback } from \"react\";\r\n\r\n/** Props for the MultiChipsField component. */\r\nexport interface MultiChipsFieldProps {\r\n /** Unique field key. */\r\n fieldKey: string;\r\n /** Array of option labels. */\r\n options: string[];\r\n /** Currently selected values (for edit mode). */\r\n defaultValue?: string[];\r\n /** Callback when values are confirmed. Receives comma-separated string. */\r\n onConfirm: (value: string) => void;\r\n /** Callback on selection change. */\r\n onChange?: (value: string) => void;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A multi-select chip field rendered inline within a sentence.\r\n *\r\n * @param props - MultiChipsField configuration\r\n */\r\nexport const MultiChipsField: React.FC<MultiChipsFieldProps> = function MultiChipsField({\r\n fieldKey,\r\n options,\r\n defaultValue,\r\n onConfirm,\r\n onChange,\r\n className,\r\n}) {\r\n const [selected, setSelected] = useState<Set<string>>(\r\n new Set(defaultValue ?? []),\r\n );\r\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\r\n\r\n const handleToggle = useCallback(\r\n (option: string) => {\r\n setSelected((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(option)) {\r\n next.delete(option);\r\n } else {\r\n next.add(option);\r\n }\r\n const value = Array.from(next).join(\", \");\r\n onChange?.(value);\r\n return next;\r\n });\r\n },\r\n [onChange],\r\n );\r\n\r\n const handleConfirm = useCallback(() => {\r\n if (selected.size > 0) {\r\n onConfirm(Array.from(selected).join(\", \"));\r\n }\r\n }, [selected, onConfirm]);\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent, option: string) => {\r\n if (e.key === \"Enter\" && selected.size > 0) {\r\n e.preventDefault();\r\n handleConfirm();\r\n } else if (e.key === \" \") {\r\n e.preventDefault();\r\n handleToggle(option);\r\n }\r\n },\r\n [handleToggle, handleConfirm, selected.size],\r\n );\r\n\r\n const wrapClasses = [\"ns-chips-wrap\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <span className={wrapClasses}>\r\n {options.map((option, index) => {\r\n const isSelected = selected.has(option);\r\n const chipClasses = [\r\n \"ns-chip\",\r\n isSelected ? \"ns-chip--active\" : undefined,\r\n hoveredIndex === index ? \"ns-chip--hover\" : undefined,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <button\r\n key={option}\r\n type=\"button\"\r\n className={chipClasses}\r\n onClick={() => handleToggle(option)}\r\n onKeyDown={(e) => handleKeyDown(e, option)}\r\n onMouseEnter={() => setHoveredIndex(index)}\r\n onMouseLeave={() => setHoveredIndex(null)}\r\n aria-pressed={isSelected}\r\n role=\"option\"\r\n >\r\n {option}\r\n </button>\r\n );\r\n })}\r\n {selected.size > 0 && (\r\n <button\r\n type=\"button\"\r\n className=\"ns-enter-btn\"\r\n onClick={handleConfirm}\r\n aria-label=\"Confirm\"\r\n >\r\n ↵\r\n </button>\r\n )}\r\n </span>\r\n );\r\n};\r\n","/**\r\n * SelectField — inline dropdown for narrative-form.\r\n *\r\n * @remarks\r\n * Renders a native `<select>` element inline within a sentence.\r\n * CSS classes: `ns-select-wrap`, `ns-select`\r\n */\r\n\r\nimport React, { useState, useRef, useEffect, useCallback } from \"react\";\r\n\r\n/** Props for the SelectField component. */\r\nexport interface SelectFieldProps {\r\n /** Unique field key. */\r\n fieldKey: string;\r\n /** Array of option labels. */\r\n options: string[];\r\n /** Placeholder text for the default empty option. */\r\n placeholder?: string;\r\n /** Currently selected value (for edit mode). */\r\n defaultValue?: string;\r\n /** Whether to auto-confirm on selection. Default: false */\r\n autoAdvance?: boolean;\r\n /** Callback when a value is confirmed. */\r\n onConfirm: (value: string) => void;\r\n /** Callback on selection change. */\r\n onChange?: (value: string) => void;\r\n /** Callback when input receives focus. */\r\n onFocus?: () => void;\r\n /** Callback when input loses focus. */\r\n onBlur?: (value: string) => void;\r\n /** Additional CSS class for the select element. */\r\n inputClassName?: string;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * An inline dropdown select field rendered within a sentence.\r\n *\r\n * @param props - SelectField configuration\r\n */\r\nexport const SelectField: React.FC<SelectFieldProps> = function SelectField({\r\n fieldKey,\r\n options,\r\n placeholder = \"Select…\",\r\n defaultValue = \"\",\r\n autoAdvance = false,\r\n onConfirm,\r\n onChange,\r\n onFocus,\r\n onBlur,\r\n inputClassName,\r\n className,\r\n}) {\r\n const [value, setValue] = useState(defaultValue);\r\n const selectRef = useRef<HTMLSelectElement>(null);\r\n\r\n // Auto-focus when select appears\r\n useEffect(() => {\r\n selectRef.current?.focus();\r\n }, []);\r\n\r\n const handleChange = useCallback(\r\n (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n const newValue = e.target.value;\r\n setValue(newValue);\r\n onChange?.(newValue);\r\n\r\n if (autoAdvance && newValue !== \"\") {\r\n onConfirm(newValue);\r\n }\r\n },\r\n [autoAdvance, onConfirm, onChange],\r\n );\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent<HTMLSelectElement>) => {\r\n if (e.key === \"Enter\" && value !== \"\") {\r\n e.preventDefault();\r\n onConfirm(value);\r\n }\r\n },\r\n [value, onConfirm],\r\n );\r\n\r\n const handleConfirmClick = useCallback(() => {\r\n if (value !== \"\") {\r\n onConfirm(value);\r\n }\r\n }, [value, onConfirm]);\r\n\r\n const wrapClasses = [\"ns-select-wrap\", className].filter(Boolean).join(\" \");\r\n const selectClasses = [\"ns-select\", inputClassName].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <span className={wrapClasses}>\r\n <select\r\n ref={selectRef}\r\n id={`ns-field-${fieldKey}`}\r\n className={selectClasses}\r\n value={value}\r\n onChange={handleChange}\r\n onKeyDown={handleKeyDown}\r\n onFocus={() => onFocus?.()}\r\n onBlur={() => onBlur?.(value)}\r\n aria-label={fieldKey}\r\n >\r\n <option value=\"\" disabled>\r\n {placeholder}\r\n </option>\r\n {options.map((option) => (\r\n <option key={option} value={option}>\r\n {option}\r\n </option>\r\n ))}\r\n </select>\r\n {!autoAdvance && value !== \"\" && (\r\n <button\r\n type=\"button\"\r\n className=\"ns-enter-btn\"\r\n onClick={handleConfirmClick}\r\n aria-label=\"Confirm\"\r\n >\r\n ↵\r\n </button>\r\n )}\r\n </span>\r\n );\r\n};\r\n","/**\r\n * OtpField — N-digit OTP input for narrative-form.\r\n *\r\n * @remarks\r\n * Each digit is a separate focusable input. Auto-focuses the next box\r\n * on digit entry, auto-focuses previous on backspace. Paste distributes\r\n * across all boxes. Never logs or exposes the OTP value in console.\r\n *\r\n * CSS classes: `ns-otp-wrap`, `ns-otp-box`, `ns-otp-box--filled`,\r\n * `ns-otp-box--active`, `ns-otp-box--error`, `ns-otp-resend`,\r\n * `ns-otp-resend--disabled`, `ns-otp-timer`\r\n */\r\n\r\nimport React, { useState, useRef, useCallback, useEffect } from \"react\";\r\n\r\n/** Props for the OtpField component. */\r\nexport interface OtpFieldProps {\r\n /** Unique field key. */\r\n fieldKey: string;\r\n /** Number of OTP digit boxes. Default: 6 */\r\n otpLength?: number;\r\n /** Whether to auto-submit when all digits are filled. Default: true */\r\n autoAdvance?: boolean;\r\n /** Called when the OTP field first appears — triggers OTP send. */\r\n onRequest?: () => void | Promise<void>;\r\n /** Called when all digits are filled. */\r\n onVerify?: (otp: string) => void | Promise<void>;\r\n /** Callback when the full OTP is confirmed. */\r\n onConfirm: (value: string) => void;\r\n /** Callback on value change. */\r\n onChange?: (value: string) => void;\r\n /** Label for the resend link. Default: \"Resend code\" */\r\n resendLabel?: string;\r\n /** Seconds before resend is allowed. Default: 30 */\r\n resendDelay?: number;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * An N-digit OTP input with auto-focus, paste distribution, and resend timer.\r\n *\r\n * @param props - OtpField configuration\r\n */\r\nexport const OtpField: React.FC<OtpFieldProps> = function OtpField({\r\n fieldKey,\r\n otpLength = 6,\r\n autoAdvance = true,\r\n onRequest,\r\n onVerify,\r\n onConfirm,\r\n onChange,\r\n resendLabel = \"Resend code\",\r\n resendDelay = 30,\r\n className,\r\n}) {\r\n const [digits, setDigits] = useState<string[]>(Array.from({ length: otpLength }, () => \"\"));\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n const [timer, setTimer] = useState(resendDelay);\r\n const [canResend, setCanResend] = useState(false);\r\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\r\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n const hasRequestedRef = useRef(false);\r\n\r\n // Call onRequest when field first mounts\r\n useEffect(() => {\r\n if (!hasRequestedRef.current) {\r\n hasRequestedRef.current = true;\r\n onRequest?.();\r\n }\r\n }, [onRequest]);\r\n\r\n // Start countdown timer\r\n useEffect(() => {\r\n if (resendDelay <= 0) {\r\n setCanResend(true);\r\n return;\r\n }\r\n\r\n setTimer(resendDelay);\r\n setCanResend(false);\r\n\r\n timerRef.current = setInterval(() => {\r\n setTimer((prev) => {\r\n if (prev <= 1) {\r\n if (timerRef.current !== null) {\r\n clearInterval(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n setCanResend(true);\r\n return 0;\r\n }\r\n return prev - 1;\r\n });\r\n }, 1000);\r\n\r\n return () => {\r\n if (timerRef.current !== null) {\r\n clearInterval(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n };\r\n }, [resendDelay]);\r\n\r\n // Auto-focus first box on mount\r\n useEffect(() => {\r\n inputRefs.current[0]?.focus();\r\n }, []);\r\n\r\n const getOtpString = useCallback(\r\n (d: string[]) => d.join(\"\"),\r\n [],\r\n );\r\n\r\n const handleDigitChange = useCallback(\r\n (index: number, value: string) => {\r\n // Only allow single digits\r\n const digit = value.replace(/\\D/g, \"\").slice(-1);\r\n\r\n setDigits((prev) => {\r\n const next = [...prev];\r\n next[index] = digit;\r\n\r\n const otpString = getOtpString(next);\r\n onChange?.(otpString);\r\n\r\n // Auto-advance to next box\r\n if (digit !== \"\" && index < otpLength - 1) {\r\n inputRefs.current[index + 1]?.focus();\r\n setActiveIndex(index + 1);\r\n }\r\n\r\n // Check if all digits are filled\r\n if (next.every((d) => d !== \"\")) {\r\n onVerify?.(otpString);\r\n if (autoAdvance) {\r\n // Use setTimeout to let state update first\r\n setTimeout(() => onConfirm(otpString), 0);\r\n }\r\n }\r\n\r\n return next;\r\n });\r\n },\r\n [otpLength, autoAdvance, onConfirm, onVerify, onChange, getOtpString],\r\n );\r\n\r\n const handleKeyDown = useCallback(\r\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Backspace\") {\r\n e.preventDefault();\r\n setDigits((prev) => {\r\n const next = [...prev];\r\n if (next[index] !== \"\") {\r\n // Clear current box\r\n next[index] = \"\";\r\n onChange?.(getOtpString(next));\r\n } else if (index > 0) {\r\n // Move to previous box and clear it\r\n next[index - 1] = \"\";\r\n inputRefs.current[index - 1]?.focus();\r\n setActiveIndex(index - 1);\r\n onChange?.(getOtpString(next));\r\n }\r\n return next;\r\n });\r\n } else if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n const otpString = getOtpString(digits);\r\n if (digits.every((d) => d !== \"\")) {\r\n onConfirm(otpString);\r\n }\r\n } else if (e.key === \"ArrowLeft\" && index > 0) {\r\n e.preventDefault();\r\n inputRefs.current[index - 1]?.focus();\r\n setActiveIndex(index - 1);\r\n } else if (e.key === \"ArrowRight\" && index < otpLength - 1) {\r\n e.preventDefault();\r\n inputRefs.current[index + 1]?.focus();\r\n setActiveIndex(index + 1);\r\n }\r\n },\r\n [digits, otpLength, onConfirm, onChange, getOtpString],\r\n );\r\n\r\n const handlePaste = useCallback(\r\n (e: React.ClipboardEvent<HTMLInputElement>) => {\r\n e.preventDefault();\r\n const pastedData = e.clipboardData.getData(\"text\").replace(/\\D/g, \"\").slice(0, otpLength);\r\n\r\n if (pastedData.length === 0) return;\r\n\r\n setDigits((prev) => {\r\n const next = [...prev];\r\n for (let i = 0; i < pastedData.length; i++) {\r\n const char = pastedData[i];\r\n if (char !== undefined) {\r\n next[i] = char;\r\n }\r\n }\r\n\r\n const otpString = getOtpString(next);\r\n onChange?.(otpString);\r\n\r\n // Focus the next empty box or the last one\r\n const nextEmptyIndex = next.findIndex((d) => d === \"\");\r\n const focusIndex = nextEmptyIndex === -1 ? otpLength - 1 : nextEmptyIndex;\r\n inputRefs.current[focusIndex]?.focus();\r\n setActiveIndex(focusIndex);\r\n\r\n // Check if complete after paste\r\n if (next.every((d) => d !== \"\")) {\r\n onVerify?.(otpString);\r\n if (autoAdvance) {\r\n setTimeout(() => onConfirm(otpString), 0);\r\n }\r\n }\r\n\r\n return next;\r\n });\r\n },\r\n [otpLength, autoAdvance, onConfirm, onVerify, onChange, getOtpString],\r\n );\r\n\r\n const handleResend = useCallback(() => {\r\n if (!canResend) return;\r\n setCanResend(false);\r\n setTimer(resendDelay);\r\n setDigits(Array.from({ length: otpLength }, () => \"\"));\r\n setActiveIndex(0);\r\n inputRefs.current[0]?.focus();\r\n onRequest?.();\r\n\r\n // Restart timer\r\n timerRef.current = setInterval(() => {\r\n setTimer((prev) => {\r\n if (prev <= 1) {\r\n if (timerRef.current !== null) {\r\n clearInterval(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n setCanResend(true);\r\n return 0;\r\n }\r\n return prev - 1;\r\n });\r\n }, 1000);\r\n }, [canResend, resendDelay, otpLength, onRequest]);\r\n\r\n const handleFocus = useCallback((index: number) => {\r\n setActiveIndex(index);\r\n }, []);\r\n\r\n const wrapClasses = [\"ns-otp-wrap\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <span className={wrapClasses}>\r\n <span className=\"ns-otp-boxes\">\r\n {digits.map((digit, index) => {\r\n const boxClasses = [\r\n \"ns-otp-box\",\r\n digit !== \"\" ? \"ns-otp-box--filled\" : undefined,\r\n activeIndex === index ? \"ns-otp-box--active\" : undefined,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <input\r\n key={index}\r\n ref={(el) => { inputRefs.current[index] = el; }}\r\n className={boxClasses}\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n maxLength={1}\r\n value={digit}\r\n onChange={(e) => handleDigitChange(index, e.target.value)}\r\n onKeyDown={(e) => handleKeyDown(index, e)}\r\n onPaste={handlePaste}\r\n onFocus={() => handleFocus(index)}\r\n autoComplete=\"one-time-code\"\r\n aria-label={`Digit ${String(index + 1)}`}\r\n />\r\n );\r\n })}\r\n </span>\r\n\r\n {!autoAdvance && digits.every((d) => d !== \"\") && (\r\n <button\r\n type=\"button\"\r\n className=\"ns-enter-btn\"\r\n onClick={() => onConfirm(getOtpString(digits))}\r\n aria-label=\"Confirm\"\r\n >\r\n ↵\r\n </button>\r\n )}\r\n\r\n <span className=\"ns-otp-resend-wrap\">\r\n {canResend ? (\r\n <button\r\n type=\"button\"\r\n className=\"ns-otp-resend\"\r\n onClick={handleResend}\r\n >\r\n {resendLabel}\r\n </button>\r\n ) : (\r\n <span className=\"ns-otp-resend ns-otp-resend--disabled\">\r\n <span className=\"ns-otp-timer\">\r\n Resend in {String(timer)}s\r\n </span>\r\n </span>\r\n )}\r\n </span>\r\n </span>\r\n );\r\n};\r\n","/**\r\n * PasswordField — masked password input for narrative-form.\r\n *\r\n * @remarks\r\n * Renders an inline input with `type=\"password\"` and a show/hide toggle.\r\n * CSS classes: `ns-input--password`, `ns-password-toggle`\r\n */\r\n\r\nimport React, { useState } from \"react\";\r\nimport { InlineInput } from \"../InlineInput\";\r\n\r\n/** Props for the PasswordField component. */\r\nexport interface PasswordFieldProps {\r\n /** Unique field key. */\r\n fieldKey: string;\r\n /** Placeholder text. */\r\n placeholder?: string;\r\n /** Initial value (for edit mode). */\r\n defaultValue?: string;\r\n /** Suffix text after the input. */\r\n suffix?: string;\r\n /** Callback when the value is confirmed. */\r\n onConfirm: (value: string) => void;\r\n /** Callback on every keystroke. */\r\n onChange?: (value: string) => void;\r\n /** Callback when input receives focus. */\r\n onFocus?: () => void;\r\n /** Callback when input loses focus. */\r\n onBlur?: (value: string) => void;\r\n /** Whether to show a show/hide toggle. Default: true */\r\n showToggle?: boolean;\r\n /** Additional CSS class for the input element. */\r\n inputClassName?: string;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A masked password input field with optional show/hide toggle.\r\n *\r\n * @param props - PasswordField configuration\r\n */\r\nexport const PasswordField: React.FC<PasswordFieldProps> = function PasswordField({\r\n showToggle = true,\r\n inputClassName,\r\n ...props\r\n}) {\r\n const [visible, setVisible] = useState(false);\r\n\r\n const toggleVisibility = () => {\r\n setVisible((prev) => !prev);\r\n };\r\n\r\n const combinedClassName = [\r\n inputClassName,\r\n \"ns-input--password\",\r\n ].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <span className=\"ns-password-wrap\">\r\n <InlineInput\r\n {...props}\r\n type={visible ? \"text\" : \"password\"}\r\n inputClassName={combinedClassName}\r\n />\r\n {showToggle && (\r\n <button\r\n type=\"button\"\r\n className=\"ns-password-toggle\"\r\n onClick={toggleVisibility}\r\n aria-label={visible ? \"Hide password\" : \"Show password\"}\r\n tabIndex={-1}\r\n >\r\n {visible ? \"Hide\" : \"Show\"}\r\n </button>\r\n )}\r\n </span>\r\n );\r\n};\r\n","/**\r\n * DateField — inline date picker for narrative-form.\r\n *\r\n * @remarks\r\n * Renders a native date picker inline.\r\n * CSS classes: `ns-input-wrap`, `ns-input`, `ns-input--date`\r\n */\r\n\r\nimport React from \"react\";\r\nimport { InlineInput } from \"../InlineInput\";\r\n\r\nexport interface DateFieldProps {\r\n fieldKey: string;\r\n placeholder?: string;\r\n defaultValue?: string;\r\n suffix?: string;\r\n onConfirm: (value: string) => void;\r\n onChange?: (value: string) => void;\r\n onFocus?: () => void;\r\n onBlur?: (value: string) => void;\r\n inputClassName?: string;\r\n className?: string;\r\n}\r\n\r\nexport const DateField: React.FC<DateFieldProps> = function DateField({\r\n fieldKey,\r\n placeholder,\r\n defaultValue,\r\n suffix,\r\n onConfirm,\r\n onChange,\r\n onFocus,\r\n onBlur,\r\n inputClassName,\r\n className,\r\n}) {\r\n return (\r\n <InlineInput\r\n fieldKey={fieldKey}\r\n type=\"date\"\r\n placeholder={placeholder}\r\n defaultValue={defaultValue}\r\n suffix={suffix}\r\n onConfirm={onConfirm}\r\n onChange={onChange}\r\n onFocus={onFocus}\r\n onBlur={onBlur}\r\n inputClassName={inputClassName}\r\n className={className}\r\n />\r\n );\r\n};\r\n","/**\r\n * ToastProvider — manages toast notifications for validation errors.\r\n *\r\n * @remarks\r\n * Provides a context to dispatch toasts, and renders them in a fixed container.\r\n */\r\n\r\nimport React, { createContext, useContext, useState, useCallback } from \"react\";\r\n\r\nexport interface ToastMessage {\r\n id: string;\r\n message: string;\r\n icon?: boolean;\r\n iconChar?: string;\r\n}\r\n\r\ninterface ToastContextValue {\r\n showToast: (message: string, icon?: boolean, iconChar?: string) => void;\r\n hideToast: (id: string) => void;\r\n}\r\n\r\nconst ToastContext = createContext<ToastContextValue | null>(null);\r\n\r\nexport const useToast = () => {\r\n const context = useContext(ToastContext);\r\n if (!context) {\r\n throw new Error(\"useToast must be used within a ToastProvider\");\r\n }\r\n return context;\r\n};\r\n\r\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n const [toasts, setToasts] = useState<ToastMessage[]>([]);\r\n\r\n const showToast = useCallback((message: string, icon = false, iconChar = \"⚠\") => {\r\n const id = Math.random().toString(36).substring(2, 9);\r\n setToasts((prev) => [...prev, { id, message, icon, iconChar }]);\r\n\r\n // Auto dismiss after 3 seconds\r\n setTimeout(() => {\r\n setToasts((prev) => prev.filter((t) => t.id !== id));\r\n }, 3000);\r\n }, []);\r\n\r\n const hideToast = useCallback((id: string) => {\r\n setToasts((prev) => prev.filter((t) => t.id !== id));\r\n }, []);\r\n\r\n return (\r\n <ToastContext.Provider value={{ showToast, hideToast }}>\r\n {children}\r\n {toasts.length > 0 && (\r\n <div className=\"ns-toast-container\" aria-live=\"polite\">\r\n {toasts.map((toast) => (\r\n <div key={toast.id} className=\"ns-toast ns-animate-fade-up\">\r\n {toast.icon && <span className=\"ns-toast-icon\">{toast.iconChar} </span>}\r\n <span className=\"ns-toast-message\">{toast.message}</span>\r\n <button \r\n type=\"button\" \r\n className=\"ns-toast-close\" \r\n onClick={() => hideToast(toast.id)}\r\n aria-label=\"Close\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </ToastContext.Provider>\r\n );\r\n};\r\n","/**\r\n * Line — single sentence row orchestrator for narrative-form.\r\n *\r\n * @remarks\r\n * Manages the full lifecycle of a single field within the form:\r\n * `typing → active → confirmed → editing`.\r\n *\r\n * Composes: Prose + InlineInput (or FilledValue + EditIcon) + ErrorMessage.\r\n * Runs validation on confirm — blocks confirmation if validation fails.\r\n * Supports async validation with loading/success visual states.\r\n * CSS classes: `ns-line`, `ns-line--active`, `ns-line--confirmed`,\r\n * `ns-line--editing`, `ns-line--error`, `ns-line-[key]`\r\n */\r\n\r\nimport React, { useCallback, useState, useRef } from \"react\";\r\nimport type { NarrativeField, NarrativeTypewriter, NarrativeFieldValues } from \"@viveksinghind/narrative-form-core\";\r\nimport type { FieldStatus } from \"@viveksinghind/narrative-form-core\";\r\nimport { validateField, validateFieldAsync, hasAsyncValidation } from \"@viveksinghind/narrative-form-core\";\r\nimport { Prose } from \"./Prose\";\r\nimport { InlineInput } from \"./InlineInput\";\r\nimport { FilledValue } from \"./FilledValue\";\r\nimport { ErrorMessage } from \"./ErrorMessage\";\r\nimport { ChipsField } from \"./fields/ChipsField\";\r\nimport { MultiChipsField } from \"./fields/MultiChipsField\";\r\nimport { SelectField } from \"./fields/SelectField\";\r\nimport { OtpField } from \"./fields/OtpField\";\r\nimport { PasswordField } from \"./fields/PasswordField\";\r\nimport { DateField } from \"./fields/DateField\";\r\nimport { useToast } from \"./ToastProvider\";\r\n\r\n/** Async validation visual state. */\r\ntype AsyncState = \"idle\" | \"validating\" | \"valid\" | \"invalid\";\r\n\r\n/** Props for the Line component. */\r\nexport interface LineProps {\r\n /** The field configuration for this line. */\r\n field: NarrativeField;\r\n /** Current lifecycle status of this field. */\r\n status: FieldStatus;\r\n /** The confirmed value (if any). */\r\n value?: string | string[];\r\n /** All confirmed values so far (for cross-field validation). */\r\n allValues?: NarrativeFieldValues;\r\n /** Typewriter configuration. */\r\n typewriter?: NarrativeTypewriter;\r\n /** Whether editing is enabled globally. Default: true */\r\n editable?: boolean;\r\n /** Whether this field is locked (lockPrevious). */\r\n locked?: boolean;\r\n /** Label for the edit button. */\r\n editLabel?: string;\r\n /** Called when typing animation completes — field should become active. */\r\n onTypingComplete: (key: string) => void;\r\n /** Called when the field value is confirmed (after validation passes). */\r\n onConfirm: (key: string, value: string) => void;\r\n /** Called when the edit icon is clicked. */\r\n onEdit: (key: string) => void;\r\n /** Called when validation fails. */\r\n onError?: (key: string, message: string) => void;\r\n /** Called on every keystroke. */\r\n onChange?: (key: string, value: string) => void;\r\n /** Called when input receives focus. */\r\n onFocus?: (key: string) => void;\r\n /** Called when input loses focus. */\r\n onBlur?: (key: string, value: string) => void;\r\n}\r\n\r\n/** Helper props for the field rendering function. */\r\ninterface RenderFieldInputProps {\r\n field: NarrativeField;\r\n status: FieldStatus;\r\n value?: string | string[];\r\n handleConfirm: (val: string) => void;\r\n handleChange: (val: string) => void;\r\n handleFocus: () => void;\r\n handleBlur: (val: string) => void;\r\n handlePaste?: (val: string) => string;\r\n}\r\n\r\n/**\r\n * Renders the correct input component based on field type.\r\n */\r\nfunction renderFieldInput({\r\n field,\r\n status,\r\n value,\r\n handleConfirm,\r\n handleChange,\r\n handleFocus,\r\n handleBlur,\r\n}: RenderFieldInputProps): React.ReactNode {\r\n const editValue =\r\n status === \"editing\" && value !== undefined ? String(value) : field.defaultValue;\r\n\r\n switch (field.type) {\r\n case \"chips\":\r\n return (\r\n <ChipsField\r\n fieldKey={field.key}\r\n options={field.options ?? []}\r\n defaultValue={editValue}\r\n autoAdvance={field.autoAdvance}\r\n onConfirm={handleConfirm}\r\n onChange={handleChange}\r\n className={field.inputClassName}\r\n />\r\n );\r\n\r\n case \"multi-chips\":\r\n return (\r\n <MultiChipsField\r\n fieldKey={field.key}\r\n options={field.options ?? []}\r\n defaultValue={\r\n status === \"editing\" && Array.isArray(value)\r\n ? value\r\n : editValue?.split(\", \").filter(Boolean)\r\n }\r\n onConfirm={handleConfirm}\r\n onChange={handleChange}\r\n className={field.inputClassName}\r\n />\r\n );\r\n\r\n case \"select\":\r\n return (\r\n <SelectField\r\n fieldKey={field.key}\r\n options={field.options ?? []}\r\n placeholder={field.placeholder}\r\n defaultValue={editValue}\r\n autoAdvance={field.autoAdvance}\r\n onConfirm={handleConfirm}\r\n onChange={handleChange}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n inputClassName={field.inputClassName}\r\n />\r\n );\r\n\r\n case \"otp\":\r\n return (\r\n <OtpField\r\n fieldKey={field.key}\r\n otpLength={field.otpLength}\r\n autoAdvance={field.autoAdvance ?? true}\r\n onRequest={field.onRequest}\r\n onVerify={field.onVerify}\r\n onConfirm={handleConfirm}\r\n onChange={handleChange}\r\n resendLabel={field.resendLabel}\r\n resendDelay={field.resendDelay}\r\n className={field.inputClassName}\r\n />\r\n );\r\n\r\n case \"password\":\r\n return (\r\n <PasswordField\r\n fieldKey={field.key}\r\n placeholder={field.placeholder}\r\n defaultValue={editValue}\r\n suffix={field.suffix}\r\n onConfirm={handleConfirm}\r\n onChange={handleChange}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n inputClassName={field.inputClassName}\r\n />\r\n );\r\n\r\n case \"date\":\r\n return (\r\n <DateField\r\n fieldKey={field.key}\r\n placeholder={field.placeholder}\r\n defaultValue={editValue}\r\n suffix={field.suffix}\r\n onConfirm={handleConfirm}\r\n onChange={handleChange}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n inputClassName={field.inputClassName}\r\n />\r\n );\r\n\r\n // text, tel, email, number — all use InlineInput with the appropriate type\r\n default:\r\n return (\r\n <InlineInput\r\n fieldKey={field.key}\r\n type={field.type}\r\n placeholder={field.placeholder}\r\n defaultValue={editValue}\r\n suffix={field.suffix}\r\n sanitise={field.sanitise}\r\n onConfirm={handleConfirm}\r\n onChange={handleChange}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n inputClassName={field.inputClassName}\r\n />\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Renders a single sentence row — the core building block of the narrative form.\r\n *\r\n * Lifecycle:\r\n * 1. `typing` — Prose types out the prefix text\r\n * 2. `active` — Input appears for the user to fill\r\n * 3. `confirmed` — Value is locked, shown as filled text with edit icon\r\n * 4. `editing` — User clicked edit, input re-appears with current value\r\n *\r\n * Validation runs on confirm. If it fails, the field stays active and\r\n * an error message is displayed below the input.\r\n *\r\n * @param props - Line configuration\r\n */\r\nexport const Line: React.FC<LineProps> = React.memo(function Line({\r\n field,\r\n status,\r\n value,\r\n allValues = {},\r\n typewriter,\r\n editable = true,\r\n locked = false,\r\n editLabel = \"Edit\",\r\n onTypingComplete,\r\n onConfirm,\r\n onEdit,\r\n onError,\r\n onChange,\r\n onFocus,\r\n onBlur,\r\n}) {\r\n const [error, setError] = useState<string | null>(null);\r\n const [shake, setShake] = useState(false);\r\n const [asyncState, setAsyncState] = useState<AsyncState>(\"idle\");\r\n const abortRef = useRef<(() => void) | null>(null);\r\n const { showToast } = useToast();\r\n\r\n const isFieldEditable = field.editable !== false && editable && !locked;\r\n const shouldAnimate = field.animate !== false && (typewriter?.enabled !== false);\r\n\r\n const handleTypingComplete = useCallback(() => {\r\n onTypingComplete(field.key);\r\n }, [field.key, onTypingComplete]);\r\n\r\n const handleConfirm = useCallback(\r\n (val: string) => {\r\n // Abort any in-flight async validation\r\n abortRef.current?.();\r\n abortRef.current = null;\r\n\r\n // Run sync validation first\r\n const result = validateField(val, field.validation, allValues);\r\n\r\n if (!result.valid) {\r\n const firstError = result.errors[0] ?? \"Validation failed\";\r\n setError(firstError);\r\n setAsyncState(\"idle\");\r\n onError?.(field.key, firstError);\r\n\r\n const display = field.validation?.errorDisplay;\r\n const mode = display?.mode ?? \"inline\";\r\n\r\n if (mode === \"shake\" || mode === \"inline+shake\") {\r\n setShake(false);\r\n setTimeout(() => setShake(true), 10);\r\n }\r\n\r\n if (mode === \"toast\") {\r\n showToast(firstError, display?.icon, display?.iconChar);\r\n }\r\n\r\n return; // Block confirmation\r\n }\r\n\r\n // Check if async validation is needed\r\n if (hasAsyncValidation(field.validation)) {\r\n setAsyncState(\"validating\");\r\n setError(null);\r\n\r\n const handle = validateFieldAsync(val, field.validation, allValues);\r\n abortRef.current = handle.abort;\r\n\r\n handle.promise\r\n .then((asyncResult) => {\r\n if (!asyncResult.valid) {\r\n const firstError = asyncResult.errors[0] ?? \"Validation failed\";\r\n setError(firstError);\r\n setAsyncState(\"invalid\");\r\n onError?.(field.key, firstError);\r\n } else {\r\n setAsyncState(\"valid\");\r\n setError(null);\r\n // Short delay to show success before confirming\r\n setTimeout(() => {\r\n setAsyncState(\"idle\");\r\n onConfirm(field.key, val);\r\n }, 300);\r\n }\r\n })\r\n .catch(() => {\r\n // Aborted or unexpected error — reset silently\r\n setAsyncState(\"idle\");\r\n });\r\n\r\n return; // Don't confirm yet — wait for async\r\n }\r\n\r\n // Sync validation passed, no async — confirm\r\n setError(null);\r\n setShake(false);\r\n setAsyncState(\"idle\");\r\n onConfirm(field.key, val);\r\n },\r\n [field.key, field.validation, allValues, onConfirm, onError, showToast],\r\n );\r\n\r\n const handleEdit = useCallback(() => {\r\n setError(null);\r\n setShake(false);\r\n setAsyncState(\"idle\");\r\n abortRef.current?.();\r\n onEdit(field.key);\r\n }, [field.key, onEdit]);\r\n\r\n const handleChange = useCallback(\r\n (val: string) => {\r\n const clearOn = field.validation?.errorDisplay?.clearOn ?? \"onChange\";\r\n if (clearOn === \"onChange\" && error !== null) {\r\n setError(null);\r\n setShake(false);\r\n setAsyncState(\"idle\");\r\n }\r\n onChange?.(field.key, val);\r\n },\r\n [field.key, onChange, error, field.validation?.errorDisplay?.clearOn],\r\n );\r\n\r\n const handleFocus = useCallback(() => {\r\n const clearOn = field.validation?.errorDisplay?.clearOn ?? \"onChange\";\r\n if (clearOn === \"onFocus\" && error !== null) {\r\n setError(null);\r\n setShake(false);\r\n setAsyncState(\"idle\");\r\n }\r\n onFocus?.(field.key);\r\n }, [field.key, onFocus, error, field.validation?.errorDisplay?.clearOn]);\r\n\r\n const handleBlur = useCallback(\r\n (val: string) => {\r\n onBlur?.(field.key, val);\r\n },\r\n [field.key, onBlur],\r\n );\r\n\r\n // Build CSS class list\r\n const lineClasses = [\r\n \"ns-line\",\r\n `ns-line-${field.key}`,\r\n status === \"active\" || status === \"editing\" ? \"ns-line--active\" : undefined,\r\n status === \"confirmed\" ? \"ns-line--confirmed\" : undefined,\r\n status === \"editing\" ? \"ns-line--editing\" : undefined,\r\n error !== null ? \"ns-line--error\" : undefined,\r\n shake ? \"ns-line--shake\" : undefined,\r\n field.className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n // Determine what to show based on status\r\n const showInput = status === \"active\" || status === \"editing\";\r\n const showFilled = status === \"confirmed\";\r\n\r\n return (\r\n <div className={lineClasses} role=\"group\" aria-label={field.prefix}>\r\n <Prose\r\n text={field.prefix}\r\n animate={status === \"typing\" && shouldAnimate}\r\n speed={typewriter?.speed}\r\n cursor={typewriter?.cursor}\r\n cursorChar={typewriter?.cursorChar}\r\n pauseAfter={typewriter?.pauseAfter}\r\n onComplete={status === \"typing\" ? handleTypingComplete : undefined}\r\n />\r\n\r\n {/* Show input when field is active or being edited */}\r\n {showInput && renderFieldInput({\r\n field,\r\n status,\r\n value,\r\n handleConfirm,\r\n handleChange,\r\n handleFocus,\r\n handleBlur,\r\n })}\r\n\r\n {/* Async validation indicators */}\r\n {showInput && asyncState === \"validating\" && (\r\n <span className=\"ns-loading-indicator\" aria-label=\"Validating\" />\r\n )}\r\n {showInput && asyncState === \"valid\" && (\r\n <span className=\"ns-success-indicator\" aria-label=\"Valid\">✓</span>\r\n )}\r\n\r\n {/* Show filled value when confirmed */}\r\n {showFilled && (\r\n <FilledValue\r\n value={String(value ?? \"\")}\r\n suffix={field.suffix}\r\n editable={isFieldEditable}\r\n onEdit={handleEdit}\r\n editLabel={editLabel}\r\n />\r\n )}\r\n\r\n {/* Show validation error */}\r\n {error !== null && showInput && (\r\n <ErrorMessage\r\n message={error}\r\n display={field.validation?.errorDisplay}\r\n />\r\n )}\r\n </div>\r\n );\r\n});\r\n","/**\r\n * ThemeProvider — applies NarrativeTheme tokens as CSS custom properties.\r\n *\r\n * @remarks\r\n * Converts theme token names (e.g., `background`, `textColor`) into CSS\r\n * variable names (e.g., `--ns-bg`, `--ns-text`) and applies them as inline\r\n * style on a wrapper element. This avoids any CSS-in-JS dependency.\r\n *\r\n * Supports dark mode via `theme.mode` (`'light'`, `'dark'`, `'auto'`).\r\n * When `'auto'`, it uses `matchMedia('(prefers-color-scheme: dark)')`.\r\n *\r\n * CSS classes: none (uses ns-root--dark on root via className)\r\n */\r\n\r\nimport React, { createContext, useContext, useMemo, useEffect, useState } from \"react\";\r\nimport type { NarrativeTheme } from \"@viveksinghind/narrative-form-core\";\r\n\r\n/** Resolved theme context value. */\r\nexport interface ThemeContextValue {\r\n /** The resolved theme tokens (merged with dark overrides if applicable). */\r\n theme: NarrativeTheme;\r\n /** Whether dark mode is currently active. */\r\n isDark: boolean;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextValue>({\r\n theme: {},\r\n isDark: false,\r\n});\r\n\r\n/**\r\n * Hook to access the current theme context.\r\n *\r\n * @returns The resolved theme and dark mode state\r\n */\r\nexport function useTheme(): ThemeContextValue {\r\n return useContext(ThemeContext);\r\n}\r\n\r\n/**\r\n * Maps NarrativeTheme token names to CSS variable names.\r\n * Only tokens with a non-undefined value are included.\r\n */\r\nconst TOKEN_TO_CSS_VAR: Record<string, string> = {\r\n background: \"--ns-bg\",\r\n textColor: \"--ns-text\",\r\n inputBorderColor: \"--ns-border\",\r\n placeholderColor: \"--ns-placeholder-color\",\r\n errorColor: \"--ns-error\",\r\n filledColor: \"--ns-filled-color\",\r\n cursorColor: \"--ns-cursor-color\",\r\n successColor: \"--ns-success-color\",\r\n loadingColor: \"--ns-loading-color\",\r\n fontFamily: \"--ns-font-family\",\r\n uiFontFamily: \"--ns-ui-font\",\r\n fontSize: \"--ns-font-size\",\r\n mobileFontSize: \"--ns-mobile-font-size\",\r\n inputFontStyle: \"--ns-input-font-style\",\r\n lineGap: \"--ns-line-gap\",\r\n pagePadding: \"--ns-page-padding\",\r\n buttonRadius: \"--ns-btn-radius\",\r\n buttonBackground: \"--ns-btn-bg\",\r\n buttonColor: \"--ns-btn-color\",\r\n enterBtnSize: \"--ns-enter-size\",\r\n chipBorderRadius: \"--ns-chip-radius\",\r\n chipBorderColor: \"--ns-chip-border\",\r\n chipActiveBackground: \"--ns-chip-active-bg\",\r\n chipActiveColor: \"--ns-chip-active-color\",\r\n chipFontStyle: \"--ns-chip-font-style\",\r\n};\r\n\r\n/**\r\n * Convert a NarrativeTheme object into a CSS variables style object.\r\n *\r\n * @param theme - Theme tokens to convert\r\n * @returns A React CSSProperties object with CSS custom properties\r\n */\r\nfunction themeToCssVars(theme: NarrativeTheme): React.CSSProperties {\r\n const style: Record<string, string> = {};\r\n\r\n for (const [tokenName, cssVar] of Object.entries(TOKEN_TO_CSS_VAR)) {\r\n const value = theme[tokenName as keyof NarrativeTheme];\r\n if (typeof value === \"string\" && value.length > 0) {\r\n style[cssVar] = value;\r\n }\r\n }\r\n\r\n return style as React.CSSProperties;\r\n}\r\n\r\n/**\r\n * Hook to detect system dark mode preference.\r\n *\r\n * @returns Whether the system prefers dark mode\r\n */\r\nfunction usePrefersDark(): boolean {\r\n const [prefersDark, setPrefersDark] = useState(() => {\r\n if (typeof window === \"undefined\") return false;\r\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\r\n const handler = (e: MediaQueryListEvent): void => {\r\n setPrefersDark(e.matches);\r\n };\r\n\r\n mql.addEventListener(\"change\", handler);\r\n return () => mql.removeEventListener(\"change\", handler);\r\n }, []);\r\n\r\n return prefersDark;\r\n}\r\n\r\n/** Props for the ThemeProvider component. */\r\nexport interface ThemeProviderProps {\r\n /** The theme configuration. */\r\n theme?: NarrativeTheme;\r\n /** Children to render. */\r\n children: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Provides theme context and applies CSS custom properties.\r\n *\r\n * @param props - Theme provider configuration\r\n */\r\nexport const ThemeProvider: React.FC<ThemeProviderProps> = function ThemeProvider({\r\n theme = {},\r\n children,\r\n}) {\r\n const systemPrefersDark = usePrefersDark();\r\n\r\n // Determine if dark mode is active\r\n const isDark = useMemo(() => {\r\n if (theme.mode === \"dark\") return true;\r\n if (theme.mode === \"auto\") return systemPrefersDark;\r\n return false;\r\n }, [theme.mode, systemPrefersDark]);\r\n\r\n // Merge dark overrides if dark mode is active\r\n const resolvedTheme = useMemo(() => {\r\n if (isDark && theme.dark) {\r\n return { ...theme, ...theme.dark };\r\n }\r\n return theme;\r\n }, [theme, isDark]);\r\n\r\n // Convert theme tokens to CSS variables\r\n const cssVars = useMemo(() => themeToCssVars(resolvedTheme), [resolvedTheme]);\r\n\r\n const contextValue = useMemo<ThemeContextValue>(\r\n () => ({ theme: resolvedTheme, isDark }),\r\n [resolvedTheme, isDark],\r\n );\r\n\r\n return (\r\n <ThemeContext.Provider value={contextValue}>\r\n {/*\r\n * CSS variables are set here so they cascade into all ns- elements.\r\n * The ns-root--dark class toggles the dark colour palette from base.css.\r\n * This div is invisible — it only carries CSS variables.\r\n */}\r\n <div style={cssVars} className={isDark ? \"ns-root--dark\" : undefined}>\r\n {children}\r\n </div>\r\n </ThemeContext.Provider>\r\n );\r\n};\r\n","/**\r\n * WelcomeScreen — the opening screen of the narrative form.\r\n *\r\n * @remarks\r\n * Displays a heading (with optional typewriter animation), supporting\r\n * subtext, and a call-to-action button. Shown before any form fields.\r\n *\r\n * CSS classes: `ns-welcome`, `ns-welcome-heading`, `ns-welcome-subtext`,\r\n * `ns-welcome-cta`\r\n */\r\n\r\nimport React, { useCallback } from \"react\";\r\nimport type { NarrativeWelcome, NarrativeTypewriter } from \"@viveksinghind/narrative-form-core\";\r\nimport { Prose } from \"./Prose\";\r\n\r\n/** Props for the WelcomeScreen component. */\r\nexport interface WelcomeScreenProps {\r\n /** Welcome screen configuration. */\r\n welcome: NarrativeWelcome;\r\n /** Typewriter settings for the heading animation. */\r\n typewriter?: NarrativeTypewriter;\r\n /** Called when the CTA button is clicked to start the form. */\r\n onStart: () => void;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Renders the welcome screen with an animated heading and CTA.\r\n *\r\n * @param props - Welcome screen configuration\r\n */\r\nexport const WelcomeScreen: React.FC<WelcomeScreenProps> = React.memo(\r\n function WelcomeScreen({ welcome, typewriter, onStart, className }) {\r\n const heading = welcome.heading ?? \"Welcome\";\r\n const subtext = welcome.subtext;\r\n const ctaLabel = welcome.ctaLabel ?? \"Let\\u2019s go \\u2192\";\r\n const shouldAnimate = typewriter?.enabled !== false;\r\n\r\n const handleClick = useCallback(() => {\r\n onStart();\r\n }, [onStart]);\r\n\r\n const wrapperClasses = [\"ns-welcome\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <div className={wrapperClasses}>\r\n <h1 className=\"ns-welcome-heading\">\r\n <Prose\r\n text={heading}\r\n animate={shouldAnimate}\r\n speed={typewriter?.speed}\r\n cursor={typewriter?.cursor}\r\n cursorChar={typewriter?.cursorChar}\r\n />\r\n </h1>\r\n\r\n {subtext && (\r\n <p className=\"ns-welcome-subtext\">{subtext}</p>\r\n )}\r\n\r\n <button\r\n type=\"button\"\r\n className=\"ns-welcome-cta\"\r\n onClick={handleClick}\r\n >\r\n {ctaLabel}\r\n </button>\r\n </div>\r\n );\r\n },\r\n);\r\n","/**\r\n * DoneScreen — the completion screen shown after all fields are confirmed.\r\n *\r\n * @remarks\r\n * Displays a personalised message (with template variable interpolation)\r\n * and a submit CTA button. Supports `{key}` placeholders in the message\r\n * string that are replaced with confirmed field values.\r\n *\r\n * Also supports a function-mode message: `(values) => string`.\r\n *\r\n * CSS classes: `ns-done`, `ns-done-message`, `ns-done-cta`,\r\n * `ns-done-cta--loading`, `ns-done-cta--success`, `ns-done-cta--error`,\r\n * `ns-done-error`\r\n */\r\n\r\nimport React, { useCallback, useState } from \"react\";\r\nimport type {\r\n NarrativeDone,\r\n NarrativeFieldValues,\r\n NarrativeMeta,\r\n NarrativeTypewriter,\r\n} from \"@viveksinghind/narrative-form-core\";\r\nimport { Prose } from \"./Prose\";\r\n\r\n/** Possible states for the submit CTA button. */\r\ntype SubmitState = \"default\" | \"loading\" | \"success\" | \"error\";\r\n\r\n/** Props for the DoneScreen component. */\r\nexport interface DoneScreenProps {\r\n /** Done screen configuration. */\r\n done: NarrativeDone;\r\n /** All confirmed field values. */\r\n values: NarrativeFieldValues;\r\n /** Analytics metadata. */\r\n meta: NarrativeMeta;\r\n /** Typewriter settings for the message animation. */\r\n typewriter?: NarrativeTypewriter;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Interpolates `{key}` template variables in a string with values.\r\n *\r\n * @param template - String with `{key}` placeholders\r\n * @param values - Map of field key → confirmed value\r\n * @returns Interpolated string\r\n */\r\nfunction interpolateMessage(\r\n template: string,\r\n values: NarrativeFieldValues,\r\n): string {\r\n return template.replace(/\\{(\\w+)\\}/g, (_match, key: string) => {\r\n const val = values[key];\r\n if (Array.isArray(val)) return val.join(\", \");\r\n return typeof val === \"string\" ? val : `{${key}}`;\r\n });\r\n}\r\n\r\n/**\r\n * Renders the done screen with a personalised message and submit button.\r\n *\r\n * @param props - Done screen configuration\r\n */\r\nexport const DoneScreen: React.FC<DoneScreenProps> = React.memo(\r\n function DoneScreen({ done, values, meta, typewriter, className }) {\r\n const [submitState, setSubmitState] = useState<SubmitState>(\"default\");\r\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\r\n\r\n const ctaLabel = done.ctaLabel ?? \"Continue \\u2192\";\r\n const shouldAnimate = typewriter?.enabled !== false;\r\n\r\n // Resolve the message — function or template string\r\n const resolvedMessage = (() => {\r\n if (typeof done.message === \"function\") {\r\n return done.message(values);\r\n }\r\n if (typeof done.message === \"string\") {\r\n return interpolateMessage(done.message, values);\r\n }\r\n return \"You\\u2019re all set!\";\r\n })();\r\n\r\n const handleSubmit = useCallback(async () => {\r\n if (!done.onSubmit || submitState === \"loading\" || submitState === \"success\") {\r\n return;\r\n }\r\n\r\n setSubmitState(\"loading\");\r\n setErrorMessage(null);\r\n\r\n try {\r\n await done.onSubmit(values, meta);\r\n setSubmitState(\"success\");\r\n } catch (err: unknown) {\r\n const msg =\r\n err instanceof Error ? err.message : \"Something went wrong. Please try again.\";\r\n setErrorMessage(msg);\r\n setSubmitState(\"error\");\r\n }\r\n }, [done, values, meta, submitState]);\r\n\r\n const wrapperClasses = [\"ns-done\", className].filter(Boolean).join(\" \");\r\n\r\n const ctaClasses = [\r\n \"ns-done-cta\",\r\n submitState === \"loading\" ? \"ns-done-cta--loading\" : undefined,\r\n submitState === \"success\" ? \"ns-done-cta--success\" : undefined,\r\n submitState === \"error\" ? \"ns-done-cta--error\" : undefined,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n // Determine button label based on state\r\n const buttonLabel = (() => {\r\n switch (submitState) {\r\n case \"loading\":\r\n return \"Please wait\\u2026\";\r\n case \"success\":\r\n return \"\\u2713 Done\";\r\n case \"error\":\r\n return \"Try again\";\r\n default:\r\n return ctaLabel;\r\n }\r\n })();\r\n\r\n return (\r\n <div className={wrapperClasses}>\r\n <div className=\"ns-done-message\">\r\n <Prose\r\n text={resolvedMessage}\r\n animate={shouldAnimate}\r\n speed={typewriter?.speed}\r\n cursor={typewriter?.cursor}\r\n cursorChar={typewriter?.cursorChar}\r\n />\r\n </div>\r\n\r\n {done.onSubmit && (\r\n <button\r\n type=\"button\"\r\n className={ctaClasses}\r\n onClick={handleSubmit}\r\n disabled={submitState === \"loading\" || submitState === \"success\"}\r\n >\r\n {submitState === \"loading\" && (\r\n <span className=\"ns-loading-indicator\" aria-hidden=\"true\" />\r\n )}\r\n {buttonLabel}\r\n </button>\r\n )}\r\n\r\n {errorMessage !== null && (\r\n <p className=\"ns-done-error\">{errorMessage}</p>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n","/**\r\n * NarrativeForm — root component for narrative-form.\r\n *\r\n * @remarks\r\n * Main entry point for consumers. Renders fields one by one with typewriter\r\n * animations and manages the full lifecycle: welcome → fields → done.\r\n *\r\n * Supports: theming, dark mode, welcome/done screens, async validation,\r\n * dynamic forms (fieldsUrl/formConfig), controlled mode, default values,\r\n * field dependencies (showIf), step locking (lockPrevious), i18n/RTL,\r\n * and cross-field validation.\r\n *\r\n * CSS classes: `ns-root`, `ns-letter`, `ns-root--complete`,\r\n * `ns-root--dark`, `ns-root--submitting`, `ns-root--loading`, `ns-root--error`\r\n */\r\n\r\nimport React, { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\r\nimport type {\r\n NarrativeField,\r\n NarrativeTheme,\r\n NarrativeTypewriter,\r\n NarrativeWelcome,\r\n NarrativeDone,\r\n NarrativeCallbacks,\r\n NarrativeFieldValues,\r\n NarrativeMeta,\r\n NarrativeRefHandle,\r\n NarrativeI18n,\r\n NarrativeFormConfig,\r\n NarrativeCrossFieldValidator,\r\n} from \"@viveksinghind/narrative-form-core\";\r\nimport { mergeStrings } from \"@viveksinghind/narrative-form-core\";\r\nimport { useFormState } from \"./hooks/useFormState\";\r\nimport { useDynamicForm } from \"./hooks/useDynamicForm\";\r\nimport { Line } from \"./components/Line\";\r\nimport { ToastProvider } from \"./components/ToastProvider\";\r\nimport { ThemeProvider, useTheme } from \"./components/ThemeProvider\";\r\nimport { WelcomeScreen } from \"./components/WelcomeScreen\";\r\nimport { DoneScreen } from \"./components/DoneScreen\";\r\n\r\n/** Props for the NarrativeForm component. */\r\nexport interface NarrativeFormProps {\r\n /** Ordered list of field configurations (static mode). */\r\n fields?: NarrativeField[];\r\n /** URL to fetch form config from (dynamic mode). */\r\n fieldsUrl?: string;\r\n /** Headers for the fieldsUrl fetch request. */\r\n fieldsUrlHeaders?: Record<string, string>;\r\n /** Pre-fetched form config object (dynamic mode). */\r\n formConfig?: NarrativeFormConfig;\r\n /** Theme configuration — colours, typography, spacing. */\r\n theme?: NarrativeTheme;\r\n /** Typewriter animation settings. */\r\n typewriter?: NarrativeTypewriter;\r\n /** Welcome screen configuration. Pass `{ show: false }` to skip. */\r\n welcome?: NarrativeWelcome;\r\n /** Done screen configuration. Pass `{ show: false }` to skip. */\r\n done?: NarrativeDone;\r\n /** Whether confirmed fields show an edit icon. Default: true */\r\n editable?: boolean;\r\n /** Label for the edit button. Default: \"Edit\" */\r\n editLabel?: string;\r\n /** Additional CSS class added to the root element. */\r\n className?: string;\r\n /** Event callbacks for analytics and integration. */\r\n callbacks?: NarrativeCallbacks;\r\n /** Ref handle for imperative API (next, getValues, reset, focusField). */\r\n formRef?: React.Ref<NarrativeRefHandle>;\r\n /** Default values — pre-fill fields as already confirmed. */\r\n defaultValues?: NarrativeFieldValues;\r\n /** Controlled mode — external values source of truth. */\r\n values?: NarrativeFieldValues;\r\n /** i18n string overrides. */\r\n strings?: Partial<NarrativeI18n>;\r\n /** BCP 47 locale code. */\r\n locale?: string;\r\n /** Text direction. Auto-detected from locale if not set. */\r\n direction?: \"ltr\" | \"rtl\";\r\n /** Cross-field validation rules. */\r\n crossFieldValidators?: NarrativeCrossFieldValidator[];\r\n /** Custom loading component while fetching dynamic config. */\r\n loadingComponent?: React.ReactNode;\r\n /** Custom error component when config fetch fails. */\r\n errorComponent?: React.ReactNode;\r\n /** Callback when config fetch fails. */\r\n onFetchError?: (error: Error) => void;\r\n /** Label for the retry button on fetch error. */\r\n retryLabel?: string;\r\n /** Whether reduced motion should be forced. */\r\n reducedMotion?: boolean;\r\n}\r\n\r\n\r\n\r\n/**\r\n * Inner form component that uses theme context.\r\n */\r\nconst NarrativeFormInner: React.FC<NarrativeFormProps> = function NarrativeFormInner({\r\n fields: staticFields,\r\n fieldsUrl,\r\n fieldsUrlHeaders,\r\n formConfig,\r\n typewriter,\r\n welcome: welcomeProp,\r\n done: doneProp,\r\n editable = true,\r\n editLabel,\r\n className,\r\n callbacks,\r\n formRef,\r\n defaultValues,\r\n values: controlledValues,\r\n strings: stringsProp,\r\n locale,\r\n direction: directionProp,\r\n crossFieldValidators,\r\n loadingComponent,\r\n errorComponent,\r\n onFetchError,\r\n retryLabel,\r\n reducedMotion,\r\n}) {\r\n const { isDark } = useTheme();\r\n const i18n = useMemo(() => mergeStrings(stringsProp), [stringsProp]);\r\n\r\n // Resolve text direction\r\n const direction = useMemo(() => {\r\n if (directionProp) return directionProp;\r\n if (locale) {\r\n const rtlLocales = [\"ar\", \"he\", \"fa\", \"ur\"];\r\n const lang = locale.split(\"-\")[0]?.toLowerCase();\r\n if (lang && rtlLocales.includes(lang)) return \"rtl\" as const;\r\n }\r\n return \"ltr\" as const;\r\n }, [directionProp, locale]);\r\n\r\n // Dynamic form fetching\r\n const { config: dynamicConfig, loading: dynamicLoading, error: dynamicError, retry } =\r\n useDynamicForm({ fieldsUrl, fieldsUrlHeaders: fieldsUrlHeaders, onFetchError });\r\n\r\n // Resolve fields from static, formConfig, or dynamic\r\n const resolvedConfig = useMemo(() => {\r\n if (staticFields) return { fields: staticFields };\r\n if (formConfig) return formConfig;\r\n if (dynamicConfig) return dynamicConfig;\r\n return null;\r\n }, [staticFields, formConfig, dynamicConfig]);\r\n\r\n const fields = resolvedConfig?.fields ?? [];\r\n const welcome = welcomeProp ?? (resolvedConfig && \"welcome\" in resolvedConfig\r\n ? (resolvedConfig as NarrativeFormConfig).welcome\r\n : undefined);\r\n const done = doneProp ?? (resolvedConfig && \"done\" in resolvedConfig\r\n ? (resolvedConfig as NarrativeFormConfig).done\r\n : undefined);\r\n\r\n // Effective typewriter config (respect reducedMotion)\r\n const effectiveTypewriter = useMemo<NarrativeTypewriter>(() => ({\r\n ...typewriter,\r\n enabled: reducedMotion ? false : (typewriter?.enabled ?? true),\r\n }), [typewriter, reducedMotion]);\r\n\r\n const {\r\n snapshot,\r\n startTyping,\r\n activateField,\r\n confirmField,\r\n editField,\r\n reconfirmField,\r\n next,\r\n focusField,\r\n reset,\r\n getValues,\r\n getMeta,\r\n } = useFormState(fields);\r\n\r\n // Welcome screen state\r\n const showWelcome = welcome?.show !== false && welcome !== undefined;\r\n const [welcomeDismissed, setWelcomeDismissed] = useState(!showWelcome);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n\r\n // Track if the first field has been started\r\n const hasStartedRef = useRef(false);\r\n\r\n // Apply default values on mount\r\n const defaultsAppliedRef = useRef(false);\r\n useEffect(() => {\r\n if (defaultsAppliedRef.current || !defaultValues) return;\r\n defaultsAppliedRef.current = true;\r\n\r\n for (const field of fields) {\r\n const val = defaultValues[field.key];\r\n if (val !== undefined) {\r\n startTyping(field.key);\r\n activateField(field.key);\r\n confirmField(field.key, val);\r\n }\r\n }\r\n }, [defaultValues, fields, startTyping, activateField, confirmField]);\r\n\r\n // Start typing the first non-confirmed field after welcome is dismissed\r\n useEffect(() => {\r\n if (!welcomeDismissed) return;\r\n if (hasStartedRef.current) return;\r\n if (fields.length === 0) return;\r\n\r\n hasStartedRef.current = true;\r\n\r\n // Find the first non-confirmed field\r\n const firstField = fields.find((f) => snapshot.statuses[f.key] !== \"confirmed\");\r\n if (firstField) {\r\n startTyping(firstField.key);\r\n }\r\n }, [welcomeDismissed, fields, startTyping, snapshot.statuses]);\r\n\r\n // Expose ref API\r\n useEffect(() => {\r\n if (!formRef) return;\r\n\r\n const handle: NarrativeRefHandle = {\r\n next,\r\n getValues,\r\n reset: () => {\r\n setWelcomeDismissed(!showWelcome);\r\n hasStartedRef.current = false;\r\n defaultsAppliedRef.current = false;\r\n reset();\r\n },\r\n focusField,\r\n };\r\n\r\n if (typeof formRef === \"function\") {\r\n formRef(handle);\r\n } else if (formRef && \"current\" in formRef) {\r\n (formRef as React.MutableRefObject<NarrativeRefHandle | null>).current = handle;\r\n }\r\n }, [formRef, next, getValues, reset, focusField, showWelcome]);\r\n\r\n // ── Callbacks ──────────────────────────────────────────────────\r\n\r\n const handleWelcomeStart = useCallback(() => {\r\n setWelcomeDismissed(true);\r\n }, []);\r\n\r\n const handleTypingComplete = useCallback(\r\n (key: string) => {\r\n activateField(key);\r\n },\r\n [activateField],\r\n );\r\n\r\n const handleConfirm = useCallback(\r\n (key: string, value: string) => {\r\n const status = snapshot.statuses[key];\r\n\r\n // Use controlled values if provided\r\n const finalValue = controlledValues?.[key] !== undefined\r\n ? String(controlledValues[key])\r\n : value;\r\n\r\n if (status === \"editing\") {\r\n reconfirmField(key, finalValue);\r\n } else {\r\n confirmField(key, finalValue);\r\n }\r\n\r\n // Fire callbacks\r\n callbacks?.onFieldComplete?.(key, finalValue, 0);\r\n\r\n // Check if all visible fields are confirmed after this one\r\n const updatedValues = { ...snapshot.values, [key]: finalValue };\r\n const visibleFieldKeys = fields\r\n .filter((f) => {\r\n if (!f.showIf) return true;\r\n return f.showIf(updatedValues);\r\n })\r\n .map((f) => f.key);\r\n\r\n const allConfirmed = visibleFieldKeys.every(\r\n (k) => k === key || snapshot.statuses[k] === \"confirmed\",\r\n );\r\n\r\n if (allConfirmed) {\r\n // Filter out hidden field values\r\n const finalValues: NarrativeFieldValues = {};\r\n for (const k of visibleFieldKeys) {\r\n const v = k === key ? finalValue : snapshot.values[k];\r\n if (v !== undefined) finalValues[k] = v;\r\n }\r\n callbacks?.onComplete?.(finalValues, getMeta());\r\n } else {\r\n // Start typing the next unconfirmed visible field\r\n const currentIndex = fields.findIndex((f) => f.key === key);\r\n for (let i = currentIndex + 1; i < fields.length; i++) {\r\n const nextField = fields[i];\r\n if (!nextField) continue;\r\n if (snapshot.statuses[nextField.key] === \"confirmed\") continue;\r\n\r\n // Check showIf\r\n const nextUpdatedValues = { ...snapshot.values, [key]: finalValue };\r\n if (nextField.showIf && !nextField.showIf(nextUpdatedValues)) continue;\r\n\r\n startTyping(nextField.key);\r\n break;\r\n }\r\n }\r\n },\r\n [snapshot, fields, confirmField, reconfirmField, startTyping, callbacks, getMeta, controlledValues],\r\n );\r\n\r\n const handleEdit = useCallback(\r\n (key: string) => {\r\n editField(key);\r\n callbacks?.onEdit?.(key);\r\n },\r\n [editField, callbacks],\r\n );\r\n\r\n const handleError = useCallback(\r\n (key: string, message: string) => {\r\n callbacks?.onError?.(key, message);\r\n },\r\n [callbacks],\r\n );\r\n\r\n const handleChange = useCallback(\r\n (key: string, value: string) => {\r\n callbacks?.onChange?.(key, value);\r\n },\r\n [callbacks],\r\n );\r\n\r\n const handleFocus = useCallback(\r\n (key: string) => {\r\n callbacks?.onFieldFocus?.(key);\r\n },\r\n [callbacks],\r\n );\r\n\r\n const handleBlur = useCallback(\r\n (key: string, value: string) => {\r\n callbacks?.onFieldBlur?.(key, value);\r\n },\r\n [callbacks],\r\n );\r\n\r\n // ── Drop-off tracking ─────────────────────────────────────────\r\n useEffect(() => {\r\n const onDropOff = callbacks?.onDropOff;\r\n if (!onDropOff) return;\r\n if (typeof window === \"undefined\") return;\r\n\r\n const handleVisibility = () => {\r\n if (document.visibilityState === \"hidden\" && !snapshot.isComplete) {\r\n const activeField = fields.find(\r\n (f) => snapshot.statuses[f.key] === \"active\" || snapshot.statuses[f.key] === \"editing\",\r\n );\r\n if (activeField) {\r\n onDropOff(activeField.key);\r\n }\r\n }\r\n };\r\n\r\n document.addEventListener(\"visibilitychange\", handleVisibility);\r\n return () => document.removeEventListener(\"visibilitychange\", handleVisibility);\r\n }, [callbacks, snapshot, fields]);\r\n\r\n // ── Determine visible fields ──────────────────────────────────\r\n const visibleFields = useMemo(() => {\r\n return fields.filter((field) => {\r\n const status = snapshot.statuses[field.key];\r\n const isStarted = status === \"typing\" || status === \"active\" ||\r\n status === \"confirmed\" || status === \"editing\";\r\n if (!isStarted) return false;\r\n\r\n // Evaluate showIf\r\n if (field.showIf && !field.showIf(snapshot.values)) return false;\r\n\r\n return true;\r\n });\r\n }, [fields, snapshot.statuses, snapshot.values]);\r\n\r\n // Determine which fields are locked\r\n const lockedFields = useMemo(() => {\r\n const locked = new Set<string>();\r\n\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n if (!field) continue;\r\n if (\r\n field.lockPrevious &&\r\n (snapshot.statuses[field.key] === \"active\" ||\r\n snapshot.statuses[field.key] === \"typing\" ||\r\n snapshot.statuses[field.key] === \"editing\" ||\r\n snapshot.statuses[field.key] === \"confirmed\")\r\n ) {\r\n // Lock all previous fields\r\n for (let j = 0; j < i; j++) {\r\n const prev = fields[j];\r\n if (prev) locked.add(prev.key);\r\n }\r\n }\r\n }\r\n\r\n return locked;\r\n }, [fields, snapshot.statuses]);\r\n\r\n // Done screen visibility\r\n const showDone = done?.show !== false && done !== undefined && snapshot.isComplete;\r\n\r\n // Dynamic form loading/error states\r\n if (fieldsUrl && dynamicLoading) {\r\n return (\r\n <div className=\"ns-root\">\r\n {loadingComponent ?? <div className=\"ns-loading-indicator\" aria-label=\"Loading form\" />}\r\n </div>\r\n );\r\n }\r\n\r\n if (fieldsUrl && dynamicError) {\r\n return (\r\n <div className=\"ns-root\">\r\n {errorComponent ?? (\r\n <div className=\"ns-done\">\r\n <p className=\"ns-error-text\">{i18n.fetchErrorMessage}</p>\r\n <button type=\"button\" className=\"ns-done-cta\" onClick={retry}>\r\n {retryLabel ?? i18n.retryLabel}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // Build root CSS classes\r\n const rootClasses = [\r\n \"ns-root\",\r\n snapshot.isComplete ? \"ns-root--complete\" : undefined,\r\n isDark ? \"ns-root--dark\" : undefined,\r\n isSubmitting ? \"ns-root--submitting\" : undefined,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={rootClasses} dir={direction} lang={locale}>\r\n {/* Welcome screen */}\r\n {!welcomeDismissed && welcome && (\r\n <WelcomeScreen\r\n welcome={welcome}\r\n typewriter={effectiveTypewriter}\r\n onStart={handleWelcomeStart}\r\n />\r\n )}\r\n\r\n {/* Form body — only visible after welcome is dismissed */}\r\n {welcomeDismissed && (\r\n <div className=\"ns-letter\" role=\"form\" aria-label=\"Narrative form\">\r\n {visibleFields.map((field) => (\r\n <Line\r\n key={field.key}\r\n field={field}\r\n status={snapshot.statuses[field.key] ?? \"idle\"}\r\n value={controlledValues?.[field.key] ?? snapshot.values[field.key]}\r\n allValues={snapshot.values}\r\n typewriter={effectiveTypewriter}\r\n editable={editable}\r\n locked={lockedFields.has(field.key)}\r\n editLabel={editLabel ?? i18n.editLabel}\r\n onTypingComplete={handleTypingComplete}\r\n onConfirm={handleConfirm}\r\n onEdit={handleEdit}\r\n onError={handleError}\r\n onChange={handleChange}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Done screen */}\r\n {showDone && done && (\r\n <DoneScreen\r\n done={done}\r\n values={snapshot.values}\r\n meta={getMeta()}\r\n typewriter={effectiveTypewriter}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n * The root narrative-form component.\r\n *\r\n * Renders fields one by one with typewriter animations. Each field follows\r\n * the lifecycle: idle → typing → active → confirmed → editing.\r\n *\r\n * @param props - Form configuration\r\n */\r\nexport const NarrativeForm: React.FC<NarrativeFormProps> = function NarrativeForm(props) {\r\n return (\r\n <ThemeProvider theme={props.theme}>\r\n <ToastProvider>\r\n <NarrativeFormInner {...props} />\r\n </ToastProvider>\r\n </ThemeProvider>\r\n );\r\n};\r\n","/**\r\n * TextField — the default text input field type for narrative-form.\r\n *\r\n * @remarks\r\n * Wraps InlineInput with text-specific defaults.\r\n * This is the simplest field type — all other types build on this pattern.\r\n * CSS class: `ns-input--text`\r\n */\r\n\r\nimport React from \"react\";\r\nimport { InlineInput } from \"../InlineInput\";\r\n\r\n/** Props for the TextField component. */\r\nexport interface TextFieldProps {\r\n /** Unique field key. */\r\n fieldKey: string;\r\n /** Placeholder text. */\r\n placeholder?: string;\r\n /** Initial value (for edit mode). */\r\n defaultValue?: string;\r\n /** Suffix text after the input. */\r\n suffix?: string;\r\n /** Callback when the value is confirmed. */\r\n onConfirm: (value: string) => void;\r\n /** Callback on every keystroke. */\r\n onChange?: (value: string) => void;\r\n /** Callback when input receives focus. */\r\n onFocus?: () => void;\r\n /** Callback when input loses focus. */\r\n onBlur?: (value: string) => void;\r\n /** Additional CSS class for the input element. */\r\n inputClassName?: string;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A text input field rendered inline within a sentence.\r\n *\r\n * @param props - TextField configuration\r\n */\r\nexport const TextField: React.FC<TextFieldProps> = function TextField(props) {\r\n return <InlineInput {...props} type=\"text\" />;\r\n};\r\n","/**\r\n * TelField — phone number input field for narrative-form.\r\n *\r\n * @remarks\r\n * Renders an inline input with `type=\"tel\"` for numeric keyboard on mobile.\r\n * CSS class: `ns-input--tel`\r\n */\r\n\r\nimport React from \"react\";\r\nimport { InlineInput } from \"../InlineInput\";\r\n\r\n/** Props for the TelField component. */\r\nexport interface TelFieldProps {\r\n /** Unique field key. */\r\n fieldKey: string;\r\n /** Placeholder text. */\r\n placeholder?: string;\r\n /** Initial value (for edit mode). */\r\n defaultValue?: string;\r\n /** Suffix text after the input. */\r\n suffix?: string;\r\n /** Callback when the value is confirmed. */\r\n onConfirm: (value: string) => void;\r\n /** Callback on every keystroke. */\r\n onChange?: (value: string) => void;\r\n /** Callback when input receives focus. */\r\n onFocus?: () => void;\r\n /** Callback when input loses focus. */\r\n onBlur?: (value: string) => void;\r\n /** Additional CSS class for the input element. */\r\n inputClassName?: string;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A phone number input field rendered inline within a sentence.\r\n *\r\n * @param props - TelField configuration\r\n */\r\nexport const TelField: React.FC<TelFieldProps> = function TelField(props) {\r\n return <InlineInput {...props} type=\"tel\" />;\r\n};\r\n","/**\r\n * EmailField — email input field for narrative-form.\r\n *\r\n * @remarks\r\n * Renders an inline input with `type=\"email\"` for email keyboard on mobile.\r\n * CSS class: `ns-input--email`\r\n */\r\n\r\nimport React from \"react\";\r\nimport { InlineInput } from \"../InlineInput\";\r\n\r\n/** Props for the EmailField component. */\r\nexport interface EmailFieldProps {\r\n /** Unique field key. */\r\n fieldKey: string;\r\n /** Placeholder text. */\r\n placeholder?: string;\r\n /** Initial value (for edit mode). */\r\n defaultValue?: string;\r\n /** Suffix text after the input. */\r\n suffix?: string;\r\n /** Callback when the value is confirmed. */\r\n onConfirm: (value: string) => void;\r\n /** Callback on every keystroke. */\r\n onChange?: (value: string) => void;\r\n /** Callback when input receives focus. */\r\n onFocus?: () => void;\r\n /** Callback when input loses focus. */\r\n onBlur?: (value: string) => void;\r\n /** Additional CSS class for the input element. */\r\n inputClassName?: string;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * An email input field rendered inline within a sentence.\r\n *\r\n * @param props - EmailField configuration\r\n */\r\nexport const EmailField: React.FC<EmailFieldProps> = function EmailField(props) {\r\n return <InlineInput {...props} type=\"email\" />;\r\n};\r\n","/**\r\n * NumberField — numeric input field for narrative-form.\r\n *\r\n * @remarks\r\n * Renders an inline input with `type=\"number\"` for numeric entry.\r\n * CSS class: `ns-input--number`\r\n */\r\n\r\nimport React from \"react\";\r\nimport { InlineInput } from \"../InlineInput\";\r\n\r\n/** Props for the NumberField component. */\r\nexport interface NumberFieldProps {\r\n /** Unique field key. */\r\n fieldKey: string;\r\n /** Placeholder text. */\r\n placeholder?: string;\r\n /** Initial value (for edit mode). */\r\n defaultValue?: string;\r\n /** Suffix text after the input. */\r\n suffix?: string;\r\n /** Callback when the value is confirmed. */\r\n onConfirm: (value: string) => void;\r\n /** Callback on every keystroke. */\r\n onChange?: (value: string) => void;\r\n /** Callback when input receives focus. */\r\n onFocus?: () => void;\r\n /** Callback when input loses focus. */\r\n onBlur?: (value: string) => void;\r\n /** Additional CSS class for the input element. */\r\n inputClassName?: string;\r\n /** Additional CSS class for the wrapper. */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A numeric input field rendered inline within a sentence.\r\n *\r\n * @param props - NumberField configuration\r\n */\r\nexport const NumberField: React.FC<NumberFieldProps> = function NumberField(props) {\r\n return <InlineInput {...props} type=\"number\" />;\r\n};\r\n"]}
|