@officexapp/catalogs-cli 0.4.8 → 0.4.10

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/CatalogRenderer.tsx","../../shared/engine/conditions.ts","../../shared/engine/routing.ts","../../shared/engine/validate.ts","../src/engine/popupTriggers.ts","../src/PageRenderer.tsx","../src/inputs/index.tsx","../src/display/index.tsx","../src/Cart.tsx","../src/CheckoutPage.tsx","../src/StickyBottomBar.tsx","../src/Popup.tsx","../src/ElementInspector.tsx"],"sourcesContent":["import React, { useState, useCallback, useMemo, useEffect, useRef } from \"react\";\nimport { CatalogSchema, CatalogVariant, FormState, TracerContext, PageAction, ProgressStep, CartItem, StickyBarConfig, QuizScores, QuizAnswer, QuizConfig, PopupConfig, TopBarConfig, VideoState, VideoComponentState } from \"@shared/types\";\nimport { evaluateConditionGroup } from \"@shared/engine/conditions\";\nimport { getNextPage, getProgress } from \"@shared/engine/routing\";\nimport { validatePage } from \"@shared/engine/validate\";\nimport type { ValidationError } from \"@shared/engine/validate\";\nimport { setupTrigger, isInCooldown, setCooldown, checkVideoTrigger, TriggerCleanup } from \"./engine/popupTriggers\";\nimport { PageRenderer } from \"./PageRenderer\";\nimport { CartButton, CartDrawer } from \"./Cart\";\nimport { CheckoutPage } from \"./CheckoutPage\";\nimport { StickyBottomBar } from \"./StickyBottomBar\";\nimport { Popup } from \"./Popup\";\nimport { ElementInspector, InspectorContext } from \"./ElementInspector\";\nimport type { RendererServices, TrackEventPayload } from \"./types\";\n\ninterface CatalogRendererProps {\n catalog: CatalogSchema;\n variantSlug?: string | null;\n userId?: string | null;\n trackingEnabled?: boolean;\n /** If set, this catalog is a sandbox clone of the given parent catalog ID */\n sandboxOf?: string | null;\n /** AI-resolved prefill values from hint routing */\n aiPrefill?: Record<string, string> | null;\n /** Injectable services for tracking, API base URL, and dev callbacks */\n services?: RendererServices;\n}\n\nfunction generateTracerId(): string {\n return \"tr_\" + Math.random().toString(36).substring(2, 15) + Date.now().toString(36);\n}\n\nfunction getOverlayStyle(overlay?: \"dark\" | \"light\" | \"none\" | number | string): React.CSSProperties | undefined {\n if (overlay === \"none\") return { background: \"none\" };\n if (overlay === \"light\") return { background: \"linear-gradient(180deg, rgba(255,255,255,0.4) 0%, rgba(255,255,255,0.6) 50%, rgba(255,255,255,0.75) 100%)\" };\n if (typeof overlay === \"number\") {\n const o = Math.max(0, Math.min(1, overlay));\n return { background: `rgba(0,0,0,${o})` };\n }\n if (typeof overlay === \"string\" && overlay !== \"dark\") {\n return { background: overlay };\n }\n // \"dark\" or undefined — use the default CSS class styles\n return undefined;\n}\n\nfunction getUrlParams(): Record<string, string> {\n const params: Record<string, string> = {};\n new URLSearchParams(window.location.search).forEach((v, k) => {\n params[k] = v;\n });\n return params;\n}\n\n// --- Variant Resolution ---\nfunction resolveVariant(catalog: CatalogSchema, variantSlug?: string | null): CatalogVariant | null {\n if (!catalog.variants?.length) return null;\n if (!variantSlug) return null;\n return catalog.variants.find((v) => v.slug === variantSlug || v.id === variantSlug) || null;\n}\n\n// --- Build hints from variant + catalog defaults ---\nfunction resolveHints(catalog: CatalogSchema, variant: CatalogVariant | null): Record<string, string> {\n const hints: Record<string, string> = {};\n if (catalog.hints) {\n for (const [key, def] of Object.entries(catalog.hints)) {\n if (def.default) hints[key] = def.default;\n }\n }\n if (variant?.hints) {\n Object.assign(hints, variant.hints);\n }\n return hints;\n}\n\n// --- Resolve __variants on component props ---\nfunction resolveComponentVariants(\n props: Record<string, any>,\n hints: Record<string, string>\n): Record<string, any> {\n const resolved = { ...props };\n const variantKeys = Object.keys(props).filter((k) => k.endsWith(\"__variants\"));\n\n for (const variantKey of variantKeys) {\n const baseProp = variantKey.replace(\"__variants\", \"\");\n const variants: Record<string, any> = props[variantKey];\n if (!variants || typeof variants !== \"object\") continue;\n\n let bestMatch: { value: any; score: number } | null = null;\n\n for (const [conditionStr, value] of Object.entries(variants)) {\n const conditions = conditionStr.split(\",\").map((c) => c.trim());\n let allMatch = true;\n let score = 0;\n\n for (const cond of conditions) {\n const [hintKey, hintValue] = cond.split(\"=\");\n if (hints[hintKey] === hintValue) {\n score++;\n } else {\n allMatch = false;\n break;\n }\n }\n\n if (allMatch && score > 0 && (!bestMatch || score > bestMatch.score)) {\n bestMatch = { value, score };\n }\n }\n\n if (bestMatch) {\n resolved[baseProp] = bestMatch.value;\n }\n delete resolved[variantKey];\n }\n\n return resolved;\n}\n\n// --- Apply hint variants across all pages ---\nfunction applyHintVariants(catalog: CatalogSchema, hints: Record<string, string>): CatalogSchema {\n if (Object.keys(hints).length === 0) return catalog;\n\n const pages = JSON.parse(JSON.stringify(catalog.pages));\n\n for (const page of Object.values(pages) as any[]) {\n for (const comp of page.components) {\n comp.props = resolveComponentVariants(comp.props, hints);\n }\n if (page.actions) {\n for (const action of page.actions) {\n const resolved = resolveComponentVariants(action, hints);\n Object.assign(action, resolved);\n }\n }\n }\n\n return { ...catalog, pages };\n}\n\n// --- Apply personalization rules ---\nfunction applyPersonalization(catalog: CatalogSchema, context: TracerContext): CatalogSchema {\n if (!catalog.personalization?.rules.length) return catalog;\n\n const pages = JSON.parse(JSON.stringify(catalog.pages));\n\n for (const rule of catalog.personalization.rules) {\n let match = true;\n if (rule.conditions) {\n const { match: matchType, rules: condRules } = rule.conditions;\n const results = condRules.map((r) => {\n if (\"match\" in r) return true;\n const source = r.source || \"field\";\n let actual: any;\n if (source === \"url_param\") actual = context.url_params[r.param || \"\"];\n else if (source === \"hint\") actual = context.hints[r.param || \"\"];\n else return true;\n if (r.operator === \"equals\") return actual === r.value;\n if (r.operator === \"not_equals\") return actual !== r.value;\n return true;\n });\n match = matchType === \"all\" ? results.every(Boolean) : results.some(Boolean);\n }\n\n if (match) {\n for (const page of Object.values(pages)) {\n const comp = (page as any).components.find((c: any) => c.id === rule.target);\n if (comp) {\n comp.props[rule.prop] = rule.value;\n }\n }\n }\n }\n\n return { ...catalog, pages };\n}\n\n// --- Resume Modal ---\n\nfunction ResumeModal({ themeColor, onResume, onStartOver }: {\n themeColor: string;\n onResume: () => void;\n onStartOver: () => void;\n}) {\n return (\n <div className=\"cf-modal-backdrop fixed inset-0 z-[100] flex items-center justify-center bg-black/40 backdrop-blur-md\">\n <div className=\"cf-modal-card bg-white rounded-3xl shadow-2xl max-w-sm w-full mx-4 p-8 space-y-6\">\n <div className=\"text-center space-y-3\">\n <div className=\"w-14 h-14 rounded-2xl mx-auto flex items-center justify-center\" style={{ backgroundColor: `${themeColor}12` }}>\n <svg className=\"w-7 h-7\" style={{ color: themeColor }} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n <h3 className=\"text-xl font-bold text-gray-900\" style={{ fontFamily: 'var(--font-display)' }}>Welcome back!</h3>\n <p className=\"text-sm text-gray-500 leading-relaxed\">\n Looks like you have a session in progress.<br />Pick up where you left off?\n </p>\n </div>\n <div className=\"flex gap-3\">\n <button\n onClick={onResume}\n className=\"cf-btn-primary flex-1 text-sm\"\n style={{ backgroundColor: themeColor }}\n >\n Resume\n </button>\n <button\n onClick={onStartOver}\n className=\"flex-1 px-4 py-3 rounded-xl border-1.5 border-gray-200 text-gray-600 font-semibold text-sm transition-all hover:bg-gray-50 hover:border-gray-300\"\n style={{ fontFamily: 'var(--font-display)' }}\n >\n Start Over\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// --- Stepper Component ---\n\nfunction Stepper({ steps, currentPageId, themeColor }: { steps: ProgressStep[], currentPageId: string, themeColor: string }) {\n const currentStepIndex = steps.findIndex(s => s.pages.includes(currentPageId));\n\n return (\n <div className=\"flex items-center justify-center gap-0\" style={{ fontFamily: 'var(--font-display)' }}>\n {steps.map((step, i) => {\n const isActive = i === currentStepIndex;\n const isComplete = i < currentStepIndex;\n\n return (\n <React.Fragment key={step.id}>\n {i > 0 && (\n <div\n className=\"w-10 sm:w-16 h-0.5 rounded-full transition-all duration-500\"\n style={{ backgroundColor: isComplete ? themeColor : '#e8e9ee' }}\n />\n )}\n <div className=\"flex items-center gap-1.5\">\n <div\n className=\"w-7 h-7 rounded-full flex items-center justify-center transition-all duration-300\"\n style={{\n backgroundColor: isActive || isComplete ? themeColor : '#f0f1f5',\n boxShadow: isActive ? `0 0 0 4px ${themeColor}20` : 'none',\n }}\n >\n {isComplete ? (\n <svg className=\"w-3.5 h-3.5 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : isActive ? (\n <div className=\"w-2 h-2 rounded-full bg-white\" />\n ) : (\n <div className=\"w-2 h-2 rounded-full bg-gray-300\" />\n )}\n </div>\n <span\n className={`text-[11px] font-bold tracking-wider uppercase transition-colors duration-300 ${\n isActive || isComplete ? '' : 'text-gray-400'\n }`}\n style={{ color: isActive || isComplete ? themeColor : undefined }}\n >\n {step.label}\n </span>\n </div>\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n\nfunction Countdown({ targetDate, label, expiredText, themeColor }: { targetDate: string; label?: string; expiredText?: string; themeColor: string }) {\n const getTimeLeft = useCallback(() => {\n const diff = new Date(targetDate).getTime() - Date.now();\n if (diff <= 0) return null;\n const d = Math.floor(diff / 86400000);\n const h = Math.floor((diff % 86400000) / 3600000);\n const m = Math.floor((diff % 3600000) / 60000);\n const s = Math.floor((diff % 60000) / 1000);\n return { d, h, m, s };\n }, [targetDate]);\n\n const [timeLeft, setTimeLeft] = useState(getTimeLeft);\n\n useEffect(() => {\n const timer = setInterval(() => setTimeLeft(getTimeLeft()), 1000);\n return () => clearInterval(timer);\n }, [getTimeLeft]);\n\n if (!timeLeft) {\n return <span className=\"text-xs font-semibold tracking-wide uppercase\" style={{ color: themeColor, fontFamily: 'var(--font-display)' }}>{expiredText || \"Time's up!\"}</span>;\n }\n\n const parts = [\n timeLeft.d > 0 ? `${timeLeft.d}d` : null,\n `${String(timeLeft.h).padStart(2, \"0\")}h`,\n `${String(timeLeft.m).padStart(2, \"0\")}m`,\n `${String(timeLeft.s).padStart(2, \"0\")}s`,\n ].filter(Boolean).join(\" : \");\n\n return (\n <div className=\"flex items-center gap-2\" style={{ fontFamily: 'var(--font-display)' }}>\n {label && <span className=\"text-xs font-semibold tracking-wide uppercase text-gray-500\">{label}</span>}\n <span className=\"text-sm font-bold tracking-wider tabular-nums\" style={{ color: themeColor }}>{parts}</span>\n </div>\n );\n}\n\n// Validation is now in shared/engine/validate.ts — imported as validatePage + ValidationError\n\n// --- Auto-Skip ---\n\nconst AUTO_SKIP_INPUT_TYPES = new Set([\n \"short_text\", \"long_text\", \"rich_text\", \"email\", \"phone\", \"url\",\n \"address\", \"number\", \"currency\", \"date\", \"datetime\", \"time\",\n \"date_range\", \"dropdown\", \"multiselect\", \"multiple_choice\",\n \"checkboxes\", \"picture_choice\", \"switch\", \"checkbox\",\n \"choice_matrix\", \"ranking\", \"star_rating\", \"slider\",\n \"opinion_scale\", \"file_upload\", \"signature\", \"password\", \"location\",\n]);\n\n/** Returns true if page.auto_skip is enabled and every visible input already has a value. */\nfunction shouldAutoSkipPage(\n page: CatalogSchema[\"pages\"][string],\n formState: FormState,\n context: TracerContext,\n): boolean {\n if (!page.auto_skip) return false;\n\n const visibleInputs = page.components.filter((c) => {\n if (!AUTO_SKIP_INPUT_TYPES.has(c.type)) return false;\n if (c.prefill_mode === \"hidden\" && formState[c.id] != null && formState[c.id] !== \"\") return false;\n if (c.visibility && !evaluateConditionGroup(c.visibility, formState, context)) return false;\n return true;\n });\n\n // No visible inputs → don't auto-skip (it's a display page the user should see)\n if (visibleInputs.length === 0) return false;\n\n return visibleInputs.every((c) => {\n const val = formState[c.id];\n return val != null && val !== \"\" && !(Array.isArray(val) && val.length === 0);\n });\n}\n\n// --- Quiz Scoring ---\n\nfunction isCorrectAnswer(given: any, correct: string | string[]): boolean {\n if (Array.isArray(correct)) {\n // Single-element array with a non-array given value: unwrap and compare as single answer.\n // This handles the common case where correct_answer is [\"paris\"] but the input stores \"paris\".\n if (correct.length === 1 && !Array.isArray(given)) {\n return String(given).trim().toLowerCase() === String(correct[0]).trim().toLowerCase();\n }\n // Multi-answer (checkboxes/multiselect): given must contain exactly the correct values\n if (!Array.isArray(given)) return false;\n const givenSet = new Set(given.map((v: any) => String(v).trim().toLowerCase()));\n const correctSet = new Set(correct.map((v) => String(v).trim().toLowerCase()));\n if (givenSet.size !== correctSet.size) return false;\n for (const v of correctSet) {\n if (!givenSet.has(v)) return false;\n }\n return true;\n }\n // Single-answer: if given is a single-element array, unwrap it\n if (Array.isArray(given) && given.length === 1) {\n return String(given[0]).trim().toLowerCase() === String(correct).trim().toLowerCase();\n }\n // Single-answer\n return String(given).trim().toLowerCase() === String(correct).trim().toLowerCase();\n}\n\nfunction computeQuizScores(\n catalog: CatalogSchema,\n formState: FormState\n): QuizScores {\n const answers: QuizAnswer[] = [];\n\n for (const [pageId, page] of Object.entries(catalog.pages)) {\n for (const comp of page.components) {\n const quiz: QuizConfig | undefined = comp.props?.quiz;\n if (!quiz?.correct_answer) continue;\n\n const given = formState[comp.id];\n // Only score if the user actually answered\n if (given == null || given === \"\" || (Array.isArray(given) && given.length === 0)) continue;\n\n const pointsPossible = quiz.points ?? 1;\n const correct = isCorrectAnswer(given, quiz.correct_answer);\n\n // Resolve wrong message: per-option message > general wrong_message\n let wrongMsg = quiz.wrong_message;\n if (!correct && quiz.option_messages) {\n const givenVal = Array.isArray(given) ? given : [given];\n // For single choice, use the specific option message if available\n const specificMsg = givenVal.map((v: string) => quiz.option_messages![v]).filter(Boolean);\n if (specificMsg.length > 0) wrongMsg = specificMsg.join(\" \");\n }\n\n // Extract label and options from component props for context\n const label = comp.props?.label as string | undefined;\n const rawOptions = comp.props?.options as Array<{ value: string; label: string }> | undefined;\n const options = rawOptions?.map((o) => ({ value: o.value, label: o.label }));\n\n answers.push({\n component_id: comp.id,\n page_id: pageId,\n label,\n options,\n given_answer: given,\n correct_answer: quiz.correct_answer,\n is_correct: correct,\n points_earned: correct ? pointsPossible : 0,\n points_possible: pointsPossible,\n explanation: quiz.explanation,\n wrong_message: wrongMsg,\n });\n }\n }\n\n const total = answers.reduce((sum, a) => sum + a.points_earned, 0);\n const max = answers.reduce((sum, a) => sum + a.points_possible, 0);\n\n return {\n answers,\n total,\n max,\n percent: max > 0 ? Math.round((total / max) * 100) : 0,\n correct_count: answers.filter((a) => a.is_correct).length,\n question_count: answers.length,\n };\n}\n\n// --- Sandbox Banner ---\n\nfunction SandboxBanner() {\n return (\n <div className=\"fixed top-0 left-0 right-0 z-[200] bg-amber-500 text-white text-center py-1.5 px-4 text-xs font-semibold tracking-wide shadow-md\" style={{ fontFamily: 'system-ui, sans-serif' }}>\n <span className=\"inline-flex items-center gap-1.5\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126z\" />\n </svg>\n SANDBOX — Changes here do not affect the live catalog\n </span>\n </div>\n );\n}\n\n// --- Main Component ---\n\nexport const CatalogRenderer: React.FC<CatalogRendererProps> = ({ catalog: rawCatalog, variantSlug, userId, trackingEnabled, sandboxOf, aiPrefill, services }) => {\n const urlParams = useMemo(() => getUrlParams(), []);\n const isNavigatingRef = useRef(false);\n\n // Resolve variant from path slug (hints stay private)\n const variant = useMemo(() => resolveVariant(rawCatalog, variantSlug), [rawCatalog, variantSlug]);\n const hints = useMemo(() => resolveHints(rawCatalog, variant), [rawCatalog, variant]);\n\n const context = useMemo<TracerContext>(\n () => ({\n tracer_id: generateTracerId(),\n url_params: urlParams,\n hints,\n variant_id: variant?.id,\n variant_slug: variant?.slug,\n } as TracerContext),\n [urlParams, hints, variant]\n );\n\n // Tracking helper — builds base payload and fires event via injected services\n const track = useCallback(\n (eventType: string, extra?: Record<string, unknown>) => {\n if (!trackingEnabled || !userId) return;\n const payload: TrackEventPayload = {\n event_type: eventType,\n tracer_id: context.tracer_id,\n user_id: userId,\n catalog_slug: rawCatalog.slug,\n url_params: context.url_params,\n hints: context.hints,\n variant_slug: variant?.slug,\n referrer: document.referrer || undefined,\n ...extra,\n };\n services?.tracker?.track(payload);\n },\n [trackingEnabled, userId, context, rawCatalog.slug, variant, services]\n );\n\n // Fire session_start + initial page_view on mount\n useEffect(() => {\n track(\"session_start\");\n track(\"page_view\", { page_id: rawCatalog.routing.entry });\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Apply transformations: hints first, then personalization rules\n const catalog = useMemo(() => {\n let c = applyHintVariants(rawCatalog, hints);\n c = applyPersonalization(c, context);\n // Ensure settings and theme always exist (catalogs created with minimal schemas may omit them)\n if (!c.settings) {\n c = { ...c, settings: { theme: { primary_color: \"#3B82F6\" } } };\n } else if (!c.settings.theme) {\n c = { ...c, settings: { ...c.settings, theme: { primary_color: \"#3B82F6\" } } };\n }\n return c;\n }, [rawCatalog, hints, context]);\n\n // Warn about reserved page IDs at runtime\n useEffect(() => {\n const RESERVED = [\"checkout\", \"__checkout\", \"__global\", \"submitted\", \"__submitted\"];\n for (const pid of Object.keys(catalog.pages)) {\n if (RESERVED.includes(pid) || pid.startsWith(\"__\")) {\n console.warn(\n `[CatalogKit] Page ID \"${pid}\" conflicts with a reserved internal name. ` +\n `This may cause unexpected behavior with the built-in checkout, events, or inspector. Please rename it.`\n );\n }\n }\n }, [catalog.pages]);\n\n const theme = catalog.settings.theme;\n const themeColor = theme.primary_color;\n const progressSteps = catalog.settings.progress_steps;\n const saveKey = `cf_resume_${catalog.catalog_id}`;\n\n // --- Inject custom CSS ---\n useEffect(() => {\n if (!catalog.settings.custom_css) return;\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-catalog-css\", catalog.catalog_id);\n style.textContent = catalog.settings.custom_css;\n document.head.appendChild(style);\n return () => { style.remove(); };\n }, [catalog.settings.custom_css, catalog.catalog_id]);\n\n // --- Load custom fonts ---\n useEffect(() => {\n const customFonts = theme.custom_fonts;\n if (!customFonts?.length && !theme.font) return;\n const links: HTMLLinkElement[] = [];\n\n // Google Fonts shorthand: if theme.font is set and no custom_fonts URL provided\n if (theme.font && !customFonts?.some(f => f.family === theme.font)) {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = `https://fonts.googleapis.com/css2?family=${encodeURIComponent(theme.font)}:wght@300;400;500;600;700&display=swap`;\n document.head.appendChild(link);\n links.push(link);\n }\n\n // Explicit custom font URLs\n if (customFonts) {\n for (const font of customFonts) {\n if (font.url) {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = font.url;\n document.head.appendChild(link);\n links.push(link);\n } else {\n // Google Fonts auto-resolve\n const weights = font.weights?.join(\";\") || \"300;400;500;600;700\";\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = `https://fonts.googleapis.com/css2?family=${encodeURIComponent(font.family)}:wght@${weights}&display=swap`;\n document.head.appendChild(link);\n links.push(link);\n }\n }\n }\n\n return () => { links.forEach(l => l.remove()); };\n }, [theme.font, theme.custom_fonts]);\n\n // --- Apply custom font size ---\n useEffect(() => {\n if (theme.font_size) {\n document.documentElement.style.setProperty(\"--font-size-body\", `${theme.font_size}rem`);\n return () => { document.documentElement.style.removeProperty(\"--font-size-body\"); };\n }\n }, [theme.font_size]);\n\n // --- Preload images from all pages (including future pages) ---\n useEffect(() => {\n const imageUrls = new Set<string>();\n // Theme background image\n if (catalog.settings?.theme?.background_image) imageUrls.add(catalog.settings.theme.background_image);\n for (const page of Object.values(catalog.pages)) {\n for (const comp of page.components) {\n if (comp.type === \"image\" && comp.props?.src) imageUrls.add(comp.props.src);\n if (comp.type === \"testimonial\" && comp.props?.avatar) imageUrls.add(comp.props.avatar);\n if (comp.type === \"video\" && comp.props?.poster) imageUrls.add(comp.props.poster);\n if (comp.type === \"timeline\" && comp.props?.items) {\n for (const item of comp.props.items) {\n if (item.image) imageUrls.add(item.image);\n }\n }\n }\n }\n // Prefetch all images in the background\n const links: HTMLLinkElement[] = [];\n for (const url of imageUrls) {\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.as = \"image\";\n link.href = url;\n document.head.appendChild(link);\n links.push(link);\n }\n return () => { links.forEach(l => l.remove()); };\n }, [catalog.pages, catalog.settings?.theme?.background_image]);\n\n const [currentPageId, setCurrentPageIdRaw] = useState(catalog.routing.entry);\n const [pageTransitioning, setPageTransitioning] = useState(false);\n const setCurrentPageId = useCallback(\n (pageId: string) => {\n setPageTransitioning(true);\n setCurrentPageIdRaw(pageId);\n setValidationErrors([]);\n track(\"page_view\", { page_id: pageId });\n services?.onPageChange?.(pageId);\n },\n [track, services]\n );\n const [prefilledIds] = useState<Set<string>>(() => {\n const ids = new Set<string>();\n // AI prefill IDs\n if (aiPrefill) {\n for (const compId of Object.keys(aiPrefill)) ids.add(compId);\n }\n // URL param prefill IDs (these override AI prefill)\n const mappings = catalog.settings.url_params?.prefill_mappings;\n if (mappings) {\n for (const [param, compId] of Object.entries(mappings)) {\n if (urlParams[param]) ids.add(compId);\n }\n }\n return ids;\n });\n const [formState, setFormState] = useState<FormState>(() => {\n const state: FormState = {};\n // 1. Apply default_value from component props (lowest priority)\n for (const page of Object.values(catalog.pages)) {\n for (const comp of page.components) {\n if (comp.props?.default_value != null) {\n state[comp.id] = comp.props.default_value;\n }\n // Also initialize default_value for nested inputs inside checkbox/multiple_choice options\n if ((comp.type === \"checkboxes\" || comp.type === \"multiple_choice\") && Array.isArray(comp.props?.options)) {\n for (const opt of comp.props.options) {\n if (!opt.inputs) continue;\n for (const input of opt.inputs) {\n const nestedDefault = input.props?.default_value ?? input.default_value;\n if (nestedDefault != null) {\n state[`${comp.id}.${opt.value}.${input.id}`] = nestedDefault;\n }\n }\n }\n }\n }\n }\n // 2. Apply AI prefill (overrides defaults)\n if (aiPrefill) {\n for (const [compId, value] of Object.entries(aiPrefill)) {\n state[compId] = value;\n }\n }\n // 3. Apply URL param prefill mappings (highest priority — overrides AI)\n const mappings = catalog.settings.url_params?.prefill_mappings;\n if (mappings) {\n for (const [param, compId] of Object.entries(mappings)) {\n if (urlParams[param]) state[compId] = urlParams[param];\n }\n }\n return state;\n });\n const [history, setHistory] = useState<string[]>([]);\n const [submitted, setSubmitted] = useState(false);\n const [cartItems, setCartItems] = useState<CartItem[]>([]);\n const [cartOpen, setCartOpen] = useState(false);\n const [showCheckout, setShowCheckout] = useState(false);\n const [showResumeModal, setShowResumeModal] = useState(false);\n const [savedSession, setSavedSession] = useState<{ formState: FormState; currentPageId: string; history: string[] } | null>(null);\n const [validationErrors, setValidationErrors] = useState<ValidationError[]>([]);\n /** Tracks pages where quiz answers have been revealed (user clicked Continue once) */\n const [quizRevealedPages, setQuizRevealedPages] = useState<Set<string>>(() => new Set());\n const [videoState, setVideoState] = useState<VideoState>({});\n const videoMilestonesFired = useRef<Set<string>>(new Set());\n const [vars, setVars] = useState<Record<string, any>>({});\n const [propOverrides, setPropOverrides] = useState<Record<string, Record<string, any>>>({});\n const [activePopupId, setActivePopupId] = useState<string | null>(null);\n const [dismissedPopups, setDismissedPopups] = useState<Set<string>>(() => new Set());\n /** Script-controlled button disabled state */\n const [scriptButtonDisabled, setScriptButtonDisabled] = useState(false);\n /** Script-controlled button loading state */\n const [scriptButtonLoading, setScriptButtonLoading] = useState(false);\n const popupTriggersRef = useRef<Record<string, TriggerCleanup>>({});\n const pageViewCountRef = useRef(1);\n const formStateRef = useRef(formState);\n formStateRef.current = formState;\n const historyRef = useRef(history);\n historyRef.current = history;\n\n // ── Global state (persists across pages for entire catalog session) ──\n const globalsRef = useRef<Record<string, any>>({});\n\n // --- Quiz scores (recomputed on formState changes) ---\n const quizScores = useMemo(() => {\n const scores = computeQuizScores(catalog, formState);\n if (scores.question_count > 0 && urlParams.debug_mode) {\n console.log(\"[CatalogKit:slim] Quiz scores updated:\", { total: scores.total, max: scores.max, percent: scores.percent, correct: scores.correct_count, questions: scores.question_count });\n if (urlParams.debug_mode === \"verbose\") {\n console.log(\"[CatalogKit:verbose] Quiz answers:\", scores.answers);\n }\n }\n return scores;\n }, [catalog, formState, urlParams.debug_mode]);\n\n // Inject quiz scores into context for routing condition evaluation\n const routingContext = useMemo<TracerContext>(\n () => ({ ...context, quiz_scores: quizScores, video_state: videoState }),\n [context, quizScores, videoState]\n );\n\n // --- Auto-disable button when any required field on the current page is incomplete ---\n const requireAllFieldsDisabled = useMemo(() => {\n const page = catalog.pages[currentPageId];\n if (!page) return false;\n // Explicit opt-out: require_all_fields === false skips real-time disable\n if (page.require_all_fields === false) return false;\n const inputTypes = new Set([\n \"short_text\", \"long_text\", \"rich_text\", \"email\", \"phone\", \"url\",\n \"address\", \"number\", \"currency\", \"date\", \"datetime\", \"time\",\n \"date_range\", \"dropdown\", \"multiselect\", \"multiple_choice\",\n \"checkboxes\", \"picture_choice\", \"switch\", \"checkbox\",\n \"choice_matrix\", \"ranking\", \"star_rating\", \"slider\",\n \"opinion_scale\", \"file_upload\", \"signature\", \"password\", \"location\",\n \"solana_address\", \"evm_address\", \"bitcoin_address\",\n ]);\n const booleanTypes = new Set([\"switch\", \"checkbox\"]);\n // Format validators for types with built-in validation\n const formatValidators: Record<string, (v: string) => boolean> = {\n solana_address: (v) => /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(v),\n evm_address: (v) => /^0x[0-9a-fA-F]{40}$/.test(v),\n bitcoin_address: (v) => /^[13][1-9A-HJ-NP-Za-km-z]{25,34}$/.test(v) || /^bc1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{39,59}$/i.test(v),\n };\n const isFormatInvalid = (type: string, val: unknown) => {\n const validator = formatValidators[type];\n if (!validator || typeof val !== \"string\" || !val) return false;\n return !validator(val);\n };\n for (const comp of page.components) {\n if (!inputTypes.has(comp.type)) continue;\n // Merge script propOverrides so dynamic required/hidden/readonly are respected\n const mergedProps = { ...comp.props, ...propOverrides[comp.id] };\n if (!mergedProps.required) continue;\n // Skip components hidden via propOverrides\n if (mergedProps.hidden) continue;\n // Skip hidden components (visibility conditions)\n if (comp.visibility && !evaluateConditionGroup(comp.visibility, formState, routingContext)) continue;\n if (comp.prefill_mode === \"hidden\" && formState[comp.id] != null && formState[comp.id] !== \"\") continue;\n // Skip readonly\n if (mergedProps.readonly || (comp.prefill_mode === \"readonly\" && formState[comp.id] != null && formState[comp.id] !== \"\")) continue;\n const value = formState[comp.id];\n // For boolean fields (switch/checkbox), require truthy value (must be checked)\n if (booleanTypes.has(comp.type)) {\n if (!value) return true;\n continue;\n }\n if (value == null || value === \"\" || (Array.isArray(value) && value.length === 0)) {\n return true;\n }\n // Check format validity for address types\n if (isFormatInvalid(comp.type, value)) return true;\n // Check nested inputs and require_all for checkbox/multiple_choice options\n if ((comp.type === \"checkboxes\" || comp.type === \"multiple_choice\") && Array.isArray(value)) {\n const options: any[] = mergedProps.options || [];\n // require_all: every option must be selected\n if (mergedProps.require_all) {\n for (const opt of options) {\n if (!value.includes(opt.value)) return true;\n }\n }\n for (const opt of options) {\n if (!opt.inputs || opt.inputs.length === 0) continue;\n // When require_all, validate nested inputs for ALL options\n // Otherwise, only validate nested inputs for selected options\n if (!mergedProps.require_all && !value.includes(opt.value)) continue;\n for (const input of opt.inputs) {\n // required can be at input.required or input.props.required\n const isRequired = input.required || input.props?.required;\n if (!isRequired) continue;\n const nestedId = `${comp.id}.${opt.value}.${input.id}`;\n const nestedValue = formState[nestedId];\n if (nestedValue == null || nestedValue === \"\" || (Array.isArray(nestedValue) && nestedValue.length === 0)) {\n return true;\n }\n // Check format validity for nested address inputs\n if (isFormatInvalid(input.type, nestedValue)) return true;\n }\n }\n }\n }\n return false;\n }, [catalog.pages, currentPageId, formState, routingContext, propOverrides]);\n\n const buttonDisabled = requireAllFieldsDisabled || scriptButtonDisabled;\n const buttonLoading = scriptButtonLoading;\n\n // Reset script button state on page change\n useEffect(() => {\n setScriptButtonDisabled(false);\n setScriptButtonLoading(false);\n }, [currentPageId]);\n\n // --- Check for saved session on mount ---\n useEffect(() => {\n try {\n const raw = localStorage.getItem(saveKey);\n if (raw) {\n const data = JSON.parse(raw);\n if (data.currentPageId && data.currentPageId !== catalog.routing.entry && catalog.pages[data.currentPageId]) {\n setSavedSession(data);\n setShowResumeModal(true);\n }\n }\n } catch { /* ignore corrupt data */ }\n }, [saveKey, catalog.routing.entry, catalog.pages]);\n\n // --- URL hash history ---\n useEffect(() => {\n window.history.replaceState({ pageId: catalog.routing.entry, history: [] }, \"\");\n }, [catalog.routing.entry]);\n\n useEffect(() => {\n const onPopState = (e: PopStateEvent) => {\n const pageId = e.state?.pageId;\n const prevHistory: string[] = e.state?.history || [];\n if (pageId && catalog.pages[pageId]) {\n isNavigatingRef.current = true;\n setPageTransitioning(true);\n setCurrentPageIdRaw(pageId);\n track(\"page_view\", { page_id: pageId });\n setHistory(prevHistory);\n }\n };\n window.addEventListener(\"popstate\", onPopState);\n return () => window.removeEventListener(\"popstate\", onPopState);\n }, [catalog.pages]);\n\n // --- Auto-skip + page enter logic ---\n const autoSkipPending = useRef(false);\n useEffect(() => {\n const page = catalog.pages[currentPageId];\n if (!page) return;\n\n (async () => {\n // --- CatalogKit pageenter event ---\n {\n const payload = { pageId: currentPageId };\n const listeners = catalogKitListeners.current;\n for (const key of [\"pageenter\", `pageenter:${currentPageId}`]) {\n const set = listeners[key];\n if (!set?.size) continue;\n for (const cb of set) {\n try { await cb(payload); } catch (e) { console.error(`[CatalogKit] ${key} listener error:`, e); }\n }\n }\n }\n\n // --- Auto-skip: if all visible inputs are already filled, skip this page ---\n if (page.auto_skip) {\n const fs = formStateRef.current;\n if (shouldAutoSkipPage(page, fs, routingContext)) {\n autoSkipPending.current = true;\n track(\"page_auto_skipped\", { page_id: currentPageId });\n const nextPageId = getNextPage(catalog.routing, currentPageId, fs, routingContext);\n if (nextPageId && catalog.pages[nextPageId]) {\n // Skip without adding to history — the skipped page should be invisible\n setCurrentPageId(nextPageId);\n window.history.replaceState({ pageId: nextPageId, history: historyRef.current }, \"\");\n }\n }\n }\n })();\n }, [currentPageId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // --- Scroll to top after page render (fixes stale scroll height from taller previous pages) ---\n const scrollBehavior = catalog.settings.page_scroll || \"instant\";\n const pageTransitionStyle = catalog.settings.page_transition || \"slide-up\";\n useEffect(() => {\n window.scrollTo({ top: 0, behavior: scrollBehavior as ScrollBehavior });\n requestAnimationFrame(() => {\n setPageTransitioning(false);\n });\n }, [currentPageId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const currentPage = catalog.pages[currentPageId];\n const isCover = currentPage?.layout === \"cover\";\n const progress = getProgress(catalog.routing, currentPageId, catalog.pages);\n\n const fieldChangeTimers = useRef<Record<string, ReturnType<typeof setTimeout>>>({});\n const completedFields = useRef<Set<string>>(new Set());\n\n const autoAdvanceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Pending auto-advance: store { newFormState } to be picked up by effect\n const [pendingAutoAdvance, setPendingAutoAdvance] = useState<{ formState: FormState } | null>(null);\n\n const handleFieldChange = useCallback((componentId: string, value: any) => {\n setFormState((prev) => ({ ...prev, [componentId]: value }));\n // Clear validation error for this field as user edits it\n setValidationErrors((prev) => prev.filter((e) => e.componentId !== componentId));\n // Debounced field_change tracking (500ms)\n if (fieldChangeTimers.current[componentId]) clearTimeout(fieldChangeTimers.current[componentId]);\n fieldChangeTimers.current[componentId] = setTimeout(() => {\n track(\"field_change\", { component_id: componentId, page_id: currentPageId });\n }, 500);\n\n // Selection-type inputs: fire field_complete immediately on selection\n const selectionTypes = [\"multiple_choice\", \"picture_choice\", \"dropdown\", \"checkboxes\", \"multiselect\"];\n const page = catalog.pages[currentPageId];\n if (page) {\n const comp = page.components.find((c: any) => c.id === componentId);\n if (comp && selectionTypes.includes(comp.type) && value != null && value !== \"\") {\n const fieldKey = `${currentPageId}/${componentId}`;\n if (!completedFields.current.has(fieldKey)) {\n completedFields.current.add(fieldKey);\n track(\"field_complete\", { component_id: componentId, page_id: currentPageId, value });\n }\n\n // Auto-advance: if this is the last visible input on the page and auto_advance is enabled\n if (page.auto_advance) {\n const newFormState = { ...formState, [componentId]: value };\n const visCtx = routingContext;\n const visibleInputs = page.components.filter((c) => {\n if (!selectionTypes.includes(c.type) && ![\n \"short_text\", \"long_text\", \"rich_text\", \"email\", \"phone\", \"url\",\n \"address\", \"number\", \"currency\", \"date\", \"datetime\", \"time\",\n \"date_range\", \"switch\", \"checkbox\", \"choice_matrix\", \"ranking\",\n \"star_rating\", \"slider\", \"opinion_scale\", \"file_upload\", \"signature\",\n \"password\", \"location\",\n ].includes(c.type)) return false;\n if (c.visibility && !evaluateConditionGroup(c.visibility, newFormState, visCtx)) return false;\n if (c.prefill_mode === \"hidden\" && newFormState[c.id] != null && newFormState[c.id] !== \"\") return false;\n return true;\n });\n const lastInput = visibleInputs[visibleInputs.length - 1];\n if (lastInput && lastInput.id === componentId) {\n // Clear any previous auto-advance timer\n if (autoAdvanceTimer.current) clearTimeout(autoAdvanceTimer.current);\n autoAdvanceTimer.current = setTimeout(() => {\n // Validate with updated state\n const errors = validatePage(page, newFormState, visCtx, prefilledIds, propOverrides);\n if (errors.length === 0) {\n setPendingAutoAdvance({ formState: newFormState });\n }\n }, 400);\n }\n }\n }\n }\n\n }, [track, currentPageId, catalog.pages, formState, routingContext, prefilledIds]);\n\n // Text inputs: fire field_complete on blur when field has a value\n const handleFieldBlur = useCallback((componentId: string) => {\n const fieldKey = `${currentPageId}/${componentId}`;\n if (completedFields.current.has(fieldKey)) return;\n setFormState((prev) => {\n const val = prev[componentId];\n if (val != null && val !== \"\") {\n completedFields.current.add(fieldKey);\n track(\"field_complete\", { component_id: componentId, page_id: currentPageId, value: val });\n }\n return prev;\n });\n }, [track, currentPageId]);\n\n const popups = catalog.settings.popups;\n\n // --- Video state change handler ---\n const handleVideoStateChange = useCallback(\n (componentId: string, state: VideoComponentState) => {\n setVideoState((prev) => ({ ...prev, [componentId]: state }));\n\n // Fire milestone tracking events at 25%, 50%, 75%, 100%\n const milestones = [25, 50, 75, 100];\n for (const ms of milestones) {\n const key = `${componentId}_${ms}`;\n if (state.watch_percent >= ms && !videoMilestonesFired.current.has(key)) {\n videoMilestonesFired.current.add(key);\n track(ms === 100 ? \"video_complete\" : \"video_progress\", {\n component_id: componentId,\n page_id: currentPageId,\n value: { watch_percent: state.watch_percent, watch_time: state.watch_time, duration: state.duration },\n });\n }\n }\n\n // Check video popup triggers\n if (popups) {\n const updatedVideoState = { ...videoState, [componentId]: state };\n for (const [popupId, config] of Object.entries(popups)) {\n if (config.trigger.type !== \"video_progress\" && config.trigger.type !== \"video_chapter\") continue;\n if (config.pages && config.pages.length > 0 && !config.pages.includes(currentPageId)) continue;\n if (dismissedPopups.has(popupId)) continue;\n if (isInCooldown(popupId, config.trigger.cooldown)) continue;\n\n if (checkVideoTrigger(config.trigger, updatedVideoState)) {\n setActivePopupId((current) => {\n if (current !== null) return current;\n track(\"popup_shown\", { popup_id: popupId, trigger_type: config.trigger.type, page_id: currentPageId });\n return popupId;\n });\n }\n }\n }\n },\n [track, currentPageId, popups, dismissedPopups, videoState]\n );\n\n const navigateTo = useCallback(\n async (nextPageId: string | null) => {\n if (nextPageId && catalog.pages[nextPageId]) {\n const newHistory = [...history, currentPageId];\n setHistory(newHistory);\n setCurrentPageId(nextPageId);\n window.history.pushState({ pageId: nextPageId, history: newHistory }, \"\");\n } else {\n // End of funnel — fire CatalogKit submit event\n // --- CatalogKit submit event ---\n {\n let prevented = false;\n const submitPayload = {\n pageId: currentPageId,\n formState: Object.freeze({ ...formState }),\n preventDefault: () => { prevented = true; },\n };\n const listeners = catalogKitListeners.current;\n for (const key of [\"submit\", `submit:${currentPageId}`]) {\n const set = listeners[key];\n if (!set?.size) continue;\n for (const cb of set) {\n try { await cb(submitPayload); } catch (e) { console.error(`[CatalogKit] ${key} listener error:`, e); }\n }\n }\n if (prevented) return;\n }\n\n // Show checkout if there are cart items, otherwise submit\n if (catalog.settings.checkout) {\n setShowCheckout(true);\n track(\"checkout_start\", { item_count: cartItems.length });\n window.scrollTo({ top: 0, behavior: \"instant\" });\n } else {\n setSubmitted(true);\n localStorage.removeItem(saveKey);\n track(\"form_submit\", { page_id: currentPageId, form_state: formState, quiz_scores: quizScores.question_count > 0 ? quizScores : undefined });\n console.log(\"Catalog submission:\", { formState, tracer: context, quizScores: quizScores.question_count > 0 ? quizScores : undefined });\n }\n }\n },\n [catalog, currentPageId, history, formState, context, saveKey, cartItems, quizScores]\n );\n\n const runValidation = useCallback((): boolean => {\n const page = catalog.pages[currentPageId];\n if (!page) return true;\n const errors = validatePage(page, formState, routingContext, prefilledIds, propOverrides);\n setValidationErrors(errors);\n if (errors.length > 0) {\n // Scroll to first error\n const el = document.querySelector(`[data-component-id=\"${errors[0].componentId}\"]`);\n if (el) el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n return false;\n }\n return true;\n }, [catalog.pages, currentPageId, formState, routingContext, prefilledIds]);\n\n const handleNext = useCallback(async () => {\n if (!runValidation()) return;\n\n // --- Quiz reveal-on-continue: if page has reveal_on_select quiz components,\n // reveal answers on first Continue click, then navigate on second click ---\n const page = catalog.pages[currentPageId];\n if (page && !quizRevealedPages.has(currentPageId)) {\n const hasRevealQuiz = page.components.some(\n (comp) => comp.props?.quiz?.reveal_on_select && formState[comp.id] != null && formState[comp.id] !== \"\"\n );\n dbg(\"verbose\", `Quiz reveal check on \"${currentPageId}\": hasRevealQuiz=${hasRevealQuiz}, alreadyRevealed=${quizRevealedPages.has(currentPageId)}`);\n if (hasRevealQuiz) {\n dbg(\"slim\", `Quiz answers revealed on page \"${currentPageId}\"`);\n setQuizRevealedPages((prev) => new Set(prev).add(currentPageId));\n // After reveal re-render, scroll only if the Continue button is near the\n // bottom edge of the viewport (or off-screen). If the user has already\n // scrolled well past it, don't force-scroll back up — that's jarring.\n requestAnimationFrame(() => {\n setTimeout(() => {\n const sentinel = document.querySelector(\"[data-sticky-sentinel]\");\n const primaryBtn = document.querySelector(\".cf-btn-primary\");\n const target = sentinel || primaryBtn;\n if (target) {\n const rect = target.getBoundingClientRect();\n const viewportH = window.innerHeight;\n // Only scroll if the target is below the viewport or within the\n // bottom 15% (about to be pushed off). Skip if it's already\n // comfortably visible above that zone.\n if (rect.top > viewportH * 0.85 || rect.bottom > viewportH) {\n target.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n }\n }\n }, 100);\n });\n return;\n }\n }\n\n // Check require_watch_percent on video components\n if (page) {\n for (const comp of page.components) {\n if (comp.type === \"video\" && comp.props?.require_watch_percent) {\n const vs = videoState[comp.id];\n const required = comp.props.require_watch_percent;\n if (!vs || vs.watch_percent < required) {\n // Show a brief toast/alert\n const el = document.querySelector(`[data-component-id=\"${comp.id}\"]`);\n if (el) el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n alert(`Please watch at least ${required}% of the video before continuing.`);\n return;\n }\n }\n }\n }\n\n // --- CatalogKit beforenext event (scoped: \"beforenext\" + \"beforenext:<pageId>\") ---\n {\n let prevented = false;\n let nextPageOverride: string | undefined;\n const beforeNextPayload = {\n pageId: currentPageId,\n preventDefault: () => { prevented = true; },\n setNextPage: (id: string) => { nextPageOverride = id; },\n };\n const listeners = catalogKitListeners.current;\n for (const key of [\"beforenext\", `beforenext:${currentPageId}`]) {\n const set = listeners[key];\n if (!set?.size) continue;\n for (const cb of set) {\n try { await cb(beforeNextPayload); } catch (e) { console.error(`[CatalogKit] ${key} listener error:`, e); }\n }\n }\n if (prevented) return;\n if (nextPageOverride !== undefined) {\n navigateTo(nextPageOverride);\n return;\n }\n }\n\n // --- CatalogKit pageexit event ---\n {\n const payload = { pageId: currentPageId };\n const listeners = catalogKitListeners.current;\n for (const key of [\"pageexit\", `pageexit:${currentPageId}`]) {\n const set = listeners[key];\n if (!set?.size) continue;\n for (const cb of set) {\n try { await cb(payload); } catch (e) { console.error(`[CatalogKit] ${key} listener error:`, e); }\n }\n }\n }\n\n const nextPageId = getNextPage(catalog.routing, currentPageId, formState, routingContext);\n navigateTo(nextPageId);\n }, [catalog, currentPageId, formState, routingContext, navigateTo, runValidation, videoState, quizRevealedPages]);\n\n // Process pending auto-advance (deferred so navigateTo is available)\n useEffect(() => {\n if (!pendingAutoAdvance) return;\n const fs = pendingAutoAdvance.formState;\n setPendingAutoAdvance(null);\n const nextPage = getNextPage(catalog.routing, currentPageId, fs, routingContext);\n navigateTo(nextPage);\n }, [pendingAutoAdvance]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /** Set a field and navigate atomically — avoids stale-closure bug in sticky bar's setTimeout approach */\n const handleFieldAndNavigate = useCallback((fieldId: string, value: any) => {\n const newFormState = { ...formState, [fieldId]: value };\n setFormState(newFormState);\n\n // Validate with the updated state\n const page = catalog.pages[currentPageId];\n if (page) {\n const errors = validatePage(page, newFormState, routingContext, prefilledIds, propOverrides);\n setValidationErrors(errors);\n if (errors.length > 0) {\n const el = document.querySelector(`[data-component-id=\"${errors[0].componentId}\"]`);\n if (el) el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n return;\n }\n }\n\n const nextPageId = getNextPage(catalog.routing, currentPageId, newFormState, routingContext);\n navigateTo(nextPageId);\n }, [catalog, currentPageId, formState, routingContext, prefilledIds, navigateTo]);\n\n // --- Cart helpers ---\n\n /** Helper to emit cart events through the CatalogKit listener system */\n const emitCartEvent = useCallback((event: string, detail: any) => {\n const listeners = catalogKitListeners.current;\n for (const key of [event]) {\n const set = listeners[key];\n if (!set?.size) continue;\n for (const cb of set) {\n try { cb(detail); } catch (e) { console.error(`[CatalogKit] ${key} listener error:`, e); }\n }\n }\n }, []);\n\n const addToCart = useCallback((pageId: string) => {\n const page = catalog.pages[pageId];\n if (!page?.offer) return;\n const offer = page.offer;\n // Don't add duplicates\n if (cartItems.some(item => item.offer_id === offer.id)) return;\n const item: CartItem = {\n offer_id: offer.id,\n page_id: pageId,\n title: offer.title,\n price_display: offer.price_display,\n price_subtext: offer.price_subtext,\n image: offer.image,\n stripe_price_id: offer.stripe_price_id,\n amount_cents: offer.amount_cents,\n currency: offer.currency,\n payment_type: offer.payment_type,\n interval: offer.interval,\n };\n setCartItems(prev => [...prev, item]);\n track(\"cart_add\", { offer_id: offer.id, page_id: pageId });\n emitCartEvent(\"cart_add\", { item, items: [...cartItems, item] });\n }, [catalog.pages, cartItems, track, emitCartEvent]);\n\n const removeFromCart = useCallback((offerId: string) => {\n setCartItems(prev => prev.filter(item => item.offer_id !== offerId));\n // Clear the accept_field in formState so the useEffect doesn't re-add it\n for (const page of Object.values(catalog.pages)) {\n if (page.offer?.id === offerId && page.offer.accept_field) {\n setFormState(prev => {\n const next = { ...prev };\n delete next[page.offer!.accept_field!];\n return next;\n });\n break;\n }\n }\n track(\"cart_remove\", { offer_id: offerId });\n emitCartEvent(\"cart_remove\", { offer_id: offerId, items: cartItems.filter(i => i.offer_id !== offerId) });\n }, [catalog.pages, cartItems, track, emitCartEvent]);\n\n const toggleCart = useCallback(() => {\n setCartOpen(prev => {\n const next = !prev;\n emitCartEvent(next ? \"cart_open\" : \"cart_close\", { items: cartItems });\n return next;\n });\n }, [cartItems, emitCartEvent]);\n\n const handleAction = useCallback(\n async (action: PageAction) => {\n track(\"action_click\", { page_id: currentPageId, action_id: action.id });\n\n if (action.redirect_url) {\n window.open(action.redirect_url, \"_blank\");\n return;\n }\n\n // Validate before navigating\n if (!runValidation()) return;\n\n const page = catalog.pages[currentPageId];\n\n // --- CatalogKit beforenext event ---\n {\n let prevented = false;\n let nextPageOverride: string | undefined;\n const beforeNextPayload = {\n pageId: currentPageId,\n preventDefault: () => { prevented = true; },\n setNextPage: (id: string) => { nextPageOverride = id; },\n };\n const listeners = catalogKitListeners.current;\n for (const key of [\"beforenext\", `beforenext:${currentPageId}`]) {\n const set = listeners[key];\n if (!set?.size) continue;\n for (const cb of set) {\n try { await cb(beforeNextPayload); } catch (e) { console.error(`[CatalogKit] ${key} listener error:`, e); }\n }\n }\n if (prevented) return;\n if (nextPageOverride !== undefined) {\n navigateTo(nextPageOverride);\n return;\n }\n }\n\n // Check if this action accepts an offer on the current page\n const currentOffer = page?.offer;\n if (currentOffer) {\n const acceptValue = currentOffer.accept_value || \"accept\";\n if (action.id === acceptValue) {\n addToCart(currentPageId);\n }\n }\n\n const actionKey = `__action_${currentPageId}`;\n const newFormState = { ...formState, [actionKey]: action.id };\n setFormState(newFormState);\n\n // --- CatalogKit pageexit event ---\n {\n const payload = { pageId: currentPageId };\n const listeners = catalogKitListeners.current;\n for (const key of [\"pageexit\", `pageexit:${currentPageId}`]) {\n const set = listeners[key];\n if (!set?.size) continue;\n for (const cb of set) {\n try { await cb(payload); } catch (e) { console.error(`[CatalogKit] ${key} listener error:`, e); }\n }\n }\n }\n\n const nextPageId = getNextPage(catalog.routing, currentPageId, newFormState, routingContext);\n navigateTo(nextPageId);\n },\n [catalog, currentPageId, formState, routingContext, navigateTo, addToCart, runValidation]\n );\n\n const handleBack = useCallback(() => {\n if (history.length > 0) {\n const newHistory = history.slice(0, -1);\n const prevPageId = history[history.length - 1];\n track(\"page_back\", { page_id: currentPageId, value: { from_page: currentPageId, to_page: prevPageId } });\n setHistory(newHistory);\n setCurrentPageId(prevPageId);\n window.history.replaceState({ pageId: prevPageId, history: newHistory }, \"\");\n }\n }, [history, setCurrentPageId, currentPageId, track]);\n\n // Progressive save (stable key, not per-tracer)\n useEffect(() => {\n if (!submitted) {\n localStorage.setItem(saveKey, JSON.stringify({ formState, currentPageId, history }));\n }\n }, [formState, currentPageId, history, saveKey, submitted]);\n\n // --- Resume handlers ---\n const handleResume = useCallback(() => {\n if (savedSession) {\n setFormState(savedSession.formState);\n setCurrentPageIdRaw(savedSession.currentPageId);\n setHistory(savedSession.history);\n window.history.replaceState({ pageId: savedSession.currentPageId, history: savedSession.history }, \"\");\n track(\"session_resume\", { page_id: savedSession.currentPageId });\n }\n setShowResumeModal(false);\n }, [savedSession, track]);\n\n const handleStartOver = useCallback(() => {\n localStorage.removeItem(saveKey);\n setShowResumeModal(false);\n }, [saveKey]);\n\n // --- Detect offer acceptance from field changes ---\n\n useEffect(() => {\n // Check each page that has an offer with accept_field\n for (const [pageId, page] of Object.entries(catalog.pages)) {\n const offer = page.offer;\n if (!offer?.accept_field) continue;\n const fieldValue = formState[offer.accept_field];\n const acceptValue = offer.accept_value || \"accept\";\n if (fieldValue === acceptValue) {\n if (!cartItems.some(item => item.offer_id === offer.id)) {\n addToCart(pageId);\n }\n } else if (fieldValue && fieldValue !== acceptValue) {\n // If they changed their choice away from accept, remove from cart\n if (cartItems.some(item => item.offer_id === offer.id)) {\n removeFromCart(offer.id);\n }\n }\n }\n }, [formState]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // --- Popup System ---\n\n // Set up popup triggers when page changes\n useEffect(() => {\n // Clean up previous triggers\n for (const cleanup of Object.values(popupTriggersRef.current)) {\n cleanup.destroy();\n }\n popupTriggersRef.current = {};\n\n if (!popups) return;\n\n for (const [popupId, config] of Object.entries(popups)) {\n // Skip if popup is scoped to specific pages and current page isn't in the list\n if (config.pages && config.pages.length > 0 && !config.pages.includes(currentPageId)) {\n continue;\n }\n // Skip if already dismissed this session or in cooldown\n if (dismissedPopups.has(popupId)) continue;\n if (isInCooldown(popupId, config.trigger.cooldown)) continue;\n // Skip page_count triggers that haven't reached threshold\n if (config.trigger.type === \"page_count\" && pageViewCountRef.current < (config.trigger.count ?? 3)) {\n continue;\n }\n\n const cleanup = setupTrigger(config.trigger, () => {\n // Double-check: don't show if another popup is active or this one was dismissed\n setActivePopupId((current) => {\n if (current !== null) return current; // another popup is showing\n // Fire tracking event\n track(\"popup_shown\", { popup_id: popupId, trigger_type: config.trigger.type, page_id: currentPageId });\n return popupId;\n });\n });\n popupTriggersRef.current[popupId] = cleanup;\n }\n\n return () => {\n for (const cleanup of Object.values(popupTriggersRef.current)) {\n cleanup.destroy();\n }\n popupTriggersRef.current = {};\n };\n }, [currentPageId, popups, dismissedPopups]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Track page view count for page_count trigger\n useEffect(() => {\n pageViewCountRef.current += 1;\n }, [currentPageId]);\n\n const handlePopupDismiss = useCallback(() => {\n if (activePopupId) {\n const config = popups?.[activePopupId];\n setCooldown(activePopupId, config?.trigger.cooldown);\n setDismissedPopups((prev) => new Set(prev).add(activePopupId));\n track(\"popup_dismissed\", { popup_id: activePopupId, page_id: currentPageId });\n }\n setActivePopupId(null);\n }, [activePopupId, popups, track, currentPageId]);\n\n const handlePopupFormSubmit = useCallback(\n (popupId: string, formData: Record<string, any>) => {\n const config = popups?.[popupId];\n if (!config?.form?.on_submit) {\n // Default: close popup\n handlePopupDismiss();\n return;\n }\n\n track(\"popup_converted\", { popup_id: popupId, form_data: formData, page_id: currentPageId });\n\n for (const action of config.form.on_submit) {\n switch (action.action) {\n case \"post\": {\n if (action.url) {\n // Resolve {{field_id}} templates in URL\n let url = action.url;\n for (const [key, val] of Object.entries(formData)) {\n url = url.replace(`{{${key}}}`, encodeURIComponent(String(val)));\n }\n fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n popup_id: popupId,\n form_data: formData,\n tracer_id: context.tracer_id,\n catalog_slug: rawCatalog.slug,\n page_id: currentPageId,\n hints: context.hints,\n timestamp: new Date().toISOString(),\n }),\n }).catch(() => {});\n }\n break;\n }\n case \"track\": {\n if (action.event) {\n track(action.event, { popup_id: popupId, form_data: formData });\n }\n break;\n }\n case \"redirect\": {\n if (action.url) {\n let url = action.url;\n for (const [key, val] of Object.entries(formData)) {\n url = url.replace(`{{${key}}}`, encodeURIComponent(String(val)));\n }\n window.location.href = url;\n }\n break;\n }\n case \"next_page\": {\n handleNext();\n break;\n }\n case \"close\":\n default:\n break;\n }\n }\n\n // Always close and set cooldown after submit\n setCooldown(popupId, config.trigger.cooldown);\n setDismissedPopups((prev) => new Set(prev).add(popupId));\n setActivePopupId(null);\n },\n [popups, track, currentPageId, context, rawCatalog.slug, handleNext]\n );\n\n // Render popup if active\n const activePopupConfig = activePopupId && popups ? popups[activePopupId] : null;\n\n // --- Checkout Page ---\n\n const handleGoToCheckout = useCallback(async () => {\n const cartCfg = catalog.settings.cart;\n\n // Emit before_checkout — cancelable\n let prevented = false;\n const payload = {\n items: [...cartItems],\n preventDefault: () => { prevented = true; },\n };\n const listeners = catalogKitListeners.current;\n for (const key of [\"before_checkout\"]) {\n const set = listeners[key];\n if (!set?.size) continue;\n for (const cb of set) {\n try { await cb(payload); } catch (e) { console.error(`[CatalogKit] ${key} listener error:`, e); }\n }\n }\n if (prevented) return;\n\n setCartOpen(false);\n\n // External URL — supports {{field_id}} template interpolation\n const destUrl = cartCfg?.destination_url || cartCfg?.checkout_url;\n if (destUrl) {\n const url = destUrl.replace(/\\{\\{(\\w+)\\}\\}/g, (_, fieldId) => {\n const val = formStateRef.current[fieldId];\n return val != null ? encodeURIComponent(String(val)) : \"\";\n });\n track(\"checkout_start\", { item_count: cartItems.length, external: true, url });\n window.location.href = url;\n return;\n }\n\n // Internal page navigation\n if (cartCfg?.destination_page) {\n track(\"checkout_start\", { item_count: cartItems.length, page: cartCfg.destination_page });\n navigateTo(cartCfg.destination_page);\n return;\n }\n\n setShowCheckout(true);\n track(\"checkout_start\", { item_count: cartItems.length });\n }, [cartItems, catalog.settings.cart, track, navigateTo]);\n\n const handleBackFromCheckout = useCallback(() => {\n setShowCheckout(false);\n }, []);\n\n // \"Continue without paying\" — skip checkout and proceed to submitted/thank-you\n const handleSkipCheckout = useCallback(() => {\n setShowCheckout(false);\n setSubmitted(true);\n localStorage.removeItem(saveKey);\n track(\"checkout_skip\", { item_count: cartItems.length });\n track(\"form_submit\", { page_id: currentPageId, form_state: formState });\n }, [cartItems, track, currentPageId, formState, saveKey]);\n\n // API base URL: use injected services value, else derive from hostname\n const apiBaseUrl = useMemo(() => {\n if (services?.apiBaseUrl) return services.apiBaseUrl;\n if (window.location.hostname === \"localhost\") {\n return \"http://localhost:3001\";\n }\n return window.location.origin;\n }, [services]);\n\n // Belt-and-suspenders: fire funnel_complete when submitted state is reached.\n // This guarantees a completion event even if form_submit was lost (e.g. network/proxy issue).\n const funnelCompleteRef = useRef(false);\n useEffect(() => {\n if (!submitted || funnelCompleteRef.current) return;\n funnelCompleteRef.current = true;\n track(\"funnel_complete\", { page_id: currentPageId, form_state: formState });\n }, [submitted]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-redirect via useEffect (not during render) to avoid side effects and duplicate timers\n const redirectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n if (!submitted) return;\n const completion = rawCatalog.settings.completion;\n if (!completion?.redirect_url) return;\n\n const redirectUrl = Object.entries(formState).reduce(\n (url, [key, val]) => url.replace(`{{${key}}}`, encodeURIComponent(String(val))),\n completion.redirect_url\n );\n\n const delay = completion.redirect_delay ?? 0;\n if (delay === 0) {\n window.location.href = redirectUrl;\n } else {\n redirectTimerRef.current = setTimeout(() => { window.location.href = redirectUrl; }, delay);\n }\n return () => {\n if (redirectTimerRef.current) clearTimeout(redirectTimerRef.current);\n };\n }, [submitted]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Inspector context — rich metadata for AI agent workflows\n const inspectorContext = useMemo<InspectorContext>(() => {\n const pageIds = Object.keys(catalog.pages);\n return {\n catalogId: catalog.catalog_id,\n catalogSlug: catalog.slug,\n variantSlug: variant?.slug,\n variantId: variant?.id,\n currentPageId,\n sandboxOf: sandboxOf || null,\n totalPages: pageIds.length,\n currentPageIndex: pageIds.indexOf(currentPageId),\n themeColor,\n apiUrl: \"https://api.catalogkit.cc\",\n };\n }, [catalog.catalog_id, catalog.slug, catalog.pages, variant, currentPageId, sandboxOf, themeColor]);\n\n // --- CatalogKit Global API Bridge ---\n const catalogKitListeners = useRef<Record<string, Set<Function>>>({});\n\n // Refs for stable access in the global object (avoids stale closures)\n const varsRef = useRef(vars);\n varsRef.current = vars;\n const urlParamsRef = useRef(urlParams);\n urlParamsRef.current = urlParams;\n const currentPageIdRef = useRef(currentPageId);\n currentPageIdRef.current = currentPageId;\n const propOverridesRef = useRef(propOverrides);\n propOverridesRef.current = propOverrides;\n const quizScoresRef = useRef(quizScores);\n quizScoresRef.current = quizScores;\n const cartItemsRef = useRef(cartItems);\n cartItemsRef.current = cartItems;\n\n // --- Debug mode ---\n const debugMode = urlParams.debug_mode as \"verbose\" | \"slim\" | undefined;\n const dbg = useCallback((level: \"verbose\" | \"slim\", ...args: any[]) => {\n if (!debugMode) return;\n if (debugMode === \"verbose\" || level === \"slim\") {\n console.log(`[CatalogKit:${level}]`, ...args);\n }\n }, [debugMode]);\n /** Summarize data-URI / large base64 values for slim debug output */\n const slimValue = (v: any) => {\n if (typeof v === \"string\" && v.startsWith(\"data:\")) {\n const semi = v.indexOf(\";\");\n const mime = semi > 5 ? v.slice(5, semi) : \"unknown\";\n return `[signed ${mime} ~${Math.round(v.length / 1024)}KB]`;\n }\n return v;\n };\n\n // Stable references to handlers (they change on deps, but refs stay stable)\n const handleNextRef = useRef(handleNext);\n handleNextRef.current = handleNext;\n const handleBackRef = useRef(handleBack);\n handleBackRef.current = handleBack;\n const navigateToRef = useRef(navigateTo);\n navigateToRef.current = navigateTo;\n const handleGoToCheckoutRef = useRef(handleGoToCheckout);\n handleGoToCheckoutRef.current = handleGoToCheckout;\n const handleFieldChangeRef = useRef(handleFieldChange);\n handleFieldChangeRef.current = handleFieldChange;\n\n /**\n * Emit a CatalogKit event. Fires listeners for both the exact event key\n * and the scoped key (e.g. \"beforenext\" + \"beforenext:checkout\").\n * For beforenext/submit events, listeners are awaited (async support).\n * Returns { prevented, nextPageOverride } for beforenext/submit.\n */\n const emitCatalogKitEvent = useCallback(async (\n baseEvent: string,\n scopeId: string | undefined,\n payload: any,\n ): Promise<{ prevented: boolean; nextPageOverride?: string }> => {\n const listeners = catalogKitListeners.current;\n let prevented = false;\n let nextPageOverride: string | undefined;\n\n // Collect matching listeners: unscoped (\"beforenext\") + scoped (\"beforenext:checkout\")\n const keys: string[] = [baseEvent];\n if (scopeId) keys.push(`${baseEvent}:${scopeId}`);\n\n for (const key of keys) {\n const set = listeners[key];\n if (!set?.size) continue;\n for (const cb of set) {\n try {\n await cb(payload);\n } catch (e) {\n console.error(`[CatalogKit] ${key} listener error:`, e);\n }\n }\n }\n\n return { prevented, nextPageOverride };\n }, []);\n\n // Expose window.CatalogKit[catalog_id] — isolated per catalog instance\n // IMPORTANT: Registration happens synchronously (not in useEffect) so that\n // child HtmlDisplay <script> tags can access CatalogKit immediately when\n // their useEffect fires. React fires child effects before parent effects,\n // so a useEffect here would create a race condition.\n const catalogId = catalog.catalog_id;\n const catalogKitInstanceRef = useRef<any>(null);\n if (!catalogKitInstanceRef.current) {\n const listeners = catalogKitListeners.current;\n\n const instance = {\n // ── Read state ──\n getField: (id: string) => formStateRef.current[id],\n getAllFields: () => Object.freeze({ ...formStateRef.current }),\n getVar: (key: string) => varsRef.current[key],\n getAllVars: () => Object.freeze({ ...varsRef.current }),\n getUrlParam: (key: string) => urlParamsRef.current[key],\n getAllUrlParams: () => Object.freeze({ ...urlParamsRef.current }),\n getPageId: () => currentPageIdRef.current,\n getGlobal: (key: string) => globalsRef.current[key],\n getQuizScores: () => Object.freeze({ ...quizScoresRef.current }),\n\n // ── Write state ──\n setField: (id: string, value: any) => handleFieldChangeRef.current(id, value),\n setVar: (key: string, value: any) => setVars((prev) => ({ ...prev, [key]: value })),\n setGlobal: (key: string, value: any) => { globalsRef.current[key] = value; },\n\n // ── Button control ──\n setButtonLoading: (loading: boolean) => setScriptButtonLoading(loading),\n setButtonDisabled: (disabled: boolean) => setScriptButtonDisabled(disabled),\n setValidationError: (id: string, message: string | null) => {\n setValidationErrors((prev) => {\n const next = prev.filter((e) => e.componentId !== id);\n if (message) next.push({ componentId: id, message });\n return next;\n });\n },\n\n // ── Navigation ──\n goNext: () => handleNextRef.current(),\n goBack: () => handleBackRef.current(),\n goToPage: (pageId: string) => navigateToRef.current(pageId),\n\n // ── Component props ──\n setComponentProp: (id: string, prop: string, value: any) => {\n setPropOverrides((prev) => ({\n ...prev,\n [id]: { ...(prev[id] || {}), [prop]: value },\n }));\n },\n\n // ── Cart ──\n openCart: () => { setCartOpen(true); },\n closeCart: () => { setCartOpen(false); },\n getCartItems: () => Object.freeze([...cartItemsRef.current]),\n startCheckout: () => { handleGoToCheckoutRef.current(); },\n\n // ── Events ──\n on: (event: string, callback: Function) => {\n if (!listeners[event]) listeners[event] = new Set();\n listeners[event].add(callback);\n },\n off: (event: string, callback: Function) => {\n listeners[event]?.delete(callback);\n },\n\n // ── Utilities ──\n fetch: globalThis.fetch.bind(globalThis),\n };\n\n catalogKitInstanceRef.current = instance;\n\n // Initialize registry if needed\n if (!window.CatalogKit) {\n const registry: Record<string, any> = {};\n // .get() returns instance by id, or the most recently mounted\n registry.get = (id?: string) => id ? registry[id] : registry._active;\n window.CatalogKit = registry as any;\n }\n\n // Register this instance and mark as active\n window.CatalogKit![catalogId] = instance;\n (window.CatalogKit as any)._active = instance;\n\n if (urlParams.debug_mode) {\n console.log(`[CatalogKit:slim] Registered CatalogKit instance (sync, before child effects)`, { catalogId });\n console.log(`[CatalogKit:slim] Debug mode: ${urlParams.debug_mode}`);\n console.log(`[CatalogKit:verbose] Available API methods:`, Object.keys(instance).join(\", \"));\n }\n }\n\n // Cleanup on unmount\n useEffect(() => {\n const instance = catalogKitInstanceRef.current;\n return () => {\n if (window.CatalogKit) {\n delete window.CatalogKit[catalogId];\n if ((window.CatalogKit as any)._active === instance) {\n delete (window.CatalogKit as any)._active;\n }\n // Clean up registry if empty\n const remaining = Object.keys(window.CatalogKit).filter((k) => k !== \"get\" && k !== \"_active\");\n if (remaining.length === 0) {\n delete window.CatalogKit;\n }\n }\n };\n }, [catalogId]);\n\n // Emit fieldchange events when formState changes (scoped: \"fieldchange\" + \"fieldchange:<fieldId>\")\n const prevFormStateRef = useRef(formState);\n const slimDbgTimers = useRef<Record<string, ReturnType<typeof setTimeout>>>({});\n useEffect(() => {\n const prev = prevFormStateRef.current;\n prevFormStateRef.current = formState;\n const listeners = catalogKitListeners.current;\n for (const [id, value] of Object.entries(formState)) {\n if (prev[id] !== value) {\n dbg(\"verbose\", `fieldchange: ${id} =`, value);\n // Slim: debounce text-like values (strings) so we log only the settled value\n if (typeof value === \"string\") {\n clearTimeout(slimDbgTimers.current[id]);\n slimDbgTimers.current[id] = setTimeout(() => dbg(\"slim\", `fieldchange: ${id} =`, slimValue(value)), 600);\n } else {\n dbg(\"slim\", `fieldchange: ${id} =`, slimValue(value));\n }\n const payload = { fieldId: id, value, prevValue: prev[id] };\n // Fire unscoped \"fieldchange\"\n const globalSet = listeners[\"fieldchange\"];\n if (globalSet?.size) {\n for (const cb of globalSet) {\n try { cb(payload); } catch (e) { console.error(\"[CatalogKit] fieldchange listener error:\", e); }\n }\n }\n // Fire scoped \"fieldchange:<fieldId>\"\n const scopedSet = listeners[`fieldchange:${id}`];\n if (scopedSet?.size) {\n for (const cb of scopedSet) {\n try { cb(payload); } catch (e) { console.error(`[CatalogKit] fieldchange:${id} listener error:`, e); }\n }\n }\n }\n }\n }, [formState]);\n\n // Emit pageenter events when page changes (scoped: \"pageenter\" + \"pageenter:<pageId>\")\n useEffect(() => {\n dbg(\"slim\", `pageenter: ${currentPageId}`);\n dbg(\"verbose\", \"formState at pageenter:\", formStateRef.current);\n dbg(\"verbose\", \"quizScores at pageenter:\", quizScoresRef.current);\n const listeners = catalogKitListeners.current;\n const payload = { pageId: currentPageId };\n for (const key of [\"pageenter\", `pageenter:${currentPageId}`]) {\n const set = listeners[key];\n dbg(\"verbose\", ` event \"${key}\" → ${set?.size ?? 0} listener(s)`);\n if (!set?.size) continue;\n for (const cb of set) {\n try { cb(payload); } catch (e) { console.error(`[CatalogKit] ${key} listener error:`, e); }\n }\n }\n }, [currentPageId]);\n\n // --- Sync body background to prevent iOS overscroll showing wrong color ---\n useEffect(() => {\n const bgColor = theme.background_color;\n if (isCover) {\n document.body.style.background = bgColor || '#0f0c29';\n } else {\n document.body.style.background = bgColor || '#f8f9fc';\n }\n return () => { document.body.style.background = ''; };\n }, [isCover, theme.background_color]);\n\n // Dynamic topbar height for page content padding\n // NOTE: These hooks MUST be before any early returns (checkout/submitted/not-found)\n // to avoid React error #300 (\"Rendered fewer hooks than expected\").\n const topBarRef = useRef<HTMLDivElement>(null);\n const [topBarHeight, setTopBarHeight] = useState(0);\n const topBarEnabled = catalog.settings.top_bar?.enabled !== false;\n useEffect(() => {\n if (!topBarEnabled || !topBarRef.current) return;\n const ro = new ResizeObserver(([entry]) => {\n setTopBarHeight(entry.contentRect.height);\n });\n ro.observe(topBarRef.current);\n return () => ro.disconnect();\n }, [topBarEnabled]);\n\n if (showCheckout && catalog.settings.checkout) {\n return (\n <>\n <ElementInspector context={inspectorContext} />\n <CheckoutPage\n cartItems={cartItems}\n checkout={catalog.settings.checkout}\n formState={formState}\n tracerId={context.tracer_id}\n userId={userId || \"\"}\n catalogSlug={catalog.slug}\n apiBaseUrl={apiBaseUrl}\n themeColor={themeColor}\n onBack={handleBackFromCheckout}\n onContinue={handleSkipCheckout}\n onRemoveItem={removeFromCart}\n onFieldChange={handleFieldChange}\n />\n </>\n );\n }\n\n // --- Submitted State ---\n\n if (submitted) {\n const completion = rawCatalog.settings.completion;\n\n const resolveTemplateUrl = (url: string) =>\n Object.entries(formState).reduce(\n (u, [key, val]) => u.replace(`{{${key}}}`, encodeURIComponent(String(val))),\n url\n );\n\n const handleCompletionAction = (action: import(\"@shared/types\").CompletionAction) => {\n switch (action.type) {\n case \"fill_again\":\n setFormState({});\n setSubmitted(false);\n setCurrentPageId(rawCatalog.routing.entry);\n setHistory([]);\n localStorage.removeItem(saveKey);\n window.scrollTo({ top: 0, behavior: \"instant\" });\n break;\n case \"share\":\n navigator.clipboard?.writeText(window.location.href);\n break;\n case \"redirect\":\n if (action.url) window.location.href = resolveTemplateUrl(action.url);\n break;\n }\n };\n\n const actionStyleClasses: Record<string, string> = {\n primary: \"cf-btn-primary\",\n secondary: \"cf-btn-secondary\",\n ghost: \"cf-btn-ghost\",\n };\n\n // Safely extract string values from completion config (guard against objects)\n const heading = completion?.heading && typeof completion.heading === \"string\" ? completion.heading : completion?.heading ? String(completion.heading) : null;\n const message = completion?.message && typeof completion.message === \"string\" ? completion.message : completion?.message ? String(completion.message) : null;\n\n return (\n <div className=\"min-h-screen flex items-center justify-center\" style={{ background: 'linear-gradient(160deg, #f8f9fc 0%, #eef1f8 100%)' }} data-page-id=\"__completion\" data-component-id=\"__completion_page\" data-component-type=\"completion_page\">\n <ElementInspector context={inspectorContext} />\n <div className=\"cf-card max-w-md w-full text-center space-y-5 p-10 mx-4\">\n <div className=\"w-16 h-16 rounded-2xl mx-auto flex items-center justify-center\" style={{ backgroundColor: `${themeColor}12` }}>\n <svg className=\"w-8 h-8\" style={{ color: themeColor }} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n {heading && (\n <h2 className=\"text-2xl font-bold text-gray-900\" style={{ fontFamily: 'var(--font-display)', letterSpacing: '-0.02em' }}>{heading}</h2>\n )}\n {message && (\n <p className=\"text-gray-500 text-sm leading-relaxed\">{message}</p>\n )}\n {cartItems.length > 0 && (\n <div className=\"text-left bg-gray-50 border border-gray-100 rounded-2xl p-4 space-y-2\">\n <p className=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">Your selections</p>\n {cartItems.map(item => (\n <div key={item.offer_id} className=\"flex items-center gap-3 py-2\">\n {item.image && <img src={item.image} alt=\"\" className=\"w-10 h-10 rounded-lg object-cover\" />}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-gray-900 truncate\">{item.title}</p>\n {item.price_display && <p className=\"text-xs font-medium\" style={{ color: themeColor }}>{item.price_display}</p>}\n </div>\n </div>\n ))}\n </div>\n )}\n {completion?.actions && Array.isArray(completion.actions) && completion.actions.length > 0 && (\n <div className=\"flex flex-col gap-3 pt-2\">\n {completion.actions.map((action, i) => (\n <button\n key={i}\n className={`w-full py-3 px-6 rounded-xl text-sm font-semibold transition-all ${actionStyleClasses[action.style || \"primary\"] || actionStyleClasses.primary}`}\n style={(!action.style || action.style === \"primary\") ? { backgroundColor: themeColor, color: \"#fff\" } : undefined}\n onClick={() => handleCompletionAction(action)}\n data-component-id={`__completion_action_${i}`}\n data-component-type=\"completion_action\"\n >\n {String(action.label)}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // --- Page Not Found ---\n\n if (!currentPage) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50\" data-page-id=\"__error\" data-component-id=\"__error_page\" data-component-type=\"error_page\">\n <ElementInspector context={inspectorContext} />\n <p className=\"text-red-500\">Page not found: {currentPageId}</p>\n </div>\n );\n }\n\n const nextPageId = getNextPage(catalog.routing, currentPageId, formState, routingContext);\n const isLastPage = !nextPageId && !(currentPage.actions && currentPage.actions.length > 0);\n const hasHistory = history.length > 0;\n\n // --- Cover Page Layout ---\n\n // Font style applied to all layouts\n const fontStyle: React.CSSProperties = theme.font ? { fontFamily: `'${theme.font}', sans-serif` } : {};\n\n if (isCover) {\n const bgImage = theme.background_image;\n\n // Resolve sticky bar for cover page\n const coverStickyBarConfig: StickyBarConfig | undefined =\n currentPage.sticky_bar?.enabled\n ? currentPage.sticky_bar\n : catalog.settings.sticky_bar?.enabled\n ? catalog.settings.sticky_bar\n : undefined;\n const coverEffectiveStickyBar =\n currentPage.sticky_bar && !currentPage.sticky_bar.enabled\n ? undefined\n : coverStickyBarConfig;\n const coverStickyButtonText =\n coverEffectiveStickyBar?.button_text ||\n currentPage.submit_label ||\n (isLastPage ? \"Submit\" : \"Get Started\");\n\n return (\n <>\n <ElementInspector context={inspectorContext} />\n {sandboxOf && <SandboxBanner />}\n {showResumeModal && <ResumeModal themeColor={themeColor} onResume={handleResume} onStartOver={handleStartOver} />}\n {activePopupId && activePopupConfig && (\n <Popup\n popupId={activePopupId}\n config={activePopupConfig}\n themeColor={themeColor}\n hints={hints}\n onDismiss={handlePopupDismiss}\n onFormSubmit={handlePopupFormSubmit}\n onTrack={track}\n />\n )}\n <CartButton itemCount={cartItems.length} onClick={toggleCart} themeColor={themeColor} cartSettings={catalog.settings.cart} />\n <CartDrawer items={cartItems} isOpen={cartOpen} onToggle={toggleCart} onRemove={removeFromCart} onCheckout={catalog.settings.checkout ? handleGoToCheckout : undefined} themeColor={themeColor} cartSettings={catalog.settings.cart} />\n <div\n className={`cf-page cf-noise min-h-screen flex items-center justify-center relative overflow-hidden ${currentPage.className || \"\"}`}\n style={{\n ...fontStyle,\n backgroundImage: bgImage\n ? `url(${bgImage})`\n : 'linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)',\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n ...currentPage.style as React.CSSProperties,\n ...(pageTransitioning ? { visibility: \"hidden\" as const } : {}),\n }}\n data-page-id={currentPageId}\n >\n <div className=\"cf-cover-overlay absolute inset-0\" style={getOverlayStyle(theme.background_overlay)} />\n <div className={`cf-cover-content relative ${currentPage.max_width?.startsWith(\"max-w-\") ? currentPage.max_width : \"max-w-2xl\"} mx-auto px-6 py-20 text-center text-white`} style={currentPage.max_width && !currentPage.max_width.startsWith(\"max-w-\") ? { maxWidth: currentPage.max_width } : undefined}>\n <PageRenderer\n key={currentPageId}\n page={currentPage}\n formState={formState}\n prefilledIds={prefilledIds}\n onFieldChange={handleFieldChange}\n onFieldBlur={handleFieldBlur}\n themeColor={themeColor}\n onNext={handleNext}\n onAction={handleAction}\n isLastPage={isLastPage}\n isCover\n useStickyBar={!!coverEffectiveStickyBar}\n validationErrors={validationErrors}\n quizScores={quizScores}\n allPages={catalog.pages}\n tracerContext={routingContext}\n onVideoStateChange={handleVideoStateChange}\n propOverrides={propOverrides}\n buttonDisabled={buttonDisabled}\n buttonLoading={buttonLoading}\n pageTransition={pageTransitionStyle}\n />\n </div>\n </div>\n\n {/* Sticky bottom bar on cover page */}\n {coverEffectiveStickyBar && (\n <StickyBottomBar\n key={currentPageId}\n config={coverEffectiveStickyBar}\n formState={formState}\n cartItems={cartItems}\n themeColor={themeColor}\n defaultButtonText={coverStickyButtonText}\n onNext={handleNext}\n onAction={(actionId: string) => {\n const action = currentPage.actions?.find((a) => a.id === actionId);\n if (action) {\n handleAction(action);\n }\n }}\n onFieldChange={handleFieldChange}\n onFieldAndNavigate={handleFieldAndNavigate}\n onBack={hasHistory ? handleBack : undefined}\n showBack={hasHistory && !currentPage.hide_back}\n noSpacer\n buttonDisabled={buttonDisabled}\n buttonLoading={buttonLoading}\n buttonDisabledMessage={currentPage.button_disabled_message}\n />\n )}\n </>\n );\n }\n\n // --- Standard Page Layout ---\n\n const hasStepper = progressSteps && progressSteps.length > 0;\n const topBar = catalog.settings.top_bar;\n const topBarShowBack = topBar?.show_back_button !== false;\n const topBarShowProgress = topBar?.show_progress !== false;\n\n\n // Resolve sticky bar config: page-level overrides global\n const stickyBarConfig: StickyBarConfig | undefined =\n currentPage.sticky_bar?.enabled\n ? currentPage.sticky_bar\n : catalog.settings.sticky_bar?.enabled\n ? catalog.settings.sticky_bar\n : undefined;\n\n // Explicitly disabled at page level overrides global enabled\n const effectiveStickyBar =\n currentPage.sticky_bar && !currentPage.sticky_bar.enabled\n ? undefined\n : stickyBarConfig;\n\n const stickyButtonText =\n effectiveStickyBar?.button_text ||\n currentPage.submit_label ||\n (isLastPage ? \"Submit\" : \"Continue\");\n\n return (\n <div\n className={`cf-page min-h-screen ${currentPage.className || \"\"}`}\n style={{ ...fontStyle, background: 'linear-gradient(180deg, #f8f9fc 0%, #f0f2f7 100%)', ...currentPage.style as React.CSSProperties }}\n data-page-id={currentPageId}\n >\n <ElementInspector context={inspectorContext} />\n {sandboxOf && <SandboxBanner />}\n {showResumeModal && <ResumeModal themeColor={themeColor} onResume={handleResume} onStartOver={handleStartOver} />}\n {activePopupId && activePopupConfig && (\n <Popup\n popupId={activePopupId}\n config={activePopupConfig}\n themeColor={themeColor}\n hints={hints}\n onDismiss={handlePopupDismiss}\n onFormSubmit={handlePopupFormSubmit}\n onTrack={track}\n />\n )}\n <CartButton itemCount={cartItems.length} onClick={toggleCart} themeColor={themeColor} cartSettings={catalog.settings.cart} />\n <CartDrawer items={cartItems} isOpen={cartOpen} onToggle={toggleCart} onRemove={removeFromCart} onCheckout={catalog.settings.checkout ? handleGoToCheckout : undefined} themeColor={themeColor} cartSettings={catalog.settings.cart} />\n\n {/* Progress line */}\n {catalog.settings.progress_line?.enabled && (() => {\n const pl = catalog.settings.progress_line!;\n const plHeight = pl.height ?? 4;\n const plColor = pl.color || themeColor;\n const isBelow = pl.position === \"below_topbar\";\n return (\n <div\n className={`fixed left-0 right-0 ${isBelow ? \"z-[40]\" : \"top-0 z-[60]\"}`}\n style={isBelow ? { top: `${topBarHeight || 48}px`, height: plHeight, backgroundColor: `${plColor}15` } : { height: plHeight, backgroundColor: `${plColor}15` }}\n role=\"progressbar\"\n aria-valuenow={Math.round(progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label=\"Page progress\"\n >\n <div\n style={{\n width: `${progress}%`,\n height: plHeight,\n backgroundColor: plColor,\n transition: \"width 0.4s ease\",\n }}\n />\n </div>\n );\n })()}\n\n {/* Fixed top bar */}\n {topBarEnabled && (\n <div ref={topBarRef} className={`cf-topbar fixed top-0 left-0 right-0 z-50 border-b border-gray-200/60 ${topBar?.className || \"\"}`} style={topBar?.style as React.CSSProperties} data-component-id=\"__top_bar\" data-component-type=\"top_bar\" data-page-id={currentPageId}>\n {topBar?.announcement && (topBar.announcement.text || topBar.announcement.html) && (\n <div\n className={`cf-topbar-announcement text-center text-sm py-2 px-4 ${topBar.announcement.className || \"\"}`}\n style={{\n backgroundColor: topBar.announcement.bg_color || themeColor,\n color: topBar.announcement.text_color || \"#ffffff\",\n ...topBar.announcement.style as React.CSSProperties,\n }}\n >\n {topBar.announcement.html\n ? <div dangerouslySetInnerHTML={{ __html: topBar.announcement.html }} />\n : <span>{topBar.announcement.text}</span>\n }\n </div>\n )}\n <div className=\"relative flex items-center justify-center px-4 py-3 min-h-[48px]\">\n {topBarShowBack && hasHistory && (\n <button\n onClick={handleBack}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-9 h-9 flex items-center justify-center rounded-xl text-gray-400 hover:text-gray-700 hover:bg-gray-100/80 transition-all duration-200\"\n aria-label=\"Go back\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" />\n </svg>\n </button>\n )}\n\n {topBar?.custom_html ? (\n <div dangerouslySetInnerHTML={{ __html: topBar.custom_html }} />\n ) : (\n <>\n {topBar?.title && (\n <span className={`text-sm text-gray-700 ${\n topBar.title_weight === \"light\" ? \"font-light\" :\n topBar.title_weight === \"normal\" ? \"font-normal\" :\n topBar.title_weight === \"semibold\" ? \"font-semibold\" :\n topBar.title_weight === \"bold\" ? \"font-bold\" :\n \"font-medium\"\n }`}>{topBar.title}</span>\n )}\n {topBar?.countdown && (\n <Countdown\n targetDate={topBar.countdown.target_date}\n label={topBar.countdown.label}\n expiredText={topBar.countdown.expired_text}\n themeColor={themeColor}\n />\n )}\n {topBarShowProgress && !topBar?.countdown && (\n hasStepper ? (\n <Stepper steps={progressSteps} currentPageId={currentPageId} themeColor={themeColor} />\n ) : catalog.settings.progress_bar ? (\n <div className=\"w-full max-w-sm h-1.5 bg-gray-200/80 rounded-full overflow-hidden\" role=\"progressbar\" aria-valuenow={Math.round(progress)} aria-valuemin={0} aria-valuemax={100} aria-label=\"Form progress\">\n <div\n className=\"progress-bar-fill h-full rounded-full\"\n style={{ width: `${progress}%`, backgroundColor: themeColor }}\n />\n </div>\n ) : null\n )}\n </>\n )}\n </div>\n </div>\n )}\n\n {/* Page content */}\n <div className={`${currentPage.max_width?.startsWith(\"max-w-\") ? currentPage.max_width : \"max-w-2xl\"} mx-auto px-6 pb-8`} style={{ paddingTop: topBarEnabled ? `${(topBarHeight || 48) + 48}px` : \"2rem\", ...(currentPage.max_width && !currentPage.max_width.startsWith(\"max-w-\") ? { maxWidth: currentPage.max_width } : {}), ...(pageTransitioning ? { visibility: \"hidden\" as const } : {}) }}>\n {currentPage.description && (\n <p className=\"text-sm text-gray-400 mb-8 text-center font-medium tracking-wide\" style={{ fontFamily: 'var(--font-display)' }}>\n {currentPage.description}\n </p>\n )}\n\n <PageRenderer\n key={currentPageId}\n page={currentPage}\n formState={formState}\n prefilledIds={prefilledIds}\n onFieldChange={handleFieldChange}\n onFieldBlur={handleFieldBlur}\n themeColor={themeColor}\n onNext={handleNext}\n onAction={handleAction}\n isLastPage={isLastPage}\n validationErrors={validationErrors}\n quizScores={quizScores}\n allPages={catalog.pages}\n tracerContext={routingContext}\n onVideoStateChange={handleVideoStateChange}\n propOverrides={propOverrides}\n quizRevealed={quizRevealedPages.has(currentPageId)}\n buttonDisabled={buttonDisabled}\n buttonLoading={buttonLoading}\n pageTransition={pageTransitionStyle}\n />\n\n <div className=\"mt-10 text-center text-[11px] text-gray-300 font-medium tracking-wide\" style={{ fontFamily: 'var(--font-display)' }}>\n Powered by Catalog Kit\n </div>\n </div>\n\n {/* Sticky bottom bar */}\n {effectiveStickyBar && (\n <StickyBottomBar\n key={currentPageId}\n config={effectiveStickyBar}\n formState={formState}\n cartItems={cartItems}\n themeColor={themeColor}\n defaultButtonText={stickyButtonText}\n onNext={handleNext}\n onAction={(actionId: string) => {\n const action = currentPage.actions?.find((a) => a.id === actionId);\n if (action) {\n handleAction(action);\n }\n }}\n onFieldChange={handleFieldChange}\n onFieldAndNavigate={handleFieldAndNavigate}\n onBack={hasHistory ? handleBack : undefined}\n showBack={hasHistory && !currentPage.hide_back}\n buttonDisabled={buttonDisabled}\n buttonLoading={buttonLoading}\n buttonDisabledMessage={currentPage.button_disabled_message}\n />\n )}\n </div>\n );\n};\n","// ============================================================\n// Shared condition evaluation engine\n// Used by both web frontend (browser) and API (server-side agent sessions)\n// ============================================================\n\nimport type {\n ConditionRule,\n ConditionGroup,\n ConditionOperator,\n FormState,\n TracerContext,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Value resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveValue(\n rule: ConditionRule,\n formState: FormState,\n context: TracerContext\n): any {\n const source = rule.source ?? \"field\";\n\n switch (source) {\n case \"field\":\n return rule.field != null ? formState[rule.field] : undefined;\n case \"url_param\":\n return rule.param != null ? context.url_params[rule.param] : undefined;\n case \"hint\":\n return rule.param != null ? context.hints[rule.param] : undefined;\n case \"tracer_prop\":\n return rule.param != null\n ? context[rule.param as keyof TracerContext]\n : undefined;\n case \"score\": {\n const scores = context.quiz_scores;\n if (!scores) return 0;\n const param = rule.param ?? rule.field ?? \"total\";\n switch (param) {\n case \"total\":\n return scores.total;\n case \"max\":\n return scores.max;\n case \"percent\":\n return scores.percent;\n case \"correct_count\":\n return scores.correct_count;\n case \"question_count\":\n return scores.question_count;\n default: {\n const answer = scores.answers.find((a) => a.component_id === param);\n return answer ? answer.points_earned : 0;\n }\n }\n }\n case \"video\": {\n const videoState = context.video_state;\n if (!videoState) return undefined;\n const compId = rule.field;\n if (!compId || !videoState[compId]) return undefined;\n const metric = rule.param ?? \"watch_percent\";\n return (videoState[compId] as any)[metric];\n }\n default:\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Operator evaluation\n// ---------------------------------------------------------------------------\n\nfunction applyOperator(\n operator: ConditionOperator,\n actual: any,\n expected: any\n): boolean {\n switch (operator) {\n case \"equals\":\n return String(actual ?? \"\") === String(expected ?? \"\");\n\n case \"not_equals\":\n return String(actual ?? \"\") !== String(expected ?? \"\");\n\n case \"contains\":\n if (typeof actual === \"string\") return actual.includes(String(expected));\n if (Array.isArray(actual)) return actual.includes(expected);\n return false;\n\n case \"not_contains\":\n if (typeof actual === \"string\") return !actual.includes(String(expected));\n if (Array.isArray(actual)) return !actual.includes(expected);\n return true;\n\n case \"greater_than\":\n return Number(actual) > Number(expected);\n\n case \"greater_than_or_equal\":\n return Number(actual) >= Number(expected);\n\n case \"less_than\":\n return Number(actual) < Number(expected);\n\n case \"less_than_or_equal\":\n return Number(actual) <= Number(expected);\n\n case \"is_empty\":\n return (\n actual == null ||\n actual === \"\" ||\n (Array.isArray(actual) && actual.length === 0)\n );\n\n case \"is_not_empty\":\n return !(\n actual == null ||\n actual === \"\" ||\n (Array.isArray(actual) && actual.length === 0)\n );\n\n case \"matches_regex\":\n try {\n const pattern = String(expected);\n if (pattern.length > 200 || /(\\+\\+|\\*\\*|\\{\\d{3,}\\})/.test(pattern)) return false;\n return new RegExp(pattern).test(String(actual ?? \"\"));\n } catch {\n return false;\n }\n\n case \"in\":\n if (Array.isArray(expected)) return expected.includes(actual);\n if (typeof expected === \"string\")\n return expected.split(\",\").map((s) => s.trim()).includes(String(actual));\n return false;\n\n default:\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Condition evaluation\n// ---------------------------------------------------------------------------\n\nfunction isConditionGroup(\n rule: ConditionRule | ConditionGroup\n): rule is ConditionGroup {\n return \"match\" in rule && \"rules\" in rule;\n}\n\nexport function evaluateCondition(\n rule: ConditionRule,\n formState: FormState,\n context: TracerContext\n): boolean {\n const actual = resolveValue(rule, formState, context);\n return applyOperator(rule.operator, actual, rule.value);\n}\n\nexport function evaluateConditionGroup(\n group: ConditionGroup,\n formState: FormState,\n context: TracerContext\n): boolean {\n const evaluator = (item: ConditionRule | ConditionGroup): boolean => {\n if (isConditionGroup(item)) {\n return evaluateConditionGroup(item, formState, context);\n }\n return evaluateCondition(item, formState, context);\n };\n\n if (group.match === \"all\") {\n return group.rules.every(evaluator);\n }\n return group.rules.some(evaluator);\n}\n","// ============================================================\n// Shared routing engine\n// Used by both web frontend (browser) and API (server-side agent sessions)\n// ============================================================\n\nimport type {\n Routing,\n FormState,\n TracerContext,\n CatalogPage,\n} from \"../types\";\nimport { evaluateConditionGroup } from \"./conditions\";\n\n// ---------------------------------------------------------------------------\n// Routing — determine next page\n// ---------------------------------------------------------------------------\n\nexport function getNextPage(\n routing: Routing,\n currentPageId: string,\n formState: FormState,\n context: TracerContext\n): string | null {\n const outgoing = routing.edges.filter((e) => e.from === currentPageId);\n\n if (outgoing.length === 0) return null;\n\n const sorted = [...outgoing].sort((a, b) => {\n if (a.is_default && !b.is_default) return 1;\n if (!a.is_default && b.is_default) return -1;\n return (a.priority ?? Infinity) - (b.priority ?? Infinity);\n });\n\n for (const edge of sorted) {\n if (!edge.conditions) {\n return edge.to;\n }\n if (evaluateConditionGroup(edge.conditions, formState, context)) {\n return edge.to;\n }\n }\n\n const defaultEdge = sorted.find((e) => e.is_default);\n return defaultEdge?.to ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Progress (BFS depth)\n// ---------------------------------------------------------------------------\n\nexport function getProgress(\n routing: Routing,\n currentPageId: string,\n pages: Record<string, CatalogPage | any>\n): number {\n const adjacency = new Map<string, Set<string>>();\n for (const edge of routing.edges) {\n if (!edge.to) continue;\n if (!adjacency.has(edge.from)) adjacency.set(edge.from, new Set());\n adjacency.get(edge.from)!.add(edge.to);\n }\n\n const depthMap = new Map<string, number>();\n const queue: [string, number][] = [[routing.entry, 0]];\n depthMap.set(routing.entry, 0);\n\n while (queue.length > 0) {\n const [node, depth] = queue.shift()!;\n const neighbours = adjacency.get(node);\n if (!neighbours) continue;\n for (const next of neighbours) {\n if (!depthMap.has(next)) {\n depthMap.set(next, depth + 1);\n queue.push([next, depth + 1]);\n }\n }\n }\n\n const currentDepth = depthMap.get(currentPageId) ?? 0;\n const maxDepth = Math.max(...depthMap.values(), 0);\n\n if (maxDepth === 0) return 0;\n\n return Math.round((currentDepth / maxDepth) * 100);\n}\n","// ============================================================\n// Shared form validation engine\n// Used by both web frontend (browser) and API (server-side agent sessions)\n// ============================================================\n\nimport type {\n CatalogPage,\n CatalogComponent,\n FormState,\n TracerContext,\n InputComponentType,\n} from \"../types\";\nimport { evaluateConditionGroup } from \"./conditions\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ValidationError {\n componentId: string;\n message: string;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst INPUT_TYPES = new Set<string>([\n \"short_text\", \"long_text\", \"rich_text\", \"email\", \"phone\", \"url\",\n \"address\", \"number\", \"currency\", \"date\", \"datetime\", \"time\",\n \"date_range\", \"dropdown\", \"multiselect\", \"multiple_choice\",\n \"checkboxes\", \"picture_choice\", \"switch\", \"checkbox\",\n \"choice_matrix\", \"ranking\", \"star_rating\", \"slider\",\n \"opinion_scale\", \"file_upload\", \"signature\", \"password\", \"location\",\n]);\n\nconst BOOLEAN_TYPES = new Set([\"switch\", \"checkbox\"]);\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\n/**\n * Validate all visible, required fields on a page.\n * Returns an array of errors (empty = valid).\n *\n * @param page - The page schema\n * @param formState - Current form values\n * @param context - Tracer context (for condition evaluation)\n * @param prefilledIds - Component IDs that were prefilled (optional, browser only)\n * @param overrides - Dynamic prop overrides from scripts/CatalogKit API (optional)\n */\nexport function validatePage(\n page: CatalogPage,\n formState: FormState,\n context: TracerContext,\n prefilledIds?: Set<string>,\n overrides?: Record<string, Record<string, any>>\n): ValidationError[] {\n const errors: ValidationError[] = [];\n\n for (const comp of page.components) {\n if (!INPUT_TYPES.has(comp.type)) continue;\n\n // Merge dynamic overrides\n const props = { ...comp.props, ...overrides?.[comp.id] };\n\n // Skip hidden components\n if (comp.hidden || props.hidden) continue;\n if (comp.visibility) {\n if (!evaluateConditionGroup(comp.visibility, formState, context)) continue;\n }\n if (comp.prefill_mode === \"hidden\" && formState[comp.id] != null && formState[comp.id] !== \"\") continue;\n\n const value = formState[comp.id];\n\n // Skip readonly fields\n if (props.readonly || (comp.prefill_mode === \"readonly\" && value != null && value !== \"\")) continue;\n\n // Required check\n if (props.required) {\n if (BOOLEAN_TYPES.has(comp.type)) {\n if (!value) {\n errors.push({ componentId: comp.id, message: \"This field is required\" });\n continue;\n }\n } else {\n const isEmpty =\n value == null ||\n value === \"\" ||\n (Array.isArray(value) && value.length === 0);\n if (isEmpty) {\n errors.push({ componentId: comp.id, message: \"This field is required\" });\n continue;\n }\n }\n }\n\n // Type-specific validation (only if field has a value)\n if (value != null && value !== \"\") {\n if (comp.type === \"email\") {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(value))) {\n errors.push({ componentId: comp.id, message: \"Please enter a valid email address\" });\n }\n } else if (comp.type === \"url\") {\n try {\n const urlStr = String(value);\n new URL(urlStr.includes(\"://\") ? urlStr : `https://${urlStr}`);\n } catch {\n errors.push({ componentId: comp.id, message: \"Please enter a valid URL\" });\n }\n } else if (comp.type === \"number\") {\n const num = Number(value);\n if (isNaN(num)) {\n errors.push({ componentId: comp.id, message: \"Please enter a valid number\" });\n } else {\n if (props.min != null && num < props.min) {\n errors.push({ componentId: comp.id, message: `Must be at least ${props.min}` });\n }\n if (props.max != null && num > props.max) {\n errors.push({ componentId: comp.id, message: `Must be at most ${props.max}` });\n }\n }\n } else if (comp.type === \"short_text\" || comp.type === \"long_text\") {\n const str = String(value);\n if (props.min_length && str.length < props.min_length) {\n errors.push({ componentId: comp.id, message: `Must be at least ${props.min_length} characters` });\n }\n }\n }\n\n // Nested input validation for checkboxes/multiple_choice with option inputs\n if ((comp.type === \"checkboxes\" || comp.type === \"multiple_choice\") && Array.isArray(value) && props.required) {\n const options: any[] = props.options || [];\n // require_all: every option must be selected\n if (props.require_all) {\n for (const opt of options) {\n if (!value.includes(opt.value)) {\n errors.push({ componentId: comp.id, message: \"All options must be selected\" });\n break;\n }\n }\n }\n for (const opt of options) {\n if (!opt.inputs || opt.inputs.length === 0) continue;\n if (!props.require_all && !value.includes(opt.value)) continue;\n for (const input of opt.inputs) {\n // required can be at input.required or input.props.required\n const isRequired = input.required || input.props?.required;\n if (!isRequired) continue;\n const nestedId = `${comp.id}.${opt.value}.${input.id}`;\n const nestedValue = formState[nestedId];\n if (nestedValue == null || nestedValue === \"\" || (Array.isArray(nestedValue) && nestedValue.length === 0)) {\n errors.push({ componentId: nestedId, message: \"This field is required\" });\n }\n }\n }\n }\n }\n\n return errors;\n}\n\n// ---------------------------------------------------------------------------\n// Flatten visible fields for a page (used by agent API)\n// ---------------------------------------------------------------------------\n\nexport interface FlatField {\n id: string;\n type: string;\n label?: string;\n required: boolean;\n agent_hint?: string;\n options?: { value: string; label: string; description?: string; agent_hint?: string }[];\n min?: number;\n max?: number;\n min_length?: number;\n max_length?: number;\n placeholder?: string;\n default_value?: any;\n}\n\n/**\n * Extract visible input fields from a page, given current form state.\n * Used by the agent API to return only the fields relevant at this step.\n */\nexport function getVisibleFields(\n page: CatalogPage,\n formState: FormState,\n context: TracerContext,\n): FlatField[] {\n const fields: FlatField[] = [];\n\n for (const comp of page.components) {\n if (!INPUT_TYPES.has(comp.type)) continue;\n\n const props = comp.props || {};\n\n // Skip hidden\n if (comp.hidden || props.hidden) continue;\n if (comp.visibility) {\n if (!evaluateConditionGroup(comp.visibility, formState, context)) continue;\n }\n if (comp.prefill_mode === \"hidden\" && formState[comp.id] != null && formState[comp.id] !== \"\") continue;\n\n const field: FlatField = {\n id: comp.id,\n type: comp.type,\n label: props.label,\n required: !!props.required,\n agent_hint: (comp as any).agent_hint,\n placeholder: props.placeholder,\n default_value: props.default_value,\n };\n\n // Add options for choice-based fields\n if (props.options) {\n field.options = props.options.map((opt: any) => ({\n value: opt.value,\n label: opt.label,\n description: opt.description,\n agent_hint: opt.agent_hint,\n }));\n }\n\n // Add constraints\n if (props.min != null) field.min = props.min;\n if (props.max != null) field.max = props.max;\n if (props.min_length != null) field.min_length = props.min_length;\n if (props.max_length != null) field.max_length = props.max_length;\n\n fields.push(field);\n }\n\n return fields;\n}\n","import { PopupTrigger, VideoState } from \"@shared/types\";\n\n/**\n * Parse cooldown string like \"24h\", \"7d\", \"1h\", \"30m\" into milliseconds.\n */\nfunction parseCooldown(cooldown: string): number {\n const match = cooldown.match(/^(\\d+)(m|h|d)$/);\n if (!match) return 0;\n const [, num, unit] = match;\n const n = parseInt(num, 10);\n if (unit === \"m\") return n * 60 * 1000;\n if (unit === \"h\") return n * 60 * 60 * 1000;\n if (unit === \"d\") return n * 24 * 60 * 60 * 1000;\n return 0;\n}\n\nfunction getCooldownKey(popupId: string): string {\n return `cf_popup_cooldown_${popupId}`;\n}\n\n/** Check if a popup is still in cooldown. */\nexport function isInCooldown(popupId: string, cooldown?: string): boolean {\n if (!cooldown) return false;\n try {\n const stored = localStorage.getItem(getCooldownKey(popupId));\n if (!stored) return false;\n const expiresAt = parseInt(stored, 10);\n return Date.now() < expiresAt;\n } catch {\n return false;\n }\n}\n\n/** Set cooldown for a popup. */\nexport function setCooldown(popupId: string, cooldown?: string): void {\n if (!cooldown) return;\n const ms = parseCooldown(cooldown);\n if (ms <= 0) return;\n try {\n localStorage.setItem(getCooldownKey(popupId), String(Date.now() + ms));\n } catch {\n // localStorage unavailable\n }\n}\n\nexport interface TriggerCleanup {\n destroy: () => void;\n}\n\n/**\n * Set up a trigger that fires `onTrigger` when conditions are met.\n * Returns a cleanup object.\n */\nexport function setupTrigger(\n trigger: PopupTrigger,\n onTrigger: () => void\n): TriggerCleanup {\n const delay = trigger.delay ?? 0;\n let armed = delay <= 0;\n let delayTimer: ReturnType<typeof setTimeout> | undefined;\n let inactivityTimer: ReturnType<typeof setTimeout> | undefined;\n let timedTimer: ReturnType<typeof setTimeout> | undefined;\n\n // Arm after delay\n if (delay > 0) {\n delayTimer = setTimeout(() => {\n armed = true;\n }, delay);\n }\n\n const fire = () => {\n if (!armed) return;\n onTrigger();\n };\n\n switch (trigger.type) {\n case \"exit_intent\": {\n let fired = false;\n const fireSafe = () => {\n if (fired) return;\n fired = true;\n fire();\n };\n\n // Primary: mouseleave on document — fires when cursor exits any edge\n const handleMouseLeave = (e: MouseEvent) => {\n // Trigger when mouse exits through top or sides of viewport\n if (e.clientY <= 0 || e.clientX <= 0 || e.clientX >= window.innerWidth - 1) {\n fireSafe();\n }\n };\n\n // Fallback: mousemove near top edge (catches fast mouse movements that skip mouseleave)\n const handleMouseMove = (e: MouseEvent) => {\n if (e.clientY <= 5 && e.movementY < -5) {\n fireSafe();\n }\n };\n\n // Mobile: detect back button / visibility change / tab switch\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") {\n fireSafe();\n }\n };\n\n // Mobile: detect touch scroll to top (pull to refresh gesture)\n let touchStartY = 0;\n const handleTouchStart = (e: TouchEvent) => {\n touchStartY = e.touches[0]?.clientY ?? 0;\n };\n const handleTouchEnd = (e: TouchEvent) => {\n const touchEndY = e.changedTouches[0]?.clientY ?? 0;\n // Swiped down from near top of page\n if (touchStartY < 50 && touchEndY - touchStartY > 80) {\n fireSafe();\n }\n };\n\n document.addEventListener(\"mouseleave\", handleMouseLeave);\n document.addEventListener(\"mousemove\", handleMouseMove, { passive: true });\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n document.addEventListener(\"touchstart\", handleTouchStart, { passive: true });\n document.addEventListener(\"touchend\", handleTouchEnd, { passive: true });\n return {\n destroy: () => {\n if (delayTimer) clearTimeout(delayTimer);\n document.removeEventListener(\"mouseleave\", handleMouseLeave);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n document.removeEventListener(\"touchstart\", handleTouchStart);\n document.removeEventListener(\"touchend\", handleTouchEnd);\n },\n };\n }\n\n case \"scroll_depth\": {\n const percent = trigger.percent ?? 50;\n let triggered = false;\n const handleScroll = () => {\n if (triggered) return;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const docHeight = document.documentElement.scrollHeight - window.innerHeight;\n if (docHeight <= 0) return;\n const scrollPercent = (scrollTop / docHeight) * 100;\n if (scrollPercent >= percent) {\n triggered = true;\n fire();\n }\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return {\n destroy: () => {\n if (delayTimer) clearTimeout(delayTimer);\n window.removeEventListener(\"scroll\", handleScroll);\n },\n };\n }\n\n case \"inactive\": {\n const seconds = trigger.seconds ?? 30;\n let lastActivity = Date.now();\n\n const resetInactivity = () => {\n lastActivity = Date.now();\n if (inactivityTimer) clearTimeout(inactivityTimer);\n inactivityTimer = setTimeout(() => {\n fire();\n }, seconds * 1000);\n };\n\n const events = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\", \"click\"];\n events.forEach((evt) => document.addEventListener(evt, resetInactivity, { passive: true }));\n // Start the initial timer\n inactivityTimer = setTimeout(() => fire(), seconds * 1000);\n\n return {\n destroy: () => {\n if (delayTimer) clearTimeout(delayTimer);\n if (inactivityTimer) clearTimeout(inactivityTimer);\n events.forEach((evt) => document.removeEventListener(evt, resetInactivity));\n },\n };\n }\n\n case \"timed\": {\n const seconds = trigger.seconds ?? 10;\n timedTimer = setTimeout(() => fire(), (delay + seconds * 1000));\n return {\n destroy: () => {\n if (delayTimer) clearTimeout(delayTimer);\n if (timedTimer) clearTimeout(timedTimer);\n },\n };\n }\n\n case \"page_count\": {\n // Page count is handled externally — this is a no-op trigger setup\n // The CatalogRenderer checks page count and fires directly\n return { destroy: () => { if (delayTimer) clearTimeout(delayTimer); } };\n }\n\n case \"custom\":\n case \"video_progress\":\n case \"video_chapter\": {\n // These triggers are checked externally (by CatalogRenderer on video state changes)\n return { destroy: () => { if (delayTimer) clearTimeout(delayTimer); } };\n }\n\n default:\n return { destroy: () => {} };\n }\n}\n\n/**\n * Check if a video trigger should fire based on current video state.\n * Returns true if the trigger condition is met.\n */\nexport function checkVideoTrigger(\n trigger: PopupTrigger,\n videoState: VideoState\n): boolean {\n const compId = trigger.video_component_id;\n\n if (trigger.type === \"video_progress\") {\n const threshold = trigger.watch_percent ?? 50;\n if (compId) {\n const state = videoState[compId];\n return state ? state.watch_percent >= threshold : false;\n }\n // Check any video\n return Object.values(videoState).some((s) => s.watch_percent >= threshold);\n }\n\n if (trigger.type === \"video_chapter\") {\n const targetChapter = trigger.chapter_index ?? 1;\n if (compId) {\n const state = videoState[compId];\n return state ? state.current_chapter >= targetChapter : false;\n }\n return Object.values(videoState).some((s) => s.current_chapter >= targetChapter);\n }\n\n return false;\n}\n","import React, { useState, useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { CatalogComponent, CatalogPage, PageAction, ConditionGroup, FormState, TracerContext, QuizScores, QuizAnswer, VideoComponentState, PageTransition } from \"@shared/types\";\nimport { evaluateConditionGroup } from \"@shared/engine/conditions\";\nimport { InputComponentMap } from \"./inputs\";\nimport { DisplayComponentMap, PaymentButton } from \"./display\";\n\ninterface ValidationError {\n componentId: string;\n message: string;\n}\n\ninterface PageRendererProps {\n page: CatalogPage;\n formState: FormState;\n prefilledIds?: Set<string>;\n onFieldChange: (componentId: string, value: any) => void;\n onFieldBlur?: (componentId: string) => void;\n themeColor: string;\n onNext: () => void;\n onAction: (action: PageAction) => void;\n isLastPage: boolean;\n isCover?: boolean;\n /** When true, the sticky bottom bar handles CTA — hide the inline button */\n useStickyBar?: boolean;\n validationErrors?: ValidationError[];\n /** Quiz scores for reveal_answers rendering */\n quizScores?: QuizScores;\n /** All catalog pages (needed for quiz answer reveal to find component labels) */\n allPages?: Record<string, CatalogPage>;\n /** Tracer context for visibility condition evaluation (url_params, hints, etc.) */\n tracerContext?: TracerContext;\n /** Callback for video player state changes */\n onVideoStateChange?: (componentId: string, state: VideoComponentState) => void;\n /** Dynamic component prop overrides from script hooks */\n propOverrides?: Record<string, Record<string, any>>;\n /** When true, quiz components with reveal_on_select should show their answers */\n quizRevealed?: boolean;\n /** When true, the Continue/Submit button is disabled */\n buttonDisabled?: boolean;\n /** When true, the Continue/Submit button shows a loading spinner */\n buttonLoading?: boolean;\n /** Page transition style (default: \"slide-up\") */\n pageTransition?: PageTransition;\n}\n\n// Fallback tracer for visibility evaluation when none provided\nconst defaultVisibilityContext: TracerContext = {\n tracer_id: \"\",\n url_params: {},\n hints: {},\n};\n\nfunction isVisible(\n visibility: ConditionGroup | undefined,\n formState: FormState,\n context: TracerContext\n): boolean {\n if (!visibility) return true;\n return evaluateConditionGroup(visibility, formState, context);\n}\n\n/** Input types that support the copyable prop (text-like values) */\nconst COPYABLE_TYPES = new Set([\n \"short_text\", \"long_text\", \"rich_text\", \"email\", \"phone\", \"url\",\n \"number\", \"currency\", \"date\", \"datetime\", \"time\", \"password\",\n \"dropdown\", \"address\",\n]);\n\n/** Copy-to-clipboard button for readonly and copyable fields */\nconst CopyButton: React.FC<{ text: string; themeColor: string }> = ({ text, themeColor }) => {\n const [copied, setCopied] = useState(false);\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(text).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }, [text]);\n\n return (\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"flex-shrink-0 p-1.5 rounded-lg transition-all duration-200 hover:bg-gray-100 active:scale-95\"\n aria-label=\"Copy to clipboard\"\n title=\"Copy to clipboard\"\n >\n {copied ? (\n <svg className=\"w-4 h-4 text-green-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\n </svg>\n ) : (\n <svg className=\"w-4 h-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9.75a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184\" />\n </svg>\n )}\n </button>\n );\n};\n\n/** Tooltip info icon with hover popover */\nconst TooltipIcon: React.FC<{ text: string; isCover?: boolean }> = ({ text, isCover }) => {\n const [show, setShow] = useState(false);\n return (\n <span\n className=\"relative inline-flex ml-1 cursor-help\"\n onMouseEnter={() => setShow(true)}\n onMouseLeave={() => setShow(false)}\n onClick={() => setShow((v) => !v)}\n role=\"button\"\n tabIndex={0}\n aria-label=\"More information\"\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); setShow((v) => !v); } }}\n >\n <svg\n className={`w-3.5 h-3.5 ${isCover ? \"text-white/50\" : \"text-gray-400\"}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" d=\"M12 16v-4m0-4h.01\" />\n </svg>\n {show && (\n <span role=\"tooltip\" className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 w-56 rounded-lg bg-gray-900 text-white text-xs px-3 py-2 shadow-lg z-50 leading-relaxed pointer-events-none\">\n {text}\n <span className=\"absolute top-full left-1/2 -translate-x-1/2 border-4 border-transparent border-t-gray-900\" />\n </span>\n )}\n </span>\n );\n};\n\nfunction formatOtherValue(v: string): string {\n if (v === \"__other__\") return \"Other\";\n if (v.startsWith(\"__other__:\")) {\n const text = v.slice(\"__other__:\".length);\n return text ? `Other: ${text}` : \"Other\";\n }\n return v;\n}\n\nfunction renderReadonlyValue(value: any, props: Record<string, any>): string {\n if (value == null || value === \"\") return \"—\";\n if (Array.isArray(value)) {\n // Map values to labels if options exist\n const options: { value: string; label: string }[] = props.options || [];\n return value\n .map((v: string) => {\n if (typeof v === \"string\" && v.startsWith(\"__other__\")) return formatOtherValue(v);\n return options.find((o) => o.value === v)?.label || v;\n })\n .join(\", \");\n }\n // Handle \"other\" single values\n if (typeof value === \"string\" && value.startsWith(\"__other__\")) {\n return formatOtherValue(value);\n }\n // Map single value to label\n const options: { value: string; label: string }[] = props.options || [];\n const match = options.find((o) => o.value === value);\n return match ? match.label : String(value);\n}\n\nfunction renderComponent(\n component: CatalogComponent,\n formState: FormState,\n onFieldChange: (id: string, value: any) => void,\n themeColor: string,\n isCover?: boolean,\n prefilledIds?: Set<string>,\n onFieldBlur?: (id: string) => void,\n validationErrors?: ValidationError[],\n tracerContext?: TracerContext,\n onVideoStateChange?: (componentId: string, state: VideoComponentState) => void,\n propOverrides?: Record<string, Record<string, any>>,\n onSubmit?: () => void,\n quizRevealed?: boolean,\n): React.ReactNode {\n const { id, type } = component;\n const props = propOverrides?.[id] ? { ...component.props, ...propOverrides[id] } : component.props;\n const compClass = component.className || \"\";\n const compStyle = component.style as React.CSSProperties | undefined;\n const visCtx = tracerContext || defaultVisibilityContext;\n\n // --- Hidden flag (component-level OR props-level via script overrides) ---\n if (component.hidden || props.hidden) {\n return null;\n }\n\n // --- Visibility check ---\n if (!isVisible(component.visibility, formState, visCtx)) {\n return null;\n }\n\n // --- Prefill mode: hidden ---\n const hasValue = formState[id] != null && formState[id] !== \"\";\n const prefillMode = component.prefill_mode;\n if (prefillMode === \"hidden\" && hasValue) {\n return null;\n }\n\n // --- Display components (no prefill logic) ---\n const DisplayComp = DisplayComponentMap[type];\n if (DisplayComp) {\n return (\n <div key={id} className={compClass} style={compStyle} id={id} data-component-id={id} data-component-type={type}>\n <DisplayComp\n props={props}\n themeColor={themeColor}\n isCover={isCover}\n componentId={id}\n onVideoStateChange={type === \"video\" ? onVideoStateChange : undefined}\n formState={formState}\n onFieldChange={onFieldChange}\n />\n </div>\n );\n }\n\n // --- Readonly: explicit prop OR prefill_mode readonly with a value ---\n const isReadonly = props.readonly || (prefillMode === \"readonly\" && hasValue);\n\n // --- Input components ---\n const InputComp = InputComponentMap[type];\n if (InputComp) {\n if (isReadonly) {\n const displayValue = renderReadonlyValue(formState[id], props);\n const hasDisplayValue = formState[id] != null && formState[id] !== \"\";\n return (\n <div key={id} className={`space-y-1.5 ${compClass}`} style={compStyle} id={id} data-component-id={id} data-component-type={type}>\n {props.label && (\n <label\n className={`block text-base font-medium ${\n isCover ? \"text-white\" : \"text-gray-700\"\n }`}\n >\n {props.label}\n {props.required && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n )}\n {props.subheading && (\n <p className={`text-xs font-medium ${isCover ? \"text-white/60\" : \"text-gray-400\"}`}>\n {props.subheading}\n </p>\n )}\n {props.description && (\n <p className={`text-xs ${isCover ? \"text-white/70\" : \"text-gray-500\"}`}>\n {props.description}\n </p>\n )}\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n readOnly\n value={hasDisplayValue ? displayValue : \"\"}\n placeholder={props.placeholder ?? \"\"}\n className={`cf-input flex-1 cursor-default ${\n isCover ? \"bg-white/10 text-white border-white/20\" : \"bg-gray-50 text-gray-900 border-gray-200\"\n }`}\n />\n {hasDisplayValue && <CopyButton text={displayValue} themeColor={themeColor} />}\n </div>\n </div>\n );\n }\n\n const fieldError = validationErrors?.find((e) => e.componentId === id);\n\n return (\n <div key={id} className={`space-y-1.5 ${compClass}`} style={compStyle} id={id} data-component-id={id} data-component-type={type}>\n {props.label && (\n <label\n className={`block text-base font-medium ${\n isCover ? \"text-white\" : \"text-gray-700\"\n }`}\n >\n {props.label}\n {props.required && <span className=\"text-red-500 ml-1\">*</span>}\n {props.tooltip && <TooltipIcon text={props.tooltip} isCover={isCover} />}\n </label>\n )}\n {(props.sublabel || props.subheading) && (\n <p\n className={`text-xs font-medium ${\n isCover ? \"text-white/60\" : \"text-gray-400\"\n }`}\n >\n {props.sublabel || props.subheading}\n </p>\n )}\n {props.description && (\n <p\n className={`text-xs ${\n isCover ? \"text-white/70\" : \"text-gray-500\"\n }`}\n >\n {props.description}\n </p>\n )}\n <div onBlur={onFieldBlur ? () => onFieldBlur(id) : undefined} className={fieldError ? \"cf-field-error\" : \"\"}>\n {props.copyable && COPYABLE_TYPES.has(type) ? (\n <div className=\"flex items-start gap-1.5\">\n <div className=\"flex-1 min-w-0\">\n <InputComp\n props={props.quiz?.reveal_on_select ? { ...props, quiz: { ...props.quiz, _revealed: !!quizRevealed } } : props}\n value={formState[id]}\n onChange={(v: any) => onFieldChange(id, v)}\n themeColor={themeColor}\n onSubmit={onSubmit}\n formState={formState}\n onFieldChange={onFieldChange}\n componentId={id}\n />\n </div>\n {formState[id] != null && formState[id] !== \"\" && (\n <div className=\"pt-2\">\n <CopyButton text={String(formState[id])} themeColor={themeColor} />\n </div>\n )}\n </div>\n ) : (\n <InputComp\n props={props.quiz?.reveal_on_select ? { ...props, quiz: { ...props.quiz, _revealed: !!quizRevealed } } : props}\n value={formState[id]}\n onChange={(v: any) => onFieldChange(id, v)}\n themeColor={themeColor}\n onSubmit={onSubmit}\n formState={formState}\n onFieldChange={onFieldChange}\n componentId={id}\n />\n )}\n </div>\n {fieldError && (\n <p className=\"text-xs text-red-500 font-medium mt-1\" role=\"alert\">{fieldError.message}</p>\n )}\n </div>\n );\n }\n\n if (type === \"payment\") {\n return (\n <div key={id} className={compClass} style={compStyle} id={id} data-component-id={id} data-component-type={type}>\n <PaymentButton props={props} themeColor={themeColor} />\n </div>\n );\n }\n\n return (\n <div\n key={id}\n className=\"border-2 border-dashed border-gray-300 rounded-lg p-4 text-center text-gray-400 text-sm\"\n >\n Component: {type} ({id})\n </div>\n );\n}\n\n// --- Width-based row grouping ---\n\nconst WIDTH_FRACTIONS: Record<string, number> = {\n full: 1,\n half: 0.5,\n third: 1 / 3,\n two_thirds: 2 / 3,\n};\n\nconst WIDTH_CLASSES: Record<string, string> = {\n full: \"w-full\",\n half: \"w-full md:w-[calc(50%-0.625rem)]\",\n third: \"w-full md:w-[calc(33.333%-0.833rem)]\",\n two_thirds: \"w-full md:w-[calc(66.667%-0.417rem)]\",\n};\n\n/** Group components into rows based on their width property. Components without width (or width=\"full\") get their own row. */\nfunction groupIntoRows(components: CatalogComponent[]): CatalogComponent[][] {\n const rows: CatalogComponent[][] = [];\n let currentRow: CatalogComponent[] = [];\n let rowFill = 0;\n\n for (const comp of components) {\n const w = comp.width || \"full\";\n const fraction = WIDTH_FRACTIONS[w] ?? 1;\n\n if (fraction >= 1) {\n // Full-width: flush current row, then add as its own row\n if (currentRow.length > 0) {\n rows.push(currentRow);\n currentRow = [];\n rowFill = 0;\n }\n rows.push([comp]);\n } else if (rowFill + fraction > 1 + 0.01) {\n // Doesn't fit — flush and start new row\n rows.push(currentRow);\n currentRow = [comp];\n rowFill = fraction;\n } else {\n currentRow.push(comp);\n rowFill += fraction;\n // If row is full, flush it\n if (rowFill >= 1 - 0.01) {\n rows.push(currentRow);\n currentRow = [];\n rowFill = 0;\n }\n }\n }\n if (currentRow.length > 0) {\n rows.push(currentRow);\n }\n return rows;\n}\n\nfunction renderComponentRow(\n row: CatalogComponent[],\n formState: FormState,\n onFieldChange: (id: string, value: any) => void,\n themeColor: string,\n isCover?: boolean,\n prefilledIds?: Set<string>,\n onFieldBlur?: (id: string) => void,\n validationErrors?: ValidationError[],\n tracerContext?: TracerContext,\n onVideoStateChange?: (componentId: string, state: VideoComponentState) => void,\n propOverrides?: Record<string, Record<string, any>>,\n lastInputId?: string,\n onNext?: () => void,\n quizRevealed?: boolean,\n): React.ReactNode {\n // Single full-width component — render directly (no flex wrapper)\n if (row.length === 1 && (!row[0].width || row[0].width === \"full\")) {\n const submitHandler = row[0].id === lastInputId ? onNext : undefined;\n return renderComponent(row[0], formState, onFieldChange, themeColor, isCover, prefilledIds, onFieldBlur, validationErrors, tracerContext, onVideoStateChange, propOverrides, submitHandler, quizRevealed);\n }\n\n // Multi-column row\n return (\n <div className=\"flex flex-wrap gap-5 items-start\" key={row.map((c) => c.id).join(\"-\")}>\n {row.map((comp) => {\n const widthClass = WIDTH_CLASSES[comp.width || \"full\"] || WIDTH_CLASSES.full;\n const submitHandler = comp.id === lastInputId ? onNext : undefined;\n return (\n <div key={comp.id} className={widthClass}>\n {renderComponent(comp, formState, onFieldChange, themeColor, isCover, prefilledIds, onFieldBlur, validationErrors, tracerContext, onVideoStateChange, propOverrides, submitHandler, quizRevealed)}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction renderActionButton(\n action: PageAction,\n themeColor: string,\n onAction: (action: PageAction) => void\n): React.ReactNode {\n const style = action.style || \"primary\";\n const hasSide = !!action.side_statement;\n\n let btn: React.ReactNode;\n\n if (style === \"primary\") {\n btn = (\n <button\n onClick={() => onAction(action)}\n className={`cf-btn-primary ${hasSide ? \"flex-1\" : \"w-full\"} flex items-center justify-center text-white`}\n style={{ backgroundColor: themeColor }}\n >\n {action.icon && <span className=\"mr-2\">{action.icon}</span>}\n {action.label}\n </button>\n );\n } else if (style === \"secondary\") {\n btn = (\n <button\n onClick={() => onAction(action)}\n className={`${hasSide ? \"flex-1\" : \"w-full\"} flex items-center justify-center px-7 py-3.5 rounded-xl border-2 font-semibold transition-all duration-200 hover:shadow-md`}\n style={{ borderColor: themeColor, color: themeColor, fontFamily: 'var(--font-display)' }}\n >\n {action.icon && <span className=\"mr-2\">{action.icon}</span>}\n {action.label}\n </button>\n );\n } else if (style === \"danger\") {\n btn = (\n <button\n onClick={() => onAction(action)}\n className={`cf-btn-primary ${hasSide ? \"flex-1\" : \"w-full\"} flex items-center justify-center bg-red-500 text-white hover:bg-red-600`}\n >\n {action.icon && <span className=\"mr-2\">{action.icon}</span>}\n {action.label}\n </button>\n );\n } else {\n // ghost\n btn = (\n <button\n onClick={() => onAction(action)}\n className={`cf-btn-ghost ${hasSide ? \"flex-1\" : \"w-full\"} flex items-center justify-center`}\n style={{ color: `${themeColor}cc` }}\n >\n {action.icon && <span className=\"mr-2\">{action.icon}</span>}\n {action.label}\n </button>\n );\n }\n\n return (\n <div key={action.id} className=\"w-full\">\n {hasSide ? (\n <div className=\"flex items-center gap-4\">\n {btn}\n <span className=\"text-sm font-medium text-gray-600 shrink-0\">{action.side_statement}</span>\n </div>\n ) : btn}\n {action.reassurance && (\n <p className=\"text-xs text-gray-400 mt-1.5 text-center\">{action.reassurance}</p>\n )}\n </div>\n );\n}\n\n// --- Quiz Reveal Components ---\n\nfunction QuizScoreSummary({ scores, themeColor }: { scores: QuizScores; themeColor: string }) {\n const pct = scores.percent;\n const isPassing = pct >= 70;\n return (\n <div className=\"cf-card p-6 text-center space-y-3 mb-6\">\n <div\n className=\"w-20 h-20 rounded-full mx-auto flex items-center justify-center text-2xl font-bold text-white\"\n style={{ backgroundColor: isPassing ? themeColor : \"#ef4444\" }}\n >\n {pct}%\n </div>\n <p className=\"text-lg font-bold text-gray-900\" style={{ fontFamily: \"var(--font-display)\" }}>\n {scores.correct_count} of {scores.question_count} correct\n </p>\n <p className=\"text-sm text-gray-500\">\n {scores.total} / {scores.max} points\n </p>\n </div>\n );\n}\n\nfunction QuizAnswerReveal({\n answer,\n allPages,\n showCorrect,\n showExplanation,\n themeColor,\n}: {\n answer: QuizAnswer;\n allPages: Record<string, CatalogPage>;\n showCorrect: boolean;\n showExplanation: boolean;\n themeColor: string;\n}) {\n // Find the component to get label & options\n let label = answer.component_id;\n let options: { value: string; label: string }[] = [];\n for (const page of Object.values(allPages)) {\n const comp = page.components.find((c) => c.id === answer.component_id);\n if (comp) {\n label = comp.props?.label || label;\n options = comp.props?.options || [];\n break;\n }\n }\n\n const givenLabel = Array.isArray(answer.given_answer)\n ? answer.given_answer.map((v: string) => options.find((o) => o.value === v)?.label || v).join(\", \")\n : options.find((o) => o.value === answer.given_answer)?.label || String(answer.given_answer);\n\n const correctValues = Array.isArray(answer.correct_answer) ? answer.correct_answer : [answer.correct_answer];\n const correctLabel = correctValues.map((v) => options.find((o) => o.value === v)?.label || v).join(\", \");\n\n return (\n <div\n className={`rounded-2xl border-2 p-4 space-y-2 ${\n answer.is_correct ? \"border-green-200 bg-green-50/50\" : \"border-red-200 bg-red-50/50\"\n }`}\n >\n <div className=\"flex items-start gap-3\">\n <div\n className={`w-6 h-6 rounded-full flex-shrink-0 flex items-center justify-center mt-0.5 ${\n answer.is_correct ? \"bg-green-500\" : \"bg-red-500\"\n }`}\n >\n {answer.is_correct ? (\n <svg className=\"w-3.5 h-3.5 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3.5 h-3.5 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-gray-900\">{label}</p>\n <p className=\"text-sm text-gray-600 mt-1\">\n Your answer: <span className={answer.is_correct ? \"text-green-700 font-medium\" : \"text-red-700 font-medium\"}>{givenLabel}</span>\n </p>\n {!answer.is_correct && answer.wrong_message && (\n <p className=\"text-sm text-red-600 mt-1\">{answer.wrong_message}</p>\n )}\n {showCorrect && !answer.is_correct && (\n <p className=\"text-sm mt-1\">\n Correct answer: <span className=\"font-medium\" style={{ color: themeColor }}>{correctLabel}</span>\n </p>\n )}\n {showExplanation && answer.explanation && (\n <p className=\"text-xs text-gray-500 mt-2 italic\">{answer.explanation}</p>\n )}\n </div>\n <span className=\"text-xs font-bold text-gray-400 flex-shrink-0\">\n {answer.points_earned}/{answer.points_possible} pts\n </span>\n </div>\n </div>\n );\n}\n\nexport const PageRenderer: React.FC<PageRendererProps> = ({\n page,\n formState,\n prefilledIds,\n onFieldChange,\n onFieldBlur,\n themeColor,\n onNext,\n onAction,\n isLastPage,\n isCover,\n useStickyBar,\n validationErrors,\n quizScores,\n allPages,\n tracerContext,\n onVideoStateChange,\n propOverrides,\n quizRevealed,\n buttonDisabled,\n buttonLoading,\n pageTransition = \"slide-up\",\n}) => {\n const transitionClass = `page-transition-${pageTransition}`;\n const hasActions = page.actions && page.actions.length > 0;\n const visCtx = tracerContext || defaultVisibilityContext;\n const isDisabled = buttonDisabled || buttonLoading;\n const [disabledMsg, setDisabledMsg] = useState<string | null>(null);\n const disabledMsgTimer = useRef<ReturnType<typeof setTimeout>>();\n\n const handleDisabledClick = useCallback(() => {\n if (!isDisabled) return;\n const msg = page.button_disabled_message || \"Please fill in all required fields\";\n setDisabledMsg(msg);\n clearTimeout(disabledMsgTimer.current);\n disabledMsgTimer.current = setTimeout(() => setDisabledMsg(null), 3000);\n }, [isDisabled, page.button_disabled_message]);\n\n useEffect(() => () => clearTimeout(disabledMsgTimer.current), []);\n\n const handleButtonClick = useCallback(() => {\n if (isDisabled) {\n handleDisabledClick();\n } else {\n onNext();\n }\n }, [isDisabled, handleDisabledClick, onNext]);\n\n // Filter visible components for rendering\n const visibleComponents = page.components.filter((comp) => {\n const mergedProps = propOverrides?.[comp.id] ? { ...comp.props, ...propOverrides[comp.id] } : comp.props;\n if (comp.hidden || mergedProps.hidden) return false;\n if (!isVisible(comp.visibility, formState, visCtx)) return false;\n if (comp.prefill_mode === \"hidden\" && formState[comp.id] != null && formState[comp.id] !== \"\") return false;\n return true;\n });\n\n // --- Quiz answer reveal ---\n const reveal = page.reveal_answers;\n const revealAnswers: QuizAnswer[] = [];\n let revealScores: QuizScores | null = null;\n if (reveal && quizScores) {\n const fromPages = new Set(reveal.from_pages);\n for (const a of quizScores.answers) {\n if (fromPages.has(a.page_id)) {\n revealAnswers.push(a);\n }\n }\n if (revealAnswers.length > 0) {\n const total = revealAnswers.reduce((s, a) => s + a.points_earned, 0);\n const max = revealAnswers.reduce((s, a) => s + a.points_possible, 0);\n revealScores = {\n answers: revealAnswers,\n total,\n max,\n percent: max > 0 ? Math.round((total / max) * 100) : 0,\n correct_count: revealAnswers.filter((a) => a.is_correct).length,\n question_count: revealAnswers.length,\n };\n }\n }\n\n // Group visible components into rows for width-based layout\n const componentRows = useMemo(() => groupIntoRows(visibleComponents), [visibleComponents]);\n\n // Find the last input component on this page (for Enter-to-submit)\n const lastInputId = useMemo(() => {\n for (let i = visibleComponents.length - 1; i >= 0; i--) {\n if (InputComponentMap[visibleComponents[i].type]) {\n return visibleComponents[i].id;\n }\n }\n return undefined;\n }, [visibleComponents]);\n\n // Cover page layout\n if (isCover || page.layout === \"cover\") {\n return (\n <div className={`${transitionClass} space-y-7 flex flex-col items-stretch text-center`}>\n {/* Quiz answer reveal section */}\n {revealScores && (\n <div className=\"space-y-4 mb-4\">\n {(reveal?.show_score !== false) && (\n <QuizScoreSummary scores={revealScores} themeColor={themeColor} />\n )}\n {revealAnswers.map((answer) => (\n <QuizAnswerReveal\n key={answer.component_id}\n answer={answer}\n allPages={allPages || {}}\n showCorrect={reveal?.show_correct !== false}\n showExplanation={reveal?.show_explanation !== false}\n themeColor={themeColor}\n />\n ))}\n </div>\n )}\n\n {componentRows.map((row, i) => (\n <React.Fragment key={i}>\n {renderComponentRow(row, formState, onFieldChange, themeColor, true, prefilledIds, onFieldBlur, validationErrors, visCtx, onVideoStateChange, propOverrides, lastInputId, onNext, quizRevealed)}\n </React.Fragment>\n ))}\n\n {/* Quiz answers revealed banner */}\n {quizRevealed && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"flex items-center justify-center gap-3 rounded-2xl px-5 py-4 mt-8 text-sm font-medium bg-indigo-50 text-indigo-700 border border-indigo-200\"\n >\n <svg className=\"w-5 h-5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>Answers revealed! Review your results, then continue.</span>\n </div>\n )}\n\n {useStickyBar ? (\n /* Sticky bar handles CTA — add spacer for bottom bar */\n <div className=\"h-16\" />\n ) : hasActions ? (\n <div className=\"flex flex-col gap-4 mt-8\">\n {page.actions!.map((action) =>\n renderActionButton(action, themeColor, onAction)\n )}\n </div>\n ) : (\n <div className=\"mt-8\">\n {page.submit_side_statement ? (\n <div className=\"flex items-center gap-4\">\n <button\n onClick={handleButtonClick}\n className={`cf-btn-primary flex-1 py-4 text-lg ${isDisabled ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\n style={{ backgroundColor: themeColor }}\n >\n {buttonLoading ? (\n <span className=\"inline-flex items-center gap-2\">\n <svg className=\"animate-spin w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\"><circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" /><path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" /></svg>\n {quizRevealed ? \"Continue\" : page.submit_label || (isLastPage ? \"Submit\" : \"Get Started\")}\n </span>\n ) : (quizRevealed ? \"Continue\" : page.submit_label || (isLastPage ? \"Submit\" : \"Get Started\"))}\n </button>\n <span className=\"text-sm font-medium text-gray-600 shrink-0\">{page.submit_side_statement}</span>\n </div>\n ) : (\n <button\n onClick={handleButtonClick}\n className={`cf-btn-primary w-full py-4 text-lg ${isDisabled ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\n style={{ backgroundColor: themeColor }}\n >\n {buttonLoading ? (\n <span className=\"inline-flex items-center gap-2\">\n <svg className=\"animate-spin w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\"><circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" /><path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" /></svg>\n {quizRevealed ? \"Continue\" : page.submit_label || (isLastPage ? \"Submit\" : \"Get Started\")}\n </span>\n ) : (quizRevealed ? \"Continue\" : page.submit_label || (isLastPage ? \"Submit\" : \"Get Started\"))}\n </button>\n )}\n {disabledMsg && (\n <p className=\"text-sm text-red-500 mt-2 text-center animate-[shake_0.3s_ease-in-out]\">{disabledMsg}</p>\n )}\n {page.submit_reassurance && (\n <p className=\"text-xs text-gray-400 mt-1.5 text-center\">{page.submit_reassurance}</p>\n )}\n </div>\n )}\n </div>\n );\n }\n\n // Standard page layout\n return (\n <div className={`${transitionClass} space-y-5`}>\n {/* Quiz answer reveal section */}\n {revealScores && (\n <div className=\"space-y-4 mb-6\">\n {(reveal?.show_score !== false) && (\n <QuizScoreSummary scores={revealScores} themeColor={themeColor} />\n )}\n {revealAnswers.map((answer) => (\n <QuizAnswerReveal\n key={answer.component_id}\n answer={answer}\n allPages={allPages || {}}\n showCorrect={reveal?.show_correct !== false}\n showExplanation={reveal?.show_explanation !== false}\n themeColor={themeColor}\n />\n ))}\n </div>\n )}\n\n {componentRows.map((row, i) => (\n <React.Fragment key={i}>\n {renderComponentRow(row, formState, onFieldChange, themeColor, false, prefilledIds, onFieldBlur, validationErrors, visCtx, onVideoStateChange, propOverrides, lastInputId, onNext, quizRevealed)}\n </React.Fragment>\n ))}\n\n {/* Quiz answers revealed banner */}\n {quizRevealed && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"flex items-center gap-3 rounded-2xl px-5 py-4 mt-8 text-sm font-medium bg-indigo-50 text-indigo-700 border border-indigo-200\"\n >\n <svg className=\"w-5 h-5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>Answers revealed! Review your results above, then click Continue to proceed.</span>\n </div>\n )}\n\n {hasActions ? (\n <div className=\"flex flex-col items-center gap-4 mt-10\" data-sticky-sentinel>\n {page.actions!.map((action) =>\n renderActionButton(action, themeColor, onAction)\n )}\n </div>\n ) : (\n !page.hide_navigation && (\n <div className=\"mt-8\" data-sticky-sentinel>\n {page.submit_side_statement ? (\n <div className=\"flex items-center gap-4\">\n <button\n onClick={handleButtonClick}\n className={`cf-btn-primary inline-flex items-center gap-2 text-base ${isDisabled ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\n style={{ backgroundColor: themeColor }}\n >\n {buttonLoading && (\n <svg className=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\"><circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" /><path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" /></svg>\n )}\n {quizRevealed\n ? \"Continue\"\n : isLastPage\n ? page.submit_label || \"Submit\"\n : page.submit_label || \"Continue\"}\n {!buttonLoading && !(/[→⟶➔➜►▶︎>]/.test(\n quizRevealed ? \"Continue\" : page.submit_label || (isLastPage ? \"Submit\" : \"Continue\")\n )) && (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\" />\n </svg>\n )}\n </button>\n <span className=\"text-sm font-medium text-gray-600 shrink-0\">{page.submit_side_statement}</span>\n </div>\n ) : (\n <button\n onClick={handleButtonClick}\n className={`cf-btn-primary inline-flex items-center gap-2 text-base ${isDisabled ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\n style={{ backgroundColor: themeColor }}\n >\n {buttonLoading && (\n <svg className=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\"><circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" /><path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" /></svg>\n )}\n {quizRevealed\n ? \"Continue\"\n : isLastPage\n ? page.submit_label || \"Submit\"\n : page.submit_label || \"Continue\"}\n {!buttonLoading && !(/[→⟶➔➜►▶︎>]/.test(\n quizRevealed ? \"Continue\" : page.submit_label || (isLastPage ? \"Submit\" : \"Continue\")\n )) && (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\" />\n </svg>\n )}\n </button>\n )}\n {disabledMsg && (\n <p className=\"text-sm text-red-500 mt-2 animate-[shake_0.3s_ease-in-out]\">{disabledMsg}</p>\n )}\n {page.submit_reassurance && (\n <p className=\"text-xs text-gray-400 mt-1.5\">{page.submit_reassurance}</p>\n )}\n </div>\n )\n )}\n\n {/* Extra padding when quiz answers are revealed so auto-scroll has breathing room */}\n {quizRevealed && <div className=\"h-40\" />}\n </div>\n );\n};\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Shared types\n// ---------------------------------------------------------------------------\n\nexport interface InputProps {\n props: Record<string, any>;\n value: any;\n onChange: (v: any) => void;\n themeColor: string;\n /** Called when the user presses Enter — used to advance to the next page */\n onSubmit?: () => void;\n formState?: Record<string, any>;\n onFieldChange?: (id: string, value: any) => void;\n componentId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst baseInput =\n \"cf-input\";\n\nfunction focusRingStyle(themeColor: string): React.CSSProperties {\n return {\n \"--tw-ring-color\": themeColor,\n borderColor: themeColor,\n } as React.CSSProperties;\n}\n\n// \"Other\" option helpers — value convention: \"__other__\" or \"__other__:typed text\"\nconst OTHER_PREFIX = \"__other__\";\n\nfunction isOtherValue(v: string): boolean {\n return v === OTHER_PREFIX || v.startsWith(OTHER_PREFIX + \":\");\n}\n\nfunction getOtherText(v: string): string {\n if (v.startsWith(OTHER_PREFIX + \":\")) return v.slice(OTHER_PREFIX.length + 1);\n return \"\";\n}\n\nfunction makeOtherValue(text: string): string {\n return text ? `${OTHER_PREFIX}:${text}` : OTHER_PREFIX;\n}\n\n/** Shared \"Other\" text input shown when the Other option is selected */\nconst OtherTextInput: React.FC<{\n otherText: string;\n onOtherTextChange: (text: string) => void;\n themeColor: string;\n placeholder?: string;\n}> = ({ otherText, onOtherTextChange, themeColor, placeholder }) => {\n const [focused, setFocused] = useState(false);\n return (\n <input\n type=\"text\"\n className={`${baseInput} mt-2 ${focused ? \"ring-2\" : \"hover:border-gray-400\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={placeholder ?? \"Please specify...\"}\n aria-label=\"Specify other option\"\n value={otherText}\n onChange={(e) => onOtherTextChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n autoFocus\n />\n );\n};\n\n// ---------------------------------------------------------------------------\n// 1. ShortTextInput\n// ---------------------------------------------------------------------------\n\nexport const ShortTextInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n return (\n <input\n type=\"text\"\n className={`${baseInput} ${focused ? \"ring-2\" : \"hover:border-gray-400\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"\"}\n maxLength={props.maxLength}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && onSubmit) { e.preventDefault(); onSubmit(); } }}\n />\n );\n};\n\n// ---------------------------------------------------------------------------\n// 2. LongTextInput\n// ---------------------------------------------------------------------------\n\nexport const LongTextInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const [focused, setFocused] = useState(false);\n const resizeMap: Record<string, string> = {\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n none: \"resize-none\",\n };\n const resizeClass = resizeMap[props.resize ?? \"vertical\"] || \"resize-y\";\n return (\n <textarea\n className={`${baseInput} min-h-[80px] ${resizeClass} ${focused ? \"ring-2\" : \"hover:border-gray-400\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"\"}\n maxLength={props.max_length ?? props.maxLength}\n minLength={props.min_length}\n rows={props.rows ?? 4}\n disabled={props.disabled}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n />\n );\n};\n\n// ---------------------------------------------------------------------------\n// 3. EmailInput\n// ---------------------------------------------------------------------------\n\nexport const EmailInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n const isValid =\n !value || /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value as string);\n return (\n <div className=\"relative\">\n <input\n type=\"email\"\n className={`${baseInput} pr-10 ${focused ? \"ring-2\" : \"hover:border-gray-400\"} ${!isValid ? \"border-red-400\" : \"\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"you@example.com\"}\n aria-invalid={!isValid}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && onSubmit) { e.preventDefault(); onSubmit(); } }}\n />\n {value && (\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm\" aria-hidden=\"true\">\n {isValid ? (\n <span className=\"text-green-500\">&#10003;</span>\n ) : (\n <span className=\"text-red-400\">&#10007;</span>\n )}\n </span>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 4. PhoneInput\n// ---------------------------------------------------------------------------\n\nexport const PhoneInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n return (\n <input\n type=\"tel\"\n className={`${baseInput} ${focused ? \"ring-2\" : \"hover:border-gray-400\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"+1 (555) 000-0000\"}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && onSubmit) { e.preventDefault(); onSubmit(); } }}\n />\n );\n};\n\n// ---------------------------------------------------------------------------\n// 5. UrlInput\n// ---------------------------------------------------------------------------\n\nexport const UrlInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n return (\n <input\n type=\"url\"\n className={`${baseInput} ${focused ? \"ring-2\" : \"hover:border-gray-400\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"https://\"}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && onSubmit) { e.preventDefault(); onSubmit(); } }}\n />\n );\n};\n\n// ---------------------------------------------------------------------------\n// 6. NumberInput\n// ---------------------------------------------------------------------------\n\nexport const NumberInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n return (\n <div className=\"flex items-center gap-2\">\n {props.prefix && (\n <span className=\"text-sm font-medium text-gray-500\">\n {props.prefix}\n </span>\n )}\n <input\n type=\"number\"\n className={`${baseInput} ${focused ? \"ring-2\" : \"hover:border-gray-400\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"\"}\n min={props.min}\n max={props.max}\n step={props.step}\n value={value ?? \"\"}\n onChange={(e) =>\n onChange(e.target.value === \"\" ? null : Number(e.target.value))\n }\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && onSubmit) { e.preventDefault(); onSubmit(); } }}\n />\n {props.suffix && (\n <span className=\"text-sm font-medium text-gray-500\">\n {props.suffix}\n </span>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 7. DropdownInput\n// ---------------------------------------------------------------------------\n\nexport const DropdownInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n const options: { label: string; value: string; disabled?: boolean }[] = (\n props.options ?? []\n ).map((o: any) =>\n typeof o === \"string\" ? { label: o, value: o } : o\n );\n const showOther = props.other_option ?? false;\n const otherSelected = typeof value === \"string\" && isOtherValue(value);\n\n return (\n <div>\n <select\n className={`${baseInput} appearance-none bg-[url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%20viewBox%3D%220%200%2012%2012%22%3E%3Cpath%20fill%3D%22%236b7280%22%20d%3D%22M6%208L1%203h10z%22%2F%3E%3C%2Fsvg%3E')] bg-[length:12px] bg-[right_12px_center] bg-no-repeat pr-10 ${focused ? \"ring-2\" : \"hover:border-gray-400\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n value={otherSelected ? OTHER_PREFIX : (value ?? \"\")}\n onChange={(e) => {\n if (e.target.value === OTHER_PREFIX) {\n onChange(makeOtherValue(\"\"));\n } else {\n onChange(e.target.value);\n }\n }}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n <option value=\"\" disabled>\n {props.placeholder ?? \"Select an option...\"}\n </option>\n {options.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n {showOther && (\n <option value={OTHER_PREFIX}>\n {props.other_label ?? \"Other...\"}\n </option>\n )}\n </select>\n {otherSelected && (\n <OtherTextInput\n otherText={getOtherText(value)}\n onOtherTextChange={(text) => onChange(makeOtherValue(text))}\n themeColor={themeColor}\n placeholder={props.other_placeholder}\n />\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 8. MultipleChoiceInput\n// ---------------------------------------------------------------------------\n\nexport const MultipleChoiceInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const options: { label: string; value: string; description?: string; disabled?: boolean; button?: { label: string; url: string; target?: string; size?: string; style?: string; icon?: string } }[] = (\n props.options ?? []\n ).map((o: any) =>\n typeof o === \"string\" ? { label: o, value: o } : o\n );\n const showOther = props.other_option ?? false;\n const otherSelected = typeof value === \"string\" && isOtherValue(value);\n\n // Quiz inline feedback — only shown after user clicks Continue (quiz._revealed)\n const quiz = props.quiz;\n const hasAnswer = value != null && value !== \"\";\n const revealOnSelect = quiz?.reveal_on_select && hasAnswer && quiz?._revealed;\n const rawCorrect = quiz?.correct_answer;\n // Normalize: if correct_answer is a single-element array, unwrap it\n const correctAnswer = Array.isArray(rawCorrect) && rawCorrect.length === 1 ? rawCorrect[0] : rawCorrect;\n const isCorrect = revealOnSelect\n ? String(value).trim().toLowerCase() === String(correctAnswer).trim().toLowerCase()\n : undefined;\n\n // Determine per-option styles when reveal is active\n const matchesCorrect = (v: string) =>\n String(v).trim().toLowerCase() === String(correctAnswer).trim().toLowerCase();\n const getOptionStyle = (optValue: string, selected: boolean) => {\n if (revealOnSelect) {\n const isCorrectOption = matchesCorrect(optValue);\n const isWrongSelected = selected && !isCorrectOption;\n if (isCorrectOption) {\n return { borderColor: \"#22c55e\", backgroundColor: \"#f0fdf4\" };\n }\n if (isWrongSelected) {\n return { borderColor: \"#ef4444\", backgroundColor: \"#fef2f2\" };\n }\n return undefined;\n }\n if (selected) {\n return { borderColor: themeColor, backgroundColor: themeColor + \"0a\" };\n }\n return undefined;\n };\n\n return (\n <div className=\"flex flex-col gap-2\" role=\"radiogroup\" aria-label={props.label || \"Choose an option\"}>\n {options.map((opt) => {\n const selected = value === opt.value;\n const isDisabled = opt.disabled;\n return (\n <div\n key={opt.value}\n role=\"radio\"\n tabIndex={isDisabled ? -1 : 0}\n aria-checked={selected}\n aria-disabled={isDisabled || undefined}\n className={`cf-choice flex w-full items-center gap-3 px-4 py-3.5 text-left text-lg transition-all duration-200 ${\n isDisabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\"\n } ${\n selected\n ? \"shadow-sm\"\n : \"\"\n } ${revealOnSelect ? \"pointer-events-none opacity-80\" : \"\"}`}\n data-selected={selected ? \"true\" : \"false\"}\n style={isDisabled ? undefined : getOptionStyle(opt.value, selected)}\n onClick={() => { if (!revealOnSelect && !isDisabled) onChange(opt.value); }}\n onKeyDown={(e) => { if ((e.key === \"Enter\" || e.key === \" \") && !revealOnSelect && !isDisabled) { e.preventDefault(); onChange(opt.value); } }}\n >\n <span\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2 transition-all duration-200 ${\n selected ? \"border-transparent\" : \"border-gray-300\"\n }`}\n style={\n selected\n ? revealOnSelect\n ? { backgroundColor: isCorrect ? \"#22c55e\" : \"#ef4444\", borderColor: isCorrect ? \"#22c55e\" : \"#ef4444\" }\n : { backgroundColor: themeColor, borderColor: themeColor }\n : undefined\n }\n >\n {selected && (\n <span className=\"block h-2 w-2 rounded-full bg-white\" />\n )}\n </span>\n <div className=\"flex-1 min-w-0\">\n <div className={`font-medium ${isDisabled ? \"text-gray-400\" : \"text-gray-900\"}`}>{opt.label}</div>\n {opt.description && (\n <div className=\"mt-0.5 text-xs text-gray-500\">\n {opt.description}\n </div>\n )}\n </div>\n {opt.button && (() => {\n const btn = opt.button!;\n const sz = btn.size ?? \"sm\";\n const st = btn.style ?? \"primary\";\n const pad = sz === \"lg\" ? \"px-5 py-2.5 text-base\" : sz === \"md\" ? \"px-4 py-2 text-sm\" : \"px-3 py-1.5 text-xs\";\n const base = `inline-flex items-center gap-1.5 rounded-lg font-medium transition-colors shrink-0 no-underline ${pad}`;\n const inlineStyle: Record<string, string> =\n st === \"primary\"\n ? { backgroundColor: themeColor, color: \"#fff\" }\n : st === \"secondary\"\n ? { borderColor: themeColor, color: themeColor, backgroundColor: themeColor + \"0a\" }\n : st === \"outline\"\n ? { borderColor: themeColor + \"40\", color: themeColor }\n : { color: themeColor };\n const border = st === \"secondary\" || st === \"outline\" ? \" border\" : \"\";\n return (\n <a\n href={btn.url}\n target={(btn.target as string) ?? \"_blank\"}\n rel=\"noopener noreferrer\"\n className={`${base}${border}`}\n style={inlineStyle}\n onClick={(e) => e.stopPropagation()}\n >\n {btn.icon && <span>{btn.icon}</span>}\n {btn.label}\n {((btn.target as string) ?? \"_blank\") === \"_blank\" && (\n <svg className=\"w-3 h-3 opacity-60\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n )}\n </a>\n );\n })()}\n </div>\n );\n })}\n {showOther && (\n <div>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={otherSelected}\n className={`cf-choice flex w-full items-center gap-3 px-4 py-3.5 text-left text-lg transition-all duration-200 ${\n otherSelected ? \"shadow-sm\" : \"\"\n }`}\n data-selected={otherSelected ? \"true\" : \"false\"}\n style={\n otherSelected\n ? { borderColor: themeColor, backgroundColor: themeColor + \"0a\" }\n : undefined\n }\n onClick={() => { if (!otherSelected && !revealOnSelect) onChange(makeOtherValue(\"\")); }}\n disabled={!!revealOnSelect}\n >\n <span\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2 transition-all duration-200 ${\n otherSelected ? \"border-transparent\" : \"border-gray-300\"\n }`}\n style={\n otherSelected\n ? { backgroundColor: themeColor, borderColor: themeColor }\n : undefined\n }\n >\n {otherSelected && (\n <span className=\"block h-2 w-2 rounded-full bg-white\" />\n )}\n </span>\n <div className=\"font-medium text-gray-900\">\n {props.other_label ?? \"Other\"}\n </div>\n </button>\n {otherSelected && (\n <OtherTextInput\n otherText={getOtherText(value)}\n onOtherTextChange={(text) => onChange(makeOtherValue(text))}\n themeColor={themeColor}\n placeholder={props.other_placeholder}\n />\n )}\n </div>\n )}\n {/* Inline quiz feedback banner */}\n {revealOnSelect && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={`flex items-center gap-2 rounded-xl px-4 py-3 mt-1 text-sm font-medium ${\n isCorrect\n ? \"bg-green-50 text-green-700 border border-green-200\"\n : \"bg-red-50 text-red-600 border border-red-200\"\n }`}\n >\n {isCorrect ? (\n <svg className=\"w-5 h-5 text-green-500 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5 text-red-500 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )}\n <span>{isCorrect\n ? (quiz?.correct_message || \"Correct!\")\n : (quiz?.option_messages?.[value as string] || quiz?.wrong_message || \"You got the wrong answer.\")\n }</span>\n </div>\n\n )}\n {/* Inline quiz explanation */}\n {revealOnSelect && quiz?.explanation && (\n <p className=\"text-xs text-gray-500 italic px-1\">{quiz.explanation}</p>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 9. CheckboxesInput\n// ---------------------------------------------------------------------------\n\nexport const CheckboxesInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n formState,\n onFieldChange,\n componentId,\n}) => {\n const selected: string[] = Array.isArray(value) ? value : [];\n const options: { label: string; value: string; description?: string; image?: string; disabled?: boolean; expand_on_select?: boolean; button?: { label: string; url: string; target?: string; size?: string; style?: string; icon?: string }; inputs?: { id: string; type: string; label?: string; placeholder?: string; required?: boolean; props?: Record<string, any> }[] }[] = (\n props.options ?? []\n ).map((o: any) =>\n typeof o === \"string\" ? { label: o, value: o } : o\n );\n const showOther = props.other_option ?? false;\n const otherEntry = selected.find(isOtherValue);\n const otherIsSelected = otherEntry != null;\n\n // Quiz inline feedback (for checkboxes, correct_answer is an array) — only after Continue click\n const quiz = props.quiz;\n const hasAnswered = selected.length > 0;\n const revealOnSelect = quiz?.reveal_on_select && hasAnswered && quiz?._revealed;\n const correctAnswers: string[] = revealOnSelect\n ? (Array.isArray(quiz.correct_answer) ? quiz.correct_answer : [quiz.correct_answer])\n : [];\n const isCorrect = revealOnSelect\n ? selected.length === correctAnswers.length && selected.every((v: string) => correctAnswers.includes(v))\n : undefined;\n\n const getOptionStyle = (optValue: string, isSelected: boolean): React.CSSProperties | undefined => {\n if (revealOnSelect) {\n const isCorrectOption = correctAnswers.includes(optValue);\n const isWrongSelected = isSelected && !isCorrectOption;\n if (isCorrectOption) return { borderColor: \"#22c55e\", backgroundColor: \"#f0fdf4\" };\n if (isWrongSelected) return { borderColor: \"#ef4444\", backgroundColor: \"#fef2f2\" };\n return undefined;\n }\n if (isSelected) return { borderColor: themeColor, backgroundColor: themeColor + \"0a\" };\n return undefined;\n };\n\n const toggle = (optValue: string) => {\n if (revealOnSelect) return;\n if (selected.includes(optValue)) {\n onChange(selected.filter((v) => v !== optValue));\n } else {\n onChange([...selected, optValue]);\n }\n };\n\n const toggleOther = () => {\n if (revealOnSelect) return;\n if (otherIsSelected) {\n onChange(selected.filter((v) => !isOtherValue(v)));\n } else {\n onChange([...selected, makeOtherValue(\"\")]);\n }\n };\n\n const updateOtherText = (text: string) => {\n onChange(selected.map((v) => (isOtherValue(v) ? makeOtherValue(text) : v)));\n };\n\n // Auto-check: when all required nested inputs for an option are filled, auto-select it\n useEffect(() => {\n if (!componentId || !formState || !onFieldChange) return;\n for (const opt of options) {\n if (!opt.inputs || opt.inputs.length === 0) continue;\n if (opt.expand_on_select) continue; // skip auto-check when inputs are hidden until selected\n const requiredInputs = opt.inputs.filter((inp) => inp.required && !_getDisplayComponent?.(inp.type));\n if (requiredInputs.length === 0) continue;\n const allFilled = requiredInputs.every((inp) => {\n const nestedId = `${componentId}.${opt.value}.${inp.id}`;\n const v = formState[nestedId];\n return v != null && v !== \"\" && !(Array.isArray(v) && v.length === 0);\n });\n const isSelected = selected.includes(opt.value);\n if (allFilled && !isSelected) {\n onChange([...selected, opt.value]);\n }\n }\n }, [formState]);\n\n const hasNestedContent = options.some((opt) => opt.inputs && opt.inputs.length > 0);\n\n // Render an embedded button\n const renderButton = (btn: NonNullable<typeof options[0][\"button\"]>) => {\n const sz = btn.size ?? \"sm\";\n const st = btn.style ?? \"primary\";\n const pad = sz === \"lg\" ? \"px-5 py-2.5 text-base\" : sz === \"md\" ? \"px-4 py-2 text-sm\" : \"px-3 py-1.5 text-xs\";\n const base = `inline-flex items-center gap-1.5 rounded-lg font-medium transition-colors shrink-0 no-underline ${pad}`;\n const inlineStyle: Record<string, string> =\n st === \"primary\"\n ? { backgroundColor: themeColor, color: \"#fff\" }\n : st === \"secondary\"\n ? { borderColor: themeColor, color: themeColor, backgroundColor: themeColor + \"0a\" }\n : st === \"outline\"\n ? { borderColor: themeColor + \"40\", color: themeColor }\n : { color: themeColor };\n const border = st === \"secondary\" || st === \"outline\" ? \" border\" : \"\";\n return (\n <a\n href={btn.url}\n target={(btn.target as string) ?? \"_blank\"}\n rel=\"noopener noreferrer\"\n className={`${base}${border}`}\n style={inlineStyle}\n onClick={(e) => e.stopPropagation()}\n >\n {btn.icon && <span>{btn.icon}</span>}\n {btn.label}\n {((btn.target as string) ?? \"_blank\") === \"_blank\" && (\n <svg className=\"w-3 h-3 opacity-60\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n )}\n </a>\n );\n };\n\n // Nested copy-to-clipboard button\n const NestedCopyButton: React.FC<{ text: string }> = ({ text }) => {\n const [copied, setCopied] = useState(false);\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(text).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }, [text]);\n return (\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"flex-shrink-0 p-1.5 rounded-lg transition-all duration-200 hover:bg-gray-100 active:scale-95\"\n aria-label=\"Copy to clipboard\"\n title=\"Copy to clipboard\"\n >\n {copied ? (\n <svg className=\"w-4 h-4 text-green-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\n </svg>\n ) : (\n <svg className=\"w-4 h-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9.75a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184\" />\n </svg>\n )}\n </button>\n );\n };\n\n /** Input types that support copyable/readonly in nested context */\n const NESTED_COPYABLE_TYPES = new Set([\n \"short_text\", \"long_text\", \"rich_text\", \"email\", \"phone\", \"url\",\n \"number\", \"currency\", \"date\", \"datetime\", \"time\", \"password\",\n \"dropdown\", \"address\",\n ]);\n\n // Render nested sub-components (inputs + display types)\n const renderNestedInputs = (opt: typeof options[0], _isSelected: boolean) => {\n if (!opt.inputs || opt.inputs.length === 0) return null;\n return (\n <div\n className=\"space-y-3 pt-3 pb-1\"\n onClick={(e) => e.stopPropagation()}\n >\n {opt.inputs.map((input) => {\n const nestedId = componentId ? `${componentId}.${opt.value}.${input.id}` : input.id;\n // Display component — render as static content\n const DisplayComp = _getDisplayComponent?.(input.type);\n if (DisplayComp) {\n return (\n <div key={input.id} className=\"text-sm\">\n <DisplayComp\n props={{ ...input.props, text: input.label || input.props?.text }}\n themeColor={themeColor}\n />\n </div>\n );\n }\n // Input component — render with form binding\n const NestedComp = getInputComponent(input.type);\n const nestedProps: Record<string, any> = { placeholder: input.placeholder, ...input.props };\n const isNestedReadonly = nestedProps.readonly;\n const isNestedCopyable = nestedProps.copyable;\n const nestedValue = formState?.[nestedId];\n const hasNestedValue = nestedValue != null && nestedValue !== \"\";\n\n // Readonly mode — show as read-only input with copy button\n if (isNestedReadonly && NESTED_COPYABLE_TYPES.has(input.type)) {\n const displayValue = hasNestedValue ? String(nestedValue) : \"\";\n return (\n <div key={input.id} className=\"space-y-1\">\n {input.label && (\n <label className=\"block text-sm font-medium text-gray-600\">\n {input.label}\n </label>\n )}\n {input.props?.sublabel && (\n <p className=\"text-xs text-gray-400\">{input.props.sublabel}</p>\n )}\n <div className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"text\"\n readOnly\n value={displayValue}\n placeholder={nestedProps.placeholder ?? \"\"}\n className=\"cf-input flex-1 cursor-default bg-gray-50 text-gray-900 border-gray-200\"\n />\n {hasNestedValue && <NestedCopyButton text={displayValue} />}\n </div>\n </div>\n );\n }\n\n return (\n <div key={input.id} className=\"space-y-1\">\n {input.label && (\n <label className=\"block text-sm font-medium text-gray-600\">\n {input.label}\n {(input.required || input.props?.required) && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n )}\n {input.props?.sublabel && (\n <p className=\"text-xs text-gray-400\">{input.props.sublabel}</p>\n )}\n <div className=\"text-sm\">\n {isNestedCopyable && NESTED_COPYABLE_TYPES.has(input.type) ? (\n <div className=\"flex items-start gap-1.5\">\n <div className=\"flex-1 min-w-0\">\n <NestedComp\n props={nestedProps}\n value={nestedValue}\n onChange={(v: any) => onFieldChange ? onFieldChange(nestedId, v) : undefined}\n themeColor={themeColor}\n formState={formState}\n onFieldChange={onFieldChange}\n componentId={nestedId}\n />\n </div>\n {hasNestedValue && (\n <div className=\"pt-2\">\n <NestedCopyButton text={String(nestedValue)} />\n </div>\n )}\n </div>\n ) : (\n <NestedComp\n props={nestedProps}\n value={nestedValue}\n onChange={(v: any) => onFieldChange ? onFieldChange(nestedId, v) : undefined}\n themeColor={themeColor}\n formState={formState}\n onFieldChange={onFieldChange}\n componentId={nestedId}\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n };\n\n // Render the checkbox indicator\n const renderCheckmark = (isSelected: boolean, optValue?: string) => (\n <span\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-md border-2 transition-all duration-200 ${\n isSelected ? \"border-transparent\" : \"border-gray-300\"\n }`}\n style={\n isSelected\n ? revealOnSelect && optValue\n ? { backgroundColor: correctAnswers.includes(optValue) ? \"#22c55e\" : \"#ef4444\", borderColor: correctAnswers.includes(optValue) ? \"#22c55e\" : \"#ef4444\" }\n : { backgroundColor: themeColor, borderColor: themeColor }\n : undefined\n }\n >\n {isSelected && (\n <svg className=\"h-3 w-3 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </span>\n );\n\n return (\n <div className=\"flex flex-col gap-2\" role=\"group\" aria-label={props.label || \"Select options\"}>\n {options.map((opt) => {\n const isSelected = selected.includes(opt.value);\n const hasNested = opt.inputs && opt.inputs.length > 0;\n const isDisabled = opt.disabled;\n\n return (\n <div\n key={opt.value}\n className={`cf-choice overflow-hidden transition-all duration-200 ${\n isSelected ? \"shadow-sm\" : \"\"\n } ${isDisabled ? \"opacity-50\" : \"\"} ${revealOnSelect ? \"pointer-events-none opacity-80\" : \"\"}`}\n data-selected={isSelected ? \"true\" : \"false\"}\n style={isDisabled ? undefined : getOptionStyle(opt.value, isSelected)}\n >\n {/* Toggle row — clickable area for checking/unchecking */}\n <div\n role=\"checkbox\"\n tabIndex={isDisabled ? -1 : 0}\n aria-checked={isSelected}\n aria-disabled={isDisabled || undefined}\n className={`flex w-full items-center gap-3 px-4 py-3.5 text-left text-lg ${isDisabled ? \"cursor-not-allowed\" : \"cursor-pointer\"}`}\n onClick={() => { if (!isDisabled) toggle(opt.value); }}\n onKeyDown={(e) => { if ((e.key === \"Enter\" || e.key === \" \") && !isDisabled) { e.preventDefault(); toggle(opt.value); } }}\n >\n {renderCheckmark(isSelected, opt.value)}\n {opt.image && (\n <img src={opt.image} alt=\"\" className=\"w-8 h-8 rounded-lg object-cover shrink-0\" />\n )}\n <div className=\"flex-1 min-w-0\">\n <div className={`font-medium ${isDisabled ? \"text-gray-400\" : \"text-gray-900\"}`}>{opt.label}</div>\n {opt.description && (\n <div className=\"mt-0.5 text-xs text-gray-500\">{opt.description}</div>\n )}\n </div>\n {opt.button && renderButton(opt.button)}\n </div>\n\n {/* Nested content — always visible unless expand_on_select is set */}\n {hasNested && (!opt.expand_on_select || isSelected) && (\n <div\n className=\"px-4 pb-3.5 ml-8 mr-4 border-t\"\n style={{ borderColor: themeColor + \"15\" }}\n >\n {renderNestedInputs(opt, isSelected)}\n </div>\n )}\n </div>\n );\n })}\n {showOther && (\n <div\n className={`cf-choice overflow-hidden transition-all duration-200 ${otherIsSelected ? \"shadow-sm\" : \"\"}`}\n data-selected={otherIsSelected ? \"true\" : \"false\"}\n style={otherIsSelected ? { borderColor: themeColor, backgroundColor: themeColor + \"0a\" } : undefined}\n >\n <div\n role=\"checkbox\"\n tabIndex={0}\n aria-checked={otherIsSelected}\n className={`flex w-full items-center gap-3 px-4 py-3.5 text-left text-lg cursor-pointer ${revealOnSelect ? \"pointer-events-none opacity-80\" : \"\"}`}\n onClick={toggleOther}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); toggleOther(); } }}\n >\n {renderCheckmark(otherIsSelected)}\n <div className=\"font-medium text-gray-900\">\n {props.other_label ?? \"Other\"}\n </div>\n </div>\n {otherIsSelected && (\n <div className=\"px-4 pb-3.5 ml-8 mr-4\">\n <OtherTextInput\n otherText={getOtherText(otherEntry!)}\n onOtherTextChange={updateOtherText}\n themeColor={themeColor}\n placeholder={props.other_placeholder}\n />\n </div>\n )}\n </div>\n )}\n {/* Inline quiz feedback banner */}\n {revealOnSelect && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={`flex items-center gap-2 rounded-xl px-4 py-3 mt-1 text-sm font-medium ${\n isCorrect\n ? \"bg-green-50 text-green-700 border border-green-200\"\n : \"bg-red-50 text-red-600 border border-red-200\"\n }`}\n >\n {isCorrect ? (\n <svg className=\"w-5 h-5 text-green-500 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5 text-red-500 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )}\n <span>{isCorrect\n ? (quiz?.correct_message || \"Correct!\")\n : (() => {\n if (quiz?.option_messages) {\n const wrongSelected = selected.filter((v: string) => !correctAnswers.includes(v));\n const msgs = wrongSelected.map((v: string) => quiz.option_messages![v]).filter(Boolean);\n if (msgs.length > 0) return msgs.join(\" \");\n }\n return quiz?.wrong_message || \"You got the wrong answer.\";\n })()\n }</span>\n </div>\n )}\n {revealOnSelect && quiz?.explanation && (\n <p className=\"text-xs text-gray-500 italic px-1\">{quiz.explanation}</p>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 10. PictureChoiceInput\n// ---------------------------------------------------------------------------\n\nexport const PictureChoiceInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const multiple = props.multiple ?? false;\n const selected: string[] = multiple\n ? Array.isArray(value)\n ? value\n : []\n : value != null\n ? [value]\n : [];\n\n const imageFit: \"contain\" | \"cover\" = props.image_fit === \"cover\" ? \"cover\" : \"contain\";\n\n const options: { label: string; value: string; image: string; disabled?: boolean }[] = (\n props.options ?? []\n ).map((o: any) =>\n typeof o === \"string\" ? { label: o, value: o, image: \"\" } : o\n );\n\n const toggle = (optValue: string) => {\n if (multiple) {\n const next = selected.includes(optValue)\n ? selected.filter((v) => v !== optValue)\n : [...selected, optValue];\n onChange(next);\n } else {\n onChange(optValue);\n }\n };\n\n return (\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\" role={multiple ? \"group\" : \"radiogroup\"} aria-label={props.label || \"Choose an option\"}>\n {options.map((opt) => {\n const isSelected = selected.includes(opt.value);\n return (\n <button\n key={opt.value}\n type=\"button\"\n role={multiple ? \"checkbox\" : \"radio\"}\n aria-checked={isSelected}\n aria-label={opt.label}\n aria-disabled={opt.disabled || undefined}\n disabled={opt.disabled}\n className={`group flex flex-col items-center overflow-hidden rounded-lg border-2 transition-all duration-200 ${\n opt.disabled\n ? \"opacity-40 grayscale cursor-not-allowed\"\n : isSelected\n ? \"shadow-md\"\n : \"border-gray-200 bg-white hover:border-gray-300 hover:shadow-sm\"\n }`}\n style={\n opt.disabled\n ? undefined\n : isSelected\n ? { borderColor: themeColor, backgroundColor: themeColor + \"08\" }\n : undefined\n }\n onClick={() => { if (!opt.disabled) toggle(opt.value); }}\n >\n <div className=\"relative w-full overflow-hidden bg-gray-100\">\n {opt.image ? (\n <img\n src={opt.image}\n alt={opt.label}\n className={`h-28 w-full transition-transform duration-200 group-hover:scale-105 ${\n imageFit === \"cover\" ? \"object-cover\" : \"object-contain p-3\"\n }`}\n />\n ) : (\n <div className=\"flex h-28 w-full items-center justify-center text-3xl text-gray-300\">\n &#128444;\n </div>\n )}\n {isSelected && (\n <span\n className=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-full text-white shadow\"\n style={{ backgroundColor: themeColor }}\n >\n <svg\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </span>\n )}\n </div>\n <div className=\"w-full px-2 py-2 text-center text-xs font-medium text-gray-700\">\n {opt.label}\n </div>\n </button>\n );\n })}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 11. SwitchInput\n// ---------------------------------------------------------------------------\n\nexport const SwitchInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const checked = !!value;\n return (\n <label className=\"inline-flex cursor-pointer items-center gap-3\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n className={`relative inline-flex h-6 w-11 shrink-0 rounded-full border-2 border-transparent transition-colors duration-200 ${\n checked ? \"\" : \"bg-gray-200\"\n }`}\n style={checked ? { backgroundColor: themeColor } : undefined}\n onClick={() => onChange(!checked)}\n >\n <span\n className={`pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition-transform duration-200 ${\n checked ? \"translate-x-5\" : \"translate-x-0\"\n }`}\n />\n </button>\n {props.label && (\n <span className=\"text-sm text-gray-700\">{props.label}</span>\n )}\n </label>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 12. CheckboxInput\n// ---------------------------------------------------------------------------\n\nexport const CheckboxInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const checked = !!value;\n return (\n <label className=\"inline-flex cursor-pointer items-center gap-3\">\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={checked}\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-md border-2 transition-all duration-200 ${\n checked ? \"border-transparent\" : \"border-gray-300 hover:border-gray-400\"\n }`}\n style={\n checked\n ? { backgroundColor: themeColor, borderColor: themeColor }\n : undefined\n }\n onClick={() => onChange(!checked)}\n >\n {checked && (\n <svg\n className=\"h-3 w-3 text-white\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n </button>\n {props.label && (\n <span className=\"text-sm text-gray-700\">{props.label}</span>\n )}\n </label>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 13. StarRatingInput\n// ---------------------------------------------------------------------------\n\nexport const StarRatingInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const max = props.max ?? 5;\n const current = typeof value === \"number\" ? value : 0;\n const [hover, setHover] = useState<number>(0);\n\n return (\n <div className=\"flex items-center gap-1\" role=\"radiogroup\" aria-label={props.label || \"Rating\"}>\n {Array.from({ length: max }, (_, i) => i + 1).map((star) => {\n const filled = star <= (hover || current);\n return (\n <button\n key={star}\n type=\"button\"\n role=\"radio\"\n aria-checked={current === star}\n aria-label={`${star} of ${max} stars`}\n className=\"text-3xl transition-transform duration-150 hover:scale-110\"\n style={{ color: filled ? themeColor : \"#d1d5db\" }}\n onMouseEnter={() => setHover(star)}\n onMouseLeave={() => setHover(0)}\n onClick={() => onChange(star)}\n >\n {filled ? \"\\u2605\" : \"\\u2606\"}\n </button>\n );\n })}\n {current > 0 && (\n <span className=\"ml-2 text-sm font-medium text-gray-500\">\n {current}/{max}\n </span>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 14. SliderInput\n// ---------------------------------------------------------------------------\n\nexport const SliderInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const min = props.min ?? 0;\n const max = props.max ?? 100;\n const step = props.step ?? 1;\n const current = typeof value === \"number\" ? value : min;\n\n return (\n <div className=\"flex flex-col gap-3 py-2\">\n <div className=\"flex items-center justify-between text-sm text-gray-500\">\n <span>{props.labels?.min ?? props.minLabel ?? min}</span>\n <span\n className=\"rounded-full px-3.5 py-1 text-sm font-semibold text-white\"\n style={{ backgroundColor: themeColor }}\n >\n {current}\n </span>\n <span>{props.labels?.max ?? props.maxLabel ?? max}</span>\n </div>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={current}\n aria-label={props.label || \"Slider\"}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={current}\n onChange={(e) => onChange(Number(e.target.value))}\n className=\"h-2.5 w-full cursor-pointer appearance-none rounded-full bg-gray-200 [&::-webkit-slider-thumb]:h-6 [&::-webkit-slider-thumb]:w-6 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:shadow-md\"\n style={\n {\n \"--thumb-color\": themeColor,\n accentColor: themeColor,\n } as React.CSSProperties\n }\n />\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 15. OpinionScaleInput\n// ---------------------------------------------------------------------------\n\nexport const OpinionScaleInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const min = props.min ?? 1;\n const max = props.max ?? 10;\n const numbers = Array.from({ length: max - min + 1 }, (_, i) => min + i);\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex gap-1.5\" role=\"radiogroup\" aria-label={props.label || \"Opinion scale\"}>\n {numbers.map((n) => {\n const selected = value === n;\n return (\n <button\n key={n}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n aria-label={`${n} of ${max}`}\n className={`flex h-10 min-w-[40px] flex-1 items-center justify-center rounded-lg border-2 text-sm font-semibold transition-all duration-200 ${\n selected\n ? \"text-white shadow-sm\"\n : \"border-gray-200 bg-white text-gray-600 hover:border-gray-300 hover:bg-gray-50\"\n }`}\n style={\n selected\n ? {\n backgroundColor: themeColor,\n borderColor: themeColor,\n }\n : undefined\n }\n onClick={() => onChange(n)}\n >\n {n}\n </button>\n );\n })}\n </div>\n {(props.minLabel || props.maxLabel) && (\n <div className=\"flex justify-between text-xs text-gray-400\">\n <span>{props.minLabel ?? \"\"}</span>\n <span>{props.maxLabel ?? \"\"}</span>\n </div>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 16. FileUploadInput\n// ---------------------------------------------------------------------------\n\ninterface FileEntry {\n name: string;\n size: number;\n type: string;\n data_url: string;\n}\n\nexport const FileUploadInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const multiple = props.multiple ?? false;\n const accept = props.accept ?? \"\";\n const maxFiles = props.max_files ?? 10;\n const maxSizeMb = props.max_size_mb ?? 25;\n const files: FileEntry[] = Array.isArray(value) ? value : [];\n const [dragActive, setDragActive] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const processFiles = useCallback(\n (fileList: FileList | null) => {\n if (!fileList || fileList.length === 0) return;\n const incoming = Array.from(fileList);\n const maxBytes = maxSizeMb * 1024 * 1024;\n const toAdd: File[] = [];\n\n for (const f of incoming) {\n if (f.size > maxBytes) continue;\n if (!multiple && toAdd.length >= 1) break;\n if (multiple && files.length + toAdd.length >= maxFiles) break;\n toAdd.push(f);\n }\n\n if (toAdd.length === 0) return;\n\n let loaded = 0;\n const results: FileEntry[] = [];\n for (const f of toAdd) {\n const reader = new FileReader();\n reader.onload = () => {\n results.push({\n name: f.name,\n size: f.size,\n type: f.type,\n data_url: reader.result as string,\n });\n loaded++;\n if (loaded === toAdd.length) {\n if (multiple) {\n onChange([...files, ...results]);\n } else {\n onChange(results.slice(0, 1));\n }\n }\n };\n reader.readAsDataURL(f);\n }\n },\n [files, maxFiles, maxSizeMb, multiple, onChange]\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n processFiles(e.dataTransfer.files);\n },\n [processFiles]\n );\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n }, []);\n\n const removeFile = useCallback(\n (index: number) => {\n const next = files.filter((_, i) => i !== index);\n onChange(next.length > 0 ? next : []);\n },\n [files, onChange]\n );\n\n const formatSize = (bytes: number) => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n };\n\n return (\n <div className=\"space-y-2\">\n <div\n role=\"button\"\n tabIndex={0}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={() => inputRef.current?.click()}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n inputRef.current?.click();\n }\n }}\n className={`flex flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed px-4 py-8 cursor-pointer transition-all duration-200 ${\n dragActive\n ? \"border-current bg-opacity-5\"\n : \"border-gray-300 hover:border-gray-400 bg-gray-50\"\n }`}\n style={\n dragActive\n ? { borderColor: themeColor, backgroundColor: themeColor + \"08\" }\n : undefined\n }\n >\n <svg\n className=\"w-8 h-8 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 16.5V9.75m0 0l3 3m-3-3l-3 3M6.75 19.5a4.5 4.5 0 01-1.41-8.775 5.25 5.25 0 0110.233-2.33 3 3 0 013.758 3.848A3.752 3.752 0 0118 19.5H6.75z\"\n />\n </svg>\n <span className=\"text-sm text-gray-500\">\n {dragActive\n ? \"Drop files here\"\n : multiple\n ? \"Drag & drop files here or click to browse\"\n : \"Drag & drop a file here or click to browse\"}\n </span>\n <span className=\"text-xs text-gray-400\">\n Max {maxSizeMb}MB{accept ? ` \\u00B7 ${accept}` : \"\"}\n </span>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={(e) => {\n processFiles(e.target.files);\n e.target.value = \"\";\n }}\n />\n </div>\n {files.length > 0 && (\n <div className=\"space-y-1.5\">\n {files.map((f, i) => (\n <div\n key={i}\n className=\"flex items-center gap-2 rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm\"\n >\n <svg className=\"w-4 h-4 text-gray-400 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n <span className=\"flex-1 truncate text-gray-700\">{f.name}</span>\n <span className=\"text-xs text-gray-400 flex-shrink-0\">\n {formatSize(f.size)}\n </span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(i);\n }}\n className=\"flex-shrink-0 p-0.5 rounded hover:bg-gray-100 text-gray-400 hover:text-gray-600 transition-colors\"\n aria-label={`Remove ${f.name}`}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 17. SignatureInput\n// ---------------------------------------------------------------------------\n\nexport const SignatureInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const [isEmpty, setIsEmpty] = useState(!value);\n const lastPointRef = useRef<{ x: number; y: number } | null>(null);\n\n const getPos = useCallback(\n (e: React.MouseEvent | React.TouchEvent): { x: number; y: number } => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n const scaleX = canvas.width / rect.width;\n const scaleY = canvas.height / rect.height;\n\n if (\"touches\" in e) {\n const touch = e.touches[0];\n return {\n x: (touch.clientX - rect.left) * scaleX,\n y: (touch.clientY - rect.top) * scaleY,\n };\n }\n return {\n x: (e.clientX - rect.left) * scaleX,\n y: (e.clientY - rect.top) * scaleY,\n };\n },\n []\n );\n\n const startDraw = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n setIsDrawing(true);\n setIsEmpty(false);\n const pos = getPos(e);\n lastPointRef.current = pos;\n const ctx = canvasRef.current?.getContext(\"2d\");\n if (ctx) {\n ctx.beginPath();\n ctx.moveTo(pos.x, pos.y);\n }\n },\n [getPos]\n );\n\n const draw = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n if (!isDrawing) return;\n e.preventDefault();\n const ctx = canvasRef.current?.getContext(\"2d\");\n if (!ctx) return;\n const pos = getPos(e);\n ctx.strokeStyle = \"#1a1a1a\";\n ctx.lineWidth = 2;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n if (lastPointRef.current) {\n ctx.beginPath();\n ctx.moveTo(lastPointRef.current.x, lastPointRef.current.y);\n ctx.lineTo(pos.x, pos.y);\n ctx.stroke();\n }\n lastPointRef.current = pos;\n },\n [isDrawing, getPos]\n );\n\n const endDraw = useCallback(() => {\n if (!isDrawing) return;\n setIsDrawing(false);\n lastPointRef.current = null;\n const canvas = canvasRef.current;\n if (canvas) {\n onChange(canvas.toDataURL(\"image/png\"));\n }\n }, [isDrawing, onChange]);\n\n const clearCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n setIsEmpty(true);\n onChange(null);\n }, [onChange]);\n\n // Restore saved signature\n useEffect(() => {\n if (!value || !canvasRef.current) return;\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n const img = new Image();\n img.onload = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0);\n setIsEmpty(false);\n };\n img.src = value as string;\n // Only restore on initial mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"relative rounded-xl border border-gray-300 bg-white overflow-hidden\">\n {isEmpty && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <span className=\"text-sm text-gray-300 select-none\">\n {props.placeholder ?? \"Sign here\"}\n </span>\n </div>\n )}\n <canvas\n ref={canvasRef}\n width={560}\n height={160}\n className=\"w-full h-auto cursor-crosshair touch-none\"\n style={{ display: \"block\" }}\n onMouseDown={startDraw}\n onMouseMove={draw}\n onMouseUp={endDraw}\n onMouseLeave={endDraw}\n onTouchStart={startDraw}\n onTouchMove={draw}\n onTouchEnd={endDraw}\n />\n </div>\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={clearCanvas}\n className=\"text-xs font-medium px-3 py-1.5 rounded-lg border border-gray-200 text-gray-500 hover:text-gray-700 hover:border-gray-300 transition-colors\"\n >\n Clear\n </button>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Placeholder for unimplemented types\n// ---------------------------------------------------------------------------\n\nconst PlaceholderInput: React.FC<InputProps & { typeName?: string }> = ({\n typeName,\n}) => (\n <div className=\"flex items-center justify-center rounded-lg border border-dashed border-gray-300 bg-gray-50 px-4 py-6 text-sm text-gray-400\">\n Input type \"{typeName ?? \"unknown\"}\" is not yet implemented\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Component map\n// ---------------------------------------------------------------------------\n// 18. EvmAddressInput\n// ---------------------------------------------------------------------------\n\nfunction isValidEvmAddress(addr: string): boolean {\n return /^0x[0-9a-fA-F]{40}$/.test(addr);\n}\n\nexport const EvmAddressInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n const str = (value ?? \"\") as string;\n const isValid = !str || isValidEvmAddress(str);\n return (\n <div className=\"relative\">\n <input\n type=\"text\"\n className={`${baseInput} pr-10 font-mono text-sm ${focused ? \"ring-2\" : \"hover:border-gray-400\"} ${!isValid ? \"border-red-400\" : \"\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"0x0000...0000\"}\n aria-invalid={!isValid}\n value={str}\n onChange={(e) => onChange(e.target.value.trim())}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && onSubmit) { e.preventDefault(); onSubmit(); } }}\n spellCheck={false}\n autoComplete=\"off\"\n />\n {str && (\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm\" aria-hidden=\"true\">\n {isValid ? <span className=\"text-green-500\">&#10003;</span> : <span className=\"text-red-400\">&#10007;</span>}\n </span>\n )}\n {!isValid && str && (\n <p className=\"text-xs text-red-400 mt-1\">Must be a valid EVM address (0x + 40 hex characters)</p>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 19. SolanaAddressInput\n// ---------------------------------------------------------------------------\n\nfunction isValidSolanaAddress(addr: string): boolean {\n // Base58 characters only, 32-44 chars long\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(addr);\n}\n\nexport const SolanaAddressInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n const str = (value ?? \"\") as string;\n const isValid = !str || isValidSolanaAddress(str);\n return (\n <div className=\"relative\">\n <input\n type=\"text\"\n className={`${baseInput} pr-10 font-mono text-sm ${focused ? \"ring-2\" : \"hover:border-gray-400\"} ${!isValid ? \"border-red-400\" : \"\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"So1ana...address\"}\n aria-invalid={!isValid}\n value={str}\n onChange={(e) => onChange(e.target.value.trim())}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && onSubmit) { e.preventDefault(); onSubmit(); } }}\n spellCheck={false}\n autoComplete=\"off\"\n />\n {str && (\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm\" aria-hidden=\"true\">\n {isValid ? <span className=\"text-green-500\">&#10003;</span> : <span className=\"text-red-400\">&#10007;</span>}\n </span>\n )}\n {!isValid && str && (\n <p className=\"text-xs text-red-400 mt-1\">Must be a valid Solana address (32-44 base58 characters)</p>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// 20. BitcoinAddressInput\n// ---------------------------------------------------------------------------\n\nfunction isValidBitcoinAddress(addr: string): boolean {\n // Legacy (1...), P2SH (3...), Bech32 (bc1q...), Taproot (bc1p...)\n if (/^[13][1-9A-HJ-NP-Za-km-z]{25,34}$/.test(addr)) return true;\n if (/^bc1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{39,59}$/i.test(addr)) return true;\n return false;\n}\n\nexport const BitcoinAddressInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n const str = (value ?? \"\") as string;\n const isValid = !str || isValidBitcoinAddress(str);\n return (\n <div className=\"relative\">\n <input\n type=\"text\"\n className={`${baseInput} pr-10 font-mono text-sm ${focused ? \"ring-2\" : \"hover:border-gray-400\"} ${!isValid ? \"border-red-400\" : \"\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"bc1q...or 1...or 3...\"}\n aria-invalid={!isValid}\n value={str}\n onChange={(e) => onChange(e.target.value.trim())}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && onSubmit) { e.preventDefault(); onSubmit(); } }}\n spellCheck={false}\n autoComplete=\"off\"\n />\n {str && (\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm\" aria-hidden=\"true\">\n {isValid ? <span className=\"text-green-500\">&#10003;</span> : <span className=\"text-red-400\">&#10007;</span>}\n </span>\n )}\n {!isValid && str && (\n <p className=\"text-xs text-red-400 mt-1\">Must be a valid Bitcoin address (Legacy, P2SH, or Bech32)</p>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PasswordInput\n// ---------------------------------------------------------------------------\n\nexport const PasswordInput: React.FC<InputProps> = ({\n props,\n value,\n onChange,\n themeColor,\n onSubmit,\n}) => {\n const [focused, setFocused] = useState(false);\n const [visible, setVisible] = useState(false);\n return (\n <div className=\"relative\">\n <input\n type={visible ? \"text\" : \"password\"}\n className={`${baseInput} pr-10 ${focused ? \"ring-2\" : \"hover:border-gray-400\"}`}\n style={focused ? focusRingStyle(themeColor) : undefined}\n placeholder={props.placeholder ?? \"\"}\n maxLength={props.maxLength}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && onSubmit) { e.preventDefault(); onSubmit(); } }}\n autoComplete=\"new-password\"\n />\n <button\n type=\"button\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 rounded text-gray-400 hover:text-gray-600 transition-colors\"\n onClick={() => setVisible((v) => !v)}\n aria-label={visible ? \"Hide password\" : \"Show password\"}\n tabIndex={-1}\n >\n {visible ? (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n )}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n\nexport const InputComponentMap: Record<string, React.FC<InputProps>> = {\n short_text: ShortTextInput,\n long_text: LongTextInput,\n email: EmailInput,\n phone: PhoneInput,\n url: UrlInput,\n number: NumberInput,\n dropdown: DropdownInput,\n multiple_choice: MultipleChoiceInput,\n checkboxes: CheckboxesInput,\n picture_choice: PictureChoiceInput,\n switch: SwitchInput,\n checkbox: CheckboxInput,\n star_rating: StarRatingInput,\n slider: SliderInput,\n opinion_scale: OpinionScaleInput,\n file_upload: FileUploadInput,\n signature: SignatureInput,\n evm_address: EvmAddressInput,\n solana_address: SolanaAddressInput,\n bitcoin_address: BitcoinAddressInput,\n password: PasswordInput,\n};\n\n// Proxy that returns a placeholder for unknown types\nexport const getInputComponent = (type: string): React.FC<InputProps> => {\n if (InputComponentMap[type]) return InputComponentMap[type];\n return (props: InputProps) => <PlaceholderInput {...props} typeName={type} />;\n};\n\n// Late-bound display component lookup (avoids circular import with display/index.tsx)\nlet _getDisplayComponent: ((type: string) => React.FC<any> | undefined) | null = null;\n\n/** Called once from display/index.tsx to register the display component map */\nexport const registerDisplayComponents = (lookup: (type: string) => React.FC<any> | undefined) => {\n _getDisplayComponent = lookup;\n};\n","import React, { useRef, useEffect, useCallback, useState, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { VideoComponentState } from \"@shared/types\";\nimport { getInputComponent, registerDisplayComponents } from \"../inputs\";\n\n// ---------------------------------------------------------------------------\n// Shared types\n// ---------------------------------------------------------------------------\n\nexport interface DisplayProps {\n props: Record<string, any>;\n themeColor: string;\n isCover?: boolean;\n componentId?: string;\n onVideoStateChange?: (componentId: string, state: VideoComponentState) => void;\n formState?: Record<string, any>;\n onFieldChange?: (id: string, value: any) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Template interpolation (scanner-based, no regex)\n// ---------------------------------------------------------------------------\n\n/**\n * Replace `{{key}}`, `{{var:key}}`, `{{global:key}}` tokens in a template string.\n * Uses a character scanner instead of regex for reliability with dotted nested keys,\n * whitespace tolerance, and easier future extension.\n *\n * @param encode - when true, values are URI-encoded (used for iframe src templates)\n */\nfunction interpolateTemplate(\n template: string,\n formState?: Record<string, any>,\n encode = false,\n): string {\n const kit = (window as any).CatalogKit?.get?.();\n const len = template.length;\n let out = \"\";\n let i = 0;\n\n while (i < len) {\n // Look for opening {{\n if (template[i] === \"{\" && i + 1 < len && template[i + 1] === \"{\") {\n const start = i;\n i += 2; // skip {{\n\n // Find closing }}\n let j = i;\n while (j < len - 1) {\n if (template[j] === \"}\" && template[j + 1] === \"}\") break;\n j++;\n }\n\n if (j < len - 1) {\n // Extract and trim the token content between {{ and }}\n const token = template.slice(i, j).trim();\n i = j + 2; // skip }}\n\n // Resolve the value\n let val: any;\n if (token.startsWith(\"var:\")) {\n val = kit?.getVar(token.slice(4).trim());\n } else if (token.startsWith(\"global:\")) {\n val = kit?.getGlobal(token.slice(7).trim());\n } else if (formState) {\n val = formState[token];\n }\n\n out += val != null ? (encode ? encodeURIComponent(String(val)) : String(val)) : \"\";\n } else {\n // No closing }} found — emit the raw text\n out += template.slice(start);\n break;\n }\n } else {\n out += template[i];\n i++;\n }\n }\n\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction renderMarkdownish(text: string): string {\n const lines = text.split(/\\n/);\n let html = \"\";\n let inUl = false;\n let inOl = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n const bulletMatch = trimmed.match(/^[-•]\\s+(.*)/);\n const orderedMatch = trimmed.match(/^\\d+\\.\\s+(.*)/);\n\n if (bulletMatch) {\n if (inOl) { html += \"</ol>\"; inOl = false; }\n if (!inUl) { html += '<ul class=\"list-disc pl-5 my-3 space-y-1.5\">'; inUl = true; }\n html += `<li>${inlineMarkdown(bulletMatch[1])}</li>`;\n } else if (orderedMatch) {\n if (inUl) { html += \"</ul>\"; inUl = false; }\n if (!inOl) { html += '<ol class=\"list-decimal pl-5 my-3 space-y-1.5\">'; inOl = true; }\n html += `<li>${inlineMarkdown(orderedMatch[1])}</li>`;\n } else {\n if (inUl) { html += \"</ul>\"; inUl = false; }\n if (inOl) { html += \"</ol>\"; inOl = false; }\n if (trimmed === \"\") {\n html += \"<br/>\";\n } else {\n if (html.length > 0 && !html.endsWith(\">\")) html += \"<br/>\";\n html += inlineMarkdown(trimmed);\n }\n }\n }\n\n if (inUl) html += \"</ul>\";\n if (inOl) html += \"</ol>\";\n return html;\n}\n\nfunction inlineMarkdown(text: string): string {\n return text\n .replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\")\n .replace(/\\*(.+?)\\*/g, \"<em>$1</em>\")\n .replace(/~~(.+?)~~/g, '<del class=\"opacity-60\">$1</del>')\n .replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"underline decoration-1 underline-offset-2 hover:opacity-80 transition-opacity\">$1</a>'\n );\n}\n\nfunction alignClass(align?: string): string {\n switch (align) {\n case \"center\": return \"text-center\";\n case \"right\": return \"text-right\";\n default: return \"text-left\";\n }\n}\n\nfunction isYouTubeUrl(url: string): boolean {\n return /(?:youtube\\.com|youtu\\.be)/.test(url);\n}\n\nfunction isVimeoUrl(url: string): boolean {\n return /vimeo\\.com/.test(url);\n}\n\nfunction getYouTubeEmbedUrl(url: string): string {\n const match = url.match(/(?:youtube\\.com\\/(?:watch\\?v=|embed\\/)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/);\n return match ? `https://www.youtube.com/embed/${match[1]}` : url;\n}\n\nfunction getVimeoEmbedUrl(url: string): string {\n const match = url.match(/vimeo\\.com\\/(\\d+)/);\n return match ? `https://player.vimeo.com/video/${match[1]}` : url;\n}\n\n// ---------------------------------------------------------------------------\n// Display Components\n// ---------------------------------------------------------------------------\n\nexport const HeadingDisplay: React.FC<DisplayProps> = ({ props, isCover }) => {\n const level: number = props.level ?? 1;\n const Tag = (`h${Math.min(Math.max(level, 1), 6)}` as keyof JSX.IntrinsicElements);\n\n const sizeClasses: Record<number, string> = {\n 1: \"text-4xl sm:text-5xl font-extrabold tracking-tight leading-[1.1]\",\n 2: \"text-3xl sm:text-4xl font-bold tracking-tight leading-[1.15]\",\n 3: \"text-2xl sm:text-3xl font-bold leading-tight\",\n 4: \"text-xl sm:text-2xl font-semibold leading-snug\",\n 5: \"text-lg sm:text-xl font-semibold\",\n 6: \"text-base sm:text-lg font-medium\",\n };\n\n return (\n <div className={`${alignClass(props.align)} space-y-3`}>\n {props.micro_heading && (\n <p className={`text-xs sm:text-sm font-medium uppercase tracking-widest ${isCover ? \"text-white/60\" : \"text-gray-400\"}`}>\n {props.micro_heading}\n </p>\n )}\n <Tag\n className={`${sizeClasses[level] ?? sizeClasses[1]} ${isCover ? \"text-white drop-shadow-lg\" : \"text-gray-900\"} cf-text-balance`}\n style={{ letterSpacing: level <= 2 ? \"-0.025em\" : undefined }}\n >\n {props.text ?? props.content}\n </Tag>\n {props.subtitle && (\n <p className={`text-base sm:text-lg font-normal leading-relaxed ${isCover ? \"text-white/75\" : \"text-gray-500\"}`}>\n {props.subtitle}\n </p>\n )}\n </div>\n );\n};\n\nexport const ParagraphDisplay: React.FC<DisplayProps> = ({ props, isCover }) => {\n return (\n <div\n className={`${alignClass(props.align)} ${isCover ? \"text-white/85\" : \"text-gray-600\"} text-lg leading-[1.7] [&_ul]:text-left [&_ol]:text-left`}\n dangerouslySetInnerHTML={{ __html: renderMarkdownish(props.text ?? props.content ?? \"\") }}\n />\n );\n};\n\nexport const BannerDisplay: React.FC<DisplayProps> = ({ props, isCover }) => {\n const variants: Record<string, { bg: string; border: string; text: string; icon: string }> = {\n info: { bg: \"bg-blue-50\", border: \"border-blue-100\", text: \"text-blue-700\", icon: \"\\u2139\\uFE0F\" },\n warning: { bg: \"bg-amber-50\", border: \"border-amber-100\", text: \"text-amber-700\", icon: \"\\u26A0\\uFE0F\" },\n success: { bg: \"bg-emerald-50\", border: \"border-emerald-100\", text: \"text-emerald-700\", icon: \"\\u2705\" },\n error: { bg: \"bg-red-50\", border: \"border-red-100\", text: \"text-red-700\", icon: \"\\u274C\" },\n };\n\n const v = variants[props.variant ?? props.style] ?? variants.info;\n const bannerText = props.text ?? props.content ?? \"\";\n\n if (isCover) {\n return (\n <div className=\"cf-banner-glass rounded-2xl px-5 py-3.5 flex items-center justify-center gap-3\">\n <span className=\"text-base flex-shrink-0\">{v.icon}</span>\n <div\n className=\"text-sm leading-relaxed text-white/90 font-medium\"\n dangerouslySetInnerHTML={{ __html: renderMarkdownish(bannerText) }}\n />\n </div>\n );\n }\n\n return (\n <div role={props.variant === \"error\" || props.style === \"error\" ? \"alert\" : \"status\"} className={`${v.bg} ${v.border} ${v.text} border rounded-2xl px-5 py-4 flex items-start gap-3`}>\n <span className=\"text-lg flex-shrink-0 mt-0.5\" aria-hidden=\"true\">{v.icon}</span>\n <div\n className=\"text-sm leading-relaxed\"\n dangerouslySetInnerHTML={{ __html: renderMarkdownish(bannerText) }}\n />\n </div>\n );\n};\n\nexport const ImageDisplay: React.FC<DisplayProps> = ({ props }) => {\n const borderRadius = props.border_radius ?? 16;\n const link = props.link;\n\n const img = (\n <img\n src={props.src}\n alt={props.alt ?? \"\"}\n width={props.width}\n height={props.height}\n className=\"ck-img\"\n loading=\"lazy\"\n />\n );\n\n return (\n <div className=\"w-full overflow-hidden\" style={{ borderRadius }}>\n {link ? (\n <a href={link} target=\"_blank\" rel=\"noopener noreferrer\">\n {img}\n </a>\n ) : (\n img\n )}\n </div>\n );\n};\n\nexport const VideoDisplay: React.FC<DisplayProps> = ({ props, componentId, onVideoStateChange }) => {\n const src: string = props.src ?? \"\";\n const hlsUrl: string | undefined = props.hls_url;\n const autoplay = props.autoplay ?? false;\n const muted = props.muted ?? false;\n const loop = props.loop ?? false;\n const skippable = props.skippable ?? true;\n\n // For YouTube/Vimeo — keep existing iframe logic\n if (!hlsUrl && isYouTubeUrl(src)) {\n let embedUrl = getYouTubeEmbedUrl(src);\n const params = new URLSearchParams();\n if (autoplay) params.set(\"autoplay\", \"1\");\n if (muted) params.set(\"mute\", \"1\");\n if (loop) params.set(\"loop\", \"1\");\n const qs = params.toString();\n if (qs) embedUrl += `?${qs}`;\n\n return (\n <div className=\"relative w-full overflow-hidden rounded-2xl shadow-lg\" style={{ paddingTop: \"56.25%\" }}>\n <iframe src={embedUrl} className=\"absolute inset-0 w-full h-full\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowFullScreen title={props.title || \"Video\"} />\n </div>\n );\n }\n\n if (!hlsUrl && isVimeoUrl(src)) {\n let embedUrl = getVimeoEmbedUrl(src);\n const params = new URLSearchParams();\n if (autoplay) params.set(\"autoplay\", \"1\");\n if (muted) params.set(\"muted\", \"1\");\n if (loop) params.set(\"loop\", \"1\");\n const qs = params.toString();\n if (qs) embedUrl += `?${qs}`;\n\n return (\n <div className=\"relative w-full overflow-hidden rounded-2xl shadow-lg\" style={{ paddingTop: \"56.25%\" }}>\n <iframe src={embedUrl} className=\"absolute inset-0 w-full h-full\" allow=\"autoplay; fullscreen; picture-in-picture\" allowFullScreen title={props.title || \"Video\"} />\n </div>\n );\n }\n\n // HLS or direct MP4 — use HTML5 video with hls.js for HLS\n return (\n <HlsVideoPlayer\n src={hlsUrl || src}\n isHls={!!hlsUrl}\n autoplay={autoplay}\n muted={muted}\n loop={loop}\n poster={props.poster}\n skippable={skippable}\n chapters={props.chapters}\n componentId={componentId}\n onVideoStateChange={onVideoStateChange}\n />\n );\n};\n\n// ---------------------------------------------------------------------------\n// HLS Video Player (uses hls.js for adaptive streaming)\n// ---------------------------------------------------------------------------\n\ninterface HlsVideoPlayerProps {\n src: string;\n isHls: boolean;\n autoplay: boolean;\n muted: boolean;\n loop: boolean;\n poster?: string;\n skippable: boolean;\n chapters?: { time: number; label: string }[];\n componentId?: string;\n onVideoStateChange?: (componentId: string, state: VideoComponentState) => void;\n}\n\nconst HlsVideoPlayer: React.FC<HlsVideoPlayerProps> = ({\n src,\n isHls,\n autoplay,\n muted,\n loop,\n poster,\n skippable,\n chapters,\n componentId,\n onVideoStateChange,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const hlsRef = useRef<any>(null);\n const maxWatchedRef = useRef(0);\n const lastReportedPercentRef = useRef(-1);\n\n const reportState = useCallback(() => {\n if (!componentId || !onVideoStateChange || !videoRef.current) return;\n const video = videoRef.current;\n const duration = video.duration || 0;\n const currentTime = video.currentTime;\n const watchPercent = duration > 0 ? Math.round((currentTime / duration) * 100) : 0;\n\n // Find current chapter\n let currentChapter = 0;\n if (chapters) {\n for (let i = chapters.length - 1; i >= 0; i--) {\n if (currentTime >= chapters[i].time) {\n currentChapter = i;\n break;\n }\n }\n }\n\n const percent = Math.min(watchPercent, 100);\n // Only report if percent changed by at least 1%\n if (percent === lastReportedPercentRef.current) return;\n lastReportedPercentRef.current = percent;\n\n onVideoStateChange(componentId, {\n watch_percent: percent,\n watch_time: currentTime,\n duration,\n current_chapter: currentChapter,\n completed: percent >= 99,\n });\n }, [componentId, onVideoStateChange, chapters]);\n\n // Initialize HLS.js for HLS streams\n useEffect(() => {\n if (!isHls || !src || !videoRef.current) return;\n\n let hls: any = null;\n\n const loadHls = async () => {\n try {\n const { default: Hls } = await import(\"hls.js\");\n if (!videoRef.current) return;\n\n if (Hls.isSupported()) {\n hls = new Hls({\n maxBufferLength: 30,\n maxMaxBufferLength: 60,\n });\n hls.loadSource(src);\n hls.attachMedia(videoRef.current);\n hlsRef.current = hls;\n } else if (videoRef.current.canPlayType(\"application/vnd.apple.mpegurl\")) {\n // Safari native HLS\n videoRef.current.src = src;\n }\n } catch {\n // hls.js not available, try native\n if (videoRef.current) {\n videoRef.current.src = src;\n }\n }\n };\n\n loadHls();\n\n return () => {\n if (hls) {\n hls.destroy();\n hlsRef.current = null;\n }\n };\n }, [src, isHls]);\n\n // Non-skippable enforcement\n useEffect(() => {\n if (skippable || !videoRef.current) return;\n const video = videoRef.current;\n\n const handleSeeking = () => {\n if (video.currentTime > maxWatchedRef.current + 1) {\n video.currentTime = maxWatchedRef.current;\n }\n };\n\n const handleTimeUpdate = () => {\n if (video.currentTime > maxWatchedRef.current) {\n maxWatchedRef.current = video.currentTime;\n }\n };\n\n video.addEventListener(\"seeking\", handleSeeking);\n video.addEventListener(\"timeupdate\", handleTimeUpdate);\n return () => {\n video.removeEventListener(\"seeking\", handleSeeking);\n video.removeEventListener(\"timeupdate\", handleTimeUpdate);\n };\n }, [skippable]);\n\n // State reporting via timeupdate\n useEffect(() => {\n const video = videoRef.current;\n if (!video || !componentId) return;\n\n const handleTimeUpdate = () => reportState();\n const handleEnded = () => {\n if (componentId && onVideoStateChange) {\n const duration = video.duration || 0;\n onVideoStateChange(componentId, {\n watch_percent: 100,\n watch_time: duration,\n duration,\n current_chapter: chapters ? chapters.length - 1 : 0,\n completed: true,\n });\n }\n };\n\n video.addEventListener(\"timeupdate\", handleTimeUpdate);\n video.addEventListener(\"ended\", handleEnded);\n return () => {\n video.removeEventListener(\"timeupdate\", handleTimeUpdate);\n video.removeEventListener(\"ended\", handleEnded);\n };\n }, [componentId, onVideoStateChange, reportState, chapters]);\n\n return (\n <div className=\"w-full\">\n <div className=\"relative w-full overflow-hidden rounded-2xl shadow-lg\">\n <video\n ref={videoRef}\n src={isHls ? undefined : src}\n autoPlay={autoplay}\n muted={muted}\n loop={loop}\n poster={poster}\n controls\n playsInline\n className=\"w-full\"\n />\n </div>\n {chapters && chapters.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {chapters.map((ch, i) => (\n <button\n key={i}\n onClick={() => {\n if (videoRef.current) {\n if (!skippable && ch.time > maxWatchedRef.current + 1) return;\n videoRef.current.currentTime = ch.time;\n }\n }}\n className=\"text-xs px-3 py-1.5 rounded-full bg-gray-100 hover:bg-gray-200 text-gray-700 transition-colors\"\n >\n {formatTime(ch.time)} — {ch.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nfunction formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = Math.floor(seconds % 60);\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n}\n\nexport const TableDisplay: React.FC<DisplayProps> = ({ props, themeColor }) => {\n const headers: string[] = props.headers ?? [];\n const rows: string[][] = props.rows ?? [];\n\n return (\n <div className=\"w-full overflow-x-auto rounded-xl border border-gray-200\">\n <table className=\"w-full text-left\">\n {headers.length > 0 && (\n <thead>\n <tr className=\"border-b border-gray-200\" style={{ backgroundColor: `${themeColor}08` }}>\n {headers.map((h, i) => (\n <th key={i} scope=\"col\" className=\"px-4 py-3 font-semibold text-gray-900 text-sm\">{h}</th>\n ))}\n </tr>\n </thead>\n )}\n <tbody>\n {rows.map((row, ri) => (\n <tr key={ri} className={ri < rows.length - 1 ? \"border-b border-gray-100\" : \"\"}>\n {row.map((cell, ci) => (\n <td key={ci} className=\"px-4 py-3 text-gray-600 text-sm leading-relaxed\">{cell}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n\nexport const DividerDisplay: React.FC<DisplayProps> = () => {\n return <hr className=\"border-t border-gray-100 my-4\" />;\n};\n\nexport const SocialLinksDisplay: React.FC<DisplayProps> = ({ props, themeColor, isCover }) => {\n const links: { platform: string; url: string }[] = props.links ?? [];\n\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-2.5\">\n {links.map((link, i) => (\n <a\n key={i}\n href={link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center px-4 py-2.5 rounded-full text-sm font-medium transition-all duration-200 hover:scale-105 hover:shadow-md\"\n style={isCover ? {\n backgroundColor: 'rgba(255,255,255,0.12)',\n color: 'white',\n border: '1px solid rgba(255,255,255,0.2)',\n } : {\n backgroundColor: `${themeColor}0a`,\n color: themeColor,\n border: `1.5px solid ${themeColor}20`,\n }}\n >\n {link.platform}\n </a>\n ))}\n </div>\n );\n};\n\nexport const HtmlDisplay: React.FC<DisplayProps> = ({ props, formState }) => {\n const containerRef = React.useRef<HTMLDivElement>(null);\n const executedScriptsRef = React.useRef<Set<string>>(new Set());\n\n // Template interpolation: replace {{field_id}}, {{var:key}}, {{global:key}} with current values\n const interpolatedContent = interpolateTemplate(props.content ?? \"\", formState);\n\n // Execute inline <script> tags after render\n React.useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const debugMode = new URLSearchParams(window.location.search).get(\"debug_mode\");\n const scripts = container.querySelectorAll(\"script\");\n scripts.forEach((originalScript) => {\n // Fingerprint the script to avoid re-executing on re-renders\n const key = originalScript.src || originalScript.textContent || \"\";\n if (executedScriptsRef.current.has(key)) return;\n executedScriptsRef.current.add(key);\n\n if (debugMode) {\n const preview = key.slice(0, 120).replace(/\\s+/g, \" \");\n console.log(`[CatalogKit:slim] Executing script: ${originalScript.src || preview}...`);\n console.log(`[CatalogKit:slim] CatalogKit available: ${!!window.CatalogKit?.get?.()}`);\n }\n\n if (originalScript.src) {\n // External script — clone and append to load it\n const newScript = document.createElement(\"script\");\n newScript.src = originalScript.src;\n if (originalScript.type) newScript.type = originalScript.type;\n newScript.async = true;\n container.appendChild(newScript);\n } else if (originalScript.textContent) {\n // Inline script — execute via new Function for clean scope\n try {\n const fn = new Function(originalScript.textContent);\n fn();\n } catch (e) {\n console.error(\"[CatalogKit] Inline script error:\", e);\n }\n }\n });\n }, [interpolatedContent]);\n\n return (\n <div\n ref={containerRef}\n className=\"prose prose-sm sm:prose max-w-none\"\n dangerouslySetInnerHTML={{ __html: interpolatedContent }}\n />\n );\n};\n\n// ---------------------------------------------------------------------------\n// FAQ Accordion\n// ---------------------------------------------------------------------------\n\nexport const FaqDisplay: React.FC<DisplayProps> = ({ props, themeColor }) => {\n const items: { question: string; answer: string }[] = props.items ?? [];\n const allowMultiple = props.allow_multiple ?? false;\n const defaultOpen = props.default_open;\n\n const [openIndices, setOpenIndices] = React.useState<Set<number>>(() => {\n const initial = new Set<number>();\n if (defaultOpen != null) initial.add(defaultOpen);\n return initial;\n });\n\n const toggle = (index: number) => {\n setOpenIndices((prev) => {\n const next = new Set(allowMultiple ? prev : []);\n if (prev.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n return (\n <div className=\"space-y-2\">\n {props.title && (\n <h3 className=\"text-xl font-bold text-gray-900 mb-4\">{props.title}</h3>\n )}\n {items.map((item, i) => {\n const isOpen = openIndices.has(i);\n return (\n <div\n key={i}\n className=\"border border-gray-200 rounded-xl overflow-hidden transition-all\"\n style={isOpen ? { borderColor: `${themeColor}40` } : undefined}\n >\n <button\n onClick={() => toggle(i)}\n aria-expanded={isOpen}\n aria-controls={`faq-answer-${i}`}\n className=\"w-full flex items-center justify-between px-5 py-4 text-left hover:bg-gray-50 transition-colors\"\n >\n <span id={`faq-question-${i}`} className=\"text-lg font-semibold text-gray-900 pr-4\">{item.question}</span>\n <svg\n className=\"w-5 h-5 text-gray-400 flex-shrink-0 transition-transform duration-200\"\n style={isOpen ? { transform: \"rotate(180deg)\", color: themeColor } : undefined}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\" />\n </svg>\n </button>\n {isOpen && (\n <div id={`faq-answer-${i}`} role=\"region\" aria-labelledby={`faq-question-${i}`} className=\"px-5 pb-4 text-sm text-gray-600 leading-relaxed border-t border-gray-100 pt-3\">\n {item.answer}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Testimonial\n// ---------------------------------------------------------------------------\n\nexport const TestimonialDisplay: React.FC<DisplayProps> = ({ props, themeColor }) => {\n const variant = props.variant ?? \"card\";\n const size = props.size ?? \"medium\"; // compact, medium, large\n const rating = props.rating as number | undefined;\n\n const starSize = size === \"compact\" ? \"w-3 h-3\" : size === \"large\" ? \"w-5 h-5\" : \"w-4 h-4\";\n const stars = rating ? (\n <div className=\"flex gap-0.5\" role=\"img\" aria-label={`${rating} out of 5 stars`}>\n {Array.from({ length: rating }, (_, i) => (\n <svg key={i} className={starSize} style={{ color: \"#f59e0b\" }} fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z\" />\n </svg>\n ))}\n </div>\n ) : null;\n\n const avatarSize = size === \"compact\" ? \"w-7 h-7\" : size === \"large\" ? \"w-14 h-14\" : \"w-10 h-10\";\n const textSize = size === \"compact\" ? \"text-sm\" : size === \"large\" ? \"text-xl\" : \"text-lg\";\n const nameSize = size === \"compact\" ? \"text-xs\" : size === \"large\" ? \"text-base\" : \"text-sm\";\n const roleSize = size === \"compact\" ? \"text-[10px]\" : size === \"large\" ? \"text-sm\" : \"text-xs\";\n\n const authorLink = props.link ? (\n <a href={props.link} target=\"_blank\" rel=\"noopener noreferrer\" className={`${nameSize} font-semibold text-gray-900 hover:underline`}>{props.author}</a>\n ) : (\n <div className={`${nameSize} font-semibold text-gray-900`}>{props.author}</div>\n );\n\n const subtitle = props.subtitle || props.role;\n\n if (variant === \"quote\") {\n return (\n <blockquote className=\"border-l-[3px] pl-4\" style={{ borderColor: themeColor }}>\n {stars && <div className=\"mb-2\">{stars}</div>}\n <p className={`text-gray-600 italic leading-relaxed ${textSize}`}>&ldquo;{props.text}&rdquo;</p>\n <footer className={`${size === \"compact\" ? \"mt-2\" : \"mt-3\"} flex items-center gap-3`}>\n {props.avatar && (\n <img src={props.avatar} alt=\"\" className={`${avatarSize} rounded-full object-cover`} />\n )}\n <div>\n {authorLink}\n {subtitle && <div className={`${roleSize} text-gray-500`}>{subtitle}</div>}\n </div>\n </footer>\n </blockquote>\n );\n }\n\n if (variant === \"minimal\") {\n return (\n <div className=\"text-center space-y-3\">\n {stars && <div className=\"flex justify-center\">{stars}</div>}\n <p className={`text-gray-600 italic ${textSize} leading-relaxed max-w-lg mx-auto`}>&ldquo;{props.text}&rdquo;</p>\n <div className=\"flex items-center justify-center gap-3\">\n {props.avatar && (\n <img src={props.avatar} alt=\"\" className={`${avatarSize} rounded-full object-cover`} />\n )}\n <span className={`${roleSize} text-gray-500`}>\n {props.link ? (\n <a href={props.link} target=\"_blank\" rel=\"noopener noreferrer\" className=\"font-bold text-gray-900 hover:underline\">{props.author}</a>\n ) : (\n <strong className=\"text-gray-900\">{props.author}</strong>\n )}\n {subtitle && <>, {subtitle}</>}\n </span>\n </div>\n </div>\n );\n }\n\n // card (default)\n const padding = size === \"compact\" ? \"p-3.5\" : size === \"large\" ? \"p-7\" : \"p-5\";\n return (\n <div className={`bg-gray-50 rounded-2xl ${padding} space-y-3`}>\n {stars}\n <p className={`${textSize} text-gray-700 leading-relaxed`}>&ldquo;{props.text}&rdquo;</p>\n <div className={`flex items-center gap-3 ${size === \"compact\" ? \"pt-0.5\" : \"pt-1\"}`}>\n {props.avatar ? (\n <img src={props.avatar} alt=\"\" className={`${avatarSize} rounded-full object-cover`} />\n ) : (\n <div\n className={`${avatarSize} rounded-full flex items-center justify-center text-white font-bold ${size === \"compact\" ? \"text-xs\" : \"text-sm\"}`}\n style={{ backgroundColor: themeColor }}\n >\n {props.author?.[0]?.toUpperCase() || \"?\"}\n </div>\n )}\n <div>\n {authorLink}\n {subtitle && <div className={`${roleSize} text-gray-500`}>{subtitle}</div>}\n </div>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Pricing Card\n// ---------------------------------------------------------------------------\n\nexport const PricingCardDisplay: React.FC<DisplayProps> = ({ props, themeColor }) => {\n const features: string[] = props.features ?? [];\n const excluded: string[] = props.excluded_features ?? [];\n const highlighted = props.highlighted ?? false;\n\n return (\n <div\n className=\"rounded-2xl p-6 space-y-5\"\n style={\n highlighted\n ? { border: `2px solid ${themeColor}`, background: `${themeColor}05` }\n : { border: \"1px solid #e5e7eb\", background: \"#fff\" }\n }\n >\n {props.badge && (\n <span\n className=\"inline-block px-3 py-1 rounded-full text-xs font-bold uppercase tracking-wide text-white\"\n style={{ backgroundColor: themeColor }}\n >\n {props.badge}\n </span>\n )}\n <div>\n <h3 className=\"text-lg font-bold text-gray-900\">{props.title}</h3>\n <div className=\"mt-2\">\n <span className=\"text-3xl font-extrabold text-gray-900\">{props.price}</span>\n {props.price_subtext && (\n <span className=\"text-sm text-gray-500 ml-2\">{props.price_subtext}</span>\n )}\n </div>\n </div>\n <div className=\"space-y-2.5\">\n {features.map((f, i) => (\n <div key={i} className=\"flex items-start gap-2.5\">\n <svg className=\"w-5 h-5 flex-shrink-0 mt-0.5\" style={{ color: themeColor }} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\n </svg>\n <span className=\"text-sm text-gray-700\">{f}</span>\n </div>\n ))}\n {excluded.map((f, i) => (\n <div key={`ex-${i}`} className=\"flex items-start gap-2.5\">\n <svg className=\"w-5 h-5 flex-shrink-0 mt-0.5 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n <span className=\"text-sm text-gray-400 line-through\">{f}</span>\n </div>\n ))}\n </div>\n {props.cta_text && (\n <button\n className=\"w-full py-3 rounded-xl font-semibold text-sm transition-all\"\n style={\n highlighted\n ? { backgroundColor: themeColor, color: \"#fff\" }\n : { border: `2px solid ${themeColor}`, color: themeColor }\n }\n >\n {props.cta_text}\n </button>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Timeline\n// ---------------------------------------------------------------------------\n\ninterface TimelineItem {\n title: string;\n description?: string;\n icon?: string;\n image?: string;\n color?: string;\n button?: {\n label: string;\n url: string;\n target?: \"_blank\" | \"_self\";\n size?: \"sm\" | \"md\" | \"lg\";\n style?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n icon?: string;\n };\n side_button?: {\n label: string;\n url: string;\n target?: \"_blank\" | \"_self\";\n size?: \"sm\" | \"md\" | \"lg\";\n style?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n icon?: string;\n };\n checkbox?: boolean | { label?: string };\n inputs?: { id: string; type: string; label?: string; placeholder?: string; required?: boolean; props?: Record<string, any> }[];\n}\n\nexport const TimelineDisplay: React.FC<DisplayProps> = ({ props, themeColor, componentId, formState, onFieldChange }) => {\n const items: TimelineItem[] = props.items ?? [];\n const variant: \"default\" | \"alternating\" = props.variant ?? \"default\";\n\n if (items.length === 0) return null;\n\n return (\n <div className=\"w-full py-4\">\n {/* Mobile: always left-aligned. Desktop: center for alternating, left for default */}\n <div className={`relative ${variant === \"alternating\" ? \"md:mx-auto md:max-w-3xl\" : \"max-w-xl\"}`}>\n {/* Vertical line */}\n <div\n className={`absolute top-0 bottom-0 w-0.5 ${variant === \"alternating\" ? \"left-5 md:left-1/2 md:-translate-x-px\" : \"left-5\"}`}\n style={{ backgroundColor: `${themeColor}20` }}\n />\n\n <div className=\"space-y-8\">\n {items.map((item, i) => {\n const color = item.color || themeColor;\n const isRight = variant === \"default\" || i % 2 === 0;\n\n return (\n <div\n key={i}\n className={`relative flex items-start ${\n variant === \"alternating\"\n ? `md:flex-row ${!isRight ? \"md:flex-row-reverse\" : \"\"}`\n : \"\"\n }`}\n >\n {/* Colored line segment between this dot and the next */}\n {i < items.length - 1 && (\n <div\n className={`absolute w-0.5 ${variant === \"alternating\" ? \"left-5 md:left-1/2 md:-translate-x-px\" : \"left-5\"}`}\n style={{\n backgroundColor: color,\n top: item.image ? \"40px\" : \"20px\",\n height: \"calc(100% + 2rem - 20px)\",\n }}\n />\n )}\n\n {/* Dot / Icon / Image circle */}\n <div\n className={`relative z-10 flex-shrink-0 flex items-center justify-center rounded-full border-2 border-white shadow-sm ${\n variant === \"alternating\"\n ? \"ml-[6px] md:ml-0 md:absolute md:left-1/2 md:-translate-x-1/2\"\n : \"ml-[6px]\"\n } ${item.image ? \"w-10 h-10\" : \"w-[38px] h-[38px]\"}`}\n style={{ backgroundColor: color }}\n >\n {item.image ? (\n <img\n src={item.image}\n alt=\"\"\n className=\"w-full h-full rounded-full object-cover\"\n />\n ) : item.icon ? (\n <span className=\"text-base leading-none\">{item.icon}</span>\n ) : (\n <span className=\"w-2.5 h-2.5 rounded-full bg-white\" />\n )}\n </div>\n\n {/* Content card */}\n <div\n className={`ml-5 flex-1 bg-white rounded-xl border border-gray-100 shadow-sm px-5 py-4 ${\n variant === \"alternating\"\n ? `md:w-[calc(50%-32px)] md:flex-none ${\n isRight ? \"md:ml-[calc(50%+16px)]\" : \"md:mr-[calc(50%+16px)] md:ml-0 md:text-right\"\n }`\n : \"\"\n }`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <h4 className=\"text-lg font-semibold text-gray-900\">{item.title}</h4>\n {item.side_button && (() => {\n const sb = item.side_button!;\n const sz = sb.size ?? \"sm\";\n const st = sb.style ?? \"secondary\";\n const pad = sz === \"lg\" ? \"px-4 py-2 text-sm\" : sz === \"md\" ? \"px-3 py-1.5 text-xs\" : \"px-2.5 py-1 text-xs\";\n const base = `inline-flex items-center gap-1.5 rounded-lg font-medium transition-colors no-underline flex-shrink-0 ${pad}`;\n const inlineStyle: Record<string, string> =\n st === \"primary\"\n ? { backgroundColor: color }\n : st === \"secondary\"\n ? { borderColor: color + \"40\", color, backgroundColor: color + \"0a\" }\n : st === \"outline\"\n ? { borderColor: color + \"40\", color }\n : { color };\n return (\n <a\n href={sb.url}\n target={sb.target ?? \"_blank\"}\n rel=\"noopener noreferrer\"\n className={`${base} ${st === \"primary\" ? \"text-white\" : \"border bg-transparent\"}`}\n style={inlineStyle}\n onClick={(e) => e.stopPropagation()}\n >\n {sb.icon && <span>{sb.icon}</span>}\n {sb.label}\n {(sb.target ?? \"_blank\") === \"_blank\" && (\n <svg className=\"w-3 h-3 opacity-60\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n )}\n </a>\n );\n })()}\n </div>\n {item.description && (\n <div\n className=\"mt-1.5 text-sm text-gray-500 leading-relaxed\"\n dangerouslySetInnerHTML={{ __html: renderMarkdownish(item.description) }}\n />\n )}\n {(item.button || item.checkbox) && (\n <div className={`mt-3 flex flex-wrap items-center gap-3 ${variant === \"alternating\" && !isRight ? \"md:justify-end\" : \"\"}`}>\n {item.checkbox && (\n <label className=\"flex items-center gap-2 cursor-pointer select-none text-sm text-gray-600\">\n <input\n type=\"checkbox\"\n className=\"w-4 h-4 rounded border-gray-300 accent-current\"\n style={{ accentColor: color }}\n />\n <span>{typeof item.checkbox === \"object\" && item.checkbox.label ? item.checkbox.label : \"Done\"}</span>\n </label>\n )}\n {item.button && (() => {\n const btn = item.button!;\n const sz = btn.size ?? \"sm\";\n const st = btn.style ?? \"primary\";\n const pad = sz === \"lg\" ? \"px-5 py-2.5 text-base\" : sz === \"md\" ? \"px-4 py-2 text-sm\" : \"px-3 py-1.5 text-xs\";\n const base = `inline-flex items-center gap-1.5 rounded-lg font-medium transition-colors no-underline ${pad}`;\n const styles: Record<string, string> = {\n primary: `${base} text-white`,\n secondary: `${base} border`,\n outline: `${base} border bg-transparent`,\n ghost: `${base} bg-transparent`,\n };\n const inlineStyle: Record<string, string> =\n st === \"primary\"\n ? { backgroundColor: color }\n : st === \"secondary\"\n ? { borderColor: color, color, backgroundColor: color + \"0a\" }\n : st === \"outline\"\n ? { borderColor: color + \"40\", color }\n : { color };\n return (\n <a\n href={btn.url}\n target={btn.target ?? \"_blank\"}\n rel=\"noopener noreferrer\"\n className={styles[st]}\n style={inlineStyle}\n onClick={(e) => e.stopPropagation()}\n >\n {btn.icon && <span>{btn.icon}</span>}\n {btn.label}\n {(btn.target ?? \"_blank\") === \"_blank\" && (\n <svg className=\"w-3 h-3 opacity-60\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n )}\n </a>\n );\n })()}\n </div>\n )}\n {item.inputs && item.inputs.length > 0 && componentId && onFieldChange && (\n <div\n className=\"mt-3 pl-4 space-y-3 border-l-2\"\n style={{ borderColor: color + \"40\" }}\n >\n {item.inputs.map((input) => {\n const nestedId = `${componentId}.${input.id}`;\n const NestedComp = getInputComponent(input.type);\n return (\n <div key={input.id} className=\"space-y-1\">\n {input.label && (\n <label className=\"block text-sm font-medium text-gray-600\">\n {input.label}\n {input.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n )}\n <div className=\"text-sm\">\n <NestedComp\n props={{ placeholder: input.placeholder, ...input.props }}\n value={formState?.[nestedId]}\n onChange={(v: any) => onFieldChange(nestedId, v)}\n themeColor={themeColor}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PaymentButton\n// ---------------------------------------------------------------------------\n\nexport const PaymentButton: React.FC<DisplayProps> = ({ props, themeColor }) => {\n const { checkout_type, button_text = \"Get Started\", price_display, redirect_url } = props;\n\n const handleClick = () => {\n if (checkout_type === \"redirect\" && redirect_url) {\n window.open(redirect_url, \"_blank\", \"noopener,noreferrer\");\n return;\n }\n console.log(\"[PaymentButton] clicked\", { checkout_type, props });\n };\n\n return (\n <div className=\"flex flex-col items-center gap-3\">\n <button\n onClick={handleClick}\n className=\"cf-btn-primary w-full max-w-md text-lg\"\n style={{ backgroundColor: themeColor }}\n >\n {button_text}\n </button>\n {price_display && (\n <span className=\"text-sm text-gray-400 font-medium\">{price_display}</span>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Callout\n// ---------------------------------------------------------------------------\n\nconst CALLOUT_PRESETS: Record<string, { bg: string; border: string; text: string; iconColor: string; defaultIcon: string }> = {\n info: { bg: \"bg-blue-50\", border: \"border-blue-200\", text: \"text-blue-900\", iconColor: \"text-blue-500\", defaultIcon: \"\\u2139\\uFE0F\" },\n tip: { bg: \"bg-emerald-50\", border: \"border-emerald-200\", text: \"text-emerald-900\", iconColor: \"text-emerald-500\", defaultIcon: \"\\uD83D\\uDCA1\" },\n warning: { bg: \"bg-amber-50\", border: \"border-amber-200\", text: \"text-amber-900\", iconColor: \"text-amber-500\", defaultIcon: \"\\u26A0\\uFE0F\" },\n danger: { bg: \"bg-red-50\", border: \"border-red-200\", text: \"text-red-900\", iconColor: \"text-red-500\", defaultIcon: \"\\u274C\" },\n note: { bg: \"bg-gray-50\", border: \"border-gray-200\", text: \"text-gray-900\", iconColor: \"text-gray-500\", defaultIcon: \"\\uD83D\\uDCDD\" },\n success: { bg: \"bg-green-50\", border: \"border-green-200\", text: \"text-green-900\", iconColor: \"text-green-500\", defaultIcon: \"\\u2705\" },\n};\n\nexport const CalloutDisplay: React.FC<DisplayProps> = ({ props }) => {\n const style = props.style ?? props.variant ?? \"info\";\n const preset = CALLOUT_PRESETS[style] ?? CALLOUT_PRESETS.info;\n const icon = props.icon ?? preset.defaultIcon;\n const title = props.title;\n const body = props.text ?? props.body ?? \"\";\n const collapsible = props.collapsible ?? false;\n\n const content = (\n <div className={`flex gap-3 rounded-xl border px-4 py-3.5 ${preset.bg} ${preset.border}`}>\n {icon && <span className={`text-lg shrink-0 mt-0.5 ${preset.iconColor}`}>{icon}</span>}\n <div className=\"flex-1 min-w-0\">\n {title && <p className={`font-semibold ${preset.text} text-sm mb-0.5`}>{title}</p>}\n {body && (\n <div\n className={`text-sm leading-relaxed ${preset.text} opacity-80`}\n dangerouslySetInnerHTML={{ __html: renderMarkdownish(body) }}\n />\n )}\n </div>\n </div>\n );\n\n if (collapsible && title) {\n return (\n <details className=\"group\">\n <summary className={`flex items-center gap-3 cursor-pointer rounded-xl border px-4 py-3.5 ${preset.bg} ${preset.border} list-none`}>\n {icon && <span className={`text-lg shrink-0 ${preset.iconColor}`}>{icon}</span>}\n <span className={`font-semibold ${preset.text} text-sm flex-1`}>{title}</span>\n <svg className=\"w-4 h-4 text-gray-400 transition-transform group-open:rotate-180\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </summary>\n {body && (\n <div\n className={`mt-1 ml-9 text-sm leading-relaxed ${preset.text} opacity-80 px-4 pb-3`}\n dangerouslySetInnerHTML={{ __html: renderMarkdownish(body) }}\n />\n )}\n </details>\n );\n }\n\n return content;\n};\n\n// ---------------------------------------------------------------------------\n// Iframe\n// ---------------------------------------------------------------------------\n\nfunction resolveTemplates(template: string, formState: Record<string, any>): string {\n return interpolateTemplate(template, formState, true);\n}\n\nexport const IframeDisplay: React.FC<DisplayProps> = ({ props, formState }) => {\n const rawSrc: string = props.src ?? \"\";\n const resolvedSrc = useMemo(\n () => formState ? resolveTemplates(rawSrc, formState) : rawSrc,\n [rawSrc, formState]\n );\n const height = props.height ?? 400;\n const width = props.width ?? \"100%\";\n const borderRadius = props.border_radius ?? 16;\n const sandbox = props.sandbox ?? \"allow-scripts allow-same-origin allow-forms\";\n const allow = props.allow ?? \"\";\n const showBorder = props.border ?? false;\n const title = props.title ?? \"Embedded content\";\n\n if (!resolvedSrc) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-gray-400 bg-gray-50 rounded-2xl\"\n style={{ height: typeof height === \"number\" ? height : height, width, borderRadius }}\n >\n No iframe URL provided\n </div>\n );\n }\n\n return (\n <iframe\n src={resolvedSrc}\n title={title}\n sandbox={sandbox}\n allow={allow}\n className={`block ${showBorder ? \"border border-gray-200\" : \"border-0\"}`}\n style={{\n width,\n height: typeof height === \"number\" ? height : height,\n borderRadius,\n }}\n />\n );\n};\n\n// ---------------------------------------------------------------------------\n// Custom Component (loads from window.__catalogkit_components)\n// ---------------------------------------------------------------------------\n\ndeclare global {\n interface Window {\n __catalogkit_components?: Record<string, React.FC<any>>;\n }\n}\n\nexport const CustomComponentDisplay: React.FC<DisplayProps> = ({ props, themeColor, formState, onFieldChange }) => {\n const componentName: string = props.component ?? \"\";\n const [, forceUpdate] = useState(0);\n const attemptedRef = useRef(false);\n\n // Poll for the component to become available (scripts may load async)\n useEffect(() => {\n if (!componentName) return;\n if (window.__catalogkit_components?.[componentName]) return;\n\n // Check every 200ms for up to 5 seconds\n attemptedRef.current = true;\n let elapsed = 0;\n const interval = setInterval(() => {\n elapsed += 200;\n if (window.__catalogkit_components?.[componentName] || elapsed >= 5000) {\n clearInterval(interval);\n forceUpdate((n) => n + 1);\n }\n }, 200);\n return () => clearInterval(interval);\n }, [componentName]);\n\n if (!componentName) {\n return (\n <div className=\"border-2 border-dashed border-gray-300 rounded-lg p-4 text-center text-gray-400 text-sm\">\n Custom component: no component name specified\n </div>\n );\n }\n\n const CustomComp = window.__catalogkit_components?.[componentName];\n\n if (!CustomComp) {\n return (\n <div className=\"border-2 border-dashed border-amber-300 rounded-lg p-4 text-center text-amber-500 text-sm\">\n Loading component: {componentName}...\n </div>\n );\n }\n\n // Pass through all props except \"component\" itself, plus standard context\n const { component: _, ...passthroughProps } = props;\n\n return (\n <ErrorBoundary componentName={componentName}>\n <CustomComp\n {...passthroughProps}\n themeColor={themeColor}\n formState={formState ?? {}}\n setField={onFieldChange ?? (() => {})}\n />\n </ErrorBoundary>\n );\n};\n\n/** Error boundary to prevent custom component crashes from taking down the catalog */\nclass ErrorBoundary extends React.Component<\n { children: React.ReactNode; componentName: string },\n { error: Error | null }\n> {\n state: { error: Error | null } = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n render() {\n if (this.state.error) {\n return (\n <div className=\"border-2 border-dashed border-red-300 rounded-lg p-4 text-center text-red-500 text-sm\">\n Custom component \"{this.props.componentName}\" crashed: {this.state.error.message}\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// FileDownloadDisplay — downloadable file button\n// ---------------------------------------------------------------------------\n\nconst FileDownloadDisplay: React.FC<DisplayProps> = ({ props, themeColor }) => {\n const {\n src,\n filename = \"Download\",\n size_bytes,\n button_text = \"Download\",\n style: btnStyle = \"primary\",\n description,\n icon,\n } = props;\n\n const formatSize = (bytes: number) => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n };\n\n const isPrimary = btnStyle === \"primary\";\n const isOutline = btnStyle === \"outline\";\n const isGhost = btnStyle === \"ghost\";\n\n const baseClasses =\n \"inline-flex items-center gap-3 rounded-xl px-5 py-3.5 font-medium transition-all duration-200 no-underline w-full sm:w-auto\";\n const styleClasses = isPrimary\n ? \"text-white shadow-sm hover:shadow-md active:scale-[0.98]\"\n : isOutline\n ? \"border-2 bg-transparent hover:bg-opacity-5 active:scale-[0.98]\"\n : isGhost\n ? \"bg-transparent hover:bg-gray-100 active:scale-[0.98]\"\n : \"bg-gray-100 text-gray-800 hover:bg-gray-200 active:scale-[0.98]\";\n\n const inlineStyle: React.CSSProperties = isPrimary\n ? { backgroundColor: themeColor }\n : isOutline\n ? { borderColor: themeColor, color: themeColor }\n : isGhost\n ? { color: themeColor }\n : {};\n\n return (\n <div className=\"space-y-1\">\n <a\n href={src}\n download={filename}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`${baseClasses} ${styleClasses}`}\n style={inlineStyle}\n >\n {/* Download icon */}\n {icon ? (\n <span className=\"text-lg flex-shrink-0\">{icon}</span>\n ) : (\n <svg\n className=\"w-5 h-5 flex-shrink-0\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )}\n <div className=\"flex flex-col items-start min-w-0\">\n <span className=\"truncate max-w-[240px]\">{filename}</span>\n {(size_bytes || description) && (\n <span className={`text-xs ${isPrimary ? \"text-white/70\" : \"text-gray-500\"}`}>\n {description || (size_bytes ? formatSize(size_bytes) : \"\")}\n </span>\n )}\n </div>\n <span className={`ml-auto text-sm ${isPrimary ? \"text-white/80\" : \"opacity-60\"}`}>\n {button_text !== \"Download\" ? button_text : (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n )}\n </span>\n </a>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ModalDisplay — button that opens a scrollable modal popup (e.g. T&C)\n// ---------------------------------------------------------------------------\n\nconst ModalDisplay: React.FC<DisplayProps> = ({ props, themeColor, componentId, formState, onFieldChange }) => {\n const {\n button_label = \"View\",\n title = \"\",\n body = \"\",\n max_width = \"640px\",\n button_style = \"primary\",\n components,\n confirm_label,\n confirm_sets_field,\n require_inputs = false,\n } = props;\n\n const [open, setOpen] = useState(false);\n\n const hasComponents = Array.isArray(components) && components.length > 0;\n const footerLabel = confirm_label || (hasComponents ? \"Confirm\" : \"Close\");\n\n // Check if all required nested inputs are filled\n const allRequiredFilled = useMemo(() => {\n if (!require_inputs || !hasComponents) return true;\n for (const input of components!) {\n if (input.type in DisplayComponentMap) continue;\n const isRequired = input.required || input.props?.required;\n if (!isRequired) continue;\n const nestedId = componentId ? `${componentId}.${input.id}` : input.id;\n const val = formState?.[nestedId];\n if (val == null || val === \"\" || (Array.isArray(val) && val.length === 0)) return false;\n }\n return true;\n }, [require_inputs, hasComponents, components, componentId, formState]);\n\n // Lock body scroll when modal is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = \"hidden\";\n return () => { document.body.style.overflow = \"\"; };\n }\n }, [open]);\n\n // Close on Escape\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => { if (e.key === \"Escape\") setOpen(false); };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open]);\n\n const handleConfirm = () => {\n if (confirm_sets_field && onFieldChange) {\n onFieldChange(confirm_sets_field.field_id, confirm_sets_field.value);\n }\n setOpen(false);\n };\n\n const isPrimary = button_style === \"primary\";\n const isOutline = button_style === \"outline\";\n const isGhost = button_style === \"ghost\";\n const isLink = button_style === \"link\";\n\n const btnClasses = isLink\n ? \"underline underline-offset-2 font-medium transition-opacity hover:opacity-70\"\n : `inline-flex items-center justify-center rounded-lg px-5 py-2.5 font-medium text-sm transition-all duration-200 ${\n isPrimary\n ? \"text-white shadow-sm hover:opacity-90\"\n : isOutline\n ? \"border-2 bg-transparent hover:opacity-80\"\n : isGhost\n ? \"bg-transparent hover:bg-black/5\"\n : \"text-white shadow-sm hover:opacity-90\"\n }`;\n\n const btnStyle: React.CSSProperties = isPrimary\n ? { backgroundColor: themeColor }\n : isOutline\n ? { borderColor: themeColor, color: themeColor }\n : isGhost\n ? { color: themeColor }\n : isLink\n ? { color: themeColor }\n : { backgroundColor: themeColor };\n\n // Render embedded components (inputs + display) inside the modal\n const renderEmbeddedComponents = () => {\n if (!hasComponents) return null;\n return (\n <div className=\"space-y-4 mt-3\">\n {components!.map((input) => {\n const nestedId = componentId ? `${componentId}.${input.id}` : input.id;\n\n // Display component — render as static content\n const DisplayComp = DisplayComponentMap[input.type];\n if (DisplayComp) {\n return (\n <div key={input.id}>\n <DisplayComp\n props={{ ...input.props, text: input.label || input.props?.text }}\n themeColor={themeColor}\n />\n </div>\n );\n }\n\n // Input component — render with form binding\n const NestedComp = getInputComponent(input.type);\n return (\n <div key={input.id} className=\"space-y-1\">\n {input.label && (\n <label className=\"block text-sm font-medium text-gray-700\">\n {input.label}\n {(input.required || input.props?.required) && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n )}\n <NestedComp\n props={{ placeholder: input.placeholder, ...input.props }}\n value={formState?.[nestedId]}\n onChange={(v: any) => onFieldChange ? onFieldChange(nestedId, v) : undefined}\n themeColor={themeColor}\n formState={formState}\n onFieldChange={onFieldChange}\n componentId={nestedId}\n />\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <>\n <button\n type=\"button\"\n className={btnClasses}\n style={btnStyle}\n onClick={() => setOpen(true)}\n >\n {button_label}\n </button>\n\n {open && createPortal(\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4\"\n onClick={(e) => { if (e.target === e.currentTarget) setOpen(false); }}\n >\n {/* Overlay */}\n <div className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\" />\n\n {/* Modal */}\n <div\n className=\"relative bg-white rounded-2xl shadow-2xl flex flex-col overflow-hidden w-full animate-in fade-in zoom-in-95 duration-200\"\n style={{ maxWidth: max_width, maxHeight: \"85vh\" }}\n >\n {/* Header */}\n {title && (\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-100 shrink-0\">\n <h2 className=\"text-lg font-semibold text-gray-900\">{title}</h2>\n <button\n type=\"button\"\n className=\"p-1.5 rounded-lg text-gray-400 hover:text-gray-600 hover:bg-gray-100 transition-colors\"\n onClick={() => setOpen(false)}\n aria-label=\"Close\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n )}\n\n {/* No title — just show close button */}\n {!title && (\n <button\n type=\"button\"\n className=\"absolute top-3 right-3 z-10 p-1.5 rounded-lg text-gray-400 hover:text-gray-600 hover:bg-gray-100 transition-colors\"\n onClick={() => setOpen(false)}\n aria-label=\"Close\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n\n {/* Scrollable body */}\n <div className=\"overflow-y-auto min-h-0 px-6 py-5 text-sm text-gray-700 leading-relaxed prose prose-sm max-w-none\">\n {body && <div dangerouslySetInnerHTML={{ __html: renderMarkdownish(body) }} />}\n {renderEmbeddedComponents()}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-3 border-t border-gray-100 shrink-0 flex justify-end gap-3\">\n {hasComponents && (\n <button\n type=\"button\"\n className=\"px-5 py-2 rounded-lg text-sm font-medium text-gray-600 transition-colors hover:bg-gray-100\"\n onClick={() => setOpen(false)}\n >\n Cancel\n </button>\n )}\n <button\n type=\"button\"\n className=\"px-5 py-2 rounded-lg text-sm font-medium text-white transition-opacity hover:opacity-90 disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{ backgroundColor: themeColor }}\n onClick={handleConfirm}\n disabled={!allRequiredFilled}\n >\n {footerLabel}\n </button>\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Component Map\n// ---------------------------------------------------------------------------\n\nexport const DisplayComponentMap: Record<string, React.FC<DisplayProps>> = {\n heading: HeadingDisplay,\n paragraph: ParagraphDisplay,\n banner: BannerDisplay,\n image: ImageDisplay,\n video: VideoDisplay,\n table: TableDisplay,\n divider: DividerDisplay,\n social_links: SocialLinksDisplay,\n html: HtmlDisplay,\n faq: FaqDisplay,\n testimonial: TestimonialDisplay,\n pricing_card: PricingCardDisplay,\n payment_button: PaymentButton,\n timeline: TimelineDisplay,\n callout: CalloutDisplay,\n file_download: FileDownloadDisplay,\n iframe: IframeDisplay,\n modal: ModalDisplay,\n custom: CustomComponentDisplay,\n};\n\n// Register display components with inputs module so nested inputs in checkboxes\n// can render display types (paragraph, heading, banner, etc.) without circular imports\nregisterDisplayComponents((type) => DisplayComponentMap[type]);\n","import React, { useEffect, useRef } from \"react\";\nimport { CartItem, CartSettings } from \"@shared/types\";\n\n// --- Icon presets ---\n\nconst CartIconSVG: React.FC<{ className?: string; style?: React.CSSProperties; strokeWidth?: number }> = (props) => (\n <svg className={props.className} style={props.style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={props.strokeWidth ?? 2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 00-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 00-16.536-1.84M7.5 14.25L5.106 5.272M6 20.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm12.75 0a.75.75 0 11-1.5 0 .75.75 0 011.5 0z\" />\n </svg>\n);\n\nconst BagIconSVG: React.FC<{ className?: string; style?: React.CSSProperties; strokeWidth?: number }> = (props) => (\n <svg className={props.className} style={props.style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={props.strokeWidth ?? 2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 10.5V6a3.75 3.75 0 10-7.5 0v4.5m11.356-1.993l1.263 12c.07.665-.45 1.243-1.119 1.243H4.25a1.125 1.125 0 01-1.12-1.243l1.264-12A1.125 1.125 0 015.513 7.5h12.974c.576 0 1.059.435 1.119 1.007zM8.625 10.5a.375.375 0 11-.75 0 .375.375 0 01.75 0zm7.5 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z\" />\n </svg>\n);\n\nconst BasketIconSVG: React.FC<{ className?: string; style?: React.CSSProperties; strokeWidth?: number }> = (props) => (\n <svg className={props.className} style={props.style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={props.strokeWidth ?? 2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 00-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 00-16.536-1.84M7.5 14.25L5.106 5.272M6 20.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm12.75 0a.75.75 0 11-1.5 0 .75.75 0 011.5 0z\" />\n </svg>\n);\n\nconst ICON_PRESETS: Record<string, React.FC<{ className?: string; style?: React.CSSProperties; strokeWidth?: number }>> = {\n cart: CartIconSVG,\n bag: BagIconSVG,\n basket: BasketIconSVG,\n};\n\n/** Renders the cart icon: preset SVG, custom image URL, or default cart */\nconst CartIcon: React.FC<{ icon?: string; className?: string; style?: React.CSSProperties; strokeWidth?: number }> = ({\n icon,\n className = \"w-5 h-5\",\n style,\n strokeWidth,\n}) => {\n if (!icon || icon === \"cart\") return <CartIconSVG className={className} style={style} strokeWidth={strokeWidth} />;\n const Preset = ICON_PRESETS[icon];\n if (Preset) return <Preset className={className} style={style} strokeWidth={strokeWidth} />;\n // Custom image URL\n return <img src={icon} alt=\"\" className={className} style={{ objectFit: \"contain\", ...style }} />;\n};\n\n// --- Position mapping ---\n\nconst POSITION_CLASSES: Record<string, string> = {\n \"bottom-right\": \"bottom-6 right-6\",\n \"bottom-left\": \"bottom-6 left-6\",\n \"top-right\": \"top-6 right-6\",\n \"top-left\": \"top-6 left-6\",\n};\n\n// --- Props ---\n\ninterface CartProps {\n items: CartItem[];\n isOpen: boolean;\n onToggle: () => void;\n onRemove: (offerId: string) => void;\n onCheckout?: () => void;\n themeColor: string;\n cartSettings?: CartSettings;\n}\n\n// --- Floating Cart Button ---\n\nexport const CartButton: React.FC<{\n itemCount: number;\n onClick: () => void;\n themeColor: string;\n cartSettings?: CartSettings;\n}> = ({ itemCount, onClick, themeColor, cartSettings }) => {\n if (itemCount === 0) return null;\n if (cartSettings?.hide_button) return null;\n\n const position = POSITION_CLASSES[cartSettings?.position || \"bottom-right\"] || POSITION_CLASSES[\"bottom-right\"];\n\n return (\n <button\n onClick={onClick}\n className={`fixed ${position} z-[90] flex items-center gap-2 rounded-full px-5 py-3.5 text-white font-semibold shadow-xl transition-all duration-300 hover:scale-105 hover:shadow-2xl active:scale-95`}\n style={{\n backgroundColor: themeColor,\n fontFamily: \"var(--font-display)\",\n }}\n aria-label={`Shopping cart with ${itemCount} items`}\n data-component-id=\"__cart_button\"\n data-component-type=\"cart_button\"\n data-page-id=\"__global\"\n >\n <CartIcon icon={cartSettings?.icon} className=\"w-5 h-5\" />\n <span>{itemCount}</span>\n <span className=\"text-sm opacity-80\">\n {itemCount === 1 ? \"item\" : \"items\"}\n </span>\n </button>\n );\n};\n\n// --- Cart Drawer ---\n\nexport const CartDrawer: React.FC<CartProps> = ({\n items,\n isOpen,\n onToggle,\n onRemove,\n onCheckout,\n themeColor,\n cartSettings,\n}) => {\n const drawerRef = useRef<HTMLDivElement>(null);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onToggle();\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [isOpen, onToggle]);\n\n const title = cartSettings?.title || \"Your Cart\";\n const checkoutButtonText = cartSettings?.checkout_button_text || \"Proceed to Checkout\";\n\n return (\n <>\n {/* Scoped CSS */}\n {cartSettings?.css && (\n <style dangerouslySetInnerHTML={{ __html: cartSettings.css }} />\n )}\n\n {/* Backdrop */}\n <div\n className={`fixed inset-0 z-[95] bg-black/30 backdrop-blur-sm transition-opacity duration-300 ${\n isOpen\n ? \"opacity-100 pointer-events-auto\"\n : \"opacity-0 pointer-events-none\"\n }`}\n onClick={onToggle}\n aria-hidden=\"true\"\n />\n\n {/* Drawer */}\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Shopping cart\"\n className={`ck-cart-drawer fixed top-0 right-0 bottom-0 z-[96] w-full max-w-md bg-white shadow-2xl transition-transform duration-300 ease-out flex flex-col ${\n isOpen ? \"translate-x-0\" : \"translate-x-full\"\n }`}\n style={{ fontFamily: \"var(--font-display)\" }}\n data-component-id=\"__cart_drawer\"\n data-component-type=\"cart_drawer\"\n data-page-id=\"__global\"\n >\n {/* Header */}\n {cartSettings?.header_html ? (\n <div\n className=\"ck-cart-header px-6 py-5 border-b border-gray-100\"\n dangerouslySetInnerHTML={{ __html: cartSettings.header_html }}\n />\n ) : (\n <div className=\"ck-cart-header flex items-center justify-between px-6 py-5 border-b border-gray-100\">\n <div className=\"flex items-center gap-3\">\n <div\n className=\"w-9 h-9 rounded-xl flex items-center justify-center\"\n style={{ backgroundColor: `${themeColor}12` }}\n >\n <CartIcon\n icon={cartSettings?.icon}\n className=\"w-5 h-5\"\n style={{ color: themeColor }}\n />\n </div>\n <div>\n <h2 className=\"text-lg font-bold text-gray-900\">{title}</h2>\n <p className=\"text-xs text-gray-400\">\n {items.length} {items.length === 1 ? \"item\" : \"items\"} selected\n </p>\n </div>\n </div>\n <button\n onClick={onToggle}\n className=\"w-9 h-9 flex items-center justify-center rounded-xl text-gray-400 hover:text-gray-700 hover:bg-gray-100 transition-all\"\n aria-label=\"Close cart\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n )}\n\n {/* Items */}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n {items.length === 0 ? (\n cartSettings?.empty_html ? (\n <div\n className=\"ck-cart-empty flex flex-col items-center justify-center h-full text-center py-16\"\n dangerouslySetInnerHTML={{ __html: cartSettings.empty_html }}\n />\n ) : (\n <div className=\"ck-cart-empty flex flex-col items-center justify-center h-full text-center py-16\">\n <div\n className=\"w-16 h-16 rounded-2xl flex items-center justify-center mb-4\"\n style={{ backgroundColor: `${themeColor}08` }}\n >\n <CartIcon\n icon={cartSettings?.icon}\n className=\"w-8 h-8 text-gray-300\"\n strokeWidth={1.5}\n />\n </div>\n <p className=\"text-gray-400 text-sm font-medium\">\n No offers accepted yet\n </p>\n <p className=\"text-gray-300 text-xs mt-1\">\n Accept offers as you browse to add them here\n </p>\n </div>\n )\n ) : (\n <div className=\"space-y-3\">\n {items.map((item) => (\n <div\n key={item.offer_id}\n className=\"ck-cart-item group flex items-start gap-4 p-4 rounded-2xl border border-gray-100 bg-gray-50/50 hover:bg-white hover:border-gray-200 hover:shadow-sm transition-all duration-200\"\n data-offer-id={item.offer_id}\n data-component-id={`__cart_item_${item.offer_id}`}\n data-component-type=\"cart_item\"\n >\n {item.image && (\n <img\n src={item.image}\n alt={item.title}\n className=\"w-14 h-14 rounded-xl object-cover flex-shrink-0\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold text-gray-900 truncate\">\n {item.title}\n </h3>\n {item.price_display && (\n <p\n className=\"text-sm font-bold mt-0.5\"\n style={{ color: themeColor }}\n >\n {item.price_display}\n </p>\n )}\n {item.price_subtext && (\n <p className=\"text-xs text-gray-400 mt-0.5\">\n {item.price_subtext}\n </p>\n )}\n </div>\n <button\n onClick={() => onRemove(item.offer_id)}\n className=\"w-7 h-7 flex-shrink-0 flex items-center justify-center rounded-lg text-gray-300 hover:text-red-500 hover:bg-red-50 transition-all opacity-0 group-hover:opacity-100\"\n aria-label={`Remove ${item.title}`}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\"\n />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n {items.length > 0 && (\n <div className=\"ck-cart-footer border-t border-gray-100 px-6 py-5 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-gray-500\">\n {items.length} {items.length === 1 ? \"offer\" : \"offers\"}{\" \"}\n selected\n </span>\n <div\n className=\"flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-bold\"\n style={{\n backgroundColor: `${themeColor}10`,\n color: themeColor,\n }}\n >\n <svg\n className=\"w-3.5 h-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n Added to order\n </div>\n </div>\n {/* Custom footer HTML slot */}\n {cartSettings?.footer_html && (\n <div\n className=\"ck-cart-footer-custom\"\n dangerouslySetInnerHTML={{ __html: cartSettings.footer_html }}\n />\n )}\n {onCheckout && (\n <button\n onClick={onCheckout}\n className=\"ck-cart-checkout-btn w-full flex items-center justify-center gap-2 px-6 py-3.5 rounded-xl text-white font-bold text-sm transition-all duration-200 hover:shadow-lg hover:scale-[1.01] active:scale-[0.99]\"\n style={{ backgroundColor: themeColor }}\n data-component-id=\"__cart_checkout_button\"\n data-component-type=\"cart_checkout_button\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z\"\n />\n </svg>\n {checkoutButtonText}\n </button>\n )}\n </div>\n )}\n </div>\n </>\n );\n};\n","import React, { useState, useCallback } from \"react\";\nimport {\n CartItem,\n CatalogComponent,\n CheckoutSettings,\n FormState,\n CreateCheckoutSessionRequest,\n} from \"@shared/types\";\nimport { DisplayComponentMap } from \"./display\";\n\ninterface CheckoutPageProps {\n cartItems: CartItem[];\n checkout: CheckoutSettings;\n formState: FormState;\n tracerId: string;\n userId: string;\n catalogSlug: string;\n apiBaseUrl: string;\n themeColor: string;\n onBack: () => void;\n onContinue: () => void;\n onRemoveItem: (offerId: string) => void;\n onFieldChange: (fieldId: string, value: any) => void;\n}\n\ntype CheckoutStatus = \"idle\" | \"loading\" | \"error\";\n\nexport const CheckoutPage: React.FC<CheckoutPageProps> = ({\n cartItems,\n checkout,\n formState,\n tracerId,\n userId,\n catalogSlug,\n apiBaseUrl,\n themeColor,\n onBack,\n onContinue,\n onRemoveItem,\n onFieldChange,\n}) => {\n const [couponCode, setCouponCode] = useState(\"\");\n const [couponApplied, setCouponApplied] = useState(false);\n const [status, setStatus] = useState<CheckoutStatus>(\"idle\");\n const [errorMsg, setErrorMsg] = useState(\"\");\n\n const prefill = checkout.prefill_fields;\n const customerEmail = prefill?.customer_email\n ? formState[prefill.customer_email]\n : undefined;\n const customerName = prefill?.customer_name\n ? formState[prefill.customer_name]\n : undefined;\n\n const paymentType = checkout.payment_type || \"one_time\";\n const hasItems = cartItems.length > 0;\n const isSubscription = paymentType === \"subscription\";\n const trialDays =\n isSubscription && checkout.free_trial?.enabled\n ? checkout.free_trial.days\n : null;\n const buttonText = hasItems\n ? (checkout.button_text || (\n trialDays\n ? \"Start Free Trial\"\n : (isSubscription ? \"Subscribe\" : \"Pay Now\")\n ))\n : \"Continue — $0\";\n\n const handleApplyCoupon = useCallback(() => {\n if (couponCode.trim()) setCouponApplied(true);\n }, [couponCode]);\n\n const handleRemoveCoupon = useCallback(() => {\n setCouponCode(\"\");\n setCouponApplied(false);\n }, []);\n\n const handleCheckout = useCallback(async () => {\n // Empty cart ($0) — skip Stripe entirely, just continue\n if (cartItems.length === 0) {\n onContinue();\n return;\n }\n\n setStatus(\"loading\");\n setErrorMsg(\"\");\n\n try {\n const body: CreateCheckoutSessionRequest = {\n user_id: userId,\n catalog_slug: catalogSlug,\n tracer_id: tracerId,\n line_items: cartItems.map((item) => ({\n offer_id: item.offer_id,\n title: item.title,\n stripe_price_id: item.stripe_price_id,\n amount_cents: item.amount_cents,\n payment_type: item.payment_type,\n currency: item.currency,\n interval: item.interval,\n quantity: 1,\n })),\n form_state: formState,\n success_url: `${window.location.origin}${window.location.pathname}?checkout=success&session_id={CHECKOUT_SESSION_ID}`,\n cancel_url: `${window.location.origin}${window.location.pathname}?checkout=cancelled`,\n ...(couponApplied && couponCode ? { coupon_code: couponCode } : {}),\n };\n\n const res = await fetch(`${apiBaseUrl}/checkout/session`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new Error(data.error || `Checkout failed (${res.status})`);\n }\n\n const { session_url } = await res.json();\n\n if (session_url) {\n window.location.href = session_url;\n return;\n }\n\n throw new Error(\"No checkout URL returned from server\");\n } catch (err: any) {\n setStatus(\"error\");\n setErrorMsg(err.message || \"Something went wrong\");\n }\n }, [\n cartItems,\n formState,\n userId,\n catalogSlug,\n tracerId,\n apiBaseUrl,\n couponCode,\n couponApplied,\n onContinue,\n ]);\n\n return (\n <div\n className=\"min-h-screen\"\n style={{\n background: \"linear-gradient(180deg, #f8f9fc 0%, #f0f2f7 100%)\",\n fontFamily: \"var(--font-display)\",\n }}\n data-page-id=\"__checkout\"\n data-component-id=\"__checkout_page\"\n data-component-type=\"checkout_page\"\n >\n {/* Header */}\n <div className=\"fixed top-0 left-0 right-0 z-50 bg-white/80 backdrop-blur-xl border-b border-gray-200/60\">\n <div className=\"max-w-5xl mx-auto flex items-center justify-between px-6 py-3\">\n <button\n onClick={onBack}\n aria-label=\"Go back\"\n className=\"flex items-center gap-1.5 text-sm text-gray-500 hover:text-gray-800 transition-colors\"\n data-component-id=\"__checkout_back_button\"\n data-component-type=\"checkout_back_button\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" />\n </svg>\n Back\n </button>\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-green-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z\" />\n </svg>\n <span className=\"text-xs font-medium text-gray-400\">\n {checkout.require_3ds ? \"3D Secure Checkout\" : \"Secure Checkout\"}\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"max-w-5xl mx-auto px-6 pt-20 pb-12\">\n {/* Title */}\n <div className=\"text-center mb-10\">\n <h1\n className=\"text-3xl sm:text-4xl font-bold text-gray-900\"\n style={{ letterSpacing: \"-0.025em\" }}\n >\n {checkout.title || \"Complete Your Order\"}\n </h1>\n {trialDays && (\n <div\n className=\"inline-flex items-center gap-1.5 mt-4 px-5 py-2 rounded-full text-sm font-semibold\"\n style={{ backgroundColor: `${themeColor}10`, color: themeColor }}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n {trialDays}-day free trial included\n </div>\n )}\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-12 gap-8 lg:gap-12 items-start\">\n {/* Left: Order Summary — wider */}\n <div className=\"lg:col-span-7 space-y-6\">\n {/* Cart Items */}\n <div className=\"bg-white rounded-2xl border border-gray-100 shadow-sm overflow-hidden\" data-component-id=\"__checkout_order_summary\" data-component-type=\"checkout_order_summary\">\n <div className=\"px-6 py-4 border-b border-gray-50\">\n <h2 className=\"text-sm font-bold text-gray-900 uppercase tracking-wide\">\n Order Summary\n </h2>\n </div>\n <div className=\"divide-y divide-gray-50\">\n {cartItems.length === 0 && (\n <div className=\"flex items-center gap-5 px-6 py-5\">\n <div\n className=\"w-16 h-16 rounded-xl flex-shrink-0 flex items-center justify-center\"\n style={{ backgroundColor: `${themeColor}08` }}\n >\n <svg className=\"w-7 h-7\" style={{ color: `${themeColor}40` }} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-base font-semibold text-gray-900\">\n Complete Registration\n </h3>\n <p className=\"text-sm text-gray-400 mt-0.5\">No offers selected — continue for free</p>\n </div>\n <div className=\"text-right flex-shrink-0\">\n <p className=\"text-base font-bold\" style={{ color: themeColor }}>$0</p>\n </div>\n </div>\n )}\n {cartItems.map((item) => (\n <div key={item.offer_id} className=\"flex items-center gap-5 px-6 py-5 group\">\n {item.image ? (\n <img\n src={item.image}\n alt={item.title}\n className=\"w-16 h-16 rounded-xl object-cover flex-shrink-0 border border-gray-100\"\n />\n ) : (\n <div\n className=\"w-16 h-16 rounded-xl flex-shrink-0 flex items-center justify-center\"\n style={{ backgroundColor: `${themeColor}08` }}\n >\n <svg className=\"w-7 h-7\" style={{ color: `${themeColor}40` }} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z\" />\n </svg>\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-base font-semibold text-gray-900\">\n {item.title}\n </h3>\n {item.price_subtext && (\n <p className=\"text-sm text-gray-400 mt-0.5\">{item.price_subtext}</p>\n )}\n </div>\n <div className=\"text-right flex-shrink-0\">\n {item.price_display && (\n <p className=\"text-base font-bold\" style={{ color: themeColor }}>\n {item.price_display}\n </p>\n )}\n {isSubscription && (\n <p className=\"text-[11px] text-gray-400 uppercase tracking-wide\">/month</p>\n )}\n </div>\n {item.button && (\n <a\n href={item.button.url}\n target={item.button.target ?? \"_blank\"}\n rel=\"noopener noreferrer\"\n className={`inline-flex items-center gap-1.5 rounded-lg font-medium transition-colors no-underline flex-shrink-0 ${\n (item.button.size ?? \"sm\") === \"lg\" ? \"px-4 py-2 text-sm\" : (item.button.size ?? \"sm\") === \"md\" ? \"px-3 py-1.5 text-xs\" : \"px-2.5 py-1 text-xs\"\n } ${\n (item.button.style ?? \"secondary\") === \"primary\" ? \"text-white\" : \"border bg-transparent\"\n }`}\n style={\n (item.button.style ?? \"secondary\") === \"primary\"\n ? { backgroundColor: themeColor }\n : { borderColor: themeColor + \"40\", color: themeColor }\n }\n onClick={(e) => e.stopPropagation()}\n >\n {item.button.icon && <span>{item.button.icon}</span>}\n {item.button.label}\n {(item.button.target ?? \"_blank\") === \"_blank\" && (\n <svg className=\"w-3 h-3 opacity-60\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n )}\n </a>\n )}\n <button\n onClick={() => onRemoveItem(item.offer_id)}\n className=\"w-8 h-8 flex-shrink-0 flex items-center justify-center rounded-lg text-gray-400 hover:text-red-500 hover:bg-red-50 transition-all\"\n aria-label={`Remove ${item.title}`}\n data-component-id={`__checkout_remove_${item.offer_id}`}\n data-component-type=\"checkout_remove_button\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n\n {/* Coupon Input */}\n {checkout.allow_discount_codes && (\n <div className=\"px-6 py-5 border-t border-gray-50 bg-gray-50/50\">\n {couponApplied ? (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-green-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span className=\"text-sm font-medium text-green-700\">\n Coupon <span className=\"font-mono font-bold\">{couponCode}</span> applied\n </span>\n </div>\n <button onClick={handleRemoveCoupon} className=\"text-xs text-gray-400 hover:text-red-500 transition-colors\">\n Remove\n </button>\n </div>\n ) : (\n <div className=\"flex gap-3\">\n <input\n type=\"text\"\n className=\"cf-input flex-1 text-sm\"\n aria-label=\"Discount code\"\n placeholder=\"Discount code\"\n value={couponCode}\n onChange={(e) => setCouponCode(e.target.value.toUpperCase())}\n onKeyDown={(e) => e.key === \"Enter\" && handleApplyCoupon()}\n />\n <button\n onClick={handleApplyCoupon}\n disabled={!couponCode.trim()}\n className=\"px-5 py-2.5 rounded-xl text-sm font-semibold border-2 transition-all disabled:opacity-40 disabled:cursor-not-allowed\"\n style={{ borderColor: themeColor, color: themeColor }}\n >\n Apply\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* 3DS explainer */}\n {checkout.require_3ds && hasItems && (\n <div className=\"bg-blue-50 rounded-2xl border border-blue-200/60 overflow-hidden\">\n <div className=\"px-6 py-4 flex items-center gap-2.5\">\n <svg className=\"w-5 h-5 text-blue-600 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75m-1.5-8.25a48.108 48.108 0 00-7.5 0c-1.108.07-2.03.933-2.164 2.03a48.095 48.095 0 00-.136 1.922l-.008.164-.034.532c-.003.052-.006.105-.009.157a48.632 48.632 0 00.128 7.133 2.22 2.22 0 002.165 2.03 48.108 48.108 0 007.5 0 2.22 2.22 0 002.164-2.03c.188-2.37.2-4.764.128-7.133-.003-.052-.006-.105-.009-.157l-.034-.532-.008-.164a48.095 48.095 0 00-.136-1.922 2.22 2.22 0 00-2.164-2.03z\" />\n </svg>\n <div>\n <p className=\"text-sm font-semibold text-blue-900\">Extra verification required</p>\n <p className=\"text-xs text-blue-700 mt-0.5\">\n Your bank will ask you to confirm this payment with a one-time code or biometric check (3D Secure). This protects you from unauthorized charges.\n </p>\n </div>\n </div>\n </div>\n )}\n\n {/* Customer Info (editable) */}\n {prefill && (prefill.customer_name || prefill.customer_email || prefill.customer_phone) && (\n <div className=\"bg-white rounded-2xl border border-gray-100 shadow-sm overflow-hidden\" data-component-id=\"__checkout_customer_info\" data-component-type=\"checkout_customer_info\">\n <div className=\"px-6 py-4 border-b border-gray-50\">\n <h2 className=\"text-sm font-bold text-gray-900 uppercase tracking-wide\">Your Info</h2>\n </div>\n <div className=\"px-6 py-5 space-y-4\">\n {prefill.customer_name && (\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide\">Name</label>\n <div className=\"relative\">\n <svg className=\"w-4 h-4 text-gray-400 absolute left-3.5 top-1/2 -translate-y-1/2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0\" />\n </svg>\n <input\n type=\"text\"\n className=\"cf-input pl-10 text-sm\"\n placeholder=\"Your name\"\n value={formState[prefill.customer_name] ?? \"\"}\n onChange={(e) => onFieldChange(prefill.customer_name!, e.target.value)}\n />\n </div>\n </div>\n )}\n {prefill.customer_email && (\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide\">Email</label>\n <div className=\"relative\">\n <svg className=\"w-4 h-4 text-gray-400 absolute left-3.5 top-1/2 -translate-y-1/2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" />\n </svg>\n <input\n type=\"email\"\n className=\"cf-input pl-10 text-sm\"\n placeholder=\"you@example.com\"\n value={formState[prefill.customer_email] ?? \"\"}\n onChange={(e) => onFieldChange(prefill.customer_email!, e.target.value)}\n />\n </div>\n </div>\n )}\n {prefill.customer_phone && (\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide\">Phone</label>\n <div className=\"relative\">\n <svg className=\"w-4 h-4 text-gray-400 absolute left-3.5 top-1/2 -translate-y-1/2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 6.75c0 8.284 6.716 15 15 15h2.25a2.25 2.25 0 002.25-2.25v-1.372c0-.516-.351-.966-.852-1.091l-4.423-1.106c-.44-.11-.902.055-1.173.417l-.97 1.293c-.282.376-.769.542-1.21.38a12.035 12.035 0 01-7.143-7.143c-.162-.441.004-.928.38-1.21l1.293-.97c.363-.271.527-.734.417-1.173L6.963 3.102a1.125 1.125 0 00-1.091-.852H4.5A2.25 2.25 0 002.25 4.5v2.25z\" />\n </svg>\n <input\n type=\"tel\"\n className=\"cf-input pl-10 text-sm\"\n placeholder=\"+1 (555) 000-0000\"\n value={formState[prefill.customer_phone] ?? \"\"}\n onChange={(e) => onFieldChange(prefill.customer_phone!, e.target.value)}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n {/* Custom components (FAQs, testimonials, etc.) */}\n {checkout.components && checkout.components.length > 0 && (\n <div className=\"space-y-4\">\n {checkout.components.map((comp: CatalogComponent) => {\n const Comp = DisplayComponentMap[comp.type];\n if (!Comp) return null;\n return (\n <div\n key={comp.id}\n className={comp.className || \"\"}\n style={comp.style as React.CSSProperties | undefined}\n data-component-id={comp.id}\n >\n <Comp props={comp.props} themeColor={themeColor} />\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Right: Payment Action — sticky */}\n <div className=\"lg:col-span-5\">\n <div className=\"lg:sticky lg:top-20 space-y-5\">\n <div className=\"bg-white rounded-2xl border border-gray-100 shadow-sm p-7 space-y-6\">\n {/* Summary line */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-gray-500\">\n {cartItems.length} {cartItems.length === 1 ? \"item\" : \"items\"}\n </span>\n </div>\n {couponApplied && (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-green-600 font-medium\">Discount ({couponCode})</span>\n <span className=\"text-green-600 font-medium\">Applied at checkout</span>\n </div>\n )}\n {trialDays && (\n <div\n className=\"flex items-center gap-2 p-3.5 rounded-xl text-sm font-medium\"\n style={{ backgroundColor: `${themeColor}08`, color: themeColor }}\n >\n <svg className=\"w-4 h-4 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n You won't be charged for {trialDays} days\n </div>\n )}\n </div>\n\n {/* Checkout Button */}\n <button\n onClick={handleCheckout}\n disabled={status === \"loading\" || cartItems.length === 0}\n className=\"w-full flex items-center justify-center gap-2.5 px-6 py-4 rounded-xl text-white font-bold text-base transition-all duration-200 hover:shadow-lg hover:scale-[1.01] active:scale-[0.99] disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:scale-100 disabled:hover:shadow-none\"\n style={{ backgroundColor: themeColor }}\n data-component-id=\"__checkout_pay_button\"\n data-component-type=\"checkout_pay_button\"\n >\n {status === \"loading\" ? (\n <>\n <svg className=\"w-5 h-5 animate-spin\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n Processing...\n </>\n ) : (\n <>\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z\" />\n </svg>\n {buttonText}\n </>\n )}\n </button>\n\n {/* Continue without paying */}\n <button\n onClick={onContinue}\n className=\"w-full text-center text-sm text-gray-400 hover:text-gray-600 font-medium transition-colors py-1\"\n data-component-id=\"__checkout_skip_button\"\n data-component-type=\"checkout_skip_button\"\n >\n Continue without paying\n </button>\n\n {/* Error */}\n {status === \"error\" && errorMsg && (\n <div role=\"alert\" className=\"flex items-start gap-2 p-3 rounded-xl bg-red-50 border border-red-100\">\n <svg className=\"w-4 h-4 text-red-500 flex-shrink-0 mt-0.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\" />\n </svg>\n <p className=\"text-xs text-red-600\">{errorMsg}</p>\n </div>\n )}\n\n {/* Payment card icons */}\n <div className=\"flex items-center justify-center gap-3 pt-1\">\n <svg className=\"h-6 text-gray-300\" viewBox=\"0 0 38 24\" fill=\"currentColor\">\n <rect width=\"38\" height=\"24\" rx=\"3\" fill=\"currentColor\" opacity=\"0.15\" />\n <path d=\"M15.7 16.2h-2.3l1.4-8.8h2.3l-1.4 8.8zm9.4-8.6c-.5-.2-1.2-.3-2.1-.3-2.3 0-3.9 1.2-3.9 2.9 0 1.3 1.2 2 2 2.4.9.4 1.2.7 1.2 1.1 0 .6-.7.9-1.4.9-.9 0-1.4-.1-2.2-.5l-.3-.1-.3 2c.5.3 1.5.5 2.5.5 2.4 0 4-1.2 4-3 0-1-.6-1.8-1.9-2.4-.8-.4-1.3-.7-1.3-1.1 0-.4.4-.8 1.3-.8.7 0 1.3.2 1.7.3l.2.1.3-1.9v-.1z\" fill=\"white\" />\n </svg>\n <svg className=\"h-6 text-gray-300\" viewBox=\"0 0 38 24\" fill=\"currentColor\">\n <rect width=\"38\" height=\"24\" rx=\"3\" fill=\"currentColor\" opacity=\"0.15\" />\n <circle cx=\"15\" cy=\"12\" r=\"6\" fill=\"white\" opacity=\"0.5\" />\n <circle cx=\"23\" cy=\"12\" r=\"6\" fill=\"white\" opacity=\"0.5\" />\n </svg>\n <svg className=\"h-4 w-4 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z\" />\n </svg>\n <span className=\"text-[10px] text-gray-400 font-medium\">Powered by Stripe</span>\n </div>\n </div>\n\n {/* Testimonial */}\n {checkout.testimonial?.enabled && checkout.testimonial.text && (\n <div className=\"bg-white rounded-2xl border border-gray-100 shadow-sm p-6\" data-component-id=\"__checkout_testimonial\" data-component-type=\"checkout_testimonial\">\n <div className=\"flex items-start gap-4\">\n {checkout.testimonial.avatar ? (\n <img src={checkout.testimonial.avatar} alt=\"\" className=\"w-11 h-11 rounded-full object-cover flex-shrink-0\" />\n ) : (\n <div\n className=\"w-11 h-11 rounded-full flex-shrink-0 flex items-center justify-center text-white font-bold text-sm\"\n style={{ backgroundColor: themeColor }}\n >\n {checkout.testimonial.author?.[0]?.toUpperCase() || \"?\"}\n </div>\n )}\n <div>\n <p className=\"text-sm text-gray-600 italic leading-relaxed\">\n &ldquo;{checkout.testimonial.text}&rdquo;\n </p>\n {checkout.testimonial.author && (\n <p className=\"text-xs text-gray-400 font-medium mt-2.5\">\n — {checkout.testimonial.author}\n </p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Disclaimer */}\n {checkout.show_disclaimer && checkout.disclaimer_text && (\n <p className=\"text-[11px] text-gray-400 text-center leading-relaxed px-4\">\n {checkout.disclaimer_text}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"mt-16 text-center text-[11px] text-gray-300 font-medium tracking-wide\">\n Powered by Catalog Kit\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState, useMemo, useRef, useCallback } from \"react\";\nimport { StickyBarConfig, StickyBarAction, FormState, CartItem } from \"@shared/types\";\n\ninterface StickyBottomBarProps {\n config: StickyBarConfig;\n formState: FormState;\n cartItems: CartItem[];\n themeColor: string;\n /** Fallback text when config has no primary.label or button_text */\n defaultButtonText: string;\n /** Default \"next page\" handler */\n onNext: () => void;\n /** Trigger a page action by id */\n onAction: (actionId: string) => void;\n /** Set a field value */\n onFieldChange: (fieldId: string, value: any) => void;\n /** Set a field value AND navigate to the next page atomically (avoids stale-closure validation bug) */\n onFieldAndNavigate: (fieldId: string, value: any) => void;\n onBack?: () => void;\n showBack?: boolean;\n /** Skip rendering the spacer div (e.g. on cover pages where content is centered) */\n noSpacer?: boolean;\n /** When true, the primary CTA button is disabled */\n buttonDisabled?: boolean;\n /** When true, the primary CTA button shows a loading spinner */\n buttonLoading?: boolean;\n /** Message shown when clicking a disabled button */\n buttonDisabledMessage?: string;\n}\n\nfunction resolveTemplates(template: string, formState: FormState): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, fieldId) => {\n const val = formState[fieldId];\n return val != null ? String(val) : \"\";\n });\n}\n\nexport const StickyBottomBar: React.FC<StickyBottomBarProps> = ({\n config,\n formState,\n cartItems,\n themeColor,\n defaultButtonText,\n onNext,\n onAction,\n onFieldChange,\n onFieldAndNavigate,\n onBack,\n showBack,\n noSpacer,\n buttonDisabled,\n buttonLoading,\n buttonDisabledMessage,\n}) => {\n // Start hidden if delay, show_after, or scroll_behavior is configured\n const shouldStartHidden = !!(config.show_after || config.delay_ms || config.scroll_behavior);\n const [visible, setVisible] = useState(!shouldStartHidden);\n const [delayElapsed, setDelayElapsed] = useState(!config.delay_ms);\n const [disabledMsg, setDisabledMsg] = useState<string | null>(null);\n const disabledMsgTimer = useRef<ReturnType<typeof setTimeout>>();\n\n const handleDisabledClick = useCallback(() => {\n const msg = buttonDisabledMessage || \"Please fill in all required fields\";\n setDisabledMsg(msg);\n clearTimeout(disabledMsgTimer.current);\n disabledMsgTimer.current = setTimeout(() => setDisabledMsg(null), 3000);\n }, [buttonDisabledMessage]);\n\n useEffect(() => () => clearTimeout(disabledMsgTimer.current), []);\n\n // Delay timer — bar cannot appear until delay has passed\n useEffect(() => {\n if (!config.delay_ms) return;\n const timer = setTimeout(() => {\n setDelayElapsed(true);\n // If no other visibility gate (show_after, scroll_behavior), show immediately after delay\n if (!config.show_after && !config.scroll_behavior) {\n setVisible(true);\n }\n }, config.delay_ms);\n return () => clearTimeout(timer);\n }, [config.delay_ms, config.show_after, config.scroll_behavior]);\n\n // Scroll-direction behavior — show on scroll up, hide on scroll down\n useEffect(() => {\n if (config.scroll_behavior !== \"show_on_up\") return;\n let lastScrollY = window.scrollY;\n const onScroll = () => {\n const currentY = window.scrollY;\n if (currentY < lastScrollY && delayElapsed) {\n // Scrolling up\n setVisible(true);\n } else if (currentY > lastScrollY) {\n // Scrolling down\n setVisible(false);\n }\n lastScrollY = currentY;\n };\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", onScroll);\n }, [config.scroll_behavior, delayElapsed]);\n\n // Show bar only after user scrolls past the anchor element\n useEffect(() => {\n if (!config.show_after) return;\n const target = document.getElementById(config.show_after);\n if (!target) return;\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!delayElapsed) return; // respect delay gate\n // If scroll_behavior is active, don't force-show — let scroll handler decide\n if (!entry.isIntersecting && !config.scroll_behavior) setVisible(true);\n if (entry.isIntersecting) setVisible(false);\n },\n { threshold: 0 }\n );\n observer.observe(target);\n return () => observer.disconnect();\n }, [config.show_after, delayElapsed, config.scroll_behavior]);\n\n // Hide when page-bottom submit area is visible\n useEffect(() => {\n if (!config.hide_at_bottom) return;\n const target = document.querySelector(\"[data-sticky-sentinel]\");\n if (!target) return;\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) setVisible(false);\n else if (!config.show_after && !config.scroll_behavior) setVisible(true);\n // If show_after or scroll_behavior is also set, don't re-show — let those handlers decide\n },\n { threshold: 0.1 }\n );\n observer.observe(target);\n return () => observer.disconnect();\n }, [config.hide_at_bottom, config.show_after, config.scroll_behavior]);\n\n const resolvedSubtitle = useMemo(\n () => (config.subtitle ? resolveTemplates(config.subtitle, formState) : null),\n [config.subtitle, formState]\n );\n\n const resolvedHtml = useMemo(\n () => (config.html ? resolveTemplates(config.html, formState) : null),\n [config.html, formState]\n );\n\n /**\n * Dispatch a StickyBarAction:\n * - \"next\" or undefined → onNext()\n * - \"action:<id>\" → onAction(id)\n * - \"field:<fieldId>:<value>\" → set field then onNext()\n */\n const dispatch = (act: StickyBarAction | undefined) => {\n const cmd = act?.action || \"next\";\n if (cmd === \"next\") {\n onNext();\n } else if (cmd.startsWith(\"action:\")) {\n const actionId = cmd.slice(\"action:\".length);\n onAction(actionId);\n } else if (cmd.startsWith(\"field:\")) {\n const parts = cmd.slice(\"field:\".length).split(\":\");\n if (parts.length >= 2) {\n onFieldAndNavigate(parts[0], parts.slice(1).join(\":\"));\n }\n } else {\n onNext();\n }\n };\n\n const barStyle = config.style || \"solid\";\n\n const bgStyles: Record<string, React.CSSProperties> = {\n solid: {\n background: \"rgba(255, 255, 255, 0.98)\",\n borderTop: \"1px solid rgba(0,0,0,0.06)\",\n },\n glass: {\n background: \"rgba(255, 255, 255, 0.75)\",\n backdropFilter: \"blur(20px) saturate(180%)\",\n WebkitBackdropFilter: \"blur(20px) saturate(180%)\",\n borderTop: \"1px solid rgba(255,255,255,0.3)\",\n },\n glass_dark: {\n background: \"rgba(0, 0, 0, 0.35)\",\n backdropFilter: \"blur(24px) saturate(180%)\",\n WebkitBackdropFilter: \"blur(24px) saturate(180%)\",\n borderTop: \"1px solid rgba(255,255,255,0.12)\",\n },\n gradient: {\n background: `linear-gradient(135deg, ${themeColor}08 0%, ${themeColor}15 100%)`,\n borderTop: `1px solid ${themeColor}20`,\n },\n };\n\n // Resolve primary/secondary labels\n const primaryLabel = config.primary?.label\n ? resolveTemplates(config.primary.label, formState)\n : config.button_text || defaultButtonText;\n\n const secondaryAction = config.secondary;\n const secondaryLabel = secondaryAction?.label\n ? resolveTemplates(secondaryAction.label, formState)\n : null;\n\n const secondaryStyle = secondaryAction?.style || \"ghost\";\n const isDark = barStyle === \"glass_dark\";\n\n return (\n <>\n {/* Spacer — skipped on cover pages where content is vertically centered */}\n {!noSpacer && <div className=\"h-24\" />}\n\n <div\n className={`fixed bottom-0 left-0 right-0 z-[80] transition-all duration-300 ${\n visible\n ? \"translate-y-0 opacity-100\"\n : \"translate-y-full opacity-0 pointer-events-none\"\n }`}\n style={{\n ...bgStyles[barStyle],\n boxShadow: isDark ? \"0 -4px 32px rgba(0,0,0,0.2)\" : \"0 -4px 24px rgba(0,0,0,0.06)\",\n fontFamily: \"var(--font-display)\",\n }}\n data-component-id=\"__sticky_bottom_bar\"\n data-component-type=\"sticky_bottom_bar\"\n >\n <div className=\"max-w-2xl mx-auto px-5 py-3.5\">\n {/* Custom HTML row */}\n {resolvedHtml && (\n <div\n className={`text-center text-sm mb-2.5 [&_strong]:font-bold [&_em]:italic [&_span]:inline ${isDark ? \"text-white/70\" : \"text-gray-600\"}`}\n dangerouslySetInnerHTML={{ __html: resolvedHtml }}\n />\n )}\n\n {/* Subtitle row */}\n {!resolvedHtml && resolvedSubtitle && (\n <p className={`text-center text-sm mb-2.5 ${isDark ? \"text-white/60\" : \"text-gray-500\"}`}>\n {resolvedSubtitle}\n </p>\n )}\n\n <div className=\"flex items-center gap-3\">\n {/* Back button */}\n {showBack && onBack && (\n <button\n onClick={onBack}\n className={`flex-shrink-0 w-10 h-10 flex items-center justify-center rounded-xl transition-all ${\n isDark\n ? \"text-white/50 hover:text-white hover:bg-white/10\"\n : \"text-gray-400 hover:text-gray-700 hover:bg-gray-100\"\n }`}\n aria-label=\"Go back\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" />\n </svg>\n </button>\n )}\n\n {/* Secondary action */}\n {secondaryLabel && (\n <button\n onClick={() => dispatch(secondaryAction)}\n className={`flex-shrink-0 px-4 py-3 rounded-xl text-[14px] font-semibold transition-all duration-200 ${\n secondaryStyle === \"secondary\"\n ? \"border-2 hover:shadow-sm\"\n : isDark ? \"hover:bg-white/10\" : \"hover:bg-gray-100\"\n }`}\n style={\n secondaryStyle === \"secondary\"\n ? { borderColor: isDark ? \"rgba(255,255,255,0.2)\" : `${themeColor}30`, color: isDark ? \"rgba(255,255,255,0.8)\" : themeColor }\n : { color: isDark ? \"rgba(255,255,255,0.6)\" : \"#6b7280\" }\n }\n >\n {secondaryLabel}\n </button>\n )}\n\n {/* Primary CTA */}\n <button\n onClick={() => {\n if (buttonDisabled || buttonLoading) {\n handleDisabledClick();\n } else {\n dispatch(config.primary);\n }\n }}\n className={`flex-1 relative flex items-center justify-center gap-2 py-3.5 rounded-xl text-white font-bold text-base transition-all duration-200 ${\n buttonDisabled || buttonLoading\n ? \"opacity-50 cursor-not-allowed\"\n : \"hover:shadow-lg hover:scale-[1.01] active:scale-[0.99]\"\n }`}\n style={{ backgroundColor: themeColor }}\n >\n {buttonLoading && (\n <svg className=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\"><circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" /><path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" /></svg>\n )}\n {primaryLabel}\n\n {/* Cart count badge */}\n {config.show_cart_count && cartItems.length > 0 && (\n <span\n className=\"absolute -top-2 -right-2 min-w-[22px] h-[22px] flex items-center justify-center rounded-full text-[11px] font-bold text-white px-1.5\"\n style={{ backgroundColor: themeColor, boxShadow: isDark ? \"0 0 0 2.5px rgba(0,0,0,0.3)\" : \"0 0 0 2.5px white\" }}\n >\n {cartItems.length}\n </span>\n )}\n\n {/* Only show arrow if label doesn't already contain an arrow character */}\n {!buttonLoading && !(/[→⟶➔➜►▶︎>]/.test(primaryLabel)) && (\n <svg className=\"w-4 h-4 opacity-70\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n )}\n </button>\n </div>\n {disabledMsg && (\n <p className={`text-sm text-center mt-2 animate-[shake_0.3s_ease-in-out] ${isDark ? \"text-red-300\" : \"text-red-500\"}`}>{disabledMsg}</p>\n )}\n </div>\n </div>\n </>\n );\n};\n","import React, { useState, useCallback, useEffect, useRef } from \"react\";\nimport { PopupConfig, PopupForm, PopupAction, FormState, CatalogComponent } from \"@shared/types\";\n\ninterface PopupProps {\n popupId: string;\n config: PopupConfig;\n themeColor: string;\n hints: Record<string, string>;\n onDismiss: () => void;\n onFormSubmit: (popupId: string, formData: Record<string, any>) => void;\n onTrack: (event: string, extra?: Record<string, unknown>) => void;\n}\n\n/** Resolve __variants on popup content fields */\nfunction resolvePopupVariants(\n content: Record<string, any>,\n config: PopupConfig,\n hints: Record<string, string>\n): Record<string, any> {\n const resolved = { ...content };\n\n for (const [key, value] of Object.entries(config)) {\n if (!key.endsWith(\"__variants\") || typeof value !== \"object\" || !value) continue;\n const baseProp = key.replace(\"__variants\", \"\");\n // Find the best matching variant\n let bestMatch: { val: string; score: number } | null = null;\n for (const [condStr, variantValue] of Object.entries(value as Record<string, string>)) {\n const conditions = condStr.split(\",\").map((c) => c.trim());\n let allMatch = true;\n let score = 0;\n for (const cond of conditions) {\n const [k, v] = cond.split(\"=\");\n if (hints[k] === v) score++;\n else { allMatch = false; break; }\n }\n if (allMatch && score > 0 && (!bestMatch || score > bestMatch.score)) {\n bestMatch = { val: variantValue, score };\n }\n }\n if (bestMatch && baseProp in resolved) {\n resolved[baseProp] = bestMatch.val;\n }\n }\n\n return resolved;\n}\n\n/** Simple inline form renderer for popup forms */\nfunction PopupFormRenderer({\n form,\n themeColor,\n onSubmit,\n}: {\n form: PopupForm;\n themeColor: string;\n onSubmit: (data: Record<string, any>) => void;\n}) {\n const [values, setValues] = useState<Record<string, any>>({});\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n const handleChange = useCallback((id: string, value: any) => {\n setValues((prev) => ({ ...prev, [id]: value }));\n setErrors((prev) => {\n const next = { ...prev };\n delete next[id];\n return next;\n });\n }, []);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n // Validate required fields\n const newErrors: Record<string, string> = {};\n for (const field of form.fields) {\n if (field.props?.required) {\n const val = values[field.id];\n if (val == null || val === \"\") {\n newErrors[field.id] = \"Required\";\n }\n }\n if (field.type === \"email\" && values[field.id]) {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(values[field.id]))) {\n newErrors[field.id] = \"Invalid email\";\n }\n }\n }\n if (Object.keys(newErrors).length > 0) {\n setErrors(newErrors);\n return;\n }\n onSubmit(values);\n },\n [form.fields, values, onSubmit]\n );\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n {form.fields.map((field) => (\n <div key={field.id}>\n {field.props?.label && (\n <label className=\"block text-xs font-semibold text-gray-600 mb-1\">\n {field.props.label}\n {field.props.required && <span className=\"text-red-400 ml-0.5\">*</span>}\n </label>\n )}\n <input\n type={field.type === \"email\" ? \"email\" : \"text\"}\n placeholder={field.props?.placeholder || \"\"}\n value={values[field.id] || \"\"}\n onChange={(e) => handleChange(field.id, e.target.value)}\n className={`w-full px-3.5 py-2.5 rounded-xl border text-sm transition-all duration-200 outline-none ${\n errors[field.id]\n ? \"border-red-300 bg-red-50 focus:border-red-400 focus:ring-2 focus:ring-red-100\"\n : \"border-gray-200 bg-white focus:border-blue-300 focus:ring-2 focus:ring-blue-100\"\n }`}\n />\n {errors[field.id] && (\n <p className=\"text-xs text-red-500 mt-0.5\" role=\"alert\">{errors[field.id]}</p>\n )}\n </div>\n ))}\n <button\n type=\"submit\"\n className=\"w-full py-2.5 px-4 rounded-xl text-white font-semibold text-sm transition-all duration-200 hover:opacity-90 active:scale-[0.98]\"\n style={{ backgroundColor: themeColor }}\n >\n {form.submit_label || \"Submit\"}\n </button>\n </form>\n );\n}\n\nexport const Popup: React.FC<PopupProps> = ({\n popupId,\n config,\n themeColor,\n hints,\n onDismiss,\n onFormSubmit,\n onTrack,\n}) => {\n const popupRef = useRef<HTMLDivElement>(null);\n const [isClosing, setIsClosing] = useState(false);\n\n const style = config.style || {};\n const position = style.position || \"center\";\n const animation = style.animation || \"scale\";\n const maxWidth = style.max_width || \"420px\";\n\n // Resolve content with variant overrides\n const content = resolvePopupVariants(config.content || {}, config, hints);\n\n const handleClose = useCallback(() => {\n setIsClosing(true);\n setTimeout(() => {\n onDismiss();\n }, 200);\n }, [onDismiss]);\n\n // Close on escape\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") handleClose();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [handleClose]);\n\n // Close on backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) handleClose();\n },\n [handleClose]\n );\n\n const handleFormSubmit = useCallback(\n (data: Record<string, any>) => {\n onFormSubmit(popupId, data);\n },\n [popupId, onFormSubmit]\n );\n\n // Animation classes\n const getAnimationClass = () => {\n const base = isClosing ? \"opacity-0\" : \"opacity-100\";\n if (animation === \"slide-up\") {\n return `${base} ${isClosing ? \"translate-y-4\" : \"translate-y-0\"}`;\n }\n if (animation === \"slide-down\") {\n return `${base} ${isClosing ? \"-translate-y-4\" : \"translate-y-0\"}`;\n }\n if (animation === \"scale\") {\n return `${base} ${isClosing ? \"scale-95\" : \"scale-100\"}`;\n }\n return base; // fade\n };\n\n // Position classes\n const getPositionClasses = () => {\n switch (position) {\n case \"bottom-right\":\n return \"items-end justify-end p-4 sm:p-6\";\n case \"bottom-left\":\n return \"items-end justify-start p-4 sm:p-6\";\n case \"full-screen\":\n return \"items-center justify-center\";\n default: // center\n return \"items-center justify-center p-4\";\n }\n };\n\n // Auto-dismiss for toasts\n useEffect(() => {\n if (config.auto_dismiss && config.auto_dismiss > 0) {\n const timer = setTimeout(handleClose, config.auto_dismiss * 1000);\n return () => clearTimeout(timer);\n }\n }, [config.auto_dismiss, handleClose]);\n\n const handleAction = useCallback(\n (action: PopupAction) => {\n if (action.action === \"track\" && action.event) onTrack(action.event);\n if (action.action === \"redirect\" && action.url) window.open(action.url, \"_blank\");\n if (action.action === \"close\" || action.action === \"redirect\") handleClose();\n },\n [onTrack, handleClose]\n );\n\n const overlayBg =\n style.overlay === \"none\"\n ? \"bg-transparent\"\n : style.overlay === \"light\"\n ? \"bg-white/30 backdrop-blur-sm\"\n : \"bg-black/40 backdrop-blur-sm\"; // dark (default)\n\n // --- Toast mode: non-blocking, no overlay ---\n if (config.mode === \"toast\") {\n const toastPosition = position === \"bottom-left\" ? \"left-4 sm:left-6\" : \"right-4 sm:right-6\";\n\n return (\n <div\n ref={popupRef}\n role=\"status\"\n aria-live=\"polite\"\n className={`fixed bottom-4 sm:bottom-6 ${toastPosition} z-[200] bg-white rounded-2xl shadow-2xl overflow-hidden transition-all duration-300 ease-out ${getAnimationClass()}`}\n style={{ maxWidth: `min(${maxWidth || \"360px\"}, calc(100vw - 2rem))`, width: \"100%\" }}\n >\n {/* Close button */}\n <button\n onClick={handleClose}\n className=\"absolute top-2 right-2 w-6 h-6 flex items-center justify-center rounded-full bg-gray-100/80 hover:bg-gray-200 text-gray-400 hover:text-gray-600 transition-all duration-200 z-10\"\n aria-label=\"Dismiss\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n\n <div className=\"flex items-start gap-3 p-4\">\n {content.image && (\n <img src={content.image} alt=\"\" className=\"w-10 h-10 rounded-full object-cover flex-shrink-0 mt-0.5\" />\n )}\n <div className=\"flex-1 min-w-0\">\n {content.headline && (\n <p className=\"text-sm font-semibold text-gray-900 leading-snug\" style={{ fontFamily: \"var(--font-display)\" }}>\n {content.headline}\n </p>\n )}\n {content.subheadline && (\n <p className=\"text-xs text-gray-500 mt-0.5 leading-relaxed\">\n {content.subheadline}\n </p>\n )}\n {content.actions && content.actions.length > 0 && (\n <div className=\"flex gap-2 mt-2\">\n {content.actions.map((action: PopupAction, i: number) => (\n <button\n key={i}\n onClick={() => handleAction(action)}\n className={`text-xs font-semibold px-3 py-1.5 rounded-lg transition-all duration-200 ${\n action.style === \"ghost\"\n ? \"text-gray-500 hover:text-gray-700 hover:bg-gray-100\"\n : action.style === \"secondary\"\n ? \"border border-gray-200 text-gray-700 hover:bg-gray-50\"\n : \"text-white hover:opacity-90\"\n }`}\n style={!action.style || action.style === \"primary\" ? { backgroundColor: themeColor } : undefined}\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Auto-dismiss progress bar */}\n {config.auto_dismiss && (\n <div className=\"h-0.5 bg-gray-100\">\n <div\n className=\"h-full rounded-full transition-none\"\n style={{\n backgroundColor: themeColor,\n animation: `toast-progress ${config.auto_dismiss}s linear forwards`,\n }}\n />\n </div>\n )}\n\n <style>{`@keyframes toast-progress { from { width: 100%; } to { width: 0%; } }`}</style>\n </div>\n );\n }\n\n // --- Modal mode (default) ---\n return (\n <div\n className={`fixed inset-0 z-[200] flex ${getPositionClasses()} ${overlayBg} transition-opacity duration-200 ${\n isClosing ? \"opacity-0\" : \"opacity-100\"\n }`}\n onClick={handleBackdropClick}\n >\n <div\n ref={popupRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={content.headline || \"Popup\"}\n className={`bg-white rounded-2xl shadow-2xl w-full overflow-hidden transition-all duration-300 ease-out ${getAnimationClass()}`}\n style={{\n maxWidth: position === \"full-screen\" ? \"100vw\" : maxWidth,\n ...(position === \"full-screen\" ? { width: \"100vw\", height: \"100vh\", borderRadius: 0 } : {}),\n }}\n data-component-id={`__popup_${popupId}`}\n data-component-type=\"popup\"\n data-page-id=\"__global\"\n >\n {/* Close button */}\n <button\n onClick={handleClose}\n className=\"absolute top-3 right-3 w-8 h-8 flex items-center justify-center rounded-full bg-gray-100/80 hover:bg-gray-200 text-gray-400 hover:text-gray-600 transition-all duration-200 z-10\"\n aria-label=\"Close\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n\n <div className=\"relative p-6 sm:p-8\">\n {/* Image */}\n {content.image && (\n <div className=\"mb-5 -mx-6 -mt-6 sm:-mx-8 sm:-mt-8\">\n <img\n src={content.image}\n alt=\"\"\n className=\"w-full h-40 sm:h-48 object-cover\"\n />\n </div>\n )}\n\n {/* Headline */}\n {content.headline && (\n <h3\n className=\"text-xl sm:text-2xl font-bold text-gray-900 mb-2\"\n style={{ fontFamily: \"var(--font-display)\", letterSpacing: \"-0.02em\" }}\n >\n {content.headline}\n </h3>\n )}\n\n {/* Subheadline */}\n {content.subheadline && (\n <p className=\"text-sm text-gray-500 mb-5 leading-relaxed\">\n {content.subheadline}\n </p>\n )}\n\n {/* Action buttons for modals too */}\n {content.actions && content.actions.length > 0 && !config.form && (\n <div className=\"flex gap-3 mt-4\">\n {content.actions.map((action: PopupAction, i: number) => (\n <button\n key={i}\n onClick={() => handleAction(action)}\n className={`text-sm font-semibold px-5 py-2.5 rounded-xl transition-all duration-200 ${\n action.style === \"ghost\"\n ? \"text-gray-500 hover:text-gray-700 hover:bg-gray-100\"\n : action.style === \"secondary\"\n ? \"border border-gray-200 text-gray-700 hover:bg-gray-50\"\n : \"text-white hover:opacity-90\"\n }`}\n style={!action.style || action.style === \"primary\" ? { backgroundColor: themeColor } : undefined}\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n\n {/* Form */}\n {config.form && (\n <PopupFormRenderer\n form={config.form}\n themeColor={themeColor}\n onSubmit={handleFormSubmit}\n />\n )}\n\n {/* No form, no content — show a simple dismiss button */}\n {!config.form && !content.headline && !content.subheadline && !content.image && (\n <div className=\"text-center py-4\">\n <button\n onClick={handleClose}\n className=\"px-6 py-2.5 rounded-xl text-sm font-semibold transition-all duration-200 hover:opacity-90\"\n style={{ backgroundColor: themeColor, color: \"white\" }}\n >\n Got it\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useCallback, useRef } from \"react\";\n\n/**\n * Element Inspector — DevEx tool for AI agent workflows.\n *\n * Hold Shift+Alt and hover over any catalog element to see rich context:\n * catalog ID, slug, variant, page ID, component ID, type, label, and the\n * full schema path. Click to copy a structured JSON block that an AI agent\n * can use to pinpoint exactly what the user is referring to.\n *\n * Reads `data-page-id`, `data-component-id`, and `data-component-type`\n * attributes already present in the rendered DOM. Also drills into\n * sub-elements (labels, inputs, buttons, images, etc.) for more granular\n * targeting.\n */\n\nexport interface InspectorContext {\n catalogId: string;\n catalogSlug: string;\n variantSlug?: string | null;\n variantId?: string | null;\n currentPageId: string;\n sandboxOf?: string | null;\n totalPages: number;\n currentPageIndex: number;\n themeColor: string;\n apiUrl?: string;\n}\n\ninterface TooltipInfo {\n pageId: string;\n componentId: string;\n componentType: string;\n componentLabel: string | null;\n subElement: string | null;\n rect: DOMRect;\n ref: string;\n schemaPath: string;\n}\n\n/** Identify a meaningful sub-element role within a component wrapper. */\nfunction identifySubElement(target: HTMLElement, componentRoot: HTMLElement): string | null {\n if (target === componentRoot) return null;\n\n let el: HTMLElement | null = target;\n while (el && el !== componentRoot) {\n const tag = el.tagName.toLowerCase();\n // Labels\n if (tag === \"label\") return \"label\";\n // Buttons\n if (tag === \"button\" || el.getAttribute(\"role\") === \"button\") return \"button\";\n // Images / video\n if (tag === \"img\") return \"image\";\n if (tag === \"video\") return \"video\";\n // Inputs\n if (tag === \"input\") {\n const inputType = (el as HTMLInputElement).type || \"text\";\n return `input:${inputType}`;\n }\n if (tag === \"textarea\") return \"textarea\";\n if (tag === \"select\") return \"select\";\n // Links\n if (tag === \"a\") return \"link\";\n // Headings\n if (/^h[1-6]$/.test(tag)) return tag;\n // Paragraphs with meaningful text\n if (tag === \"p\" && el.textContent && el.textContent.trim().length > 0) return \"text\";\n // Radio/checkbox option wrappers\n if (el.getAttribute(\"role\") === \"radio\" || el.getAttribute(\"role\") === \"checkbox\") return el.getAttribute(\"role\")!;\n // Option cards (common in quiz funnels)\n if (el.dataset.optionValue) return `option:${el.dataset.optionValue}`;\n\n el = el.parentElement;\n }\n return null;\n}\n\n/** Extract the label text from a component's DOM */\nfunction extractLabel(componentEl: HTMLElement): string | null {\n // Check for a label element\n const label = componentEl.querySelector(\"label\");\n if (label?.textContent?.trim()) return label.textContent.trim();\n // Check for headings\n const heading = componentEl.querySelector(\"h1, h2, h3, h4, h5, h6\");\n if (heading?.textContent?.trim()) return heading.textContent.trim();\n // Check for button text (display components like payment_button)\n const btn = componentEl.querySelector(\"button\");\n if (btn?.textContent?.trim()) return btn.textContent.trim();\n return null;\n}\n\ninterface ElementInspectorProps {\n context?: InspectorContext;\n}\n\nexport const ElementInspector: React.FC<ElementInspectorProps> = ({ context }) => {\n const [active, setActive] = useState(false);\n const [tooltip, setTooltip] = useState<TooltipInfo | null>(null);\n const [copied, setCopied] = useState(false);\n const [showPanel, setShowPanel] = useState(false);\n const highlightRef = useRef<HTMLDivElement | null>(null);\n\n // Track Shift+Alt held state\n useEffect(() => {\n const keysDown = new Set<string>();\n\n const onKeyDown = (e: KeyboardEvent) => {\n keysDown.add(e.key);\n if (e.shiftKey && e.altKey) setActive(true);\n };\n const onKeyUp = (e: KeyboardEvent) => {\n keysDown.delete(e.key);\n if (!e.shiftKey || !e.altKey) {\n setActive(false);\n setTooltip(null);\n }\n };\n const onBlur = () => {\n keysDown.clear();\n setActive(false);\n setTooltip(null);\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n window.addEventListener(\"keyup\", onKeyUp);\n window.addEventListener(\"blur\", onBlur);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n window.removeEventListener(\"keyup\", onKeyUp);\n window.removeEventListener(\"blur\", onBlur);\n };\n }, []);\n\n // Hover detection\n const onMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!active) return;\n\n const target = e.target as HTMLElement;\n\n // Walk up to find nearest element with data-component-id\n let el: HTMLElement | null = target;\n while (el && !el.dataset.componentId) {\n el = el.parentElement;\n }\n\n if (!el) {\n setTooltip(null);\n return;\n }\n\n const componentId = el.dataset.componentId!;\n const componentType = el.dataset.componentType || \"unknown\";\n const componentLabel = extractLabel(el);\n\n // Identify sub-element within the component\n const subElement = identifySubElement(target, el);\n\n // Walk up further to find page ID\n let pageEl: HTMLElement | null = el;\n while (pageEl && !pageEl.dataset.pageId) {\n pageEl = pageEl.parentElement;\n }\n const pageId = pageEl?.dataset.pageId || \"unknown\";\n\n // Use the sub-element's bounding rect for tighter highlight\n let highlightEl: HTMLElement = el;\n if (subElement) {\n // Walk up from target to find the sub-element boundary\n let sub: HTMLElement | null = target;\n while (sub && sub !== el) {\n const tag = sub.tagName.toLowerCase();\n if (tag === \"label\" || tag === \"button\" || tag === \"img\" || tag === \"video\" ||\n tag === \"input\" || tag === \"textarea\" || tag === \"select\" || tag === \"a\" ||\n /^h[1-6]$/.test(tag) || sub.getAttribute(\"role\") === \"button\" ||\n sub.getAttribute(\"role\") === \"radio\" || sub.getAttribute(\"role\") === \"checkbox\" ||\n sub.dataset.optionValue) {\n highlightEl = sub;\n break;\n }\n sub = sub.parentElement;\n }\n }\n\n const ref = subElement\n ? `${pageId}/${componentId}#${subElement}`\n : `${pageId}/${componentId}`;\n\n // Schema path for API: pages.{pageId}.components[?].props\n const schemaPath = `schema.pages.${pageId}.components[id=\"${componentId}\"]`;\n\n setTooltip({\n pageId,\n componentId,\n componentType,\n componentLabel,\n subElement,\n rect: highlightEl.getBoundingClientRect(),\n ref,\n schemaPath,\n });\n setCopied(false);\n },\n [active]\n );\n\n useEffect(() => {\n if (active) {\n document.addEventListener(\"mousemove\", onMouseMove);\n document.body.style.cursor = \"crosshair\";\n } else {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.body.style.cursor = \"\";\n }\n return () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.body.style.cursor = \"\";\n };\n }, [active, onMouseMove]);\n\n // Build the structured clipboard content\n const buildClipboardContent = useCallback((): string => {\n if (!tooltip) return \"\";\n\n const data: Record<string, any> = {\n ref: tooltip.ref,\n page_id: tooltip.pageId,\n component_id: tooltip.componentId,\n component_type: tooltip.componentType,\n };\n\n if (tooltip.componentLabel) data.label = tooltip.componentLabel;\n if (tooltip.subElement) data.sub_element = tooltip.subElement;\n data.schema_path = tooltip.schemaPath;\n\n if (context) {\n data.catalog_id = context.catalogId;\n data.catalog_slug = context.catalogSlug;\n if (context.variantSlug) data.variant_slug = context.variantSlug;\n if (context.variantId) data.variant_id = context.variantId;\n if (context.sandboxOf) data.sandbox_of = context.sandboxOf;\n data.api_endpoint = `PUT ${context.apiUrl || \"https://api.catalogkit.cc\"}/api/v1/catalogs/${context.catalogId}`;\n }\n\n return JSON.stringify(data, null, 2);\n }, [tooltip, context]);\n\n // Click anywhere while active → copy the reference\n useEffect(() => {\n if (!active) return;\n\n const onClick = (e: MouseEvent) => {\n // Always prevent the underlying interaction while inspector is active\n e.stopPropagation();\n e.preventDefault();\n\n if (!tooltip) return;\n\n const content = buildClipboardContent();\n navigator.clipboard.writeText(content).then(() => {\n setCopied(true);\n setShowPanel(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n\n // Suppress mousedown/pointerdown so buttons don't activate before click fires\n const suppress = (e: Event) => {\n e.stopPropagation();\n e.preventDefault();\n };\n\n document.addEventListener(\"pointerdown\", suppress, true);\n document.addEventListener(\"mousedown\", suppress, true);\n document.addEventListener(\"click\", onClick, true);\n return () => {\n document.removeEventListener(\"pointerdown\", suppress, true);\n document.removeEventListener(\"mousedown\", suppress, true);\n document.removeEventListener(\"click\", onClick, true);\n };\n }, [active, tooltip, buildClipboardContent]);\n\n if (!active && !tooltip && !showPanel) return null;\n\n return (\n <>\n {/* Activation indicator */}\n {active && !tooltip && (\n <div\n className=\"fixed bottom-4 left-1/2 -translate-x-1/2 z-[9999] px-4 py-2.5 rounded-xl text-xs font-semibold text-white shadow-lg pointer-events-none flex items-center gap-2\"\n style={{ background: \"rgba(99,102,241,0.92)\", fontFamily: \"system-ui, sans-serif\" }}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\" />\n </svg>\n Inspector active — hover over elements, click to copy\n {context && (\n <span className=\"opacity-60 ml-1\">\n [{context.catalogSlug}{context.variantSlug ? `:${context.variantSlug}` : \"\"}]\n </span>\n )}\n </div>\n )}\n\n {/* Highlight outline + tooltip */}\n {tooltip && (\n <>\n {/* Element highlight */}\n <div\n ref={highlightRef}\n className=\"fixed z-[9998] pointer-events-none rounded-lg\"\n style={{\n top: tooltip.rect.top - 2,\n left: tooltip.rect.left - 2,\n width: tooltip.rect.width + 4,\n height: tooltip.rect.height + 4,\n border: \"2px solid #6366f1\",\n background: \"rgba(99,102,241,0.06)\",\n transition: \"all 100ms ease-out\",\n }}\n />\n\n {/* Tooltip */}\n <div\n className=\"fixed z-[9999] flex flex-col gap-1 px-3 py-2.5 rounded-xl shadow-xl text-xs pointer-events-none\"\n style={{\n top: Math.max(8, tooltip.rect.top - (context ? 76 : 48)),\n left: Math.max(8, Math.min(tooltip.rect.left, window.innerWidth - 380)),\n background: copied ? \"#166534\" : \"#1e1b4b\",\n color: \"#e0e7ff\",\n fontFamily: \"'SF Mono', 'Fira Code', 'Cascadia Code', monospace\",\n maxWidth: \"370px\",\n transition: \"background 150ms ease\",\n }}\n >\n {copied ? (\n <span className=\"font-bold text-green-200\">Copied to clipboard!</span>\n ) : (\n <>\n {/* Primary ref line */}\n <div className=\"flex items-center gap-2\">\n <span className=\"font-bold text-indigo-300 truncate\">\n {tooltip.ref}\n </span>\n <span className=\"text-indigo-400/60 flex-shrink-0\">\n ({tooltip.componentType})\n </span>\n </div>\n\n {/* Label */}\n {tooltip.componentLabel && (\n <div className=\"text-indigo-300/50 truncate text-[10px]\">\n \"{tooltip.componentLabel}\"\n </div>\n )}\n\n {/* Catalog context */}\n {context && (\n <div className=\"text-indigo-400/40 text-[10px] flex items-center gap-1.5 flex-wrap\">\n <span>{context.catalogSlug}</span>\n <span>•</span>\n <span>{context.catalogId ? `${context.catalogId.slice(0, 8)}…` : \"—\"}</span>\n {context.variantSlug && (\n <>\n <span>•</span>\n <span>variant:{context.variantSlug}</span>\n </>\n )}\n {context.sandboxOf && (\n <>\n <span>•</span>\n <span className=\"text-amber-400/60\">sandbox</span>\n </>\n )}\n </div>\n )}\n\n {/* Click hint */}\n <div className=\"text-indigo-400/30 text-[10px] mt-0.5\">\n click to copy JSON context for AI agent\n </div>\n </>\n )}\n </div>\n </>\n )}\n\n {/* Detail panel — shown after copying, dismissible */}\n {showPanel && !active && (\n <div\n className=\"fixed bottom-4 right-4 z-[9999] max-w-sm rounded-xl shadow-2xl overflow-hidden\"\n style={{\n background: \"#1e1b4b\",\n fontFamily: \"'SF Mono', 'Fira Code', 'Cascadia Code', monospace\",\n border: \"1px solid rgba(99,102,241,0.3)\",\n }}\n >\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-indigo-800/50\">\n <span className=\"text-xs font-bold text-indigo-300\">Copied to clipboard</span>\n <button\n onClick={() => setShowPanel(false)}\n className=\"text-indigo-400/50 hover:text-indigo-300 transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <pre className=\"text-[10px] text-indigo-200/70 px-3 py-2 overflow-auto max-h-48 leading-relaxed\">\n {buildClipboardContent()}\n </pre>\n </div>\n )}\n </>\n );\n};\n"],"mappings":"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","names":["React","useState","useCallback","useMemo","useEffect","useRef","React","useState","useMemo","useCallback","useEffect","useRef","React","useRef","useEffect","useCallback","useState","jsx","jsxs","useRef","useCallback","useEffect","React","useState","jsx","jsxs","useState","useCallback","options","useRef","useEffect","useMemo","React","useEffect","useRef","Fragment","jsx","jsxs","useState","useCallback","Fragment","jsx","jsxs","useState","useCallback","useEffect","useState","useMemo","useRef","useCallback","Fragment","jsx","jsxs","resolveTemplates","useState","useCallback","useEffect","useRef","jsx","jsxs","useState","useEffect","useCallback","useRef","Fragment","jsx","jsxs","Fragment","jsx","jsxs","React","useCallback","useState","useEffect","useMemo","useRef","nextPageId","item"]}