@appfunnel-dev/sdk 2.0.0-canary.1 → 2.0.0-canary.2

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 (43) hide show
  1. package/dist/capabilities-7_hy5f5G.d.cts +114 -0
  2. package/dist/capabilities-7_hy5f5G.d.ts +114 -0
  3. package/dist/checkout-CZmEvWfC.d.cts +317 -0
  4. package/dist/checkout-DiQvRT5q.d.ts +317 -0
  5. package/dist/chunk-7UC5VXOR.js +446 -0
  6. package/dist/chunk-7UC5VXOR.js.map +1 -0
  7. package/dist/chunk-LJYLGLFS.cjs +153 -0
  8. package/dist/chunk-LJYLGLFS.cjs.map +1 -0
  9. package/dist/chunk-UIR6TGEW.js +97 -0
  10. package/dist/chunk-UIR6TGEW.js.map +1 -0
  11. package/dist/chunk-VQOD2Z6Q.cjs +104 -0
  12. package/dist/chunk-VQOD2Z6Q.cjs.map +1 -0
  13. package/dist/chunk-YY375F2B.js +140 -0
  14. package/dist/chunk-YY375F2B.js.map +1 -0
  15. package/dist/chunk-Z3TWO2PW.cjs +475 -0
  16. package/dist/chunk-Z3TWO2PW.cjs.map +1 -0
  17. package/dist/driver-paddle.cjs +814 -0
  18. package/dist/driver-paddle.cjs.map +1 -0
  19. package/dist/driver-paddle.d.cts +10 -0
  20. package/dist/driver-paddle.d.ts +10 -0
  21. package/dist/driver-paddle.js +811 -0
  22. package/dist/driver-paddle.js.map +1 -0
  23. package/dist/driver-stripe.cjs +2253 -0
  24. package/dist/driver-stripe.cjs.map +1 -0
  25. package/dist/driver-stripe.d.cts +8 -0
  26. package/dist/driver-stripe.d.ts +8 -0
  27. package/dist/driver-stripe.js +2247 -0
  28. package/dist/driver-stripe.js.map +1 -0
  29. package/dist/index.cjs +1949 -811
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +175 -933
  32. package/dist/index.d.ts +175 -933
  33. package/dist/index.js +1669 -652
  34. package/dist/index.js.map +1 -1
  35. package/dist/manifest-DQThneiG.d.cts +777 -0
  36. package/dist/manifest-DQThneiG.d.ts +777 -0
  37. package/dist/manifest-entry.cjs +203 -0
  38. package/dist/manifest-entry.cjs.map +1 -0
  39. package/dist/manifest-entry.d.cts +184 -0
  40. package/dist/manifest-entry.d.ts +184 -0
  41. package/dist/manifest-entry.js +98 -0
  42. package/dist/manifest-entry.js.map +1 -0
  43. package/package.json +37 -4
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/state/variableStore.ts","../src/state/store.ts","../src/state/context.ts","../src/tracking/tracking.ts","../src/tracking/bus.ts","../src/i18n/translation.ts","../src/commerce/catalog.ts","../src/flow/spine.ts","../src/flow/experiments.ts","../src/flow/flow.tsx","../src/modals/registry.tsx","../src/modals/sheet.tsx","../src/commerce/checkout.tsx","../src/toast/toast.tsx","../src/state/namespaces.ts","../src/flow/components.tsx","../src/tracking/catalog.ts","../src/embed/script.tsx","../src/manifest/manifest.ts"],"names":["base","createContext","createElement","useContext","useMemo","useState","page","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import type { VariableValue } from '../types'\n\n/**\n * External variable store for funnel variables — the flat, reactive key/value\n * store under the v2 namespaces. Components subscribe selectively via\n * `useSyncExternalStore`, so only components depending on changed keys re-render.\n * (Seeding lives in {@link ./store}.`createFunnelStore`.)\n */\ninterface ScopedListener {\n listener: () => void\n /** Exact keys to watch, or null for all changes */\n keys: string[] | null\n /** Prefix to watch (e.g. 'answers.'), or null for all */\n prefix: string | null\n}\n\nexport class VariableStore {\n private state: Record<string, VariableValue>\n private listeners = new Set<ScopedListener>()\n /** Tracks which keys changed in the last mutation — used by scoped notify */\n private changedKeys: string[] = []\n\n constructor(initial: Record<string, VariableValue>) {\n this.state = { ...initial }\n }\n\n getState(): Record<string, VariableValue> {\n return this.state\n }\n\n get(key: string): VariableValue {\n return this.state[key]\n }\n\n set(key: string, value: VariableValue): void {\n if (this.state[key] === value) return\n this.state = { ...this.state, [key]: value }\n this.changedKeys = [key]\n this.notify()\n }\n\n setState(updater: (prev: Record<string, VariableValue>) => Record<string, VariableValue>): void {\n const prev = this.state\n const next = updater(prev)\n if (next === prev) return\n this.state = next\n // Compute changed keys\n this.changedKeys = []\n for (const key of Object.keys(next)) {\n if (next[key] !== prev[key]) this.changedKeys.push(key)\n }\n for (const key of Object.keys(prev)) {\n if (!(key in next) && prev[key] !== undefined) this.changedKeys.push(key)\n }\n this.notify()\n }\n\n /** Batch set multiple variables at once */\n setMany(updates: Record<string, VariableValue>): void {\n const changed: string[] = []\n const next = { ...this.state }\n for (const [key, value] of Object.entries(updates)) {\n if (next[key] !== value) {\n next[key] = value\n changed.push(key)\n }\n }\n if (changed.length === 0) return\n this.state = next\n this.changedKeys = changed\n this.notify()\n }\n\n /**\n * Subscribe to store changes.\n *\n * @param listener - callback fired when relevant keys change\n * @param scope - optional scope to limit notifications:\n * - `{ keys: ['data.x', 'user.email'] }` — only fire when these exact keys change\n * - `{ prefix: 'answers.' }` — only fire when any key starting with this prefix changes\n * - omit or `{}` — fire on every change (global listener)\n */\n subscribe(\n listener: () => void,\n scope?: { keys?: string[]; prefix?: string },\n ): () => void {\n const entry: ScopedListener = {\n listener,\n keys: scope?.keys || null,\n prefix: scope?.prefix || null,\n }\n this.listeners.add(entry)\n return () => this.listeners.delete(entry)\n }\n\n private notify(): void {\n const changed = this.changedKeys\n for (const entry of this.listeners) {\n // Global listener — no scope\n if (!entry.keys && !entry.prefix) {\n entry.listener()\n continue\n }\n // Key-scoped listener\n if (entry.keys) {\n if (changed.some((k) => entry.keys!.includes(k))) {\n entry.listener()\n }\n continue\n }\n // Prefix-scoped listener\n if (entry.prefix) {\n if (changed.some((k) => k.startsWith(entry.prefix!))) {\n entry.listener()\n }\n }\n }\n }\n}\n","/**\n * v2 store seeding — builds a {@link VariableStore} holding only the **writable**\n * namespaces (`user` / `responses` / `data`), each persisted to the backend.\n *\n * Seeds the {@link VariableStore} with v2 prefixes (no legacy `answers.`/`query.`\n * aliasing). Read-only computed values do NOT live\n * here — see {@link ./context}. Three deliberate namespaces:\n *\n * - `user.*` persistent identity attributes (cross-session)\n * - `responses.*` the clean, aggregated funnel answers\n * - `data.*` working/scratch state — persisted (so reload + return survive)\n * but kept separate from responses so analytics aggregates only\n * real answers and `data` can hold intermediate garbage\n */\n\nimport type { VariableValue, VariableConfig } from '../types'\nimport { VariableStore } from './variableStore'\n\n/** v2 namespace → store-key prefix (sans trailing dot). 1:1, no legacy aliasing. */\nexport const NAMESPACE_PREFIX = {\n user: 'user',\n responses: 'responses',\n data: 'data',\n} as const\n\nexport type WritableNamespace = keyof typeof NAMESPACE_PREFIX\n\n/** Built-in user attributes — always present so reads never `undefined`. */\nconst BUILTIN_USER: Record<string, VariableValue> = {\n 'user.email': '',\n 'user.name': '',\n}\n\nexport interface FunnelStoreConfig {\n responses?: Record<string, VariableConfig>\n data?: Record<string, VariableConfig>\n}\n\nfunction defaultFor(type: string): VariableValue {\n switch (type) {\n case 'string': return ''\n case 'number': return 0\n case 'boolean': return false\n case 'stringArray': return []\n default: return ''\n }\n}\n\n/**\n * Seed a store from a funnel's declared `responses`/`data` defaults, then layer\n * server / session-restored values on top (highest priority).\n */\nexport function createFunnelStore(\n config: FunnelStoreConfig = {},\n sessionValues?: Record<string, VariableValue>,\n): VariableStore {\n const initial: Record<string, VariableValue> = { ...BUILTIN_USER }\n\n for (const [key, cfg] of Object.entries(config.responses ?? {})) {\n initial[`responses.${key}`] = cfg.default ?? defaultFor(cfg.type)\n }\n for (const [key, cfg] of Object.entries(config.data ?? {})) {\n initial[`data.${key}`] = cfg.default ?? defaultFor(cfg.type)\n }\n\n if (sessionValues) {\n for (const [key, value] of Object.entries(sessionValues)) {\n if (value !== undefined) initial[key] = value\n }\n }\n\n return new VariableStore(initial)\n}\n","/**\n * v2 `context` — the **read-only, computed** namespace.\n *\n * Everything the funnel can *read* but never *write*: the device, the visitor's\n * locale, the current page, acquisition params (UTM), the session, and system\n * facts (funnel id, test/live mode, clock). It supersedes the v0 flat\n * `page.*`/`device.*`/`browser.*`/`os.*`/`query.*`/`metadata.*` system variables\n * (see {@link ./systemVariables}) by folding them into one nested object.\n *\n * Why it's *not* in the {@link ./variableStore}: the store holds **writable**\n * state (`user`/`responses`/`data`) that persists + re-renders per key. Context\n * is derived and read-only, so it lives as a plain object on a React context —\n * no subscriptions, no churn. The one moving part (`page`) is merged into the\n * snapshot from navigation state at read time.\n *\n * Authors read it through hooks (`useDevice()`, `useLocale()`, `usePage()`,\n * `useUtm()`) or inside routing/condition predicates as `s.context.*`.\n */\n\n// ── Shape ────────────────────────────────────────────────\n\nexport interface DeviceContext {\n type: 'mobile' | 'tablet' | 'desktop'\n isMobile: boolean\n isTablet: boolean\n screenWidth: number\n screenHeight: number\n viewportWidth: number\n viewportHeight: number\n colorDepth: number\n pixelRatio: number\n}\n\nexport interface BrowserContext {\n name: string\n version: string\n userAgent: string\n language: string\n cookieEnabled: boolean\n online: boolean\n}\n\nexport interface OsContext {\n name: string\n timezone: string\n}\n\nexport interface LocaleContext {\n /** Full locale, e.g. `en-US`. */\n locale: string\n /** Language subtag, e.g. `en`. */\n language: string\n /** Region subtag, e.g. `US` (may be empty). */\n region: string\n /** IANA timezone, e.g. `America/New_York`. */\n timeZone: string\n}\n\nexport interface PageContext {\n /** Current page key. */\n key: string\n /** Current page URL slug (`meta.slug`, defaults to the key) — what the renderer puts in the path. */\n slug: string\n /** 0-based position in the visited history. */\n index: number\n /** Total pages in the (expected) flow. */\n total: number\n /** 0–100. */\n progressPercentage: number\n /** Epoch ms the current page was entered. */\n startedAt: number\n}\n\n/** Acquisition / ad params captured on entry (the old `query.*` utm slice). */\nexport interface UtmContext {\n source?: string\n medium?: string\n campaign?: string\n content?: string\n term?: string\n [key: string]: string | undefined\n}\n\n/**\n * Per-network ad **click-ids** captured from the entry URL — the matching signals\n * the server CAPI needs. Named per network (not a generic bag) so the platform +\n * each integration map them precisely; `[key]` catches any others.\n */\nexport interface ClickIdContext {\n /** Meta / Facebook */\n fbclid?: string\n /** Google Ads (+ gbraid/wbraid for app↔web) */\n gclid?: string\n gbraid?: string\n wbraid?: string\n /** Microsoft / Bing */\n msclkid?: string\n /** TikTok */\n ttclid?: string\n /** Twitter / X */\n twclid?: string\n /** Snapchat */\n sccid?: string\n /** LinkedIn */\n li_fat_id?: string\n /** Pinterest */\n epik?: string\n /** Reddit */\n rdt_cid?: string\n [key: string]: string | undefined\n}\n\n/**\n * The full acquisition snapshot captured once on entry — the funnel reads `utm` /\n * `clickIds` off {@link FunnelContext}; the SDK forwards this whole thing to the\n * tracker (`setAcquisition`) so the platform persists it **first-class**: per-visit\n * on the session + **first-touch (write-once) on the Customer**, and the click-ids /\n * `_fbp`/`_fbc` cookies feed CAPI. Not stored as a generic attribute/answer.\n */\nexport interface Acquisition {\n utm: UtmContext\n clickIds: ClickIdContext\n /** CAPI cookies (`_fbp`/`_fbc`) read from `document.cookie` (not funnel-readable). */\n cookies: { fbp?: string; fbc?: string }\n /** `document.referrer` at entry. */\n referrer: string\n /** Entry URL path (the landing page). */\n landingPath: string\n}\n\nexport interface SessionContext {\n /** Server session id; null until resolved. */\n id: string | null\n /** Epoch ms the session began. */\n startedAt: number\n /** `document.referrer` at entry. */\n referrer: string\n}\n\n/**\n * Durable identity for **stable experiment bucketing** (phase-4 §4.2). The\n * preferred seed is `customerId` once known; before identification it's the\n * signed anonymous `visitorId` (P1). It is deliberately **not** the session id or\n * fingerprint — a returning visitor (e.g. via winback) must keep their variant\n * across sessions/devices (landmine #4). Both null = unidentifiable traffic, and\n * the experiment layer falls back to control rather than bucket on nothing.\n */\nexport interface IdentityContext {\n /** Known customer id (post-identification). The preferred bucketing seed. */\n customerId: string | null\n /** Signed anonymous visitor id. The fallback bucketing seed. */\n visitorId: string | null\n}\n\nexport interface SystemContext {\n funnelId: string\n campaignId: string\n /** Render mode — `test` for preview/QA, `live` for public traffic. */\n mode: 'test' | 'live'\n /** Epoch ms captured at build time (stable per render, not a live clock). */\n now: number\n}\n\n/** The whole read-only computed namespace, as read in predicates: `s.context.*`. */\nexport interface FunnelContext {\n device: DeviceContext\n browser: BrowserContext\n os: OsContext\n locale: LocaleContext\n page: PageContext\n utm: UtmContext\n /** Per-network ad click-ids captured on entry (funnel-readable; also forwarded for CAPI). */\n clickIds: ClickIdContext\n session: SessionContext\n identity: IdentityContext\n system: SystemContext\n}\n\n// ── Detection ────────────────────────────────────────────\n\ninterface RawBrowser {\n device: DeviceContext\n browser: BrowserContext\n os: OsContext\n locale: LocaleContext\n}\n\nlet cached: RawBrowser | null = null\n\nfunction extractVersion(ua: string, regex: RegExp): string {\n return ua.match(regex)?.[1] ?? '0'\n}\n\n/**\n * Sniff device/browser/os/locale from the environment, once. SSR-safe: returns\n * neutral defaults when `window` is absent. (Self-contained v2 detector — the v0\n * {@link ./systemVariables} equivalent emits flat store keys; this returns the\n * nested shape.)\n */\nfunction detect(): RawBrowser {\n if (cached) return cached\n\n if (typeof window === 'undefined') {\n cached = {\n device: {\n type: 'desktop', isMobile: false, isTablet: false,\n screenWidth: 0, screenHeight: 0, viewportWidth: 0, viewportHeight: 0,\n colorDepth: 24, pixelRatio: 1,\n },\n browser: {\n name: 'Unknown', version: '0', userAgent: 'unknown',\n language: 'en', cookieEnabled: true, online: true,\n },\n os: { name: 'Unknown', timezone: 'UTC' },\n locale: { locale: 'en', language: 'en', region: '', timeZone: 'UTC' },\n }\n return cached\n }\n\n const ua = navigator.userAgent\n const l = ua.toLowerCase()\n\n let name = 'Unknown'\n let version = '0'\n if (l.includes('firefox')) { name = 'Firefox'; version = extractVersion(ua, /Firefox\\/(\\d+[\\d.]*)/) }\n else if (l.includes('edg')) { name = 'Edge'; version = extractVersion(ua, /Edg\\/(\\d+[\\d.]*)/) }\n else if (l.includes('chrome') && !l.includes('edg')) { name = 'Chrome'; version = extractVersion(ua, /Chrome\\/(\\d+[\\d.]*)/) }\n else if (l.includes('safari') && !l.includes('chrome')) { name = 'Safari'; version = extractVersion(ua, /Version\\/(\\d+[\\d.]*)/) }\n\n let osName = 'Unknown'\n if (l.includes('win')) osName = 'Windows'\n else if (l.includes('mac')) osName = 'macOS'\n else if (l.includes('linux') && !l.includes('android')) osName = 'Linux'\n else if (l.includes('android')) osName = 'Android'\n else if (/iphone|ipad|ipod/.test(l)) osName = 'iOS'\n\n let type: DeviceContext['type'] = 'desktop'\n if (/mobile|android(?!.*tablet)|iphone|ipod/.test(l)) type = 'mobile'\n else if (/tablet|ipad/.test(l)) type = 'tablet'\n\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'\n const fullLocale = navigator.language || 'en'\n const [language = 'en', region = ''] = fullLocale.split('-')\n\n cached = {\n device: {\n type, isMobile: type === 'mobile', isTablet: type === 'tablet',\n screenWidth: window.screen?.width || 0,\n screenHeight: window.screen?.height || 0,\n viewportWidth: window.innerWidth || 0,\n viewportHeight: window.innerHeight || 0,\n colorDepth: window.screen?.colorDepth || 24,\n pixelRatio: window.devicePixelRatio || 1,\n },\n browser: {\n name, version, userAgent: ua,\n language: fullLocale,\n cookieEnabled: navigator.cookieEnabled ?? true,\n online: navigator.onLine ?? true,\n },\n os: { name: osName, timezone: timeZone },\n locale: { locale: fullLocale, language, region, timeZone },\n }\n return cached\n}\n\n/** Collect `utm_*` params (and any extras) from the URL. SSR-safe. */\nfunction collectUtm(): UtmContext {\n if (typeof window === 'undefined') return {}\n const out: UtmContext = {}\n const params = new URLSearchParams(window.location.search)\n params.forEach((value, key) => {\n if (key.startsWith('utm_')) out[key.slice(4)] = value\n })\n return out\n}\n\n/** Known ad-network click-id params. Any present in the URL is captured. */\nconst CLICK_ID_PARAMS = [\n 'fbclid', 'gclid', 'gbraid', 'wbraid', 'msclkid', 'ttclid',\n 'twclid', 'sccid', 'li_fat_id', 'epik', 'rdt_cid', 'dclid', 'irclickid',\n]\n\n/** Collect ad-network click-ids from the entry URL. SSR-safe. */\nfunction collectClickIds(): ClickIdContext {\n if (typeof window === 'undefined') return {}\n const out: ClickIdContext = {}\n const params = new URLSearchParams(window.location.search)\n for (const key of CLICK_ID_PARAMS) {\n const v = params.get(key)\n if (v) out[key] = v\n }\n return out\n}\n\n/** Read a cookie value by name. SSR-safe. */\nfunction readCookie(name: string): string | undefined {\n if (typeof document === 'undefined') return undefined\n const m = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'))\n return m ? decodeURIComponent(m[1]) : undefined\n}\n\n/**\n * Assemble the full {@link Acquisition} snapshot from the context + `document`\n * (cookies, referrer, path) — captured once on entry, forwarded to the tracker for\n * first-class persistence (session + first-touch Customer) + CAPI.\n */\nexport function buildAcquisition(context: FunnelContext): Acquisition {\n return {\n utm: context.utm,\n clickIds: context.clickIds,\n cookies: { fbp: readCookie('_fbp'), fbc: readCookie('_fbc') },\n referrer: context.session.referrer,\n landingPath: typeof window !== 'undefined' ? window.location.pathname : '',\n }\n}\n\nexport interface BuildContextOptions {\n funnelId?: string\n campaignId?: string\n mode?: 'test' | 'live'\n /** Stable build-time clock (avoids `Date.now()` churn in renders/tests). */\n now?: number\n sessionId?: string | null\n /** Known customer id — the preferred stable bucketing seed (phase-4 §4.2). */\n customerId?: string | null\n /** Signed anonymous visitor id — the fallback bucketing seed. */\n visitorId?: string | null\n /** Overrides for any slice — used by the server to hydrate `utm`/`session`. */\n overrides?: Partial<FunnelContext>\n}\n\n/**\n * Build the read-only {@link FunnelContext} once, at mount. `page` starts at the\n * first page and is replaced per navigation when assembling a snapshot.\n */\nexport function buildContext(opts: BuildContextOptions = {}): FunnelContext {\n const raw = detect()\n const now = opts.now ?? 0\n const referrer = typeof document !== 'undefined' ? document.referrer : ''\n\n const base: FunnelContext = {\n device: raw.device,\n browser: raw.browser,\n os: raw.os,\n locale: raw.locale,\n utm: collectUtm(),\n clickIds: collectClickIds(),\n page: { key: '', slug: '', index: 0, total: 0, progressPercentage: 0, startedAt: now },\n session: { id: opts.sessionId ?? null, startedAt: now, referrer },\n identity: { customerId: opts.customerId ?? null, visitorId: opts.visitorId ?? null },\n system: {\n funnelId: opts.funnelId ?? '',\n campaignId: opts.campaignId ?? '',\n mode: opts.mode ?? 'live',\n now,\n },\n }\n\n if (!opts.overrides) return base\n return {\n ...base,\n ...opts.overrides,\n device: { ...base.device, ...opts.overrides.device },\n browser: { ...base.browser, ...opts.overrides.browser },\n os: { ...base.os, ...opts.overrides.os },\n locale: { ...base.locale, ...opts.overrides.locale },\n utm: { ...base.utm, ...opts.overrides.utm },\n clickIds: { ...base.clickIds, ...opts.overrides.clickIds },\n page: { ...base.page, ...opts.overrides.page },\n session: { ...base.session, ...opts.overrides.session },\n identity: { ...base.identity, ...opts.overrides.identity },\n system: { ...base.system, ...opts.overrides.system },\n }\n}\n\n/** Internal: reset the detection cache (tests only). */\nexport function __resetContextCache(): void {\n cached = null\n}\n","/**\n * v2 tracking seam — the funnel runtime emits a **fixed event taxonomy**, but\n * never talks to the network itself. It calls a {@link Tracker} the platform/CLI\n * injects via {@link FunnelProvider}. The real implementation is the existing\n * {@link ./tracker}.`FunnelTracker` (session id, ad attribution, debounced\n * persistence, CAPI fan-out); tests and local dev use {@link createConsoleTracker}.\n *\n * The taxonomy is preserved verbatim from v0 so analytics keep working:\n * funnel.start · page.view · page.exit · user.registered · experiment.exposure ·\n * checkout.start · checkout.payment_added · checkout.failed · purchase.complete\n *\n * Where each fires (all from the SDK runtime):\n * - `funnel.start` / `page.view` / `page.exit` / `experiment.exposure` — navigation\n * ({@link ../flow/flow}.`FunnelView`); `page.exit` carries duration + active (visible) time.\n * - `user.registered` — `identify()`, the first time `user.email` is written.\n * - `checkout.*` / `purchase.complete` — the commerce primitives ({@link ../commerce/checkout}).\n * `checkout.payment_added` is reported by an inline driver via `onPaymentAdded` (optional).\n *\n * A `responses.set(...)` does **not** emit a discrete event — values are batched into\n * `userData` and persisted (debounced). Only the events above fire.\n */\n\nimport {\n createContext,\n createElement,\n useCallback,\n useContext,\n type ReactNode,\n} from 'react'\nimport type { Acquisition } from '../state/context'\n\n// ── Event taxonomy (typed, preserved from v0) ────────────\n\nexport interface FunnelEventDataMap {\n 'funnel.start': Record<string, never>\n 'page.view': { pageId: string; pageKey?: string; pageName?: string; isInitial?: boolean; eventId?: string }\n 'page.exit': { pageId: string; durationMs: number; activeMs: number }\n 'user.registered': { email: string; eventId?: string }\n 'checkout.start': { productId?: string; priceId?: string; productName?: string }\n 'checkout.payment_added': Record<string, never>\n 'checkout.failed': { category: string; declineCode?: string; productId?: string; intent?: string }\n 'purchase.complete': { amount?: number; currency?: string; email?: string; eventId?: string }\n 'experiment.exposure': { experimentId: string; variant: string }\n}\n\n/**\n * A unique id for an analytics event, used as the **dedup key** between the\n * browser pixel (`fbq(..., { eventID })`) and the server CAPI call. Browser-\n * originated events (page.view, registration) mint one with this; **purchase /\n * subscription events carry the id the *server* minted** (the charge is the source\n * of truth) — see `CheckoutResult.eventId`.\n */\nlet _eventIdCounter = 0\nexport function newEventId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID()\n return `af_${Date.now().toString(36)}_${(_eventIdCounter++).toString(36)}`\n}\n\nexport type KnownFunnelEvent = keyof FunnelEventDataMap\n\n/**\n * The surface the runtime needs from a tracker. A subset of `FunnelTracker`, so\n * the real one satisfies it directly; the console tracker is a trivial stub.\n */\nexport interface Tracker {\n /** Emit a known event (typed) or any custom event name. */\n track<E extends KnownFunnelEvent>(event: E, data?: FunnelEventDataMap[E], userData?: Record<string, unknown>): void\n track(event: string, data?: Record<string, unknown>, userData?: Record<string, unknown>): void\n /**\n * Identify by email — fires `user.registered` (idempotent in the impl). The\n * optional `eventId` is the browser↔CAPI dedup key for the registration event.\n */\n identify(email: string, eventId?: string): void\n /** Push the latest variable snapshot for batched/debounced persistence. */\n setVariables?(variables: Record<string, unknown>): void\n /**\n * The acquisition snapshot (utm + click-ids + `_fbp`/`_fbc` + referrer), pushed\n * once on entry. The platform persists it first-class — per-visit on the session +\n * **first-touch (write-once) on the Customer** — and feeds it to CAPI. Optional;\n * the console/test trackers ignore it.\n */\n setAcquisition?(acquisition: Acquisition): void\n}\n\n/** A no-op-ish tracker that logs to the console — for tests, preview, local dev. */\nexport function createConsoleTracker(opts: { silent?: boolean } = {}): Tracker {\n const log = (label: string, ...args: unknown[]) => {\n if (!opts.silent) console.info(`[appfunnel] ${label}`, ...args)\n }\n return {\n track: (event: string, data?: unknown) => log(`track ${event}`, data ?? {}),\n identify: (email: string, eventId?: string) => log('identify', email, eventId),\n setVariables: (vars) => log('vars', vars),\n setAcquisition: (acq) => log('acquisition', acq),\n }\n}\n\n// ── React wiring ─────────────────────────────────────────\n\nconst TrackerContext = createContext<Tracker | null>(null)\n\nexport function TrackerProvider({\n tracker,\n children,\n}: {\n tracker: Tracker\n children: ReactNode\n}): ReactNode {\n return createElement(TrackerContext.Provider, { value: tracker }, children)\n}\n\n/** Internal: the raw tracker, or a silent console fallback if none provided. */\nexport function useTrackerRef(): Tracker {\n return useContext(TrackerContext) ?? FALLBACK\n}\n\nconst FALLBACK = createConsoleTracker({ silent: true })\n\n/**\n * `const { track } = useTracker()` — emit a custom event. Auto events\n * (page.view, identify, purchase, …) fire on their own; this is the escape\n * hatch for funnel-specific events (`track('quiz_skipped', { step: 3 })`).\n */\nexport function useTracker(): { track: Tracker['track'] } {\n const tracker = useTrackerRef()\n const track = useCallback(\n (event: string, data?: Record<string, unknown>, userData?: Record<string, unknown>) =>\n tracker.track(event, data as never, userData),\n [tracker],\n )\n return { track }\n}\n","/**\n * The **`window.appfunnel` event bus** — the client-side integration surface\n * (port of v0 `admin/lib/funnel/utils/appfunnelRuntime.ts`).\n *\n * Every taxonomy event the runtime emits is mirrored here, so on-page pixels and\n * custom scripts integrate by **subscribing** — `window.appfunnel.on('purchase.complete', …)`\n * — instead of the funnel hand-injecting pixel config per page. The pre-built pixel\n * loaders (Meta/TikTok/GTM/Clarity) are just subscribers; CAPI stays the server-side\n * default (this is the *client* sink of the same events). See doc 08 §3.\n *\n * Two deliberate properties vs. v0:\n * - **Replay history** (`events`): async pixels load *after* `funnel.start`/`page.view`\n * fire, so a late subscriber would miss them. The bus keeps a bounded history a\n * subscriber can replay (the GTM `dataLayer` trick) — no lost events.\n * - **Subscribe + read only.** The window surface exposes `on`/`off`/`events` + read\n * getters; it has **no `emit`** (third-party code can't forge events) and **no\n * mutating actions** (`setVariable`/navigation) — the funnel can't be driven through\n * it. (v0's full-control Custom-JS API is deferred pending the bus-control-scope\n * decision; doc 08 §3 + §4.)\n */\n\nimport { newEventId, type Tracker } from './tracking'\n\n/** Read accessors the bus exposes — wired to the funnel's store + context. */\nexport interface BusAccessors {\n getVariable: (key: string) => unknown\n getVariables: () => Record<string, unknown>\n getCurrentPageId: () => string | null\n getCustomerId: () => string | null\n getVisitorId: () => string | null\n}\n\nexport interface BusEvent {\n event: string\n data: unknown\n /** Epoch ms the event was emitted (for ordering / replay). */\n ts: number\n}\n\ntype Listener = (data: unknown) => void\n\n/** The public `window.appfunnel` surface — subscribe + read, never emit or mutate. */\nexport interface AppFunnelBusApi extends BusAccessors {\n /** Subscribe to an event (or `'*'` for all). Returns an unsubscribe fn. */\n on(event: string, cb: Listener): () => void\n off(event: string, cb: Listener): void\n /** Bounded replay history — read past events, then `on()` for future ones. */\n readonly events: BusEvent[]\n}\n\nconst MAX_HISTORY = 250\n\n/**\n * The internal bus: the public {@link AppFunnelBusApi} plus `emit` (SDK-only) and\n * `now` injection. The SDK holds this; only {@link AppFunnelBusApi} reaches `window`.\n */\nexport interface FunnelBus extends AppFunnelBusApi {\n emit(event: string, data?: unknown): void\n}\n\n/** Create a bus over the given read accessors. `now` is injectable for tests. */\nexport function createBus(accessors: BusAccessors, now: () => number = () => Date.now()): FunnelBus {\n const listeners = new Map<string, Set<Listener>>()\n const events: BusEvent[] = []\n\n const on: AppFunnelBusApi['on'] = (event, cb) => {\n let set = listeners.get(event)\n if (!set) listeners.set(event, (set = new Set()))\n set.add(cb)\n return () => off(event, cb)\n }\n const off: AppFunnelBusApi['off'] = (event, cb) => {\n listeners.get(event)?.delete(cb)\n }\n\n const emit = (event: string, data?: unknown) => {\n events.push({ event, data, ts: now() })\n if (events.length > MAX_HISTORY) events.shift()\n // Exact-event listeners, then wildcard. A throwing subscriber never breaks the rest.\n for (const cb of listeners.get(event) ?? []) {\n try { cb(data) } catch { /* a pixel error must not break the funnel */ }\n }\n for (const cb of listeners.get('*') ?? []) {\n try { cb({ event, data }) } catch { /* ignore */ }\n }\n }\n\n return { on, off, events, emit, ...accessors }\n}\n\n/**\n * Wrap a {@link Tracker} so every emitted taxonomy event is mirrored to the bus\n * (the client sink). `identify()` also surfaces a `user.registered` to the bus, so\n * pixels see registration. The server sink (the inner tracker → CAPI) is untouched.\n */\nexport function withBus(tracker: Tracker, bus: FunnelBus): Tracker {\n return {\n // Spread preserves the original call arity (don't append an undefined userData).\n track: ((...args: [string, unknown?, Record<string, unknown>?]) => {\n ;(tracker.track as (...a: unknown[]) => void)(...args)\n bus.emit(args[0], args[1])\n }) as Tracker['track'],\n identify: (email: string, eventId?: string) => {\n // One id shared by the server (inner.identify → CAPI) and the bus (pixel) so\n // CompleteRegistration dedupes across browser + server.\n const id = eventId ?? newEventId()\n tracker.identify(email, id)\n bus.emit('user.registered', { email, eventId: id })\n },\n setVariables: tracker.setVariables ? (v) => tracker.setVariables!(v) : undefined,\n // Acquisition is persistence (session + first-touch Customer), not a bus event.\n setAcquisition: tracker.setAcquisition ? (a) => tracker.setAcquisition!(a) : undefined,\n }\n}\n\ndeclare global {\n interface Window {\n appfunnel?: AppFunnelBusApi\n }\n}\n\n/**\n * Attach the bus's public surface to `window.appfunnel` (client-side only).\n * Returns a detach fn for unmount. No-op under SSR.\n */\nexport function attachBus(bus: FunnelBus): () => void {\n if (typeof window === 'undefined') return () => {}\n const { on, off, getVariable, getVariables, getCurrentPageId, getCustomerId, getVisitorId } = bus\n const api: AppFunnelBusApi = {\n on, off, getVariable, getVariables, getCurrentPageId, getCustomerId, getVisitorId,\n get events() { return bus.events },\n }\n window.appfunnel = api\n return () => {\n if (window.appfunnel === api) delete window.appfunnel\n }\n}\n","/**\n * v2 localization — translated **text** (prices already localize via `Intl` in\n * {@link ./catalog}). Per doc 05: locales live in the funnel source — supported\n * locales + default + fallback are funnel config ({@link FunnelLocales}), and\n * each locale is a flat `key → string` **catalog** (`messages/en.json`, …),\n * versioned + published with the funnel. The dashboard's manual translation\n * table edits exactly these catalogs.\n *\n * Lookup walks a **fallback chain** (active → fallback → default) so a missing\n * string never blanks — it falls through, and only as a last resort returns the\n * key (flagged in dev). Interpolation is simple `{{var}}`; plurals use the\n * built-in `Intl.PluralRules`; numbers/dates/percent use `Intl`. No ICU, no rich\n * markup (markup stays in TSX).\n */\n\nimport {\n createContext,\n createElement,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react'\nimport type { FunnelLocales } from '../flow/spine'\n\n/** locale → (message key → string). The shape of `messages/<locale>.json`. */\nexport type MessageCatalog = Record<string, Record<string, string>>\n\nexport type PluralCategory = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'\nexport type Direction = 'ltr' | 'rtl'\n\nconst RTL_LANGS = new Set(['ar', 'he', 'fa', 'ur', 'ps', 'sd', 'dv', 'yi'])\n\n/** Whether a locale is right-to-left (by language subtag). */\nexport function isRtl(locale: string): boolean {\n return RTL_LANGS.has(locale.split('-')[0])\n}\n\nconst base = (l: string | undefined): string | undefined => l?.split('-')[0]\n\n/**\n * Resolve the active locale: `override` (URL/param) → `detected` (device) →\n * funnel default, each only if supported (matched by exact tag or language\n * subtag). Mirrors doc 05's resolution chain (the geo/header steps happen\n * server-side and arrive via `override`/`detected`).\n */\nexport function resolveLocale(\n config: FunnelLocales | undefined,\n detected: string,\n override?: string,\n): string {\n const supported = config?.supported ?? (config?.default ? [config.default] : ['en'])\n const def = config?.default ?? supported[0] ?? 'en'\n const pick = (l?: string): string | undefined => {\n if (!l) return undefined\n if (supported.includes(l)) return l\n return supported.find((s) => base(s) === base(l))\n }\n return pick(override) ?? pick(detected) ?? def\n}\n\n/** Replace `{{name}}` placeholders; leaves unknown ones intact. */\nfunction interpolate(str: string, params?: Record<string, string | number>): string {\n if (!params) return str\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, k: string) => (k in params ? String(params[k]) : `{{${k}}}`))\n}\n\n/** Walk the fallback chain for a key; undefined if absent everywhere. */\nfunction lookup(catalog: MessageCatalog, chain: string[], key: string): string | undefined {\n for (const loc of chain) {\n const v = catalog[loc]?.[key]\n if (v !== undefined) return v\n }\n return undefined\n}\n\nfunction devWarn(message: string): void {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV\n if (env === 'production') return\n try {\n console.warn(message)\n } catch {\n /* no-op */\n }\n}\n\n// ── Public types ─────────────────────────────────────────\n\nexport interface TFunction {\n /** Translate a key, with optional `{{var}}` params. Missing → fallback → key. */\n (key: string, params?: Record<string, string | number>): string\n /** Locale-correct plural: `t.plural(n, { one: '# day', other: '# days' })` (`#` → n). */\n plural: (\n n: number,\n forms: Partial<Record<PluralCategory, string>>,\n params?: Record<string, string | number>,\n ) => string\n}\n\nexport interface Formatters {\n number: (n: number, opts?: Intl.NumberFormatOptions) => string\n date: (d: Date | number, opts?: Intl.DateTimeFormatOptions) => string\n percent: (n: number, opts?: Intl.NumberFormatOptions) => string\n}\n\nexport interface Translation {\n t: TFunction\n fmt: Formatters\n /** The active (resolved) locale. */\n locale: string\n /** Switch locale at runtime (preview / language picker). */\n setLocale: (locale: string) => void\n /** Text direction for the active locale. */\n dir: Direction\n /** The funnel's supported locales. */\n locales: string[]\n}\n\n// ── React wiring ─────────────────────────────────────────\n\ninterface LocaleContextValue {\n locale: string\n setLocale: (locale: string) => void\n config?: FunnelLocales\n catalog: MessageCatalog\n}\n\nconst LocaleContext = createContext<LocaleContextValue | null>(null)\n\nexport interface LocaleProviderProps {\n config?: FunnelLocales\n catalog?: MessageCatalog\n /** Device/browser locale (from computed context) — the resolution input. */\n detected: string\n /** Explicit override (URL/param/geo), highest priority. */\n override?: string\n children: ReactNode\n}\n\n/** Resolves + holds the active locale and the message catalog. */\nexport function LocaleProvider({\n config,\n catalog = {},\n detected,\n override,\n children,\n}: LocaleProviderProps): ReactNode {\n const [locale, setLocale] = useState(() => resolveLocale(config, detected, override))\n const value = useMemo<LocaleContextValue>(\n () => ({ locale, setLocale, config, catalog }),\n [locale, config, catalog],\n )\n return createElement(LocaleContext.Provider, { value }, children)\n}\n\n/** The active (resolved) funnel locale, or `'en'` if no provider — for display\n * formatting (e.g. {@link ./catalog} prices) without building the full handle. */\nexport function useActiveLocale(): string {\n return useContext(LocaleContext)?.locale ?? 'en'\n}\n\n/**\n * `const { t, fmt, locale, dir } = useTranslation()` — translated text +\n * locale-aware `Intl` formatters for the active funnel locale.\n */\nexport function useTranslation(): Translation {\n const ctx = useContext(LocaleContext)\n if (!ctx) throw new Error('useTranslation must be used inside <FunnelProvider>')\n const { locale, setLocale, config, catalog } = ctx\n\n const chain = useMemo(() => {\n const def = config?.default\n const fb = config?.fallback\n return Array.from(new Set([locale, fb, def].filter(Boolean) as string[]))\n }, [locale, config])\n\n const t = useMemo<TFunction>(() => {\n const fn = ((key: string, params?: Record<string, string | number>) => {\n const raw = lookup(catalog, chain, key)\n if (raw === undefined) {\n devWarn(`[appfunnel] missing translation: \"${key}\" (${locale})`)\n return key\n }\n return interpolate(raw, params)\n }) as TFunction\n fn.plural = (n, forms, params) => {\n const rule = new Intl.PluralRules(locale).select(n) as PluralCategory\n const form = forms[rule] ?? forms.other ?? ''\n return interpolate(form.replace(/#/g, String(n)), params)\n }\n return fn\n }, [catalog, chain, locale])\n\n const fmt = useMemo<Formatters>(\n () => ({\n number: (n, opts) => new Intl.NumberFormat(locale, opts).format(n),\n date: (d, opts) => new Intl.DateTimeFormat(locale, opts).format(d),\n percent: (n, opts) => new Intl.NumberFormat(locale, { style: 'percent', ...opts }).format(n),\n }),\n [locale],\n )\n\n return {\n t,\n fmt,\n locale,\n setLocale,\n dir: isRtl(locale) ? 'rtl' : 'ltr',\n locales: config?.supported ?? [locale],\n }\n}\n","/**\n * v2 `products` — the **read-only** product catalog.\n *\n * **AppFunnel does not manage currency.** Multi-currency is entirely the payment\n * provider's job: the provider (or its preview API) resolves the visitor's price,\n * and we receive a single resolved `{ amount, currency }` per product. No FX, no\n * currency selection, no conversion on our side. (FX appears only for frozen-USD\n * *reporting*, never display — phase-3 §3.6b.) A provider that doesn't localize\n * simply gives one currency.\n *\n * Our only job is **display**: pick the product by logical id and **format** its\n * amount. Formatting happens at read time in the funnel's **active locale** (so\n * switching language reformats `kr 79,00` ⇄ `$9.99`), while the **currency** is\n * whatever the provider resolved. Currency selection is the platform's; the\n * authoring funnel only ever names a product id.\n */\n\nimport {\n createContext,\n createElement,\n useContext,\n useMemo,\n type ReactNode,\n} from 'react'\nimport { useActiveLocale } from '../i18n/translation'\n\n// ── Shape ────────────────────────────────────────────────\n\nexport type Interval = 'day' | 'week' | 'month' | 'year' | 'one_time'\n\n/** What the platform hands the funnel per product (a single provider-resolved price). */\nexport interface ProductInput {\n id: string\n name?: string\n displayName?: string\n /** Provider-resolved price in **minor units** (the provider chose the currency). */\n amount: number\n /** Currency of `amount`, as the provider resolved it (e.g. `DKK`). */\n currency: string\n interval?: Interval\n intervalCount?: number\n trialDays?: number\n /** Trial price in minor units (omit/0 = free trial). */\n trialAmount?: number\n /** Settlement provider — opaque to the author, used by the checkout driver. */\n provider?: string\n}\n\n/** A money value with a locale-formatted string. */\nexport interface Money {\n /** Major units, e.g. `79`. */\n amount: number\n /** Minor units, e.g. `7900`. */\n minor: number\n currency: string\n /** Locale-formatted, e.g. `kr 79,00` / `€9,99` / `$9.99`. */\n formatted: string\n}\n\n/**\n * The product with its amounts resolved (currency + period math), **before**\n * locale formatting — what the catalog stores. {@link useProduct} formats it.\n */\nexport interface ResolvedProduct {\n id: string\n name: string\n displayName: string\n provider: string\n currency: string\n priceMinor: number\n perDayMinor: number\n perWeekMinor: number\n perMonthMinor: number\n perYearMinor: number\n period: string\n periodly: string\n hasTrial: boolean\n trialDays: number\n trialMinor: number\n}\n\n/** Display-ready product the author reads (every amount locale-formatted). */\nexport interface Product {\n id: string\n name: string\n displayName: string\n provider: string\n price: Money\n /** e.g. `month`, `quarter`, `one-time`. */\n period: string\n /** e.g. `monthly`, `quarterly`, `one-time`. */\n periodly: string\n /** Period-normalized prices (for \"just $0.27/day\" style copy). */\n perDay: Money\n perWeek: Money\n perMonth: Money\n perYear: Money\n hasTrial: boolean\n trialDays: number\n trialPrice: Money | null\n}\n\n// ── Resolve (currency-agnostic) ──────────────────────────\n\nconst PERIOD_DAYS: Record<Interval, number> = {\n day: 1, week: 7, month: 30, year: 365, one_time: 0,\n}\n\nfunction periodDays(interval: Interval, count: number): number {\n return PERIOD_DAYS[interval] * count\n}\n\nfunction intervalLabel(interval: Interval, count: number): { period: string; periodly: string } {\n if (interval === 'one_time') return { period: 'one-time', periodly: 'one-time' }\n if (interval === 'month' && count === 3) return { period: 'quarter', periodly: 'quarterly' }\n if (interval === 'month' && count === 6) return { period: '6 months', periodly: 'semiannually' }\n if (interval === 'week' && count === 2) return { period: '2 weeks', periodly: 'biweekly' }\n if (count === 1) {\n const periodly = { day: 'daily', week: 'weekly', month: 'monthly', year: 'yearly' }[interval]\n return { period: interval, periodly }\n }\n return { period: `${count} ${interval}s`, periodly: `every ${count} ${interval}s` }\n}\n\n/** Resolve a {@link ProductInput} into amounts + period math (no formatting yet). */\nexport function resolveProduct(input: ProductInput): ResolvedProduct {\n const interval = input.interval ?? 'one_time'\n const count = input.intervalCount ?? 1\n const days = periodDays(interval, count)\n const perDayMinor = days > 0 ? input.amount / days : input.amount\n const label = intervalLabel(interval, count)\n\n return {\n id: input.id,\n name: input.name ?? input.id,\n displayName: input.displayName ?? input.name ?? input.id,\n provider: input.provider ?? 'stripe',\n currency: input.currency,\n priceMinor: input.amount,\n perDayMinor,\n perWeekMinor: perDayMinor * 7,\n perMonthMinor: perDayMinor * 30,\n perYearMinor: perDayMinor * 365,\n period: label.period,\n periodly: label.periodly,\n hasTrial: (input.trialDays ?? 0) > 0,\n trialDays: input.trialDays ?? 0,\n trialMinor: input.trialAmount ?? 0,\n }\n}\n\n/** Build the id → {@link ResolvedProduct} catalog. Formatting happens at read time. */\nexport function buildCatalog(inputs: ProductInput[]): Map<string, ResolvedProduct> {\n return new Map(inputs.map((i) => [i.id, resolveProduct(i)]))\n}\n\n// ── Format (locale-dependent) ────────────────────────────\n\nfunction formatMoney(minor: number, currency: string, locale: string): Money {\n const amount = minor / 100\n const code = currency.toUpperCase()\n let formatted: string\n try {\n formatted = new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount)\n } catch {\n formatted = `${code} ${amount.toFixed(2)}`\n }\n return { amount, minor, currency: code, formatted }\n}\n\n/** Format a {@link ResolvedProduct} into a display {@link Product} in `locale`. */\nexport function formatProduct(r: ResolvedProduct, locale: string): Product {\n const m = (minor: number): Money => formatMoney(minor, r.currency, locale)\n return {\n id: r.id,\n name: r.name,\n displayName: r.displayName,\n provider: r.provider,\n price: m(r.priceMinor),\n period: r.period,\n periodly: r.periodly,\n perDay: m(r.perDayMinor),\n perWeek: m(r.perWeekMinor),\n perMonth: m(r.perMonthMinor),\n perYear: m(r.perYearMinor),\n hasTrial: r.hasTrial,\n trialDays: r.trialDays,\n trialPrice: r.hasTrial ? m(r.trialMinor) : null,\n }\n}\n\n// ── React wiring ─────────────────────────────────────────\n\nconst CatalogContext = createContext<Map<string, ResolvedProduct> | null>(null)\n\nexport function CatalogProvider({\n catalog,\n children,\n}: {\n catalog: Map<string, ResolvedProduct>\n children: ReactNode\n}): ReactNode {\n return createElement(CatalogContext.Provider, { value: catalog }, children)\n}\n\nfunction useCatalog(): Map<string, ResolvedProduct> {\n return useContext(CatalogContext) ?? EMPTY\n}\nconst EMPTY = new Map<string, ResolvedProduct>()\n\n/** `useProduct('monthly')` — one product, formatted in the active locale. */\nexport function useProduct(id: string | undefined): Product | undefined {\n const catalog = useCatalog()\n const locale = useActiveLocale()\n const resolved = id ? catalog.get(id) : undefined\n return useMemo(() => (resolved ? formatProduct(resolved, locale) : undefined), [resolved, locale])\n}\n\n/** `useProducts()` — every product, formatted in the active locale, in order. */\nexport function useProducts(): Product[] {\n const catalog = useCatalog()\n const locale = useActiveLocale()\n return useMemo(\n () => Array.from(catalog.values()).map((r) => formatProduct(r, locale)),\n [catalog, locale],\n )\n}\n","import type { ComponentType } from 'react'\nimport type { VariableConfig, VariableValue } from '../types'\nimport type { FunnelContext } from '../state/context'\n\n/**\n * The funnel **spine** — the constrained, declarative configuration authored as\n * code (`defineFunnel` / `pageMeta` / `definePage`) yet **dashboard-editable**\n * (static AST parse → pretty UI → codegen) and compiled to the manifest IR.\n *\n * Principle: **presentation = code** (the page components), **configuration =\n * data** (this spine). See docs/platform-v2/06-funnel-project-model.md.\n *\n * Routing is **declarative nodes + code predicates** (decided — doc 06): a\n * page's `next` is an ordered list of {@link Route}s, each with a **static `to`\n * page key** (so the dashboard can draw every possible edge without executing\n * anything) and an optional `when` **gate** that returns true/false. The gate is\n * either a declarative {@link Condition} (one field — UI-editable data) or a code\n * {@link Predicate} (`s => boolean` — the escape hatch, opaque body but the edge\n * is still visible). First matching route wins; a route with no `when` is the\n * fallback. Multiple conditions = multiple routes (or boolean logic in one\n * predicate). Omit `next` entirely for the default linear flow.\n */\n\n// ── Snapshot (what a predicate sees) ─────────────────────\n\n/**\n * Read-only view of every namespace a routing/condition predicate can branch\n * on. `user`/`responses`/`data` are the writable namespaces; `context` is the\n * read-only computed one ({@link FunnelContext}).\n */\nexport interface FunnelSnapshot {\n user: Record<string, VariableValue>\n responses: Record<string, VariableValue>\n data: Record<string, VariableValue>\n context: FunnelContext\n}\n\n/** A code-predicate gate — `s => s.responses.goal === 'gain'`. */\nexport type Predicate = (s: FunnelSnapshot) => boolean\n\nexport type ConditionOp =\n | 'eq' | 'neq' | 'in' | 'gt' | 'gte' | 'lt' | 'lte'\n | 'exists' | 'empty' | 'contains'\n\n/**\n * A declarative gate over **one** namespaced field — UI-editable data the\n * dashboard renders as a condition row (`field` `op` `value`). `field` is a\n * dotted path into the snapshot: `responses.goal`, `user.country`,\n * `context.device.isMobile`.\n */\nexport interface Condition {\n field: string\n op: ConditionOp\n value?: VariableValue | VariableValue[]\n}\n\n/** An edge gate: either declarative data ({@link Condition}) or a {@link Predicate}. */\nexport type Gate = Condition | Predicate\n\n/**\n * One routing edge out of a page. `to` is a **static** target key (the dashboard\n * reads these to draw the flow graph); `when` gates the edge (omit = fallback).\n */\nexport interface Route {\n to: string\n when?: Gate\n}\n\n/** Read a dotted path out of the snapshot (flat namespaces + nested `context`). */\nfunction readField(s: FunnelSnapshot, field: string): VariableValue {\n let cur: unknown = s\n for (const part of field.split('.')) {\n if (cur == null) return undefined\n cur = (cur as Record<string, unknown>)[part]\n }\n return cur as VariableValue\n}\n\n/** Evaluate a declarative {@link Condition} against a snapshot. */\nexport function evaluateCondition(cond: Condition, s: FunnelSnapshot): boolean {\n const val = readField(s, cond.field)\n const { op, value } = cond\n switch (op) {\n case 'eq': return val === value\n case 'neq': return val !== value\n case 'in': return Array.isArray(value) && (value as VariableValue[]).includes(val as VariableValue)\n case 'gt': return typeof val === 'number' && typeof value === 'number' && val > value\n case 'gte': return typeof val === 'number' && typeof value === 'number' && val >= value\n case 'lt': return typeof val === 'number' && typeof value === 'number' && val < value\n case 'lte': return typeof val === 'number' && typeof value === 'number' && val <= value\n case 'contains':\n if (typeof val === 'string') return val.includes(String(value))\n if (Array.isArray(val)) return (val as VariableValue[]).includes(value as VariableValue)\n return false\n case 'exists': return val !== undefined && val !== null && val !== ''\n case 'empty':\n return val === undefined || val === null || val === '' ||\n (Array.isArray(val) && val.length === 0)\n default: return false\n }\n}\n\n/** Evaluate either gate kind to a boolean. */\nexport function evaluateGate(gate: Gate, s: FunnelSnapshot): boolean {\n return typeof gate === 'function' ? gate(s) : evaluateCondition(gate, s)\n}\n\n/**\n * Resolve an ordered list of routes to a target page key, or `undefined` to fall\n * through to the linear next. First route whose gate passes (or has no `when`)\n * wins.\n */\nexport function resolveRoute(\n routes: Route[] | undefined,\n s: FunnelSnapshot,\n): string | undefined {\n if (!routes) return undefined\n for (const route of routes) {\n if (!route.when || evaluateGate(route.when, s)) return route.to\n }\n return undefined\n}\n\n// ── Pages ────────────────────────────────────────────────\n\nexport type PageType =\n | 'default' // plain content/step page (the baseline)\n | 'email-capture' // collects user.email — the mandatory identity step (validated)\n | 'paywall' // the offer/pricing page → drives paywall-view + paywall-CR\n | 'upsell' // post-purchase one-click → drives Upsell Rate + off-session charge\n | 'finish' // terminal success/thank-you page → completion analytics, ends the flow\n\nexport interface PageMeta {\n /** Page kind — drives behavior + analytics (e.g. `paywall`, `upsell`). */\n type?: PageType\n /** URL slug; defaults to the page key. */\n slug?: string\n /**\n * Ordered routing edges out of this page (first match wins). Each has a static\n * `to` key + an optional `when` gate. Omit for the default linear flow.\n */\n next?: Route[]\n /**\n * Entry precondition for **deep-link / reload** restoration. When the runtime is\n * asked to start *on this page* (not via in-funnel navigation), it restores there\n * only if `guard` passes against the restored snapshot — otherwise it falls back\n * to the start page. e.g. an upsell page: `guard: s => s.data.purchased === true`.\n * Reaching the page via `next()` is unaffected (routing already gated it). Omit =\n * always restorable. Same gate kind as routing (`Condition` or predicate).\n */\n guard?: Gate\n}\n\n/**\n * Identity helper for a page's co-located metadata.\n * `export const meta = pageMeta({ type: 'paywall', next: s => … })`.\n */\nexport function pageMeta(meta: PageMeta): PageMeta {\n return meta\n}\n\n/**\n * Default entry guard implied by a page **type** — a built-in precondition every\n * funnel inherits. `paywall` and `upsell` require a captured `user.email` (the\n * mandatory identity step), so a deep-link / reload straight into them without\n * email bounces to the start. Authors don't write this; an explicit `meta.guard`\n * **overrides** it (see {@link entryGuard}).\n */\nconst TYPE_GUARDS: Partial<Record<PageType, Gate>> = {\n paywall: { field: 'user.email', op: 'exists' },\n upsell: { field: 'user.email', op: 'exists' },\n}\n\n/**\n * The effective entry guard for a page: an explicit `meta.guard` if the author set\n * one, **otherwise** the page-type default (e.g. paywall/upsell need email). The\n * explicit guard fully **overrides** the default — it's not combined. Returns\n * `undefined` when neither applies.\n */\nexport function entryGuard(meta?: PageMeta): Gate | undefined {\n return meta?.guard ?? (meta?.type ? TYPE_GUARDS[meta.type] : undefined)\n}\n\n/**\n * Identity helper for a page component. The page is plain React that reaches the\n * runtime through hooks (`useResponse`, `useNavigation`, …) — there is no `sdk`\n * prop. `export default definePage(function Welcome() { … })`.\n */\nexport function definePage<P extends object = Record<string, never>>(\n component: ComponentType<P>,\n): ComponentType<P> {\n return component\n}\n\n// ── Flow resolution ──────────────────────────────────────\n\n/** A page in the flow: its key + (optional) co-located meta. */\nexport interface FlowPage {\n key: string\n meta?: PageMeta\n}\n\n/**\n * Decide the next page from `currentKey`:\n * 1. the current page's `next` routes ({@link resolveRoute}), if one matches, else\n * 2. the next page in file order (the default linear flow), else\n * 3. `undefined` (end of funnel / current key not found).\n */\nexport function nextPage(\n pages: FlowPage[],\n currentKey: string,\n s: FunnelSnapshot,\n): string | undefined {\n const idx = pages.findIndex((p) => p.key === currentKey)\n if (idx === -1) return undefined\n const routed = resolveRoute(pages[idx].meta?.next, s)\n if (routed) return routed\n return pages[idx + 1]?.key\n}\n\n/**\n * Every page a visitor *could* go to next from `currentKey` — all route targets\n * (regardless of gate, since we don't know which will pass) plus the linear next.\n * Used to **prefetch** the likely-next page chunks; not for navigation.\n */\nexport function outgoingKeys(pages: FlowPage[], currentKey: string): string[] {\n const idx = pages.findIndex((p) => p.key === currentKey)\n if (idx === -1) return []\n const out = new Set<string>()\n for (const route of pages[idx].meta?.next ?? []) out.add(route.to)\n const linear = pages[idx + 1]?.key\n if (linear) out.add(linear)\n return [...out]\n}\n\n/**\n * The number of pages on the path from `startKey` to a `finish` (or the end of\n * the flow) **given the current state** — the denominator for progress. It walks\n * the actual routing ({@link nextPage}) rather than counting all files, so a\n * branched funnel reaches 100% on whichever path the visitor's answers select.\n * Re-traced per navigation; a visited set guards against routing cycles.\n */\nexport function expectedPathLength(\n pages: FlowPage[],\n startKey: string,\n s: FunnelSnapshot,\n): number {\n const seen = new Set<string>()\n let key: string | undefined = startKey\n let count = 0\n while (key && !seen.has(key)) {\n seen.add(key)\n count++\n if (pages.find((p) => p.key === key)?.meta?.type === 'finish') break\n key = nextPage(pages, key, s)\n }\n return count\n}\n\n// ── Funnel definition ────────────────────────────────────\n\nexport interface FunnelLocales {\n default: string\n supported: string[]\n fallback?: string\n}\n\n/**\n * The funnel-level spine. Flow is mostly inferred from page file order + each\n * page's `next`; this holds the funnel-wide config. Stays **thin** — routing\n * lives co-located on pages (doc 06: \"funnel.ts stays thin\").\n */\nexport interface FunnelDefinition {\n id: string\n /** `responses.*` runtime variables (default values). */\n responses?: Record<string, VariableConfig>\n /** `data.*` working/scratch variables (default values). */\n data?: Record<string, VariableConfig>\n /** Product ids from the platform catalog this funnel uses (prices resolved at render). */\n products?: string[]\n locales?: FunnelLocales\n /**\n * When `true`, the funnel shows the **geo-specific** currency/price the payment\n * provider resolves (Stripe `currency_options`, Paddle preview, Whop, SolidGate,\n * …). When `false` (default), a single fixed currency is used. AppFunnel does no\n * FX — this only toggles whether the platform asks the provider for the geo\n * price; the SDK just displays whatever resolved `{amount, currency}` it's handed.\n * (See docs/platform-v2 phase-3 §3.6.)\n */\n locationAwareCurrency?: boolean\n}\n\n/** Identity helper for a funnel definition. */\nexport function defineFunnel(def: FunnelDefinition): FunnelDefinition {\n return def\n}\n","/**\n * **Runtime page-level experiments** — A/B/n on a *single page inside one funnel*,\n * resolved at render time (phase-4). No funnel duplication: a slot (e.g. the page\n * `welcome`) has alternate versions filed as siblings (`welcome@b.tsx`), and the\n * runtime shows **one** of them per visitor, collapsing the losers out of the\n * linear flow. The flow keeps stable **slot keys** (the control's key); only the\n * rendered component swaps — so routing, the manifest, and analytics all key on the\n * slot, not the variant.\n *\n * **Where the wiring lives:** the *variant pages* are code (compiled into the\n * bundle). The *experiment wiring* — slot, variant→page map, weights, status — is\n * **operational data the platform owns** (a DB record, edited by the dashboard,\n * changed without recompiling the funnel). The SDK is storage-agnostic: the\n * platform hands the runtime experiment records to `FunnelProvider`, the same way\n * it hands in resolved product prices. This module just resolves them.\n *\n * **The only source-side marker** is the `@` in a variant file's key\n * (`welcome@b`): it tells the *build* (manifest, flow graph) that a page is an\n * off-flow variant of its slot, so the structure is correct without the DB. The\n * label/weight/experiment-id are not in source.\n *\n * Bucketing is a deterministic FNV-1a hash, **namespaced by experiment id** so\n * independent experiments bucket orthogonally (the basis for layering 100+ tests,\n * §4.3). The seed is the durable identity ({@link bucketingSeed}) — never the\n * session/fingerprint — so a returning visitor keeps their variant (landmine #4).\n * Stability across an *add-a-variant* edit is the platform's job: an experiment's\n * variant set is immutable while running (reweighting / adding an arm = a new\n * experiment version), so within one record the assignment never moves.\n *\n * This module is pure (no React, no I/O) → it unit-tests trivially and the\n * dashboard/server can reuse the same assignment math.\n */\n\nimport type { FunnelContext } from '../state/context'\n\n// ── Hashing ──────────────────────────────────────────────\n\n/**\n * FNV-1a 32-bit hash → unsigned int. Deterministic and isomorphic (no `crypto`,\n * runs the same in the browser, a worker, and a build). The same math v0 used,\n * kept because it's sound — only the *seed* changes (identity, not session).\n */\nexport function fnv1a(input: string): number {\n let h = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i)\n // h *= 16777619, in uint32, via shift-adds.\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0\n }\n return h >>> 0\n}\n\n/** Map a seed string to a stable float in `[0, 1)`. */\nexport function hashToUnit(seed: string): number {\n return fnv1a(seed) / 0x1_0000_0000\n}\n\n/**\n * Pick a variant key by weight from a stable unit position `u ∈ [0,1)`. Variants\n * are walked in declaration order and the first whose cumulative weight band\n * contains `u` wins, so the same `u` always lands in the same variant.\n */\nexport function pickByWeight(weights: Record<string, number>, u: number): string {\n const entries = Object.entries(weights).filter(([, w]) => w > 0)\n if (entries.length === 0) return Object.keys(weights)[0] ?? ''\n const total = entries.reduce((sum, [, w]) => sum + w, 0)\n const target = u * total\n let acc = 0\n for (const [key, w] of entries) {\n acc += w\n if (target < acc) return key\n }\n return entries[entries.length - 1][0]\n}\n\n/**\n * Deterministically assign a visitor (`seed`) to a variant of one experiment.\n * The hash is **namespaced by `experimentId`** so two experiments on the same\n * traffic don't correlate (orthogonal layering).\n */\nexport function assignVariant(\n experimentId: string,\n seed: string,\n weights: Record<string, number>,\n): string {\n return pickByWeight(weights, hashToUnit(`${experimentId}:${seed}`))\n}\n\n// ── Seed + slot parsing ──────────────────────────────────\n\n/**\n * The stable bucketing seed: the known `customerId`, else the signed `visitorId`.\n * Never the session id or fingerprint (landmine #4). `null` when neither is known\n * — the caller then serves control instead of bucketing on nothing.\n */\nexport function bucketingSeed(context: FunnelContext): string | null {\n return context.identity.customerId ?? context.identity.visitorId ?? null\n}\n\n/** Split a page key into its slot + optional variant: `welcome@b` → `{ slot, variant: 'b' }`. */\nexport function parseSlotKey(key: string): { slot: string; variant?: string } {\n const at = key.indexOf('@')\n return at === -1 ? { slot: key } : { slot: key.slice(0, at), variant: key.slice(at + 1) }\n}\n\n/** True if a page key is an off-flow variant (`welcome@b`), by the source-side `@` marker. */\nexport function isVariantKey(key: string): boolean {\n return parseSlotKey(key).variant !== undefined\n}\n\n// ── Runtime experiment records (platform/DB-sourced) ─────\n\n/** One arm of an experiment: which page renders, at what weight. */\nexport interface ExperimentVariant {\n /** The page key this arm renders (the slot's control, or a `@variant` sibling). */\n page: string\n /** Relative weight in the split (need not sum to 100; zero = paused arm). */\n weight: number\n}\n\n/**\n * A runtime experiment record — the operational wiring the **platform** owns and\n * hands to the SDK (not authored in the funnel source). The variant *pages* are\n * code in the bundle; this is the live config over them.\n */\nexport interface RuntimeExperiment {\n id: string\n /** The page key holding the flow position (the anchor / control). */\n slot: string\n /** label → arm. One arm's `page` is the `slot` (control); others are `@variant` siblings. */\n variants: Record<string, ExperimentVariant>\n /** Lifecycle. Absent = running. */\n status?: 'running' | 'paused' | 'stopped'\n /** When stopped, the variant label everyone sees until promotion bakes it into the slot. */\n winner?: string\n /** Primary metric (analytics only; not used for resolution). */\n metric?: string\n}\n\n// ── Flow resolution ──────────────────────────────────────\n\nexport interface ExperimentResolution {\n /** experiment id → assigned variant label. */\n assignments: Record<string, string>\n /** Page keys forming the effective linear flow (variant siblings removed), in order. */\n activeKeys: string[]\n /** Slot key → the page key whose component should render there. */\n render: Record<string, string>\n /** Variant page key → its slot key. For remapping a route that targets a variant. */\n slotOf: Record<string, string>\n /** Slot key → the experiment id it hosts (drives the exposure event). */\n experimentOf: Record<string, string>\n}\n\n/** Weights map (label → weight) for one experiment's arms. */\nfunction weightsOf(exp: RuntimeExperiment): Record<string, number> {\n const out: Record<string, number> = {}\n for (const [label, v] of Object.entries(exp.variants)) out[label] = v.weight\n return out\n}\n\n/**\n * Resolve which page version each experiment slot shows for this visitor, and\n * which page keys remain in the linear flow.\n *\n * Variant pages are detected structurally by the `@` in their key, so they\n * collapse out of the linear flow even for a slot with no active experiment.\n * For each *running* experiment the visitor is bucketed (stable on `seed`); a\n * *stopped* one serves its `winner`; a *paused* one (or no seed) serves the slot.\n */\nexport function resolveExperiments(\n pages: { key: string }[],\n experiments: RuntimeExperiment[],\n seed: string | null,\n): ExperimentResolution {\n const assignments: Record<string, string> = {}\n const render: Record<string, string> = {}\n const experimentOf: Record<string, string> = {}\n\n for (const exp of experiments) {\n const status = exp.status ?? 'running'\n let label: string\n if (status === 'stopped' && exp.winner) label = exp.winner\n else if (status === 'running' && seed) label = assignVariant(exp.id, seed, weightsOf(exp))\n else continue // paused, or no seed → the slot renders its own (control) page\n\n const arm = exp.variants[label]\n if (!arm) continue\n assignments[exp.id] = label\n experimentOf[exp.slot] = exp.id\n if (arm.page !== exp.slot) render[exp.slot] = arm.page // swap only when a non-control arm won\n }\n\n // Variant siblings (`@`) never stand alone in the linear flow.\n const slotOf: Record<string, string> = {}\n const activeKeys: string[] = []\n for (const p of pages) {\n const { slot, variant } = parseSlotKey(p.key)\n if (variant !== undefined) slotOf[p.key] = slot\n else activeKeys.push(p.key)\n }\n\n return { assignments, activeKeys, render, slotOf, experimentOf }\n}\n\n// ── Validation ───────────────────────────────────────────\n\n/** One referential problem with an experiment record. */\nexport interface ExperimentIssue {\n /** The offending experiment id (`'*'` for a cross-experiment issue). */\n experimentId: string\n code:\n | 'slot_missing' // slot is not a page in the funnel\n | 'slot_is_variant' // slot points at an `@variant`, not a real flow page\n | 'slot_conflict' // two experiments target the same slot\n | 'duplicate_id' // two experiments share an id (bucketing namespace collision)\n | 'variant_page_missing' // a variant references a page that doesn't exist (dangling)\n | 'variant_slot_mismatch' // a variant's `@`-page belongs to a different slot\n | 'no_control' // no arm renders the slot itself (the baseline)\n | 'no_traffic' // every arm has weight ≤ 0\n | 'negative_weight' // an arm has a negative weight\n | 'bad_winner' // a stopped experiment's winner isn't one of its variants\n | 'single_arm' // only one variant — nothing to test (warning)\n | 'orphan_variant' // a `@variant` page no running experiment renders (warning)\n message: string\n}\n\nexport interface ExperimentValidation {\n ok: boolean\n errors: ExperimentIssue[]\n warnings: ExperimentIssue[]\n}\n\n/**\n * Cross-check experiment records against the funnel's pages — the publish-time /\n * experiment-edit gate that catches the dangling references the runtime can't see\n * (the experiment wiring lives in the DB; the pages live in the build, so they can\n * drift). Pure: hand it the runtime experiments + the funnel's page keys (e.g.\n * `manifest.pages`).\n *\n * Errors block; warnings inform. `orphan_variant` is a warning, not an error — a\n * `@variant` file with no running experiment is dead-but-harmless (a paused test, or\n * one not wired yet).\n */\nexport function validateExperiments(\n experiments: RuntimeExperiment[],\n pages: { key: string }[],\n): ExperimentValidation {\n const errors: ExperimentIssue[] = []\n const warnings: ExperimentIssue[] = []\n const pageKeys = new Set(pages.map((p) => p.key))\n\n const seenIds = new Set<string>()\n const slotOwner = new Map<string, string>()\n const renderedVariantPages = new Set<string>() // arm pages that are `@variant`s\n\n for (const exp of experiments) {\n const err = (code: ExperimentIssue['code'], message: string) =>\n errors.push({ experimentId: exp.id, code, message })\n const warn = (code: ExperimentIssue['code'], message: string) =>\n warnings.push({ experimentId: exp.id, code, message })\n\n if (seenIds.has(exp.id)) err('duplicate_id', `Experiment id \"${exp.id}\" is used more than once.`)\n seenIds.add(exp.id)\n\n // Slot must be a real flow page (not missing, not itself a variant).\n if (!pageKeys.has(exp.slot)) err('slot_missing', `Slot \"${exp.slot}\" is not a page in the funnel.`)\n if (isVariantKey(exp.slot)) err('slot_is_variant', `Slot \"${exp.slot}\" is a variant page; a slot must be a real flow page.`)\n if (slotOwner.has(exp.slot)) {\n err('slot_conflict', `Slot \"${exp.slot}\" is already targeted by experiment \"${slotOwner.get(exp.slot)}\".`)\n } else {\n slotOwner.set(exp.slot, exp.id)\n }\n\n const arms = Object.entries(exp.variants)\n if (arms.length < 2) warn('single_arm', `Experiment \"${exp.id}\" has fewer than two variants — nothing to test.`)\n\n let hasControl = false\n let totalWeight = 0\n for (const [label, arm] of arms) {\n if (!pageKeys.has(arm.page)) {\n err('variant_page_missing', `Variant \"${label}\" references page \"${arm.page}\", which doesn't exist.`)\n }\n if (arm.page === exp.slot) hasControl = true\n else if (isVariantKey(arm.page)) {\n renderedVariantPages.add(arm.page)\n if (parseSlotKey(arm.page).slot !== exp.slot) {\n err('variant_slot_mismatch', `Variant \"${label}\" page \"${arm.page}\" belongs to a different slot than \"${exp.slot}\".`)\n }\n }\n if (arm.weight < 0) err('negative_weight', `Variant \"${label}\" has a negative weight (${arm.weight}).`)\n totalWeight += arm.weight\n }\n if (!hasControl) err('no_control', `No variant of \"${exp.id}\" renders the slot \"${exp.slot}\" itself (the control/baseline).`)\n if (totalWeight <= 0) err('no_traffic', `Experiment \"${exp.id}\" has no positive weight — no traffic would enter it.`)\n\n if (exp.status === 'stopped' && exp.winner && !exp.variants[exp.winner]) {\n err('bad_winner', `Stopped experiment \"${exp.id}\" names winner \"${exp.winner}\", which isn't one of its variants.`)\n }\n }\n\n // A `@variant` page that no running experiment renders is dead (but harmless).\n const running = new Set(experiments.filter((e) => (e.status ?? 'running') === 'running').flatMap((e) =>\n Object.values(e.variants).map((v) => v.page),\n ))\n for (const p of pages) {\n if (isVariantKey(p.key) && !running.has(p.key)) {\n warnings.push({ experimentId: '*', code: 'orphan_variant', message: `Variant page \"${p.key}\" is rendered by no running experiment.` })\n }\n }\n\n return { ok: errors.length === 0, errors, warnings }\n}\n","import {\n createContext,\n createElement,\n lazy,\n Suspense,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n useTransition,\n type ComponentType,\n type ReactNode,\n} from 'react'\nimport { useFunnel } from '../state/namespaces'\nimport { newEventId, useTrackerRef } from '../tracking/tracking'\nimport { entryGuard, evaluateGate, expectedPathLength, nextPage, outgoingKeys, type FlowPage, type PageMeta } from './spine'\nimport { bucketingSeed, resolveExperiments } from './experiments'\nimport type { PageContext } from '../state/context'\n\n/** What a page's `load` resolves to — a component, or a module default-exporting one. */\nexport type PageModule = ComponentType | { default: ComponentType }\n\n/**\n * A page wired into the runtime. Provide **either** an eager `Component` (small\n * funnels, tests) **or** a lazy `load` (code-split: the renderer hands a dynamic\n * `import()` so a big funnel ships one chunk per page, not the whole funnel).\n */\nexport interface RuntimePage {\n key: string\n meta?: PageMeta\n /** Eager component. Provide this or `load`. */\n Component?: ComponentType\n /** Lazy loader for a code-split chunk. Provide this or `Component`. */\n load?: () => Promise<PageModule>\n}\n\nexport interface NavigationState {\n /** The current page's read-only context (key, index, total, progress). */\n page: PageContext\n /** Advance via the current page's `next` predicate, else the linear next. */\n next: () => void\n /** Go to the previous page in history. */\n back: () => void\n /** Jump to a specific page key. */\n go: (key: string) => void\n /** Warm a page's code-split chunk ahead of navigation (e.g. on link hover). No-op for eager pages. */\n prefetch: (key: string) => void\n /**\n * The page keys the visitor could go to next, already resolved to the chunk that\n * would render (experiment variant applied). The **renderer** maps these to chunk\n * URLs and emits `<link rel=\"modulepreload\">` (the browser-native, non-executing,\n * SSR-able prefetch — see v0 `HeadlessFunnelRenderer`). The SDK's `load()`-based\n * `prefetch` is the fallback for mounts without a modulepreload manager.\n */\n nextCandidates: string[]\n canGoBack: boolean\n /**\n * True while a navigation's target page chunk is still resolving (a cold,\n * un-prefetched lazy chunk). The current page stays on screen during this window\n * (no Suspense-fallback flicker); read this to show a subtle \"working\" affordance\n * so a tapped button doesn't feel dead. Usually false/instant when the next chunk\n * was prefetched.\n */\n isNavigating: boolean\n}\n\nconst NavContext = createContext<NavigationState | null>(null)\n\n/** experiment id → the variant this visitor is bucketed into, for the live render. */\nconst ExperimentContext = createContext<Record<string, string>>({})\n\n/**\n * `const variant = useExperiment('welcome-headline')` — the variant key this\n * visitor is assigned in an experiment (`undefined` if not in one). Page-variant\n * swapping is automatic; this is for branching *within* a page or custom logging.\n */\nexport function useExperiment(id: string): string | undefined {\n return useContext(ExperimentContext)[id]\n}\n\n/**\n * Compute the read-only page context for a position in the flow. `total` is the\n * **expected** path length for the visitor's current answers (see\n * {@link expectedPathLength}) — not the raw file count — so progress reaches 100%\n * on whichever branch the funnel actually takes. Clamped so a visitor who jumped\n * past the traced path can't read above 100%.\n */\nfunction pageContextFor(\n currentKey: string,\n slug: string,\n index: number,\n total: number,\n startedAt: number,\n): PageContext {\n const denom = Math.max(total, index + 1)\n return {\n key: currentKey,\n slug,\n index,\n total: denom,\n progressPercentage: denom > 0 ? Math.min(100, Math.round(((index + 1) / denom) * 100)) : 0,\n startedAt,\n }\n}\n\n/**\n * Renders the funnel: shows the current page and drives navigation. `next()`\n * resolves the current page's `next` predicate against the live snapshot\n * (writable namespaces + read-only `context`), falling back to the linear next\n * page in file order (see {@link nextPage}).\n *\n * Auto-emits `funnel.start` on mount and `page.view` on each page change, and\n * keeps `context.page` in sync so predicates and `usePage()` see the live page.\n *\n * Pass a `layout` (a `{ children }` component) for **persistent chrome** — a\n * header, progress bar, background — rendered *inside* the nav context but\n * *outside* the page swap, so it mounts once and never remounts on navigation\n * (and can read `usePage`/`useNavigation`).\n *\n * Must live inside `<FunnelProvider>`.\n */\nexport function FunnelView({\n pages,\n initialKey,\n layout,\n fallback,\n prefetch: prefetchMode = 'auto',\n onNavigate,\n}: {\n pages: RuntimePage[]\n initialKey?: string\n layout?: ComponentType<{ children: ReactNode }>\n /** Shown in the page area while a lazy page's chunk loads (the layout persists around it). */\n fallback?: ReactNode\n /**\n * `'auto'` (default): the SDK warms next-likely chunks by calling `load()`.\n * `'off'`: the **renderer** owns prefetch (via `<link rel=\"modulepreload\">` over\n * `useNavigation().nextCandidates`) — avoids the redundant `load()` execution.\n */\n prefetch?: 'auto' | 'off'\n /**\n * Fires on every page change (incl. the initial page) with the current page key\n * + slug. The **renderer** uses it to sync the URL path (`history.replaceState`,\n * v0-style — funnel back is in-memory, not browser history). Fires for the\n * *resolved* page, so if an entry `guard` bounced a deep-link to the start, the\n * URL gets corrected.\n */\n onNavigate?: (key: string, slug: string) => void\n}): ReactNode {\n const funnel = useFunnel()\n const tracker = useTrackerRef()\n\n // Resolve each page to a renderable component: eager `Component` as-is, or a\n // stable `React.lazy` over `load` (memoized so the lazy element identity is\n // stable across renders → no remount). `loaders` keeps the raw `load` fns for\n // prefetch (dynamic import dedupes, so calling them early just warms the chunk).\n const components = useMemo(() => {\n const map = new Map<string, ComponentType>()\n for (const p of pages) {\n if (p.Component) map.set(p.key, p.Component)\n else if (p.load) {\n const load = p.load\n map.set(p.key, lazy(() => Promise.resolve(load()).then((m) =>\n typeof m === 'function' ? { default: m } : m,\n )))\n }\n }\n return map\n }, [pages])\n const loaders = useMemo(\n () => new Map(pages.filter((p) => p.load).map((p) => [p.key, p.load!])),\n [pages],\n )\n\n // Resolve page-level experiments once for this visitor: which variant of each\n // slot to show, and which variant pages drop out of the linear flow. Stable for\n // the render — the seed is the durable identity, memoized so a later\n // identification can't flip an in-progress visitor's variant.\n const seed = bucketingSeed(funnel.context)\n const experiments = useMemo(\n () => resolveExperiments(pages, funnel.experiments, seed),\n [pages, funnel.experiments, seed],\n )\n const pageByKey = useMemo(() => new Map(pages.map((p) => [p.key, p])), [pages])\n // The effective flow: anchors + standalone pages, in order (losers removed).\n const flowPages = useMemo<RuntimePage[]>(\n () => experiments.activeKeys.map((k) => pageByKey.get(k)!).filter(Boolean),\n [experiments, pageByKey],\n )\n\n // The flow as plain {key, meta} for routing + path-length tracing.\n const flow = useMemo<FlowPage[]>(\n () => flowPages.map((p) => ({ key: p.key, meta: p.meta })),\n [flowPages],\n )\n\n // Resolve the starting page. A deep-link / reload `initialKey` is honored only if\n // the page's entry `guard` passes against the (restored) snapshot — else fall\n // back to the start page. (In-funnel navigation never hits this; routing gated it.)\n const [history, setHistory] = useState<string[]>(() => {\n const start = flowPages[0]?.key\n if (!initialKey || initialKey === start) return [start].filter(Boolean) as string[]\n const target = experiments.slotOf[initialKey] ?? initialKey\n const page = flowPages.find((p) => p.key === target)\n // Effective guard = the page-type default (paywall/upsell need email) AND any\n // explicit meta.guard.\n const guard = entryGuard(page?.meta)\n const ok = page && (!guard || evaluateGate(guard, funnel.snapshot()))\n return [ok ? target : start].filter(Boolean) as string[]\n })\n const currentKey = history[history.length - 1]\n const index = history.length - 1\n const startKey = history[0]\n\n // Expected path length for the visitor's current answers — re-traced per\n // navigation so progress reaches 100% on whichever branch the funnel takes.\n const total = useMemo(\n () => expectedPathLength(flow, startKey, funnel.snapshot()),\n // currentKey in deps: re-trace as each step's answers settle the branch.\n [flow, startKey, currentKey, funnel],\n )\n\n // Keep the read-only context's `page` slice current so predicates + usePage see it.\n const slug = pageByKey.get(currentKey)?.meta?.slug ?? currentKey\n const page = useMemo(\n () => pageContextFor(currentKey, slug, index, total, funnel.context.system.now),\n [currentKey, slug, index, total, funnel.context.system.now],\n )\n // context.page is mutable internal state of the read-only namespace.\n funnel.context.page = page\n\n // funnel.start once, on mount.\n const started = useRef(false)\n useEffect(() => {\n if (started.current) return\n started.current = true\n tracker.track('funnel.start', {})\n }, [tracker])\n\n // page.view on every page change.\n useEffect(() => {\n if (!currentKey) return\n tracker.track('page.view', { pageId: currentKey, pageKey: currentKey, isInitial: index === 0, eventId: newEventId() })\n }, [tracker, currentKey, index])\n\n // Tell the renderer the live page (key + slug) so it can sync the URL path.\n useEffect(() => {\n if (currentKey && onNavigate) onNavigate(currentKey, slug)\n }, [onNavigate, currentKey, slug])\n\n // experiment.exposure the first time the visitor lands on an experiment slot.\n const exposed = useRef<Set<string>>(new Set())\n useEffect(() => {\n const expId = experiments.experimentOf[currentKey]\n if (!expId || exposed.current.has(expId)) return\n exposed.current.add(expId)\n tracker.track('experiment.exposure', { experimentId: expId, variant: experiments.assignments[expId] })\n }, [tracker, currentKey, experiments])\n\n // page.exit timing — wall-clock duration on a page, minus time the tab was\n // hidden (active engagement). Uses a real clock (effects only, never render).\n const timer = useRef<{ key: string; enteredAt: number; hidden: number; hiddenSince: number | null } | null>(null)\n const now = () => (typeof performance !== 'undefined' ? performance.now() : Date.now())\n const emitExit = useCallback(() => {\n const t = timer.current\n if (!t) return\n const at = now()\n const hidden = t.hidden + (t.hiddenSince != null ? at - t.hiddenSince : 0)\n const durationMs = Math.round(at - t.enteredAt)\n tracker.track('page.exit', { pageId: t.key, durationMs, activeMs: Math.max(0, Math.round(durationMs - hidden)) })\n }, [tracker])\n\n // Track tab visibility so `activeMs` excludes backgrounded time.\n useEffect(() => {\n if (typeof document === 'undefined') return\n const onVis = () => {\n const t = timer.current\n if (!t) return\n if (document.visibilityState === 'hidden') t.hiddenSince = now()\n else if (t.hiddenSince != null) {\n t.hidden += now() - t.hiddenSince\n t.hiddenSince = null\n }\n }\n document.addEventListener('visibilitychange', onVis)\n return () => document.removeEventListener('visibilitychange', onVis)\n }, [])\n\n // On each page change emit page.exit for the page being left, then start the\n // new page's timer. The final page's exit fires on unmount.\n useEffect(() => {\n if (!currentKey) return\n if (timer.current && timer.current.key !== currentKey) emitExit()\n const hidden = typeof document !== 'undefined' && document.visibilityState === 'hidden'\n timer.current = { key: currentKey, enteredAt: now(), hidden: 0, hiddenSince: hidden ? now() : null }\n }, [currentKey, emitExit])\n\n useEffect(() => () => emitExit(), [emitExit])\n\n // Navigation swaps a code-split page (a lazy chunk). Wrap the history update in a\n // transition so React keeps the CURRENT page on screen until the next page's chunk\n // is ready, instead of flashing the Suspense `fallback` (the inter-page flicker).\n // `isNavigating` is true while a cold chunk resolves → show a \"working\" affordance\n // so the button doesn't feel dead. Prefetch makes this window usually invisible.\n const [isNavigating, startNav] = useTransition()\n const next = useCallback(() => {\n // Route over the effective flow (slots); the slot page's `meta.next` governs\n // routing. Remap any target that points at a collapsed variant key to its slot.\n const target = nextPage(flow, currentKey, funnel.snapshot())\n const resolved = target ? experiments.slotOf[target] ?? target : target\n if (resolved) startNav(() => setHistory((h) => [...h, resolved]))\n }, [flow, currentKey, funnel, experiments])\n\n const back = useCallback(\n () => startNav(() => setHistory((h) => (h.length > 1 ? h.slice(0, -1) : h))),\n [],\n )\n const go = useCallback(\n (key: string) => startNav(() => setHistory((h) => [...h, experiments.slotOf[key] ?? key])),\n [experiments],\n )\n\n // Warm a slot's code-split chunk (the variant that would actually render). Idempotent.\n const prefetched = useRef<Set<string>>(new Set())\n const prefetch = useCallback(\n (key: string) => {\n const target = experiments.render[key] ?? key\n const load = loaders.get(target)\n if (!load || prefetched.current.has(target)) return\n prefetched.current.add(target)\n load().catch(() => prefetched.current.delete(target)) // let a failed load retry later\n },\n [loaders, experiments],\n )\n\n // The next-likely pages, resolved to the chunk that would actually render\n // (experiment variant applied) — the renderer modulepreloads these.\n const nextCandidates = useMemo(\n () => [...new Set(outgoingKeys(flow, currentKey).map((k) => experiments.render[k] ?? k))],\n [flow, currentKey, experiments],\n )\n\n // 'auto' mode: warm those chunks by calling load(). 'off': the renderer owns it.\n useEffect(() => {\n if (prefetchMode !== 'auto') return\n for (const key of nextCandidates) prefetch(key)\n }, [prefetchMode, nextCandidates, prefetch])\n\n const value: NavigationState = {\n page,\n next,\n back,\n go,\n prefetch,\n nextCandidates,\n canGoBack: history.length > 1,\n isNavigating,\n }\n // Render the assigned variant's component at the current slot (the anchor key\n // stays the flow position; only the component swaps). Lazy pages suspend, so the\n // page area shows `fallback` while the chunk loads — inside the layout, so the\n // persistent chrome stays put.\n const renderKey = experiments.render[currentKey] ?? currentKey\n const Current = components.get(renderKey)\n const pageEl = createElement(Suspense, { fallback: fallback ?? null }, Current ? createElement(Current) : null)\n // The layout wraps the page inside NavContext → it persists across navigation\n // (same element type, only the page child swaps) and can use nav/funnel hooks.\n const content = layout ? createElement(layout, null, pageEl) : pageEl\n\n return createElement(\n ExperimentContext.Provider,\n { value: experiments.assignments },\n createElement(NavContext.Provider, { value }, content),\n )\n}\n\n/** `const { next, back, go, page } = useNavigation()`. */\nexport function useNavigation(): NavigationState {\n const ctx = useContext(NavContext)\n if (!ctx) throw new Error('useNavigation must be used inside <FunnelView>')\n return ctx\n}\n\n/** `usePage()` — the current page's read-only context, reactive to navigation. */\nexport function usePage(): PageContext {\n return useNavigation().page\n}\n","/**\n * Imperative, promise-based modal registry — our trimmed adaptation of\n * eBay's `@ebay/nice-modal-react` (MIT). The model: a module-level registry +\n * a reducer-backed store, so any code can `showModal(MyModal)` from anywhere\n * (no prop-drilling, no rendering the modal where you trigger it) and get back a\n * **promise** that resolves when the modal calls `resolve()` — perfect for\n * confirm/upsell/detail flows.\n *\n * Every modal is keyed by a **stable id**, which also makes it natural to bind\n * analytics later (open/close per id, like pages).\n *\n * Pair it with the controlled chrome in {@link ./overlay}: a `defineModal`\n * component renders a `<Sheet open={m.visible} onClose={m.hide}>`/`<Modal>`.\n * The runtime ({@link ./namespaces}.FunnelProvider) mounts {@link ModalRoot} for\n * you, so there's no provider to wire.\n *\n * Trimmed vs upstream: dropped the antd/mui/bootstrap binding adapters and the\n * standalone `<Provider>` (folded into the funnel runtime).\n */\n\nimport {\n createContext,\n createElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n type ComponentType,\n type Dispatch,\n type ReactNode,\n} from 'react'\n\n// ── State ────────────────────────────────────────────────\n\nexport interface ModalState {\n id: string\n args?: Record<string, unknown>\n visible?: boolean\n delayVisible?: boolean\n keepMounted?: boolean\n}\nexport interface ModalStore {\n [id: string]: ModalState\n}\ninterface ModalAction {\n type: 'show' | 'hide' | 'remove' | 'set-flags'\n payload: { modalId: string; args?: Record<string, unknown>; flags?: Record<string, unknown> }\n}\ninterface ModalCallbacks {\n [id: string]: { resolve: (v: unknown) => void; reject: (v: unknown) => void; promise: Promise<unknown> }\n}\n\n/** The handle `useModal()` returns to control one modal. */\nexport interface ModalHandler<Props = Record<string, unknown>> {\n id: string\n args?: Record<string, unknown>\n visible: boolean\n keepMounted: boolean\n show: (args?: Props) => Promise<unknown>\n hide: () => Promise<unknown>\n remove: () => void\n /** Resolve the promise returned by `show()` (e.g. a confirm result). */\n resolve: (value?: unknown) => void\n /** Reject the promise returned by `show()`. */\n reject: (value?: unknown) => void\n /** Resolve the promise returned by `hide()` (after a close transition). */\n resolveHide: (value?: unknown) => void\n}\n\n// ── Module-level registry + dispatch ─────────────────────\n\nconst symModalId = Symbol('AppFunnelModalId')\nconst initialState: ModalStore = {}\nconst ModalStateContext = createContext<ModalStore>(initialState)\nconst ModalIdContext = createContext<string | null>(null)\n\nconst REGISTRY: { [id: string]: { comp: ComponentType<any>; props?: Record<string, unknown> } } = {}\nconst ALREADY_MOUNTED: Record<string, boolean> = {}\nconst modalCallbacks: ModalCallbacks = {}\nconst hideCallbacks: ModalCallbacks = {}\n\nlet uid = 0\nconst getUid = () => `_af_modal_${uid++}`\n\nlet dispatch: Dispatch<ModalAction> = () => {\n throw new Error('No modal dispatch — render inside <FunnelProvider> (which mounts the modal runtime).')\n}\n\nexport const modalReducer = (state: ModalStore = initialState, action: ModalAction): ModalStore => {\n const { modalId, args, flags } = action.payload\n switch (action.type) {\n case 'show':\n return {\n ...state,\n [modalId]: {\n ...state[modalId],\n id: modalId,\n args,\n // Mount first, then flip visible on the next effect → enter transition.\n visible: !!ALREADY_MOUNTED[modalId],\n delayVisible: !ALREADY_MOUNTED[modalId],\n },\n }\n case 'hide':\n return state[modalId] ? { ...state, [modalId]: { ...state[modalId], visible: false } } : state\n case 'remove': {\n const next = { ...state }\n delete next[modalId]\n return next\n }\n case 'set-flags':\n return { ...state, [modalId]: { ...state[modalId], ...flags } }\n default:\n return state\n }\n}\n\nfunction idOf(modal: string | ComponentType<any>): string {\n if (typeof modal === 'string') return modal\n const m = modal as ComponentType<any> & { [symModalId]?: string }\n if (!m[symModalId]) m[symModalId] = getUid()\n return m[symModalId] as string\n}\n\n// ── Imperative API (callable from anywhere) ──────────────\n\n/** Register a component as an id-keyed modal so the placeholder can render it. */\nexport function registerModal(id: string, comp: ComponentType<any>, props?: Record<string, unknown>): void {\n if (!REGISTRY[id]) REGISTRY[id] = { comp, props }\n else REGISTRY[id].props = props\n}\n\nexport function unregisterModal(id: string): void {\n delete REGISTRY[id]\n}\n\n/** Show a modal (by component or id). Returns a promise resolved by `resolve()`. */\nexport function showModal<T = unknown>(modal: string | ComponentType<any>, args?: Record<string, unknown>): Promise<T> {\n const id = idOf(modal)\n if (typeof modal !== 'string' && !REGISTRY[id]) registerModal(id, modal)\n dispatch({ type: 'show', payload: { modalId: id, args } })\n if (!modalCallbacks[id]) {\n let res!: (v: unknown) => void\n let rej!: (v: unknown) => void\n const promise = new Promise<unknown>((resolve, reject) => {\n res = resolve\n rej = reject\n })\n modalCallbacks[id] = { resolve: res, reject: rej, promise }\n }\n return modalCallbacks[id].promise as Promise<T>\n}\n\n/** Hide a modal. Returns a promise resolved by `resolveHide()` (post-transition). */\nexport function hideModal<T = unknown>(modal: string | ComponentType<any>): Promise<T> {\n const id = idOf(modal)\n dispatch({ type: 'hide', payload: { modalId: id } })\n delete modalCallbacks[id]\n if (!hideCallbacks[id]) {\n let res!: (v: unknown) => void\n let rej!: (v: unknown) => void\n const promise = new Promise<unknown>((resolve, reject) => {\n res = resolve\n rej = reject\n })\n hideCallbacks[id] = { resolve: res, reject: rej, promise }\n }\n return hideCallbacks[id].promise as Promise<T>\n}\n\n/** Remove a modal from the tree (frees its state; better than just hiding). */\nexport function removeModal(modal: string | ComponentType<any>): void {\n const id = idOf(modal)\n dispatch({ type: 'remove', payload: { modalId: id } })\n delete modalCallbacks[id]\n delete hideCallbacks[id]\n}\n\nfunction setFlags(id: string, flags: Record<string, unknown>): void {\n dispatch({ type: 'set-flags', payload: { modalId: id, flags } })\n}\n\n// ── Hook ─────────────────────────────────────────────────\n\nexport function useModal(): ModalHandler\nexport function useModal(modal: string, args?: Record<string, unknown>): ModalHandler\nexport function useModal<P extends object>(modal: ComponentType<P>, args?: Partial<P>): ModalHandler<P>\nexport function useModal(modal?: string | ComponentType<any>, args?: Record<string, unknown>): ModalHandler {\n const modals = useContext(ModalStateContext)\n const contextId = useContext(ModalIdContext)\n const isComponent = !!modal && typeof modal !== 'string'\n const id = modal ? idOf(modal) : contextId\n if (!id) throw new Error('useModal: no modal id (call inside a defineModal component, or pass an id/component).')\n\n useEffect(() => {\n if (isComponent && !REGISTRY[id]) registerModal(id, modal as ComponentType<any>, args)\n }, [isComponent, id, modal, args])\n\n const info = modals[id]\n const show = useCallback((a?: Record<string, unknown>) => showModal(id, a), [id])\n const hide = useCallback(() => hideModal(id), [id])\n const remove = useCallback(() => removeModal(id), [id])\n const resolve = useCallback((v?: unknown) => {\n modalCallbacks[id]?.resolve(v)\n delete modalCallbacks[id]\n }, [id])\n const reject = useCallback((v?: unknown) => {\n modalCallbacks[id]?.reject(v)\n delete modalCallbacks[id]\n }, [id])\n const resolveHide = useCallback((v?: unknown) => {\n hideCallbacks[id]?.resolve(v)\n delete hideCallbacks[id]\n }, [id])\n\n return useMemo(\n () => ({\n id,\n args: info?.args,\n visible: !!info?.visible,\n keepMounted: !!info?.keepMounted,\n show,\n hide,\n remove,\n resolve,\n reject,\n resolveHide,\n }),\n [id, info?.args, info?.visible, info?.keepMounted, show, hide, remove, resolve, reject, resolveHide],\n )\n}\n\n// ── defineModal (HOC) ────────────────────────────────────\n\nexport interface ModalHocProps {\n id: string\n defaultVisible?: boolean\n keepMounted?: boolean\n}\n\n/**\n * Wrap a component into an id-keyed modal. Inside it, `useModal()` (no args)\n * gives the handle. Render a controlled `<Sheet>`/`<Modal>` with\n * `open={m.visible} onClose={m.hide}`.\n */\nexport function defineModal<P extends object>(Comp: ComponentType<P>): ComponentType<P & ModalHocProps> {\n return function Wrapped({ id, defaultVisible, keepMounted, ...props }: P & ModalHocProps): ReactNode {\n const { args, show } = useModal(id)\n const modals = useContext(ModalStateContext)\n const shouldMount = !!modals[id]\n\n useEffect(() => {\n if (defaultVisible) show()\n ALREADY_MOUNTED[id] = true\n return () => {\n delete ALREADY_MOUNTED[id]\n }\n }, [id, show, defaultVisible])\n\n useEffect(() => {\n if (keepMounted) setFlags(id, { keepMounted: true })\n }, [id, keepMounted])\n\n const delayVisible = modals[id]?.delayVisible\n useEffect(() => {\n if (delayVisible) show(args)\n }, [delayVisible, args, show])\n\n if (!shouldMount) return null\n return createElement(\n ModalIdContext.Provider,\n { value: id },\n createElement(Comp, { ...(props as P), ...args }),\n )\n }\n}\n\n// ── Runtime (mounted by FunnelProvider) ──────────────────\n\n/** Renders every visible registered modal. Mounted once by the funnel runtime. */\nexport function ModalRoot(): ReactNode {\n const modals = useContext(ModalStateContext)\n const toRender = Object.keys(modals)\n .filter((id) => REGISTRY[id])\n .map((id) => ({ id, ...REGISTRY[id] }))\n return createElement(\n 'div',\n { 'data-appfunnel-modal-root': '' },\n ...toRender.map((t) => createElement(t.comp, { key: t.id, id: t.id, ...t.props })),\n )\n}\n\n/**\n * Provides the modal store + sets the module dispatch + renders {@link ModalRoot}.\n * Wrapped around the funnel tree by `FunnelProvider`.\n */\nexport function ModalRuntime({ children }: { children: ReactNode }): ReactNode {\n const [state, localDispatch] = useReducer(modalReducer, initialState)\n dispatch = localDispatch\n return createElement(\n ModalStateContext.Provider,\n { value: state },\n children,\n createElement(ModalRoot, null),\n )\n}\n","/**\n * Raw, **controlled** overlay chrome — `<Sheet>` (a drawer) and `<Modal>` (a\n * centered dialog). Headless and styleable (className/portal/dismiss), the same\n * two-tier contract as `<Choice>`: thin wrappers you restyle or eject.\n *\n * These are the presentation layer. For *imperative*, promise-based modals\n * triggered from anywhere, wrap one in `defineModal` and `showModal(...)`\n * (see {@link ./modals}) — that registry drives these controlled primitives.\n * They're also used directly (no registry) where local state is simpler, e.g.\n * the checkout `sheet` surface.\n *\n * Deliberately minimal: portal to `document.body`, lock body scroll while open,\n * dismiss on Escape / backdrop. No animation engine, no focus-trap dependency.\n */\n\nimport {\n createElement,\n useEffect,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { useModal } from './registry'\n\nexport type SheetSide = 'bottom' | 'top' | 'left' | 'right'\n\n/**\n * `<Sheet>`/`<Modal>` bind themselves to the surrounding {@link defineModal} via\n * its context — so inside a modal you write just `<Sheet>…</Sheet>`, with no\n * open/onClose plumbing. They are therefore **only valid inside a `defineModal`**\n * (rendered through `showModal`); used anywhere else `useModal()` throws, which\n * is the correct signal. For an overlay driven by local state, wrap it in a\n * `defineModal` and `showModal` it — that's the one overlay path.\n */\nfunction useModalControl(): { open: boolean; onClose: () => void } {\n const m = useModal()\n return {\n open: m.visible,\n onClose: () => {\n m.hide()\n m.resolveHide()\n if (!m.keepMounted) m.remove()\n },\n }\n}\n\ninterface OverlayCommon {\n className?: string\n backdropClassName?: string\n dismissOnBackdrop?: boolean\n ariaLabel?: string\n children: ReactNode\n}\n\ninterface ShellProps {\n open: boolean\n onClose: () => void\n className?: string\n backdropClassName?: string\n dismissOnBackdrop?: boolean\n ariaLabel?: string\n /** Flexbox alignment of the panel within the viewport. */\n container: Pick<CSSProperties, 'justifyContent' | 'alignItems'>\n /** Panel layout (size + corners per variant). */\n panel: CSSProperties\n children: ReactNode\n}\n\n/** Shared overlay shell: portal, backdrop, scroll-lock, Escape — variant-agnostic. */\nfunction OverlayShell({\n open,\n onClose,\n className,\n backdropClassName,\n dismissOnBackdrop = true,\n ariaLabel,\n container,\n panel,\n children,\n}: ShellProps): ReactNode {\n useEffect(() => {\n if (!open || typeof document === 'undefined') return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n document.addEventListener('keydown', onKey)\n return () => {\n document.body.style.overflow = prev\n document.removeEventListener('keydown', onKey)\n }\n }, [open, onClose])\n\n if (!open || typeof document === 'undefined') return null\n\n const overlay = createElement(\n 'div',\n {\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': ariaLabel,\n 'data-appfunnel-overlay': '',\n style: { position: 'fixed', inset: 0, zIndex: 1000, display: 'flex', ...container },\n },\n createElement('div', {\n 'data-appfunnel-overlay-backdrop': '',\n className: backdropClassName,\n onClick: dismissOnBackdrop ? onClose : undefined,\n style: { position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.5)' },\n }),\n createElement(\n 'div',\n { 'data-appfunnel-overlay-panel': '', className, style: { position: 'relative', background: '#fff', ...panel } },\n children,\n ),\n )\n\n return createPortal(overlay, document.body)\n}\n\nexport type SheetProps = OverlayCommon & {\n /** Edge the drawer slides from (default `bottom`). */\n side?: SheetSide\n}\n\nconst SHEET_LAYOUT: Record<SheetSide, { container: ShellProps['container']; panel: CSSProperties }> = {\n bottom: { container: { justifyContent: 'flex-end', alignItems: 'stretch' }, panel: { borderTopLeftRadius: 16, borderTopRightRadius: 16, padding: 16, maxHeight: '90vh', overflow: 'auto' } },\n top: { container: { justifyContent: 'flex-start', alignItems: 'stretch' }, panel: { borderBottomLeftRadius: 16, borderBottomRightRadius: 16, padding: 16, maxHeight: '90vh', overflow: 'auto' } },\n left: { container: { justifyContent: 'flex-start', alignItems: 'stretch' }, panel: { height: '100%', width: 'min(420px, 90vw)', padding: 16, overflow: 'auto' } },\n right: { container: { justifyContent: 'flex-end', alignItems: 'stretch' }, panel: { height: '100%', width: 'min(420px, 90vw)', padding: 16, overflow: 'auto' } },\n}\n\n/**\n * An edge-anchored drawer. Inside a `defineModal` it auto-binds — `<Sheet>…`;\n * outside one, control it with `open`/`onClose`.\n */\nexport function Sheet(props: SheetProps): ReactNode {\n const control = useModalControl()\n const layout = SHEET_LAYOUT[props.side ?? 'bottom']\n return createElement(OverlayShell, {\n ...control,\n className: props.className,\n backdropClassName: props.backdropClassName,\n dismissOnBackdrop: props.dismissOnBackdrop,\n ariaLabel: props.ariaLabel,\n container: layout.container,\n panel: layout.panel,\n children: props.children,\n })\n}\n\nexport type ModalProps = OverlayCommon\n\n/** A centered dialog. Auto-binds to its `defineModal` — `<Modal>…`. */\nexport function Modal(props: ModalProps): ReactNode {\n const control = useModalControl()\n return createElement(OverlayShell, {\n ...control,\n className: props.className,\n backdropClassName: props.backdropClassName,\n dismissOnBackdrop: props.dismissOnBackdrop,\n ariaLabel: props.ariaLabel,\n container: { justifyContent: 'center', alignItems: 'center' },\n panel: { borderRadius: 16, padding: 24, width: 'min(480px, 92vw)', maxHeight: '90vh', overflow: 'auto' },\n children: props.children,\n })\n}\n","/**\n * v2 commerce primitives — the two intents from phase-3, made trivial.\n *\n * - `<Checkout product surface>` — the **purchase** primitive. The `surface`\n * prop picks presentation; some surfaces render **inline** (express wallets,\n * inline card, provider iframe), some **open on click** (sheet/popup/redirect).\n * `<Checkout>` covers both: it renders inline surfaces and renders a trigger\n * button for the rest (`asChild` to use your own button).\n * - `<Upsell product>` — the **upsell** primitive. Off-session charge to the\n * saved method, no card re-entry, one tap.\n * - `useCheckout()` — the headless hook under both, always available for a\n * fully-custom CTA.\n *\n * The SDK never talks to a provider. It owns the state machine + the analytics\n * (`checkout.start` / `purchase.complete`) + post-charge navigation, and\n * delegates the actual charge/render to an injected {@link CheckoutDriver}\n * (the real one is platform-side; tests use {@link createMockDriver}).\n *\n * Which product is charged is the author's bound variable, captured at render\n * (inline surfaces) or at `open()` time (trigger surfaces).\n */\n\nimport {\n createContext,\n createElement,\n isValidElement,\n cloneElement,\n useCallback,\n useContext,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useTrackerRef } from '../tracking/tracking'\nimport { useNavigation } from '../flow/flow'\nimport { Sheet } from '../modals/sheet'\nimport { defineModal, useModal, showModal } from '../modals/registry'\n\n// ── Surfaces, providers, capability matrix ───────────────\n\nexport type CheckoutSurface =\n | 'express' // wallet quick-buttons (Apple/Google Pay) — inline\n | 'element' // inline card form — inline\n | 'embedded' // provider-managed inline checkout — inline\n | 'sheet' // bottom-sheet popup — opens on click\n | 'popup' // provider-hosted overlay — opens on click\n | 'redirect' // provider-hosted page — opens on click\n\nexport type CheckoutProvider = 'stripe' | 'paddle' | 'whop' | 'primer' | 'solidgate'\nexport type CheckoutIntent = 'purchase' | 'upsell'\n\n/** Surfaces that render inline (vs. those that open on click). */\nexport const INLINE_SURFACES: ReadonlySet<CheckoutSurface> = new Set<CheckoutSurface>([\n 'express',\n 'element',\n 'embedded',\n])\n\nexport function isInlineSurface(surface: CheckoutSurface): boolean {\n return INLINE_SURFACES.has(surface)\n}\n\n/**\n * The kind of off-session upsell (researched against Funnelfox's changelog, which\n * ships these as distinct features). The discriminating real-world constraint is\n * **stacking a 2nd concurrent subscription** — Paddle can't, SolidGate/Stripe can.\n */\nexport type UpsellKind =\n | 'subscription' // charge a NEW, 2nd concurrent subscription off-session (stacking)\n | 'one-time' // charge a one-time add-on off-session\n | 'upgrade' // change the existing subscription's plan\n\n/** Reliability of an off-session upsell charge AFTER a purchase on a surface. */\nexport type OffSessionReliability =\n | 'reliable' // we hold the saved method (Stripe Elements / SolidGate / Primer) or the provider charges it (Paddle / Whop API)\n | 'conditional' // possible but may decline — Stripe **managed** checkout: the upsell is a direct off-session charge against Stripe's vaulted card (SCA / setup_future_usage not guaranteed)\n | 'none'\n\nexport interface SurfaceCapability {\n purchase: boolean\n /** Apple/Google Pay available on this surface. */\n wallets: boolean\n /** Reliability of an off-session upsell after a purchase on this surface. */\n offSession: OffSessionReliability\n}\n\nexport interface ProviderProfile {\n /** Merchant-of-Record (handles tax/compliance) vs. a PSP you settle through. */\n isMoR: boolean\n /** Upsell kinds this provider can charge off-session (one-click, no re-entry). */\n offSessionUpsells: UpsellKind[]\n /** Who charges the saved method off-session: you (PSP) or the provider (MoR/managed). */\n tokenModel: 'merchant' | 'provider'\n /** Routes across multiple processors (Primer; SolidGate also offers this) vs. a single acquirer. */\n orchestrator: boolean\n /** Supported surfaces → per-surface capabilities. **Absent = not supported.** */\n surfaces: Partial<Record<CheckoutSurface, SurfaceCapability>>\n}\n\n/** Reliable off-session after this surface (we/the provider hold a chargeable method). */\nconst ON: SurfaceCapability = { purchase: true, wallets: true, offSession: 'reliable' }\n/** Stripe-managed checkout: a purchase works, but the off-session upsell may decline. */\nconst MANAGED: SurfaceCapability = { purchase: true, wallets: true, offSession: 'conditional' }\nconst ALL_UPSELLS: UpsellKind[] = ['subscription', 'one-time', 'upgrade']\n\n/**\n * Provider capabilities (researched 2026-06-23 against provider docs + Funnelfox).\n *\n * Three real-world corrections to the naive model:\n * 1. **Off-session upsell support is per-provider by *kind*** (`offSessionUpsells`):\n * Paddle can't stack a 2nd concurrent subscription (upgrade + one-time only);\n * Stripe/SolidGate/Whop/Primer can do all kinds.\n * 2. **Off-session *reliability* varies by the paywall surface** (`SurfaceCapability.\n * offSession`): Stripe **managed** checkout (`embedded`/`redirect`) upsells as a\n * direct charge against Stripe's vault → `conditional` (may decline); Elements\n * surfaces are `reliable`.\n * 3. **Surface availability is a hard constraint.** MoR/managed providers can't\n * expose a raw card field to your own UI: Paddle has no `express`/`element`/your\n * `sheet`; Whop has no raw `element`/`express`; Primer has no hosted `redirect`;\n * Stripe/SolidGate have no `popup`. A missing entry means \"not possible.\"\n */\nexport const PROVIDER_PROFILES: Record<CheckoutProvider, ProviderProfile> = {\n // PSP; you hold the PaymentMethod and fire your own off-session PaymentIntent on\n // the Elements surfaces (reliable). **Managed** Checkout (`embedded`/`redirect`)\n // upsells too, but as a direct charge against Stripe's vaulted card → conditional.\n // No provider \"popup\" surface.\n stripe: {\n isMoR: false, offSessionUpsells: ALL_UPSELLS, tokenModel: 'merchant', orchestrator: false,\n surfaces: { express: ON, element: ON, sheet: ON, embedded: MANAGED, redirect: MANAGED },\n },\n // Merchant-of-Record; card entry is always Paddle's frame → no own element/sheet/\n // express. Off-session via subscription one-time charge / collection_mode, but\n // **no 2nd concurrent subscription** (upgrade + one-time only), provider-initiated.\n paddle: {\n isMoR: true, offSessionUpsells: ['one-time', 'upgrade'], tokenModel: 'provider', orchestrator: false,\n surfaces: { embedded: ON, popup: ON, redirect: ON },\n },\n // Merchant-of-Record; iframe-only (no raw card field). Off-session works\n // (provider-initiated, async via webhooks). `sheet` = our chrome hosting their embed.\n whop: {\n isMoR: true, offSessionUpsells: ALL_UPSELLS, tokenModel: 'provider', orchestrator: false,\n surfaces: { embedded: ON, redirect: ON, sheet: ON },\n },\n // Pure orchestrator (PSP-side); Headless renders express/element/sheet/embedded.\n // No hosted redirect page, no popup checkout. Off-session is PSP-conditional.\n primer: {\n isMoR: false, offSessionUpsells: ALL_UPSELLS, tokenModel: 'merchant', orchestrator: true,\n surfaces: { express: ON, element: ON, sheet: ON, embedded: ON },\n },\n // PSP **and** orchestrator (own acquiring + connectors routing across Stripe/Adyen/\n // PayPal). One Payment Form (element/sheet/embedded) + hosted page + wallet button.\n // Strong native off-session (Recurring API). No popup.\n solidgate: {\n isMoR: false, offSessionUpsells: ALL_UPSELLS, tokenModel: 'merchant', orchestrator: true,\n surfaces: { express: ON, element: ON, sheet: ON, embedded: ON, redirect: ON },\n },\n}\n\nexport interface ValidationResult {\n ok: boolean\n reason?: string\n /** Non-fatal caveat (e.g. Paddle upgrade-only). */\n note?: string\n}\n\n/** Surfaces a provider supports, for the editor/AI to steer authors. */\nexport function surfacesFor(provider: CheckoutProvider): CheckoutSurface[] {\n return Object.keys(PROVIDER_PROFILES[provider]?.surfaces ?? {}) as CheckoutSurface[]\n}\n\n/** Whether a provider is a Merchant of Record (it owns tax/compliance). */\nexport function isMerchantOfRecord(provider: CheckoutProvider): boolean {\n return PROVIDER_PROFILES[provider]?.isMoR ?? false\n}\n\n/** Whether a provider routes across multiple processors (Primer, SolidGate). */\nexport function isOrchestrator(provider: CheckoutProvider): boolean {\n return PROVIDER_PROFILES[provider]?.orchestrator ?? false\n}\n\n/**\n * Validate a (provider, surface) for a **purchase**: the surface must exist for\n * the provider and accept a payment. Surface availability is the real constraint\n * (e.g. Paddle has no `element`).\n */\nexport function validateCheckout(provider: CheckoutProvider, surface: CheckoutSurface): ValidationResult {\n const cap = PROVIDER_PROFILES[provider]?.surfaces[surface]\n if (!cap) return { ok: false, reason: `${provider} has no '${surface}' surface` }\n return cap.purchase ? { ok: true } : { ok: false, reason: `'${surface}' can't take a purchase on ${provider}` }\n}\n\n/**\n * Validate an **off-session upsell** of `kind` after a purchase made on\n * `paywallSurface`. Combines provider support for the kind (Paddle can't stack a\n * 2nd subscription) with the paywall surface's off-session reliability (Stripe\n * managed checkout is `conditional` — returned as a `note`, not a hard block).\n */\nexport function validateUpsell(\n provider: CheckoutProvider,\n paywallSurface: CheckoutSurface,\n kind: UpsellKind = 'subscription',\n): ValidationResult {\n const profile = PROVIDER_PROFILES[provider]\n if (!profile) return { ok: false, reason: `unknown provider '${provider}'` }\n if (!profile.offSessionUpsells.includes(kind)) {\n const can = profile.offSessionUpsells.length ? ` (it supports: ${profile.offSessionUpsells.join(', ')})` : ''\n return { ok: false, reason: `${provider} can't charge a '${kind}' upsell off-session${can}` }\n }\n const cap = profile.surfaces[paywallSurface]\n if (!cap) return { ok: false, reason: `${provider} has no '${paywallSurface}' surface to upsell after` }\n if (cap.offSession === 'none') {\n return { ok: false, reason: `a purchase on '${paywallSurface}' retains no chargeable method for an upsell` }\n }\n if (cap.offSession === 'conditional') {\n return { ok: true, note: `off-session upsell after ${provider} '${paywallSurface}' (managed checkout) may decline — prefer element/sheet/express` }\n }\n return { ok: true }\n}\n\n// ── Driver seam ──────────────────────────────────────────\n\nexport type CheckoutStatus = 'idle' | 'loading' | 'requires_action' | 'success' | 'error'\n\nexport interface CheckoutRequest {\n product: string\n intent: CheckoutIntent\n surface?: CheckoutSurface\n /** For `upsell` intent — which kind of off-session charge (default `subscription`). */\n kind?: UpsellKind\n}\n\n/**\n * Normalized failure category — the driver/platform maps each provider's decline\n * codes into one of these so funnels can route/recover by reason. `authentication_\n * required` (3DS/SCA) and `requires_payment_method` are the cases an **off-session**\n * upsell can't satisfy → recover on-session (re-collect a card).\n */\nexport type CheckoutErrorCategory =\n | 'card_declined'\n | 'insufficient_funds'\n | 'expired_card'\n | 'authentication_required' // SCA/3DS needed — off-session can't challenge\n | 'requires_payment_method' // no usable saved method\n | 'processing_error'\n | 'canceled'\n | 'unknown'\n\nexport interface CheckoutError {\n category: CheckoutErrorCategory\n message: string\n /** Raw provider decline code, if any (e.g. Stripe `card_declined`/`insufficient_funds`). */\n declineCode?: string\n /** Whether re-attempting (e.g. an on-session re-collection) may succeed. */\n retryable: boolean\n}\n\n/** Build a {@link CheckoutError} (driver/test helper). */\nexport function checkoutError(\n category: CheckoutErrorCategory,\n message: string,\n extra: { declineCode?: string; retryable?: boolean } = {},\n): CheckoutError {\n const retryable = extra.retryable ?? (category === 'authentication_required' || category === 'requires_payment_method' || category === 'processing_error')\n return { category, message, declineCode: extra.declineCode, retryable }\n}\n\nexport interface CheckoutResult {\n ok: boolean\n error?: CheckoutError\n /** Charged amount in minor units (for the purchase event). */\n amountMinor?: number\n currency?: string\n /**\n * The **server-minted** dedup id for the purchase event — the platform creates it\n * when the charge settles and fires CAPI with it; the SDK emits `purchase.complete`\n * with the same id so the browser pixel dedupes against the server. (Server is the\n * source of truth for payment events; the SDK doesn't mint these.)\n */\n eventId?: string\n}\n\nexport interface CheckoutCallbacks {\n onSuccess: (result: CheckoutResult) => void\n onError: (error: CheckoutError) => void\n /**\n * The inline surface reports a valid payment method was entered (e.g. Stripe's\n * Payment Element became `complete`), before the charge. Drives the\n * `checkout.payment_added` analytics step; optional — drivers that can't observe\n * it (or off-session charges) simply never call it.\n */\n onPaymentAdded?: () => void\n}\n\n/**\n * The provider seam. The platform injects the real one (Stripe/Paddle/Whop/…);\n * tests use {@link createMockDriver}.\n *\n * Most providers ship their **own React SDK** (`@stripe/react-stripe-js`,\n * `@paddle/paddle-js`, Primer's React components, …). A driver's `renderInline`\n * returns exactly that: the provider's React element mounted in our chrome (inline,\n * or inside the `<Sheet>`). Those provider SDKs live in the **driver/platform**\n * package, not our core funnel SDK — which is why the driver is injected: the core\n * stays lean and provider-agnostic, and you only pull the SDK for the provider you use.\n */\nexport interface CheckoutDriver {\n provider: CheckoutProvider\n /** Trigger a charge (trigger surfaces + programmatic). Resolves when settled. */\n start(req: CheckoutRequest): Promise<CheckoutResult>\n /** Render an inline surface (e.g. the provider's React payment element); report via callbacks. */\n renderInline?(req: CheckoutRequest, cb: CheckoutCallbacks): ReactNode\n}\n\nexport interface MockDriverOptions {\n /** The result a successful charge resolves with. */\n result?: CheckoutResult\n /** Make **off-session** charges (no surface) fail — to exercise the upsell fallback. */\n failOffSession?: CheckoutError | boolean\n}\n\n/** A console/no-op driver — tests, preview, local dev. Succeeds unless configured to fail. */\nexport function createMockDriver(\n provider: CheckoutProvider = 'stripe',\n options: MockDriverOptions = {},\n): CheckoutDriver {\n const success: CheckoutResult = options.result ?? { ok: true, amountMinor: 0, currency: 'USD' }\n const offError: CheckoutError =\n typeof options.failOffSession === 'object'\n ? options.failOffSession\n : checkoutError('authentication_required', 'off-session charge declined (mock)')\n return {\n provider,\n start: (req) => {\n if (options.failOffSession && !req.surface) return Promise.resolve({ ok: false, error: offError })\n return Promise.resolve(success)\n },\n renderInline: (req, cb) =>\n createElement(\n 'button',\n {\n type: 'button',\n 'data-mock-surface': req.surface,\n onClick: () =>\n success.ok\n ? cb.onSuccess(success)\n : cb.onError(success.error ?? checkoutError('processing_error', 'failed (mock)')),\n },\n `Pay (mock ${req.surface})`,\n ),\n }\n}\n\nconst DriverContext = createContext<CheckoutDriver | null>(null)\n\nexport function CheckoutDriverProvider({\n driver,\n children,\n}: {\n driver: CheckoutDriver\n children: ReactNode\n}): ReactNode {\n return createElement(DriverContext.Provider, { value: driver }, children)\n}\n\nfunction useDriver(): CheckoutDriver {\n return useContext(DriverContext) ?? FALLBACK_DRIVER\n}\nconst FALLBACK_DRIVER = createMockDriver()\n\n// ── The headless hook ────────────────────────────────────\n\nexport interface UseCheckoutOptions {\n intent?: CheckoutIntent\n /** For `upsell` intent — which kind of off-session charge (default `subscription`). */\n kind?: UpsellKind\n /** Advance to the next page after a successful charge (default: true). */\n advanceOnSuccess?: boolean\n onSuccess?: (result: CheckoutResult) => void\n onError?: (error: CheckoutError) => void\n}\n\nexport interface CheckoutHandle {\n /** Start the charge for a product; resolves with the result (no surface = off-session). */\n open: (product: string, surface?: CheckoutSurface) => Promise<CheckoutResult>\n status: CheckoutStatus\n /** The last failure, structured so you can route/recover by `category`. */\n error: CheckoutError | null\n isLoading: boolean\n reset: () => void\n /** Build the callbacks an inline surface reports through (used by `<Checkout>`). */\n callbacksFor: (product: string, surface?: CheckoutSurface) => CheckoutCallbacks & { onStart: () => void }\n}\n\n/**\n * The headless checkout hook. Owns the state machine + analytics + post-charge\n * navigation; delegates the charge to the injected {@link CheckoutDriver}.\n */\nexport function useCheckout(opts: UseCheckoutOptions = {}): CheckoutHandle {\n const driver = useDriver()\n const tracker = useTrackerRef()\n const nav = useNavigation()\n const [status, setStatus] = useState<CheckoutStatus>('idle')\n const [error, setError] = useState<CheckoutError | null>(null)\n\n const intent = opts.intent ?? 'purchase'\n const kind = opts.kind\n const advance = opts.advanceOnSuccess ?? true\n\n const succeed = useCallback(\n (result: CheckoutResult) => {\n setStatus('success')\n tracker.track('purchase.complete', {\n amount: result.amountMinor != null ? result.amountMinor / 100 : undefined,\n currency: result.currency,\n eventId: result.eventId, // server-minted (browser↔CAPI dedup); undefined if none\n })\n opts.onSuccess?.(result)\n if (advance) nav.next()\n },\n [tracker, nav, advance, opts],\n )\n\n const fail = useCallback(\n (err: CheckoutError, product?: string) => {\n // 3DS/SCA that an off-session charge can't satisfy → flag for recovery.\n setStatus(err.category === 'authentication_required' ? 'requires_action' : 'error')\n setError(err)\n tracker.track('checkout.failed', {\n category: err.category,\n declineCode: err.declineCode,\n productId: product,\n intent,\n } as never)\n opts.onError?.(err)\n },\n [tracker, intent, opts],\n )\n\n const begin = useCallback(\n (product: string, surface?: CheckoutSurface) => {\n setStatus('loading')\n setError(null)\n tracker.track('checkout.start', { productId: product, surface } as never)\n },\n [tracker],\n )\n\n const paymentAdded = useCallback(() => tracker.track('checkout.payment_added', {}), [tracker])\n\n const open = useCallback(\n async (product: string, surface?: CheckoutSurface): Promise<CheckoutResult> => {\n begin(product, surface)\n try {\n const result = await driver.start({ product, intent, surface, kind })\n if (result.ok) succeed(result)\n else fail(result.error ?? checkoutError('unknown', 'Checkout failed'), product)\n return result\n } catch (e) {\n const err = checkoutError('processing_error', e instanceof Error ? e.message : 'Checkout failed')\n fail(err, product)\n return { ok: false, error: err }\n }\n },\n [driver, intent, kind, begin, succeed, fail],\n )\n\n const callbacksFor = useCallback(\n (product: string, surface?: CheckoutSurface) => ({\n onStart: () => begin(product, surface),\n onSuccess: (result: CheckoutResult) => succeed(result),\n onError: (err: CheckoutError) => fail(err, product),\n onPaymentAdded: () => paymentAdded(),\n }),\n [begin, succeed, fail, paymentAdded],\n )\n\n const reset = useCallback(() => {\n setStatus('idle')\n setError(null)\n }, [])\n\n return { open, status, error, isLoading: status === 'loading', reset, callbacksFor }\n}\n\n// ── The components ───────────────────────────────────────\n\nexport interface CheckoutProps extends UseCheckoutOptions {\n /** Logical product id (the author's bound selection). */\n product: string\n surface: CheckoutSurface\n /** Render your own trigger element instead of the default button (trigger surfaces). */\n asChild?: boolean\n /** Trigger label / your trigger element. */\n children?: ReactNode\n className?: string\n}\n\n/**\n * The `sheet` surface as a registry modal: our {@link Sheet} hosts the driver's\n * element. It resolves outcomes by invoking the callbacks passed via `showModal`\n * args — closures created in the `<Checkout>` trigger (which lives inside\n * `<FunnelView>`, so they carry navigation). Dismissing the sheet just closes it.\n */\nconst CheckoutSheet = defineModal<{\n product: string\n surface: CheckoutSurface\n intent: CheckoutIntent\n onSuccess: (result: CheckoutResult) => void\n onError: (error: CheckoutError) => void\n}>(({ product, surface, intent, onSuccess, onError }) => {\n const driver = useDriver()\n const modal = useModal()\n if (!driver.renderInline) return null\n return createElement(Sheet, {\n children: driver.renderInline(\n { product, intent, surface },\n {\n onSuccess: (r) => { modal.hide(); onSuccess(r) },\n onError: (e) => { modal.hide(); onError(e) },\n },\n ),\n })\n})\n\n/** Render the default trigger button, or clone the author's `asChild` element. */\nfunction trigger(\n onClick: () => void,\n { asChild, children, className, disabled }: { asChild?: boolean; children?: ReactNode; className?: string; disabled?: boolean },\n): ReactNode {\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<{ onClick?: () => void }>\n return cloneElement(child, { onClick })\n }\n return createElement('button', { type: 'button', className, disabled, onClick }, children ?? 'Continue')\n}\n\n/**\n * The purchase primitive. Three presentation modes by `surface`:\n * - **inline** (`express`/`element`/`embedded`) — the driver renders the\n * provider UI in place (keyed by product so a selection change remounts it);\n * - **SDK sheet** (`sheet`) — a trigger opens the AppFunnel-owned {@link Sheet}\n * and the driver renders the provider element inside it;\n * - **provider-hosted** (`popup`/`redirect`) — a trigger hands off to the\n * provider's own overlay/page.\n */\nexport function Checkout({\n product,\n surface,\n asChild,\n children,\n className,\n ...options\n}: CheckoutProps): ReactNode {\n const driver = useDriver()\n const checkout = useCheckout(options)\n const intent = options.intent ?? 'purchase'\n\n // Inline: driver renders the mounted UI; keyed by product so changing the\n // selected plan cleanly remounts the surface.\n if (isInlineSurface(surface)) {\n return driver.renderInline\n ? createElement(\n 'div',\n { key: product, className },\n driver.renderInline({ product, intent, surface }, checkout.callbacksFor(product, surface)),\n )\n : null\n }\n\n // SDK sheet: open our overlay (a registry modal) hosting the driver's element.\n if (surface === 'sheet') {\n const cb = checkout.callbacksFor(product, surface)\n const open = () => {\n cb.onStart()\n showModal(CheckoutSheet, { product, surface, intent, onSuccess: cb.onSuccess, onError: cb.onError })\n }\n return trigger(open, { asChild, children, className, disabled: checkout.isLoading })\n }\n\n // Provider-hosted (popup/redirect): trigger hands off to the provider.\n return trigger(() => checkout.open(product, surface), {\n asChild,\n children,\n className,\n disabled: checkout.isLoading,\n })\n}\n\nexport interface UpsellProps extends Omit<UseCheckoutOptions, 'intent'> {\n product: string\n /**\n * If the off-session charge fails, present this surface **on-session** to\n * re-collect a card and charge again — e.g. `fallback=\"sheet\"` opens the\n * payment sheet, `fallback=\"popup\"` the provider overlay. Omit to just report\n * the failure (via `onError` / the `checkout.failed` event).\n */\n fallback?: CheckoutSurface\n asChild?: boolean\n children?: ReactNode\n className?: string\n}\n\n/**\n * The upsell primitive — an off-session, one-tap charge to the saved method (no\n * surface, no card re-entry). On failure, optionally `fallback` to an on-session\n * surface to re-collect and retry.\n */\nexport function Upsell({ product, fallback, asChild, children, className, ...options }: UpsellProps): ReactNode {\n const checkout = useCheckout({ ...options, intent: 'upsell' })\n\n const start = async () => {\n const result = await checkout.open(product) // off-session (no surface)\n if (result.ok || !fallback) return\n // Recover on-session via the fallback surface (re-collect a card).\n const cb = checkout.callbacksFor(product, fallback)\n if (fallback === 'sheet') {\n cb.onStart()\n showModal(CheckoutSheet, { product, surface: 'sheet', intent: 'upsell', onSuccess: cb.onSuccess, onError: cb.onError })\n } else {\n await checkout.open(product, fallback) // hosted on-session re-collect\n }\n }\n\n return trigger(start, {\n asChild,\n children: children ?? 'Add to my plan',\n className,\n disabled: checkout.isLoading,\n })\n}\n","/**\n * Toast — a thin convenience re-export of {@link https://sonner.emilkowal.ski | sonner}.\n *\n * Authors call `toast.success(...)` / `toast.error(...)` anywhere in their funnel.\n * `FunnelProvider` auto-mounts {@link FunnelToaster} (opt out with `toaster={false}`),\n * so toasts work with no setup; render it yourself if you want a custom location.\n *\n * This is the *one* opinionated UI we re-export — kept deliberately thin (just the\n * imperative `toast` + a defaulted `<Toaster>`), because error/info surfacing is a\n * near-universal funnel need and sonner is tiny. Everything else stays headless.\n */\n\nimport { createElement, type ReactNode } from 'react'\nimport { Toaster, type ToasterProps } from 'sonner'\n\nexport { toast } from 'sonner'\nexport type { ToasterProps }\n\n/** Sonner's `<Toaster>` with funnel defaults (top-center); pass any `ToasterProps` to override. */\nexport function FunnelToaster(props: ToasterProps = {}): ReactNode {\n return createElement(Toaster, { position: 'top-center', ...props })\n}\n\n/** Internal: resolve the `FunnelProvider` `toaster` prop to an element (or null). */\nexport function renderToaster(toaster: boolean | ToasterProps): ReactNode {\n if (toaster === false) return null\n return createElement(Toaster, { position: 'top-center', ...(toaster === true ? {} : toaster) })\n}\n","import {\n createContext,\n createElement,\n Fragment,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from 'react'\nimport type { VariableStore } from './variableStore'\nimport { createFunnelStore, NAMESPACE_PREFIX, type WritableNamespace } from './store'\nimport { buildAcquisition, buildContext, type FunnelContext } from './context'\nimport {\n TrackerProvider,\n createConsoleTracker,\n type Tracker,\n} from '../tracking/tracking'\nimport { attachBus, createBus, withBus, type FunnelBus } from '../tracking/bus'\nimport { CatalogProvider, buildCatalog, type ResolvedProduct, type ProductInput } from '../commerce/catalog'\nimport { CheckoutDriverProvider, createMockDriver, type CheckoutDriver } from '../commerce/checkout'\nimport { ModalRuntime } from '../modals/registry'\nimport { LocaleProvider, type MessageCatalog } from '../i18n/translation'\nimport { renderToaster, type ToasterProps } from '../toast/toast'\nimport type { FunnelDefinition, FunnelSnapshot } from '../flow/spine'\nimport type { RuntimeExperiment } from '../flow/experiments'\nimport type { VariableValue } from '../types'\n\n/**\n * v2 namespace layer over the flat {@link VariableStore}.\n *\n * **The public surface is hooks, not a god object.** Reactive reads use\n * `useState`-shaped tuple hooks (`const [goal, setGoal] = useResponse('goal')`);\n * read-only computed values use `useDevice()`/`useLocale()`/`usePage()`/`useUtm()`.\n * `useFunnel()` returns an **imperative, non-subscribing** handle for use in\n * handlers/effects only — it is not the documented primary API and carries no\n * `sdk` branding.\n *\n * Three writable namespaces (`user`/`responses`/`data`) + the read-only\n * `context`. Entitlements are **not** here — they're the separate app/IdentitySDK.\n *\n * All writes route through {@link Namespace.set}, so persistence + identify fire\n * from one place (the \"magic behind set()\", doc 07 §Layer 1).\n */\n\n// ── Writable namespace view ──────────────────────────────\n\n/** A typed view over one writable namespace's slice of the store. */\nexport class Namespace<\n T extends Record<string, VariableValue> = Record<string, VariableValue>,\n> {\n private readonly dot: string\n\n constructor(\n private readonly store: VariableStore,\n readonly name: WritableNamespace,\n /** Side-effect run after every write (persistence, identify). */\n private readonly onWrite: (ns: WritableNamespace, values: Partial<T>) => void,\n ) {\n this.dot = `${NAMESPACE_PREFIX[name]}.`\n }\n\n /** Fully-qualified store key for a namespace-relative key. */\n storeKey(key: string): string {\n return this.dot + key\n }\n\n /** The store-key prefix this namespace reads/writes (e.g. `user.`). */\n get prefix(): string {\n return this.dot\n }\n\n /** Read the whole namespace as a flat object (prefix stripped). */\n getAll(): T {\n const out: Record<string, VariableValue> = {}\n const all = this.store.getState()\n for (const key in all) {\n if (key.startsWith(this.dot)) out[key.slice(this.dot.length)] = all[key]\n }\n return out as T\n }\n\n /** Read one key, or the whole namespace when called with no argument. */\n get<K extends keyof T & string>(key: K): T[K]\n get(): T\n get(key?: string): VariableValue | T {\n return key === undefined ? this.getAll() : this.store.get(this.storeKey(key))\n }\n\n /** Write one or more keys from a plain object (batched + side-effected). */\n set(values: Partial<T>): void {\n const updates: Record<string, VariableValue> = {}\n for (const key in values) {\n updates[this.storeKey(key)] = values[key] as VariableValue\n }\n this.store.setMany(updates)\n this.onWrite(this.name, values)\n }\n}\n\n// ── The imperative handle ────────────────────────────────\n\n/**\n * The imperative funnel handle (`useFunnel()`). Non-reactive — for event\n * handlers and effects. Reactive render reads go through the hooks instead.\n */\nexport interface Funnel {\n user: Namespace\n responses: Namespace\n data: Namespace\n /** Read-only computed namespace. `page` reflects the latest navigation. */\n readonly context: FunnelContext\n /** Live page-level experiment records (platform/DB-sourced); the runtime buckets visitors into them. */\n readonly experiments: RuntimeExperiment[]\n /** Emit a custom analytics event. */\n track: Tracker['track']\n /** A point-in-time snapshot for predicates (routing/conditions). */\n snapshot(): FunnelSnapshot\n}\n\n/** Build the imperative handle over a store + context + tracker. */\nexport function createFunnel(\n store: VariableStore,\n context: FunnelContext,\n tracker: Tracker,\n experiments: RuntimeExperiment[] = [],\n): Funnel {\n // One write path → one place for the \"magic behind set()\".\n const onWrite = (ns: WritableNamespace, values: Record<string, VariableValue>) => {\n // Identify the moment a non-empty email is written.\n if (ns === 'user' && typeof values.email === 'string' && values.email) {\n tracker.identify(values.email)\n }\n // Push the writable snapshot for debounced persistence.\n tracker.setVariables?.(store.getState())\n }\n\n const user = new Namespace(store, 'user', onWrite)\n const responses = new Namespace(store, 'responses', onWrite)\n const data = new Namespace(store, 'data', onWrite)\n\n return {\n user,\n responses,\n data,\n context,\n experiments,\n track: (event: string, eventData?: never, userData?: Record<string, unknown>) =>\n tracker.track(event, eventData, userData),\n snapshot: () => ({\n user: user.getAll(),\n responses: responses.getAll(),\n data: data.getAll(),\n context,\n }),\n }\n}\n\n// ── React wiring ─────────────────────────────────────────\n\ninterface FunnelContextValue {\n funnel: Funnel\n store: VariableStore\n context: FunnelContext\n catalog: Map<string, ResolvedProduct>\n driver: CheckoutDriver\n /** Tracker composed with the client bus sink (every track() also hits window.appfunnel). */\n tracker: Tracker\n /** The window.appfunnel event bus (client-side integration surface). */\n bus: FunnelBus\n}\n\nconst FunnelCtx = createContext<FunnelContextValue | null>(null)\n\nexport interface FunnelProviderProps {\n /** Mount from a funnel definition (the normal case). */\n config?: FunnelDefinition\n /** Server / session-restored values overriding declared defaults. */\n sessionValues?: Record<string, VariableValue>\n /** The platform tracker; defaults to a silent console tracker (tests/dev). */\n tracker?: Tracker\n /** Computed-context seed (funnel id, test/live mode, server-hydrated utm/session). */\n context?: Parameters<typeof buildContext>[0]\n /** Products with their provider-resolved price (`{ amount, currency }`). */\n products?: ProductInput[]\n /** Live page-level experiment records, platform/DB-sourced (not authored in funnel code). */\n experiments?: RuntimeExperiment[]\n /** The platform checkout driver; defaults to a mock that resolves successfully. */\n checkout?: CheckoutDriver\n /** Message catalogs per locale (`messages/<locale>.json`) for translation. */\n messages?: MessageCatalog\n /** Explicit locale override (URL/param/geo); wins over the detected device locale. */\n locale?: string\n /** Auto-mount the toast `<Toaster>` (default true). Pass props to customize, or `false` to opt out. */\n toaster?: boolean | ToasterProps\n /** Advanced / testing: supply a pre-built store instead of a `config`. */\n store?: VariableStore\n children: ReactNode\n}\n\n/**\n * Mounts a funnel: builds the writable {@link VariableStore} + the read-only\n * {@link FunnelContext} (once) and provides the runtime to the tree via hooks.\n */\nexport function FunnelProvider({\n config,\n sessionValues,\n tracker,\n context: contextOpts,\n products,\n experiments,\n checkout,\n messages,\n locale: localeOverride,\n toaster = true,\n store,\n children,\n}: FunnelProviderProps): ReactNode {\n const resolvedTracker = tracker ?? FALLBACK_TRACKER\n const [value] = useState<FunnelContextValue>(() => {\n const s =\n store ??\n createFunnelStore(\n { responses: config?.responses, data: config?.data },\n sessionValues,\n )\n const ctx = buildContext({\n funnelId: config?.id,\n ...contextOpts,\n })\n // The client event bus (window.appfunnel), composed into the tracker so every\n // taxonomy event mirrors to it for on-page pixels. Read getters wire to store + context.\n const bus = createBus({\n getVariable: (key) => s.get(key),\n getVariables: () => s.getState(),\n getCurrentPageId: () => ctx.page.key || null,\n getCustomerId: () => ctx.identity.customerId,\n getVisitorId: () => ctx.identity.visitorId,\n })\n const busTracker = withBus(resolvedTracker, bus)\n return {\n funnel: createFunnel(s, ctx, busTracker, experiments ?? []),\n store: s,\n context: ctx,\n catalog: buildCatalog(products ?? []),\n driver: checkout ?? createMockDriver(),\n tracker: busTracker,\n bus,\n }\n })\n // Expose the bus on window.appfunnel for the funnel's lifetime (client-side only).\n useEffect(() => attachBus(value.bus), [value.bus])\n // Forward the acquisition snapshot once on entry → the platform persists it\n // first-class (session + first-touch Customer) + feeds CAPI.\n useEffect(() => {\n value.tracker.setAcquisition?.(buildAcquisition(value.context))\n }, [value])\n const tree = createElement(TrackerProvider, {\n tracker: value.tracker,\n children: createElement(CheckoutDriverProvider, {\n driver: value.driver,\n children: createElement(CatalogProvider, {\n catalog: value.catalog,\n children: createElement(FunnelCtx.Provider, {\n value,\n children: createElement(LocaleProvider, {\n config: config?.locales,\n catalog: messages,\n detected: value.context.locale.locale,\n override: localeOverride,\n children: createElement(ModalRuntime, { children }),\n }),\n }),\n }),\n }),\n })\n return createElement(Fragment, null, tree, renderToaster(toaster))\n}\n\nconst FALLBACK_TRACKER = createConsoleTracker({ silent: true })\n\nfunction useFunnelCtx(): FunnelContextValue {\n const ctx = useContext(FunnelCtx)\n if (!ctx) {\n throw new Error('useFunnel/useResponse/… must be used inside <FunnelProvider>')\n }\n return ctx\n}\n\n/**\n * The imperative handle. Does **not** subscribe — use it in event handlers and\n * effects (`useFunnel().responses.set({...})`). For reactive reads use the hooks.\n */\nexport function useFunnel(): Funnel {\n return useFunnelCtx().funnel\n}\n\n/** Internal: the raw {@link VariableStore} (for reactive condition/field hooks). */\nexport function useFunnelStore(): VariableStore {\n return useFunnelCtx().store\n}\n\n// ── Reactive field hooks ─────────────────────────────────\n\n/** Subscribe to a single flat store key; returns its reactive value. */\nfunction useStoreKey(store: VariableStore, key: string): VariableValue {\n const subscribe = useCallback(\n (cb: () => void) => store.subscribe(cb, { keys: [key] }),\n [store, key],\n )\n const getSnapshot = useCallback(() => store.get(key), [store, key])\n // Snapshot is the primitive value → stable by value, no caching needed.\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}\n\n/** Build a `useState`-shaped tuple hook bound to one writable namespace. */\nfunction makeFieldHook(ns: WritableNamespace) {\n return function useNamespaceField(\n key: string,\n ): [VariableValue, (value: VariableValue) => void] {\n const { funnel, store } = useFunnelCtx()\n const value = useStoreKey(store, `${NAMESPACE_PREFIX[ns]}.${key}`)\n const set = useCallback(\n (v: VariableValue) => funnel[ns].set({ [key]: v }),\n [funnel, key],\n )\n return [value, set]\n }\n}\n\n/**\n * `const [goal, setGoal] = useResponse('goal')` — one funnel answer,\n * `useState`-shaped and per-key reactive. Writing persists + (later) feeds\n * analytics aggregation.\n */\nexport const useResponse = makeFieldHook('responses')\n\n/**\n * `const [height, setHeight] = useUserAttribute('height')` — any field on the\n * user. The platform routes known fields → typed column, custom → attribute;\n * the author doesn't specify which. Writing `email` also identifies the visitor.\n */\nexport const useUserAttribute = makeFieldHook('user')\n\n/**\n * `const [score, setScore] = useData('score')` — working/scratch state. Persisted\n * (survives reload/return) but kept out of `responses` aggregation.\n */\nexport const useData = makeFieldHook('data')\n\n/**\n * The headless field hook — `useField('responses.goal')` — the building block\n * the styleable components (`<Choice>`) wrap. Takes a namespaced path and\n * returns `{ value, set }`. Accepts only writable namespaces.\n */\nexport function useField(path: string): {\n value: VariableValue\n set: (value: VariableValue) => void\n} {\n const dot = path.indexOf('.')\n const ns = path.slice(0, dot) as WritableNamespace\n const key = path.slice(dot + 1)\n const { funnel, store } = useFunnelCtx()\n if (!(ns in NAMESPACE_PREFIX)) {\n throw new Error(`useField: \"${path}\" is not a writable namespace (user/responses/data)`)\n }\n const value = useStoreKey(store, `${NAMESPACE_PREFIX[ns]}.${key}`)\n const set = useCallback(\n (v: VariableValue) => funnel[ns].set({ [key]: v }),\n [funnel, ns, key],\n )\n return { value, set }\n}\n\n// ── Read-only context hooks ──────────────────────────────\n\n/** The whole read-only computed namespace (non-reactive except `page`). */\nfunction useContextObject(): FunnelContext {\n return useFunnelCtx().context\n}\n\n/** `useDevice()` — viewport, device type, pixel ratio (read-only). */\nexport function useDevice(): FunnelContext['device'] {\n return useContextObject().device\n}\n\n/** `useLocale()` — resolved locale/language/region/timezone (read-only). */\nexport function useLocale(): FunnelContext['locale'] {\n return useContextObject().locale\n}\n\n/** `useUtm()` — the 5 utm params captured on entry (read-only). */\nexport function useUtm(): FunnelContext['utm'] {\n return useContextObject().utm\n}\n\n/** `useClickIds()` — per-network ad click-ids captured on entry (read-only). */\nexport function useClickIds(): FunnelContext['clickIds'] {\n return useContextObject().clickIds\n}\n\n/** `useSystem()` — funnel id, test/live mode, build clock (read-only). */\nexport function useSystem(): FunnelContext['system'] {\n return useContextObject().system\n}\n\n/** Read a dotted path out of context, e.g. `useContextValue('device.isMobile')`. */\nexport function useContextValue(path: string): unknown {\n const ctx = useContextObject()\n return useMemo(\n () => path.split('.').reduce<unknown>((acc, k) => (acc as Record<string, unknown>)?.[k], ctx),\n [ctx, path],\n )\n}\n","import {\n createElement,\n type ButtonHTMLAttributes,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react'\nimport { useField } from '../state/namespaces'\nimport { useNavigation } from './flow'\n\n/**\n * The two-tier component model (doc 07 §\"magic ≠ black box\"): the magic lives in\n * headless hooks (`useField`, `useNavigation`); these styleable components are\n * thin, restyle-able wrappers over them. Every `<Choice>` reduces to `useField`\n * + your own JSX — eject any time. They pass `className`/DOM props straight\n * through and never dictate a pixel beyond the minimum.\n */\n\nexport interface ChoiceOption {\n value: string\n label?: ReactNode\n}\n\nexport interface ChoiceProps {\n /** Writable namespaced path to bind, e.g. `responses.goal`. */\n bind: string\n /** The selectable options (a bare string is shorthand for `{value, label}`). */\n options: (string | ChoiceOption)[]\n /** Class applied to each option button. */\n className?: string\n /** Class applied to the selected option button (in addition to `className`). */\n selectedClassName?: string\n /** Advance navigation after a choice (handy for single-tap question pages). */\n advanceOnSelect?: boolean\n}\n\n/**\n * Single-select bound to a writable field. `<Choice bind=\"responses.goal\"\n * options={[\"lose\", \"gain\"]} />` — selecting persists + (later) tracks; pass\n * `advanceOnSelect` to move to the next page on tap.\n */\nexport function Choice({\n bind,\n options,\n className,\n selectedClassName,\n advanceOnSelect,\n}: ChoiceProps): ReactNode {\n const { value, set } = useField(bind)\n const nav = useNavigation()\n\n return options.map((opt) => {\n const o: ChoiceOption = typeof opt === 'string' ? { value: opt } : opt\n const selected = value === o.value\n return createElement(\n 'button',\n {\n key: o.value,\n type: 'button',\n 'aria-pressed': selected,\n 'data-selected': selected || undefined,\n className: selected && selectedClassName ? `${className ?? ''} ${selectedClassName}`.trim() : className,\n onClick: () => {\n set(o.value)\n if (advanceOnSelect) nav.next()\n },\n },\n o.label ?? o.value,\n )\n })\n}\n\nexport interface NextProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n children?: ReactNode\n}\n\n/** A button that advances the funnel (the current page's `next`, else linear). */\nexport function Next({ children, onClick, ...rest }: NextProps): ReactNode {\n const { next } = useNavigation()\n return createElement(\n 'button',\n {\n type: 'button',\n ...rest,\n onClick: (e: ReactMouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (!e.defaultPrevented) next()\n },\n },\n children ?? 'Continue',\n )\n}\n\nexport interface BackProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n children?: ReactNode\n}\n\n/** A button that returns to the previous page; hidden when there's no history. */\nexport function Back({ children, onClick, ...rest }: BackProps): ReactNode {\n const { back, canGoBack } = useNavigation()\n if (!canGoBack) return null\n return createElement(\n 'button',\n {\n type: 'button',\n ...rest,\n onClick: (e: ReactMouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (!e.defaultPrevented) back()\n },\n },\n children ?? 'Back',\n )\n}\n","/**\n * The **event catalog** — the single source of truth for *which* events exist and\n * how each is routed (analytics vs. integrations vs. runtime-only). Pairs with the\n * typed payloads in {@link ./tracking}.`FunnelEventDataMap`.\n *\n * This replaces the duplication the monorepo flags (`shared/events/catalog.ts` is\n * \"documentation, not imported\" — the taxonomy is re-declared in\n * `admin/lib/funnel/tracking.ts`, each `admin/lib/integrations/*` EVENT_MAP, and\n * `api/src/integrations/constants`). In v2 the **SDK owns the taxonomy** (it emits\n * it), so the bus, the pixel loaders, and the platform all import *this*.\n */\n\nexport type EventSource = 'frontend' | 'backend'\n\nexport interface EventMeta {\n /** Where the event originates. `backend` = the server emits it (e.g. a settled charge). */\n sources: EventSource[]\n /** Persisted to analytics. */\n tracking: boolean\n /** Forwarded to ad/integration pixels (Meta/GTM/TikTok/…). */\n integrations: boolean\n /** Runtime-only JS subscription — not persisted, not sent to integrations. */\n runtime?: boolean\n}\n\n/**\n * Every event the system knows, with its routing metadata. Keys are the taxonomy\n * names (a superset of `FunnelEventDataMap`: it also lists the **backend-originated**\n * monetary events the platform pushes to the client bus for pixel firing).\n */\nexport const EVENT_CATALOG = {\n // ── Runtime / navigation (JS subscriptions; not persisted) ──\n 'funnel.start': { sources: ['frontend'], tracking: false, integrations: false, runtime: true },\n 'experiment.exposure': { sources: ['frontend'], tracking: true, integrations: false },\n\n // ── Frontend, tracked; some also go to pixels ──\n 'page.view': { sources: ['frontend'], tracking: true, integrations: true },\n 'page.exit': { sources: ['frontend'], tracking: true, integrations: false },\n 'user.registered': { sources: ['frontend'], tracking: true, integrations: true },\n 'checkout.start': { sources: ['frontend'], tracking: true, integrations: true },\n 'checkout.payment_added': { sources: ['frontend'], tracking: true, integrations: true },\n 'checkout.failed': { sources: ['frontend'], tracking: true, integrations: false },\n\n // ── Backend-originated money events (server mints the eventId; client fires the pixel) ──\n 'purchase.complete': { sources: ['backend'], tracking: true, integrations: true },\n 'customer.first_purchase': { sources: ['backend'], tracking: true, integrations: true },\n 'subscription.created': { sources: ['backend'], tracking: true, integrations: true },\n 'subscription.renewal': { sources: ['backend'], tracking: true, integrations: true },\n} as const satisfies Record<string, EventMeta>\n\n/** A catalog event name. */\nexport type CatalogEvent = keyof typeof EVENT_CATALOG\n\n/** True if the event is persisted to analytics. */\nexport function isTrackableEvent(name: string): boolean {\n return EVENT_CATALOG[name as CatalogEvent]?.tracking ?? false\n}\n\n/** True if the event is forwarded to ad/integration pixels. */\nexport function isIntegrationEvent(name: string): boolean {\n return EVENT_CATALOG[name as CatalogEvent]?.integrations ?? false\n}\n\n/** The events that feed integrations — the set a pixel loader subscribes to. */\nexport function integrationEvents(): CatalogEvent[] {\n return (Object.keys(EVENT_CATALOG) as CatalogEvent[]).filter((e) => EVENT_CATALOG[e].integrations)\n}\n","/**\n * `<Script>` — the **declared third-party embed** primitive (phase-2 §2.3d).\n *\n * The controlled escape hatch for runtime widgets/embeds that genuinely need\n * client code — Intercom, Trustpilot, a calendar embed, an operator pixel. Unlike\n * arbitrary `<script>` injection, it's **declared** (the funnel author writes\n * `<Script src=…/>`), **deduped** (injected at most once per id/src, even across\n * page navigation in the SPA — a chat widget must not reload on every page), and\n * **CSP-friendly** (accepts a `nonce`).\n *\n * CSP enforcement itself is the **renderer's** job: it scans the funnel's declared\n * `<Script src>`s (build-time) into the `script-src` allowlist and supplies the\n * `nonce`. This component just injects the tag at the right time.\n *\n * For *analytics* pixels, prefer subscribing to the `window.appfunnel` bus\n * ({@link ../tracking/bus}) — `<Script>` is for non-analytics third-party widgets\n * (and the pixel loader snippets, which then subscribe to the bus).\n */\n\nimport { useEffect } from 'react'\n\n/** Module-level registry so a given script injects once for the app's lifetime. */\nconst injected = new Set<string>()\n\nexport interface ScriptProps {\n /** The third-party script URL. */\n src: string\n /**\n * When to inject. `afterInteractive` (default) injects on mount (after hydration);\n * `lazyOnload` waits for idle/`load` so it never competes with the funnel's own JS.\n */\n strategy?: 'afterInteractive' | 'lazyOnload'\n /** Dedup key (defaults to `src`) — the script injects at most once per id. */\n id?: string\n /** Defaults to `true`. */\n async?: boolean\n defer?: boolean\n /** CSP nonce — supplied by the renderer. */\n nonce?: string\n /** Extra attributes (e.g. `data-*`). */\n attributes?: Record<string, string>\n onLoad?: () => void\n onError?: () => void\n}\n\n/**\n * Injects a third-party script once. Renders nothing. Persists across navigation\n * (the tag is never removed on unmount — third-party widgets should stay loaded).\n */\nexport function Script({\n src,\n strategy = 'afterInteractive',\n id,\n async = true,\n defer,\n nonce,\n attributes,\n onLoad,\n onError,\n}: ScriptProps): null {\n useEffect(() => {\n if (typeof document === 'undefined') return\n const key = id ?? src\n if (injected.has(key)) {\n onLoad?.() // already present from an earlier mount\n return\n }\n\n const inject = () => {\n if (injected.has(key)) return\n injected.add(key)\n const el = document.createElement('script')\n el.src = src\n if (id) el.id = id\n if (async) el.async = true\n if (defer) el.defer = true\n if (nonce) el.nonce = nonce\n if (attributes) for (const [k, v] of Object.entries(attributes)) el.setAttribute(k, v)\n el.addEventListener('load', () => onLoad?.())\n el.addEventListener('error', () => {\n injected.delete(key) // allow a later retry\n onError?.()\n })\n document.head.appendChild(el)\n }\n\n if (strategy === 'lazyOnload') {\n const ric = (window as unknown as { requestIdleCallback?: (cb: () => void) => number })\n .requestIdleCallback\n if (ric) {\n ric(inject)\n } else {\n const t = setTimeout(inject, 0)\n return () => clearTimeout(t)\n }\n return\n }\n inject()\n // src/id identify the script; injection is idempotent via the registry.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src, id])\n\n return null\n}\n\n/** Internal: clear the injected-script registry (tests only). */\nexport function __resetScriptRegistry(): void {\n injected.clear()\n}\n","/**\n * The **manifest** — the declarative IR a funnel project compiles to (doc 06).\n * It's the machine-readable artifact the platform operates on without executing\n * the funnel: the dashboard draws the flow graph from it, analytics binds to its\n * **stable ids**, validation runs against it, and the renderer reads it to resolve\n * routing.\n *\n * `compileManifest` evaluates the spine (the funnel config + each page's co-located\n * `meta`) into that IR. It's pure — no I/O — so it unit-tests trivially. **It runs\n * server-side**, as the IR step of the publish build over the canonical files in our\n * storage (R2). The client/CLI never produces the authoritative manifest — R2 is the\n * source of truth, the server compiles. (A local dev preview may run it for itself,\n * but that output is never published.)\n *\n * Edge model mirrors the runtime ({@link ../flow/spine}.`nextPage`): a page's\n * `meta.next` routes become **branch** edges (with a serialized condition — a\n * declarative {@link Condition}, or an opaque marker for a code predicate), and the\n * implicit file-order fall-through becomes a **linear** edge (unless an\n * unconditional route already covers it, or the page is a `finish`).\n *\n * Experiments are **not** compiled here. A variant page is recognised structurally\n * by the `@` in its key (`welcome@b`) and tagged `variantOf` + collapsed out of the\n * linear flow; the experiment *wiring* (labels/weights/status) is operational data\n * the platform owns and overlays at render time, not part of the funnel build.\n *\n * Stable ids: the page **key** is the source anchor, so `id === key` here. The\n * durable analytics id is the semantic page name (a slot survives a winner being\n * promoted into it); transient `@variant` pages only ever key analytics by\n * `(experimentId, variant)` in immutable results — a platform concern.\n */\n\nimport type {\n Condition,\n FunnelDefinition,\n FunnelLocales,\n Gate,\n PageMeta,\n PageType,\n} from '../flow/spine'\nimport { isVariantKey, parseSlotKey } from '../flow/experiments'\n\nexport interface ManifestPage {\n id: string\n key: string\n type: PageType\n slug: string\n index: number\n /**\n * Set on a variant page (`welcome@b`) to its **slot** (`welcome`) — a structural\n * marker that this node is an off-flow alternate, not a linear step. The\n * experiment *wiring* (label/weight/id) is operational data the platform owns,\n * not the manifest.\n */\n variantOf?: string\n}\n\nexport type EdgeCondition =\n | { kind: 'declarative'; condition: Condition }\n /** A code predicate — opaque body; `label` may be supplied later by AST parsing. */\n | { kind: 'predicate'; label?: string }\n\nexport interface ManifestEdge {\n from: string\n to: string\n kind: 'branch' | 'linear'\n /** Absent = unconditional (a fallback route, or the linear fall-through). */\n condition?: EdgeCondition\n}\n\nexport interface ManifestValidation {\n ok: boolean\n /** Page ids you can't proceed from (and that aren't a `finish`). */\n deadEnds: string[]\n /** Page ids not reachable from the start. */\n unreachable: string[]\n /** Routes whose target page key doesn't exist. */\n badTargets: { from: string; to: string }[]\n /** True if the funnel never writes `user.email` (the mandatory identity step). */\n missingEmailCapture: boolean\n}\n\nexport interface FunnelManifest {\n id: string\n pages: ManifestPage[]\n flow: { start: string | null; nodes: string[]; edges: ManifestEdge[] }\n products: string[]\n locales?: FunnelLocales\n validation: ManifestValidation\n}\n\nexport interface CompileInput {\n funnel: FunnelDefinition\n /** Pages in file order (the default flow); `meta` holds type/slug/next. */\n pages: { key: string; meta?: PageMeta }[]\n}\n\n/**\n * A **variant** node — a page filed with an `@variant` key (e.g. `welcome@b`).\n * It's an alternate of its slot, not a step in the linear spine, so it gets no\n * linear edge and is excluded from dead-end/reachability checks (the runtime\n * resolves it by bucketing, not by an edge). The `@` is the only source-side\n * signal; the experiment wiring is the platform's operational data. The slot's\n * control (no `@`) stays the flow node. Mirrors {@link resolveExperiments}.\n */\nfunction isVariantNode(page: { key: string }): boolean {\n return isVariantKey(page.key)\n}\n\n/** Serialize a route gate for the manifest (declarative → data; predicate → opaque). */\nfunction serializeGate(when: Gate | undefined): EdgeCondition | undefined {\n if (!when) return undefined\n if (typeof when === 'function') return { kind: 'predicate' }\n return { kind: 'declarative', condition: when }\n}\n\n/** Compile a funnel's spine into its declarative {@link FunnelManifest} IR. */\nexport function compileManifest(input: CompileInput): FunnelManifest {\n const { funnel, pages } = input\n const keys = new Set(pages.map((p) => p.key))\n\n const manifestPages: ManifestPage[] = pages.map((p, index) => ({\n id: p.key,\n key: p.key,\n type: p.meta?.type ?? 'default',\n slug: p.meta?.slug ?? p.key,\n index,\n variantOf: isVariantKey(p.key) ? parseSlotKey(p.key).slot : undefined,\n }))\n\n const edges: ManifestEdge[] = []\n const badTargets: { from: string; to: string }[] = []\n\n // The next page in file order that is a real flow node (skip `@variant` siblings).\n const nextAnchor = (from: number) => {\n for (let j = from + 1; j < pages.length; j++) {\n if (!isVariantNode(pages[j])) return pages[j]\n }\n return undefined\n }\n\n pages.forEach((p, i) => {\n // Variant nodes are alternates of their slot, resolved at runtime by bucketing\n // — they carry no flow edges (routing lives on the slot's control/anchor).\n if (isVariantNode(p)) return\n\n const routes = p.meta?.next ?? []\n let hasUnconditional = false\n for (const route of routes) {\n if (!keys.has(route.to)) {\n badTargets.push({ from: p.key, to: route.to })\n continue\n }\n edges.push({ from: p.key, to: route.to, kind: 'branch', condition: serializeGate(route.when) })\n if (!route.when) hasUnconditional = true\n }\n // Linear fall-through, unless an unconditional route already covers it,\n // this is a `finish` page, or there is no next page.\n const next = nextAnchor(i)\n if (!hasUnconditional && next && p.meta?.type !== 'finish') {\n edges.push({ from: p.key, to: next.key, kind: 'linear' })\n }\n })\n\n // The start is the first real flow node (a leading variant can't be the entry).\n const startPage = pages.find((p) => !isVariantNode(p))\n const start = startPage?.key ?? null\n const variantKeys = new Set(pages.filter(isVariantNode).map((p) => p.key))\n const validation = validate(manifestPages, edges, badTargets, start, variantKeys)\n\n return {\n id: funnel.id,\n pages: manifestPages,\n flow: { start, nodes: manifestPages.map((p) => p.id), edges },\n products: funnel.products ?? [],\n locales: funnel.locales,\n validation,\n }\n}\n\nfunction validate(\n pages: ManifestPage[],\n edges: ManifestEdge[],\n badTargets: { from: string; to: string }[],\n start: string | null,\n variantKeys: Set<string>,\n): ManifestValidation {\n const outgoing = new Map<string, number>()\n for (const e of edges) outgoing.set(e.from, (outgoing.get(e.from) ?? 0) + 1)\n\n // Variant nodes are resolved by bucketing, not edges — they're neither dead\n // ends nor unreachable in the flow-graph sense, so exclude them from both.\n const deadEnds = pages\n .filter((p) => p.type !== 'finish' && !variantKeys.has(p.id) && !(outgoing.get(p.id)! > 0))\n .map((p) => p.id)\n\n // Reachability from the start over the edge set.\n const reachable = new Set<string>()\n if (start) {\n const adj = new Map<string, string[]>()\n for (const e of edges) {\n const list = adj.get(e.from)\n if (list) list.push(e.to)\n else adj.set(e.from, [e.to])\n }\n const stack = [start]\n while (stack.length) {\n const id = stack.pop()!\n if (reachable.has(id)) continue\n reachable.add(id)\n for (const to of adj.get(id) ?? []) stack.push(to)\n }\n }\n const unreachable = pages\n .filter((p) => !variantKeys.has(p.id) && !reachable.has(p.id))\n .map((p) => p.id)\n\n // The funnel must capture user.email somewhere (doc 06). We can see the typed\n // `email-capture` page; deeper detection (any user.email write) is a build-time\n // AST concern. Treat presence of an `email-capture` page as satisfying it.\n const missingEmailCapture = !pages.some((p) => p.type === 'email-capture')\n\n return {\n ok: deadEnds.length === 0 && unreachable.length === 0 && badTargets.length === 0 && !missingEmailCapture,\n deadEnds,\n unreachable,\n badTargets,\n missingEmailCapture,\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/state/variableStore.ts","../src/state/store.ts","../src/state/context.ts","../src/tracking/tracking.ts","../src/tracking/bus.ts","../src/i18n/translation.ts","../src/commerce/catalog.ts","../src/flow/flow.tsx","../src/modals/registry.tsx","../src/modals/sheet.tsx","../src/commerce/checkout.tsx","../../../node_modules/sonner/dist/index.mjs","../src/toast/toast.tsx","../src/state/namespaces.ts","../src/tracking/platformTracker.ts","../src/flow/mount.tsx","../src/flow/components.tsx","../src/tracking/catalog.ts","../src/embed/script.tsx"],"names":["now","createContext","createElement","useContext","useMemo","useCallback","useEffect","useState","page","useRef","toast","jsx","height","heights","_toast_classNames","_toast_classNames1","offset","Toaster","toasts","id","position","index","value","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import type { VariableValue } from '../types'\n\n/**\n * External variable store for funnel variables — the flat, reactive key/value\n * store under the v2 namespaces. Components subscribe selectively via\n * `useSyncExternalStore`, so only components depending on changed keys re-render.\n * (Seeding lives in {@link ./store}.`createFunnelStore`.)\n */\ninterface ScopedListener {\n listener: () => void\n /** Exact keys to watch, or null for all changes */\n keys: string[] | null\n /** Prefix to watch (e.g. 'answers.'), or null for all */\n prefix: string | null\n}\n\nexport class VariableStore {\n private state: Record<string, VariableValue>\n private listeners = new Set<ScopedListener>()\n /** Tracks which keys changed in the last mutation — used by scoped notify */\n private changedKeys: string[] = []\n\n constructor(initial: Record<string, VariableValue>) {\n this.state = { ...initial }\n }\n\n getState(): Record<string, VariableValue> {\n return this.state\n }\n\n get(key: string): VariableValue {\n return this.state[key]\n }\n\n set(key: string, value: VariableValue): void {\n if (this.state[key] === value) return\n this.state = { ...this.state, [key]: value }\n this.changedKeys = [key]\n this.notify()\n }\n\n setState(updater: (prev: Record<string, VariableValue>) => Record<string, VariableValue>): void {\n const prev = this.state\n const next = updater(prev)\n if (next === prev) return\n this.state = next\n // Compute changed keys\n this.changedKeys = []\n for (const key of Object.keys(next)) {\n if (next[key] !== prev[key]) this.changedKeys.push(key)\n }\n for (const key of Object.keys(prev)) {\n if (!(key in next) && prev[key] !== undefined) this.changedKeys.push(key)\n }\n this.notify()\n }\n\n /** Batch set multiple variables at once */\n setMany(updates: Record<string, VariableValue>): void {\n const changed: string[] = []\n const next = { ...this.state }\n for (const [key, value] of Object.entries(updates)) {\n if (next[key] !== value) {\n next[key] = value\n changed.push(key)\n }\n }\n if (changed.length === 0) return\n this.state = next\n this.changedKeys = changed\n this.notify()\n }\n\n /**\n * Subscribe to store changes.\n *\n * @param listener - callback fired when relevant keys change\n * @param scope - optional scope to limit notifications:\n * - `{ keys: ['data.x', 'user.email'] }` — only fire when these exact keys change\n * - `{ prefix: 'answers.' }` — only fire when any key starting with this prefix changes\n * - omit or `{}` — fire on every change (global listener)\n */\n subscribe(\n listener: () => void,\n scope?: { keys?: string[]; prefix?: string },\n ): () => void {\n const entry: ScopedListener = {\n listener,\n keys: scope?.keys || null,\n prefix: scope?.prefix || null,\n }\n this.listeners.add(entry)\n return () => this.listeners.delete(entry)\n }\n\n private notify(): void {\n const changed = this.changedKeys\n for (const entry of this.listeners) {\n // Global listener — no scope\n if (!entry.keys && !entry.prefix) {\n entry.listener()\n continue\n }\n // Key-scoped listener\n if (entry.keys) {\n if (changed.some((k) => entry.keys!.includes(k))) {\n entry.listener()\n }\n continue\n }\n // Prefix-scoped listener\n if (entry.prefix) {\n if (changed.some((k) => k.startsWith(entry.prefix!))) {\n entry.listener()\n }\n }\n }\n }\n}\n","/**\n * v2 store seeding — builds a {@link VariableStore} holding only the **writable**\n * namespaces (`user` / `responses` / `data`), each persisted to the backend.\n *\n * Seeds the {@link VariableStore} with v2 prefixes (no legacy `answers.`/`query.`\n * aliasing). Read-only computed values do NOT live\n * here — see {@link ./context}. Three deliberate namespaces:\n *\n * - `user.*` persistent identity attributes (cross-session)\n * - `responses.*` the clean, aggregated funnel answers\n * - `data.*` working/scratch state — persisted (so reload + return survive)\n * but kept separate from responses so analytics aggregates only\n * real answers and `data` can hold intermediate garbage\n */\n\nimport type { VariableValue, VariableConfig } from '../types'\nimport { VariableStore } from './variableStore'\n\n/** v2 namespace → store-key prefix (sans trailing dot). 1:1, no legacy aliasing. */\nexport const NAMESPACE_PREFIX = {\n user: 'user',\n responses: 'responses',\n data: 'data',\n} as const\n\nexport type WritableNamespace = keyof typeof NAMESPACE_PREFIX\n\n/** Built-in user attributes — always present so reads never `undefined`. */\nconst BUILTIN_USER: Record<string, VariableValue> = {\n 'user.email': '',\n 'user.name': '',\n}\n\nexport interface FunnelStoreConfig {\n responses?: Record<string, VariableConfig>\n data?: Record<string, VariableConfig>\n}\n\nfunction defaultFor(type: string): VariableValue {\n switch (type) {\n case 'string': return ''\n case 'number': return 0\n case 'boolean': return false\n case 'stringArray': return []\n default: return ''\n }\n}\n\n/**\n * Seed a store from a funnel's declared `responses`/`data` defaults, then layer\n * server / session-restored values on top (highest priority).\n */\nexport function createFunnelStore(\n config: FunnelStoreConfig = {},\n sessionValues?: Record<string, VariableValue>,\n): VariableStore {\n const initial: Record<string, VariableValue> = { ...BUILTIN_USER }\n\n for (const [key, cfg] of Object.entries(config.responses ?? {})) {\n initial[`responses.${key}`] = cfg.default ?? defaultFor(cfg.type)\n }\n for (const [key, cfg] of Object.entries(config.data ?? {})) {\n initial[`data.${key}`] = cfg.default ?? defaultFor(cfg.type)\n }\n\n if (sessionValues) {\n for (const [key, value] of Object.entries(sessionValues)) {\n if (value !== undefined) initial[key] = value\n }\n }\n\n return new VariableStore(initial)\n}\n","/**\n * v2 `context` — the **read-only, computed** namespace.\n *\n * Everything the funnel can *read* but never *write*: the device, the visitor's\n * locale, the current page, acquisition params (UTM), the session, and system\n * facts (funnel id, test/live mode, clock). It supersedes the v0 flat\n * `page.*`/`device.*`/`browser.*`/`os.*`/`query.*`/`metadata.*` system variables\n * (see {@link ./systemVariables}) by folding them into one nested object.\n *\n * Why it's *not* in the {@link ./variableStore}: the store holds **writable**\n * state (`user`/`responses`/`data`) that persists + re-renders per key. Context\n * is derived and read-only, so it lives as a plain object on a React context —\n * no subscriptions, no churn. The one moving part (`page`) is merged into the\n * snapshot from navigation state at read time.\n *\n * Authors read it through hooks (`useDevice()`, `useLocale()`, `usePage()`,\n * `useUtm()`) or inside routing/condition predicates as `s.context.*`.\n */\n\n// ── Shape ────────────────────────────────────────────────\n\nexport interface DeviceContext {\n type: 'mobile' | 'tablet' | 'desktop'\n isMobile: boolean\n isTablet: boolean\n screenWidth: number\n screenHeight: number\n viewportWidth: number\n viewportHeight: number\n colorDepth: number\n pixelRatio: number\n}\n\nexport interface BrowserContext {\n name: string\n version: string\n userAgent: string\n language: string\n cookieEnabled: boolean\n online: boolean\n}\n\nexport interface OsContext {\n name: string\n timezone: string\n}\n\nexport interface LocaleContext {\n /** Full locale, e.g. `en-US`. */\n locale: string\n /** Language subtag, e.g. `en`. */\n language: string\n /** Region subtag, e.g. `US` (may be empty). */\n region: string\n /** IANA timezone, e.g. `America/New_York`. */\n timeZone: string\n}\n\nexport interface PageContext {\n /** Current page key. */\n key: string\n /** Current page URL slug (`meta.slug`, defaults to the key) — what the renderer puts in the path. */\n slug: string\n /** 0-based position in the visited history. */\n index: number\n /** Total pages in the (expected) flow. */\n total: number\n /** 0–100. */\n progressPercentage: number\n /** Epoch ms the current page was entered. */\n startedAt: number\n}\n\n/** Acquisition / ad params captured on entry (the old `query.*` utm slice). */\nexport interface UtmContext {\n source?: string\n medium?: string\n campaign?: string\n content?: string\n term?: string\n [key: string]: string | undefined\n}\n\n/**\n * Per-network ad **click-ids** captured from the entry URL — the matching signals\n * the server CAPI needs. Named per network (not a generic bag) so the platform +\n * each integration map them precisely; `[key]` catches any others.\n */\nexport interface ClickIdContext {\n /** Meta / Facebook */\n fbclid?: string\n /** Google Ads (+ gbraid/wbraid for app↔web) */\n gclid?: string\n gbraid?: string\n wbraid?: string\n /** Microsoft / Bing */\n msclkid?: string\n /** TikTok */\n ttclid?: string\n /** Twitter / X */\n twclid?: string\n /** Snapchat */\n sccid?: string\n /** LinkedIn */\n li_fat_id?: string\n /** Pinterest */\n epik?: string\n /** Reddit */\n rdt_cid?: string\n [key: string]: string | undefined\n}\n\n/**\n * The full acquisition snapshot captured once on entry — the funnel reads `utm` /\n * `clickIds` off {@link FunnelContext}; the SDK forwards this whole thing to the\n * tracker (`setAcquisition`) so the platform persists it **first-class**: per-visit\n * on the session + **first-touch (write-once) on the Customer**, and the click-ids /\n * `_fbp`/`_fbc` cookies feed CAPI. Not stored as a generic attribute/answer.\n */\nexport interface Acquisition {\n utm: UtmContext\n clickIds: ClickIdContext\n /** CAPI cookies (`_fbp`/`_fbc`) read from `document.cookie` (not funnel-readable). */\n cookies: { fbp?: string; fbc?: string }\n /** `document.referrer` at entry. */\n referrer: string\n /** Entry URL path (the landing page). */\n landingPath: string\n}\n\nexport interface SessionContext {\n /** Server session id; null until resolved. */\n id: string | null\n /** Epoch ms the session began. */\n startedAt: number\n /** `document.referrer` at entry. */\n referrer: string\n}\n\n/**\n * Durable identity for **stable experiment bucketing** (phase-4 §4.2). The\n * preferred seed is `customerId` once known; before identification it's the\n * signed anonymous `visitorId` (P1). It is deliberately **not** the session id or\n * fingerprint — a returning visitor (e.g. via winback) must keep their variant\n * across sessions/devices (landmine #4). Both null = unidentifiable traffic, and\n * the experiment layer falls back to control rather than bucket on nothing.\n */\nexport interface IdentityContext {\n /** Known customer id (post-identification). The preferred bucketing seed. */\n customerId: string | null\n /** Signed anonymous visitor id. The fallback bucketing seed. */\n visitorId: string | null\n}\n\nexport interface SystemContext {\n funnelId: string\n campaignId: string\n /** Render mode — `test` for preview/QA, `live` for public traffic. */\n mode: 'test' | 'live'\n /** Epoch ms captured at build time (stable per render, not a live clock). */\n now: number\n}\n\n/** The whole read-only computed namespace, as read in predicates: `s.context.*`. */\nexport interface FunnelContext {\n device: DeviceContext\n browser: BrowserContext\n os: OsContext\n locale: LocaleContext\n page: PageContext\n utm: UtmContext\n /** Per-network ad click-ids captured on entry (funnel-readable; also forwarded for CAPI). */\n clickIds: ClickIdContext\n session: SessionContext\n identity: IdentityContext\n system: SystemContext\n}\n\n// ── Detection ────────────────────────────────────────────\n\ninterface RawBrowser {\n device: DeviceContext\n browser: BrowserContext\n os: OsContext\n locale: LocaleContext\n}\n\nlet cached: RawBrowser | null = null\n\nfunction extractVersion(ua: string, regex: RegExp): string {\n return ua.match(regex)?.[1] ?? '0'\n}\n\n/**\n * Sniff device/browser/os/locale from the environment, once. SSR-safe: returns\n * neutral defaults when `window` is absent. (Self-contained v2 detector — the v0\n * {@link ./systemVariables} equivalent emits flat store keys; this returns the\n * nested shape.)\n */\nfunction detect(): RawBrowser {\n if (cached) return cached\n\n if (typeof window === 'undefined') {\n cached = {\n device: {\n type: 'desktop', isMobile: false, isTablet: false,\n screenWidth: 0, screenHeight: 0, viewportWidth: 0, viewportHeight: 0,\n colorDepth: 24, pixelRatio: 1,\n },\n browser: {\n name: 'Unknown', version: '0', userAgent: 'unknown',\n language: 'en', cookieEnabled: true, online: true,\n },\n os: { name: 'Unknown', timezone: 'UTC' },\n locale: { locale: 'en', language: 'en', region: '', timeZone: 'UTC' },\n }\n return cached\n }\n\n const ua = navigator.userAgent\n const l = ua.toLowerCase()\n\n let name = 'Unknown'\n let version = '0'\n if (l.includes('firefox')) { name = 'Firefox'; version = extractVersion(ua, /Firefox\\/(\\d+[\\d.]*)/) }\n else if (l.includes('edg')) { name = 'Edge'; version = extractVersion(ua, /Edg\\/(\\d+[\\d.]*)/) }\n else if (l.includes('chrome') && !l.includes('edg')) { name = 'Chrome'; version = extractVersion(ua, /Chrome\\/(\\d+[\\d.]*)/) }\n else if (l.includes('safari') && !l.includes('chrome')) { name = 'Safari'; version = extractVersion(ua, /Version\\/(\\d+[\\d.]*)/) }\n\n let osName = 'Unknown'\n if (l.includes('win')) osName = 'Windows'\n else if (l.includes('mac')) osName = 'macOS'\n else if (l.includes('linux') && !l.includes('android')) osName = 'Linux'\n else if (l.includes('android')) osName = 'Android'\n else if (/iphone|ipad|ipod/.test(l)) osName = 'iOS'\n\n let type: DeviceContext['type'] = 'desktop'\n if (/mobile|android(?!.*tablet)|iphone|ipod/.test(l)) type = 'mobile'\n else if (/tablet|ipad/.test(l)) type = 'tablet'\n\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'\n const fullLocale = navigator.language || 'en'\n const [language = 'en', region = ''] = fullLocale.split('-')\n\n cached = {\n device: {\n type, isMobile: type === 'mobile', isTablet: type === 'tablet',\n screenWidth: window.screen?.width || 0,\n screenHeight: window.screen?.height || 0,\n viewportWidth: window.innerWidth || 0,\n viewportHeight: window.innerHeight || 0,\n colorDepth: window.screen?.colorDepth || 24,\n pixelRatio: window.devicePixelRatio || 1,\n },\n browser: {\n name, version, userAgent: ua,\n language: fullLocale,\n cookieEnabled: navigator.cookieEnabled ?? true,\n online: navigator.onLine ?? true,\n },\n os: { name: osName, timezone: timeZone },\n locale: { locale: fullLocale, language, region, timeZone },\n }\n return cached\n}\n\n/** Collect `utm_*` params (and any extras) from the URL. SSR-safe. */\nfunction collectUtm(): UtmContext {\n if (typeof window === 'undefined') return {}\n const out: UtmContext = {}\n const params = new URLSearchParams(window.location.search)\n params.forEach((value, key) => {\n if (key.startsWith('utm_')) out[key.slice(4)] = value\n })\n return out\n}\n\n/** Known ad-network click-id params. Any present in the URL is captured. */\nconst CLICK_ID_PARAMS = [\n 'fbclid', 'gclid', 'gbraid', 'wbraid', 'msclkid', 'ttclid',\n 'twclid', 'sccid', 'li_fat_id', 'epik', 'rdt_cid', 'dclid', 'irclickid',\n]\n\n/** Collect ad-network click-ids from the entry URL. SSR-safe. */\nfunction collectClickIds(): ClickIdContext {\n if (typeof window === 'undefined') return {}\n const out: ClickIdContext = {}\n const params = new URLSearchParams(window.location.search)\n for (const key of CLICK_ID_PARAMS) {\n const v = params.get(key)\n if (v) out[key] = v\n }\n return out\n}\n\n/** Read a cookie value by name. SSR-safe AND sandbox-safe: in an opaque-origin sandboxed\n * iframe (e.g. the editor preview, which deliberately has no allow-same-origin) the native\n * `document.cookie` GETTER throws a SecurityError — degrade to \"no cookie\", never crash. */\nfunction readCookie(name: string): string | undefined {\n if (typeof document === 'undefined') return undefined\n try {\n const m = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'))\n return m ? decodeURIComponent(m[1]) : undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Assemble the full {@link Acquisition} snapshot from the context + `document`\n * (cookies, referrer, path) — captured once on entry, forwarded to the tracker for\n * first-class persistence (session + first-touch Customer) + CAPI.\n */\nexport function buildAcquisition(context: FunnelContext): Acquisition {\n return {\n utm: context.utm,\n clickIds: context.clickIds,\n cookies: { fbp: readCookie('_fbp'), fbc: readCookie('_fbc') },\n referrer: context.session.referrer,\n landingPath: typeof window !== 'undefined' ? window.location.pathname : '',\n }\n}\n\nexport interface BuildContextOptions {\n funnelId?: string\n campaignId?: string\n mode?: 'test' | 'live'\n /** Stable build-time clock (avoids `Date.now()` churn in renders/tests). */\n now?: number\n sessionId?: string | null\n /** Known customer id — the preferred stable bucketing seed (phase-4 §4.2). */\n customerId?: string | null\n /** Signed anonymous visitor id — the fallback bucketing seed. */\n visitorId?: string | null\n /** Overrides for any slice — used by the server to hydrate `utm`/`session`. */\n overrides?: Partial<FunnelContext>\n}\n\n/**\n * Build the read-only {@link FunnelContext} once, at mount. `page` starts at the\n * first page and is replaced per navigation when assembling a snapshot.\n */\nexport function buildContext(opts: BuildContextOptions = {}): FunnelContext {\n const raw = detect()\n const now = opts.now ?? 0\n const referrer = typeof document !== 'undefined' ? document.referrer : ''\n\n const base: FunnelContext = {\n device: raw.device,\n browser: raw.browser,\n os: raw.os,\n locale: raw.locale,\n utm: collectUtm(),\n clickIds: collectClickIds(),\n page: { key: '', slug: '', index: 0, total: 0, progressPercentage: 0, startedAt: now },\n session: { id: opts.sessionId ?? null, startedAt: now, referrer },\n identity: { customerId: opts.customerId ?? null, visitorId: opts.visitorId ?? null },\n system: {\n funnelId: opts.funnelId ?? '',\n campaignId: opts.campaignId ?? '',\n mode: opts.mode ?? 'live',\n now,\n },\n }\n\n if (!opts.overrides) return base\n return {\n ...base,\n ...opts.overrides,\n device: { ...base.device, ...opts.overrides.device },\n browser: { ...base.browser, ...opts.overrides.browser },\n os: { ...base.os, ...opts.overrides.os },\n locale: { ...base.locale, ...opts.overrides.locale },\n utm: { ...base.utm, ...opts.overrides.utm },\n clickIds: { ...base.clickIds, ...opts.overrides.clickIds },\n page: { ...base.page, ...opts.overrides.page },\n session: { ...base.session, ...opts.overrides.session },\n identity: { ...base.identity, ...opts.overrides.identity },\n system: { ...base.system, ...opts.overrides.system },\n }\n}\n\n/** Internal: reset the detection cache (tests only). */\nexport function __resetContextCache(): void {\n cached = null\n}\n","/**\n * v2 tracking seam — the funnel runtime emits a **fixed event taxonomy**, but\n * never talks to the network itself. It calls a {@link Tracker} the platform/CLI\n * injects via {@link FunnelProvider}. The real implementation is the existing\n * {@link ./tracker}.`FunnelTracker` (session id, ad attribution, debounced\n * persistence, CAPI fan-out); tests and local dev use {@link createConsoleTracker}.\n *\n * The taxonomy is preserved verbatim from v0 so analytics keep working:\n * funnel.start · page.view · page.exit · user.registered · experiment.exposure ·\n * checkout.start · checkout.payment_added · checkout.failed · purchase.complete\n *\n * Where each fires (all from the SDK runtime):\n * - `funnel.start` / `page.view` / `page.exit` / `experiment.exposure` — navigation\n * ({@link ../flow/flow}.`FunnelView`); `page.exit` carries duration + active (visible) time.\n * - `user.registered` — `identify()`, the first time `user.email` is written.\n * - `checkout.*` / `purchase.complete` — the commerce primitives ({@link ../commerce/checkout}).\n * `checkout.payment_added` is reported by an inline driver via `onPaymentAdded` (optional).\n *\n * A `responses.set(...)` does **not** emit a discrete event — values are batched into\n * `userData` and persisted (debounced). Only the events above fire.\n */\n\nimport {\n createContext,\n createElement,\n useCallback,\n useContext,\n type ReactNode,\n} from 'react'\nimport type { Acquisition } from '../state/context'\n\n// ── Event taxonomy (typed, preserved from v0) ────────────\n\nexport interface FunnelEventDataMap {\n 'funnel.start': Record<string, never>\n 'page.view': { pageId: string; pageKey?: string; pageName?: string; isInitial?: boolean; eventId?: string }\n 'page.exit': { pageId: string; durationMs: number; activeMs: number }\n 'user.registered': { email: string; eventId?: string }\n 'checkout.start': { productId?: string; priceId?: string; productName?: string; surface?: string }\n 'checkout.payment_added': Record<string, never>\n 'checkout.failed': { category: string; declineCode?: string; productId?: string; intent?: string }\n 'purchase.complete': { amount?: number; currency?: string; email?: string; eventId?: string }\n 'experiment.exposure': { experimentId: string; variant: string; version?: number }\n}\n\n/**\n * Build the `experiment.exposure` payload — ONE constructor for both exposure\n * emitters (the PAGE path in flow.tsx and the FUNNEL path in platformTracker),\n * so the wire shape can't drift between them. `version` is the platform record\n * version results key on; omitted (not `undefined`) when the record has none.\n */\nexport function exposurePayload(\n experimentId: string,\n variant: string,\n version?: number,\n): FunnelEventDataMap['experiment.exposure'] {\n return { experimentId, variant, ...(version !== undefined ? { version } : {}) }\n}\n\n/**\n * A unique id for an analytics event, used as the **dedup key** between the\n * browser pixel (`fbq(..., { eventID })`) and the server CAPI call. Browser-\n * originated events (page.view, registration) mint one with this; **purchase /\n * subscription events carry the id the *server* minted** (the charge is the source\n * of truth) — see `CheckoutResult.eventId`.\n */\nlet _eventIdCounter = 0\nexport function newEventId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID()\n return `af_${Date.now().toString(36)}_${(_eventIdCounter++).toString(36)}`\n}\n\nexport type KnownFunnelEvent = keyof FunnelEventDataMap\n\n/**\n * The surface the runtime needs from a tracker. A subset of `FunnelTracker`, so\n * the real one satisfies it directly; the console tracker is a trivial stub.\n */\nexport interface Tracker {\n /** Emit a known event (typed) or any custom event name. */\n track<E extends KnownFunnelEvent>(event: E, data?: FunnelEventDataMap[E], userData?: Record<string, unknown>): void\n track(event: string, data?: Record<string, unknown>, userData?: Record<string, unknown>): void\n /**\n * Identify by email — fires `user.registered` (idempotent in the impl). The\n * optional `eventId` is the browser↔CAPI dedup key for the registration event.\n */\n identify(email: string, eventId?: string): void\n /** Push the latest variable snapshot for batched/debounced persistence. */\n setVariables?(variables: Record<string, unknown>): void\n /**\n * The acquisition snapshot (utm + click-ids + `_fbp`/`_fbc` + referrer), pushed\n * once on entry. The platform persists it first-class — per-visit on the session +\n * **first-touch (write-once) on the Customer** — and feeds it to CAPI. Optional;\n * the console/test trackers ignore it.\n */\n setAcquisition?(acquisition: Acquisition): void\n}\n\n/** A no-op-ish tracker that logs to the console — for tests, preview, local dev. */\nexport function createConsoleTracker(opts: { silent?: boolean } = {}): Tracker {\n const log = (label: string, ...args: unknown[]) => {\n if (!opts.silent) console.info(`[appfunnel] ${label}`, ...args)\n }\n return {\n track: (event: string, data?: unknown) => log(`track ${event}`, data ?? {}),\n identify: (email: string, eventId?: string) => log('identify', email, eventId),\n setVariables: (vars) => log('vars', vars),\n setAcquisition: (acq) => log('acquisition', acq),\n }\n}\n\n// ── React wiring ─────────────────────────────────────────\n\nconst TrackerContext = createContext<Tracker | null>(null)\n\nexport function TrackerProvider({\n tracker,\n children,\n}: {\n tracker: Tracker\n children: ReactNode\n}): ReactNode {\n return createElement(TrackerContext.Provider, { value: tracker }, children)\n}\n\n/** Internal: the raw tracker, or a silent console fallback if none provided. */\nexport function useTrackerRef(): Tracker {\n return useContext(TrackerContext) ?? FALLBACK\n}\n\nconst FALLBACK = createConsoleTracker({ silent: true })\n\n/**\n * `const { track } = useTracker()` — emit a custom event. Auto events\n * (page.view, identify, purchase, …) fire on their own; this is the escape\n * hatch for funnel-specific events (`track('quiz_skipped', { step: 3 })`).\n */\nexport function useTracker(): { track: Tracker['track'] } {\n const tracker = useTrackerRef()\n const track = useCallback(\n (event: string, data?: Record<string, unknown>, userData?: Record<string, unknown>) =>\n tracker.track(event, data as never, userData),\n [tracker],\n )\n return { track }\n}\n","/**\n * The **`window.appfunnel` event bus** — the client-side integration surface\n * (port of v0 `admin/lib/funnel/utils/appfunnelRuntime.ts`).\n *\n * Every taxonomy event the runtime emits is mirrored here, so on-page pixels and\n * custom scripts integrate by **subscribing** — `window.appfunnel.on('purchase.complete', …)`\n * — instead of the funnel hand-injecting pixel config per page. The pre-built pixel\n * loaders (Meta/TikTok/GTM/Clarity) are just subscribers; CAPI stays the server-side\n * default (this is the *client* sink of the same events). See doc 08 §3.\n *\n * Two deliberate properties vs. v0:\n * - **Replay history** (`events`): async pixels load *after* `funnel.start`/`page.view`\n * fire, so a late subscriber would miss them. The bus keeps a bounded history a\n * subscriber can replay (the GTM `dataLayer` trick) — no lost events.\n * - **Subscribe + read only.** The window surface exposes `on`/`off`/`events` + read\n * getters; it has **no `emit`** (third-party code can't forge events) and **no\n * mutating actions** (`setVariable`/navigation) — the funnel can't be driven through\n * it. (v0's full-control Custom-JS API is deferred pending the bus-control-scope\n * decision; doc 08 §3 + §4.)\n */\n\nimport { newEventId, type Tracker } from './tracking'\n\n/** Read accessors the bus exposes — wired to the funnel's store + context. */\nexport interface BusAccessors {\n getVariable: (key: string) => unknown\n getVariables: () => Record<string, unknown>\n getCurrentPageId: () => string | null\n getCustomerId: () => string | null\n getVisitorId: () => string | null\n}\n\nexport interface BusEvent {\n event: string\n data: unknown\n /** Epoch ms the event was emitted (for ordering / replay). */\n ts: number\n}\n\ntype Listener = (data: unknown) => void\n\n/** The public `window.appfunnel` surface — subscribe + read, never emit or mutate. */\nexport interface AppFunnelBusApi extends BusAccessors {\n /** Subscribe to an event (or `'*'` for all). Returns an unsubscribe fn. */\n on(event: string, cb: Listener): () => void\n off(event: string, cb: Listener): void\n /** Bounded replay history — read past events, then `on()` for future ones. */\n readonly events: BusEvent[]\n}\n\nconst MAX_HISTORY = 250\n\n/**\n * The internal bus: the public {@link AppFunnelBusApi} plus `emit` (SDK-only) and\n * `now` injection. The SDK holds this; only {@link AppFunnelBusApi} reaches `window`.\n */\nexport interface FunnelBus extends AppFunnelBusApi {\n emit(event: string, data?: unknown): void\n}\n\n/** Create a bus over the given read accessors. `now` is injectable for tests. */\nexport function createBus(accessors: BusAccessors, now: () => number = () => Date.now()): FunnelBus {\n const listeners = new Map<string, Set<Listener>>()\n const events: BusEvent[] = []\n\n const on: AppFunnelBusApi['on'] = (event, cb) => {\n let set = listeners.get(event)\n if (!set) listeners.set(event, (set = new Set()))\n set.add(cb)\n return () => off(event, cb)\n }\n const off: AppFunnelBusApi['off'] = (event, cb) => {\n listeners.get(event)?.delete(cb)\n }\n\n const emit = (event: string, data?: unknown) => {\n events.push({ event, data, ts: now() })\n if (events.length > MAX_HISTORY) events.shift()\n // Exact-event listeners, then wildcard. A throwing subscriber never breaks the rest.\n for (const cb of listeners.get(event) ?? []) {\n try { cb(data) } catch { /* a pixel error must not break the funnel */ }\n }\n for (const cb of listeners.get('*') ?? []) {\n try { cb({ event, data }) } catch { /* ignore */ }\n }\n }\n\n return { on, off, events, emit, ...accessors }\n}\n\n/**\n * Wrap a {@link Tracker} so every emitted taxonomy event is mirrored to the bus\n * (the client sink). `identify()` also surfaces a `user.registered` to the bus, so\n * pixels see registration. The server sink (the inner tracker → CAPI) is untouched.\n */\nexport function withBus(tracker: Tracker, bus: FunnelBus): Tracker {\n return {\n // Spread preserves the original call arity (don't append an undefined userData).\n track: ((...args: [string, unknown?, Record<string, unknown>?]) => {\n ;(tracker.track as (...a: unknown[]) => void)(...args)\n bus.emit(args[0], args[1])\n }) as Tracker['track'],\n identify: (email: string, eventId?: string) => {\n // One id shared by the server (inner.identify → CAPI) and the bus (pixel) so\n // CompleteRegistration dedupes across browser + server.\n const id = eventId ?? newEventId()\n tracker.identify(email, id)\n bus.emit('user.registered', { email, eventId: id })\n },\n setVariables: tracker.setVariables ? (v) => tracker.setVariables!(v) : undefined,\n // Acquisition is persistence (session + first-touch Customer), not a bus event.\n setAcquisition: tracker.setAcquisition ? (a) => tracker.setAcquisition!(a) : undefined,\n }\n}\n\ndeclare global {\n interface Window {\n appfunnel?: AppFunnelBusApi\n }\n}\n\n/**\n * Attach the bus's public surface to `window.appfunnel` (client-side only).\n * Returns a detach fn for unmount. No-op under SSR.\n */\nexport function attachBus(bus: FunnelBus): () => void {\n if (typeof window === 'undefined') return () => {}\n const { on, off, getVariable, getVariables, getCurrentPageId, getCustomerId, getVisitorId } = bus\n const api: AppFunnelBusApi = {\n on, off, getVariable, getVariables, getCurrentPageId, getCustomerId, getVisitorId,\n get events() { return bus.events },\n }\n window.appfunnel = api\n return () => {\n if (window.appfunnel === api) delete window.appfunnel\n }\n}\n","/**\n * v2 localization — translated **text** (prices already localize via `Intl` in\n * {@link ./catalog}). Per doc 05: locales live in the funnel source — supported\n * locales + default + fallback are funnel config ({@link FunnelLocales}), and\n * each locale is a flat `key → string` **catalog** (`messages/en.json`, …),\n * versioned + published with the funnel. The dashboard's manual translation\n * table edits exactly these catalogs.\n *\n * Lookup walks a **fallback chain** (active → fallback → default) so a missing\n * string never blanks — it falls through, and only as a last resort returns the\n * key (flagged in dev). Interpolation is simple `{{var}}`; plurals use the\n * built-in `Intl.PluralRules`; numbers/dates/percent use `Intl`. No ICU, no rich\n * markup (markup stays in TSX).\n */\n\nimport {\n createContext,\n createElement,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react'\nimport type { FunnelLocales } from '../flow/spine'\nimport { isRtl, resolveLocale, type Direction } from './locale'\n\n// Pure locale resolution lives in ./locale (React-free, shared with the\n// server/tooling entry); re-exported here so existing imports keep working.\nexport { isRtl, resolveLocale } from './locale'\nexport type { Direction } from './locale'\n\n/** locale → (message key → string). The shape of `messages/<locale>.json`. */\nexport type MessageCatalog = Record<string, Record<string, string>>\n\nexport type PluralCategory = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'\n\n/** Replace `{{name}}` placeholders; leaves unknown ones intact. */\nfunction interpolate(str: string, params?: Record<string, string | number>): string {\n if (!params) return str\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, k: string) => (k in params ? String(params[k]) : `{{${k}}}`))\n}\n\n/** Walk the fallback chain for a key; undefined if absent everywhere. */\nfunction lookup(catalog: MessageCatalog, chain: string[], key: string): string | undefined {\n for (const loc of chain) {\n const v = catalog[loc]?.[key]\n if (v !== undefined) return v\n }\n return undefined\n}\n\nfunction devWarn(message: string): void {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV\n if (env === 'production') return\n try {\n console.warn(message)\n } catch {\n /* no-op */\n }\n}\n\n// ── Public types ─────────────────────────────────────────\n\nexport interface TFunction {\n /** Translate a key, with optional `{{var}}` params. Missing → fallback → key. */\n (key: string, params?: Record<string, string | number>): string\n /** Locale-correct plural: `t.plural(n, { one: '# day', other: '# days' })` (`#` → n). */\n plural: (\n n: number,\n forms: Partial<Record<PluralCategory, string>>,\n params?: Record<string, string | number>,\n ) => string\n}\n\nexport interface Formatters {\n number: (n: number, opts?: Intl.NumberFormatOptions) => string\n date: (d: Date | number, opts?: Intl.DateTimeFormatOptions) => string\n percent: (n: number, opts?: Intl.NumberFormatOptions) => string\n}\n\nexport interface Translation {\n t: TFunction\n fmt: Formatters\n /** The active (resolved) locale. */\n locale: string\n /** Switch locale at runtime (preview / language picker). */\n setLocale: (locale: string) => void\n /** Text direction for the active locale. */\n dir: Direction\n /** The funnel's supported locales. */\n locales: string[]\n}\n\n// ── React wiring ─────────────────────────────────────────\n\ninterface LocaleContextValue {\n locale: string\n setLocale: (locale: string) => void\n config?: FunnelLocales\n catalog: MessageCatalog\n}\n\nconst LocaleContext = createContext<LocaleContextValue | null>(null)\n\nexport interface LocaleProviderProps {\n config?: FunnelLocales\n catalog?: MessageCatalog\n /** Device/browser locale (from computed context) — the resolution input. */\n detected: string\n /** Explicit override (URL/param/geo), highest priority. */\n override?: string\n children: ReactNode\n}\n\n/** Resolves + holds the active locale and the message catalog. */\nexport function LocaleProvider({\n config,\n catalog = {},\n detected,\n override,\n children,\n}: LocaleProviderProps): ReactNode {\n const [locale, setLocale] = useState(() => resolveLocale(config, detected, override))\n // Re-resolve when the inputs change (SSR-hydrated override arriving late, a\n // preview switching `locale`, config swap). A runtime `setLocale` (language\n // picker) survives re-renders — this only fires when a *prop* changes; React\n // bails out when the re-resolved locale is unchanged.\n useEffect(() => {\n setLocale(resolveLocale(config, detected, override))\n }, [config, detected, override])\n const value = useMemo<LocaleContextValue>(\n () => ({ locale, setLocale, config, catalog }),\n [locale, config, catalog],\n )\n return createElement(LocaleContext.Provider, { value }, children)\n}\n\n/** The active (resolved) funnel locale, or `'en'` if no provider — for display\n * formatting (e.g. {@link ./catalog} prices) without building the full handle. */\nexport function useActiveLocale(): string {\n return useContext(LocaleContext)?.locale ?? 'en'\n}\n\n/**\n * `const { t, fmt, locale, dir } = useTranslation()` — translated text +\n * locale-aware `Intl` formatters for the active funnel locale.\n */\nexport function useTranslation(): Translation {\n const ctx = useContext(LocaleContext)\n if (!ctx) throw new Error('useTranslation must be used inside <FunnelProvider>')\n const { locale, setLocale, config, catalog } = ctx\n\n const chain = useMemo(() => {\n const def = config?.default\n const fb = config?.fallback\n return Array.from(new Set([locale, fb, def].filter(Boolean) as string[]))\n }, [locale, config])\n\n const t = useMemo<TFunction>(() => {\n const fn = ((key: string, params?: Record<string, string | number>) => {\n const raw = lookup(catalog, chain, key)\n if (raw === undefined) {\n devWarn(`[appfunnel] missing translation: \"${key}\" (${locale})`)\n return key\n }\n return interpolate(raw, params)\n }) as TFunction\n fn.plural = (n, forms, params) => {\n let rule: PluralCategory\n try {\n rule = new Intl.PluralRules(locale).select(n) as PluralCategory\n } catch {\n rule = 'other'\n }\n const form = forms[rule] ?? forms.other ?? ''\n return interpolate(form.replace(/#/g, String(n)), params)\n }\n return fn\n }, [catalog, chain, locale])\n\n // Like formatMoney: an invalid locale/options must degrade to a plain\n // rendering, never throw mid-render.\n const fmt = useMemo<Formatters>(\n () => ({\n number: (n, opts) => {\n try {\n return new Intl.NumberFormat(locale, opts).format(n)\n } catch {\n return String(n)\n }\n },\n date: (d, opts) => {\n try {\n return new Intl.DateTimeFormat(locale, opts).format(d)\n } catch {\n return String(d instanceof Date ? d.toISOString() : d)\n }\n },\n percent: (n, opts) => {\n try {\n return new Intl.NumberFormat(locale, { style: 'percent', ...opts }).format(n)\n } catch {\n return `${(n * 100).toFixed(0)}%`\n }\n },\n }),\n [locale],\n )\n\n return {\n t,\n fmt,\n locale,\n setLocale,\n dir: isRtl(locale) ? 'rtl' : 'ltr',\n locales: config?.supported ?? [locale],\n }\n}\n","/**\n * v2 `products` — the **read-only** product catalog.\n *\n * **AppFunnel does not manage currency.** Multi-currency is entirely the payment\n * provider's job: the provider (or its preview API) resolves the visitor's price,\n * and we receive a single resolved `{ amount, currency }` per product. No FX, no\n * currency selection, no conversion on our side. (FX appears only for frozen-USD\n * *reporting*, never display — phase-3 §3.6b.) A provider that doesn't localize\n * simply gives one currency.\n *\n * Our only job is **display**: pick the product by logical id and **format** its\n * amount. Formatting happens at read time in the funnel's **active locale** (so\n * switching language reformats `kr 79,00` ⇄ `$9.99`), while the **currency** is\n * whatever the provider resolved. Currency selection is the platform's; the\n * authoring funnel only ever names a product id.\n *\n * The math itself (resolve/format/exponents) is pure and lives in {@link ./money}\n * so the server/tooling entry can use it without React — this module re-exports\n * it and adds the React wiring (provider + hooks).\n */\n\nimport {\n createContext,\n createElement,\n useContext,\n useMemo,\n type ReactNode,\n} from 'react'\nimport { useActiveLocale } from '../i18n/translation'\nimport { formatProduct, type Product, type ResolvedProduct } from './money'\n\nexport {\n resolveProduct,\n buildCatalog,\n formatMoney,\n formatProduct,\n currencyExponent,\n} from './money'\nexport type { Product, ResolvedProduct, ProductInput, Money, Interval } from './money'\n\n// ── React wiring ─────────────────────────────────────────\n\nconst CatalogContext = createContext<Map<string, ResolvedProduct> | null>(null)\n\nexport function CatalogProvider({\n catalog,\n children,\n}: {\n catalog: Map<string, ResolvedProduct>\n children: ReactNode\n}): ReactNode {\n return createElement(CatalogContext.Provider, { value: catalog }, children)\n}\n\nfunction useCatalog(): Map<string, ResolvedProduct> {\n return useContext(CatalogContext) ?? EMPTY\n}\nconst EMPTY = new Map<string, ResolvedProduct>()\n\n/** `useProduct('monthly')` — one product, formatted in the active locale. */\nexport function useProduct(id: string | undefined): Product | undefined {\n const catalog = useCatalog()\n const locale = useActiveLocale()\n const resolved = id ? catalog.get(id) : undefined\n return useMemo(() => (resolved ? formatProduct(resolved, locale) : undefined), [resolved, locale])\n}\n\n/** `useProducts()` — every product, formatted in the active locale, in order. */\nexport function useProducts(): Product[] {\n const catalog = useCatalog()\n const locale = useActiveLocale()\n return useMemo(\n () => Array.from(catalog.values()).map((r) => formatProduct(r, locale)),\n [catalog, locale],\n )\n}\n","import {\n createContext,\n createElement,\n lazy,\n Suspense,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n useTransition,\n type ComponentType,\n type ReactNode,\n} from 'react'\nimport { useFunnel } from '../state/namespaces'\nimport { exposurePayload, newEventId, useTrackerRef, type Tracker } from '../tracking/tracking'\nimport { entryGuard, evaluateGate, expectedPathLength, nextPage, outgoingKeys, type FlowPage, type PageMeta } from './spine'\nimport { bucketingSeed, resolveExperiments } from './experiments'\nimport type { PageContext } from '../state/context'\n\n/** What a page's `load` resolves to — a component, or a module default-exporting one. */\nexport type PageModule = ComponentType | { default: ComponentType }\n\n/**\n * A page wired into the runtime. Provide **either** an eager `Component` (small\n * funnels, tests) **or** a lazy `load` (code-split: the renderer hands a dynamic\n * `import()` so a big funnel ships one chunk per page, not the whole funnel).\n */\nexport interface RuntimePage {\n key: string\n meta?: PageMeta\n /** Eager component. Provide this or `load`. */\n Component?: ComponentType\n /** Lazy loader for a code-split chunk. Provide this or `Component`. */\n load?: () => Promise<PageModule>\n}\n\nexport interface NavigationState {\n /** The current page's read-only context (key, index, total, progress). */\n page: PageContext\n /** Advance via the current page's `next` predicate, else the linear next. */\n next: () => void\n /** Go to the previous page in history. */\n back: () => void\n /** Jump to a specific page key. */\n go: (key: string) => void\n /** Warm a page's code-split chunk ahead of navigation (e.g. on link hover). No-op for eager pages. */\n prefetch: (key: string) => void\n /**\n * The page keys the visitor could go to next, already resolved to the chunk that\n * would render (experiment variant applied). The **renderer** maps these to chunk\n * URLs and emits `<link rel=\"modulepreload\">` (the browser-native, non-executing,\n * SSR-able prefetch — see v0 `HeadlessFunnelRenderer`). The SDK's `load()`-based\n * `prefetch` is the fallback for mounts without a modulepreload manager.\n */\n nextCandidates: string[]\n canGoBack: boolean\n /**\n * True while a navigation's target page chunk is still resolving (a cold,\n * un-prefetched lazy chunk). The current page stays on screen during this window\n * (no Suspense-fallback flicker); read this to show a subtle \"working\" affordance\n * so a tapped button doesn't feel dead. Usually false/instant when the next chunk\n * was prefetched.\n */\n isNavigating: boolean\n}\n\nconst NavContext = createContext<NavigationState | null>(null)\n\n/** experiment id → the variant this visitor is bucketed into, for the live render. */\nconst ExperimentContext = createContext<Record<string, string>>({})\n\n/**\n * `const variant = useExperiment('welcome-headline')` — the variant key this\n * visitor is assigned in an experiment (`undefined` if not in one). Page-variant\n * swapping is automatic; this is for branching *within* a page or custom logging.\n */\nexport function useExperiment(id: string): string | undefined {\n return useContext(ExperimentContext)[id]\n}\n\n/**\n * Compute the read-only page context for a position in the flow. `total` is the\n * **expected** path length for the visitor's current answers (see\n * {@link expectedPathLength}) — not the raw file count — so progress reaches 100%\n * on whichever branch the funnel actually takes. Clamped so a visitor who jumped\n * past the traced path can't read above 100%.\n */\nfunction pageContextFor(\n currentKey: string,\n slug: string,\n index: number,\n total: number,\n startedAt: number,\n): PageContext {\n const denom = Math.max(total, index + 1)\n return {\n key: currentKey,\n slug,\n index,\n total: denom,\n progressPercentage: denom > 0 ? Math.min(100, Math.round(((index + 1) / denom) * 100)) : 0,\n startedAt,\n }\n}\n\n/** Page-timing clock (effects only, never render). */\nconst now = () => (typeof performance !== 'undefined' ? performance.now() : Date.now())\n\n/**\n * `page.exit` timing — wall-clock duration on a page, minus time the tab was\n * hidden (active engagement). Emits for the page being LEFT on each page change;\n * the final page's exit fires on unmount.\n */\nfunction usePageExitTimer(tracker: Tracker, currentKey: string | undefined): void {\n const timer = useRef<{ key: string; enteredAt: number; hidden: number; hiddenSince: number | null } | null>(null)\n const emitExit = useCallback(() => {\n const t = timer.current\n if (!t) return\n const at = now()\n const hidden = t.hidden + (t.hiddenSince != null ? at - t.hiddenSince : 0)\n const durationMs = Math.round(at - t.enteredAt)\n tracker.track('page.exit', { pageId: t.key, durationMs, activeMs: Math.max(0, Math.round(durationMs - hidden)) })\n }, [tracker])\n\n // Track tab visibility so `activeMs` excludes backgrounded time.\n useEffect(() => {\n if (typeof document === 'undefined') return\n const onVis = () => {\n const t = timer.current\n if (!t) return\n if (document.visibilityState === 'hidden') t.hiddenSince = now()\n else if (t.hiddenSince != null) {\n t.hidden += now() - t.hiddenSince\n t.hiddenSince = null\n }\n }\n document.addEventListener('visibilitychange', onVis)\n return () => document.removeEventListener('visibilitychange', onVis)\n }, [])\n\n // On each page change emit page.exit for the page being left, then start the\n // new page's timer.\n useEffect(() => {\n if (!currentKey) return\n if (timer.current && timer.current.key !== currentKey) emitExit()\n const hidden = typeof document !== 'undefined' && document.visibilityState === 'hidden'\n timer.current = { key: currentKey, enteredAt: now(), hidden: 0, hiddenSince: hidden ? now() : null }\n }, [currentKey, emitExit])\n\n useEffect(() => () => emitExit(), [emitExit])\n}\n\n/**\n * Renders the funnel: shows the current page and drives navigation. `next()`\n * resolves the current page's `next` predicate against the live snapshot\n * (writable namespaces + read-only `context`), falling back to the linear next\n * page in file order (see {@link nextPage}).\n *\n * Auto-emits `funnel.start` on mount and `page.view` on each page change, and\n * keeps `context.page` in sync so predicates and `usePage()` see the live page.\n *\n * Pass a `layout` (a `{ children }` component) for **persistent chrome** — a\n * header, progress bar, background — rendered *inside* the nav context but\n * *outside* the page swap, so it mounts once and never remounts on navigation\n * (and can read `usePage`/`useNavigation`).\n *\n * Must live inside `<FunnelProvider>`.\n */\nexport function FunnelView({\n pages,\n initialKey,\n layout,\n fallback,\n prefetch: prefetchMode = 'auto',\n onNavigate,\n}: {\n pages: RuntimePage[]\n initialKey?: string\n layout?: ComponentType<{ children: ReactNode }>\n /** Shown in the page area while a lazy page's chunk loads (the layout persists around it). */\n fallback?: ReactNode\n /**\n * `'auto'` (default): the SDK warms next-likely chunks by calling `load()`.\n * `'off'`: the **renderer** owns prefetch (via `<link rel=\"modulepreload\">` over\n * `useNavigation().nextCandidates`) — avoids the redundant `load()` execution.\n */\n prefetch?: 'auto' | 'off'\n /**\n * Fires on every page change (incl. the initial page) with the current page key\n * + slug. The **renderer** uses it to sync the URL path (`history.replaceState`,\n * v0-style — funnel back is in-memory, not browser history). Fires for the\n * *resolved* page, so if an entry `guard` bounced a deep-link to the start, the\n * URL gets corrected.\n */\n onNavigate?: (key: string, slug: string) => void\n}): ReactNode {\n const funnel = useFunnel()\n const tracker = useTrackerRef()\n\n // Resolve each page to a renderable component: eager `Component` as-is, or a\n // stable `React.lazy` over `load` (memoized so the lazy element identity is\n // stable across renders → no remount). `loaders` keeps the raw `load` fns for\n // prefetch (dynamic import dedupes, so calling them early just warms the chunk).\n const components = useMemo(() => {\n const map = new Map<string, ComponentType>()\n for (const p of pages) {\n if (p.Component) map.set(p.key, p.Component)\n else if (p.load) {\n const load = p.load\n map.set(p.key, lazy(() => Promise.resolve(load()).then((m) =>\n typeof m === 'function' ? { default: m } : m,\n )))\n }\n }\n return map\n }, [pages])\n const loaders = useMemo(\n () => new Map(pages.filter((p) => p.load).map((p) => [p.key, p.load!])),\n [pages],\n )\n\n // Resolve page-level experiments once for this visitor: which variant of each\n // slot to show, and which variant pages drop out of the linear flow. The seed is\n // PINNED to the first non-null value for this mount (a ref, not the live context) so a\n // mid-session identify() that later populates context.identity can never flip an\n // in-progress visitor's variant — the comment's promise is now enforced, not incidental.\n const seedRef = useRef<string | null>(null)\n if (seedRef.current === null) seedRef.current = bucketingSeed(funnel.context)\n const seed = seedRef.current\n const experiments = useMemo(\n () => resolveExperiments(pages, funnel.experiments, seed),\n [pages, funnel.experiments, seed],\n )\n // The two key remaps every navigation touch point needs: a routing TARGET\n // collapses to its slot (variant keys never stand alone in the flow); a slot\n // resolves to the chunk its assigned variant renders.\n const toSlot = useCallback((k: string) => experiments.slotOf[k] ?? k, [experiments])\n const toRenderKey = useCallback((k: string) => experiments.render[k] ?? k, [experiments])\n const pageByKey = useMemo(() => new Map(pages.map((p) => [p.key, p])), [pages])\n // The effective flow: anchors + standalone pages, in order (losers removed).\n const flowPages = useMemo<RuntimePage[]>(\n () => experiments.activeKeys.map((k) => pageByKey.get(k)).filter((p): p is RuntimePage => p !== undefined),\n [experiments, pageByKey],\n )\n\n // The flow as plain {key, meta} for routing + path-length tracing.\n const flow = useMemo<FlowPage[]>(\n () => flowPages.map((p) => ({ key: p.key, meta: p.meta })),\n [flowPages],\n )\n\n // Resolve the starting page. A deep-link / reload `initialKey` is honored only if\n // the page's entry `guard` passes against the (restored) snapshot — else fall\n // back to the start page. (In-funnel navigation never hits this; routing gated it.)\n const [history, setHistory] = useState<string[]>(() => {\n const start = flowPages[0]?.key\n if (!initialKey || initialKey === start) return start ? [start] : []\n const target = toSlot(initialKey)\n const page = flowPages.find((p) => p.key === target)\n // Effective guard = the page-type default (paywall/upsell need email) AND any\n // explicit meta.guard.\n const guard = entryGuard(page?.meta)\n const ok = page && (!guard || evaluateGate(guard, funnel.snapshot()))\n const first = ok ? target : start\n return first ? [first] : []\n })\n const currentKey = history[history.length - 1]\n const index = history.length - 1\n const startKey = history[0]\n\n // Expected path length for the visitor's current answers — re-traced per\n // navigation so progress reaches 100% on whichever branch the funnel takes.\n const total = useMemo(\n () => expectedPathLength(flow, startKey, funnel.snapshot()),\n // currentKey in deps: re-trace as each step's answers settle the branch.\n [flow, startKey, currentKey, funnel],\n )\n\n // Keep the read-only context's `page` slice current so predicates + usePage see it.\n const slug = pageByKey.get(currentKey)?.meta?.slug ?? currentKey\n const page = useMemo(\n () => pageContextFor(currentKey, slug, index, total, funnel.context.system.now),\n [currentKey, slug, index, total, funnel.context.system.now],\n )\n // Keep the imperative handle's `context.page` in sync for snapshot()/predicates\n // and the window.appfunnel bus. Synced in a COMMIT effect, not during render —\n // mutating a shared object mid-render is unsafe under SSR/concurrent rendering\n // (two in-flight renders would race on it). Everything render-facing reads\n // `page` from the NavContext value below (React state), so this only serves\n // event-handler/effect readers, which always run after the commit.\n useEffect(() => {\n funnel.context.page = page\n }, [funnel, page])\n\n // funnel.start once, on mount.\n const started = useRef(false)\n useEffect(() => {\n if (started.current) return\n started.current = true\n tracker.track('funnel.start', {})\n }, [tracker])\n\n // page.view on every page change.\n useEffect(() => {\n if (!currentKey) return\n tracker.track('page.view', { pageId: currentKey, pageKey: currentKey, isInitial: index === 0, eventId: newEventId() })\n }, [tracker, currentKey, index])\n\n // Tell the renderer the live page (key + slug) so it can sync the URL path.\n useEffect(() => {\n if (currentKey && onNavigate) onNavigate(currentKey, slug)\n }, [onNavigate, currentKey, slug])\n\n // experiment.exposure the first time the visitor lands on an experiment slot.\n const exposed = useRef<Set<string>>(new Set())\n useEffect(() => {\n const expId = experiments.experimentOf[currentKey]\n if (!expId || exposed.current.has(expId)) return\n exposed.current.add(expId)\n tracker.track('experiment.exposure', exposurePayload(expId, experiments.assignments[expId], experiments.versionOf[expId]))\n }, [tracker, currentKey, experiments])\n\n usePageExitTimer(tracker, currentKey)\n\n // Navigation swaps a code-split page (a lazy chunk). Wrap the history update in a\n // transition so React keeps the CURRENT page on screen until the next page's chunk\n // is ready, instead of flashing the Suspense `fallback` (the inter-page flicker).\n // `isNavigating` is true while a cold chunk resolves → show a \"working\" affordance\n // so the button doesn't feel dead. Prefetch makes this window usually invisible.\n const [isNavigating, startNav] = useTransition()\n const next = useCallback(() => {\n // Route over the effective flow (slots); the slot page's `meta.next` governs\n // routing. Remap any target that points at a collapsed variant key to its slot.\n const target = nextPage(flow, currentKey, funnel.snapshot())\n const resolved = target ? toSlot(target) : target\n if (resolved) startNav(() => setHistory((h) => [...h, resolved]))\n }, [flow, currentKey, funnel, toSlot])\n\n const back = useCallback(\n () => startNav(() => setHistory((h) => (h.length > 1 ? h.slice(0, -1) : h))),\n [],\n )\n const go = useCallback(\n (key: string) => startNav(() => setHistory((h) => [...h, toSlot(key)])),\n [toSlot],\n )\n\n // Warm a slot's code-split chunk (the variant that would actually render). Idempotent.\n const prefetched = useRef<Set<string>>(new Set())\n const prefetch = useCallback(\n (key: string) => {\n const target = toRenderKey(key)\n const load = loaders.get(target)\n if (!load || prefetched.current.has(target)) return\n prefetched.current.add(target)\n load().catch(() => prefetched.current.delete(target)) // let a failed load retry later\n },\n [loaders, toRenderKey],\n )\n\n // The next-likely pages, resolved to the chunk that would actually render\n // (experiment variant applied) — the renderer modulepreloads these.\n const nextCandidates = useMemo(\n () => [...new Set(outgoingKeys(flow, currentKey).map(toRenderKey))],\n [flow, currentKey, toRenderKey],\n )\n\n // 'auto' mode: warm those chunks by calling load(). 'off': the renderer owns it.\n useEffect(() => {\n if (prefetchMode !== 'auto') return\n for (const key of nextCandidates) prefetch(key)\n }, [prefetchMode, nextCandidates, prefetch])\n\n const value: NavigationState = {\n page,\n next,\n back,\n go,\n prefetch,\n nextCandidates,\n canGoBack: history.length > 1,\n isNavigating,\n }\n // Render the assigned variant's component at the current slot (the anchor key\n // stays the flow position; only the component swaps). Lazy pages suspend, so the\n // page area shows `fallback` while the chunk loads — inside the layout, so the\n // persistent chrome stays put.\n const renderKey = toRenderKey(currentKey)\n const Current = components.get(renderKey)\n const pageEl = createElement(Suspense, { fallback: fallback ?? null }, Current ? createElement(Current) : null)\n // The layout wraps the page inside NavContext → it persists across navigation\n // (same element type, only the page child swaps) and can use nav/funnel hooks.\n const content = layout ? createElement(layout, null, pageEl) : pageEl\n\n return createElement(\n ExperimentContext.Provider,\n { value: experiments.assignments },\n createElement(NavContext.Provider, { value }, content),\n )\n}\n\n/** `const { next, back, go, page } = useNavigation()`. */\nexport function useNavigation(): NavigationState {\n const ctx = useContext(NavContext)\n if (!ctx) throw new Error('useNavigation must be used inside <FunnelView>')\n return ctx\n}\n\n/** `usePage()` — the current page's read-only context, reactive to navigation. */\nexport function usePage(): PageContext {\n return useNavigation().page\n}\n","/**\n * Imperative, promise-based modal registry — our trimmed adaptation of\n * eBay's `@ebay/nice-modal-react` (MIT). The model: a module-level registry +\n * a reducer-backed store, so any code can `showModal(MyModal)` from anywhere\n * (no prop-drilling, no rendering the modal where you trigger it) and get back a\n * **promise** that resolves when the modal calls `resolve()` — perfect for\n * confirm/upsell/detail flows.\n *\n * Every modal is keyed by a **stable id**, which also makes it natural to bind\n * analytics later (open/close per id, like pages).\n *\n * Pair it with the controlled chrome in {@link ./overlay}: a `defineModal`\n * component renders a `<Sheet open={m.visible} onClose={m.hide}>`/`<Modal>`.\n * The runtime ({@link ./namespaces}.FunnelProvider) mounts {@link ModalRoot} for\n * you, so there's no provider to wire.\n *\n * Trimmed vs upstream: dropped the antd/mui/bootstrap binding adapters and the\n * standalone `<Provider>` (folded into the funnel runtime).\n */\n\nimport {\n createContext,\n createElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n type ComponentType,\n type Dispatch,\n type ReactNode,\n} from 'react'\n\n// ── State ────────────────────────────────────────────────\n\nexport interface ModalState {\n id: string\n args?: Record<string, unknown>\n visible?: boolean\n delayVisible?: boolean\n keepMounted?: boolean\n}\nexport interface ModalStore {\n [id: string]: ModalState\n}\ninterface ModalAction {\n type: 'show' | 'hide' | 'remove' | 'set-flags'\n payload: { modalId: string; args?: Record<string, unknown>; flags?: Record<string, unknown> }\n}\ninterface ModalCallbacks {\n [id: string]: { resolve: (v: unknown) => void; reject: (v: unknown) => void; promise: Promise<unknown> }\n}\n\n/** The handle `useModal()` returns to control one modal. */\nexport interface ModalHandler<Props = Record<string, unknown>> {\n id: string\n args?: Record<string, unknown>\n visible: boolean\n keepMounted: boolean\n show: (args?: Props) => Promise<unknown>\n hide: () => Promise<unknown>\n remove: () => void\n /** Resolve the promise returned by `show()` (e.g. a confirm result). */\n resolve: (value?: unknown) => void\n /** Reject the promise returned by `show()`. */\n reject: (value?: unknown) => void\n /** Resolve the promise returned by `hide()` (after a close transition). */\n resolveHide: (value?: unknown) => void\n}\n\n// ── Registry + dispatch ──────────────────────────────────\n\nconst symModalId = Symbol('AppFunnelModalId')\nconst initialState: ModalStore = {}\nconst ModalStateContext = createContext<ModalStore>(initialState)\nconst ModalIdContext = createContext<string | null>(null)\n/** The provider-scoped dispatch — components/hooks always read this, never the module fallback. */\nconst ModalDispatchContext = createContext<Dispatch<ModalAction> | null>(null)\n\nconst REGISTRY: { [id: string]: { comp: ComponentType<any>; props?: Record<string, unknown> } } = {}\nconst ALREADY_MOUNTED: Record<string, boolean> = {}\nconst modalCallbacks: ModalCallbacks = {}\nconst hideCallbacks: ModalCallbacks = {}\n\nlet uid = 0\nconst getUid = () => `_af_modal_${uid++}`\n\n/**\n * Module-level **fallback** dispatch for the imperative API (`showModal` called\n * from plain code with no React context). Runtimes register on a stack in a\n * mount *effect* — never during render, so concurrent SSR renders can't race on\n * it, and a server render (where effects don't run) never touches module state.\n * The imperative API binds to the most recently mounted runtime; inside React,\n * hooks use the provider-scoped {@link ModalDispatchContext} instead.\n */\nconst runtimeStack: Dispatch<ModalAction>[] = []\n\nconst dispatch: Dispatch<ModalAction> = (action) => {\n const top = runtimeStack[runtimeStack.length - 1]\n if (!top) {\n throw new Error('No modal dispatch — render inside <FunnelProvider> (which mounts the modal runtime).')\n }\n top(action)\n}\n\nexport const modalReducer = (state: ModalStore = initialState, action: ModalAction): ModalStore => {\n const { modalId, args, flags } = action.payload\n switch (action.type) {\n case 'show':\n return {\n ...state,\n [modalId]: {\n ...state[modalId],\n id: modalId,\n args,\n // Mount first, then flip visible on the next effect → enter transition.\n visible: !!ALREADY_MOUNTED[modalId],\n delayVisible: !ALREADY_MOUNTED[modalId],\n },\n }\n case 'hide':\n return state[modalId] ? { ...state, [modalId]: { ...state[modalId], visible: false } } : state\n case 'remove': {\n const next = { ...state }\n delete next[modalId]\n return next\n }\n case 'set-flags':\n return { ...state, [modalId]: { ...state[modalId], ...flags } }\n default:\n return state\n }\n}\n\nfunction idOf(modal: string | ComponentType<any>): string {\n if (typeof modal === 'string') return modal\n const m = modal as ComponentType<any> & { [symModalId]?: string }\n if (!m[symModalId]) m[symModalId] = getUid()\n return m[symModalId] as string\n}\n\n// ── Imperative API (callable from anywhere) ──────────────\n\n/** Register a component as an id-keyed modal so the placeholder can render it. */\nexport function registerModal(id: string, comp: ComponentType<any>, props?: Record<string, unknown>): void {\n if (!REGISTRY[id]) REGISTRY[id] = { comp, props }\n else REGISTRY[id].props = props\n}\n\nexport function unregisterModal(id: string): void {\n delete REGISTRY[id]\n}\n\nfunction showModalVia<T = unknown>(\n d: Dispatch<ModalAction>,\n modal: string | ComponentType<any>,\n args?: Record<string, unknown>,\n): Promise<T> {\n const id = idOf(modal)\n if (typeof modal !== 'string' && !REGISTRY[id]) registerModal(id, modal)\n d({ type: 'show', payload: { modalId: id, args } })\n if (!modalCallbacks[id]) {\n let res!: (v: unknown) => void\n let rej!: (v: unknown) => void\n const promise = new Promise<unknown>((resolve, reject) => {\n res = resolve\n rej = reject\n })\n modalCallbacks[id] = { resolve: res, reject: rej, promise }\n }\n return modalCallbacks[id].promise as Promise<T>\n}\n\n/** Show a modal (by component or id). Returns a promise resolved by `resolve()`. */\nexport function showModal<T = unknown>(modal: string | ComponentType<any>, args?: Record<string, unknown>): Promise<T> {\n return showModalVia(dispatch, modal, args)\n}\n\nfunction hideModalVia<T = unknown>(d: Dispatch<ModalAction>, modal: string | ComponentType<any>): Promise<T> {\n const id = idOf(modal)\n d({ type: 'hide', payload: { modalId: id } })\n delete modalCallbacks[id]\n if (!hideCallbacks[id]) {\n let res!: (v: unknown) => void\n let rej!: (v: unknown) => void\n const promise = new Promise<unknown>((resolve, reject) => {\n res = resolve\n rej = reject\n })\n hideCallbacks[id] = { resolve: res, reject: rej, promise }\n }\n return hideCallbacks[id].promise as Promise<T>\n}\n\n/** Hide a modal. Returns a promise resolved by `resolveHide()` (post-transition). */\nexport function hideModal<T = unknown>(modal: string | ComponentType<any>): Promise<T> {\n return hideModalVia(dispatch, modal)\n}\n\nfunction removeModalVia(d: Dispatch<ModalAction>, modal: string | ComponentType<any>): void {\n const id = idOf(modal)\n d({ type: 'remove', payload: { modalId: id } })\n delete modalCallbacks[id]\n delete hideCallbacks[id]\n}\n\n/** Remove a modal from the tree (frees its state; better than just hiding). */\nexport function removeModal(modal: string | ComponentType<any>): void {\n removeModalVia(dispatch, modal)\n}\n\nfunction setFlags(d: Dispatch<ModalAction>, id: string, flags: Record<string, unknown>): void {\n d({ type: 'set-flags', payload: { modalId: id, flags } })\n}\n\n// ── Hook ─────────────────────────────────────────────────\n\nexport function useModal(): ModalHandler\nexport function useModal(modal: string, args?: Record<string, unknown>): ModalHandler\nexport function useModal<P extends object>(modal: ComponentType<P>, args?: Partial<P>): ModalHandler<P>\nexport function useModal(modal?: string | ComponentType<any>, args?: Record<string, unknown>): ModalHandler {\n const modals = useContext(ModalStateContext)\n const contextId = useContext(ModalIdContext)\n // Prefer the provider-scoped dispatch; the module fallback covers hook usage\n // outside <ModalRuntime> (which itself throws a descriptive error).\n const d = useContext(ModalDispatchContext) ?? dispatch\n const isComponent = !!modal && typeof modal !== 'string'\n const id = modal ? idOf(modal) : contextId\n if (!id) throw new Error('useModal: no modal id (call inside a defineModal component, or pass an id/component).')\n\n useEffect(() => {\n if (isComponent && !REGISTRY[id]) registerModal(id, modal as ComponentType<any>, args)\n }, [isComponent, id, modal, args])\n\n const info = modals[id]\n const show = useCallback((a?: Record<string, unknown>) => showModalVia(d, id, a), [d, id])\n const hide = useCallback(() => hideModalVia(d, id), [d, id])\n const remove = useCallback(() => removeModalVia(d, id), [d, id])\n const resolve = useCallback((v?: unknown) => {\n modalCallbacks[id]?.resolve(v)\n delete modalCallbacks[id]\n }, [id])\n const reject = useCallback((v?: unknown) => {\n modalCallbacks[id]?.reject(v)\n delete modalCallbacks[id]\n }, [id])\n const resolveHide = useCallback((v?: unknown) => {\n hideCallbacks[id]?.resolve(v)\n delete hideCallbacks[id]\n }, [id])\n\n return useMemo(\n () => ({\n id,\n args: info?.args,\n visible: !!info?.visible,\n keepMounted: !!info?.keepMounted,\n show,\n hide,\n remove,\n resolve,\n reject,\n resolveHide,\n }),\n [id, info?.args, info?.visible, info?.keepMounted, show, hide, remove, resolve, reject, resolveHide],\n )\n}\n\n// ── defineModal (HOC) ────────────────────────────────────\n\nexport interface ModalHocProps {\n id: string\n defaultVisible?: boolean\n keepMounted?: boolean\n}\n\n/**\n * Wrap a component into an id-keyed modal. Inside it, `useModal()` (no args)\n * gives the handle. Render a controlled `<Sheet>`/`<Modal>` with\n * `open={m.visible} onClose={m.hide}`.\n */\nexport function defineModal<P extends object>(Comp: ComponentType<P>): ComponentType<P & ModalHocProps> {\n return function Wrapped({ id, defaultVisible, keepMounted, ...props }: P & ModalHocProps): ReactNode {\n const { args, show } = useModal(id)\n const modals = useContext(ModalStateContext)\n const d = useContext(ModalDispatchContext) ?? dispatch\n const shouldMount = !!modals[id]\n\n useEffect(() => {\n if (defaultVisible) show()\n ALREADY_MOUNTED[id] = true\n return () => {\n delete ALREADY_MOUNTED[id]\n }\n }, [id, show, defaultVisible])\n\n useEffect(() => {\n if (keepMounted) setFlags(d, id, { keepMounted: true })\n }, [d, id, keepMounted])\n\n const delayVisible = modals[id]?.delayVisible\n useEffect(() => {\n if (delayVisible) show(args)\n }, [delayVisible, args, show])\n\n if (!shouldMount) return null\n return createElement(\n ModalIdContext.Provider,\n { value: id },\n createElement(Comp, { ...(props as P), ...args }),\n )\n }\n}\n\n// ── Runtime (mounted by FunnelProvider) ──────────────────\n\n/** Renders every visible registered modal. Mounted once by the funnel runtime. */\nexport function ModalRoot(): ReactNode {\n const modals = useContext(ModalStateContext)\n const toRender = Object.keys(modals)\n .filter((id) => REGISTRY[id])\n .map((id) => ({ id, ...REGISTRY[id] }))\n return createElement(\n 'div',\n { 'data-appfunnel-modal-root': '' },\n ...toRender.map((t) => createElement(t.comp, { key: t.id, id: t.id, ...t.props })),\n )\n}\n\n/**\n * Provides the modal store + dispatch (context-scoped) + renders {@link ModalRoot}.\n * Wrapped around the funnel tree by `FunnelProvider`.\n *\n * The module-level fallback dispatch (for the imperative `showModal()` API) is\n * bound in a mount **effect** — never during render — so SSR and concurrent\n * renders are safe. With multiple simultaneous providers the imperative API\n * binds to the **most recently mounted** one (a dev warning fires); hooks inside\n * each tree always use their own provider's dispatch via context.\n */\nexport function ModalRuntime({ children }: { children: ReactNode }): ReactNode {\n const [state, localDispatch] = useReducer(modalReducer, initialState)\n useEffect(() => {\n runtimeStack.push(localDispatch)\n if (runtimeStack.length > 1) {\n try {\n console.warn(\n `[appfunnel] ${runtimeStack.length} modal runtimes are mounted — the imperative showModal()/hideModal() API binds to the most recent one. Use the useModal() hook inside each tree instead.`,\n )\n } catch {\n /* no-op */\n }\n }\n return () => {\n const i = runtimeStack.indexOf(localDispatch)\n if (i !== -1) runtimeStack.splice(i, 1)\n }\n }, [])\n return createElement(\n ModalDispatchContext.Provider,\n { value: localDispatch },\n createElement(\n ModalStateContext.Provider,\n { value: state },\n children,\n createElement(ModalRoot, null),\n ),\n )\n}\n","/**\n * Raw, **controlled** overlay chrome — `<Sheet>` (a drawer) and `<Modal>` (a\n * centered dialog). Headless and styleable (className/portal/dismiss), the same\n * two-tier contract as `<Choice>`: thin wrappers you restyle or eject.\n *\n * These are the presentation layer. For *imperative*, promise-based modals\n * triggered from anywhere, wrap one in `defineModal` and `showModal(...)`\n * (see {@link ./modals}) — that registry drives these controlled primitives.\n * They're also used directly (no registry) where local state is simpler, e.g.\n * the checkout `sheet` surface.\n *\n * Deliberately minimal: portal to `document.body`, lock body scroll while open,\n * dismiss on Escape / backdrop. No animation engine, no focus-trap dependency.\n */\n\nimport {\n createElement,\n useEffect,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { useModal } from './registry'\n\nexport type SheetSide = 'bottom' | 'top' | 'left' | 'right'\n\n/**\n * `<Sheet>`/`<Modal>` bind themselves to the surrounding {@link defineModal} via\n * its context — so inside a modal you write just `<Sheet>…</Sheet>`, with no\n * open/onClose plumbing. They are therefore **only valid inside a `defineModal`**\n * (rendered through `showModal`); used anywhere else `useModal()` throws, which\n * is the correct signal. For an overlay driven by local state, wrap it in a\n * `defineModal` and `showModal` it — that's the one overlay path.\n */\nfunction useModalControl(): { open: boolean; onClose: () => void } {\n const m = useModal()\n return {\n open: m.visible,\n onClose: () => {\n m.hide()\n m.resolveHide()\n if (!m.keepMounted) m.remove()\n },\n }\n}\n\ninterface OverlayCommon {\n className?: string\n backdropClassName?: string\n dismissOnBackdrop?: boolean\n ariaLabel?: string\n children: ReactNode\n}\n\ninterface ShellProps {\n open: boolean\n onClose: () => void\n className?: string\n backdropClassName?: string\n dismissOnBackdrop?: boolean\n ariaLabel?: string\n /** Flexbox alignment of the panel within the viewport. */\n container: Pick<CSSProperties, 'justifyContent' | 'alignItems'>\n /** Panel layout (size + corners per variant). */\n panel: CSSProperties\n children: ReactNode\n}\n\n/** Shared overlay shell: portal, backdrop, scroll-lock, Escape — variant-agnostic. */\nfunction OverlayShell({\n open,\n onClose,\n className,\n backdropClassName,\n dismissOnBackdrop = true,\n ariaLabel,\n container,\n panel,\n children,\n}: ShellProps): ReactNode {\n useEffect(() => {\n if (!open || typeof document === 'undefined') return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n document.addEventListener('keydown', onKey)\n return () => {\n document.body.style.overflow = prev\n document.removeEventListener('keydown', onKey)\n }\n }, [open, onClose])\n\n if (!open || typeof document === 'undefined') return null\n\n const overlay = createElement(\n 'div',\n {\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': ariaLabel,\n 'data-appfunnel-overlay': '',\n style: { position: 'fixed', inset: 0, zIndex: 1000, display: 'flex', ...container },\n },\n createElement('div', {\n 'data-appfunnel-overlay-backdrop': '',\n className: backdropClassName,\n onClick: dismissOnBackdrop ? onClose : undefined,\n style: { position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.5)' },\n }),\n createElement(\n 'div',\n { 'data-appfunnel-overlay-panel': '', className, style: { position: 'relative', background: '#fff', ...panel } },\n children,\n ),\n )\n\n return createPortal(overlay, document.body)\n}\n\nexport type SheetProps = OverlayCommon & {\n /** Edge the drawer slides from (default `bottom`). */\n side?: SheetSide\n}\n\nconst SHEET_LAYOUT: Record<SheetSide, { container: ShellProps['container']; panel: CSSProperties }> = {\n bottom: { container: { justifyContent: 'flex-end', alignItems: 'stretch' }, panel: { borderTopLeftRadius: 16, borderTopRightRadius: 16, padding: 16, maxHeight: '90vh', overflow: 'auto' } },\n top: { container: { justifyContent: 'flex-start', alignItems: 'stretch' }, panel: { borderBottomLeftRadius: 16, borderBottomRightRadius: 16, padding: 16, maxHeight: '90vh', overflow: 'auto' } },\n left: { container: { justifyContent: 'flex-start', alignItems: 'stretch' }, panel: { height: '100%', width: 'min(420px, 90vw)', padding: 16, overflow: 'auto' } },\n right: { container: { justifyContent: 'flex-end', alignItems: 'stretch' }, panel: { height: '100%', width: 'min(420px, 90vw)', padding: 16, overflow: 'auto' } },\n}\n\n/**\n * An edge-anchored drawer. Inside a `defineModal` it auto-binds — `<Sheet>…`;\n * outside one, control it with `open`/`onClose`.\n */\nexport function Sheet(props: SheetProps): ReactNode {\n const control = useModalControl()\n const layout = SHEET_LAYOUT[props.side ?? 'bottom']\n return createElement(OverlayShell, {\n ...control,\n className: props.className,\n backdropClassName: props.backdropClassName,\n dismissOnBackdrop: props.dismissOnBackdrop,\n ariaLabel: props.ariaLabel,\n container: layout.container,\n panel: layout.panel,\n children: props.children,\n })\n}\n\nexport type ModalProps = OverlayCommon\n\n/** A centered dialog. Auto-binds to its `defineModal` — `<Modal>…`. */\nexport function Modal(props: ModalProps): ReactNode {\n const control = useModalControl()\n return createElement(OverlayShell, {\n ...control,\n className: props.className,\n backdropClassName: props.backdropClassName,\n dismissOnBackdrop: props.dismissOnBackdrop,\n ariaLabel: props.ariaLabel,\n container: { justifyContent: 'center', alignItems: 'center' },\n panel: { borderRadius: 16, padding: 24, width: 'min(480px, 92vw)', maxHeight: '90vh', overflow: 'auto' },\n children: props.children,\n })\n}\n","/**\n * v2 commerce primitives — the two intents from phase-3, made trivial.\n *\n * - `<Checkout product surface>` — the **purchase** primitive. The `surface`\n * prop picks presentation; some surfaces render **inline** (express wallets,\n * inline card, provider iframe), some **open on click** (sheet/popup/redirect).\n * `<Checkout>` covers both: it renders inline surfaces and renders a trigger\n * button for the rest (`asChild` to use your own button).\n * - `<Upsell product>` — the **upsell** primitive. Off-session charge to the\n * saved method, no card re-entry, one tap.\n * - `useCheckout()` — the headless hook under both, always available for a\n * fully-custom CTA.\n *\n * The SDK never talks to a provider. It owns the state machine + the analytics\n * (`checkout.start` / `purchase.complete`) + post-charge navigation, and\n * delegates the actual charge/render to an injected {@link CheckoutDriver}\n * (the real one is platform-side; tests use {@link createMockDriver}).\n *\n * Which product is charged is the author's bound variable, captured at render\n * (inline surfaces) or at `open()` time (trigger surfaces).\n */\n\nimport {\n createContext,\n createElement,\n isValidElement,\n cloneElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ComponentType,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useTrackerRef } from '../tracking/tracking'\nimport { useNavigation } from '../flow/flow'\nimport { Sheet } from '../modals/sheet'\nimport { defineModal, useModal, showModal } from '../modals/registry'\nimport {\n checkoutError,\n isInlineSurface,\n PROVIDER_PROFILES,\n type CheckoutError,\n type CheckoutErrorCategory,\n type CheckoutIntent,\n type CheckoutProvider,\n type CheckoutSurface,\n type UpsellKind,\n} from './capabilities'\n\n// ── Capability matrix (pure — lives in ./capabilities, ships via the manifest\n// entry so the API/editor/AI run the SAME checks; re-exported here so every\n// existing import keeps working) ───────────────────────\nexport {\n INLINE_SURFACES,\n PROVIDER_PROFILES,\n checkoutError,\n isInlineSurface,\n isMerchantOfRecord,\n isOrchestrator,\n surfacesFor,\n validateCheckout,\n validateUpsell,\n} from './capabilities'\nexport type {\n CheckoutError,\n CheckoutErrorCategory,\n CheckoutIntent,\n CheckoutProvider,\n CheckoutSurface,\n OffSessionReliability,\n ProviderProfile,\n SurfaceCapability,\n UpsellKind,\n ValidationResult,\n} from './capabilities'\n\n// ── Driver seam ──────────────────────────────────────────\n\nexport type CheckoutStatus = 'idle' | 'loading' | 'requires_action' | 'success' | 'error'\n\nexport interface CheckoutRequest {\n product: string\n intent: CheckoutIntent\n surface?: CheckoutSurface\n /** For `upsell` intent — which kind of off-session charge (default `subscription`). */\n kind?: UpsellKind\n /**\n * Buyer email at attempt time, read from the funnel's `user.email` namespace value\n * (injected by `FunnelProvider` via {@link driverWithEmail} — no author wiring).\n * Drivers forward it into the wire `CheckoutSessionRequest.email` (Stripe Customer\n * creation / receipts / Paddle prefill).\n */\n email?: string\n}\n\nexport interface CheckoutResult {\n ok: boolean\n error?: CheckoutError\n /** Charged amount in minor units (for the purchase event). */\n amountMinor?: number\n currency?: string\n /**\n * The **server-minted** dedup id for the purchase event — the platform creates it\n * when the charge settles and fires CAPI with it; the SDK emits `purchase.complete`\n * with the same id so the browser pixel dedupes against the server. (Server is the\n * source of truth for payment events; the SDK doesn't mint these.)\n */\n eventId?: string\n}\n\nexport interface CheckoutCallbacks {\n onSuccess: (result: CheckoutResult) => void\n onError: (error: CheckoutError) => void\n /**\n * The buyer SUBMITTED an inline surface (Stripe confirm click / wallet\n * authorization; Paddle inline checkout opening). This is when `checkout.start`\n * fires and the status machine enters `loading` for inline attempts — trigger\n * surfaces fire it at click time instead. It also marks fresh user intent, so\n * the once-per-chain recovery guard resets. Optional: drivers that can't\n * observe submit simply never call it, and the SHEET host deliberately doesn't\n * forward it (the sheet's own open already began the attempt — re-firing would\n * double-count starts and un-arm the recovery guard mid-chain).\n */\n onStart?: () => void\n /**\n * The inline surface reports a valid payment method was entered (e.g. Stripe's\n * Payment Element became `complete`), before the charge. Drives the\n * `checkout.payment_added` analytics step; optional — drivers that can't observe\n * it (or off-session charges) simply never call it.\n */\n onPaymentAdded?: () => void\n}\n\n/**\n * What a driver factory (`stripeCheckoutDriver` et al. from the\n * `@appfunnel-dev/sdk/driver-*` entries) receives to construct a\n * {@link CheckoutDriver}. Derived by `createFunnelTree` from the SAME\n * renderer-injected mount data the platform tracker uses (tracking config +\n * identity), so checkout wire calls land on the exact campaign/funnel/session\n * the analytics do — there is no second config channel to drift.\n *\n * Serializable on purpose, and factories must be **construction-safe on the\n * server too**: a factory only closes over this ctx (no provider SDK, no\n * `window`) — all provider work belongs in effects/event handlers, so SSR can\n * render the driver's stable inline placeholder and hydration matches.\n */\nexport interface CheckoutDriverContext {\n /** Public API origin, e.g. `https://api.appfunnel.net` (no trailing slash). */\n apiBase: string\n /** Campaign DB id (the checkout route key, same as the ingestion route key). */\n campaignId: string\n /** WebFunnel DB id (NOT the funnel.ts config id). */\n funnelId: string\n /** Render-time mode — the server resolves the product binding + store credentials by it. */\n mode: 'test' | 'live'\n /** Funnel session id when one exists (analytics + customer continuity). */\n sessionId?: string | null\n /** Signed-cookie-verified bare visitor id, when known. */\n visitorId?: string | null\n}\n\n/**\n * The provider seam. The platform injects the real one (Stripe/Paddle/Whop/…);\n * tests use {@link createMockDriver}.\n *\n * Most providers ship their **own React SDK** (`@stripe/react-stripe-js`,\n * `@paddle/paddle-js`, Primer's React components, …). A driver's `renderInline`\n * returns exactly that: the provider's React element mounted in our chrome (inline,\n * or inside the `<Sheet>`). Those provider SDKs live in the **driver/platform**\n * package, not our core funnel SDK — which is why the driver is injected: the core\n * stays lean and provider-agnostic, and you only pull the SDK for the provider you use.\n */\nexport interface CheckoutDriver {\n provider: CheckoutProvider\n /** Trigger a charge (trigger surfaces + programmatic). Resolves when settled. */\n start(req: CheckoutRequest): Promise<CheckoutResult>\n /** Render an inline surface (e.g. the provider's React payment element); report via callbacks. */\n renderInline?(req: CheckoutRequest, cb: CheckoutCallbacks): ReactNode\n /**\n * Verify an EXISTING attempt with the server (`POST /complete`, bounded re-poll on\n * `pending`) — the redirect-return resume leg: hosted-checkout success URLs carry\n * `?af_checkout={correlationId}` back into the funnel, and {@link CheckoutResume}\n * hands the id here so the settlement (server-verified) resolves into the normal\n * success/failure paths. Never charges; only verifies.\n */\n resume?(correlationId: string): Promise<CheckoutResult>\n}\n\nexport interface MockDriverOptions {\n /** The result a successful charge resolves with. */\n result?: CheckoutResult\n /** Make **off-session** charges (no surface) fail — to exercise the upsell fallback. */\n failOffSession?: CheckoutError | boolean\n}\n\n/** A console/no-op driver — tests, preview, local dev. Succeeds unless configured to fail. */\nexport function createMockDriver(\n provider: CheckoutProvider = 'stripe',\n options: MockDriverOptions = {},\n): CheckoutDriver {\n const success: CheckoutResult = options.result ?? { ok: true, amountMinor: 0, currency: 'USD' }\n const offError: CheckoutError =\n typeof options.failOffSession === 'object'\n ? options.failOffSession\n : checkoutError('authentication_required', 'off-session charge declined (mock)')\n return {\n provider,\n start: (req) => {\n if (options.failOffSession && !req.surface) return Promise.resolve({ ok: false, error: offError })\n return Promise.resolve(success)\n },\n renderInline: (req, cb) =>\n createElement(\n 'button',\n {\n type: 'button',\n 'data-mock-surface': req.surface,\n onClick: () => {\n cb.onStart?.() // user submit — mirrors the real drivers (checkout.start for inline)\n if (success.ok) cb.onSuccess(success)\n else cb.onError(success.error ?? checkoutError('processing_error', 'failed (mock)'))\n },\n },\n `Pay (mock ${req.surface})`,\n ),\n resume: () => Promise.resolve(success),\n }\n}\n\n/**\n * Wrap a driver so every attempt carries the buyer email the funnel has collected\n * (`user.email`), read at ATTEMPT time — `start()` for trigger surfaces, the\n * `renderInline` request for mounted surfaces. Applied by `FunnelProvider` around\n * the injected driver, so `useCheckout`, `<Checkout>` inline branches and the\n * checkout sheet all forward it without wiring; drivers pass it into the wire's\n * `CheckoutSessionRequest.email`. An explicit `req.email` always wins.\n */\nexport function driverWithEmail(driver: CheckoutDriver, getEmail: () => string | undefined): CheckoutDriver {\n const enrich = (req: CheckoutRequest): CheckoutRequest =>\n req.email !== undefined ? req : { ...req, email: getEmail() }\n return {\n ...driver,\n start: (req) => driver.start(enrich(req)),\n renderInline: driver.renderInline ? (req, cb) => driver.renderInline!(enrich(req), cb) : undefined,\n }\n}\n\nconst DriverContext = createContext<CheckoutDriver | null>(null)\n\nexport function CheckoutDriverProvider({\n driver,\n children,\n}: {\n driver: CheckoutDriver\n children: ReactNode\n}): ReactNode {\n return createElement(DriverContext.Provider, { value: driver }, children)\n}\n\nfunction useDriver(): CheckoutDriver {\n return useContext(DriverContext) ?? FALLBACK_DRIVER\n}\nconst FALLBACK_DRIVER = createMockDriver()\n\n// ── Failure routing (the recovery \"magic\") ───────────────\n\n/** One declarative recovery route for a failure category. */\nexport type FailureRoute =\n | { go: string } // navigate the flow to a page key (e.g. a real-card recapture page)\n | { modal: string | ComponentType<any> } // show a registry modal — it receives {@link FailureModalProps}\n | { fallback: CheckoutSurface } // re-collect a card ON-SESSION on this surface and retry (once)\n | ((error: CheckoutError) => void) // full control\n\n/**\n * What a `{ modal }` failure route hands the modal — the error AND the actions,\n * because registry modals mount outside the flow's nav context and a recovery\n * modal that can't act is just an error toast. Type your modal with this:\n *\n * ```tsx\n * const Declined = defineModal<FailureModalProps>(({ error, go, retry }) => (\n * <Sheet>\n * <p>{error.category === 'prepaid_card' ? 'Prepaid cards can't start a trial.' : 'Payment didn't go through.'}</p>\n * <button onClick={() => retry('sheet')}>Try another card</button>\n * <button onClick={() => go('downsell')}>See the lite plan</button>\n * </Sheet>\n * ))\n * ```\n *\n * A modal can also host a whole `<Checkout product=\"…\" surface=\"element\" />` for\n * an inline downsell — the driver context is app-level, so checkout works inside\n * modals as-is.\n */\nexport interface FailureModalProps {\n error: CheckoutError\n /** The product whose charge failed (absent only for product-less failures). */\n product?: string\n /** Navigate the flow to a page key (modals can't call useNavigation themselves). */\n go: (pageKey: string) => void\n /**\n * Re-attempt the SAME product. `retry()` re-runs an upsell off-session; for a\n * purchase (which needs UI to re-collect) it opens the payment sheet.\n * `retry('sheet')` re-collects on the SDK sheet; an inline surface\n * (`element`/`express`/`embedded`) is COERCED to the sheet when the provider\n * supports it — a retry has no page slot to mount into, so the sheet hosts the\n * element. On sheet-less MoR providers (Paddle) inline retries run through the\n * driver, whose provider checkout opens its own overlay. `retry('popup')` /\n * `retry('redirect')` hand off to the provider. A failed retry routes through\n * `onFailed` again (the modal reopens) — the loop is user-driven, never\n * automatic. Hide the modal first (`useModal().hide()`) when retrying into a\n * surface that opens its own overlay.\n */\n retry: (surface?: CheckoutSurface) => void\n}\n\n/**\n * Declarative failure recovery — route each failure **category** to what happens\n * next, instead of hand-wiring `onError`:\n *\n * ```tsx\n * <Checkout product=\"monthly\" surface=\"element\" onFailed={{\n * prepaid_card: { go: 'real-card' },\n * insufficient_funds: { modal: DownsellModal },\n * default: { modal: TryAgainModal },\n * }} />\n * ```\n *\n * Resolution: exact category → `default` → nothing (the error state + `checkout.\n * failed` event stand, as today). Two built-in judgments:\n * - `canceled` only routes when mapped EXPLICITLY — a deliberately dismissed\n * sheet/popup is not a failure to recover from, so `default` never catches it;\n * - a `{ fallback }` recovery runs at most once per attempt chain (its own\n * failure routes through the non-fallback routes), so declines can't loop.\n *\n * `checkout.failed` fires with category + declineCode on every failure regardless\n * of routing — recovery pages are measurable, and being ordinary flow pages they\n * are A/B-able with page experiments like anything else.\n */\nexport type OnFailedMap = Partial<Record<CheckoutErrorCategory | 'default', FailureRoute>>\n\n// ── The headless hook ────────────────────────────────────\n\nexport interface UseCheckoutOptions {\n intent?: CheckoutIntent\n /** For `upsell` intent — which kind of off-session charge (default `subscription`). */\n kind?: UpsellKind\n /** Advance to the next page after a successful charge (default: true). */\n advanceOnSuccess?: boolean\n onSuccess?: (result: CheckoutResult) => void\n onError?: (error: CheckoutError) => void\n /** Declarative failure recovery — see {@link OnFailedMap}. Runs AFTER `onError`. */\n onFailed?: OnFailedMap\n /**\n * Try this surface ON-SESSION once on any first failure, before `onFailed`\n * routing — the generalized `<Upsell fallback>`: the off-session (or first)\n * charge fails, the surface re-collects a card, the retry's failure then goes\n * through `onFailed`. Never re-triggered by its own failure; never triggered\n * by a user-`canceled` checkout.\n */\n recoverySurface?: CheckoutSurface\n}\n\nexport interface CheckoutHandle {\n /** Start the charge for a product; resolves with the result (no surface = off-session). */\n open: (product: string, surface?: CheckoutSurface) => Promise<CheckoutResult>\n status: CheckoutStatus\n /** The last failure, structured so you can route/recover by `category`. */\n error: CheckoutError | null\n isLoading: boolean\n reset: () => void\n /** Build the callbacks an inline surface reports through (used by `<Checkout>`). */\n callbacksFor: (product?: string, surface?: CheckoutSurface) => CheckoutCallbacks & { onStart: () => void }\n}\n\n/**\n * The headless checkout hook. Owns the state machine + analytics + post-charge\n * navigation; delegates the charge to the injected {@link CheckoutDriver}.\n */\nexport function useCheckout(opts: UseCheckoutOptions = {}): CheckoutHandle {\n const driver = useDriver()\n const tracker = useTrackerRef()\n const nav = useNavigation()\n const [status, setStatus] = useState<CheckoutStatus>('idle')\n const [error, setError] = useState<CheckoutError | null>(null)\n\n const intent = opts.intent ?? 'purchase'\n const kind = opts.kind\n const advance = opts.advanceOnSuccess ?? true\n\n // True while an on-session recovery attempt (recoverySurface / a `{ fallback }`\n // route) is in flight — its own failure must not start ANOTHER re-collect, so\n // declines can't loop. Cleared on every fresh user-initiated attempt.\n const recovering = useRef(false)\n // fail → startRecovery → (sheet/attempt) → fail is mutually recursive; refs give\n // the cycle stable identities so the returned handle doesn't churn per render.\n const failRef = useRef<(err: CheckoutError, product?: string) => void>(() => {})\n const attemptRef = useRef<(product: string, surface?: CheckoutSurface) => Promise<CheckoutResult>>(\n async () => ({ ok: false }),\n )\n\n const succeed = useCallback(\n (result: CheckoutResult) => {\n setStatus('success')\n tracker.track('purchase.complete', {\n amount: result.amountMinor != null ? result.amountMinor / 100 : undefined,\n currency: result.currency,\n eventId: result.eventId, // server-minted (browser↔CAPI dedup); undefined if none\n })\n opts.onSuccess?.(result)\n if (advance) nav.next()\n },\n [tracker, nav, advance, opts],\n )\n const succeedRef = useRef(succeed)\n succeedRef.current = succeed\n\n const begin = useCallback(\n (product?: string, surface?: CheckoutSurface) => {\n setStatus('loading')\n setError(null)\n tracker.track('checkout.start', { productId: product, surface })\n },\n [tracker],\n )\n\n const paymentAdded = useCallback(() => tracker.track('checkout.payment_added', {}), [tracker])\n\n // Open the on-session recovery surface for a product. A recovery has no page slot\n // to mount UI into, so surfaces that need one route through our sheet: `sheet`\n // itself, and inline surfaces WHEN the provider supports the sheet (Stripe et al.\n // — an element/express recovery is the same client_confirm hosted in the sheet).\n // Everything else (popup/redirect, and inline on sheet-less MoR providers like\n // Paddle, whose provider_checkout opens its OWN overlay) runs through the driver.\n const hostInSheet = (surface: CheckoutSurface): boolean =>\n surface === 'sheet' ||\n (isInlineSurface(surface) && !!PROVIDER_PROFILES[driver.provider]?.surfaces.sheet)\n const startRecovery = (product: string, surface: CheckoutSurface) => {\n recovering.current = true\n if (hostInSheet(surface)) {\n begin(product, 'sheet')\n void showModal(CheckoutSheet, {\n product,\n surface: 'sheet',\n intent,\n kind,\n onSuccess: (r: CheckoutResult) => succeedRef.current(r),\n onError: (e: CheckoutError) => failRef.current(e, product),\n onPaymentAdded: () => paymentAdded(),\n })\n } else {\n void attemptRef.current(product, surface)\n }\n }\n\n failRef.current = (err: CheckoutError, product?: string) => {\n // 3DS/SCA that an off-session charge can't satisfy → flag for recovery.\n setStatus(err.category === 'authentication_required' ? 'requires_action' : 'error')\n setError(err)\n tracker.track('checkout.failed', {\n category: err.category,\n declineCode: err.declineCode,\n productId: product,\n intent,\n })\n opts.onError?.(err)\n\n // A deliberately dismissed checkout routes only when 'canceled' is mapped\n // EXPLICITLY — recovery machinery must not chase a user who closed the sheet.\n if (err.category === 'canceled' && !opts.onFailed?.canceled) return\n // First failure + a recovery surface → re-collect on-session, ONCE; the\n // retry's failure falls through to onFailed below.\n if (product && !recovering.current && opts.recoverySurface && err.category !== 'canceled') {\n startRecovery(product, opts.recoverySurface)\n return\n }\n let route = opts.onFailed?.[err.category] ?? (err.category === 'canceled' ? undefined : opts.onFailed?.default)\n // The documented `{ fallback }` fall-through: a fallback runs at most once per\n // attempt chain, so once a recovery is in flight the RECOVERY's own failure\n // resolves the DEFAULT route instead — unless the default is itself a fallback\n // (or was the resolved route), in which case the error state stands.\n if (route && typeof route === 'object' && 'fallback' in route && recovering.current) {\n const dflt = opts.onFailed?.default\n route =\n dflt && dflt !== route && !(typeof dflt === 'object' && 'fallback' in dflt) ? dflt : undefined\n }\n if (!route) return\n if (typeof route === 'function') route(err)\n else if ('go' in route) nav.go(route.go)\n else if ('modal' in route) {\n // Hand the modal the ACTIONS, not just the error (FailureModalProps) — the\n // registry host mounts outside the nav context, so these closures are the\n // modal's only way to move the flow or re-charge.\n const props: FailureModalProps = {\n error: err,\n product,\n go: (pageKey: string) => nav.go(pageKey),\n retry: (surface?: CheckoutSurface) => {\n if (!product) return\n recovering.current = true // a retry's failure routes again; it never auto-recovers on top\n if (!surface) {\n // Bare retry: an upsell re-runs off-session; a purchase needs UI to\n // re-collect a card — the sheet where the provider supports it, else\n // the provider's own overlay (popup).\n if (intent === 'upsell') void attemptRef.current(product)\n else startRecovery(product, PROVIDER_PROFILES[driver.provider]?.surfaces.sheet ? 'sheet' : 'popup')\n return\n }\n // startRecovery routes it: surfaces needing a MOUNTED UI go through the\n // SAME CheckoutSheet machinery the recovery path uses — driver.start\n // cannot mount React UI, so routing them there would dead-end and mint\n // orphan attempts. popup/redirect (and Paddle's own-overlay inline) are\n // driver-run hand-offs.\n startRecovery(product, surface)\n },\n }\n void showModal(route.modal, props as unknown as Record<string, unknown>)\n } else if ('fallback' in route) {\n if (product && !recovering.current) startRecovery(product, route.fallback)\n }\n }\n\n attemptRef.current = async (product: string, surface?: CheckoutSurface): Promise<CheckoutResult> => {\n begin(product, surface)\n try {\n const result = await driver.start({ product, intent, surface, kind })\n if (result.ok) succeedRef.current(result)\n else failRef.current(result.error ?? checkoutError('unknown', 'Checkout failed'), product)\n return result\n } catch (e) {\n const err = checkoutError('processing_error', e instanceof Error ? e.message : 'Checkout failed')\n failRef.current(err, product)\n return { ok: false, error: err }\n }\n }\n\n const open = useCallback(async (product: string, surface?: CheckoutSurface): Promise<CheckoutResult> => {\n recovering.current = false // fresh user-initiated attempt chain\n return attemptRef.current(product, surface)\n }, [])\n\n const callbacksFor = useCallback(\n (product?: string, surface?: CheckoutSurface) => ({\n onStart: () => {\n recovering.current = false // fresh user-initiated attempt chain\n begin(product, surface)\n },\n onSuccess: (result: CheckoutResult) => succeedRef.current(result),\n onError: (err: CheckoutError) => failRef.current(err, product),\n onPaymentAdded: () => paymentAdded(),\n }),\n [begin, paymentAdded],\n )\n\n const reset = useCallback(() => {\n recovering.current = false\n setStatus('idle')\n setError(null)\n }, [])\n\n return { open, status, error, isLoading: status === 'loading', reset, callbacksFor }\n}\n\n// ── The components ───────────────────────────────────────\n\nexport interface CheckoutProps extends UseCheckoutOptions {\n /** Logical product id (the author's bound selection). */\n product: string\n surface: CheckoutSurface\n /** Render your own trigger element instead of the default button (trigger surfaces). */\n asChild?: boolean\n /** Trigger label / your trigger element. */\n children?: ReactNode\n className?: string\n}\n\n/**\n * The `sheet` surface as a registry modal: our {@link Sheet} hosts the driver's\n * element. It resolves outcomes by invoking the callbacks passed via `showModal`\n * args — closures created in the `<Checkout>` trigger (which lives inside\n * `<FunnelView>`, so they carry navigation).\n *\n * EVERY exit resolves exactly once: success/failure through the driver callbacks,\n * and a dismissal (backdrop/Escape unmounts the modal) as `canceled` — otherwise\n * the attempt's status would sit in `loading` forever, permanently disabling the\n * trigger. `canceled` then follows the built-in judgment: status → `error`,\n * `checkout.failed` fires, but `onFailed` routes it only when mapped explicitly.\n * `onStart` is deliberately NOT forwarded to the hosted element — the sheet's\n * open already began the attempt (see {@link CheckoutCallbacks.onStart}).\n */\nconst CheckoutSheet = defineModal<{\n product: string\n surface: CheckoutSurface\n intent: CheckoutIntent\n kind?: UpsellKind\n onSuccess: (result: CheckoutResult) => void\n onError: (error: CheckoutError) => void\n onPaymentAdded?: () => void\n}>(({ product, surface, intent, kind, onSuccess, onError, onPaymentAdded }) => {\n const driver = useDriver()\n const modal = useModal()\n // True once ANY outcome was reported — the unmount cleanup below only converts a\n // silent dismissal into `canceled`, never doubles a real outcome.\n const resolved = useRef(false)\n const onErrorRef = useRef(onError)\n onErrorRef.current = onError\n const hostable = !!driver.renderInline\n useEffect(() => {\n if (!hostable) {\n // Defensive: a driver with no inline surface cannot host the sheet — resolve\n // the attempt instead of leaving the trigger stuck in `loading`.\n resolved.current = true\n onErrorRef.current(\n checkoutError('processing_error', 'This checkout driver has no inline surface to host in the sheet'),\n )\n void modal.hide()\n modal.remove()\n return\n }\n return () => {\n // Backdrop/Escape dismissal removes the modal (unmount) without an outcome.\n if (!resolved.current) {\n onErrorRef.current(checkoutError('canceled', 'Checkout was dismissed before completing'))\n }\n }\n // Mount-scoped by design: resolution is tracked through refs.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n if (!driver.renderInline) return null\n // Outcomes REMOVE the modal (not just hide it): the next show mounts fresh, so\n // the resolution ref can never leak a previous attempt's state into a new one.\n const close = () => {\n resolved.current = true\n void modal.hide()\n modal.remove()\n }\n return createElement(Sheet, {\n children: driver.renderInline(\n { product, intent, surface, kind },\n {\n onSuccess: (r) => { close(); onSuccess(r) },\n onError: (e) => { close(); onError(e) },\n onPaymentAdded,\n },\n ),\n })\n})\n\n/** Render the default trigger button, or clone the author's `asChild` element. */\nfunction trigger(\n onClick: () => void,\n { asChild, children, className, disabled }: { asChild?: boolean; children?: ReactNode; className?: string; disabled?: boolean },\n): ReactNode {\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<{ onClick?: () => void }>\n return cloneElement(child, { onClick })\n }\n return createElement('button', { type: 'button', className, disabled, onClick }, children ?? 'Continue')\n}\n\n/**\n * The purchase primitive. Three presentation modes by `surface`:\n * - **inline** (`express`/`element`/`embedded`) — the driver renders the\n * provider UI in place (keyed by product so a selection change remounts it);\n * - **SDK sheet** (`sheet`) — a trigger opens the AppFunnel-owned {@link Sheet}\n * and the driver renders the provider element inside it;\n * - **provider-hosted** (`popup`/`redirect`) — a trigger hands off to the\n * provider's own overlay/page.\n */\nexport function Checkout({\n product,\n surface,\n asChild,\n children,\n className,\n ...options\n}: CheckoutProps): ReactNode {\n const driver = useDriver()\n const checkout = useCheckout(options)\n const intent = options.intent ?? 'purchase'\n\n // Inline: driver renders the mounted UI; keyed by product so changing the\n // selected plan cleanly remounts the surface.\n if (isInlineSurface(surface)) {\n return driver.renderInline\n ? createElement(\n 'div',\n { key: product, className },\n driver.renderInline({ product, intent, surface }, checkout.callbacksFor(product, surface)),\n )\n : null\n }\n\n // SDK sheet: open our overlay (a registry modal) hosting the driver's element.\n if (surface === 'sheet') {\n const cb = checkout.callbacksFor(product, surface)\n const open = () => {\n cb.onStart()\n showModal(CheckoutSheet, {\n product,\n surface,\n intent,\n kind: options.kind,\n onSuccess: cb.onSuccess,\n onError: cb.onError,\n onPaymentAdded: cb.onPaymentAdded,\n })\n }\n return trigger(open, { asChild, children, className, disabled: checkout.isLoading })\n }\n\n // Provider-hosted (popup/redirect): trigger hands off to the provider.\n return trigger(() => checkout.open(product, surface), {\n asChild,\n children,\n className,\n disabled: checkout.isLoading,\n })\n}\n\nexport interface UpsellProps extends Omit<UseCheckoutOptions, 'intent'> {\n product: string\n /**\n * If the off-session charge fails, present this surface **on-session** to\n * re-collect a card and charge again — e.g. `fallback=\"sheet\"` opens the\n * payment sheet, `fallback=\"popup\"` the provider overlay. Omit to just report\n * the failure (via `onError` / the `checkout.failed` event).\n */\n fallback?: CheckoutSurface\n asChild?: boolean\n children?: ReactNode\n className?: string\n}\n\n/**\n * The upsell primitive — an off-session, one-tap charge to the saved method (no\n * surface, no card re-entry). On failure, optionally `fallback` to an on-session\n * surface to re-collect and retry — `fallback` IS the hook's `recoverySurface`,\n * so the retry's own failure routes through `onFailed` (e.g. prepaid_card → a\n * recapture page) instead of dead-ending.\n */\nexport function Upsell({ product, fallback, asChild, children, className, ...options }: UpsellProps): ReactNode {\n const checkout = useCheckout({\n ...options,\n intent: 'upsell',\n recoverySurface: fallback ?? options.recoverySurface,\n })\n\n return trigger(() => void checkout.open(product) /* off-session (no surface) */, {\n asChild,\n children: children ?? 'Add to my plan',\n className,\n disabled: checkout.isLoading,\n })\n}\n\n// ── Redirect-return resume (hosted checkout success URLs) ────────────────────\n\n/** correlationIds this page load already resumed — the leg runs once per attempt\n * even if the component remounts (StrictMode, page-experiment remounts). */\nconst consumedResumes = new Set<string>()\n\n/**\n * The dangling settle leg of the `redirect` surface. The server appends\n * `af_checkout={correlationId}` to hosted-checkout success URLs; when the buyer\n * lands back in the funnel this component detects the param, has the server\n * VERIFY the attempt (`driver.resume` → `POST /complete`, bounded re-poll while\n * `pending`), and resolves it into the normal machinery:\n *\n * - `settled` → `purchase.complete` fires with the settlement's server-minted\n * `eventId` (pixel↔CAPI dedup), the flow advances, and the param is stripped\n * (`history.replaceState`) so a reload can't re-run the leg;\n * - `failed` → the normal failure path (`checkout.failed` + status `error`;\n * any `onFailed` maps passed as props apply — product-less, so only\n * `go`/handler routes can act).\n *\n * SSR-safe (effect-only) and runs once per correlationId per page load. Mounted\n * automatically by `createFunnelTree` inside the nav context; needs a driver\n * with `resume` (both platform drivers ship it; the mock resolves its result).\n */\nexport function CheckoutResume(options: UseCheckoutOptions = {}): ReactNode {\n const driver = useDriver()\n const checkout = useCheckout(options)\n const callbacksRef = useRef(checkout.callbacksFor)\n callbacksRef.current = checkout.callbacksFor\n\n useEffect(() => {\n if (typeof window === 'undefined' || !driver.resume) return\n const url = new URL(window.location.href)\n const correlationId = url.searchParams.get('af_checkout')\n if (!correlationId || consumedResumes.has(correlationId)) return\n consumedResumes.add(correlationId)\n void driver.resume(correlationId).then((result) => {\n // Not a new attempt — no onStart/`checkout.start`; the charge already ran.\n const cb = callbacksRef.current()\n if (result.ok) {\n url.searchParams.delete('af_checkout')\n window.history.replaceState(window.history.state, '', url.toString())\n cb.onSuccess(result)\n } else {\n cb.onError(result.error ?? checkoutError('unknown', 'The checkout could not be verified'))\n }\n })\n // Mount-scoped by design (the URL param is a page-load fact).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return null\n}\n","'use client';\nfunction __insertCSS(code) {\n if (!code || typeof document == 'undefined') return\n let head = document.head || document.getElementsByTagName('head')[0]\n let style = document.createElement('style')\n style.type = 'text/css'\n head.appendChild(style)\n ;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))\n}\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nconst getAsset = (type)=>{\n switch(type){\n case 'success':\n return SuccessIcon;\n case 'info':\n return InfoIcon;\n case 'warning':\n return WarningIcon;\n case 'error':\n return ErrorIcon;\n default:\n return null;\n }\n};\nconst bars = Array(12).fill(0);\nconst Loader = ({ visible, className })=>{\n return /*#__PURE__*/ React.createElement(\"div\", {\n className: [\n 'sonner-loading-wrapper',\n className\n ].filter(Boolean).join(' '),\n \"data-visible\": visible\n }, /*#__PURE__*/ React.createElement(\"div\", {\n className: \"sonner-spinner\"\n }, bars.map((_, i)=>/*#__PURE__*/ React.createElement(\"div\", {\n className: \"sonner-loading-bar\",\n key: `spinner-bar-${i}`\n }))));\n};\nconst SuccessIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\n clipRule: \"evenodd\"\n}));\nconst WarningIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z\",\n clipRule: \"evenodd\"\n}));\nconst InfoIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\",\n clipRule: \"evenodd\"\n}));\nconst ErrorIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\",\n clipRule: \"evenodd\"\n}));\nconst CloseIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"12\",\n height: \"12\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"1.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n}, /*#__PURE__*/ React.createElement(\"line\", {\n x1: \"18\",\n y1: \"6\",\n x2: \"6\",\n y2: \"18\"\n}), /*#__PURE__*/ React.createElement(\"line\", {\n x1: \"6\",\n y1: \"6\",\n x2: \"18\",\n y2: \"18\"\n}));\n\nconst useIsDocumentHidden = ()=>{\n const [isDocumentHidden, setIsDocumentHidden] = React.useState(document.hidden);\n React.useEffect(()=>{\n const callback = ()=>{\n setIsDocumentHidden(document.hidden);\n };\n document.addEventListener('visibilitychange', callback);\n return ()=>window.removeEventListener('visibilitychange', callback);\n }, []);\n return isDocumentHidden;\n};\n\nlet toastsCounter = 1;\nclass Observer {\n constructor(){\n // We use arrow functions to maintain the correct `this` reference\n this.subscribe = (subscriber)=>{\n this.subscribers.push(subscriber);\n return ()=>{\n const index = this.subscribers.indexOf(subscriber);\n this.subscribers.splice(index, 1);\n };\n };\n this.publish = (data)=>{\n this.subscribers.forEach((subscriber)=>subscriber(data));\n };\n this.addToast = (data)=>{\n this.publish(data);\n this.toasts = [\n ...this.toasts,\n data\n ];\n };\n this.create = (data)=>{\n var _data_id;\n const { message, ...rest } = data;\n const id = typeof (data == null ? void 0 : data.id) === 'number' || ((_data_id = data.id) == null ? void 0 : _data_id.length) > 0 ? data.id : toastsCounter++;\n const alreadyExists = this.toasts.find((toast)=>{\n return toast.id === id;\n });\n const dismissible = data.dismissible === undefined ? true : data.dismissible;\n if (this.dismissedToasts.has(id)) {\n this.dismissedToasts.delete(id);\n }\n if (alreadyExists) {\n this.toasts = this.toasts.map((toast)=>{\n if (toast.id === id) {\n this.publish({\n ...toast,\n ...data,\n id,\n title: message\n });\n return {\n ...toast,\n ...data,\n id,\n dismissible,\n title: message\n };\n }\n return toast;\n });\n } else {\n this.addToast({\n title: message,\n ...rest,\n dismissible,\n id\n });\n }\n return id;\n };\n this.dismiss = (id)=>{\n if (id) {\n this.dismissedToasts.add(id);\n requestAnimationFrame(()=>this.subscribers.forEach((subscriber)=>subscriber({\n id,\n dismiss: true\n })));\n } else {\n this.toasts.forEach((toast)=>{\n this.subscribers.forEach((subscriber)=>subscriber({\n id: toast.id,\n dismiss: true\n }));\n });\n }\n return id;\n };\n this.message = (message, data)=>{\n return this.create({\n ...data,\n message\n });\n };\n this.error = (message, data)=>{\n return this.create({\n ...data,\n message,\n type: 'error'\n });\n };\n this.success = (message, data)=>{\n return this.create({\n ...data,\n type: 'success',\n message\n });\n };\n this.info = (message, data)=>{\n return this.create({\n ...data,\n type: 'info',\n message\n });\n };\n this.warning = (message, data)=>{\n return this.create({\n ...data,\n type: 'warning',\n message\n });\n };\n this.loading = (message, data)=>{\n return this.create({\n ...data,\n type: 'loading',\n message\n });\n };\n this.promise = (promise, data)=>{\n if (!data) {\n // Nothing to show\n return;\n }\n let id = undefined;\n if (data.loading !== undefined) {\n id = this.create({\n ...data,\n promise,\n type: 'loading',\n message: data.loading,\n description: typeof data.description !== 'function' ? data.description : undefined\n });\n }\n const p = Promise.resolve(promise instanceof Function ? promise() : promise);\n let shouldDismiss = id !== undefined;\n let result;\n const originalPromise = p.then(async (response)=>{\n result = [\n 'resolve',\n response\n ];\n const isReactElementResponse = React.isValidElement(response);\n if (isReactElementResponse) {\n shouldDismiss = false;\n this.create({\n id,\n type: 'default',\n message: response\n });\n } else if (isHttpResponse(response) && !response.ok) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(`HTTP error! status: ${response.status}`) : data.error;\n const description = typeof data.description === 'function' ? await data.description(`HTTP error! status: ${response.status}`) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (response instanceof Error) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(response) : data.error;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (data.success !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.success === 'function' ? await data.success(response) : data.success;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'success',\n description,\n ...toastSettings\n });\n }\n }).catch(async (error)=>{\n result = [\n 'reject',\n error\n ];\n if (data.error !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(error) : data.error;\n const description = typeof data.description === 'function' ? await data.description(error) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n }\n }).finally(()=>{\n if (shouldDismiss) {\n // Toast is still in load state (and will be indefinitely — dismiss it)\n this.dismiss(id);\n id = undefined;\n }\n data.finally == null ? void 0 : data.finally.call(data);\n });\n const unwrap = ()=>new Promise((resolve, reject)=>originalPromise.then(()=>result[0] === 'reject' ? reject(result[1]) : resolve(result[1])).catch(reject));\n if (typeof id !== 'string' && typeof id !== 'number') {\n // cannot Object.assign on undefined\n return {\n unwrap\n };\n } else {\n return Object.assign(id, {\n unwrap\n });\n }\n };\n this.custom = (jsx, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n this.create({\n jsx: jsx(id),\n id,\n ...data\n });\n return id;\n };\n this.getActiveToasts = ()=>{\n return this.toasts.filter((toast)=>!this.dismissedToasts.has(toast.id));\n };\n this.subscribers = [];\n this.toasts = [];\n this.dismissedToasts = new Set();\n }\n}\nconst ToastState = new Observer();\n// bind this to the toast function\nconst toastFunction = (message, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n ToastState.addToast({\n title: message,\n ...data,\n id\n });\n return id;\n};\nconst isHttpResponse = (data)=>{\n return data && typeof data === 'object' && 'ok' in data && typeof data.ok === 'boolean' && 'status' in data && typeof data.status === 'number';\n};\nconst basicToast = toastFunction;\nconst getHistory = ()=>ToastState.toasts;\nconst getToasts = ()=>ToastState.getActiveToasts();\n// We use `Object.assign` to maintain the correct types as we would lose them otherwise\nconst toast = Object.assign(basicToast, {\n success: ToastState.success,\n info: ToastState.info,\n warning: ToastState.warning,\n error: ToastState.error,\n custom: ToastState.custom,\n message: ToastState.message,\n promise: ToastState.promise,\n dismiss: ToastState.dismiss,\n loading: ToastState.loading\n}, {\n getHistory,\n getToasts\n});\n\n__insertCSS(\"[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}\");\n\nfunction isAction(action) {\n return action.label !== undefined;\n}\n\n// Visible toasts amount\nconst VISIBLE_TOASTS_AMOUNT = 3;\n// Viewport padding\nconst VIEWPORT_OFFSET = '24px';\n// Mobile viewport padding\nconst MOBILE_VIEWPORT_OFFSET = '16px';\n// Default lifetime of a toasts (in ms)\nconst TOAST_LIFETIME = 4000;\n// Default toast width\nconst TOAST_WIDTH = 356;\n// Default gap between toasts\nconst GAP = 14;\n// Threshold to dismiss a toast\nconst SWIPE_THRESHOLD = 45;\n// Equal to exit animation duration\nconst TIME_BEFORE_UNMOUNT = 200;\nfunction cn(...classes) {\n return classes.filter(Boolean).join(' ');\n}\nfunction getDefaultSwipeDirections(position) {\n const [y, x] = position.split('-');\n const directions = [];\n if (y) {\n directions.push(y);\n }\n if (x) {\n directions.push(x);\n }\n return directions;\n}\nconst Toast = (props)=>{\n var _toast_classNames, _toast_classNames1, _toast_classNames2, _toast_classNames3, _toast_classNames4, _toast_classNames5, _toast_classNames6, _toast_classNames7, _toast_classNames8;\n const { invert: ToasterInvert, toast, unstyled, interacting, setHeights, visibleToasts, heights, index, toasts, expanded, removeToast, defaultRichColors, closeButton: closeButtonFromToaster, style, cancelButtonStyle, actionButtonStyle, className = '', descriptionClassName = '', duration: durationFromToaster, position, gap, expandByDefault, classNames, icons, closeButtonAriaLabel = 'Close toast' } = props;\n const [swipeDirection, setSwipeDirection] = React.useState(null);\n const [swipeOutDirection, setSwipeOutDirection] = React.useState(null);\n const [mounted, setMounted] = React.useState(false);\n const [removed, setRemoved] = React.useState(false);\n const [swiping, setSwiping] = React.useState(false);\n const [swipeOut, setSwipeOut] = React.useState(false);\n const [isSwiped, setIsSwiped] = React.useState(false);\n const [offsetBeforeRemove, setOffsetBeforeRemove] = React.useState(0);\n const [initialHeight, setInitialHeight] = React.useState(0);\n const remainingTime = React.useRef(toast.duration || durationFromToaster || TOAST_LIFETIME);\n const dragStartTime = React.useRef(null);\n const toastRef = React.useRef(null);\n const isFront = index === 0;\n const isVisible = index + 1 <= visibleToasts;\n const toastType = toast.type;\n const dismissible = toast.dismissible !== false;\n const toastClassname = toast.className || '';\n const toastDescriptionClassname = toast.descriptionClassName || '';\n // Height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.\n const heightIndex = React.useMemo(()=>heights.findIndex((height)=>height.toastId === toast.id) || 0, [\n heights,\n toast.id\n ]);\n const closeButton = React.useMemo(()=>{\n var _toast_closeButton;\n return (_toast_closeButton = toast.closeButton) != null ? _toast_closeButton : closeButtonFromToaster;\n }, [\n toast.closeButton,\n closeButtonFromToaster\n ]);\n const duration = React.useMemo(()=>toast.duration || durationFromToaster || TOAST_LIFETIME, [\n toast.duration,\n durationFromToaster\n ]);\n const closeTimerStartTimeRef = React.useRef(0);\n const offset = React.useRef(0);\n const lastCloseTimerStartTimeRef = React.useRef(0);\n const pointerStartRef = React.useRef(null);\n const [y, x] = position.split('-');\n const toastsHeightBefore = React.useMemo(()=>{\n return heights.reduce((prev, curr, reducerIndex)=>{\n // Calculate offset up until current toast\n if (reducerIndex >= heightIndex) {\n return prev;\n }\n return prev + curr.height;\n }, 0);\n }, [\n heights,\n heightIndex\n ]);\n const isDocumentHidden = useIsDocumentHidden();\n const invert = toast.invert || ToasterInvert;\n const disabled = toastType === 'loading';\n offset.current = React.useMemo(()=>heightIndex * gap + toastsHeightBefore, [\n heightIndex,\n toastsHeightBefore\n ]);\n React.useEffect(()=>{\n remainingTime.current = duration;\n }, [\n duration\n ]);\n React.useEffect(()=>{\n // Trigger enter animation without using CSS animation\n setMounted(true);\n }, []);\n React.useEffect(()=>{\n const toastNode = toastRef.current;\n if (toastNode) {\n const height = toastNode.getBoundingClientRect().height;\n // Add toast height to heights array after the toast is mounted\n setInitialHeight(height);\n setHeights((h)=>[\n {\n toastId: toast.id,\n height,\n position: toast.position\n },\n ...h\n ]);\n return ()=>setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));\n }\n }, [\n setHeights,\n toast.id\n ]);\n React.useLayoutEffect(()=>{\n // Keep height up to date with the content in case it updates\n if (!mounted) return;\n const toastNode = toastRef.current;\n const originalHeight = toastNode.style.height;\n toastNode.style.height = 'auto';\n const newHeight = toastNode.getBoundingClientRect().height;\n toastNode.style.height = originalHeight;\n setInitialHeight(newHeight);\n setHeights((heights)=>{\n const alreadyExists = heights.find((height)=>height.toastId === toast.id);\n if (!alreadyExists) {\n return [\n {\n toastId: toast.id,\n height: newHeight,\n position: toast.position\n },\n ...heights\n ];\n } else {\n return heights.map((height)=>height.toastId === toast.id ? {\n ...height,\n height: newHeight\n } : height);\n }\n });\n }, [\n mounted,\n toast.title,\n toast.description,\n setHeights,\n toast.id,\n toast.jsx,\n toast.action,\n toast.cancel\n ]);\n const deleteToast = React.useCallback(()=>{\n // Save the offset for the exit swipe animation\n setRemoved(true);\n setOffsetBeforeRemove(offset.current);\n setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));\n setTimeout(()=>{\n removeToast(toast);\n }, TIME_BEFORE_UNMOUNT);\n }, [\n toast,\n removeToast,\n setHeights,\n offset\n ]);\n React.useEffect(()=>{\n if (toast.promise && toastType === 'loading' || toast.duration === Infinity || toast.type === 'loading') return;\n let timeoutId;\n // Pause the timer on each hover\n const pauseTimer = ()=>{\n if (lastCloseTimerStartTimeRef.current < closeTimerStartTimeRef.current) {\n // Get the elapsed time since the timer started\n const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.current;\n remainingTime.current = remainingTime.current - elapsedTime;\n }\n lastCloseTimerStartTimeRef.current = new Date().getTime();\n };\n const startTimer = ()=>{\n // setTimeout(, Infinity) behaves as if the delay is 0.\n // As a result, the toast would be closed immediately, giving the appearance that it was never rendered.\n // See: https://github.com/denysdovhan/wtfjs?tab=readme-ov-file#an-infinite-timeout\n if (remainingTime.current === Infinity) return;\n closeTimerStartTimeRef.current = new Date().getTime();\n // Let the toast know it has started\n timeoutId = setTimeout(()=>{\n toast.onAutoClose == null ? void 0 : toast.onAutoClose.call(toast, toast);\n deleteToast();\n }, remainingTime.current);\n };\n if (expanded || interacting || isDocumentHidden) {\n pauseTimer();\n } else {\n startTimer();\n }\n return ()=>clearTimeout(timeoutId);\n }, [\n expanded,\n interacting,\n toast,\n toastType,\n isDocumentHidden,\n deleteToast\n ]);\n React.useEffect(()=>{\n if (toast.delete) {\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n }\n }, [\n deleteToast,\n toast.delete\n ]);\n function getLoadingIcon() {\n var _toast_classNames;\n if (icons == null ? void 0 : icons.loading) {\n var _toast_classNames1;\n return /*#__PURE__*/ React.createElement(\"div\", {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1.loader, 'sonner-loader'),\n \"data-visible\": toastType === 'loading'\n }, icons.loading);\n }\n return /*#__PURE__*/ React.createElement(Loader, {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.loader),\n visible: toastType === 'loading'\n });\n }\n const icon = toast.icon || (icons == null ? void 0 : icons[toastType]) || getAsset(toastType);\n var _toast_richColors, _icons_close;\n return /*#__PURE__*/ React.createElement(\"li\", {\n tabIndex: 0,\n ref: toastRef,\n className: cn(className, toastClassname, classNames == null ? void 0 : classNames.toast, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.toast, classNames == null ? void 0 : classNames.default, classNames == null ? void 0 : classNames[toastType], toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1[toastType]),\n \"data-sonner-toast\": \"\",\n \"data-rich-colors\": (_toast_richColors = toast.richColors) != null ? _toast_richColors : defaultRichColors,\n \"data-styled\": !Boolean(toast.jsx || toast.unstyled || unstyled),\n \"data-mounted\": mounted,\n \"data-promise\": Boolean(toast.promise),\n \"data-swiped\": isSwiped,\n \"data-removed\": removed,\n \"data-visible\": isVisible,\n \"data-y-position\": y,\n \"data-x-position\": x,\n \"data-index\": index,\n \"data-front\": isFront,\n \"data-swiping\": swiping,\n \"data-dismissible\": dismissible,\n \"data-type\": toastType,\n \"data-invert\": invert,\n \"data-swipe-out\": swipeOut,\n \"data-swipe-direction\": swipeOutDirection,\n \"data-expanded\": Boolean(expanded || expandByDefault && mounted),\n \"data-testid\": toast.testId,\n style: {\n '--index': index,\n '--toasts-before': index,\n '--z-index': toasts.length - index,\n '--offset': `${removed ? offsetBeforeRemove : offset.current}px`,\n '--initial-height': expandByDefault ? 'auto' : `${initialHeight}px`,\n ...style,\n ...toast.style\n },\n onDragEnd: ()=>{\n setSwiping(false);\n setSwipeDirection(null);\n pointerStartRef.current = null;\n },\n onPointerDown: (event)=>{\n if (event.button === 2) return; // Return early on right click\n if (disabled || !dismissible) return;\n dragStartTime.current = new Date();\n setOffsetBeforeRemove(offset.current);\n // Ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)\n event.target.setPointerCapture(event.pointerId);\n if (event.target.tagName === 'BUTTON') return;\n setSwiping(true);\n pointerStartRef.current = {\n x: event.clientX,\n y: event.clientY\n };\n },\n onPointerUp: ()=>{\n var _toastRef_current, _toastRef_current1, _dragStartTime_current;\n if (swipeOut || !dismissible) return;\n pointerStartRef.current = null;\n const swipeAmountX = Number(((_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.getPropertyValue('--swipe-amount-x').replace('px', '')) || 0);\n const swipeAmountY = Number(((_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.getPropertyValue('--swipe-amount-y').replace('px', '')) || 0);\n const timeTaken = new Date().getTime() - ((_dragStartTime_current = dragStartTime.current) == null ? void 0 : _dragStartTime_current.getTime());\n const swipeAmount = swipeDirection === 'x' ? swipeAmountX : swipeAmountY;\n const velocity = Math.abs(swipeAmount) / timeTaken;\n if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {\n setOffsetBeforeRemove(offset.current);\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n if (swipeDirection === 'x') {\n setSwipeOutDirection(swipeAmountX > 0 ? 'right' : 'left');\n } else {\n setSwipeOutDirection(swipeAmountY > 0 ? 'down' : 'up');\n }\n deleteToast();\n setSwipeOut(true);\n return;\n } else {\n var _toastRef_current2, _toastRef_current3;\n (_toastRef_current2 = toastRef.current) == null ? void 0 : _toastRef_current2.style.setProperty('--swipe-amount-x', `0px`);\n (_toastRef_current3 = toastRef.current) == null ? void 0 : _toastRef_current3.style.setProperty('--swipe-amount-y', `0px`);\n }\n setIsSwiped(false);\n setSwiping(false);\n setSwipeDirection(null);\n },\n onPointerMove: (event)=>{\n var _window_getSelection, // Apply transform using both x and y values\n _toastRef_current, _toastRef_current1;\n if (!pointerStartRef.current || !dismissible) return;\n const isHighlighted = ((_window_getSelection = window.getSelection()) == null ? void 0 : _window_getSelection.toString().length) > 0;\n if (isHighlighted) return;\n const yDelta = event.clientY - pointerStartRef.current.y;\n const xDelta = event.clientX - pointerStartRef.current.x;\n var _props_swipeDirections;\n const swipeDirections = (_props_swipeDirections = props.swipeDirections) != null ? _props_swipeDirections : getDefaultSwipeDirections(position);\n // Determine swipe direction if not already locked\n if (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n setSwipeDirection(Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y');\n }\n let swipeAmount = {\n x: 0,\n y: 0\n };\n const getDampening = (delta)=>{\n const factor = Math.abs(delta) / 20;\n return 1 / (1.5 + factor);\n };\n // Only apply swipe in the locked direction\n if (swipeDirection === 'y') {\n // Handle vertical swipes\n if (swipeDirections.includes('top') || swipeDirections.includes('bottom')) {\n if (swipeDirections.includes('top') && yDelta < 0 || swipeDirections.includes('bottom') && yDelta > 0) {\n swipeAmount.y = yDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = yDelta * getDampening(yDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.y = Math.abs(dampenedDelta) < Math.abs(yDelta) ? dampenedDelta : yDelta;\n }\n }\n } else if (swipeDirection === 'x') {\n // Handle horizontal swipes\n if (swipeDirections.includes('left') || swipeDirections.includes('right')) {\n if (swipeDirections.includes('left') && xDelta < 0 || swipeDirections.includes('right') && xDelta > 0) {\n swipeAmount.x = xDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = xDelta * getDampening(xDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.x = Math.abs(dampenedDelta) < Math.abs(xDelta) ? dampenedDelta : xDelta;\n }\n }\n }\n if (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {\n setIsSwiped(true);\n }\n (_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.setProperty('--swipe-amount-x', `${swipeAmount.x}px`);\n (_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.setProperty('--swipe-amount-y', `${swipeAmount.y}px`);\n }\n }, closeButton && !toast.jsx && toastType !== 'loading' ? /*#__PURE__*/ React.createElement(\"button\", {\n \"aria-label\": closeButtonAriaLabel,\n \"data-disabled\": disabled,\n \"data-close-button\": true,\n onClick: disabled || !dismissible ? ()=>{} : ()=>{\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n },\n className: cn(classNames == null ? void 0 : classNames.closeButton, toast == null ? void 0 : (_toast_classNames2 = toast.classNames) == null ? void 0 : _toast_classNames2.closeButton)\n }, (_icons_close = icons == null ? void 0 : icons.close) != null ? _icons_close : CloseIcon) : null, (toastType || toast.icon || toast.promise) && toast.icon !== null && ((icons == null ? void 0 : icons[toastType]) !== null || toast.icon) ? /*#__PURE__*/ React.createElement(\"div\", {\n \"data-icon\": \"\",\n className: cn(classNames == null ? void 0 : classNames.icon, toast == null ? void 0 : (_toast_classNames3 = toast.classNames) == null ? void 0 : _toast_classNames3.icon)\n }, toast.promise || toast.type === 'loading' && !toast.icon ? toast.icon || getLoadingIcon() : null, toast.type !== 'loading' ? icon : null) : null, /*#__PURE__*/ React.createElement(\"div\", {\n \"data-content\": \"\",\n className: cn(classNames == null ? void 0 : classNames.content, toast == null ? void 0 : (_toast_classNames4 = toast.classNames) == null ? void 0 : _toast_classNames4.content)\n }, /*#__PURE__*/ React.createElement(\"div\", {\n \"data-title\": \"\",\n className: cn(classNames == null ? void 0 : classNames.title, toast == null ? void 0 : (_toast_classNames5 = toast.classNames) == null ? void 0 : _toast_classNames5.title)\n }, toast.jsx ? toast.jsx : typeof toast.title === 'function' ? toast.title() : toast.title), toast.description ? /*#__PURE__*/ React.createElement(\"div\", {\n \"data-description\": \"\",\n className: cn(descriptionClassName, toastDescriptionClassname, classNames == null ? void 0 : classNames.description, toast == null ? void 0 : (_toast_classNames6 = toast.classNames) == null ? void 0 : _toast_classNames6.description)\n }, typeof toast.description === 'function' ? toast.description() : toast.description) : null), /*#__PURE__*/ React.isValidElement(toast.cancel) ? toast.cancel : toast.cancel && isAction(toast.cancel) ? /*#__PURE__*/ React.createElement(\"button\", {\n \"data-button\": true,\n \"data-cancel\": true,\n style: toast.cancelButtonStyle || cancelButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.cancel)) return;\n if (!dismissible) return;\n toast.cancel.onClick == null ? void 0 : toast.cancel.onClick.call(toast.cancel, event);\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.cancelButton, toast == null ? void 0 : (_toast_classNames7 = toast.classNames) == null ? void 0 : _toast_classNames7.cancelButton)\n }, toast.cancel.label) : null, /*#__PURE__*/ React.isValidElement(toast.action) ? toast.action : toast.action && isAction(toast.action) ? /*#__PURE__*/ React.createElement(\"button\", {\n \"data-button\": true,\n \"data-action\": true,\n style: toast.actionButtonStyle || actionButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.action)) return;\n toast.action.onClick == null ? void 0 : toast.action.onClick.call(toast.action, event);\n if (event.defaultPrevented) return;\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.actionButton, toast == null ? void 0 : (_toast_classNames8 = toast.classNames) == null ? void 0 : _toast_classNames8.actionButton)\n }, toast.action.label) : null);\n};\nfunction getDocumentDirection() {\n if (typeof window === 'undefined') return 'ltr';\n if (typeof document === 'undefined') return 'ltr'; // For Fresh purpose\n const dirAttribute = document.documentElement.getAttribute('dir');\n if (dirAttribute === 'auto' || !dirAttribute) {\n return window.getComputedStyle(document.documentElement).direction;\n }\n return dirAttribute;\n}\nfunction assignOffset(defaultOffset, mobileOffset) {\n const styles = {};\n [\n defaultOffset,\n mobileOffset\n ].forEach((offset, index)=>{\n const isMobile = index === 1;\n const prefix = isMobile ? '--mobile-offset' : '--offset';\n const defaultValue = isMobile ? MOBILE_VIEWPORT_OFFSET : VIEWPORT_OFFSET;\n function assignAll(offset) {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n styles[`${prefix}-${key}`] = typeof offset === 'number' ? `${offset}px` : offset;\n });\n }\n if (typeof offset === 'number' || typeof offset === 'string') {\n assignAll(offset);\n } else if (typeof offset === 'object') {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n if (offset[key] === undefined) {\n styles[`${prefix}-${key}`] = defaultValue;\n } else {\n styles[`${prefix}-${key}`] = typeof offset[key] === 'number' ? `${offset[key]}px` : offset[key];\n }\n });\n } else {\n assignAll(defaultValue);\n }\n });\n return styles;\n}\nfunction useSonner() {\n const [activeToasts, setActiveToasts] = React.useState([]);\n React.useEffect(()=>{\n return ToastState.subscribe((toast)=>{\n if (toast.dismiss) {\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setActiveToasts((toasts)=>toasts.filter((t)=>t.id !== toast.id));\n });\n });\n return;\n }\n // Prevent batching, temp solution.\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setActiveToasts((toasts)=>{\n const indexOfExistingToast = toasts.findIndex((t)=>t.id === toast.id);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n });\n });\n });\n });\n }, []);\n return {\n toasts: activeToasts\n };\n}\nconst Toaster = /*#__PURE__*/ React.forwardRef(function Toaster(props, ref) {\n const { id, invert, position = 'bottom-right', hotkey = [\n 'altKey',\n 'KeyT'\n ], expand, closeButton, className, offset, mobileOffset, theme = 'light', richColors, duration, style, visibleToasts = VISIBLE_TOASTS_AMOUNT, toastOptions, dir = getDocumentDirection(), gap = GAP, icons, containerAriaLabel = 'Notifications' } = props;\n const [toasts, setToasts] = React.useState([]);\n const filteredToasts = React.useMemo(()=>{\n if (id) {\n return toasts.filter((toast)=>toast.toasterId === id);\n }\n return toasts.filter((toast)=>!toast.toasterId);\n }, [\n toasts,\n id\n ]);\n const possiblePositions = React.useMemo(()=>{\n return Array.from(new Set([\n position\n ].concat(filteredToasts.filter((toast)=>toast.position).map((toast)=>toast.position))));\n }, [\n filteredToasts,\n position\n ]);\n const [heights, setHeights] = React.useState([]);\n const [expanded, setExpanded] = React.useState(false);\n const [interacting, setInteracting] = React.useState(false);\n const [actualTheme, setActualTheme] = React.useState(theme !== 'system' ? theme : typeof window !== 'undefined' ? window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' : 'light');\n const listRef = React.useRef(null);\n const hotkeyLabel = hotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '');\n const lastFocusedElementRef = React.useRef(null);\n const isFocusWithinRef = React.useRef(false);\n const removeToast = React.useCallback((toastToRemove)=>{\n setToasts((toasts)=>{\n var _toasts_find;\n if (!((_toasts_find = toasts.find((toast)=>toast.id === toastToRemove.id)) == null ? void 0 : _toasts_find.delete)) {\n ToastState.dismiss(toastToRemove.id);\n }\n return toasts.filter(({ id })=>id !== toastToRemove.id);\n });\n }, []);\n React.useEffect(()=>{\n return ToastState.subscribe((toast)=>{\n if (toast.dismiss) {\n // Prevent batching of other state updates\n requestAnimationFrame(()=>{\n setToasts((toasts)=>toasts.map((t)=>t.id === toast.id ? {\n ...t,\n delete: true\n } : t));\n });\n return;\n }\n // Prevent batching, temp solution.\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setToasts((toasts)=>{\n const indexOfExistingToast = toasts.findIndex((t)=>t.id === toast.id);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n });\n });\n });\n });\n }, [\n toasts\n ]);\n React.useEffect(()=>{\n if (theme !== 'system') {\n setActualTheme(theme);\n return;\n }\n if (theme === 'system') {\n // check if current preference is dark\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n // it's currently dark\n setActualTheme('dark');\n } else {\n // it's not dark\n setActualTheme('light');\n }\n }\n if (typeof window === 'undefined') return;\n const darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n try {\n // Chrome & Firefox\n darkMediaQuery.addEventListener('change', ({ matches })=>{\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n });\n } catch (error) {\n // Safari < 14\n darkMediaQuery.addListener(({ matches })=>{\n try {\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n } catch (e) {\n console.error(e);\n }\n });\n }\n }, [\n theme\n ]);\n React.useEffect(()=>{\n // Ensure expanded is always false when no toasts are present / only one left\n if (toasts.length <= 1) {\n setExpanded(false);\n }\n }, [\n toasts\n ]);\n React.useEffect(()=>{\n const handleKeyDown = (event)=>{\n var _listRef_current;\n const isHotkeyPressed = hotkey.every((key)=>event[key] || event.code === key);\n if (isHotkeyPressed) {\n var _listRef_current1;\n setExpanded(true);\n (_listRef_current1 = listRef.current) == null ? void 0 : _listRef_current1.focus();\n }\n if (event.code === 'Escape' && (document.activeElement === listRef.current || ((_listRef_current = listRef.current) == null ? void 0 : _listRef_current.contains(document.activeElement)))) {\n setExpanded(false);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return ()=>document.removeEventListener('keydown', handleKeyDown);\n }, [\n hotkey\n ]);\n React.useEffect(()=>{\n if (listRef.current) {\n return ()=>{\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n isFocusWithinRef.current = false;\n }\n };\n }\n }, [\n listRef.current\n ]);\n return(// Remove item from normal navigation flow, only available via hotkey\n /*#__PURE__*/ React.createElement(\"section\", {\n ref: ref,\n \"aria-label\": `${containerAriaLabel} ${hotkeyLabel}`,\n tabIndex: -1,\n \"aria-live\": \"polite\",\n \"aria-relevant\": \"additions text\",\n \"aria-atomic\": \"false\",\n suppressHydrationWarning: true\n }, possiblePositions.map((position, index)=>{\n var _heights_;\n const [y, x] = position.split('-');\n if (!filteredToasts.length) return null;\n return /*#__PURE__*/ React.createElement(\"ol\", {\n key: position,\n dir: dir === 'auto' ? getDocumentDirection() : dir,\n tabIndex: -1,\n ref: listRef,\n className: className,\n \"data-sonner-toaster\": true,\n \"data-sonner-theme\": actualTheme,\n \"data-y-position\": y,\n \"data-x-position\": x,\n style: {\n '--front-toast-height': `${((_heights_ = heights[0]) == null ? void 0 : _heights_.height) || 0}px`,\n '--width': `${TOAST_WIDTH}px`,\n '--gap': `${gap}px`,\n ...style,\n ...assignOffset(offset, mobileOffset)\n },\n onBlur: (event)=>{\n if (isFocusWithinRef.current && !event.currentTarget.contains(event.relatedTarget)) {\n isFocusWithinRef.current = false;\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n }\n }\n },\n onFocus: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n if (!isFocusWithinRef.current) {\n isFocusWithinRef.current = true;\n lastFocusedElementRef.current = event.relatedTarget;\n }\n },\n onMouseEnter: ()=>setExpanded(true),\n onMouseMove: ()=>setExpanded(true),\n onMouseLeave: ()=>{\n // Avoid setting expanded to false when interacting with a toast, e.g. swiping\n if (!interacting) {\n setExpanded(false);\n }\n },\n onDragEnd: ()=>setExpanded(false),\n onPointerDown: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n setInteracting(true);\n },\n onPointerUp: ()=>setInteracting(false)\n }, filteredToasts.filter((toast)=>!toast.position && index === 0 || toast.position === position).map((toast, index)=>{\n var _toastOptions_duration, _toastOptions_closeButton;\n return /*#__PURE__*/ React.createElement(Toast, {\n key: toast.id,\n icons: icons,\n index: index,\n toast: toast,\n defaultRichColors: richColors,\n duration: (_toastOptions_duration = toastOptions == null ? void 0 : toastOptions.duration) != null ? _toastOptions_duration : duration,\n className: toastOptions == null ? void 0 : toastOptions.className,\n descriptionClassName: toastOptions == null ? void 0 : toastOptions.descriptionClassName,\n invert: invert,\n visibleToasts: visibleToasts,\n closeButton: (_toastOptions_closeButton = toastOptions == null ? void 0 : toastOptions.closeButton) != null ? _toastOptions_closeButton : closeButton,\n interacting: interacting,\n position: position,\n style: toastOptions == null ? void 0 : toastOptions.style,\n unstyled: toastOptions == null ? void 0 : toastOptions.unstyled,\n classNames: toastOptions == null ? void 0 : toastOptions.classNames,\n cancelButtonStyle: toastOptions == null ? void 0 : toastOptions.cancelButtonStyle,\n actionButtonStyle: toastOptions == null ? void 0 : toastOptions.actionButtonStyle,\n closeButtonAriaLabel: toastOptions == null ? void 0 : toastOptions.closeButtonAriaLabel,\n removeToast: removeToast,\n toasts: filteredToasts.filter((t)=>t.position == toast.position),\n heights: heights.filter((h)=>h.position == toast.position),\n setHeights: setHeights,\n expandByDefault: expand,\n gap: gap,\n expanded: expanded,\n swipeDirections: props.swipeDirections\n });\n }));\n })));\n});\n\nexport { Toaster, toast, useSonner };\n","/**\n * Toast — a thin convenience over {@link https://sonner.emilkowal.ski | sonner}.\n *\n * Authors call `toast.success(...)` / `toast.error(...)` anywhere in their funnel.\n * `FunnelProvider` auto-mounts {@link FunnelToaster} (opt out with `toaster={false}`),\n * so toasts work with no setup; render it yourself if you want a custom location.\n *\n * **Dependency policy:** sonner is a direct dependency, imported statically (it's a small\n * lib that ships with every funnel — no lazy chunk, no forwarding proxy). `toaster={false}`\n * still renders no toaster markup; a funnel that never toasts just never calls `toast`.\n */\n\nimport { createElement, type ReactNode } from 'react'\nimport { Toaster, type ToasterProps } from 'sonner'\n\nexport type { ToasterProps }\n\n// sonner's imperative `toast` (`toast('hi')`, `toast.success(...)`, `toast.dismiss()`, …),\n// re-exported DIRECTLY. A re-export keeps the emitted .d.ts nameable — annotating an inferred\n// `const toast = sonnerToast` would drag in sonner's un-exported internal types (TS4023).\nexport { toast } from 'sonner'\n\n/**\n * Sonner's `<Toaster>` with funnel defaults (top-center); pass any `ToasterProps` to override.\n * SSR-safe — sonner renders an empty container server-side and hydrates cleanly on the client.\n */\nexport function FunnelToaster(props: ToasterProps = {}): ReactNode {\n return createElement(Toaster, { position: 'top-center', ...props })\n}\n\n/** Internal: resolve the `FunnelProvider` `toaster` prop to an element (or null). */\nexport function renderToaster(toaster: boolean | ToasterProps): ReactNode {\n if (toaster === false) return null\n return <FunnelToaster {...(toaster === true ? {} : toaster)} />\n}\n","import {\n createContext,\n createElement,\n Fragment,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from 'react'\nimport type { VariableStore } from './variableStore'\nimport { createFunnelStore, NAMESPACE_PREFIX, type WritableNamespace } from './store'\nimport { buildAcquisition, buildContext, type FunnelContext } from './context'\nimport {\n TrackerProvider,\n createConsoleTracker,\n type Tracker,\n} from '../tracking/tracking'\nimport { attachBus, createBus, withBus, type FunnelBus } from '../tracking/bus'\nimport { CatalogProvider, buildCatalog, type ResolvedProduct, type ProductInput } from '../commerce/catalog'\nimport { CheckoutDriverProvider, createMockDriver, driverWithEmail, type CheckoutDriver } from '../commerce/checkout'\nimport { ModalRuntime } from '../modals/registry'\nimport { LocaleProvider, type MessageCatalog } from '../i18n/translation'\nimport { renderToaster, type ToasterProps } from '../toast/toast'\nimport type { FunnelDefinition, FunnelSnapshot } from '../flow/spine'\nimport type { RuntimeExperiment } from '../flow/experiments'\nimport type { VariableValue } from '../types'\n\n/**\n * v2 namespace layer over the flat {@link VariableStore}.\n *\n * **The public surface is hooks, not a god object.** Reactive reads use\n * `useState`-shaped tuple hooks (`const [goal, setGoal] = useResponse('goal')`);\n * read-only computed values use `useDevice()`/`useLocale()`/`usePage()`/`useUtm()`.\n * `useFunnel()` returns an **imperative, non-subscribing** handle for use in\n * handlers/effects only — it is not the documented primary API and carries no\n * `sdk` branding.\n *\n * Three writable namespaces (`user`/`responses`/`data`) + the read-only\n * `context`. Entitlements are **not** here — they're the separate app/IdentitySDK.\n *\n * All writes route through {@link Namespace.set}, so persistence + identify fire\n * from one place (the \"magic behind set()\", doc 07 §Layer 1).\n */\n\n// ── Writable namespace view ──────────────────────────────\n\n/** A typed view over one writable namespace's slice of the store. */\nexport class Namespace<\n T extends Record<string, VariableValue> = Record<string, VariableValue>,\n> {\n private readonly dot: string\n\n constructor(\n private readonly store: VariableStore,\n readonly name: WritableNamespace,\n /** Side-effect run after every write (persistence, identify). */\n private readonly onWrite: (ns: WritableNamespace, values: Partial<T>) => void,\n ) {\n this.dot = `${NAMESPACE_PREFIX[name]}.`\n }\n\n /** Fully-qualified store key for a namespace-relative key. */\n storeKey(key: string): string {\n return this.dot + key\n }\n\n /** The store-key prefix this namespace reads/writes (e.g. `user.`). */\n get prefix(): string {\n return this.dot\n }\n\n /** Read the whole namespace as a flat object (prefix stripped). */\n getAll(): T {\n const out: Record<string, VariableValue> = {}\n const all = this.store.getState()\n for (const key in all) {\n if (key.startsWith(this.dot)) out[key.slice(this.dot.length)] = all[key]\n }\n return out as T\n }\n\n /** Read one key, or the whole namespace when called with no argument. */\n get<K extends keyof T & string>(key: K): T[K]\n get(): T\n get(key?: string): VariableValue | T {\n return key === undefined ? this.getAll() : this.store.get(this.storeKey(key))\n }\n\n /** Write one or more keys from a plain object (batched + side-effected). */\n set(values: Partial<T>): void {\n const updates: Record<string, VariableValue> = {}\n for (const key in values) {\n updates[this.storeKey(key)] = values[key] as VariableValue\n }\n this.store.setMany(updates)\n this.onWrite(this.name, values)\n }\n}\n\n// ── The imperative handle ────────────────────────────────\n\n/**\n * The imperative funnel handle (`useFunnel()`). Non-reactive — for event\n * handlers and effects. Reactive render reads go through the hooks instead.\n */\nexport interface Funnel {\n user: Namespace\n responses: Namespace\n data: Namespace\n /** Read-only computed namespace. `page` reflects the latest navigation. */\n readonly context: FunnelContext\n /** Live page-level experiment records (platform/DB-sourced); the runtime buckets visitors into them. */\n readonly experiments: RuntimeExperiment[]\n /** Emit a custom analytics event. */\n track: Tracker['track']\n /** A point-in-time snapshot for predicates (routing/conditions). */\n snapshot(): FunnelSnapshot\n}\n\n/** Build the imperative handle over a store + context + tracker. */\nexport function createFunnel(\n store: VariableStore,\n context: FunnelContext,\n tracker: Tracker,\n experiments: RuntimeExperiment[] = [],\n): Funnel {\n // One write path → one place for the \"magic behind set()\".\n const onWrite = (ns: WritableNamespace, values: Record<string, VariableValue>) => {\n // Identify the moment a non-empty email is written.\n if (ns === 'user' && typeof values.email === 'string' && values.email) {\n tracker.identify(values.email)\n }\n // Push the writable snapshot for debounced persistence.\n tracker.setVariables?.(store.getState())\n }\n\n const user = new Namespace(store, 'user', onWrite)\n const responses = new Namespace(store, 'responses', onWrite)\n const data = new Namespace(store, 'data', onWrite)\n\n return {\n user,\n responses,\n data,\n context,\n experiments,\n track: (event: string, eventData?: never, userData?: Record<string, unknown>) =>\n tracker.track(event, eventData, userData),\n snapshot: () => ({\n user: user.getAll(),\n responses: responses.getAll(),\n data: data.getAll(),\n context,\n }),\n }\n}\n\n// ── React wiring ─────────────────────────────────────────\n\ninterface FunnelContextValue {\n funnel: Funnel\n store: VariableStore\n context: FunnelContext\n catalog: Map<string, ResolvedProduct>\n driver: CheckoutDriver\n /** Tracker composed with the client bus sink (every track() also hits window.appfunnel). */\n tracker: Tracker\n /** The window.appfunnel event bus (client-side integration surface). */\n bus: FunnelBus\n}\n\nconst FunnelCtx = createContext<FunnelContextValue | null>(null)\n\nexport interface FunnelProviderProps {\n /** Mount from a funnel definition (the normal case). */\n config?: FunnelDefinition\n /** Server / session-restored values overriding declared defaults. */\n sessionValues?: Record<string, VariableValue>\n /** The platform tracker; defaults to a silent console tracker (tests/dev). */\n tracker?: Tracker\n /** Computed-context seed (funnel id, test/live mode, server-hydrated utm/session). */\n context?: Parameters<typeof buildContext>[0]\n /** Products with their provider-resolved price (`{ amount, currency }`). */\n products?: ProductInput[]\n /** Live page-level experiment records, platform/DB-sourced (not authored in funnel code). */\n experiments?: RuntimeExperiment[]\n /** The platform checkout driver; defaults to a mock that resolves successfully. */\n checkout?: CheckoutDriver\n /** Message catalogs per locale (`messages/<locale>.json`) for translation. */\n messages?: MessageCatalog\n /** Explicit locale override (URL/param/geo); wins over the detected device locale. */\n locale?: string\n /** Auto-mount the toast `<Toaster>` (default true). Pass props to customize, or `false` to opt out. */\n toaster?: boolean | ToasterProps\n /** Advanced / testing: supply a pre-built store instead of a `config`. */\n store?: VariableStore\n children: ReactNode\n}\n\n/**\n * Mounts a funnel: builds the writable {@link VariableStore} + the read-only\n * {@link FunnelContext} (once) and provides the runtime to the tree via hooks.\n */\nexport function FunnelProvider({\n config,\n sessionValues,\n tracker,\n context: contextOpts,\n products,\n experiments,\n checkout,\n messages,\n locale: localeOverride,\n toaster = true,\n store,\n children,\n}: FunnelProviderProps): ReactNode {\n const resolvedTracker = tracker ?? FALLBACK_TRACKER\n const [value] = useState<FunnelContextValue>(() => {\n const s =\n store ??\n createFunnelStore(\n { responses: config?.responses, data: config?.data },\n sessionValues,\n )\n const ctx = buildContext({\n funnelId: config?.id,\n ...contextOpts,\n })\n // The client event bus (window.appfunnel), composed into the tracker so every\n // taxonomy event mirrors to it for on-page pixels. Read getters wire to store + context.\n const bus = createBus({\n getVariable: (key) => s.get(key),\n getVariables: () => s.getState(),\n getCurrentPageId: () => ctx.page.key || null,\n getCustomerId: () => ctx.identity.customerId,\n getVisitorId: () => ctx.identity.visitorId,\n })\n const busTracker = withBus(resolvedTracker, bus)\n // Every checkout attempt carries the buyer email the funnel collected — read\n // from the store at ATTEMPT time (`user.email`), loose-validated so a half-typed\n // value can't fail the wire's email validation (the server treats absent email\n // as an anonymous customer; a webhook/identify backfills it later).\n const emailForCheckout = (): string | undefined => {\n const value = s.get('user.email')\n return typeof value === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(value) ? value : undefined\n }\n return {\n funnel: createFunnel(s, ctx, busTracker, experiments ?? []),\n store: s,\n context: ctx,\n catalog: buildCatalog(products ?? []),\n driver: driverWithEmail(checkout ?? createMockDriver(), emailForCheckout),\n tracker: busTracker,\n bus,\n }\n })\n // Expose the bus on window.appfunnel for the funnel's lifetime (client-side only).\n useEffect(() => attachBus(value.bus), [value.bus])\n // Forward the acquisition snapshot once on entry → the platform persists it\n // first-class (session + first-touch Customer) + feeds CAPI.\n useEffect(() => {\n value.tracker.setAcquisition?.(buildAcquisition(value.context))\n }, [value])\n const tree = createElement(TrackerProvider, {\n tracker: value.tracker,\n children: createElement(CheckoutDriverProvider, {\n driver: value.driver,\n children: createElement(CatalogProvider, {\n catalog: value.catalog,\n children: createElement(FunnelCtx.Provider, {\n value,\n children: createElement(LocaleProvider, {\n config: config?.locales,\n catalog: messages,\n detected: value.context.locale.locale,\n override: localeOverride,\n children: createElement(ModalRuntime, { children }),\n }),\n }),\n }),\n }),\n })\n return createElement(Fragment, null, tree, renderToaster(toaster))\n}\n\nconst FALLBACK_TRACKER = createConsoleTracker({ silent: true })\n\nfunction useFunnelCtx(): FunnelContextValue {\n const ctx = useContext(FunnelCtx)\n if (!ctx) {\n throw new Error('useFunnel/useResponse/… must be used inside <FunnelProvider>')\n }\n return ctx\n}\n\n/**\n * The imperative handle. Does **not** subscribe — use it in event handlers and\n * effects (`useFunnel().responses.set({...})`). For reactive reads use the hooks.\n */\nexport function useFunnel(): Funnel {\n return useFunnelCtx().funnel\n}\n\n/** Internal: the raw {@link VariableStore} (for reactive condition/field hooks). */\nexport function useFunnelStore(): VariableStore {\n return useFunnelCtx().store\n}\n\n// ── Reactive field hooks ─────────────────────────────────\n\n/** Subscribe to a single flat store key; returns its reactive value. */\nfunction useStoreKey(store: VariableStore, key: string): VariableValue {\n const subscribe = useCallback(\n (cb: () => void) => store.subscribe(cb, { keys: [key] }),\n [store, key],\n )\n const getSnapshot = useCallback(() => store.get(key), [store, key])\n // Snapshot is the primitive value → stable by value, no caching needed.\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}\n\n/** Build a `useState`-shaped tuple hook bound to one writable namespace. */\nfunction makeFieldHook(ns: WritableNamespace) {\n return function useNamespaceField(\n key: string,\n ): [VariableValue, (value: VariableValue) => void] {\n const { funnel, store } = useFunnelCtx()\n const value = useStoreKey(store, `${NAMESPACE_PREFIX[ns]}.${key}`)\n const set = useCallback(\n (v: VariableValue) => funnel[ns].set({ [key]: v }),\n [funnel, key],\n )\n return [value, set]\n }\n}\n\n/**\n * `const [goal, setGoal] = useResponse('goal')` — one funnel answer,\n * `useState`-shaped and per-key reactive. Writing persists + (later) feeds\n * analytics aggregation.\n */\nexport const useResponse = makeFieldHook('responses')\n\n/**\n * `const [height, setHeight] = useUserAttribute('height')` — any field on the\n * user. The platform routes known fields → typed column, custom → attribute;\n * the author doesn't specify which. Writing `email` also identifies the visitor.\n */\nexport const useUserAttribute = makeFieldHook('user')\n\n/**\n * `const [score, setScore] = useData('score')` — working/scratch state. Persisted\n * (survives reload/return) but kept out of `responses` aggregation.\n */\nexport const useData = makeFieldHook('data')\n\n/**\n * The headless field hook — `useField('responses.goal')` — the building block\n * the styleable components (`<Choice>`) wrap. Takes a namespaced path and\n * returns `{ value, set }`. Accepts only writable namespaces.\n */\nexport function useField(path: string): {\n value: VariableValue\n set: (value: VariableValue) => void\n} {\n const dot = path.indexOf('.')\n const ns = path.slice(0, dot) as WritableNamespace\n const key = path.slice(dot + 1)\n const { funnel, store } = useFunnelCtx()\n if (!(ns in NAMESPACE_PREFIX)) {\n throw new Error(`useField: \"${path}\" is not a writable namespace (user/responses/data)`)\n }\n const value = useStoreKey(store, `${NAMESPACE_PREFIX[ns]}.${key}`)\n const set = useCallback(\n (v: VariableValue) => funnel[ns].set({ [key]: v }),\n [funnel, ns, key],\n )\n return { value, set }\n}\n\n// ── Read-only context hooks ──────────────────────────────\n\n/** The whole read-only computed namespace (non-reactive except `page`). */\nfunction useContextObject(): FunnelContext {\n return useFunnelCtx().context\n}\n\n/** `useDevice()` — viewport, device type, pixel ratio (read-only). */\nexport function useDevice(): FunnelContext['device'] {\n return useContextObject().device\n}\n\n/** `useLocale()` — resolved locale/language/region/timezone (read-only). */\nexport function useLocale(): FunnelContext['locale'] {\n return useContextObject().locale\n}\n\n/** `useUtm()` — the 5 utm params captured on entry (read-only). */\nexport function useUtm(): FunnelContext['utm'] {\n return useContextObject().utm\n}\n\n/** `useClickIds()` — per-network ad click-ids captured on entry (read-only). */\nexport function useClickIds(): FunnelContext['clickIds'] {\n return useContextObject().clickIds\n}\n\n/** `useSystem()` — funnel id, test/live mode, build clock (read-only). */\nexport function useSystem(): FunnelContext['system'] {\n return useContextObject().system\n}\n\n/** Read a dotted path out of context, e.g. `useContextValue('device.isMobile')`. */\nexport function useContextValue(path: string): unknown {\n const ctx = useContextObject()\n return useMemo(\n () => path.split('.').reduce<unknown>((acc, k) => (acc as Record<string, unknown>)?.[k], ctx),\n [ctx, path],\n )\n}\n","/**\n * The REAL platform tracker (phase-1 §1.4 / BREAKING-CHANGES B-1) — POSTs the taxonomy to\n * `POST {apiBase}/campaign/{campaignId}/event`, the SAME ingestion endpoint v1 funnels use, so\n * v2 sessions/customers/events land in the shared analytics graph with zero schema fork.\n *\n * Built INSIDE the sealed bundle from serializable config (`MountOpts.tracking`) — the renderer\n * can only pass data across the build boundary, never live objects. Wired automatically by\n * `createFunnelTree` when tracking config is present.\n *\n * Behavior:\n * - SSR-safe: on the server (or with no config) this is never constructed — `createFunnelTree`\n * only wires it client-side; the export also guards `window` for direct users.\n * - mode:'test' → console tracker (previews/QA never pollute shared analytics; the real\n * test-mode quarantine is phase-3 §3.1c).\n * - The FIRST event establishes the session: sends are SERIALIZED until the server returns a\n * `sessionId` (avoids N parallel first-events racing session creation), then fire-and-forget.\n * The sessionId is kept in sessionStorage (per-tab reload continuity) — durable cross-visit\n * identity is the `visitorId`'s job, not the session's.\n * - `visitorId` (bare id, SSR-injected from the af_vid cookie) rides on every event — the\n * ingestion side uses it for durable session lookup + anonymous-Customer continuity.\n * - Acquisition (utm + click-ids + fbp/fbc + referrer) is folded into the FIRST event's\n * `userData.query` bag — exactly where the v1 ingestion's `extractUtmParams`/attribution\n * upgrade logic already looks. Pushed once; never re-sent.\n * - Failures are swallowed (console.warn) — tracking must never break a funnel.\n */\nimport type { Tracker } from './tracking'\nimport type { Acquisition } from '../state/context'\nimport { createConsoleTracker, exposurePayload } from './tracking'\n\n/** The string-valued, non-empty click-ids — the only kind either attribution shape carries. */\nfunction validClickIds(acq: Acquisition): [string, string][] {\n return Object.entries(acq.clickIds ?? {}).filter(\n (e): e is [string, string] => typeof e[1] === 'string' && e[1] !== '',\n )\n}\n\nexport interface PlatformTrackingConfig {\n /** Public API origin, e.g. `https://api.appfunnel.net` (no trailing slash). */\n apiBase: string\n /** Campaign DB id (the ingestion route key). */\n campaignId: string\n /** WebFunnel DB id (NOT the funnel.ts config id). */\n funnelId: string\n /** Verified bare visitor id (phase-1 §1.2), SSR-injected. */\n visitorId?: string | null\n /** Server-resolved session id (renderer looked it up by visitorId for hydration) — a fallback\n * seed; a per-tab sessionStorage id wins over it (v1 tab semantics). */\n sessionId?: string | null\n /** FUNNEL-split experiment assignment (phase-4): the renderer picked this funnel for the\n * visitor — the tracker emits the experiment.exposure (page-level exposures come from the\n * flow runtime instead). Deduped per (session, experiment) in analytics. */\n experiment?: { id: string; variant: string; version?: number }\n mode?: 'test' | 'live'\n}\n\nfunction acquisitionQueryBag(acq: Acquisition): Record<string, string> {\n const q: Record<string, string> = {}\n const utm = acq.utm ?? {}\n for (const [k, v] of Object.entries({\n utm_source: utm.source, utm_medium: utm.medium, utm_campaign: utm.campaign,\n utm_term: utm.term, utm_content: utm.content,\n })) if (v) q[k] = v\n for (const [k, v] of validClickIds(acq)) q[k] = v\n if (acq.cookies?.fbp) q._fbp = acq.cookies.fbp\n if (acq.cookies?.fbc) q._fbc = acq.cookies.fbc\n return q\n}\n\n/**\n * The `adAttribution` body field in v1's EXACT shape (admin collectAdAttribution): click-ids by\n * their param names + `fbp`/`fbc`/`ttp` cookie values, with `fbc` synthesized from `fbclid` when\n * the cookie is absent (`fb.1.<ts>.<fbclid>` — Meta's documented format). Ingestion's existing\n * first-write-wins merge + traffic-source upgrade + typed-column extraction (phase-1 §1.3) all\n * key on these names — reusing the battle-tested path instead of forking it.\n */\nfunction acquisitionAdAttribution(acq: Acquisition): Record<string, string> {\n const a: Record<string, string> = {}\n for (const [k, v] of validClickIds(acq)) a[k] = v\n if (acq.cookies?.fbp) a.fbp = acq.cookies.fbp\n if (acq.cookies?.fbc) a.fbc = acq.cookies.fbc\n else if (acq.clickIds?.fbclid) a.fbc = `fb.1.${Date.now()}.${acq.clickIds.fbclid}`\n return a\n}\n\nexport function createPlatformTracker(cfg: PlatformTrackingConfig): Tracker {\n // Never on the server; never for test mode (preview/QA stays out of shared analytics).\n if (typeof window === 'undefined' || cfg.mode === 'test') return createConsoleTracker()\n\n const base = cfg.apiBase.replace(/\\/+$/, '')\n const url = `${base}/campaign/${encodeURIComponent(cfg.campaignId)}/event`\n const sidKey = `af_sid:${cfg.campaignId}`\n let sessionId: string | null = null\n try { sessionId = window.sessionStorage.getItem(sidKey) } catch { /* storage may be blocked */ }\n if (!sessionId && cfg.sessionId) sessionId = cfg.sessionId // server-resolved (visitorId) fallback\n\n let acquisition: Acquisition | null = null\n let acquisitionSent = false\n let chain: Promise<void> = Promise.resolve()\n\n const send = async (event: string, data?: Record<string, unknown>, userData?: Record<string, unknown>) => {\n let mergedUserData = userData\n let adAttribution: Record<string, string> | undefined\n // Acquisition (click-ids/UTMs) is the ONLY carrier of paid-attribution for v2 and rides the\n // FIRST event. `attachingAcquisition` marks that THIS send is carrying it — we only burn the\n // once-flag on SUCCESS (below), so a dropped first POST re-attaches on the next event instead\n // of reporting a paid session as direct (adversarial review P2).\n let attachingAcquisition = false\n if (acquisition && !acquisitionSent) {\n attachingAcquisition = true\n const query = acquisitionQueryBag(acquisition)\n mergedUserData = Object.keys(query).length ? { ...userData, query } : userData\n const ad = acquisitionAdAttribution(acquisition)\n if (Object.keys(ad).length) adAttribution = ad\n }\n const body = {\n campaignId: cfg.campaignId,\n funnelId: cfg.funnelId,\n event,\n sessionId: sessionId ?? undefined,\n visitorId: cfg.visitorId ?? undefined,\n eventId: typeof data?.eventId === 'string' ? (data.eventId as string) : undefined,\n data: data ?? {},\n metadata: {\n language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n screen: typeof window.screen !== 'undefined' ? `${window.screen.width}x${window.screen.height}` : undefined,\n timezone: (() => { try { return Intl.DateTimeFormat().resolvedOptions().timeZone } catch { return undefined } })(),\n referrer: typeof document !== 'undefined' && document.referrer ? document.referrer : undefined,\n },\n ...(mergedUserData ? { userData: mergedUserData } : {}),\n ...(adAttribution ? { adAttribution } : {}),\n }\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n keepalive: true, // survives page.exit / unload\n })\n // Only NOW commit the once-flag — a throw above (network drop) leaves it false so the next\n // event re-carries acquisition. keepalive caps the body at ~64KB; acquisition + one event is\n // far under that (variable snapshots use the separate session-data endpoint).\n if (attachingAcquisition) acquisitionSent = true\n const json = (await res.json().catch(() => null)) as { sessionId?: string } | null\n if (json?.sessionId && json.sessionId !== sessionId) {\n sessionId = json.sessionId\n try { window.sessionStorage.setItem(sidKey, sessionId) } catch { /* best-effort */ }\n }\n }\n\n const enqueue = (event: string, data?: Record<string, unknown>, userData?: Record<string, unknown>) => {\n const task = () =>\n send(event, data, userData).catch((e) => {\n if (process.env.NODE_ENV !== 'production') console.warn(`[appfunnel] track failed (${event}):`, e)\n })\n if (!sessionId) {\n // Serialize until the first response resolves the session — later events ride the chain.\n chain = chain.then(task)\n } else {\n void task()\n }\n }\n\n // ── Variable persistence (phase-1 §1.1: the server-backed namespace store) ──\n // Every namespace write pushes the FULL flat snapshot ({'user.email', 'responses.goal', …});\n // we debounce trailing-edge and POST the latest snapshot to the v1 session-data endpoint\n // (the API merges it into session.data and runs the normalizer's v2 extraction). Needs a\n // session — before one resolves, the flush rides the send chain. Flushed on pagehide.\n const VARS_DEBOUNCE_MS = 800\n let pendingVars: Record<string, unknown> | null = null\n let varsTimer: ReturnType<typeof setTimeout> | null = null\n\n const flushVars = () => {\n if (varsTimer) { clearTimeout(varsTimer); varsTimer = null }\n if (!pendingVars) return\n const doPost = () => {\n if (!pendingVars || !sessionId) return\n const userData = pendingVars\n pendingVars = null\n void fetch(`${base}/campaign/${encodeURIComponent(cfg.campaignId)}/event/session/data`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sessionId, userData }),\n keepalive: true,\n }).catch((e) => {\n if (process.env.NODE_ENV !== 'production') console.warn('[appfunnel] variable persist failed:', e)\n })\n }\n if (sessionId) doPost()\n else chain = chain.then(doPost) // wait for the first event to establish the session\n }\n\n try {\n window.addEventListener('pagehide', flushVars)\n } catch { /* non-browser-ish environments */ }\n\n // FUNNEL-split exposure: the renderer made the assignment server-side; record it once per\n // page load (analytics dedupes by session+experiment) so the split's arms are measurable.\n if (cfg.experiment?.id && cfg.experiment.variant) {\n enqueue('experiment.exposure', exposurePayload(cfg.experiment.id, cfg.experiment.variant, cfg.experiment.version))\n }\n\n return {\n track: (event: string, data?: Record<string, unknown>, userData?: Record<string, unknown>) =>\n enqueue(event, data, userData),\n identify: (email: string, eventId?: string) =>\n enqueue('user.registered', { email, ...(eventId ? { eventId } : {}) }),\n setVariables: (variables: Record<string, unknown>) => {\n pendingVars = variables // full snapshot — latest wins\n if (varsTimer) clearTimeout(varsTimer)\n varsTimer = setTimeout(flushVars, VARS_DEBOUNCE_MS)\n },\n setAcquisition: (acq: Acquisition) => { acquisition = acq },\n }\n}\n","/**\n * The **mount contract** — `mount.tsx` is THE v2 convention for a funnel build.\n *\n * Every published funnel ships a `mount.tsx` that exports exactly two things\n * (the {@link MountModule} shape):\n *\n * - `pages: RuntimePage[]` — the code-split page list in file order (the\n * admin editor rewrites this array; the anchor\n * `export const pages: RuntimePage[] = [` must survive verbatim);\n * - `tree: (opts: MountOpts) => ReactNode` — built with\n * {@link createFunnelTree}, consumed identically by the server entry (SSR)\n * and the client entry (hydration) so both render the same tree.\n *\n * `createFunnelTree` packages the canonical provider stack so funnel builds\n * don't hand-roll it:\n *\n * AssetsProvider → FunnelProvider{config, products, locale, mode}\n * → FunnelView{pages, layout, initialKey, prefetch:'off'}\n *\n * (`prefetch: 'off'` because the renderer owns chunk warming via\n * `<link rel=\"modulepreload\">` over `useNavigation().nextCandidates`.)\n */\n\nimport {\n createContext,\n createElement,\n Fragment,\n useContext,\n type ComponentType,\n type ReactNode,\n} from 'react'\nimport { FunnelProvider } from '../state/namespaces'\nimport { FunnelView, type RuntimePage } from './flow'\nimport type { FunnelDefinition } from './spine'\nimport type { ProductInput } from '../commerce/money'\nimport { CheckoutResume, type CheckoutDriver, type CheckoutDriverContext } from '../commerce/checkout'\nimport type { RuntimeExperiment } from './experiments'\nimport { createPlatformTracker } from '../tracking/platformTracker'\n\n// ── Assets ───────────────────────────────────────────────\n\n/**\n * Funnel asset map: logical name (e.g. `logo.svg`) → content-addressed CDN URL,\n * injected by the renderer. Assets live in a SHARED content-addressed store\n * (`appfunnel/assets/<hash>`), so identical content is stored once across all\n * builds and funnels while staying immutable. Both SSR and client read the same\n * injected map → URLs match. Defaults to `{}` (no provider needed in tests).\n */\nexport const AssetsContext = createContext<Record<string, string>>({})\n\n/** Provides the funnel's asset map (mounted for you by {@link createFunnelTree}). */\nexport function AssetsProvider({\n assets,\n children,\n}: {\n assets?: Record<string, string>\n children: ReactNode\n}): ReactNode {\n return createElement(AssetsContext.Provider, { value: assets ?? {} }, children)\n}\n\n/** The whole asset map (logical name → CDN URL). `{}` outside a provider. */\nexport function useAssets(): Record<string, string> {\n return useContext(AssetsContext)\n}\n\n/** `useAsset('logo.svg')` — one asset's CDN URL, or `undefined` if not injected. */\nexport function useAsset(name: string): string | undefined {\n return useContext(AssetsContext)[name]\n}\n\n// ── Mount options ────────────────────────────────────────\n\n/** What the renderer injects when mounting a funnel build (SSR and hydration). */\nexport interface MountOpts {\n /** Platform-resolved product prices (one currency per visitor). */\n products?: ProductInput[]\n /** Explicit locale override (URL/param/geo); wins over the detected device locale. */\n locale?: string\n mode?: 'test' | 'live'\n /** Deep-link / reload entry page (honored only if its entry guard passes). */\n initialKey?: string\n /** Asset map: logical name → content-addressed CDN URL. */\n assets?: Record<string, string>\n /** The SIGNED anonymous visitor id (bare id, verified server-side; phase-1 §1.2) — the\n * renderer mints/reads the `af_vid` cookie and injects the value here. Feeds\n * `context.identity.visitorId` (experiment bucketing fallback seed, session continuity). */\n visitorId?: string | null\n /** Known customer id (identified visitor) — the preferred bucketing seed. */\n customerId?: string | null\n /** Platform tracking config (phase-1 §1.4). Present → `createFunnelTree` wires the real\n * platform tracker (events POST to the shared ingestion endpoint). Absent (preview, tests,\n * bare mounts) → the console tracker. Serializable on purpose — it crosses the sealed-build\n * boundary as data. */\n tracking?: {\n apiBase: string\n campaignId: string\n /** WebFunnel DB id (NOT the funnel.ts config id). */\n funnelId: string\n /** FUNNEL-split assignment (phase-4) — the tracker emits its exposure event. */\n experiment?: { id: string; variant: string; version?: number }\n }\n /** Server-hydrated namespace snapshot (phase-1 §1.1): flat namespaced keys\n * (`user.email`, `responses.goal`, …) from the visitor's latest session — the renderer\n * resolves it by visitorId so a returning visitor resumes with their answers. */\n sessionValues?: Record<string, string | number | boolean | null | string[]>\n /** RUNNING page-experiment records (phase-4): platform-owned wiring over the bundle's\n * `@variant` pages, injected at render time — no rebuild to start/stop/reweight. */\n experiments?: RuntimeExperiment[]\n /** The server-resolved session id backing `sessionValues` — seeds the tracker (fallback)\n * and `context.session.id`. */\n sessionId?: string | null\n}\n\n/**\n * The shape a funnel build's `mount.tsx` module must export — the named,\n * versioned contract between a build and the renderer/editor:\n * `import type { MountModule } from '@appfunnel-dev/sdk'`.\n */\nexport type MountModule = {\n pages: RuntimePage[]\n tree: (opts: MountOpts) => ReactNode\n}\n\n// ── createFunnelTree ─────────────────────────────────────\n\nexport interface CreateFunnelTreeInput {\n /** The funnel's spine (`defineFunnel(...)`). */\n config: FunnelDefinition\n /** Code-split pages in file order (the same array `mount.tsx` exports). */\n pages: RuntimePage[]\n /** Persistent chrome wrapped around the page area (mounted once). */\n layout?: ComponentType<{ children: ReactNode }>\n /**\n * The platform checkout driver factory — `mount.tsx` imports it from a driver\n * subpath entry (`import { stripeCheckoutDriver } from '@appfunnel-dev/sdk/driver-stripe'`)\n * and passes it here, so the provider choice stays in the SDK-owned authoring\n * contract while the ctx (apiBase/campaign/funnel/mode/identity) stays\n * renderer-injected. Called once per `tree()` mount, only when tracking config\n * is present — without it there is no API to charge against (preview, tests,\n * bare mounts) and the mock driver fallback stays in place. Test mode still\n * constructs the real driver: the wire contract carries `mode`, and the server\n * resolves the provider's TEST store from it (that's the quarantine, not the client).\n */\n checkoutDriver?: (ctx: CheckoutDriverContext) => CheckoutDriver\n}\n\n/**\n * Build a funnel's `tree(opts)` — the standard provider stack over your pages.\n *\n * ```tsx\n * export const pages: RuntimePage[] = [ ... ]\n * export const tree = createFunnelTree({ config, pages, layout: Layout })\n * ```\n */\nexport function createFunnelTree({\n config,\n pages,\n layout,\n checkoutDriver,\n}: CreateFunnelTreeInput): (opts: MountOpts) => ReactNode {\n return function tree(opts: MountOpts): ReactNode {\n const mode = opts.mode ?? 'live'\n // The real platform tracker when the renderer passed tracking config (live only — the\n // factory itself no-ops for SSR and test mode). One instance per tree() call: the entries\n // call tree() exactly once per mount (SSR render / hydration), so no memo hook is needed\n // and tree() stays callable outside React.\n const tracker = opts.tracking\n ? createPlatformTracker({\n ...opts.tracking,\n visitorId: opts.visitorId,\n sessionId: opts.sessionId,\n mode,\n })\n : undefined\n // The platform checkout driver when mount.tsx exported a factory AND the renderer passed\n // tracking config — the driver ctx derives from the SAME injected data the tracker uses,\n // so there is no second config channel. Unlike the tracker (whose factory no-ops on the\n // server), the driver IS constructed during SSR, deliberately: factories are\n // construction-safe closures over serializable ctx (provider SDKs load only in\n // effects/event handlers), and a driver's renderInline returns the same stable placeholder\n // on the server and the first client paint. Skipping construction server-side would SSR\n // the mock fallback's <button> into inline surfaces — a guaranteed hydration mismatch.\n const checkout = checkoutDriver && opts.tracking\n ? checkoutDriver({\n apiBase: opts.tracking.apiBase,\n campaignId: opts.tracking.campaignId,\n funnelId: opts.tracking.funnelId,\n mode,\n sessionId: opts.sessionId,\n visitorId: opts.visitorId,\n })\n : undefined\n // The redirect-return resume leg (hosted-checkout success URLs carry\n // `?af_checkout={correlationId}`) rides the persistent layout slot: it needs\n // tracker + navigation, which only exist INSIDE FunnelView's nav context, and\n // the layout is the one mount-once spot there. SSR-safe (renders null;\n // effect-only) and inert without the param.\n const layoutWithResume: ComponentType<{ children: ReactNode }> = function LayoutWithCheckoutResume({\n children,\n }: {\n children: ReactNode\n }): ReactNode {\n return createElement(\n Fragment,\n null,\n createElement(CheckoutResume, null),\n layout ? createElement(layout, null, children) : children,\n )\n }\n return createElement(AssetsProvider, {\n assets: opts.assets,\n children: createElement(FunnelProvider, {\n config,\n products: opts.products ?? [],\n locale: opts.locale,\n tracker,\n checkout,\n sessionValues: opts.sessionValues,\n experiments: opts.experiments,\n context: {\n mode,\n visitorId: opts.visitorId ?? null,\n customerId: opts.customerId ?? null,\n sessionId: opts.sessionId ?? null,\n },\n children: createElement(FunnelView, {\n pages,\n layout: layoutWithResume,\n initialKey: opts.initialKey,\n prefetch: 'off', // renderer background-modulepreloads all chunks\n }),\n }),\n })\n }\n}\n","import {\n createElement,\n type ButtonHTMLAttributes,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react'\nimport { useField } from '../state/namespaces'\nimport { useNavigation } from './flow'\n\n/**\n * The two-tier component model (doc 07 §\"magic ≠ black box\"): the magic lives in\n * headless hooks (`useField`, `useNavigation`); these styleable components are\n * thin, restyle-able wrappers over them. Every `<Choice>` reduces to `useField`\n * + your own JSX — eject any time. They pass `className`/DOM props straight\n * through and never dictate a pixel beyond the minimum.\n */\n\nexport interface ChoiceOption {\n value: string\n label?: ReactNode\n}\n\nexport interface ChoiceProps {\n /** Writable namespaced path to bind, e.g. `responses.goal`. */\n bind: string\n /** The selectable options (a bare string is shorthand for `{value, label}`). */\n options: (string | ChoiceOption)[]\n /** Class applied to each option button. */\n className?: string\n /** Class applied to the selected option button (in addition to `className`). */\n selectedClassName?: string\n /** Advance navigation after a choice (handy for single-tap question pages). */\n advanceOnSelect?: boolean\n}\n\n/**\n * Single-select bound to a writable field. `<Choice bind=\"responses.goal\"\n * options={[\"lose\", \"gain\"]} />` — selecting persists + (later) tracks; pass\n * `advanceOnSelect` to move to the next page on tap.\n */\nexport function Choice({\n bind,\n options,\n className,\n selectedClassName,\n advanceOnSelect,\n}: ChoiceProps): ReactNode {\n const { value, set } = useField(bind)\n const nav = useNavigation()\n\n return options.map((opt) => {\n const o: ChoiceOption = typeof opt === 'string' ? { value: opt } : opt\n const selected = value === o.value\n return createElement(\n 'button',\n {\n key: o.value,\n type: 'button',\n 'aria-pressed': selected,\n 'data-selected': selected || undefined,\n className: selected && selectedClassName ? `${className ?? ''} ${selectedClassName}`.trim() : className,\n onClick: () => {\n set(o.value)\n if (advanceOnSelect) nav.next()\n },\n },\n o.label ?? o.value,\n )\n })\n}\n\nexport interface NextProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n children?: ReactNode\n}\n\n/** A button that advances the funnel (the current page's `next`, else linear). */\nexport function Next({ children, onClick, ...rest }: NextProps): ReactNode {\n const { next } = useNavigation()\n return createElement(\n 'button',\n {\n type: 'button',\n ...rest,\n onClick: (e: ReactMouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (!e.defaultPrevented) next()\n },\n },\n children ?? 'Continue',\n )\n}\n\nexport interface BackProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n children?: ReactNode\n}\n\n/** A button that returns to the previous page; hidden when there's no history. */\nexport function Back({ children, onClick, ...rest }: BackProps): ReactNode {\n const { back, canGoBack } = useNavigation()\n if (!canGoBack) return null\n return createElement(\n 'button',\n {\n type: 'button',\n ...rest,\n onClick: (e: ReactMouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (!e.defaultPrevented) back()\n },\n },\n children ?? 'Back',\n )\n}\n","/**\n * The **event catalog** — the single source of truth for *which* events exist and\n * how each is routed (analytics vs. integrations vs. runtime-only). Pairs with the\n * typed payloads in {@link ./tracking}.`FunnelEventDataMap`.\n *\n * This replaces the duplication the monorepo flags (`shared/events/catalog.ts` is\n * \"documentation, not imported\" — the taxonomy is re-declared in\n * `admin/lib/funnel/tracking.ts`, each `admin/lib/integrations/*` EVENT_MAP, and\n * `api/src/integrations/constants`). In v2 the **SDK owns the taxonomy** (it emits\n * it), so the bus, the pixel loaders, and the platform all import *this*.\n */\n\nexport type EventSource = 'frontend' | 'backend'\n\nexport interface EventMeta {\n /** Where the event originates. `backend` = the server emits it (e.g. a settled charge). */\n sources: EventSource[]\n /** Persisted to analytics. */\n tracking: boolean\n /** Forwarded to ad/integration pixels (Meta/GTM/TikTok/…). */\n integrations: boolean\n /** Runtime-only JS subscription — not persisted, not sent to integrations. */\n runtime?: boolean\n}\n\n/**\n * Every event the system knows, with its routing metadata. Keys are the taxonomy\n * names (a superset of `FunnelEventDataMap`: it also lists the **backend-originated**\n * monetary events the platform pushes to the client bus for pixel firing).\n */\nexport const EVENT_CATALOG = {\n // ── Runtime / navigation (JS subscriptions; not persisted) ──\n 'funnel.start': { sources: ['frontend'], tracking: false, integrations: false, runtime: true },\n 'experiment.exposure': { sources: ['frontend'], tracking: true, integrations: false },\n\n // ── Frontend, tracked; some also go to pixels ──\n 'page.view': { sources: ['frontend'], tracking: true, integrations: true },\n 'page.exit': { sources: ['frontend'], tracking: true, integrations: false },\n 'user.registered': { sources: ['frontend'], tracking: true, integrations: true },\n 'checkout.start': { sources: ['frontend'], tracking: true, integrations: true },\n 'checkout.payment_added': { sources: ['frontend'], tracking: true, integrations: true },\n 'checkout.failed': { sources: ['frontend'], tracking: true, integrations: false },\n\n // ── Backend-originated money events (server mints the eventId; client fires the pixel) ──\n 'purchase.complete': { sources: ['backend'], tracking: true, integrations: true },\n 'customer.first_purchase': { sources: ['backend'], tracking: true, integrations: true },\n 'subscription.created': { sources: ['backend'], tracking: true, integrations: true },\n 'subscription.renewal': { sources: ['backend'], tracking: true, integrations: true },\n} as const satisfies Record<string, EventMeta>\n\n/** A catalog event name. */\nexport type CatalogEvent = keyof typeof EVENT_CATALOG\n\n/** True if the event is persisted to analytics. */\nexport function isTrackableEvent(name: string): boolean {\n return EVENT_CATALOG[name as CatalogEvent]?.tracking ?? false\n}\n\n/** True if the event is forwarded to ad/integration pixels. */\nexport function isIntegrationEvent(name: string): boolean {\n return EVENT_CATALOG[name as CatalogEvent]?.integrations ?? false\n}\n\n/** The events that feed integrations — the set a pixel loader subscribes to. */\nexport function integrationEvents(): CatalogEvent[] {\n return (Object.keys(EVENT_CATALOG) as CatalogEvent[]).filter((e) => EVENT_CATALOG[e].integrations)\n}\n","/**\n * `<Script>` — the **declared third-party embed** primitive (phase-2 §2.3d).\n *\n * The controlled escape hatch for runtime widgets/embeds that genuinely need\n * client code — Intercom, Trustpilot, a calendar embed, an operator pixel. Unlike\n * arbitrary `<script>` injection, it's **declared** (the funnel author writes\n * `<Script src=…/>`), **deduped** (injected at most once per id/src, even across\n * page navigation in the SPA — a chat widget must not reload on every page), and\n * **CSP-friendly** (accepts a `nonce`).\n *\n * CSP enforcement itself is the **renderer's** job: it scans the funnel's declared\n * `<Script src>`s (build-time) into the `script-src` allowlist and supplies the\n * `nonce`. This component just injects the tag at the right time.\n *\n * For *analytics* pixels, prefer subscribing to the `window.appfunnel` bus\n * ({@link ../tracking/bus}) — `<Script>` is for non-analytics third-party widgets\n * (and the pixel loader snippets, which then subscribe to the bus).\n */\n\nimport { useEffect } from 'react'\n\n/** Module-level registry so a given script injects once for the app's lifetime. */\nconst injected = new Set<string>()\n\nexport interface ScriptProps {\n /** The third-party script URL. */\n src: string\n /**\n * When to inject. `afterInteractive` (default) injects on mount (after hydration);\n * `lazyOnload` waits for idle/`load` so it never competes with the funnel's own JS.\n */\n strategy?: 'afterInteractive' | 'lazyOnload'\n /** Dedup key (defaults to `src`) — the script injects at most once per id. */\n id?: string\n /** Defaults to `true`. */\n async?: boolean\n defer?: boolean\n /** CSP nonce — supplied by the renderer. */\n nonce?: string\n /** Extra attributes (e.g. `data-*`). */\n attributes?: Record<string, string>\n onLoad?: () => void\n onError?: () => void\n}\n\n/**\n * Injects a third-party script once. Renders nothing. Persists across navigation\n * (the tag is never removed on unmount — third-party widgets should stay loaded).\n */\nexport function Script({\n src,\n strategy = 'afterInteractive',\n id,\n async = true,\n defer,\n nonce,\n attributes,\n onLoad,\n onError,\n}: ScriptProps): null {\n useEffect(() => {\n if (typeof document === 'undefined') return\n const key = id ?? src\n if (injected.has(key)) {\n onLoad?.() // already present from an earlier mount\n return\n }\n\n const inject = () => {\n if (injected.has(key)) return\n injected.add(key)\n const el = document.createElement('script')\n el.src = src\n if (id) el.id = id\n if (async) el.async = true\n if (defer) el.defer = true\n if (nonce) el.nonce = nonce\n if (attributes) for (const [k, v] of Object.entries(attributes)) el.setAttribute(k, v)\n el.addEventListener('load', () => onLoad?.())\n el.addEventListener('error', () => {\n injected.delete(key) // allow a later retry\n onError?.()\n })\n document.head.appendChild(el)\n }\n\n if (strategy === 'lazyOnload') {\n const ric = (window as unknown as { requestIdleCallback?: (cb: () => void) => number })\n .requestIdleCallback\n if (ric) {\n ric(inject)\n } else {\n const t = setTimeout(inject, 0)\n return () => clearTimeout(t)\n }\n return\n }\n inject()\n // src/id identify the script; injection is idempotent via the registry.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src, id])\n\n return null\n}\n\n/** Internal: clear the injected-script registry (tests only). */\nexport function __resetScriptRegistry(): void {\n injected.clear()\n}\n"]}