@nodii/onboarding 0.0.1 → 0.1.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/chunk-34BQX2KR.js +164 -0
  2. package/dist/chunk-34BQX2KR.js.map +1 -0
  3. package/dist/chunk-4SWOVHZ2.js +434 -0
  4. package/dist/chunk-4SWOVHZ2.js.map +1 -0
  5. package/dist/chunk-7NS7ENJV.js +232 -0
  6. package/dist/chunk-7NS7ENJV.js.map +1 -0
  7. package/dist/chunk-AFCJLUPK.js +92 -0
  8. package/dist/chunk-AFCJLUPK.js.map +1 -0
  9. package/dist/chunk-AW7W3HAC.js +154 -0
  10. package/dist/chunk-AW7W3HAC.js.map +1 -0
  11. package/dist/chunk-BIFANV7M.js +22 -0
  12. package/dist/chunk-BIFANV7M.js.map +1 -0
  13. package/dist/chunk-BQCTDU5V.js +327 -0
  14. package/dist/chunk-BQCTDU5V.js.map +1 -0
  15. package/dist/chunk-JFIONONR.js +3 -0
  16. package/dist/chunk-JFIONONR.js.map +1 -0
  17. package/dist/chunk-SWMIIUXR.js +1162 -0
  18. package/dist/chunk-SWMIIUXR.js.map +1 -0
  19. package/dist/chunk-VH6FWDWI.js +3 -0
  20. package/dist/chunk-VH6FWDWI.js.map +1 -0
  21. package/dist/chunk-Z4PA6C2Z.js +3 -0
  22. package/dist/chunk-Z4PA6C2Z.js.map +1 -0
  23. package/dist/chunk-ZDY2I6KY.js +3 -0
  24. package/dist/chunk-ZDY2I6KY.js.map +1 -0
  25. package/dist/dynamic/index.d.ts +184 -0
  26. package/dist/dynamic/index.js +4 -0
  27. package/dist/dynamic/index.js.map +1 -0
  28. package/dist/form/index.d.ts +64 -0
  29. package/dist/form/index.js +5 -0
  30. package/dist/form/index.js.map +1 -0
  31. package/dist/index.d.ts +10 -2
  32. package/dist/index.js +14 -2
  33. package/dist/index.js.map +1 -0
  34. package/dist/model-IEyDI54w.d.ts +487 -0
  35. package/dist/recaptcha/index.d.ts +102 -0
  36. package/dist/recaptcha/index.js +4 -0
  37. package/dist/recaptcha/index.js.map +1 -0
  38. package/dist/schema-TfyBU6JW.d.ts +107 -0
  39. package/dist/signup-client-Bl6eUrxR.d.ts +259 -0
  40. package/dist/spec/index.d.ts +88 -0
  41. package/dist/spec/index.js +4 -0
  42. package/dist/spec/index.js.map +1 -0
  43. package/dist/submit/index.d.ts +106 -0
  44. package/dist/submit/index.js +6 -0
  45. package/dist/submit/index.js.map +1 -0
  46. package/dist/widget/index.d.ts +219 -0
  47. package/dist/widget/index.js +10 -0
  48. package/dist/widget/index.js.map +1 -0
  49. package/package.json +77 -6
  50. package/README.md +0 -5
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/widget/dom-utils.ts","../src/widget/styles.ts","../src/widget/contact-form.ts","../src/widget/signup-form.ts","../src/widget/index.ts"],"names":["el"],"mappings":"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","file":"chunk-SWMIIUXR.js","sourcesContent":["/**\n * Shared DOM helpers for the widget layer.\n *\n * `idSelector` builds a `#id` CSS selector with the id CSS-escaped, so a field\n * key (which originates in the fetched onboarder spec) can never break out of\n * the selector or match unintended nodes. This is defense-in-depth: the spec\n * model already constrains field keys to `[A-Za-z0-9_-]+` (FIELD_KEY_PATTERN),\n * but the escaping guarantees selector safety even for the widget's own\n * internally-composed ids and for any future relaxation of that alphabet.\n */\n\n/**\n * CSS-escape a string for safe use as an identifier in a selector.\n * Uses the standard `CSS.escape` when available (all modern browsers), with a\n * spec-compliant-enough fallback for non-DOM/test runtimes: escape everything\n * that is not an ASCII identifier char.\n */\nexport function cssEscape(value: string): string {\n const g = globalThis as { CSS?: { escape?: (v: string) => string } };\n if (g.CSS && typeof g.CSS.escape === \"function\") {\n return g.CSS.escape(value);\n }\n // Fallback: backslash-escape any char outside [A-Za-z0-9_-]. Sufficient to\n // neutralize CSS metacharacters ([]().,#*:>+~ whitespace, quotes, etc.).\n return value.replace(/[^A-Za-z0-9_-]/g, (ch) => `\\\\${ch}`);\n}\n\n/** Build a safe `#id` selector with the id CSS-escaped. */\nexport function idSelector(id: string): string {\n return `#${cssEscape(id)}`;\n}\n","/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n/**\n * Default CSS for the onboarding contact form widget.\n *\n * Uses CSS custom properties (variables) for theming. Consumers override\n * these on the host element or globally:\n *\n * --nodii-onboarding-font-family\n * --nodii-onboarding-primary-color\n * --nodii-onboarding-primary-hover\n * --nodii-onboarding-error-color\n * --nodii-onboarding-border-color\n * --nodii-onboarding-input-bg\n * --nodii-onboarding-label-color\n * --nodii-onboarding-radius\n * --nodii-onboarding-spacing\n *\n * The widget scopes all styles under `.nodii-onboarding-widget` to avoid\n * leaking into the host page.\n */\n\nexport const DEFAULT_WIDGET_CSS = `\n.nodii-onboarding-widget {\n --_font: var(--nodii-onboarding-font-family, system-ui, -apple-system, sans-serif);\n --_primary: var(--nodii-onboarding-primary-color, #2563eb);\n --_primary-hover: var(--nodii-onboarding-primary-hover, #1d4ed8);\n --_error: var(--nodii-onboarding-error-color, #dc2626);\n --_border: var(--nodii-onboarding-border-color, #d1d5db);\n --_input-bg: var(--nodii-onboarding-input-bg, #fff);\n --_label: var(--nodii-onboarding-label-color, #374151);\n --_radius: var(--nodii-onboarding-radius, 6px);\n --_spacing: var(--nodii-onboarding-spacing, 16px);\n\n font-family: var(--_font);\n box-sizing: border-box;\n}\n\n.nodii-onboarding-widget *,\n.nodii-onboarding-widget *::before,\n.nodii-onboarding-widget *::after {\n box-sizing: inherit;\n}\n\n.nodii-onboarding-field {\n display: flex;\n flex-direction: column;\n gap: calc(var(--_spacing) * 0.25);\n margin-bottom: var(--_spacing);\n}\n\n.nodii-onboarding-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--_label);\n}\n\n.nodii-onboarding-label.required::after {\n content: \" *\";\n color: var(--_error);\n}\n\n.nodii-onboarding-input,\n.nodii-onboarding-textarea {\n width: 100%;\n padding: calc(var(--_spacing) * 0.5) calc(var(--_spacing) * 0.75);\n border: 1px solid var(--_border);\n border-radius: var(--_radius);\n background: var(--_input-bg);\n font-family: var(--_font);\n font-size: 1rem;\n line-height: 1.5;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.nodii-onboarding-input:focus,\n.nodii-onboarding-textarea:focus {\n border-color: var(--_primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--_primary) 20%, transparent);\n}\n\n.nodii-onboarding-input.has-error,\n.nodii-onboarding-textarea.has-error {\n border-color: var(--_error);\n}\n\n.nodii-onboarding-textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.nodii-onboarding-field-error {\n font-size: 0.75rem;\n color: var(--_error);\n margin-top: 2px;\n}\n\n.nodii-onboarding-server-error {\n padding: calc(var(--_spacing) * 0.75);\n border-radius: var(--_radius);\n background: color-mix(in srgb, var(--_error) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--_error) 30%, transparent);\n color: var(--_error);\n font-size: 0.875rem;\n margin-bottom: var(--_spacing);\n}\n\n.nodii-onboarding-success {\n padding: var(--_spacing);\n border-radius: var(--_radius);\n background: #f0fdf4;\n border: 1px solid #bbf7d0;\n color: #15803d;\n font-size: 0.9375rem;\n text-align: center;\n}\n\n.nodii-onboarding-submit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: calc(var(--_spacing) * 0.625) var(--_spacing);\n background: var(--_primary);\n color: #fff;\n border: none;\n border-radius: var(--_radius);\n font-family: var(--_font);\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.nodii-onboarding-submit-btn:hover:not(:disabled) {\n background: var(--_primary-hover);\n}\n\n.nodii-onboarding-submit-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.nodii-onboarding-spinner {\n display: inline-block;\n width: 1em;\n height: 1em;\n border: 2px solid rgba(255,255,255,0.4);\n border-top-color: #fff;\n border-radius: 50%;\n animation: nodii-spin 0.6s linear infinite;\n margin-right: 0.5em;\n}\n\n@keyframes nodii-spin {\n to { transform: rotate(360deg); }\n}\n\n.nodii-onboarding-recaptcha-notice {\n font-size: 0.7rem;\n color: #6b7280;\n margin-top: calc(var(--_spacing) * 0.5);\n text-align: center;\n}\n\n.nodii-onboarding-recaptcha-notice a {\n color: inherit;\n}\n\n/* ── dynamic stepper (signup form) ── */\n\n.nodii-onboarding-steps {\n display: flex;\n gap: calc(var(--_spacing) * 0.5);\n margin-bottom: var(--_spacing);\n}\n\n.nodii-onboarding-step-dot {\n flex: 1;\n height: 4px;\n border-radius: 2px;\n background: var(--_border);\n}\n\n.nodii-onboarding-step-dot.active {\n background: var(--_primary);\n}\n\n.nodii-onboarding-stage-title {\n font-size: 1.0625rem;\n font-weight: 600;\n color: var(--_label);\n margin: 0 0 var(--_spacing) 0;\n}\n\n.nodii-onboarding-nav {\n display: flex;\n gap: calc(var(--_spacing) * 0.5);\n margin-top: var(--_spacing);\n}\n\n.nodii-onboarding-back-btn {\n padding: calc(var(--_spacing) * 0.625) var(--_spacing);\n background: transparent;\n color: var(--_label);\n border: 1px solid var(--_border);\n border-radius: var(--_radius);\n font-family: var(--_font);\n font-size: 1rem;\n cursor: pointer;\n}\n\n.nodii-onboarding-stale-banner {\n padding: calc(var(--_spacing) * 0.75);\n border-radius: var(--_radius);\n background: #fffbeb;\n border: 1px solid #fcd34d;\n color: #92400e;\n font-size: 0.875rem;\n margin-bottom: var(--_spacing);\n}\n\n.nodii-onboarding-consent-row {\n display: flex;\n align-items: flex-start;\n gap: calc(var(--_spacing) * 0.5);\n margin-bottom: calc(var(--_spacing) * 0.5);\n font-size: 0.875rem;\n color: var(--_label);\n}\n\n.nodii-onboarding-consent-row input[type=\"checkbox\"] {\n margin-top: 3px;\n}\n\n.nodii-onboarding-account-section {\n border-top: 1px solid var(--_border);\n margin-top: var(--_spacing);\n padding-top: var(--_spacing);\n}\n\n.nodii-onboarding-loading {\n padding: var(--_spacing);\n text-align: center;\n color: var(--_label);\n}\n`;\n\n/**\n * Inject the default widget CSS once into the document head.\n * Idempotent — will not add a duplicate style tag.\n */\nexport function injectWidgetStyles(): void {\n if (typeof document === \"undefined\") return;\n const styleId = \"__nodii_onboarding_styles__\";\n if (document.getElementById(styleId)) return;\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = DEFAULT_WIDGET_CSS;\n document.head.appendChild(style);\n}\n","/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n/**\n * Default vanilla-TS contact form widget.\n *\n * Renders a form into a host element and handles the full lifecycle:\n * 1. Render fields (name, email, phone, message)\n * 2. Client-side validation on submit\n * 3. reCAPTCHA token acquisition (D537)\n * 4. POST to /api/v1/public/onboarding/leads via submit client\n * 5. Retry on 5xx with SAME idempotency key\n * 6. Show success or error state\n *\n * No React or framework required. CSS via injectWidgetStyles().\n */\n\nimport {\n createContactFormState,\n type ContactFormControl,\n type FieldError,\n} from \"../form/state.js\";\nimport type { ContactFormValues } from \"../form/schema.js\";\nimport {\n submitLead,\n generateIdempotencyKey,\n computePayloadFingerprint,\n} from \"../submit/client.js\";\nimport {\n OnboardingBotChallengeError,\n OnboardingRateLimitError,\n} from \"../submit/errors.js\";\nimport { executeRecaptcha, loadRecaptcha } from \"../recaptcha/loader.js\";\nimport { idSelector } from \"./dom-utils.js\";\nimport { injectWidgetStyles } from \"./styles.js\";\n\nexport interface ContactFormMountOptions {\n /**\n * The onboarder identifier (slug or UUID).\n *\n * NOT transmitted on the wire — by design. Per LOCKED D536, onboarder\n * trust/scoping is derived server-side from the request Host at the edge\n * (\"onboarder derived from the bundle, never client-supplied\", D540 §1);\n * a client-supplied identifier is never trusted and therefore never sent.\n *\n * This option is reserved for Phase 2, where it becomes the client-side\n * cache key for the spec-fetch (`(onboarder, specVersion)` per D540 §3).\n * In Phase 1 it has no runtime effect.\n */\n onboarder: string;\n /**\n * Base URL for the intake service.\n * e.g. \"https://api.acme.nucleus-cloud.in\"\n */\n baseUrl: string;\n /**\n * reCAPTCHA v3 site key. Obtained from the spec endpoint (D540 §1)\n * or passed directly in Phase 1 before spec-fetch is wired.\n */\n siteKey: string;\n /**\n * Which form to render. Phase 1 supports \"contact\" only.\n * Phase 2 will add \"signup\" (dynamic stepper from spec).\n */\n form: \"contact\";\n /** Called after a successful lead submission. */\n onSuccess?: () => void;\n /** Called on non-retryable errors (bot challenge, rate limit). */\n onError?: (error: unknown) => void;\n /** Custom fetch implementation (defaults to globalThis.fetch). */\n fetch?: typeof globalThis.fetch;\n /**\n * Per-request timeout in ms (default 15s), applied to BOTH the reCAPTCHA\n * execute() and the submit POST so a hung dependency re-enables the form.\n */\n timeoutMs?: number;\n /** Success message override. */\n successMessage?: string;\n /** Submit button label override. */\n submitLabel?: string;\n}\n\nexport interface MountedWidget {\n /** Unmount and clean up the widget from the host element. */\n unmount(): void;\n /** Reset the form to its initial state. */\n reset(): void;\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs: Record<string, string> = {},\n children: Array<HTMLElement | Text | string> = [],\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tag);\n for (const [key, value] of Object.entries(attrs)) {\n element.setAttribute(key, value);\n }\n for (const child of children) {\n if (typeof child === \"string\") {\n element.appendChild(document.createTextNode(child));\n } else {\n element.appendChild(child);\n }\n }\n return element;\n}\n\nfunction createFieldEl(\n id: string,\n label: string,\n input: HTMLInputElement | HTMLTextAreaElement,\n required: boolean,\n): HTMLElement {\n const labelEl = el(\n \"label\",\n { for: id, class: `nodii-onboarding-label${required ? \" required\" : \"\"}` },\n [label],\n );\n const errorEl = el(\"div\", {\n class: \"nodii-onboarding-field-error\",\n id: `${id}-error`,\n role: \"alert\",\n \"aria-live\": \"polite\",\n });\n const field = el(\"div\", { class: \"nodii-onboarding-field\" }, [\n labelEl,\n input,\n errorEl,\n ]);\n return field;\n}\n\nfunction setFieldError(\n container: HTMLElement,\n fieldId: string,\n message: string,\n): void {\n // CSS-escape the id: fieldId derives from spec field keys — never build a\n // selector from unescaped, spec-controlled input.\n const errorEl = container.querySelector(idSelector(`${fieldId}-error`));\n if (errorEl) errorEl.textContent = message;\n const inputEl = container.querySelector(idSelector(fieldId));\n if (inputEl) inputEl.classList.add(\"has-error\");\n}\n\nfunction clearFieldErrors(container: HTMLElement): void {\n for (const el of container.querySelectorAll(\n \".nodii-onboarding-field-error\",\n )) {\n el.textContent = \"\";\n }\n for (const el of container.querySelectorAll(\".has-error\")) {\n el.classList.remove(\"has-error\");\n }\n}\n\nfunction applyErrors(container: HTMLElement, errors: FieldError[]): void {\n clearFieldErrors(container);\n for (const err of errors) {\n // Zod paths are bare field names (\"name\", \"email\"); the DOM ids carry\n // the \"nodii-\" prefix (\"nodii-name\"). Map explicitly — a bare path\n // would querySelector nothing and silently drop the error display.\n setFieldError(container, `nodii-${err.path}`, err.message);\n }\n}\n\n/**\n * Mount the contact form widget into a host element.\n *\n * @example\n * ```ts\n * import { OnboardingWidget } from \"@nodii/onboarding/widget\";\n * const widget = OnboardingWidget.mount(document.getElementById(\"signup\"), {\n * onboarder: \"acme-corp\",\n * form: \"contact\",\n * baseUrl: \"https://api.acme.nucleus-cloud.in\",\n * siteKey: \"6Lc...\",\n * });\n * ```\n */\nexport function mountContactForm(\n host: HTMLElement,\n options: ContactFormMountOptions,\n): MountedWidget {\n injectWidgetStyles();\n\n const formControl: ContactFormControl = createContactFormState();\n\n // Pre-load reCAPTCHA script to minimize latency at submit time.\n // Non-fatal: the loader evicts its cache on failure, so a failed\n // pre-load genuinely retries from scratch at submit time.\n loadRecaptcha(options.siteKey).catch(() => {\n // Swallowed by design — executeRecaptcha at submit re-attempts.\n });\n\n // --- Build DOM ---\n const wrapper = el(\"div\", { class: \"nodii-onboarding-widget\" });\n\n const nameInput = el(\"input\", {\n type: \"text\",\n id: \"nodii-name\",\n name: \"name\",\n class: \"nodii-onboarding-input\",\n placeholder: \"Your name\",\n autocomplete: \"name\",\n maxlength: \"200\",\n required: \"required\",\n }) as HTMLInputElement;\n\n const emailInput = el(\"input\", {\n type: \"email\",\n id: \"nodii-email\",\n name: \"email\",\n class: \"nodii-onboarding-input\",\n placeholder: \"you@company.com\",\n autocomplete: \"email\",\n required: \"required\",\n }) as HTMLInputElement;\n\n const phoneInput = el(\"input\", {\n type: \"tel\",\n id: \"nodii-phone\",\n name: \"phone\",\n class: \"nodii-onboarding-input\",\n placeholder: \"+1 555 000 0000\",\n autocomplete: \"tel\",\n }) as HTMLInputElement;\n\n const messageInput = el(\"textarea\", {\n id: \"nodii-message\",\n name: \"message\",\n class: \"nodii-onboarding-textarea\",\n placeholder: \"How can we help?\",\n maxlength: \"4000\",\n rows: \"4\",\n }) as HTMLTextAreaElement;\n\n const serverErrorEl = el(\"div\", {\n class: \"nodii-onboarding-server-error\",\n role: \"alert\",\n \"aria-live\": \"assertive\",\n style: \"display:none\",\n });\n\n const successEl = el(\n \"div\",\n {\n class: \"nodii-onboarding-success\",\n role: \"status\",\n style: \"display:none\",\n },\n [options.successMessage ?? \"Thank you! We'll be in touch shortly.\"],\n );\n\n const submitBtn = el(\n \"button\",\n {\n type: \"submit\",\n class: \"nodii-onboarding-submit-btn\",\n },\n [options.submitLabel ?? \"Get in touch\"],\n );\n\n const recaptchaNotice = el(\n \"p\",\n { class: \"nodii-onboarding-recaptcha-notice\" },\n [\n \"Protected by reCAPTCHA. \",\n Object.assign(\n el(\"a\", {\n href: \"https://policies.google.com/privacy\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n }),\n { textContent: \"Privacy\" },\n ),\n \" & \",\n Object.assign(\n el(\"a\", {\n href: \"https://policies.google.com/terms\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n }),\n { textContent: \"Terms\" },\n ),\n ],\n );\n\n const form = el(\"form\", {\n novalidate: \"true\",\n \"aria-label\": \"Contact us\",\n });\n\n form.appendChild(createFieldEl(\"nodii-name\", \"Name\", nameInput, true));\n form.appendChild(createFieldEl(\"nodii-email\", \"Email\", emailInput, true));\n form.appendChild(\n createFieldEl(\"nodii-phone\", \"Phone (optional)\", phoneInput, false),\n );\n form.appendChild(\n createFieldEl(\"nodii-message\", \"Message (optional)\", messageInput, false),\n );\n form.appendChild(serverErrorEl);\n form.appendChild(submitBtn);\n form.appendChild(recaptchaNotice);\n\n wrapper.appendChild(successEl);\n wrapper.appendChild(form);\n host.appendChild(wrapper);\n\n // --- Wire input events ---\n nameInput.addEventListener(\"input\", () => {\n formControl.setValue(\"name\", nameInput.value);\n });\n emailInput.addEventListener(\"input\", () => {\n formControl.setValue(\"email\", emailInput.value);\n });\n phoneInput.addEventListener(\"input\", () => {\n formControl.setValue(\"phone\", phoneInput.value || undefined);\n });\n messageInput.addEventListener(\"input\", () => {\n formControl.setValue(\"message\", messageInput.value || undefined);\n });\n\n const submitLabel = options.submitLabel ?? \"Get in touch\";\n\n // Render the submit button content via DOM nodes ONLY — never innerHTML.\n // options.submitLabel may be integrator/CMS-influenced text; text nodes\n // guarantee it can never be interpreted as markup.\n function renderSubmitButton(submitting: boolean): void {\n while (submitBtn.firstChild) {\n submitBtn.removeChild(submitBtn.firstChild);\n }\n if (submitting) {\n const spinner = document.createElement(\"span\");\n spinner.className = \"nodii-onboarding-spinner\";\n submitBtn.appendChild(spinner);\n submitBtn.appendChild(document.createTextNode(\"Sending…\"));\n } else {\n submitBtn.appendChild(document.createTextNode(submitLabel));\n }\n }\n\n // Subscribe to state changes\n const unsubscribe = formControl.subscribe((state) => {\n // Update submit button state\n submitBtn.disabled = state.status === \"submitting\";\n renderSubmitButton(state.status === \"submitting\");\n\n // Apply field errors\n applyErrors(wrapper, state.errors);\n\n // Server error\n if (state.serverError) {\n serverErrorEl.textContent = state.serverError;\n serverErrorEl.style.display = \"\";\n } else {\n serverErrorEl.style.display = \"none\";\n }\n\n // Success state\n if (state.status === \"success\") {\n successEl.style.display = \"\";\n form.style.display = \"none\";\n }\n });\n\n // --- Submit handler ---\n //\n // Idempotency-Key discipline (mirrors the server's D538 payload-match\n // guard — same key + different payload is INVALID_ARGUMENT server-side):\n // - The key is stable across RETRIES of the SAME payload (fingerprint\n // of the outgoing body minus botToken).\n // - If the user EDITS any field after a failed attempt, the fingerprint\n // changes → a NEW key is minted: an edited resubmission is a NEW\n // logical submission, not a retry.\n // - Cleared on success and on reset().\n let idempotencyKey: string | null = null;\n let lastFingerprint: string | null = null;\n\n form.addEventListener(\"submit\", async (event: Event) => {\n event.preventDefault();\n\n // Sync inputs to state\n formControl.setValue(\"name\", nameInput.value);\n formControl.setValue(\"email\", emailInput.value);\n formControl.setValue(\"phone\", phoneInput.value || undefined);\n formControl.setValue(\"message\", messageInput.value || undefined);\n\n const valid = formControl.validate();\n if (!valid) return;\n\n formControl.setSubmitting();\n\n const values = formControl.getState().values as ContactFormValues;\n\n // Key management per the discipline above.\n const fingerprint = computePayloadFingerprint(values);\n if (idempotencyKey === null || fingerprint !== lastFingerprint) {\n idempotencyKey = generateIdempotencyKey();\n lastFingerprint = fingerprint;\n }\n\n // Acquire the FIRST token up front so a mount-time reCAPTCHA failure\n // surfaces a clear message before any HTTP. On retries, submitLead mints\n // a FRESH token per attempt via this same provider (tokens are\n // single-use — reusing one after a 5xx would 403). Bounded by timeoutMs.\n let firstToken: string;\n try {\n firstToken = await executeRecaptcha(options.siteKey, \"contact_submit\", {\n timeoutMs: options.timeoutMs,\n });\n } catch (recaptchaErr) {\n formControl.setError(\"Could not load bot protection. Please try again.\");\n options.onError?.(recaptchaErr);\n return;\n }\n let usedFirst = false;\n const tokenProvider = async (): Promise<string> => {\n if (!usedFirst) {\n usedFirst = true;\n return firstToken;\n }\n return executeRecaptcha(options.siteKey, \"contact_submit\", {\n timeoutMs: options.timeoutMs,\n });\n };\n\n try {\n await submitLead(values, {\n baseUrl: options.baseUrl,\n botToken: tokenProvider,\n idempotencyKey,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n });\n // Clear for the next logical submission.\n idempotencyKey = null;\n lastFingerprint = null;\n formControl.setSuccess();\n options.onSuccess?.();\n } catch (err) {\n if (err instanceof OnboardingBotChallengeError) {\n formControl.setError(\n \"Bot protection check failed. Please refresh the page and try again.\",\n );\n options.onError?.(err);\n } else if (err instanceof OnboardingRateLimitError) {\n const msg =\n err.retryAfterSeconds !== null\n ? `Too many requests. Please wait ${err.retryAfterSeconds}s.`\n : \"Too many requests. Please wait a moment.\";\n formControl.setError(msg);\n options.onError?.(err);\n } else {\n formControl.setError(\n \"Something went wrong. Please try again in a moment.\",\n );\n options.onError?.(err);\n }\n }\n });\n\n return {\n unmount() {\n unsubscribe();\n host.removeChild(wrapper);\n },\n reset() {\n idempotencyKey = null;\n lastFingerprint = null;\n formControl.reset();\n form.style.display = \"\";\n successEl.style.display = \"none\";\n nameInput.value = \"\";\n emailInput.value = \"\";\n phoneInput.value = \"\";\n messageInput.value = \"\";\n },\n };\n}\n","/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n/**\n * Default vanilla-TS dynamic signup stepper widget (D540 Phase 2).\n *\n * Mount flow:\n * 1. Fetch + validate the spec (GET /api/v1/public/onboarding/spec);\n * the reCAPTCHA siteKey comes FROM THE SPEC (botChallenge.siteKey) —\n * the mount-option siteKey is only an override/fallback.\n * 2. Build the headless stepper from spec.forms.signup.steps.\n * 3. Render the current step's fields per descriptor type; Back/Next\n * navigate with per-step validation.\n * 4. The FINAL step carries the account section (credentials + consent\n * clickwrap) and the submit button.\n * 5. Submit: validateAll → payload-fingerprint key management (same\n * D538 discipline as the contact widget) → reCAPTCHA token →\n * submitSignup.\n * 6. 409 spec_stale: refetch the spec, applyNewSpec (drops removed\n * fields, re-validates), show a \"form updated — please review\"\n * banner. The SDK NEVER auto-resubmits a stale submission.\n */\n\nimport {\n fetchOnboardingSpec,\n OnboardingSpecCache,\n defaultSpecCache,\n diffSpecFields,\n type OnboardingSpec,\n} from \"../spec/index.js\";\nimport type { SpecField } from \"../spec/model.js\";\nimport {\n createSignupStepper,\n type SignupStepperControl,\n type SignupStepperState,\n} from \"../dynamic/stepper.js\";\nimport { optionValue } from \"../dynamic/derive.js\";\nimport {\n submitSignup,\n computeSignupFingerprint,\n type SignupSubmitResult,\n} from \"../submit/signup-client.js\";\nimport { generateIdempotencyKey } from \"../submit/client.js\";\nimport {\n OnboardingBotChallengeError,\n OnboardingRateLimitError,\n OnboardingSpecStaleError,\n} from \"../submit/errors.js\";\nimport { executeRecaptcha } from \"../recaptcha/loader.js\";\nimport { idSelector } from \"./dom-utils.js\";\nimport { injectWidgetStyles } from \"./styles.js\";\nimport type { MountedWidget } from \"./contact-form.js\";\n\nexport interface SignupFormMountOptions {\n /**\n * The onboarder identifier — the CLIENT-side spec-cache key\n * (D540 §3 `(onboarder, specVersion)`). NOT transmitted: per LOCKED\n * D536, onboarder trust/scoping is host-derived at the edge.\n */\n onboarder: string;\n baseUrl: string;\n /**\n * OPTIONAL siteKey override. Normally the widget uses the siteKey the\n * spec serves (botChallenge.siteKey, D537/D540); pass this only for\n * environments where the spec cannot carry it yet.\n */\n siteKey?: string;\n form: \"signup\";\n onSuccess?: (result: SignupSubmitResult) => void;\n onError?: (error: unknown) => void;\n /** Called after the spec loads and the stepper renders. */\n onReady?: (spec: OnboardingSpec) => void;\n fetch?: typeof globalThis.fetch;\n /**\n * Per-request timeout in ms (default 15s), applied to the boot spec fetch,\n * the reCAPTCHA execute(), the submit POST, and the 409 refetch — so a hung\n * dependency never leaves \"Loading signup form…\"/\"Sending…\" stuck.\n */\n timeoutMs?: number;\n submitLabel?: string;\n tosUrl?: string;\n privacyUrl?: string;\n /** Spec cache override (defaults to the module-level cache). */\n cache?: OnboardingSpecCache;\n}\n\nconst STAGE_TITLES: Record<string, string> = {\n lead: \"About you\",\n prospect: \"Your business\",\n activation: \"Choose your services\",\n};\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs: Record<string, string> = {},\n children: Array<HTMLElement | Text | string> = [],\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tag);\n for (const [key, value] of Object.entries(attrs)) {\n element.setAttribute(key, value);\n }\n for (const child of children) {\n if (typeof child === \"string\") {\n element.appendChild(document.createTextNode(child));\n } else {\n element.appendChild(child);\n }\n }\n return element;\n}\n\nfunction optionLabel(option: unknown): string {\n if (option !== null && typeof option === \"object\") {\n const o = option as Record<string, unknown>;\n if (typeof o[\"label\"] === \"string\") return o[\"label\"];\n }\n return optionValue(option);\n}\n\n/** Build the input element for one spec field descriptor. */\nfunction buildFieldInput(\n field: SpecField,\n currentValue: unknown,\n onChange: (value: unknown) => void,\n): HTMLElement {\n const id = `nodii-f-${field.key}`;\n\n switch (field.type) {\n case \"textarea\": {\n const input = el(\"textarea\", {\n id,\n class: \"nodii-onboarding-textarea\",\n rows: \"4\",\n }) as HTMLTextAreaElement;\n if (typeof currentValue === \"string\") input.value = currentValue;\n input.addEventListener(\"input\", () => onChange(input.value));\n return input;\n }\n case \"checkbox\":\n case \"boolean\": {\n const input = el(\"input\", {\n type: \"checkbox\",\n id,\n }) as HTMLInputElement;\n input.checked = currentValue === true;\n input.addEventListener(\"change\", () => onChange(input.checked));\n return input;\n }\n case \"select\":\n case \"radio\": {\n const select = el(\"select\", {\n id,\n class: \"nodii-onboarding-input\",\n }) as HTMLSelectElement;\n select.appendChild(el(\"option\", { value: \"\" }, [\"— select —\"]));\n for (const opt of field.options ?? []) {\n const value = optionValue(opt);\n const optionEl = el(\"option\", { value }, [optionLabel(opt)]);\n select.appendChild(optionEl);\n }\n if (typeof currentValue === \"string\") select.value = currentValue;\n select.addEventListener(\"change\", () => onChange(select.value));\n return select;\n }\n case \"multiselect\": {\n const select = el(\"select\", {\n id,\n class: \"nodii-onboarding-input\",\n multiple: \"multiple\",\n }) as HTMLSelectElement;\n const current = Array.isArray(currentValue)\n ? currentValue.map(String)\n : [];\n for (const opt of field.options ?? []) {\n const value = optionValue(opt);\n const optionEl = el(\"option\", { value }, [\n optionLabel(opt),\n ]) as HTMLOptionElement;\n if (current.includes(value)) optionEl.selected = true;\n select.appendChild(optionEl);\n }\n select.addEventListener(\"change\", () => {\n const values: string[] = [];\n for (const o of Array.from(select.options)) {\n if (o.selected && o.value !== \"\") values.push(o.value);\n }\n onChange(values);\n });\n return select;\n }\n default: {\n // text | email | tel | number | date | unknown → typed <input>\n const typeAttr =\n field.type === \"email\" ||\n field.type === \"tel\" ||\n field.type === \"number\" ||\n field.type === \"date\"\n ? field.type\n : \"text\";\n const input = el(\"input\", {\n type: typeAttr,\n id,\n class: \"nodii-onboarding-input\",\n }) as HTMLInputElement;\n if (typeof currentValue === \"string\") input.value = currentValue;\n if (typeof currentValue === \"number\") input.value = String(currentValue);\n input.addEventListener(\"input\", () => onChange(input.value));\n return input;\n }\n }\n}\n\n/**\n * Build a labelled field row. The label `for`, the input id, and the error\n * element id must ALL agree so click-to-focus and screen-reader association\n * work. Callers whose input id is NOT `nodii-f-<key>` (the account section,\n * whose inputs are `nodii-account-*`) pass `idOverride` so the label points\n * at the REAL input — never a dangling id patched up post-hoc.\n */\nfunction fieldRow(\n field: SpecField,\n input: HTMLElement,\n idOverride?: string,\n): HTMLElement {\n const id = idOverride ?? `nodii-f-${field.key}`;\n const labelEl = el(\n \"label\",\n {\n for: id,\n class: `nodii-onboarding-label${field.required ? \" required\" : \"\"}`,\n },\n [field.label],\n );\n const errorEl = el(\"div\", {\n class: \"nodii-onboarding-field-error\",\n id: `${id}-error`,\n role: \"alert\",\n \"aria-live\": \"polite\",\n });\n return el(\"div\", { class: \"nodii-onboarding-field\" }, [\n labelEl,\n input,\n errorEl,\n ]);\n}\n\n/**\n * Mount the dynamic signup stepper into a host element.\n * Returns synchronously; the spec loads in the background (loading state\n * rendered meanwhile; onReady fires when interactive).\n */\nexport function mountSignupForm(\n host: HTMLElement,\n options: SignupFormMountOptions,\n): MountedWidget {\n injectWidgetStyles();\n\n const wrapper = el(\"div\", { class: \"nodii-onboarding-widget\" });\n const loadingEl = el(\"div\", { class: \"nodii-onboarding-loading\" }, [\n \"Loading signup form…\",\n ]);\n wrapper.appendChild(loadingEl);\n host.appendChild(wrapper);\n\n const cache = options.cache ?? defaultSpecCache;\n let stepper: SignupStepperControl | null = null;\n let unsubscribe: (() => void) | null = null;\n let unmounted = false;\n let siteKey = options.siteKey ?? \"\";\n let idempotencyKey: string | null = null;\n let lastFingerprint: string | null = null;\n let renderedStepIndex = -1;\n let renderedStale = false;\n // The (onboarder, specVersion) currently driving the form — used to READ\n // the prior cached version back out on a 409 and diff what changed.\n let currentSpecVersion: string | null = null;\n let staleDiffSummary = \"\";\n\n // DOM regions (populated by renderShell)\n const stepArea = el(\"div\", {});\n const staleBanner = el(\"div\", {\n class: \"nodii-onboarding-stale-banner\",\n role: \"alert\",\n style: \"display:none\",\n });\n const serverErrorEl = el(\"div\", {\n class: \"nodii-onboarding-server-error\",\n role: \"alert\",\n \"aria-live\": \"assertive\",\n style: \"display:none\",\n });\n const successEl = el(\"div\", {\n class: \"nodii-onboarding-success\",\n role: \"status\",\n style: \"display:none\",\n });\n const stepsIndicator = el(\"div\", { class: \"nodii-onboarding-steps\" });\n const form = el(\"form\", { novalidate: \"true\", \"aria-label\": \"Sign up\" });\n\n function setFieldErrorsInPlace(\n container: HTMLElement,\n errors: Array<{ path: string; message: string }>,\n idPrefix: (path: string) => string,\n ): void {\n for (const errEl of container.querySelectorAll(\n \".nodii-onboarding-field-error\",\n )) {\n errEl.textContent = \"\";\n }\n for (const marked of container.querySelectorAll(\".has-error\")) {\n marked.classList.remove(\"has-error\");\n }\n for (const err of errors) {\n const id = idPrefix(err.path);\n // CSS-escape: id derives from spec field keys (err.path).\n const errorNode = container.querySelector(idSelector(`${id}-error`));\n if (errorNode) errorNode.textContent = err.message;\n const inputNode = container.querySelector(idSelector(id));\n if (inputNode) inputNode.classList.add(\"has-error\");\n }\n }\n\n function accountIdOf(path: string): string {\n if (path === \"email\") return \"nodii-account-email\";\n if (path === \"password\") return \"nodii-account-password\";\n if (path === \"tosAccepted\") return \"nodii-consent-tos\";\n if (path === \"privacyAccepted\") return \"nodii-consent-privacy\";\n return `nodii-account-${path}`;\n }\n\n function renderStepsIndicator(state: SignupStepperState): void {\n while (stepsIndicator.firstChild) {\n stepsIndicator.removeChild(stepsIndicator.firstChild);\n }\n for (let i = 0; i < state.stepCount; i++) {\n stepsIndicator.appendChild(\n el(\"div\", {\n class: `nodii-onboarding-step-dot${i <= state.stepIndex ? \" active\" : \"\"}`,\n }),\n );\n }\n }\n\n function renderAccountSection(\n control: SignupStepperControl,\n state: SignupStepperState,\n ): HTMLElement {\n const section = el(\"div\", { class: \"nodii-onboarding-account-section\" });\n\n const emailInput = el(\"input\", {\n type: \"email\",\n id: \"nodii-account-email\",\n class: \"nodii-onboarding-input\",\n autocomplete: \"email\",\n }) as HTMLInputElement;\n emailInput.value = state.credentials.email;\n emailInput.addEventListener(\"input\", () =>\n control.setCredentials({ email: emailInput.value }),\n );\n section.appendChild(\n fieldRow(\n {\n key: \"account-email\",\n type: \"email\",\n label: \"Account email\",\n required: true,\n },\n emailInput,\n \"nodii-account-email\", // label for + error id match the real input id\n ),\n );\n\n const passwordInput = el(\"input\", {\n type: \"password\",\n id: \"nodii-account-password\",\n class: \"nodii-onboarding-input\",\n autocomplete: \"new-password\",\n minlength: \"12\",\n maxlength: \"256\",\n }) as HTMLInputElement;\n passwordInput.value = state.credentials.password;\n passwordInput.addEventListener(\"input\", () =>\n control.setCredentials({ password: passwordInput.value }),\n );\n section.appendChild(\n fieldRow(\n {\n key: \"account-password\",\n type: \"text\",\n label: \"Password (12+ characters)\",\n required: true,\n },\n passwordInput,\n \"nodii-account-password\", // label for + error id match the real input id\n ),\n );\n\n const tosCheckbox = el(\"input\", {\n type: \"checkbox\",\n id: \"nodii-consent-tos\",\n }) as HTMLInputElement;\n tosCheckbox.checked = state.consent.tosAccepted;\n tosCheckbox.addEventListener(\"change\", () =>\n control.setConsent({ tosAccepted: tosCheckbox.checked }),\n );\n const tosLabelChildren: Array<HTMLElement | string> = [\"I accept the \"];\n if (options.tosUrl) {\n tosLabelChildren.push(\n el(\n \"a\",\n {\n href: options.tosUrl,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n [\"Terms of Service\"],\n ),\n );\n } else {\n tosLabelChildren.push(\"Terms of Service\");\n }\n section.appendChild(\n el(\"div\", { class: \"nodii-onboarding-consent-row\" }, [\n tosCheckbox,\n el(\"label\", { for: \"nodii-consent-tos\" }, tosLabelChildren),\n ]),\n );\n section.appendChild(\n el(\"div\", {\n class: \"nodii-onboarding-field-error\",\n id: \"nodii-consent-tos-error\",\n role: \"alert\",\n }),\n );\n\n const privacyCheckbox = el(\"input\", {\n type: \"checkbox\",\n id: \"nodii-consent-privacy\",\n }) as HTMLInputElement;\n privacyCheckbox.checked = state.consent.privacyAccepted;\n privacyCheckbox.addEventListener(\"change\", () =>\n control.setConsent({ privacyAccepted: privacyCheckbox.checked }),\n );\n const privacyLabelChildren: Array<HTMLElement | string> = [\"I accept the \"];\n if (options.privacyUrl) {\n privacyLabelChildren.push(\n el(\n \"a\",\n {\n href: options.privacyUrl,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n [\"Privacy Policy\"],\n ),\n );\n } else {\n privacyLabelChildren.push(\"Privacy Policy\");\n }\n section.appendChild(\n el(\"div\", { class: \"nodii-onboarding-consent-row\" }, [\n privacyCheckbox,\n el(\"label\", { for: \"nodii-consent-privacy\" }, privacyLabelChildren),\n ]),\n );\n section.appendChild(\n el(\"div\", {\n class: \"nodii-onboarding-field-error\",\n id: \"nodii-consent-privacy-error\",\n role: \"alert\",\n }),\n );\n\n return section;\n }\n\n function renderStep(\n control: SignupStepperControl,\n state: SignupStepperState,\n ): void {\n while (stepArea.firstChild) stepArea.removeChild(stepArea.firstChild);\n\n const step = state.currentStep;\n if (step) {\n stepArea.appendChild(\n el(\"h3\", { class: \"nodii-onboarding-stage-title\" }, [\n STAGE_TITLES[step.stage] ?? step.stage,\n ]),\n );\n for (const field of step.fields) {\n const input = buildFieldInput(\n field,\n state.answers[field.key],\n (value) => control.setAnswer(field.key, value),\n );\n stepArea.appendChild(fieldRow(field, input));\n }\n }\n\n const isLast = control.isLastStep();\n if (isLast) {\n stepArea.appendChild(renderAccountSection(control, state));\n }\n\n const nav = el(\"div\", { class: \"nodii-onboarding-nav\" });\n if (!control.isFirstStep()) {\n const backBtn = el(\n \"button\",\n { type: \"button\", class: \"nodii-onboarding-back-btn\" },\n [\"Back\"],\n );\n backBtn.addEventListener(\"click\", () => control.back());\n nav.appendChild(backBtn);\n }\n const forwardBtn = el(\n \"button\",\n {\n type: isLast ? \"submit\" : \"button\",\n class: \"nodii-onboarding-submit-btn\",\n id: \"nodii-signup-forward\",\n },\n [isLast ? (options.submitLabel ?? \"Create account\") : \"Next\"],\n );\n if (!isLast) {\n forwardBtn.addEventListener(\"click\", () => control.next());\n }\n nav.appendChild(forwardBtn);\n stepArea.appendChild(nav);\n }\n\n async function handleSpecStale(control: SignupStepperControl): Promise<void> {\n // READ the previously-served version back out of the cache (populated on\n // boot under (onboarder, specVersion)) so we can diff it against the\n // refetched spec and tell the user exactly what changed.\n const prior =\n currentSpecVersion !== null\n ? cache.get(options.onboarder, currentSpecVersion)\n : undefined;\n\n const fresh = await fetchOnboardingSpec({\n baseUrl: options.baseUrl,\n onboarder: options.onboarder,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n cache,\n });\n if (unmounted) return;\n\n if (prior) {\n const diff = diffSpecFields(prior, fresh);\n const parts: string[] = [];\n if (diff.added.length) parts.push(`added: ${diff.added.join(\", \")}`);\n if (diff.removed.length)\n parts.push(`removed: ${diff.removed.join(\", \")}`);\n if (diff.changed.length)\n parts.push(`changed: ${diff.changed.join(\", \")}`);\n staleDiffSummary = parts.length ? ` (${parts.join(\"; \")})` : \"\";\n } else {\n staleDiffSummary = \"\";\n }\n\n siteKey = options.siteKey ?? fresh.botChallenge.siteKey;\n currentSpecVersion = fresh.specVersion;\n control.applyNewSpec(fresh);\n // A stale submission's payload is dead; the next submit is a NEW\n // logical submission against the new specVersion.\n idempotencyKey = null;\n lastFingerprint = null;\n }\n\n async function handleSubmit(control: SignupStepperControl): Promise<void> {\n if (!control.validateAll()) return;\n control.acknowledgeSpecStale();\n control.setSubmitting();\n\n const body = control.buildSubmitPayload();\n const fingerprint = computeSignupFingerprint(body);\n if (idempotencyKey === null || fingerprint !== lastFingerprint) {\n idempotencyKey = generateIdempotencyKey();\n lastFingerprint = fingerprint;\n }\n\n // First token up front (clear pre-HTTP failure); fresh token per retry\n // attempt via the provider (single-use tokens).\n let firstToken: string;\n try {\n firstToken = await executeRecaptcha(siteKey, \"signup_submit\", {\n timeoutMs: options.timeoutMs,\n });\n } catch (recaptchaErr) {\n control.setError(\"Could not load bot protection. Please try again.\");\n options.onError?.(recaptchaErr);\n return;\n }\n let usedFirst = false;\n const tokenProvider = async (): Promise<string> => {\n if (!usedFirst) {\n usedFirst = true;\n return firstToken;\n }\n return executeRecaptcha(siteKey, \"signup_submit\", {\n timeoutMs: options.timeoutMs,\n });\n };\n\n try {\n const result = await submitSignup(body, {\n baseUrl: options.baseUrl,\n botToken: tokenProvider,\n idempotencyKey,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n });\n idempotencyKey = null;\n lastFingerprint = null;\n control.setSuccess(result.terminalStage);\n options.onSuccess?.(result);\n } catch (err) {\n if (err instanceof OnboardingSpecStaleError) {\n try {\n await handleSpecStale(control);\n } catch (refetchErr) {\n control.setError(\n \"The signup form changed and could not be reloaded. Please refresh the page.\",\n );\n options.onError?.(refetchErr);\n return;\n }\n options.onError?.(err);\n } else if (err instanceof OnboardingBotChallengeError) {\n control.setError(\n \"Bot protection check failed. Please refresh the page and try again.\",\n );\n options.onError?.(err);\n } else if (err instanceof OnboardingRateLimitError) {\n control.setError(\n err.retryAfterSeconds !== null\n ? `Too many requests. Please wait ${err.retryAfterSeconds}s.`\n : \"Too many requests. Please wait a moment.\",\n );\n options.onError?.(err);\n } else {\n control.setError(\"Something went wrong. Please try again in a moment.\");\n options.onError?.(err);\n }\n }\n }\n\n function onStateChange(\n control: SignupStepperControl,\n state: SignupStepperState,\n ): void {\n // Full step re-render only when the step (or staleness) changed —\n // in-place updates otherwise so typing never loses focus.\n if (\n state.stepIndex !== renderedStepIndex ||\n state.specStale !== renderedStale\n ) {\n renderedStepIndex = state.stepIndex;\n renderedStale = state.specStale;\n renderStep(control, state);\n renderStepsIndicator(state);\n }\n\n staleBanner.style.display = state.specStale ? \"\" : \"none\";\n staleBanner.textContent = state.specStale\n ? `This form was just updated by the provider${staleDiffSummary}. Please review your answers below and submit again.`\n : \"\";\n\n setFieldErrorsInPlace(\n stepArea,\n state.errors,\n (path) => `nodii-f-${path.split(\".\")[0] ?? path}`,\n );\n // Account errors overlay (only present on the last step's DOM)\n for (const err of state.accountErrors) {\n const id = accountIdOf(err.path.split(\".\")[0] ?? err.path);\n const errorNode = stepArea.querySelector(idSelector(`${id}-error`));\n if (errorNode) errorNode.textContent = err.message;\n const inputNode = stepArea.querySelector(idSelector(id));\n if (inputNode) inputNode.classList.add(\"has-error\");\n }\n\n if (state.serverError) {\n serverErrorEl.textContent = state.serverError;\n serverErrorEl.style.display = \"\";\n } else {\n serverErrorEl.style.display = \"none\";\n }\n\n const forwardBtn = stepArea.querySelector(\n \"#nodii-signup-forward\",\n ) as HTMLButtonElement | null;\n if (forwardBtn) {\n forwardBtn.disabled = state.status === \"submitting\";\n }\n\n if (state.status === \"success\") {\n const message =\n state.terminalStage === \"active\"\n ? \"Your account is ready — you're all set!\"\n : state.terminalStage === \"inactive\"\n ? \"Your account was created. Complete verification to activate it.\"\n : \"Thanks for signing up! Check your email to verify your account.\";\n successEl.textContent = message;\n successEl.style.display = \"\";\n form.style.display = \"none\";\n } else {\n // Any non-success status (editing/submitting/error) shows the form and\n // hides the success panel. Without this, a reset()→\"editing\" re-emit\n // would leave the success panel up and the form hidden until reload.\n successEl.style.display = \"none\";\n form.style.display = \"\";\n }\n }\n\n // ── Boot: fetch spec, then build the interactive form ──\n void (async () => {\n let spec: OnboardingSpec;\n try {\n spec = await fetchOnboardingSpec({\n baseUrl: options.baseUrl,\n onboarder: options.onboarder,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n cache,\n // Reuse a spec already loaded for this onboarder this session (a\n // remount into the same page shouldn't re-hit the network). A 409 on\n // submit is the authoritative staleness signal that triggers refetch.\n preferCached: true,\n });\n } catch (err) {\n if (unmounted) return;\n loadingEl.textContent =\n \"The signup form could not be loaded. Please refresh the page.\";\n options.onError?.(err);\n return;\n }\n if (unmounted) return;\n\n siteKey = options.siteKey ?? spec.botChallenge.siteKey;\n currentSpecVersion = spec.specVersion;\n\n const control = createSignupStepper(spec);\n stepper = control;\n\n form.addEventListener(\"submit\", (event: Event) => {\n event.preventDefault();\n void handleSubmit(control);\n });\n\n form.appendChild(stepsIndicator);\n form.appendChild(staleBanner);\n form.appendChild(stepArea);\n form.appendChild(serverErrorEl);\n\n wrapper.removeChild(loadingEl);\n wrapper.appendChild(successEl);\n wrapper.appendChild(form);\n\n unsubscribe = control.subscribe((state) => onStateChange(control, state));\n // Initial render\n onStateChange(control, control.getState());\n options.onReady?.(spec);\n })();\n\n return {\n unmount() {\n unmounted = true;\n unsubscribe?.();\n if (wrapper.parentNode === host) host.removeChild(wrapper);\n },\n reset() {\n idempotencyKey = null;\n lastFingerprint = null;\n // Force a full re-render on the next state emit so cleared answers\n // actually re-render as empty inputs.\n renderedStepIndex = -1;\n renderedStale = false;\n if (stepper) {\n // stepper.reset() clears answers/credentials/consent and transitions\n // status back to \"editing\"; the emitted state re-renders the form,\n // hides the success panel (via onStateChange's else branch), and\n // repositions to step 0.\n stepper.reset();\n } else {\n form.style.display = \"\";\n successEl.style.display = \"none\";\n }\n },\n };\n}\n","/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\nexport {\n mountContactForm,\n type ContactFormMountOptions,\n type MountedWidget,\n} from \"./contact-form.js\";\n\nexport {\n mountSignupForm,\n type SignupFormMountOptions,\n} from \"./signup-form.js\";\n\nexport { injectWidgetStyles, DEFAULT_WIDGET_CSS } from \"./styles.js\";\n\nexport { cssEscape, idSelector } from \"./dom-utils.js\";\n\n/**\n * Namespace entrypoint mirroring the plan's mount API:\n * OnboardingWidget.mount(el, { onboarder, form: 'contact'|'signup', baseUrl, ... })\n */\nimport { mountContactForm } from \"./contact-form.js\";\nimport type { ContactFormMountOptions, MountedWidget } from \"./contact-form.js\";\nimport { mountSignupForm } from \"./signup-form.js\";\nimport type { SignupFormMountOptions } from \"./signup-form.js\";\n\nexport type WidgetMountOptions =\n | ContactFormMountOptions\n | SignupFormMountOptions;\n\nexport const OnboardingWidget = {\n /**\n * Mount the onboarding widget into a host element.\n *\n * @param el - The DOM element to render into.\n * @param options - Widget configuration. `form: \"contact\"` renders the\n * fixed contact form (Phase 1); `form: \"signup\"` fetches the D540 spec\n * and renders the dynamic stepper (Phase 2 — siteKey comes from the\n * spec's botChallenge unless overridden).\n * @returns A mounted widget control (unmount / reset).\n *\n * @example\n * ```ts\n * import { OnboardingWidget } from \"@nodii/onboarding/widget\";\n *\n * OnboardingWidget.mount(document.getElementById(\"signup-form\")!, {\n * onboarder: \"acme-corp\",\n * form: \"signup\",\n * baseUrl: \"https://api.acme.nucleus-cloud.in\",\n * onSuccess: (r) => console.log(\"landed at\", r.terminalStage),\n * });\n * ```\n */\n mount(el: HTMLElement, options: WidgetMountOptions): MountedWidget {\n if (options.form === \"contact\") {\n return mountContactForm(el, options);\n }\n if (options.form === \"signup\") {\n return mountSignupForm(el, options);\n }\n throw new Error(\n `OnboardingWidget.mount: unknown form \"${(options as { form: string }).form}\". Supported: \"contact\", \"signup\".`,\n );\n },\n} as const;\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-VH6FWDWI.js.map
3
+ //# sourceMappingURL=chunk-VH6FWDWI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-VH6FWDWI.js"}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-Z4PA6C2Z.js.map
3
+ //# sourceMappingURL=chunk-Z4PA6C2Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-Z4PA6C2Z.js"}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-ZDY2I6KY.js.map
3
+ //# sourceMappingURL=chunk-ZDY2I6KY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-ZDY2I6KY.js"}
@@ -0,0 +1,184 @@
1
+ import { z } from 'zod/v3';
2
+ import { c as SpecStep, S as SpecField, T as TerminalStage, a as OnboardingSpec } from '../model-IEyDI54w.js';
3
+ import { FieldError } from '../form/index.js';
4
+ import '../schema-TfyBU6JW.js';
5
+
6
+ /**
7
+ * Spec → Zod validator derivation (D540 §3).
8
+ *
9
+ * Turns arbitrary SpecField descriptors from the served spec into Zod
10
+ * schemas for CLIENT-side UX validation. The server re-validates
11
+ * authoritatively (D540 §2) — client validation is a convenience layer,
12
+ * so the derivation is deliberately conservative:
13
+ *
14
+ * - Known `type`s map to typed schemas (see FIELD TYPE MAP below).
15
+ * - An UNKNOWN type falls back to z.string() (never blocks a field the
16
+ * server knows how to validate).
17
+ * - Known `validation` keys are applied (minLength, maxLength, min, max,
18
+ * pattern, format:"email"). Unknown validation keys are IGNORED
19
+ * client-side — the server enforces them.
20
+ * - `required:false` fields accept undefined AND "" (an empty input is
21
+ * "not provided").
22
+ * - select/radio values must be one of `options`; multiselect values
23
+ * must be a subset.
24
+ *
25
+ * FIELD TYPE MAP:
26
+ * text | textarea | tel | (unknown) → string
27
+ * email → string().email()
28
+ * number → coerce.number (DOM inputs are strings)
29
+ * checkbox | boolean → boolean
30
+ * select | radio → string ∈ options
31
+ * multiselect → string[] ⊆ options
32
+ * date → string, parseable as a date
33
+ */
34
+
35
+ /** Extract the comparable value of an option entry ({value}, {key}, or scalar). */
36
+ declare function optionValue(option: unknown): string;
37
+ /**
38
+ * Derive the full Zod schema for one SpecField.
39
+ * Optional fields accept undefined and "" ("not provided" in a form UI).
40
+ * Required fields additionally reject "" for string-typed inputs.
41
+ */
42
+ declare function deriveFieldSchema(field: SpecField): z.ZodTypeAny;
43
+ /**
44
+ * Derive a STRICT Zod object schema for one step's fields — unknown answer
45
+ * keys within the step are rejected (mirrors the server's authoritative
46
+ * re-validation posture; a stale client must not silently carry fields the
47
+ * spec no longer defines).
48
+ */
49
+ declare function deriveStepSchema(step: SpecStep): z.ZodObject<Record<string, z.ZodTypeAny>, "strict", z.ZodTypeAny, {
50
+ [x: string]: any;
51
+ }, {
52
+ [x: string]: any;
53
+ }>;
54
+ /**
55
+ * Derive the STRICT schema for the complete answers object across all
56
+ * steps (used at submit time and by the 409-stale re-validation).
57
+ */
58
+ declare function deriveAnswersSchema(steps: SpecStep[]): z.ZodObject<Record<string, z.ZodTypeAny>, "strict", z.ZodTypeAny, {
59
+ [x: string]: any;
60
+ }, {
61
+ [x: string]: any;
62
+ }>;
63
+
64
+ /**
65
+ * Headless dynamic signup stepper (D540 §1/§3).
66
+ *
67
+ * The steps are GENERATED from the served spec: fields bucket by `stage`
68
+ * server-side → the spec's forms.signup.steps array. More configured
69
+ * fields ⇒ more steps. The final `activation` stage carries the
70
+ * service-selection inputs feeding the existing terminal-stage guards.
71
+ *
72
+ * Framework-agnostic: same subscribe/mutate contract as the Phase-1
73
+ * contact-form state. The default component layer renders it; framework
74
+ * integrations can wrap it.
75
+ *
76
+ * 409 spec_stale flow (D540 reject-stale): the CALLER (widget/submit
77
+ * orchestration) refetches the spec on OnboardingSpecStaleError and calls
78
+ * `applyNewSpec(newSpec)`. The stepper re-validates every answer against
79
+ * the NEW derived schema, DROPS answers whose fields no longer exist,
80
+ * marks `specStale: true`, and repositions to the first step with errors —
81
+ * the user re-confirms; the SDK NEVER silently auto-resubmits.
82
+ */
83
+
84
+ type StepperStatus = "editing" | "submitting" | "success" | "error";
85
+ interface SignupConsent {
86
+ tosAccepted: boolean;
87
+ privacyAccepted: boolean;
88
+ }
89
+ interface SignupCredentials {
90
+ email: string;
91
+ password: string;
92
+ }
93
+ interface SignupStepperState {
94
+ /** Zero-based index of the current step. */
95
+ stepIndex: number;
96
+ stepCount: number;
97
+ currentStep: SpecStep | null;
98
+ /** Answers keyed by field key (only keys defined by the active spec). */
99
+ answers: Record<string, unknown>;
100
+ /** Derived from serviceSelection-flagged answers (see buildSubmitPayload). */
101
+ selectedServices: string[];
102
+ /** Validation errors for the CURRENT step (or full-form at submit). */
103
+ errors: FieldError[];
104
+ /** Credential/consent errors (submit-time). */
105
+ accountErrors: FieldError[];
106
+ consent: SignupConsent;
107
+ credentials: SignupCredentials;
108
+ status: StepperStatus;
109
+ serverError: string | null;
110
+ /** True after a 409-stale spec swap until the user re-validates. */
111
+ specStale: boolean;
112
+ /** The specVersion currently driving the form (echoed on submit). */
113
+ specVersion: string;
114
+ /** Set on success from the submit response. */
115
+ terminalStage: TerminalStage | null;
116
+ }
117
+ type SignupStepperListener = (state: SignupStepperState) => void;
118
+ interface SignupStepperControl {
119
+ getState(): SignupStepperState;
120
+ setAnswer(key: string, value: unknown): void;
121
+ setConsent(consent: Partial<SignupConsent>): void;
122
+ setCredentials(credentials: Partial<SignupCredentials>): void;
123
+ /** Validate ONLY the current step. Returns true when clean. */
124
+ validateStep(): boolean;
125
+ /** Validate current step; advance when clean. Returns true if advanced. */
126
+ next(): boolean;
127
+ back(): void;
128
+ isFirstStep(): boolean;
129
+ isLastStep(): boolean;
130
+ /**
131
+ * Full-form validation: every step's answers + credentials + consent.
132
+ * Populates errors/accountErrors. Returns true when submittable.
133
+ */
134
+ validateAll(): boolean;
135
+ /**
136
+ * The submit payload body (minus botToken, which the transport attaches).
137
+ * Call ONLY after validateAll() returns true.
138
+ */
139
+ buildSubmitPayload(): {
140
+ specVersion: string;
141
+ answers: Record<string, unknown>;
142
+ selectedServices?: string[];
143
+ consent: {
144
+ tosAccepted: true;
145
+ privacyAccepted: true;
146
+ };
147
+ credentials: SignupCredentials;
148
+ };
149
+ /**
150
+ * Swap in a refetched spec after 409 spec_stale. Drops answers for
151
+ * removed fields, re-validates the rest, marks specStale, repositions
152
+ * to the first step with errors. NEVER auto-resubmits.
153
+ */
154
+ applyNewSpec(spec: OnboardingSpec): void;
155
+ /** Clear the specStale flag once the user has re-confirmed. */
156
+ acknowledgeSpecStale(): void;
157
+ setSubmitting(): void;
158
+ setSuccess(terminalStage: TerminalStage): void;
159
+ setError(message: string): void;
160
+ /**
161
+ * Reset to the pristine initial state against the CURRENT spec: step 0,
162
+ * status "editing", answers/credentials/consent/errors cleared. This is
163
+ * the only transition back OUT of "success"/"error"; the widget's reset()
164
+ * relies on it (otherwise a post-success keystroke would re-emit
165
+ * status "success" and re-hide the form).
166
+ */
167
+ reset(): void;
168
+ subscribe(listener: SignupStepperListener): () => void;
169
+ }
170
+ /**
171
+ * Create a headless stepper for the spec's signup form.
172
+ *
173
+ * @example
174
+ * ```ts
175
+ * const spec = await fetchOnboardingSpec({ baseUrl, onboarder });
176
+ * const stepper = createSignupStepper(spec);
177
+ * stepper.subscribe(render);
178
+ * stepper.setAnswer("company_name", "ACME");
179
+ * if (stepper.next()) { ... }
180
+ * ```
181
+ */
182
+ declare function createSignupStepper(spec: OnboardingSpec): SignupStepperControl;
183
+
184
+ export { type SignupConsent, type SignupCredentials, type SignupStepperControl, type SignupStepperListener, type SignupStepperState, type StepperStatus, createSignupStepper, deriveAnswersSchema, deriveFieldSchema, deriveStepSchema, optionValue };
@@ -0,0 +1,4 @@
1
+ import '../chunk-ZDY2I6KY.js';
2
+ export { createSignupStepper, deriveAnswersSchema, deriveFieldSchema, deriveStepSchema, optionValue } from '../chunk-4SWOVHZ2.js';
3
+ //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,64 @@
1
+ import { C as ContactFormValues } from '../schema-TfyBU6JW.js';
2
+ export { L as LeadsWirePayload, c as contactFormSchema, l as leadsWireSchema, v as validateContactForm, a as validateLeadsPayload } from '../schema-TfyBU6JW.js';
3
+ import 'zod/v3';
4
+
5
+ /**
6
+ * Headless form state manager for the contact form.
7
+ *
8
+ * Designed to be framework-agnostic — callers supply a change callback
9
+ * and call the returned mutators. The widget layer uses this internally;
10
+ * framework integrations (React, Vue, etc.) can wrap it in their own hooks.
11
+ */
12
+
13
+ interface FieldError {
14
+ path: string;
15
+ message: string;
16
+ }
17
+ type FormStatus = "idle" | "submitting" | "success" | "error";
18
+ interface ContactFormState {
19
+ values: ContactFormValues;
20
+ /** Per-field validation errors from the last validate() call. */
21
+ errors: FieldError[];
22
+ /** Cross-field / server error message. */
23
+ serverError: string | null;
24
+ status: FormStatus;
25
+ /** True if values have been touched at least once. */
26
+ dirty: boolean;
27
+ }
28
+ type ContactFormStateListener = (state: ContactFormState) => void;
29
+ interface ContactFormControl {
30
+ /** Current snapshot of form state. */
31
+ getState(): ContactFormState;
32
+ /** Update a single field value and re-validate if dirty. */
33
+ setValue<K extends keyof ContactFormValues>(field: K, value: ContactFormValues[K]): void;
34
+ /**
35
+ * Run full client-side validation. Returns true if valid.
36
+ * Also marks the form dirty so future setValue calls auto-validate.
37
+ */
38
+ validate(): boolean;
39
+ /** Mark the form as submitting. Called by the submit client. */
40
+ setSubmitting(): void;
41
+ /** Mark the form as successfully submitted. */
42
+ setSuccess(): void;
43
+ /** Set a server-side error (e.g. 429 rate limited). */
44
+ setError(message: string): void;
45
+ /** Reset to initial idle state. */
46
+ reset(): void;
47
+ /** Subscribe to state changes. Returns unsubscribe function. */
48
+ subscribe(listener: ContactFormStateListener): () => void;
49
+ }
50
+ /**
51
+ * Create a new headless contact form state controller.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const form = createContactFormState();
56
+ * form.subscribe((state) => renderUI(state));
57
+ * form.setValue("name", "Alice");
58
+ * const valid = form.validate();
59
+ * if (valid) await submitContact(form.getState().values, botToken);
60
+ * ```
61
+ */
62
+ declare function createContactFormState(): ContactFormControl;
63
+
64
+ export { type ContactFormControl, type ContactFormState, type ContactFormStateListener, ContactFormValues, type FieldError, type FormStatus, createContactFormState };
@@ -0,0 +1,5 @@
1
+ import '../chunk-JFIONONR.js';
2
+ export { createContactFormState } from '../chunk-AFCJLUPK.js';
3
+ export { contactFormSchema, leadsWireSchema, validateContactForm, validateLeadsPayload } from '../chunk-BIFANV7M.js';
4
+ //# sourceMappingURL=index.js.map
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,10 @@
1
- export declare const LIB_NAME: "onboarding";
2
- export declare const VERSION: "0.0.1";
1
+ export { C as ContactFormValues, L as LeadsWirePayload, c as contactFormSchema, l as leadsWireSchema, v as validateContactForm, a as validateLeadsPayload } from './schema-TfyBU6JW.js';
2
+ export { ContactFormControl, ContactFormState, ContactFormStateListener, FieldError, FormStatus, createContactFormState } from './form/index.js';
3
+ export { F as FIELD_KEY_PATTERN, O as OnboarderTier, a as OnboardingSpec, P as PiiClass, S as SpecField, b as SpecStage, c as SpecStep, T as TerminalStage, o as onboardingSpecSchema, s as specFieldSchema, d as specStepSchema, v as validateOnboardingSpec } from './model-IEyDI54w.js';
4
+ export { OnboardingSpecCache, SpecFetchOptions, SpecFieldDiff, defaultSpecCache, diffSpecFields, fetchOnboardingSpec } from './spec/index.js';
5
+ export { SignupConsent, SignupCredentials, SignupStepperControl, SignupStepperListener, SignupStepperState, StepperStatus, createSignupStepper, deriveAnswersSchema, deriveFieldSchema, deriveStepSchema, optionValue } from './dynamic/index.js';
6
+ export { B as BotTokenSource, L as LeadsSubmitOptions, a as LeadsSubmitResult, S as SignupSubmitBody, b as SignupSubmitOptions, c as SignupSubmitResult, d as SignupWirePayload, e as computePayloadFingerprint, f as computeSignupFingerprint, g as generateIdempotencyKey, r as resolveBotToken, s as signupWireSchema, h as submitLead, i as submitSignup } from './signup-client-Bl6eUrxR.js';
7
+ export { DEFAULT_REQUEST_TIMEOUT_MS, OnboardingBotChallengeError, OnboardingConflictError, OnboardingError, OnboardingErrorKind, OnboardingNetworkError, OnboardingRateLimitError, OnboardingServerError, OnboardingSpecInvalidError, OnboardingSpecStaleError, OnboardingValidationError, fetchWithTimeout, withTimeout } from './submit/index.js';
8
+ export { RecaptchaError, RecaptchaErrorKind, RecaptchaLoadOptions, _resetRecaptchaState, executeRecaptcha, loadRecaptcha } from './recaptcha/index.js';
9
+ export { ContactFormMountOptions, DEFAULT_WIDGET_CSS, MountedWidget, OnboardingWidget, SignupFormMountOptions, WidgetMountOptions, cssEscape, idSelector, injectWidgetStyles, mountContactForm, mountSignupForm } from './widget/index.js';
10
+ import 'zod/v3';
package/dist/index.js CHANGED
@@ -1,2 +1,14 @@
1
- export const LIB_NAME = "onboarding";
2
- export const VERSION = "0.0.1";
1
+ import './chunk-JFIONONR.js';
2
+ import './chunk-ZDY2I6KY.js';
3
+ import './chunk-Z4PA6C2Z.js';
4
+ import './chunk-VH6FWDWI.js';
5
+ export { DEFAULT_WIDGET_CSS, OnboardingWidget, cssEscape, idSelector, injectWidgetStyles, mountContactForm, mountSignupForm } from './chunk-SWMIIUXR.js';
6
+ export { createContactFormState } from './chunk-AFCJLUPK.js';
7
+ export { FIELD_KEY_PATTERN, OnboardingSpecCache, defaultSpecCache, diffSpecFields, fetchOnboardingSpec, onboardingSpecSchema, specFieldSchema, specStepSchema, validateOnboardingSpec } from './chunk-34BQX2KR.js';
8
+ export { createSignupStepper, deriveAnswersSchema, deriveFieldSchema, deriveStepSchema, optionValue } from './chunk-4SWOVHZ2.js';
9
+ export { computePayloadFingerprint, computeSignupFingerprint, generateIdempotencyKey, resolveBotToken, signupWireSchema, submitLead, submitSignup } from './chunk-BQCTDU5V.js';
10
+ export { contactFormSchema, leadsWireSchema, validateContactForm, validateLeadsPayload } from './chunk-BIFANV7M.js';
11
+ export { DEFAULT_REQUEST_TIMEOUT_MS, OnboardingBotChallengeError, OnboardingConflictError, OnboardingError, OnboardingNetworkError, OnboardingRateLimitError, OnboardingServerError, OnboardingSpecInvalidError, OnboardingSpecStaleError, OnboardingValidationError, fetchWithTimeout, withTimeout } from './chunk-AW7W3HAC.js';
12
+ export { RecaptchaError, _resetRecaptchaState, executeRecaptcha, loadRecaptcha } from './chunk-7NS7ENJV.js';
13
+ //# sourceMappingURL=index.js.map
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}