@syndew/oluso-sdk 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +509 -2
- package/dist/auth/embed.global.js +210 -0
- package/dist/auth/embed.global.js.map +1 -0
- package/dist/auth/index.d.mts +535 -0
- package/dist/auth/index.d.ts +535 -0
- package/dist/auth/index.js +2118 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +2088 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/embed.global.js +448 -0
- package/dist/embed.global.js.map +1 -0
- package/dist/index.d.mts +810 -0
- package/dist/index.d.ts +810 -0
- package/dist/index.js +2127 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2095 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react.d.mts +559 -0
- package/dist/react.d.ts +559 -0
- package/dist/react.js +1674 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +1642 -0
- package/dist/react.mjs.map +1 -0
- package/package.json +67 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/embed.ts","../src/client.ts","../src/journey/conditions.ts","../src/journey/styles.ts","../src/journey/webauthn.ts","../src/journey/render.ts"],"sourcesContent":["/**\n * Oluso Embed Script\n *\n * Drop-in script for running journeys (waitlists, contact forms, surveys, sign-ups) as a modal or inline in a\n * page, step by step. No framework dependencies - works with any HTML page.\n *\n * Usage (declarative):\n * <script src=\"https://cdn.oluso.io/sdk/embed.js\"></script>\n * <div data-oluso-trigger\n * data-oluso-server=\"https://auth.yoursite.com\"\n * data-oluso-tenant=\"acme\"\n * data-oluso-journey=\"waitlist\"\n * data-oluso-button-text=\"Join Waitlist\">\n * </div>\n *\n * Usage (inline, e.g. a contact form in the page):\n * <div data-oluso-inline\n * data-oluso-server=\"https://auth.yoursite.com\"\n * data-oluso-tenant=\"acme\"\n * data-oluso-journey=\"contact-us\">\n * </div>\n *\n * Usage (programmatic):\n * <script src=\"https://cdn.oluso.io/sdk/embed.js\"></script>\n * <button onclick=\"Oluso.open()\">Join</button>\n * <script>\n * Oluso.init({\n * serverUrl: 'https://auth.yoursite.com',\n * tenant: 'acme',\n * journey: 'waitlist',\n * });\n * </script>\n */\n\nimport { OlusoClient } from './client';\nimport { mountJourney, type JourneyMount } from './journey/render';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface EmbedConfig {\n serverUrl: string;\n tenant: string;\n journey: string;\n buttonText?: string;\n title?: string;\n description?: string;\n successTitle?: string;\n successMessage?: string;\n successCta?: { text: string; url: string };\n theme?: 'dark' | 'light' | 'auto';\n accentColor?: string;\n /** Called with the completed session */\n onSuccess?: (data: Record<string, unknown>) => void;\n onError?: (error: Error) => void;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst STYLES = `\n.oluso-modal-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.6);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.25s ease, visibility 0.25s ease;\n}\n\n.oluso-modal-overlay.oluso-active {\n opacity: 1;\n visibility: visible;\n}\n\n.oluso-modal {\n width: 100%;\n max-width: 420px;\n border-radius: 16px;\n position: relative;\n transform: translateY(16px) scale(0.96);\n transition: transform 0.25s ease;\n box-shadow: 0 24px 48px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.oluso-modal-overlay.oluso-active .oluso-modal {\n transform: translateY(0) scale(1);\n}\n\n/* Dark theme (default) */\n.oluso-modal--dark {\n background: #1c1c2e;\n border: 1px solid rgba(255, 255, 255, 0.08);\n color: #f5f5f5;\n}\n\n.oluso-modal--dark .oluso-modal__input,\n.oluso-modal--dark .oluso-modal__textarea,\n.oluso-modal--dark .oluso-modal__select {\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.12);\n color: #f5f5f5;\n}\n\n.oluso-modal--dark .oluso-modal__input::placeholder,\n.oluso-modal--dark .oluso-modal__textarea::placeholder {\n color: rgba(255, 255, 255, 0.35);\n}\n\n.oluso-modal--dark .oluso-modal__label {\n color: rgba(255, 255, 255, 0.85);\n}\n\n.oluso-modal--dark .oluso-modal__desc {\n color: rgba(255, 255, 255, 0.55);\n}\n\n.oluso-modal--dark .oluso-modal__close {\n background: rgba(255, 255, 255, 0.06);\n color: rgba(255, 255, 255, 0.6);\n}\n\n.oluso-modal--dark .oluso-modal__close:hover {\n background: rgba(255, 255, 255, 0.12);\n color: #fff;\n}\n\n.oluso-modal--dark .oluso-modal__footer {\n color: rgba(255, 255, 255, 0.4);\n}\n\n/* Light theme */\n.oluso-modal--light {\n background: #ffffff;\n border: 1px solid rgba(0, 0, 0, 0.08);\n color: #1a1a2e;\n}\n\n.oluso-modal--light .oluso-modal__input,\n.oluso-modal--light .oluso-modal__textarea,\n.oluso-modal--light .oluso-modal__select {\n background: #f8f8fa;\n border: 1px solid rgba(0, 0, 0, 0.1);\n color: #1a1a2e;\n}\n\n.oluso-modal--light .oluso-modal__input::placeholder,\n.oluso-modal--light .oluso-modal__textarea::placeholder {\n color: rgba(0, 0, 0, 0.35);\n}\n\n.oluso-modal--light .oluso-modal__label {\n color: #1a1a2e;\n}\n\n.oluso-modal--light .oluso-modal__desc {\n color: rgba(0, 0, 0, 0.55);\n}\n\n.oluso-modal--light .oluso-modal__close {\n background: rgba(0, 0, 0, 0.04);\n color: rgba(0, 0, 0, 0.5);\n}\n\n.oluso-modal--light .oluso-modal__close:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #1a1a2e;\n}\n\n.oluso-modal--light .oluso-modal__footer {\n color: rgba(0, 0, 0, 0.4);\n}\n\n/* Shared component styles */\n.oluso-modal__body {\n padding: 36px 28px 28px;\n}\n\n.oluso-modal__close {\n position: absolute;\n top: 12px;\n right: 12px;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 50%;\n font-size: 1.25rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s, color 0.15s;\n line-height: 1;\n padding: 0;\n}\n\n.oluso-modal__title {\n font-size: 1.375rem;\n font-weight: 700;\n margin: 0 0 6px;\n line-height: 1.3;\n}\n\n.oluso-modal__desc {\n margin: 0 0 24px;\n font-size: 0.9rem;\n line-height: 1.5;\n}\n\n.oluso-modal__field {\n margin-bottom: 16px;\n}\n\n.oluso-modal__label {\n display: block;\n font-size: 0.8125rem;\n font-weight: 500;\n margin-bottom: 6px;\n}\n\n.oluso-modal__label-optional {\n opacity: 0.5;\n font-weight: 400;\n}\n\n.oluso-modal__input,\n.oluso-modal__textarea,\n.oluso-modal__select {\n width: 100%;\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 0.9375rem;\n font-family: inherit;\n transition: border-color 0.15s, box-shadow 0.15s;\n box-sizing: border-box;\n}\n\n.oluso-modal__input:focus,\n.oluso-modal__textarea:focus,\n.oluso-modal__select:focus {\n outline: none;\n border-color: var(--oluso-accent, #6366f1);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--oluso-accent, #6366f1) 15%, transparent);\n}\n\n.oluso-modal__textarea {\n resize: vertical;\n min-height: 72px;\n}\n\n.oluso-modal__error {\n font-size: 0.8125rem;\n color: #ef4444;\n margin-top: 4px;\n}\n\n.oluso-modal__submit {\n width: 100%;\n padding: 12px 20px;\n border: none;\n border-radius: 10px;\n font-size: 0.9375rem;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin-top: 20px;\n background: var(--oluso-accent, #6366f1);\n color: #fff;\n transition: opacity 0.15s, transform 0.1s;\n}\n\n.oluso-modal__submit:hover:not(:disabled) {\n opacity: 0.9;\n}\n\n.oluso-modal__submit:active:not(:disabled) {\n transform: scale(0.98);\n}\n\n.oluso-modal__submit:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.oluso-modal__spinner {\n width: 18px;\n height: 18px;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-top-color: #fff;\n border-radius: 50%;\n animation: oluso-spin 0.6s linear infinite;\n}\n\n@keyframes oluso-spin {\n to { transform: rotate(360deg); }\n}\n\n.oluso-modal__footer {\n text-align: center;\n margin-top: 16px;\n font-size: 0.8125rem;\n}\n\n.oluso-modal__footer a {\n color: var(--oluso-accent, #6366f1);\n text-decoration: none;\n font-weight: 500;\n}\n\n.oluso-modal__footer a:hover {\n text-decoration: underline;\n}\n\n/* Success state */\n.oluso-modal__success {\n text-align: center;\n padding: 40px 28px 32px;\n}\n\n.oluso-modal__success-icon {\n width: 56px;\n height: 56px;\n background: var(--oluso-accent, #6366f1);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 20px;\n}\n\n.oluso-modal__success-icon svg {\n width: 28px;\n height: 28px;\n stroke: #fff;\n fill: none;\n stroke-width: 2.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.oluso-modal__success h2 {\n font-size: 1.375rem;\n font-weight: 700;\n margin: 0 0 8px;\n}\n\n.oluso-modal__success p {\n font-size: 0.9rem;\n opacity: 0.7;\n margin: 0 0 24px;\n line-height: 1.5;\n}\n\n.oluso-modal__success-cta {\n display: inline-block;\n padding: 12px 24px;\n background: var(--oluso-accent, #6366f1);\n color: #fff;\n border-radius: 10px;\n text-decoration: none;\n font-weight: 600;\n font-size: 0.9375rem;\n transition: opacity 0.15s;\n}\n\n.oluso-modal__success-cta:hover {\n opacity: 0.9;\n}\n\n/* Trigger button (auto-rendered) */\n.oluso-modal .oluso-journey, .oluso-inline .oluso-journey { --oluso-accent: inherit; }\n.oluso-modal--dark .oluso-journey { --oluso-bg: transparent; }\n.oluso-inline__success { text-align: center; padding: 16px 0; }\n.oluso-trigger-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n border: none;\n border-radius: 10px;\n font-size: 0.9375rem;\n font-weight: 600;\n cursor: pointer;\n background: var(--oluso-accent, #6366f1);\n color: #fff;\n transition: opacity 0.15s, transform 0.1s;\n font-family: inherit;\n}\n\n.oluso-trigger-btn:hover {\n opacity: 0.9;\n}\n\n.oluso-trigger-btn:active {\n transform: scale(0.97);\n}\n`;\n\n// ============================================================================\n// Core\n// ============================================================================\n\ninterface BaseConfig {\n serverUrl: string;\n tenant: string;\n}\n\nlet baseConfig: BaseConfig | null = null;\nlet journeyConfigs: Map<string, EmbedConfig> = new Map();\nlet modalElement: HTMLElement | null = null;\nlet activeJourney: string | null = null;\nlet activeMount: JourneyMount | null = null;\nconst inlineMounts = new Map<HTMLElement, JourneyMount>();\nlet styleElement: HTMLStyleElement | null = null;\n\nfunction injectStyles(): void {\n if (styleElement) return;\n styleElement = document.createElement('style');\n styleElement.id = 'oluso-embed-styles';\n styleElement.textContent = STYLES;\n document.head.appendChild(styleElement);\n}\n\nfunction resolveTheme(config: EmbedConfig): 'dark' | 'light' {\n if (config.theme === 'light') return 'light';\n if (config.theme === 'dark') return 'dark';\n if (config.theme === 'auto') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'dark';\n}\n\nfunction resolveConfig(journeyOrConfig?: string | Partial<EmbedConfig>): EmbedConfig {\n let config: EmbedConfig;\n\n if (typeof journeyOrConfig === 'string') {\n // Look up registered journey config\n const registered = journeyConfigs.get(journeyOrConfig);\n if (registered) {\n config = registered;\n } else if (baseConfig) {\n config = { ...baseConfig, journey: journeyOrConfig } as EmbedConfig;\n } else {\n throw new Error(`[Oluso] Journey \"${journeyOrConfig}\" not registered. Call Oluso.init() first.`);\n }\n } else if (journeyOrConfig && journeyOrConfig.journey) {\n // Inline config object\n config = { ...baseConfig, ...journeyOrConfig } as EmbedConfig;\n } else {\n // No argument — use first registered journey or error\n const first = journeyConfigs.values().next().value;\n if (first) {\n config = first;\n } else {\n throw new Error('[Oluso] Not initialized. Call Oluso.init() first.');\n }\n }\n\n return config;\n}\n\nfunction clientFor(config: EmbedConfig): OlusoClient {\n return new OlusoClient({ serverUrl: config.serverUrl, tenant: config.tenant });\n}\n\nfunction text<K extends keyof HTMLElementTagNameMap>(tag: K, className: string, value: string): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n node.textContent = value;\n return node;\n}\n\nfunction createModal(config: EmbedConfig): HTMLElement {\n const theme = resolveTheme(config);\n const overlay = document.createElement('div');\n overlay.className = 'oluso-modal-overlay';\n overlay.id = 'oluso-modal-overlay';\n overlay.style.setProperty('--oluso-accent', config.accentColor || '#6366f1');\n\n const modal = document.createElement('div');\n modal.className = `oluso-modal oluso-modal--${theme}`;\n modal.setAttribute('role', 'dialog');\n modal.setAttribute('aria-modal', 'true');\n\n const closeButton = document.createElement('button');\n closeButton.className = 'oluso-modal__close';\n closeButton.setAttribute('aria-label', 'Close');\n closeButton.textContent = '\\u00d7';\n closeButton.addEventListener('click', () => close());\n\n const body = document.createElement('div');\n body.className = 'oluso-modal__body';\n body.setAttribute('data-oluso-form', '');\n if (config.title) body.appendChild(text('h2', 'oluso-modal__title', config.title));\n if (config.description) body.appendChild(text('p', 'oluso-modal__desc', config.description));\n const journeyHost = document.createElement('div');\n journeyHost.setAttribute('data-oluso-journey-host', '');\n body.appendChild(journeyHost);\n\n const success = document.createElement('div');\n success.className = 'oluso-modal__success';\n success.setAttribute('data-oluso-success', '');\n success.style.display = 'none';\n\n modal.append(closeButton, body, success);\n overlay.appendChild(modal);\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) close();\n });\n\n document.body.appendChild(overlay);\n return overlay;\n}\n\nfunction showSuccess(overlay: HTMLElement, config: EmbedConfig, message: string | undefined): void {\n const body = overlay.querySelector<HTMLElement>('[data-oluso-form]')!;\n const success = overlay.querySelector<HTMLElement>('[data-oluso-success]')!;\n const icon = document.createElement('div');\n icon.className = 'oluso-modal__success-icon';\n icon.innerHTML = '<svg viewBox=\"0 0 24 24\"><polyline points=\"20 6 9 17 4 12\"/></svg>';\n success.replaceChildren(icon);\n if (config.successTitle) success.appendChild(text('h2', '', config.successTitle));\n const detail = config.successMessage || message;\n if (detail) success.appendChild(text('p', '', detail));\n if (config.successCta) {\n const cta = text('a', 'oluso-modal__success-cta', config.successCta.text);\n cta.href = config.successCta.url;\n success.appendChild(cta);\n }\n body.style.display = 'none';\n success.style.display = '';\n}\n\nfunction startJourney(host: HTMLElement, config: EmbedConfig, onDone: (message: string | undefined) => void): JourneyMount {\n return mountJourney(host, {\n client: clientFor(config),\n slug: config.journey,\n theme: resolveTheme(config),\n showCompletion: false,\n onComplete: (session) => {\n onDone(session.message);\n config.onSuccess?.(session as unknown as Record<string, unknown>);\n },\n onError: (error) => config.onError?.(error),\n });\n}\n\n/**\n * Run a journey inline inside an element of the page, e.g. a contact form.\n *\n * @example\n * Oluso.mount('#contact', 'contact-us')\n */\nfunction mount(target: string | HTMLElement, journeyOrConfig?: string | Partial<EmbedConfig>): void {\n const host = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target;\n if (!host) {\n console.error(`[Oluso] Element ${String(target)} not found.`);\n return;\n }\n let config: EmbedConfig;\n try {\n config = resolveConfig(journeyOrConfig);\n } catch (err) {\n console.error((err as Error).message);\n return;\n }\n injectStyles();\n inlineMounts.get(host)?.destroy();\n host.classList.add('oluso-inline');\n host.style.setProperty('--oluso-accent', config.accentColor || '#6366f1');\n const journeyHost = document.createElement('div');\n host.replaceChildren(journeyHost);\n inlineMounts.set(host, startJourney(journeyHost, config, (message) => {\n const done = document.createElement('div');\n done.className = 'oluso-inline__success';\n if (config.successTitle) done.appendChild(text('h3', '', config.successTitle));\n const detail = config.successMessage || message;\n if (detail) done.appendChild(text('p', '', detail));\n host.replaceChildren(done);\n }));\n}\n\n/**\n * Open a modal for a specific journey.\n *\n * @param journeyOrConfig - Journey slug, config override object, or omit for default\n *\n * @example\n * Oluso.open('waitlist')\n * Oluso.open('demo')\n * Oluso.open({ journey: 'waitlist', title: 'Custom Title' })\n * Oluso.open() // opens the first/only registered journey\n */\nfunction open(journeyOrConfig?: string | Partial<EmbedConfig>): void {\n let config: EmbedConfig;\n\n try {\n config = resolveConfig(journeyOrConfig);\n } catch (err) {\n console.error((err as Error).message);\n return;\n }\n\n injectStyles();\n\n // If a different journey is requested, destroy the old modal\n if (modalElement && activeJourney !== config.journey) {\n activeMount?.destroy();\n activeMount = null;\n modalElement.remove();\n modalElement = null;\n }\n\n if (!modalElement) {\n modalElement = createModal(config);\n activeJourney = config.journey;\n }\n\n const overlay = modalElement;\n if (!activeMount) {\n const host = overlay.querySelector<HTMLElement>('[data-oluso-journey-host]')!;\n activeMount = startJourney(host, config, (message) => showSuccess(overlay, config, message));\n }\n\n requestAnimationFrame(() => {\n overlay.classList.add('oluso-active');\n document.body.style.overflow = 'hidden';\n });\n}\n\nfunction close(): void {\n if (!modalElement) return;\n\n modalElement.classList.remove('oluso-active');\n document.body.style.overflow = '';\n\n // Start afresh next time, once the closing animation is over\n const overlay = modalElement;\n setTimeout(() => {\n activeMount?.destroy();\n activeMount = null;\n const body = overlay.querySelector<HTMLElement>('[data-oluso-form]');\n const success = overlay.querySelector<HTMLElement>('[data-oluso-success]');\n if (body) body.style.display = '';\n if (success) success.style.display = 'none';\n }, 300);\n}\n\n/**\n * Initialize with base config and optional per-journey overrides.\n *\n * @example\n * // Single journey\n * Oluso.init({ serverUrl: '...', tenant: 'acme', journey: 'waitlist' });\n *\n * // Multiple journeys\n * Oluso.init({\n * serverUrl: '...',\n * tenant: 'acme',\n * journeys: {\n * waitlist: { title: 'Join the Waitlist', buttonText: 'Join' },\n * demo: { title: 'Book a Demo', buttonText: 'Request Demo' },\n * }\n * });\n */\nfunction init(config: Partial<EmbedConfig> & { serverUrl: string; tenant: string } & (\n | { journey: string }\n | { journeys: Record<string, Partial<EmbedConfig>> }\n)): void {\n baseConfig = { serverUrl: config.serverUrl, tenant: config.tenant };\n\n if ('journeys' in config && config.journeys) {\n // Multiple journeys\n for (const [id, journeyConfig] of Object.entries(config.journeys)) {\n journeyConfigs.set(id, {\n ...config,\n ...journeyConfig,\n journey: id,\n serverUrl: config.serverUrl,\n tenant: config.tenant,\n } as EmbedConfig);\n }\n } else if ('journey' in config && config.journey) {\n // Single journey\n journeyConfigs.set(config.journey, config as EmbedConfig);\n }\n}\n\nfunction destroy(): void {\n activeMount?.destroy();\n activeMount = null;\n inlineMounts.forEach((m) => m.destroy());\n inlineMounts.clear();\n if (modalElement) {\n modalElement.remove();\n modalElement = null;\n }\n if (styleElement) {\n styleElement.remove();\n styleElement = null;\n }\n journeyConfigs.clear();\n baseConfig = null;\n activeJourney = null;\n}\n\n// ============================================================================\n// Auto-initialization from data attributes\n// ============================================================================\n\nfunction autoInit(): void {\n document.querySelectorAll<HTMLElement>('[data-oluso-inline]').forEach((el) => {\n const serverUrl = el.dataset.olusoServer;\n const tenant = el.dataset.olusoTenant;\n const journey = el.dataset.olusoJourney;\n if (!serverUrl || !tenant || !journey) {\n console.warn('[Oluso] Missing required data attributes (data-oluso-server, data-oluso-tenant, data-oluso-journey) on inline element.');\n return;\n }\n if (!baseConfig) baseConfig = { serverUrl, tenant };\n mount(el, {\n serverUrl,\n tenant,\n journey,\n successTitle: el.dataset.olusoSuccessTitle,\n successMessage: el.dataset.olusoSuccessMessage,\n theme: (el.dataset.olusoTheme as EmbedConfig['theme']) || 'auto',\n accentColor: el.dataset.olusoAccent,\n });\n });\n\n const triggers = document.querySelectorAll<HTMLElement>('[data-oluso-trigger]');\n\n triggers.forEach((el) => {\n const serverUrl = el.dataset.olusoServer;\n const tenant = el.dataset.olusoTenant;\n const journey = el.dataset.olusoJourney;\n\n if (!serverUrl || !tenant || !journey) {\n console.warn('[Oluso] Missing required data attributes (data-oluso-server, data-oluso-tenant, data-oluso-journey) on trigger element.');\n return;\n }\n\n const config: EmbedConfig = {\n serverUrl,\n tenant,\n journey,\n buttonText: el.dataset.olusoButtonText || el.dataset.olusoSubmitText || 'Submit',\n title: el.dataset.olusoTitle,\n description: el.dataset.olusoDescription,\n successTitle: el.dataset.olusoSuccessTitle,\n successMessage: el.dataset.olusoSuccessMessage,\n theme: (el.dataset.olusoTheme as EmbedConfig['theme']) || 'dark',\n accentColor: el.dataset.olusoAccent,\n };\n\n // Register this journey config\n if (!baseConfig) {\n baseConfig = { serverUrl, tenant };\n }\n journeyConfigs.set(journey, config);\n\n // Render trigger button if element is empty\n const renderButton = el.dataset.olusoRenderButton !== 'false' && el.children.length === 0;\n\n if (renderButton) {\n injectStyles();\n const btnText = el.dataset.olusoButtonText || 'Join Waitlist';\n const accent = config.accentColor || '#6366f1';\n const btn = document.createElement('button');\n btn.className = 'oluso-trigger-btn';\n btn.style.setProperty('--oluso-accent', accent);\n btn.textContent = btnText;\n btn.addEventListener('click', () => open(journey));\n el.appendChild(btn);\n } else {\n el.addEventListener('click', () => open(journey));\n }\n });\n\n // Escape key listener\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') close();\n });\n}\n\n// Run on DOMContentLoaded or immediately if already loaded\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', autoInit);\n} else {\n autoInit();\n}\n\n// ============================================================================\n// Global API\n// ============================================================================\n\nconst OlusoEmbed = { init, open, close, destroy, mount };\n\n// Expose globally\n(window as unknown as Record<string, unknown>).Oluso = OlusoEmbed;\n\nexport { init, open, close, destroy, mount };\nexport type { EmbedConfig };\n","import type {\n OlusoConfig,\n JourneyInfo,\n SubmissionResult,\n JourneySession,\n StepResult,\n OlusoEvent,\n OlusoEventListener,\n OlusoEventType,\n} from './types';\n\n/**\n * Oluso SDK Client\n *\n * @example\n * ```typescript\n * const oluso = new OlusoClient({\n * serverUrl: 'https://auth.oluso.io',\n * tenant: 'acme',\n * });\n *\n * // Get journey info (form fields, etc.)\n * const journey = await oluso.getJourney('waitlist');\n *\n * // Submit data\n * const result = await oluso.submit('waitlist', {\n * email: 'user@example.com',\n * name: 'John Doe',\n * });\n * ```\n */\nexport class OlusoClient {\n private config: Required<Pick<OlusoConfig, 'serverUrl'>> & OlusoConfig;\n private fetchFn: typeof fetch;\n private listeners: Map<OlusoEventType | '*', Set<OlusoEventListener>> = new Map();\n\n constructor(config: OlusoConfig) {\n if (!config.serverUrl) {\n throw new Error('serverUrl is required');\n }\n\n this.config = {\n ...config,\n serverUrl: config.serverUrl.replace(/\\/$/, ''), // Remove trailing slash\n };\n this.fetchFn = config.fetch || globalThis.fetch.bind(globalThis);\n }\n\n /**\n * Get journey information including form fields. Journeys are named by slug.\n */\n async getJourney(slug: string): Promise<JourneyInfo> {\n const response = await this.request<JourneyInfo>(`/api/public/journeys/${encodeURIComponent(slug)}`);\n return response;\n }\n\n /**\n * Submit data to a data collection journey (waitlist, contact, survey, etc.)\n */\n async submit(\n slug: string,\n data: Record<string, unknown>,\n options?: {\n /** Client-side metadata */\n metadata?: Record<string, string>;\n /** Honeypot field for spam detection */\n honeypot?: string;\n }\n ): Promise<SubmissionResult> {\n try {\n const result = await this.request<SubmissionResult>(`/api/public/journeys/${encodeURIComponent(slug)}/submit`, {\n method: 'POST',\n body: {\n data,\n metadata: {\n ...options?.metadata,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n },\n honeypot: options?.honeypot,\n },\n });\n\n this.emit({\n type: 'submission:success',\n slug,\n data: result,\n });\n\n return result;\n } catch (error) {\n this.emit({\n type: 'submission:error',\n slug,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n throw error;\n }\n }\n\n /**\n * Start a multi-step journey and run its first step. Without data the session's `step`\n * is the first step to render; with data, that is the first step's input.\n */\n async startJourney(slug: string, data?: Record<string, unknown>): Promise<JourneySession> {\n const session = await this.request<JourneySession>(\n `/api/public/journeys/${encodeURIComponent(slug)}/start`,\n { method: 'POST', body: { data } }\n );\n\n this.emit({\n type: 'journey:started',\n slug: session.slug,\n sessionId: session.sessionId,\n data: session,\n });\n\n return session;\n }\n\n /**\n * Start a sign-in (or any authentication) journey for a public client. When the session completes it carries an\n * authorization code, redeemed at the token endpoint with the PKCE verifier and redirect_uri \"postmessage\". Use\n * this when your app keeps its own tokens; OlusoAuth.mountSignIn does the whole round trip for you.\n */\n async startAuthJourney(slug: string, auth: { clientId: string; codeChallenge: string; scope?: string }, data?: Record<string, unknown>): Promise<JourneySession> {\n const session = await this.request<JourneySession>(\n `/api/public/journeys/${encodeURIComponent(slug)}/start`,\n {\n method: 'POST',\n body: { data, clientId: auth.clientId, codeChallenge: auth.codeChallenge, codeChallengeMethod: 'S256', scope: auth.scope },\n }\n );\n\n this.emit({ type: 'journey:started', slug: session.slug, sessionId: session.sessionId, data: session });\n return session;\n }\n\n /**\n * Submit input (or an action such as \"resend\") for the session's current step.\n * The result is the session afterwards: the next step to render, or the completion.\n */\n async submitStep(\n sessionId: string,\n data?: Record<string, unknown>,\n action?: string\n ): Promise<StepResult> {\n const result = await this.request<StepResult>(\n `/api/public/journeys/sessions/${encodeURIComponent(sessionId)}/step`,\n { method: 'POST', body: { data, action } }\n );\n\n this.emit({\n type: result.completed ? 'journey:completed' : result.success ? 'journey:step' : 'journey:error',\n slug: result.slug,\n sessionId,\n data: result,\n });\n\n return result;\n }\n\n /**\n * Submit the current step the way a form posts it: every field, files under their field's name, and the\n * clicked button's name and value. Use this for steps with file fields; `action` is a step action such as \"init\".\n */\n async submitStepForm(sessionId: string, form: FormData, action?: string): Promise<StepResult> {\n if (action) form.set('__journey_action', action);\n const result = await this.request<StepResult>(\n `/api/public/journeys/sessions/${encodeURIComponent(sessionId)}/step`,\n { method: 'POST', body: form }\n );\n\n this.emit({\n type: result.completed ? 'journey:completed' : result.success ? 'journey:step' : 'journey:error',\n slug: result.slug,\n sessionId,\n data: result,\n });\n\n return result;\n }\n\n /** The server this client talks to */\n get serverUrl(): string {\n return this.config.serverUrl;\n }\n\n /**\n * Get where a multi-step session stands (status, current step), without running it\n */\n async getSession(sessionId: string): Promise<JourneySession> {\n return this.request<JourneySession>(`/api/public/journeys/sessions/${encodeURIComponent(sessionId)}`);\n }\n\n /**\n * URL of the hosted journey page (/journey/start/{slug}) to redirect to\n */\n getJourneyUrl(slug: string, options?: {\n redirectUri?: string;\n state?: string;\n }): string {\n const params = new URLSearchParams();\n if (this.config.tenant) params.set('tenant', this.config.tenant);\n\n if (options?.redirectUri) {\n params.set('redirect_uri', options.redirectUri);\n }\n if (options?.state) {\n params.set('state', options.state);\n }\n\n return `${this.config.serverUrl}/journey/start/${encodeURIComponent(slug)}?${params}`;\n }\n\n /**\n * URL of the hosted journey page (/journey/start/{slug}) for an iframe\n */\n getEmbedUrl(slug: string, options?: {\n theme?: 'light' | 'dark';\n hideHeader?: boolean;\n }): string {\n const params = new URLSearchParams({ embed: 'true' });\n if (this.config.tenant) params.set('tenant', this.config.tenant);\n\n if (options?.theme) {\n params.set('theme', options.theme);\n }\n if (options?.hideHeader) {\n params.set('hideHeader', 'true');\n }\n\n return `${this.config.serverUrl}/journey/start/${encodeURIComponent(slug)}?${params}`;\n }\n\n /**\n * Subscribe to SDK events\n */\n on(event: OlusoEventType | '*', listener: OlusoEventListener): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n\n // Return unsubscribe function\n return () => {\n this.listeners.get(event)?.delete(listener);\n };\n }\n\n /**\n * Unsubscribe from SDK events\n */\n off(event: OlusoEventType | '*', listener: OlusoEventListener): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n private emit(event: OlusoEvent): void {\n // Emit to specific listeners\n this.listeners.get(event.type)?.forEach((listener) => listener(event));\n // Emit to wildcard listeners\n this.listeners.get('*')?.forEach((listener) => listener(event));\n }\n\n private async request<T>(\n path: string,\n options?: {\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE';\n body?: unknown;\n }\n ): Promise<T> {\n const url = `${this.config.serverUrl}${path}`;\n const method = options?.method || 'GET';\n const isForm = typeof FormData !== 'undefined' && options?.body instanceof FormData;\n const headers: Record<string, string> = {};\n if (this.config.tenant) {\n headers['X-Tenant-ID'] = this.config.tenant;\n }\n // A form sets its own multipart boundary.\n if (!isForm) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (this.config.apiKey) {\n headers['X-API-Key'] = this.config.apiKey;\n }\n\n if (this.config.headers) {\n Object.assign(headers, await this.config.headers({ method, url }));\n }\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: options?.body === undefined ? undefined : isForm ? (options.body as FormData) : JSON.stringify(options.body),\n credentials: 'include', // Include cookies for session management\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }));\n throw new OlusoError(\n error.message || `Request failed: ${response.status}`,\n response.status,\n error.code,\n error.errors\n );\n }\n\n return response.json();\n }\n}\n\n/**\n * Custom error class for SDK errors\n */\nexport class OlusoError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code?: string,\n public readonly fieldErrors?: Record<string, string>\n ) {\n super(message);\n this.name = 'OlusoError';\n }\n}\n","import type { JourneyFormCondition } from '../types';\n\nconst ALIASES: Record<string, string> = {\n eq: 'eq', equals: 'eq', '==': 'eq', '=': 'eq',\n ne: 'ne', neq: 'ne', notequals: 'ne', '!=': 'ne',\n gt: 'gt', '>': 'gt', greaterthan: 'gt',\n gte: 'gte', '>=': 'gte', greaterthanorequals: 'gte',\n lt: 'lt', '<': 'lt', lessthan: 'lt',\n lte: 'lte', '<=': 'lte', lessthanorequals: 'lte',\n contains: 'contains', notcontains: 'not_contains', '!contains': 'not_contains',\n startswith: 'starts_with', endswith: 'ends_with',\n exists: 'exists', notnull: 'exists', isset: 'exists',\n notexists: 'not_exists', null: 'not_exists', isnotset: 'not_exists',\n empty: 'empty', notempty: 'not_empty',\n in: 'in', notin: 'not_in', '!in': 'not_in',\n regex: 'regex', matches: 'regex',\n true: 'true', false: 'false',\n};\n\n/** The canonical operator, as the server names it; undefined for one no condition supports. */\nexport function normalizeOperator(op: string | undefined): string | undefined {\n if (!op) return undefined;\n return ALIASES[op.trim().toLowerCase().replace(/_/g, '')];\n}\n\nconst same = (a: string, b: string) => a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;\n\nfunction order(actual: string, expected: string | undefined): number | undefined {\n if (expected === undefined) return undefined;\n const a = Number(actual);\n const e = Number(expected);\n if (actual.trim() !== '' && expected.trim() !== '' && !Number.isNaN(a) && !Number.isNaN(e)) return a === e ? 0 : a < e ? -1 : 1;\n const ad = Date.parse(actual);\n const ed = Date.parse(expected);\n if (!Number.isNaN(ad) && !Number.isNaN(ed)) return ad === ed ? 0 : ad < ed ? -1 : 1;\n return actual.localeCompare(expected, undefined, { sensitivity: 'accent' });\n}\n\nfunction compare(actual: string, op: string, expected: string | undefined): boolean {\n const lower = actual.toLowerCase();\n const want = (expected ?? '').toLowerCase();\n switch (op) {\n case 'eq': return same(actual, expected ?? '');\n case 'ne': return !same(actual, expected ?? '');\n case 'gt': { const o = order(actual, expected); return o !== undefined && o > 0; }\n case 'gte': { const o = order(actual, expected); return o !== undefined && o >= 0; }\n case 'lt': { const o = order(actual, expected); return o !== undefined && o < 0; }\n case 'lte': { const o = order(actual, expected); return o !== undefined && o <= 0; }\n case 'contains': return lower.includes(want);\n case 'not_contains': return !lower.includes(want);\n case 'starts_with': return lower.startsWith(want);\n case 'ends_with': return lower.endsWith(want);\n case 'regex':\n if (!expected) return false;\n try { return new RegExp(expected, 'i').test(actual); } catch { return false; }\n default: return false;\n }\n}\n\nfunction expectedList(expected: string | undefined): string[] {\n if (!expected || !expected.trim()) return [];\n const trimmed = expected.trim();\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String);\n } catch {\n return [];\n }\n }\n return trimmed.split(',').map((v) => v.trim()).filter(Boolean);\n}\n\nconst truthy = (v: string) => v.toLowerCase() !== 'false' && v !== '0';\n\n/**\n * Whether a field's current values meet a showWhen condition, with the server's semantics: positive operators pass\n * when any value matches, negative ones when none does.\n */\nexport function conditionMet(condition: JourneyFormCondition, values: string[]): boolean {\n const op = normalizeOperator(condition.operator);\n const present = values.filter((v) => v !== '');\n const members = () => present.flatMap((v) => v.split(',').map((p) => p.trim()).filter(Boolean));\n switch (op) {\n case 'exists':\n case 'not_empty': return present.length > 0;\n case 'not_exists':\n case 'empty': return present.length === 0;\n case 'ne': return !present.some((v) => compare(v, 'eq', condition.value));\n case 'not_contains': return !present.some((v) => compare(v, 'contains', condition.value));\n case 'in': { const list = expectedList(condition.value); return members().some((m) => list.some((e) => same(m, e))); }\n case 'not_in': { const list = expectedList(condition.value); return !members().some((m) => list.some((e) => same(m, e))); }\n case 'true': return present.some(truthy);\n case 'false': return !present.some(truthy);\n case undefined: return false;\n default: return present.some((v) => compare(v, op, condition.value));\n }\n}\n","/** Default look for rendered journeys. Override the custom properties on `.oluso-journey`, or pass `unstyled`. */\nexport const JOURNEY_STYLES = `\n.oluso-journey {\n --oluso-accent: #4f46e5;\n --oluso-accent-contrast: #ffffff;\n --oluso-fg: #111827;\n --oluso-muted: #6b7280;\n --oluso-bg: #ffffff;\n --oluso-field-bg: #ffffff;\n --oluso-border: #d1d5db;\n --oluso-danger: #b91c1c;\n --oluso-danger-bg: #fef2f2;\n --oluso-notice-bg: #eff6ff;\n --oluso-notice: #1d4ed8;\n --oluso-radius: 8px;\n --oluso-gap: 14px;\n --oluso-font: inherit;\n font-family: var(--oluso-font);\n color: var(--oluso-fg);\n font-size: 15px;\n line-height: 1.5;\n}\n.oluso-journey[data-theme=\"dark\"] {\n --oluso-fg: #f3f4f6;\n --oluso-muted: #9ca3af;\n --oluso-bg: #111827;\n --oluso-field-bg: #1f2937;\n --oluso-border: #374151;\n --oluso-danger: #fca5a5;\n --oluso-danger-bg: rgba(185, 28, 28, 0.15);\n --oluso-notice-bg: rgba(59, 130, 246, 0.15);\n --oluso-notice: #93c5fd;\n}\n@media (prefers-color-scheme: dark) {\n .oluso-journey[data-theme=\"auto\"] {\n --oluso-fg: #f3f4f6;\n --oluso-muted: #9ca3af;\n --oluso-bg: #111827;\n --oluso-field-bg: #1f2937;\n --oluso-border: #374151;\n --oluso-danger: #fca5a5;\n --oluso-danger-bg: rgba(185, 28, 28, 0.15);\n --oluso-notice-bg: rgba(59, 130, 246, 0.15);\n --oluso-notice: #93c5fd;\n }\n}\n.oluso-journey *, .oluso-journey *::before, .oluso-journey *::after { box-sizing: border-box; }\n.oluso-journey__form { display: flex; flex-direction: column; gap: var(--oluso-gap); margin: 0; }\n.oluso-journey__title { font-size: 1.25em; font-weight: 600; margin: 0; }\n.oluso-journey__description { color: var(--oluso-muted); margin: 0; white-space: pre-line; }\n.oluso-journey__alert { border-radius: var(--oluso-radius); padding: 10px 12px; margin: 0; }\n.oluso-journey__alert--error { background: var(--oluso-danger-bg); color: var(--oluso-danger); }\n.oluso-journey__alert--notice { background: var(--oluso-notice-bg); color: var(--oluso-notice); }\n.oluso-journey__group { display: flex; flex-direction: column; gap: var(--oluso-gap); border: 0; margin: 0; padding: 0; }\n.oluso-journey__field { display: flex; flex-direction: column; gap: 6px; }\n.oluso-journey__field[hidden] { display: none; }\n.oluso-journey__label { font-weight: 500; }\n.oluso-journey__required { color: var(--oluso-danger); margin-left: 2px; }\n.oluso-journey__input, .oluso-journey__select, .oluso-journey__textarea {\n width: 100%; font: inherit; color: var(--oluso-fg); background: var(--oluso-field-bg);\n border: 1px solid var(--oluso-border); border-radius: var(--oluso-radius); padding: 9px 11px; min-height: 40px;\n}\n.oluso-journey__input:focus, .oluso-journey__select:focus, .oluso-journey__textarea:focus {\n outline: 2px solid var(--oluso-accent); outline-offset: 1px; border-color: transparent;\n}\n.oluso-journey__input[aria-invalid=\"true\"], .oluso-journey__select[aria-invalid=\"true\"], .oluso-journey__textarea[aria-invalid=\"true\"] {\n border-color: var(--oluso-danger);\n}\n.oluso-journey__input--otp { letter-spacing: 0.4em; font-variant-numeric: tabular-nums; text-align: center; font-size: 1.2em; }\n.oluso-journey__phone { display: flex; gap: 8px; }\n.oluso-journey__phone .oluso-journey__select { width: auto; max-width: 45%; }\n.oluso-journey__choices { display: flex; flex-direction: column; gap: 8px; }\n.oluso-journey__choice { display: flex; gap: 10px; align-items: flex-start; cursor: pointer; }\n.oluso-journey__choice input { margin-top: 3px; accent-color: var(--oluso-accent); }\n.oluso-journey__choice-description { display: block; color: var(--oluso-muted); font-size: 0.9em; }\n.oluso-journey__help, .oluso-journey__hint { color: var(--oluso-muted); font-size: 0.875em; margin: 0; }\n.oluso-journey__error { color: var(--oluso-danger); font-size: 0.875em; margin: 0; }\n.oluso-journey__content { margin: 0; white-space: pre-line; }\n.oluso-journey__actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }\n.oluso-journey__button {\n font: inherit; font-weight: 500; border-radius: var(--oluso-radius); padding: 9px 16px; min-height: 40px; cursor: pointer;\n border: 1px solid var(--oluso-border); background: var(--oluso-field-bg); color: var(--oluso-fg);\n}\n.oluso-journey__button--primary { background: var(--oluso-accent); color: var(--oluso-accent-contrast); border-color: var(--oluso-accent); }\n.oluso-journey__button--primary:only-child, .oluso-journey__actions--stacked .oluso-journey__button--primary { flex: 1 1 auto; }\n.oluso-journey__button--link { background: none; border: 0; color: var(--oluso-accent); padding: 4px 0; min-height: 0; }\n.oluso-journey__button--cancel { background: none; }\n.oluso-journey__button:disabled { opacity: 0.6; cursor: progress; }\n.oluso-journey__enter { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }\n.oluso-journey__action-line { display: flex; flex-wrap: wrap; gap: 6px; align-items: baseline; margin: 0; }\n.oluso-journey__links { display: flex; flex-wrap: wrap; gap: 12px; font-size: 0.9em; }\n.oluso-journey__links a { color: var(--oluso-accent); }\n.oluso-journey__qr { display: flex; flex-direction: column; align-items: center; gap: 8px; }\n.oluso-journey__qr img { width: 180px; height: 180px; background: #fff; padding: 8px; border-radius: var(--oluso-radius); }\n.oluso-journey__code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; word-break: break-all; }\n.oluso-journey__codes { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; margin: 0; padding: 0; list-style: none; }\n.oluso-journey__codes li { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; padding: 6px 8px; border: 1px solid var(--oluso-border); border-radius: 6px; text-align: center; }\n.oluso-journey__status { color: var(--oluso-muted); text-align: center; padding: 16px 0; }\n.oluso-journey__done { text-align: center; padding: 8px 0; }\n`;\n\nlet injected = false;\n\nexport function injectJourneyStyles(): void {\n if (injected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.setAttribute('data-oluso-journey', '');\n style.textContent = JOURNEY_STYLES;\n document.head.appendChild(style);\n injected = true;\n}\n","/** WebAuthn for journey steps: options arrive and results leave as base64url, the way the server reads them. */\n\nexport function base64UrlToBuffer(value: string): ArrayBuffer {\n const base64 = value.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes.buffer;\n}\n\nexport function bufferToBase64Url(buffer: ArrayBuffer | null | undefined): string | null {\n if (!buffer) return null;\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\ntype Json = Record<string, unknown>;\n\nfunction credentialDescriptors(list: unknown): PublicKeyCredentialDescriptor[] | undefined {\n if (!Array.isArray(list)) return undefined;\n return list.map((c: Json) => ({\n type: (c.type as PublicKeyCredentialType) ?? 'public-key',\n id: base64UrlToBuffer(String(c.id)),\n transports: c.transports as AuthenticatorTransport[] | undefined,\n }));\n}\n\nexport function requestOptions(publicKey: Json): PublicKeyCredentialRequestOptions {\n return {\n ...(publicKey as object),\n challenge: base64UrlToBuffer(String(publicKey.challenge)),\n allowCredentials: credentialDescriptors(publicKey.allowCredentials),\n } as PublicKeyCredentialRequestOptions;\n}\n\nexport function creationOptions(publicKey: Json): PublicKeyCredentialCreationOptions {\n const user = (publicKey.user ?? {}) as Json;\n return {\n ...(publicKey as object),\n challenge: base64UrlToBuffer(String(publicKey.challenge)),\n user: { ...(user as object), id: base64UrlToBuffer(String(user.id)) },\n excludeCredentials: credentialDescriptors(publicKey.excludeCredentials),\n } as PublicKeyCredentialCreationOptions;\n}\n\n/** A passkey sign-in, as the JSON the server reads. */\nexport async function getAssertion(publicKey: Json): Promise<string> {\n const credential = (await navigator.credentials.get({ publicKey: requestOptions(publicKey) })) as PublicKeyCredential | null;\n if (!credential) throw new Error('No passkey was chosen');\n const response = credential.response as AuthenticatorAssertionResponse;\n return JSON.stringify({\n id: credential.id,\n rawId: bufferToBase64Url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: bufferToBase64Url(response.clientDataJSON),\n authenticatorData: bufferToBase64Url(response.authenticatorData),\n signature: bufferToBase64Url(response.signature),\n userHandle: bufferToBase64Url(response.userHandle),\n },\n authenticatorAttachment: credential.authenticatorAttachment ?? null,\n });\n}\n\n/** A new passkey, as the JSON the server reads. */\nexport async function createCredential(publicKey: Json): Promise<string> {\n const credential = (await navigator.credentials.create({ publicKey: creationOptions(publicKey) })) as PublicKeyCredential | null;\n if (!credential) throw new Error('No passkey was created');\n const response = credential.response as AuthenticatorAttestationResponse;\n return JSON.stringify({\n id: credential.id,\n rawId: bufferToBase64Url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: bufferToBase64Url(response.clientDataJSON),\n attestationObject: bufferToBase64Url(response.attestationObject),\n transports: typeof response.getTransports === 'function' ? response.getTransports() : undefined,\n },\n authenticatorAttachment: credential.authenticatorAttachment ?? null,\n });\n}\n","import type { OlusoClient } from '../client';\nimport type {\n JourneyFormAction,\n JourneyFormField,\n JourneyFormWidget,\n JourneySession,\n JourneyStepForm,\n} from '../types';\nimport { conditionMet } from './conditions';\nimport { injectJourneyStyles } from './styles';\nimport { createCredential, getAssertion } from './webauthn';\n\n/** Text the renderer shows itself; everything about a step comes from the server in the person's language. */\nexport interface JourneyLabels {\n loading: string;\n completed: string;\n failed: string;\n expired: string;\n restart: string;\n takePhoto: string;\n copy: string;\n copied: string;\n passkey: string;\n retry: string;\n waiting: string;\n unavailable: string;\n}\n\nconst DEFAULT_LABELS: JourneyLabels = {\n loading: 'Loading…',\n completed: 'All done. Thank you.',\n failed: 'Something went wrong. Please try again.',\n expired: 'This session has expired. Please start again.',\n restart: 'Start again',\n takePhoto: 'Take a photo',\n copy: 'Copy',\n copied: 'Copied',\n passkey: 'Use your passkey',\n retry: 'Try again',\n waiting: 'Waiting…',\n unavailable: 'This step can’t be shown here.',\n};\n\nexport interface MountJourneyOptions {\n client: OlusoClient;\n /** Start this journey (a waitlist, a contact form, a survey, a sign-up). */\n slug?: string;\n /** Input for the first step. */\n data?: Record<string, unknown>;\n /** Continue a session started elsewhere, e.g. one your backend started for the signed-in user. */\n session?: JourneySession;\n /** Start the session yourself, e.g. a sign-in journey with PKCE. */\n start?: () => Promise<JourneySession>;\n /** After every step the server returns. */\n onStep?: (session: JourneySession) => void;\n /** When the journey completes. */\n onComplete?: (session: JourneySession) => void | Promise<void>;\n /** When the journey fails, expires or a request fails. */\n onError?: (error: Error, session?: JourneySession) => void;\n /** When a step continues elsewhere (an external identity provider, a checkout). Defaults to navigating there. */\n onRedirect?: (url: string, session: JourneySession) => void;\n /** Show the completion message when done (default true). */\n showCompletion?: boolean;\n theme?: 'light' | 'dark' | 'auto';\n /** Skip the default styles; style `.oluso-journey__*` yourself. */\n unstyled?: boolean;\n labels?: Partial<JourneyLabels>;\n}\n\nexport interface JourneyMount {\n /** The session as it stands. */\n readonly session: JourneySession | undefined;\n /** Start again from the first step (only for journeys started by slug or `start`). */\n restart(): Promise<void>;\n destroy(): void;\n}\n\ntype Element = HTMLElement;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, className?: string, text?: string): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (className) node.className = className;\n if (text !== undefined) node.textContent = text;\n return node;\n}\n\nlet uid = 0;\n\n/**\n * Renders any journey into `container` and runs it step by step: forms, sign-in, verification codes, passkeys,\n * captcha, consent, file uploads. Steps the server describes are drawn natively; a step that only has hosted markup\n * is shown as that markup.\n */\nexport function mountJourney(container: Element, options: MountJourneyOptions): JourneyMount {\n const labels: JourneyLabels = { ...DEFAULT_LABELS, ...options.labels };\n const client = options.client;\n const id = `oluso-j${++uid}`;\n let session: JourneySession | undefined;\n let destroyed = false;\n let timers: number[] = [];\n\n if (!options.unstyled) injectJourneyStyles();\n const root = el('div', 'oluso-journey');\n root.setAttribute('data-theme', options.theme ?? 'auto');\n container.appendChild(root);\n\n const clearTimers = () => {\n timers.forEach((t) => window.clearInterval(t));\n timers = [];\n };\n\n const status = (text: string) => {\n root.replaceChildren(el('p', 'oluso-journey__status', text));\n };\n\n const fail = (error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n options.onError?.(err, session);\n return err;\n };\n\n const canRestart = () => Boolean(options.slug || options.start);\n\n const begin = async () => {\n clearTimers();\n status(labels.loading);\n try {\n const started = options.start\n ? await options.start()\n : options.slug\n ? await client.startJourney(options.slug, options.data)\n : options.session;\n if (!started) throw new Error('mountJourney needs a slug, a session or a start function');\n await show(started);\n } catch (error) {\n showProblem(fail(error).message);\n }\n };\n\n const show = async (next: JourneySession) => {\n if (destroyed) return;\n clearTimers();\n session = next;\n options.onStep?.(next);\n\n if (next.completed) {\n if (next.redirectUrl) {\n await options.onComplete?.(next);\n redirect(next.redirectUrl, next);\n return;\n }\n if (options.showCompletion !== false) {\n const done = el('div', 'oluso-journey__done');\n done.appendChild(el('p', 'oluso-journey__content', next.message || labels.completed));\n root.replaceChildren(done);\n } else {\n root.replaceChildren();\n }\n await options.onComplete?.(next);\n return;\n }\n\n if (next.status !== 'in_progress') {\n const message = next.status === 'expired' ? labels.expired : next.errorDescription || labels.failed;\n fail(new Error(message));\n showProblem(message);\n return;\n }\n\n if (next.redirectUrl) {\n redirect(next.redirectUrl, next);\n return;\n }\n\n if (next.step?.form) {\n renderForm(next.step.form);\n } else if (next.step?.html) {\n renderHtml(next.step.html);\n } else {\n showProblem(labels.unavailable);\n }\n };\n\n const redirect = (url: string, current: JourneySession) => {\n if (options.onRedirect) options.onRedirect(url, current);\n else window.location.assign(url);\n };\n\n const showProblem = (message: string) => {\n const box = el('div', 'oluso-journey__form');\n box.appendChild(el('p', 'oluso-journey__alert oluso-journey__alert--error', message));\n if (canRestart()) {\n const again = el('button', 'oluso-journey__button oluso-journey__button--primary', labels.restart);\n again.type = 'button';\n again.addEventListener('click', () => void begin());\n const row = el('div', 'oluso-journey__actions');\n row.appendChild(again);\n box.appendChild(row);\n }\n root.replaceChildren(box);\n };\n\n const post = async (form: FormData, action?: string) => {\n if (!session) return;\n const next = await client.submitStepForm(session.sessionId, form, action);\n await show(next);\n };\n\n const submitting = (form: HTMLFormElement, busy: boolean) => {\n form.setAttribute('aria-busy', String(busy));\n form.querySelectorAll('button').forEach((b) => ((b as HTMLButtonElement).disabled = busy));\n };\n\n const send = async (form: HTMLFormElement, action: JourneyFormAction | undefined, extra?: Record<string, string>) => {\n const data = action?.postsFields === false ? new FormData() : new FormData(form);\n if (action?.name) data.append(action.name, action.value ?? '');\n if (action?.values) for (const [k, v] of Object.entries(action.values)) data.append(k, v);\n if (extra) for (const [k, v] of Object.entries(extra)) data.set(k, v);\n submitting(form, true);\n try {\n await post(data);\n } catch (error) {\n submitting(form, false);\n const message = fail(error).message;\n let alert = form.querySelector<HTMLElement>('[data-oluso-request-error]');\n if (!alert) {\n alert = el('p', 'oluso-journey__alert oluso-journey__alert--error');\n alert.setAttribute('data-oluso-request-error', '');\n alert.setAttribute('role', 'alert');\n form.prepend(alert);\n }\n alert.textContent = message;\n }\n };\n\n const renderForm = (step: JourneyStepForm) => {\n const form = el('form', 'oluso-journey__form');\n\n if (step.title) form.appendChild(el('h2', 'oluso-journey__title', step.title));\n if (step.description) form.appendChild(el('p', 'oluso-journey__description', step.description));\n if (step.error) {\n const alert = el('p', 'oluso-journey__alert oluso-journey__alert--error', step.error);\n alert.setAttribute('role', 'alert');\n form.appendChild(alert);\n }\n if (step.notice) {\n const notice = el('p', 'oluso-journey__alert oluso-journey__alert--notice', step.notice);\n notice.setAttribute('role', 'status');\n form.appendChild(notice);\n }\n\n const wrappers: Array<{ field: JourneyFormField; wrapper: Element }> = [];\n for (const field of step.fields) {\n const rendered = renderField(field);\n if (!rendered) continue;\n form.appendChild(rendered);\n if (field.showWhen || field.showWhenAll?.length) wrappers.push({ field, wrapper: rendered });\n }\n\n if (step.widget) {\n const widget = renderWidget(step.widget, form);\n if (widget) form.appendChild(widget);\n }\n\n if (step.links.length > 0) {\n const links = el('div', 'oluso-journey__links');\n for (const link of step.links) {\n const a = el('a', undefined, link.label);\n a.href = link.url;\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n links.appendChild(a);\n }\n form.appendChild(links);\n }\n\n if (step.actions.length > 0) {\n const row = el('div', 'oluso-journey__actions');\n // Enter submits the first submit button in the form, so the primary action goes first, out of sight.\n const primary = step.actions.findIndex((a) => a.kind === 'primary');\n if (primary >= 0) {\n const enter = el('button', 'oluso-journey__enter');\n enter.type = 'submit';\n enter.tabIndex = -1;\n enter.setAttribute('aria-hidden', 'true');\n enter.dataset.olusoAction = String(primary);\n form.prepend(enter);\n }\n const described: Element[] = [];\n step.actions.forEach((action, index) => {\n const button = el('button', `oluso-journey__button oluso-journey__button--${action.kind}`, action.label);\n button.type = 'submit';\n button.formNoValidate = action.skipValidation || action.postsFields === false;\n button.dataset.olusoAction = String(index);\n if (action.description) {\n // A described button (a resend link with its prompt, a method with its explanation) gets a line of its own.\n const line = el('p', 'oluso-journey__action-line');\n line.appendChild(el('span', 'oluso-journey__help', action.description));\n line.appendChild(button);\n described.push(line);\n } else {\n row.appendChild(button);\n }\n });\n if (row.childElementCount > 0) form.appendChild(row);\n described.forEach((line) => form.appendChild(line));\n }\n\n const applyConditions = () => {\n for (const { field, wrapper } of wrappers) {\n const conditions = [...(field.showWhen ? [field.showWhen] : []), ...(field.showWhenAll ?? [])];\n const shown = conditions.every((c) => conditionMet(c, currentValues(form.elements.namedItem(c.field))));\n wrapper.hidden = !shown;\n wrapper.querySelectorAll('input, select, textarea').forEach((input) => {\n (input as HTMLInputElement).disabled = !shown || (input as HTMLElement).dataset.olusoReadonly === 'true';\n });\n }\n };\n form.addEventListener('input', (event) => {\n applyConditions();\n const target = event.target as HTMLElement;\n const wrapper = target.closest('.oluso-journey__field');\n wrapper?.querySelectorAll('[aria-invalid=\"true\"]').forEach((n) => n.removeAttribute('aria-invalid'));\n wrapper?.querySelector('.oluso-journey__error')?.remove();\n });\n form.addEventListener('change', applyConditions);\n applyConditions();\n\n form.addEventListener('submit', (event) => {\n event.preventDefault();\n const submitter = (event as SubmitEvent).submitter as HTMLButtonElement | null;\n const index = submitter?.dataset.olusoAction;\n const action = index !== undefined ? step.actions[Number(index)] : step.actions.find((a) => a.kind === 'primary');\n if (action?.confirm && submitter && submitter.dataset.olusoConfirming !== 'true') {\n // Ask inline: the question replaces the button's label until it is clicked again.\n submitter.dataset.olusoConfirming = 'true';\n submitter.textContent = action.confirm;\n submitter.setAttribute('aria-live', 'polite');\n return;\n }\n void send(form, action);\n });\n\n root.replaceChildren(form);\n const focus = form.querySelector<HTMLElement>('[autofocus]')\n ?? form.querySelector<HTMLElement>('input:not([type=hidden]):not([disabled]), select, textarea');\n focus?.focus({ preventScroll: true });\n };\n\n const renderField = (field: JourneyFormField): Element | null => {\n const fieldId = `${id}-${field.name}`;\n\n if (field.type === 'hidden') {\n const input = el('input');\n input.type = 'hidden';\n input.name = field.name;\n input.value = field.value ?? '';\n return input;\n }\n\n const wrapper = el('div', 'oluso-journey__field');\n if (field.group) wrapper.dataset.group = field.group;\n\n if (field.type === 'content') {\n if (field.label) wrapper.appendChild(el('p', 'oluso-journey__label', field.label));\n wrapper.appendChild(el('p', 'oluso-journey__content', field.value ?? ''));\n return wrapper;\n }\n\n const label = () => {\n if (!field.label) return;\n const l = el('label', 'oluso-journey__label', field.label);\n l.htmlFor = fieldId;\n if (field.required) {\n const marker = el('span', 'oluso-journey__required', '*');\n marker.setAttribute('aria-hidden', 'true');\n l.appendChild(marker);\n }\n wrapper.appendChild(l);\n };\n\n const describedBy: string[] = [];\n const common = (input: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) => {\n input.id = fieldId;\n input.name = field.name;\n input.required = field.required;\n if (field.readOnly) {\n if (input instanceof HTMLSelectElement) input.disabled = true;\n else input.readOnly = true;\n input.dataset.olusoReadonly = String(input instanceof HTMLSelectElement);\n }\n if (field.autofocus) input.autofocus = true;\n if (field.autocomplete) input.setAttribute('autocomplete', field.autocomplete);\n if (field.error) input.setAttribute('aria-invalid', 'true');\n };\n\n switch (field.type) {\n case 'textarea': {\n label();\n const input = el('textarea', 'oluso-journey__textarea');\n common(input);\n input.value = field.value ?? '';\n if (field.placeholder) input.placeholder = field.placeholder;\n if (field.rows) input.rows = field.rows;\n if (field.minLength) input.minLength = field.minLength;\n if (field.maxLength) input.maxLength = field.maxLength;\n wrapper.appendChild(input);\n break;\n }\n case 'select': {\n label();\n const input = el('select', 'oluso-journey__select');\n common(input);\n const blank = el('option', undefined, field.placeholder ?? '');\n blank.value = '';\n input.appendChild(blank);\n for (const option of field.options ?? []) {\n const o = el('option', undefined, option.label);\n o.value = option.value;\n o.disabled = option.disabled;\n o.selected = option.value === field.value;\n input.appendChild(o);\n }\n wrapper.appendChild(input);\n break;\n }\n case 'radio': {\n const group = el('fieldset', 'oluso-journey__group');\n if (field.label) {\n const legend = el('legend', 'oluso-journey__label', field.label);\n if (field.required) legend.appendChild(el('span', 'oluso-journey__required', '*'));\n group.appendChild(legend);\n }\n const choices = el('div', 'oluso-journey__choices');\n (field.options ?? []).forEach((option, i) => {\n const choice = el('label', 'oluso-journey__choice');\n const input = el('input');\n input.type = 'radio';\n input.name = field.name;\n input.value = option.value;\n input.id = `${fieldId}-${i}`;\n input.required = field.required;\n input.disabled = option.disabled || field.readOnly;\n input.checked = option.value === field.value;\n const text = el('span', undefined, option.label);\n if (option.description) text.appendChild(el('span', 'oluso-journey__choice-description', option.description));\n choice.append(input, text);\n choices.appendChild(choice);\n });\n group.appendChild(choices);\n wrapper.appendChild(group);\n break;\n }\n case 'checkbox': {\n // A checkbox with a placeholder shows its label above and the placeholder beside the box, as the hosted form does.\n if (field.placeholder) label();\n const choice = el('label', 'oluso-journey__choice');\n const input = el('input');\n input.type = 'checkbox';\n input.value = 'true';\n common(input);\n input.checked = field.value === 'true';\n if (field.readOnly) {\n // Read-only still posts its value (a required consent scope), so it can't be disabled.\n input.setAttribute('aria-readonly', 'true');\n input.addEventListener('click', (e) => e.preventDefault());\n }\n const text = el('span', undefined, field.placeholder ?? field.label ?? '');\n if (!field.placeholder && field.required) text.appendChild(el('span', 'oluso-journey__required', '*'));\n choice.append(input, text);\n wrapper.appendChild(choice);\n break;\n }\n case 'file': {\n label();\n const input = el('input', 'oluso-journey__input');\n input.type = 'file';\n common(input);\n input.readOnly = false;\n input.disabled = field.readOnly;\n if (field.accept) input.accept = field.accept;\n input.multiple = (field.maxFiles ?? 1) > 1;\n input.required = field.required && !field.capture;\n wrapper.appendChild(input);\n if (field.capture && !field.readOnly) {\n const cameraLabel = el('label', 'oluso-journey__hint', labels.takePhoto);\n cameraLabel.htmlFor = `${fieldId}-camera`;\n const camera = el('input', 'oluso-journey__input');\n camera.type = 'file';\n camera.id = `${fieldId}-camera`;\n camera.name = field.name;\n camera.accept = 'image/*';\n camera.setAttribute('capture', field.capture);\n wrapper.append(cameraLabel, camera);\n }\n break;\n }\n case 'tel': {\n label();\n if (field.countries && field.countries.length > 0) {\n const row = el('div', 'oluso-journey__phone');\n const country = el('select', 'oluso-journey__select');\n country.name = `${field.name}__country`;\n country.setAttribute('aria-label', field.label ?? field.name);\n country.disabled = field.readOnly;\n for (const c of field.countries) {\n const o = el('option', undefined, `${c.flag ? c.flag + ' ' : ''}${c.name} (${c.dialCode})`);\n o.value = c.code;\n o.selected = c.code === field.country;\n country.appendChild(o);\n }\n const input = el('input', 'oluso-journey__input');\n input.type = 'tel';\n input.inputMode = 'tel';\n common(input);\n input.value = field.value ?? '';\n if (field.placeholder) input.placeholder = field.placeholder;\n row.append(country, input);\n wrapper.appendChild(row);\n } else {\n const input = textInput(field, 'tel');\n common(input);\n wrapper.appendChild(input);\n }\n break;\n }\n case 'otp': {\n label();\n const input = el('input', 'oluso-journey__input oluso-journey__input--otp');\n input.type = 'text';\n input.inputMode = 'numeric';\n common(input);\n input.setAttribute('autocomplete', field.autocomplete ?? 'one-time-code');\n if (field.maxLength) {\n input.maxLength = field.maxLength;\n input.minLength = field.minLength ?? field.maxLength;\n }\n input.pattern = field.pattern ?? '[0-9]*';\n input.value = field.value ?? '';\n wrapper.appendChild(input);\n break;\n }\n default: {\n label();\n const known = ['text', 'email', 'password', 'number', 'date', 'url', 'tel'];\n const input = textInput(field, known.includes(field.type) ? field.type : 'text');\n common(input);\n wrapper.appendChild(input);\n }\n }\n\n if (field.description) {\n const help = el('p', 'oluso-journey__help', field.description);\n help.id = `${fieldId}-help`;\n describedBy.push(help.id);\n wrapper.appendChild(help);\n }\n if (field.hint) {\n const hint = el('p', 'oluso-journey__hint', field.hint);\n hint.id = `${fieldId}-hint`;\n describedBy.push(hint.id);\n wrapper.appendChild(hint);\n }\n if (field.error) {\n const error = el('p', 'oluso-journey__error', field.error);\n error.id = `${fieldId}-error`;\n describedBy.push(error.id);\n wrapper.appendChild(error);\n }\n if (describedBy.length > 0) {\n Array.from(wrapper.querySelectorAll('[id]')).find((n) => n.id === fieldId)?.setAttribute('aria-describedby', describedBy.join(' '));\n }\n return wrapper;\n };\n\n const textInput = (field: JourneyFormField, type: string) => {\n const input = el('input', 'oluso-journey__input');\n input.type = type;\n input.value = field.value ?? '';\n if (field.placeholder) input.placeholder = field.placeholder;\n if (field.pattern) input.pattern = field.pattern;\n if (field.patternError) {\n input.title = field.patternError;\n input.addEventListener('invalid', () => {\n if (input.validity.patternMismatch) input.setCustomValidity(field.patternError!);\n });\n input.addEventListener('input', () => input.setCustomValidity(''));\n }\n if (field.minLength) input.minLength = field.minLength;\n if (field.maxLength) input.maxLength = field.maxLength;\n if (field.min) input.min = field.min;\n if (field.max) input.max = field.max;\n if (type === 'number') input.step = 'any';\n return input;\n };\n\n const renderWidget = (widget: JourneyFormWidget, form: HTMLFormElement): Element | null => {\n const data = (widget.data ?? {}) as Record<string, unknown>;\n const box = el('div', 'oluso-journey__widget');\n\n const result = (value: string) => {\n if (!widget.resultField) return;\n let input = Array.from(form.querySelectorAll<HTMLInputElement>('input[type=hidden]')).find((n) => n.name === widget.resultField) ?? null;\n if (!input) {\n input = el('input');\n input.type = 'hidden';\n input.name = widget.resultField;\n form.appendChild(input);\n }\n input.value = value;\n };\n\n switch (widget.type) {\n case 'webauthn_get':\n case 'webauthn_create': {\n const run = el('button', 'oluso-journey__button oluso-journey__button--primary', widget.submit?.label ?? labels.passkey);\n run.type = 'button';\n const go = async () => {\n run.disabled = true;\n try {\n const options = await webAuthnOptions(data);\n const publicKey = options.publicKey;\n let extra = options.extra;\n const credential = widget.type === 'webauthn_get' ? await getAssertion(publicKey) : await createCredential(publicKey);\n result(credential);\n const naming = data.credentialName as { field?: string; platform?: string; crossPlatform?: string; other?: string } | undefined;\n if (naming?.field) {\n const attachment = (JSON.parse(credential) as { authenticatorAttachment?: string | null }).authenticatorAttachment;\n const name = attachment === 'platform' ? naming.platform : attachment === 'cross-platform' ? naming.crossPlatform : naming.other;\n (extra ??= {})[naming.field] = name ?? '';\n }\n await send(form, widget.submit, extra);\n } catch (error) {\n run.disabled = false;\n run.textContent = labels.retry;\n options.onError?.(error instanceof Error ? error : new Error(String(error)), session);\n }\n };\n run.addEventListener('click', () => void go());\n box.appendChild(run);\n if (typeof PublicKeyCredential !== 'undefined') queueMicrotask(() => void go());\n return box;\n }\n case 'verification_connect': {\n // A verification provider's own widget runs in the page; its outcome comes back as the step's callback.\n const options = (data.options ?? {}) as Record<string, unknown>;\n const reference = typeof data.referenceOption === 'string' ? options[data.referenceOption] : undefined;\n const field = typeof data.referenceField === 'string' ? data.referenceField : 'reference_id';\n const callback = async (withReference: boolean) => {\n const values = new FormData();\n if (withReference) values.set(field, reference == null ? '' : String(reference));\n submitting(form, true);\n try {\n await post(values, 'callback');\n } catch (error) {\n submitting(form, false);\n fail(error);\n }\n };\n const start = async () => {\n await loadScript(String(data.scriptUrl));\n const Ctor = (window as unknown as Record<string, unknown>)[typeof data.global === 'string' ? data.global : 'Connect'] as\n | (new (o: Record<string, unknown>) => { setup?: () => void; open: () => void })\n | undefined;\n if (!Ctor) throw new Error('The verification widget could not be loaded');\n const connect = new Ctor({\n ...options,\n onSuccess: () => void callback(true),\n onError: () => void callback(false),\n onClose: () => undefined,\n });\n connect.setup?.();\n connect.open();\n return connect;\n };\n let instance: Promise<{ open: () => void }> | undefined;\n const open = () => {\n if (instance) {\n void instance.then((c) => c.open());\n return;\n }\n instance = start();\n instance.catch((error) => {\n instance = undefined;\n fail(error);\n });\n };\n if (widget.submit) {\n const button = el('button', `oluso-journey__button oluso-journey__button--${widget.submit.kind}`, widget.submit.label);\n button.type = 'button';\n button.addEventListener('click', open);\n box.appendChild(button);\n }\n open();\n return box;\n }\n case 'captcha': {\n const target = el('div', 'oluso-journey__captcha');\n box.appendChild(target);\n void renderCaptcha(target, data, (token) => {\n result(token);\n if (widget.submit) void send(form, widget.submit);\n }).catch((error) => options.onError?.(error instanceof Error ? error : new Error(String(error)), session));\n return box;\n }\n case 'qr': {\n const qr = el('div', 'oluso-journey__qr');\n if (typeof data.image === 'string') {\n const img = el('img');\n img.src = data.image;\n img.alt = '';\n qr.appendChild(img);\n }\n if (typeof data.secret === 'string') {\n if (typeof data.secretLabel === 'string') qr.appendChild(el('span', 'oluso-journey__help', data.secretLabel));\n qr.appendChild(el('code', 'oluso-journey__code', data.secret));\n }\n else if (typeof data.value === 'string' && typeof data.image !== 'string') qr.appendChild(el('code', 'oluso-journey__code', data.value));\n box.appendChild(qr);\n return box;\n }\n case 'codes': {\n const codes = Array.isArray(data.codes) ? data.codes.map(String) : [];\n const list = el('ul', 'oluso-journey__codes');\n codes.forEach((c) => list.appendChild(el('li', undefined, c)));\n const copy = el('button', 'oluso-journey__button', labels.copy);\n copy.type = 'button';\n copy.addEventListener('click', () => {\n void navigator.clipboard?.writeText(codes.join('\\n')).then(() => (copy.textContent = labels.copied));\n });\n box.append(list, copy);\n return box;\n }\n case 'poll': {\n const seconds = Math.max(2, Number(data.intervalSeconds) || 5);\n const stopAt = Number(data.maxSeconds) > 0 ? Date.now() + Number(data.maxSeconds) * 1000 : Infinity;\n const rendered = session?.currentStep;\n timers.push(window.setInterval(() => {\n if (Date.now() > stopAt) {\n clearTimers();\n return;\n }\n if (!session || document.hidden) return;\n void client.getSession(session.sessionId).then(async (now) => {\n if (now.status !== 'in_progress' || now.currentStep !== rendered) {\n clearTimers();\n await post(new FormData(), 'init');\n }\n }).catch(() => undefined);\n }, seconds * 1000));\n return null;\n }\n default:\n return null;\n }\n };\n\n const webAuthnOptions = async (data: Record<string, unknown>) => {\n if (data.publicKey) return { publicKey: data.publicKey as Record<string, unknown>, extra: undefined };\n const url = String(data.optionsUrl);\n const absolute = /^https?:/i.test(url) ? url : `${client.serverUrl}${url.startsWith('/') ? '' : '/'}${url}`;\n const method = String(data.optionsMethod ?? 'POST').toUpperCase();\n const response = await fetch(absolute, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: method === 'GET' ? undefined : JSON.stringify(data.optionsBody ?? {}),\n credentials: 'include',\n });\n if (!response.ok) throw new Error(labels.failed);\n const json = (await response.json()) as Record<string, unknown>;\n const extra: Record<string, string> = {};\n if (typeof data.idProperty === 'string' && typeof data.idField === 'string' && json[data.idProperty] != null) {\n extra[data.idField] = String(json[data.idProperty]);\n }\n return { publicKey: (json.options ?? json) as Record<string, unknown>, extra };\n };\n\n const renderHtml = (html: string) => {\n const wrapper = el('div', 'oluso-journey__html');\n wrapper.innerHTML = html;\n wrapper.querySelectorAll('script').forEach((s) => s.remove());\n wrapper.addEventListener('submit', (event) => {\n const form = event.target as HTMLFormElement;\n event.preventDefault();\n const submitter = (event as SubmitEvent).submitter as HTMLButtonElement | null;\n const data = new FormData(form);\n if (submitter?.name) data.append(submitter.name, submitter.value);\n data.delete('__RequestVerificationToken');\n submitting(form, true);\n post(data).catch((error) => {\n submitting(form, false);\n fail(error);\n });\n });\n root.replaceChildren(wrapper);\n };\n\n void (options.session ? show(options.session) : begin());\n\n return {\n get session() {\n return session;\n },\n restart: begin,\n destroy() {\n destroyed = true;\n clearTimers();\n root.remove();\n },\n };\n}\n\nfunction currentValues(item: unknown): string[] {\n if (!item) return [];\n const inputs = item instanceof RadioNodeList ? Array.from(item) : [item];\n return inputs.flatMap((node) => {\n const input = node as HTMLInputElement;\n if (input.disabled) return [];\n if (input.type === 'checkbox' || input.type === 'radio') return input.checked ? [input.value] : [];\n if (input instanceof HTMLSelectElement && input.multiple) return Array.from(input.selectedOptions).map((o) => o.value);\n return [input.value];\n });\n}\n\nconst loadedScripts = new Map<string, Promise<void>>();\n\nfunction loadScript(src: string): Promise<void> {\n let loading = loadedScripts.get(src);\n if (!loading) {\n loading = new Promise<void>((resolve, reject) => {\n const tag = document.createElement('script');\n tag.src = src;\n tag.async = true;\n tag.onload = () => resolve();\n tag.onerror = () => {\n loadedScripts.delete(src);\n reject(new Error('A script the step needs could not be loaded'));\n };\n document.head.appendChild(tag);\n });\n loadedScripts.set(src, loading);\n }\n return loading;\n}\n\nconst CAPTCHA_SCRIPTS: Record<string, { src: string; global: string }> = {\n recaptcha: { src: 'https://www.google.com/recaptcha/api.js?render=explicit&onload=', global: 'grecaptcha' },\n hcaptcha: { src: 'https://js.hcaptcha.com/1/api.js?render=explicit&onload=', global: 'hcaptcha' },\n turnstile: { src: 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=', global: 'turnstile' },\n};\n\ntype CaptchaApi = {\n render: (el: HTMLElement, options: Record<string, unknown>) => unknown;\n ready?: (cb: () => void) => void;\n execute?: (siteKey: string, options: { action: string }) => Promise<string>;\n};\n\nasync function renderCaptcha(target: HTMLElement, data: Record<string, unknown>, done: (token: string) => void): Promise<void> {\n const provider = String(data.provider ?? 'recaptcha').toLowerCase();\n const script = CAPTCHA_SCRIPTS[provider];\n if (!script) throw new Error(`Captcha provider '${provider}' isn't supported`);\n const w = window as unknown as Record<string, unknown>;\n if (!w[script.global]) {\n const callback = `__olusoCaptcha${Date.now()}`;\n await new Promise<void>((resolve, reject) => {\n w[callback] = () => resolve();\n const tag = document.createElement('script');\n tag.src = script.src + callback + (data.language ? `&hl=${encodeURIComponent(String(data.language))}` : '');\n tag.async = true;\n tag.onerror = () => reject(new Error('The captcha could not be loaded'));\n document.head.appendChild(tag);\n });\n }\n const api = w[script.global] as CaptchaApi;\n const siteKey = String(data.siteKey ?? '');\n if (provider === 'recaptcha' && data.version === 'v3' && api.execute) {\n api.ready?.(() => void api.execute!(siteKey, { action: String(data.action ?? 'submit') }).then(done));\n return;\n }\n api.render(target, {\n sitekey: siteKey,\n theme: data.theme,\n size: data.size,\n action: data.action,\n callback: (token: string) => done(token),\n });\n}\n"],"mappings":"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","names":["embed_exports","__export","close","destroy","init","mount","open","OlusoClient","config","slug","data","options","result","error","session","auth","sessionId","action","form","params","event","listener","path","url","method","isForm","headers","response","OlusoError","message","status","code","fieldErrors","ALIASES","normalizeOperator","op","same","a","b","order","actual","expected","e","ad","ed","compare","lower","want","o","expectedList","trimmed","parsed","v","truthy","conditionMet","condition","values","present","members","p","list","m","JOURNEY_STYLES","injected","injectJourneyStyles","style","base64UrlToBuffer","value","base64","padded","binary","bytes","i","bufferToBase64Url","buffer","credentialDescriptors","list","c","requestOptions","publicKey","creationOptions","user","getAssertion","credential","response","createCredential","DEFAULT_LABELS","el","tag","className","text","node","uid","mountJourney","container","options","labels","client","id","session","destroyed","timers","injectJourneyStyles","root","clearTimers","t","status","fail","error","err","canRestart","begin","started","show","showProblem","next","redirect","done","message","renderForm","renderHtml","url","current","box","again","row","post","form","action","submitting","busy","b","send","extra","data","k","v","alert","step","notice","wrappers","field","rendered","renderField","widget","renderWidget","links","link","a","primary","enter","described","index","button","line","applyConditions","wrapper","shown","c","conditionMet","currentValues","input","event","n","submitter","fieldId","label","l","marker","describedBy","common","blank","option","o","group","legend","choices","i","choice","e","cameraLabel","camera","country","textInput","help","hint","type","result","value","run","go","webAuthnOptions","publicKey","credential","getAssertion","createCredential","naming","attachment","name","reference","callback","withReference","values","start","loadScript","Ctor","connect","instance","open","target","renderCaptcha","token","qr","img","codes","list","copy","seconds","stopAt","now","absolute","method","response","json","html","s","item","loadedScripts","src","loading","resolve","reject","CAPTCHA_SCRIPTS","provider","script","w","api","siteKey","STYLES","baseConfig","journeyConfigs","modalElement","activeJourney","activeMount","inlineMounts","styleElement","injectStyles","resolveTheme","config","resolveConfig","journeyOrConfig","registered","first","clientFor","OlusoClient","text","tag","className","value","node","createModal","theme","overlay","modal","closeButton","close","body","journeyHost","success","e","showSuccess","message","icon","detail","cta","startJourney","host","onDone","mountJourney","session","error","mount","target","err","done","open","init","id","journeyConfig","destroy","m","autoInit","el","serverUrl","tenant","journey","btnText","accent","btn","OlusoEmbed"]}
|