@reform-society/agera-survey 0.1.0 β†’ 0.1.1

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":["../../../node_modules/.pnpm/loglevel@1.9.2/node_modules/loglevel/lib/loglevel.js","../src/index.ts","../package.json","../../agera-config/src/index.ts","../src/features/steps.ts","../../../node_modules/.pnpm/nanostores@0.11.4/node_modules/nanostores/atom/index.js","../src/core/stores.ts","../src/features/validation.ts","../src/features/utils/phone-lib.ts","../src/features/validation-messages.ts","../src/features/conditions.ts","../src/core/utils.ts","../src/features/utils/transition-presets.ts","../src/features/utils/transitions.ts","../src/features/redirect.ts","../src/features/basin.ts","../src/features/utils/keyboard.ts","../src/features/utils/aria.ts","../src/features/components/index.ts","../src/features/components/radio-other-input.ts","../src/features/components/helpers.ts","../src/features/components/phone-format.ts","../src/features/progress.ts","../src/features/quiz.ts","../src/core/prehide.ts","../src/core/styles.ts"],"sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","import log from \"loglevel\";\nimport { RUNTIME_VERSION } from \"@agera/config\";\nimport { initSteps, showStep } from \"@/features/steps\";\nimport { initValidation, validateStep } from \"@/features/validation\";\nimport { initComponents } from \"@/features/components\";\nimport { initBasin, sendPartial, sendFinal } from \"@/features/basin\";\nimport { initConditions } from \"@/features/conditions\";\nimport { initProgress } from \"@/features/progress\";\nimport { initRedirect } from \"@/features/redirect\";\nimport { initQuiz, getQuizResults, getQuizScores, getQuizWinner } from \"@/features/quiz\";\nimport { sessionStore, stepsStore, persistSession } from \"@/core/stores\";\nimport { startPrehide, stopPrehide } from \"@/core/prehide\";\nimport { injectRuntimeStyles } from \"@/core/styles\";\n\nlog.setLevel(\"info\");\n\n// Start prehide immediately on bundle load (before DOMContentLoaded)\nstartPrehide();\n\nexport function init(options: { siteId?: string; debug?: boolean } = {}): void {\n if (options.debug) {\n log.setLevel(\"debug\");\n }\n\n const surveyRoot = document.querySelector(\"[as-survey]\");\n if (!surveyRoot) {\n log.warn(\"[agera-survey] No [as-survey] element found\");\n return;\n }\n\n log.info(\"[agera-survey] Initializing\");\n\n // Stop prehide observer and remove pre-CSS before showing steps\n stopPrehide();\n\n // Inject runtime styles\n injectRuntimeStyles();\n\n persistSession();\n initSteps(surveyRoot);\n initValidation(surveyRoot);\n initComponents(surveyRoot);\n initBasin(surveyRoot);\n initConditions(surveyRoot);\n initProgress(surveyRoot);\n initRedirect(surveyRoot);\n initQuiz(surveyRoot);\n\n log.info(\"[agera-survey] Ready\");\n}\n\n// Expose global API (append to window.agera)\nif (typeof window !== \"undefined\") {\n if (!window.agera) {\n window.agera = {};\n }\n\n window.agera.survey = {\n init,\n version: RUNTIME_VERSION,\n reset: (): void => {\n window.localStorage.removeItem(\"as:session\");\n window.localStorage.removeItem(\"as:basin-jwt\");\n window.location.reload();\n },\n goToStep: (stepId: string): void => showStep(stepId),\n getCurrentStep: (): string => stepsStore.get().current,\n getStepPath: (): string[] => stepsStore.get().path,\n getAnswers: (): Record<string, unknown> => sessionStore.get().answers,\n setAnswer: (key: string, value: unknown): void => {\n const session = sessionStore.get();\n sessionStore.set({ ...session, answers: { ...session.answers, [key]: value } });\n },\n get dev(): boolean {\n return window.localStorage.getItem(\"as:dev\") === \"true\";\n },\n set dev(enabled: boolean) {\n if (enabled) {\n window.localStorage.setItem(\"as:dev\", \"true\");\n log.setLevel(\"debug\");\n } else {\n window.localStorage.removeItem(\"as:dev\");\n log.setLevel(\"info\");\n }\n },\n validateCurrentStep: async (): Promise<boolean> => {\n const current = stepsStore.get().current;\n if (!current) return true;\n return await validateStep(current);\n },\n triggerPartialSubmit: async (): Promise<void> => {\n const current = stepsStore.get().current;\n if (current) {\n await sendPartial(current);\n }\n },\n triggerFinalSubmit: async (): Promise<void> => {\n const current = stepsStore.get().current;\n if (current) {\n await sendFinal(current);\n }\n },\n getQuizResults: (): ReturnType<typeof getQuizResults> => getQuizResults(),\n getQuizScores: (): ReturnType<typeof getQuizScores> => getQuizScores(),\n getQuizWinner: (): ReturnType<typeof getQuizWinner> => getQuizWinner(),\n };\n\n // Check for ?dev=true in URL or localStorage BEFORE auto-init\n const urlParams = new URLSearchParams(window.location.search);\n const hasDevParam = urlParams.get(\"dev\") === \"true\";\n const hasDevStorage = window.localStorage.getItem(\"as:dev\") === \"true\";\n\n if (hasDevParam || hasDevStorage) {\n window.agera.survey.dev = true;\n log.info(\"[agera-survey] Debug mode enabled\");\n }\n\n // Auto-init (debug mode is now properly set before init runs)\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => init());\n } else {\n init();\n }\n}\n\n// TypeScript global declaration\ndeclare global {\n interface Window {\n agera?: {\n survey?: {\n init(options?: { siteId?: string; debug?: boolean }): void;\n version: string;\n reset(): void;\n goToStep(stepId: string): void;\n getCurrentStep(): string;\n getStepPath(): string[];\n getAnswers(): Record<string, unknown>;\n setAnswer(key: string, value: unknown): void;\n dev: boolean;\n validateCurrentStep(): Promise<boolean>;\n triggerPartialSubmit(): Promise<void>;\n triggerFinalSubmit(): Promise<void>;\n getQuizResults(): ReturnType<typeof getQuizResults>;\n getQuizScores(): ReturnType<typeof getQuizScores>;\n getQuizWinner(): ReturnType<typeof getQuizWinner>;\n };\n };\n }\n}\n\nexport {};\n","{\n \"name\": \"@reform-society/agera-survey\",\n \"version\": \"0.1.0\",\n \"description\": \"Multi-step survey runtime for Webflow\",\n \"type\": \"module\",\n \"main\": \"dist/index.global.js\",\n \"types\": \"dist/index.d.ts\",\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/reform-society/agera-survey-app.git\",\n \"directory\": \"packages/agera-survey\"\n },\n \"author\": \"Reform Society\",\n \"license\": \"UNLICENSED\",\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"scripts\": {\n \"dev\": \"tsup src/index.ts --format iife --global-name AgeraSurvey --watch --out-dir dist --sourcemap\",\n \"build\": \"tsup src/index.ts --format iife --global-name AgeraSurvey --out-dir dist --minify\",\n \"build:analyze\": \"tsup src/index.ts --format iife --global-name AgeraSurvey --out-dir dist --minify --metafile\",\n \"lint\": \"eslint src\",\n \"typecheck\": \"tsc --noEmit\",\n \"check\": \"pnpm lint; pnpm typecheck\"\n },\n \"devDependencies\": {\n \"@agera/config\": \"workspace:*\",\n \"loglevel\": \"^1.9.2\",\n \"nanostores\": \"^0.11.3\",\n \"libphonenumber-js\": \"1.12.25\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.7.2\"\n }\n}\n","export const APP_DISPLAY_NAME = \"Agera Survey\" as const;\n\n// Version is read from @reform-society/agera-survey package.json\n// This is re-exported here for convenience\nimport pkg from \"../../agera-survey/package.json\" with { type: \"json\" };\nexport const RUNTIME_VERSION = pkg.version;\n\n// CDN URL for production script (jsDelivr auto-resolves main field)\nexport const CDN_BASE_URL = \"https://cdn.jsdelivr.net/npm/@reform-society/agera-survey\" as const;\n\nexport function getCdnScriptUrl(version?: string): string {\n return `${CDN_BASE_URL}@${version || RUNTIME_VERSION}`;\n}\n\n// Backend URLs\nexport const BACKEND_URL_LOCAL = \"https://agera-survey-dev.loca.lt\" as const;\nexport const BACKEND_URL_PROD = \"https://agera-survey.vercel.app\" as const;\n\n// Injected at build time via webpack DefinePlugin\n// \"production\" = deployed on Vercel, \"development\" = local dev\ndeclare const __BUILD_MODE__: \"production\" | \"development\" | undefined;\n\nexport const IS_PRODUCTION_BUILD =\n typeof __BUILD_MODE__ !== \"undefined\" && __BUILD_MODE__ === \"production\";\n\nexport const SCRIPT_PATH = \"/api/script/agera-survey\" as const;\nexport const SCRIPT_JS_PATH = \"/api/script/agera-survey.js\" as const;\n\n// Cache for backend availability check (prevents race conditions)\nlet resolvedBackendUrl: string | null = null;\nlet resolutionPromise: Promise<string> | null = null;\n\n/**\n * Check if a backend URL is reachable\n */\nasync function isBackendAvailable(url: string): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n const response = await fetch(`${url}${SCRIPT_PATH}`, {\n method: \"HEAD\",\n signal: controller.signal,\n });\n clearTimeout(timeout);\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Internal resolution logic - only called once\n */\nasync function resolveBackendUrl(): Promise<string> {\n // Production build always uses prod URL\n if (IS_PRODUCTION_BUILD) {\n resolvedBackendUrl = BACKEND_URL_PROD;\n return resolvedBackendUrl;\n }\n\n // Dev build: try local first, fall back to prod\n if (await isBackendAvailable(BACKEND_URL_LOCAL)) {\n resolvedBackendUrl = BACKEND_URL_LOCAL;\n } else {\n console.log(\"[agera-config] Local backend unavailable, using production\");\n resolvedBackendUrl = BACKEND_URL_PROD;\n }\n\n return resolvedBackendUrl;\n}\n\n/**\n * Get backend URL - in production uses Vercel, in dev tries local first then falls back to Vercel\n * Uses promise lock to prevent multiple parallel checks\n */\nexport async function getBackendUrlAsync(base?: string): Promise<string> {\n if (base && base.length > 0) return base;\n if (resolvedBackendUrl) return resolvedBackendUrl;\n\n // Use existing promise if resolution is in progress (prevents race conditions)\n if (!resolutionPromise) {\n resolutionPromise = resolveBackendUrl();\n }\n\n return resolutionPromise;\n}\n\n/**\n * Sync version - returns cached URL or prod fallback\n * Use getBackendUrlAsync() for initial resolution\n */\nexport function getBackendUrl(base?: string): string {\n if (base && base.length > 0) return base;\n if (resolvedBackendUrl) return resolvedBackendUrl;\n // Before async check completes, default to prod (safe fallback)\n return IS_PRODUCTION_BUILD ? BACKEND_URL_PROD : BACKEND_URL_LOCAL;\n}\n\nexport function getScriptUrl(base?: string): string {\n return `${getBackendUrl(base)}${SCRIPT_PATH}`;\n}\n\nexport function getScriptJsUrl(base?: string): string {\n return `${getBackendUrl(base)}${SCRIPT_JS_PATH}`;\n}\n\nexport async function getScriptUrlAsync(base?: string): Promise<string> {\n return `${await getBackendUrlAsync(base)}${SCRIPT_PATH}`;\n}\n\nexport async function getScriptJsUrlAsync(base?: string): Promise<string> {\n return `${await getBackendUrlAsync(base)}${SCRIPT_JS_PATH}`;\n}\n","import log from \"loglevel\";\nimport { stepsStore, sessionStore } from \"@/core/stores\";\nimport { validateStep } from \"@/features/validation\";\nimport { evaluateNextMap } from \"@/features/conditions\";\nimport { handleRedirect } from \"@/features/redirect\";\nimport { sendPartial } from \"@/features/basin\";\nimport { resolvePreset, getPresetStyles } from \"@/features/utils/transition-presets\";\nimport {\n applyGridStack,\n showStepWithTransition,\n hideStepWithTransition,\n waitForTransitionEnd,\n applySpeedOverride,\n} from \"@/features/utils/transitions\";\nimport { attachKeyboardHandlers } from \"@/features/utils/keyboard\";\nimport { announceAria, focusFirstInteractive } from \"@/features/utils/aria\";\n\n// Re-export announceAria to maintain public API\nexport { announceAria } from \"@/features/utils/aria\";\n\n// Small gap between exit and enter animations to avoid visual collision\nconst STEP_TRANSITION_GAP_MS = 80;\n\n// WeakMap to store AbortControllers for goto buttons, enabling cleanup of pending timeouts\nconst gotoAbortControllers = new WeakMap<Element, AbortController>();\n\n/**\n * Check if partial submissions are enabled (defaults to on)\n */\nfunction isPartialSubmissionsEnabled(): boolean {\n if (typeof document === \"undefined\") return true;\n\n const body = document.body;\n const setting = body?.getAttribute(\"as-partial-submissions\")?.toLowerCase();\n\n // Default to \"on\" if not set, only disable if explicitly set to \"off\"\n return setting !== \"off\";\n}\n\n/**\n * Safely blur any focused element within a container before hiding it.\n * Prevents aria-hidden warnings when focus exists in elements being hidden.\n */\nfunction blurFocusedDescendant(container: HTMLElement): void {\n const focused = container.querySelector<HTMLElement>(\":focus\");\n if (focused) {\n log.debug(`[steps] πŸ”² Blurring focused element before hiding step`);\n focused.blur();\n }\n}\n\n/**\n * Visibility model (prehide + runtime control)\n *\n * - Before the runtime is ready, a tiny inline script (injected by the Designer Extension)\n * adds a <style id=\"as-pre-css\"> that hides all non-first steps using the sibling\n * selector: [as-step]~[as-step]{display:none!important;} to prevent FOUC.\n * The runtime also calls startPrehide() which injects the same CSS if missing; both use\n * the same style id so injection is idempotent.\n * - When init() runs, stopPrehide() removes that pre-CSS. From that point, this module\n * owns visibility:\n * - Showing a step clears inline display (restoring Webflow-defined layout), sets\n * aria-hidden=false, removes inert, and applies the chosen transition preset.\n * - Hiding a step applies exit styles, then sets display:none!important, aria-hidden=true,\n * and inert to remove it from layout and accessibility.\n * - We deliberately do not force position/size. Any overlay/stacking should be authored\n * in Webflow so visual size/position remain unchanged from the design.\n * - Respects prefers-reduced-motion and skips transitions in that case.\n */\n\n/**\n * Initialize step navigation for a survey root element.\n * Discovers all [as-step] elements, sets the first as current,\n * and attaches navigation handlers for next/back/goto/restart.\n * @param root - The survey root element containing step elements\n */\nexport function initSteps(root: Element): void {\n const steps = Array.from(root.querySelectorAll(\"[as-step]\"));\n if (steps.length === 0) return;\n\n // Ensure all steps have absolute positioning for overlay effect\n // and set display cache (default to 'block' for div containers)\n // Preserve Webflow's original layout; do not force positioning or display here\n\n const firstStepId = steps[0]?.getAttribute(\"as-step\");\n if (firstStepId) {\n stepsStore.set({ current: firstStepId, path: [firstStepId] });\n // First step is already visible (marked by prehide), no need to show\n log.debug(`[steps] First step already visible: ${firstStepId}`);\n }\n\n attachNavigationHandlers(root);\n attachKeyboardHandlers();\n}\n\nexport function showStep(stepId: string, previousStepId?: string): void {\n log.debug(\n `[steps] πŸ“„ showStep called: \"${stepId}\"${previousStepId ? ` (from: \"${previousStepId}\")` : \"\"}`\n );\n\n const steps = Array.from(document.querySelectorAll(\"[as-step]\"));\n const prefersReducedMotion =\n typeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n const incomingEl = document.querySelector<HTMLElement>(`[as-step=\"${stepId}\"]`);\n const outgoingEl = previousStepId\n ? document.querySelector<HTMLElement>(`[as-step=\"${previousStepId}\"]`)\n : null;\n\n if (!incomingEl) {\n log.warn(`[steps] ❌ Cannot show step \"${stepId}\" - element not found`);\n return;\n }\n\n log.debug(`[steps] 🎬 Transition: ${prefersReducedMotion ? \"reduced motion\" : \"animated\"}`);\n\n // Send partial submission for the previous step (if provided and different from current)\n // This must happen BEFORE the animation branching to ensure it fires in both paths\n if (previousStepId && previousStepId !== stepId && isPartialSubmissionsEnabled()) {\n log.debug(`[steps] πŸ’Ύ Triggering background partial submission for: \"${previousStepId}\"`);\n sendPartial(previousStepId).catch((error) => {\n log.error(\"[steps] Background partial submission failed:\", error);\n });\n }\n\n // CSS-first approach (no overlay, no height measuring):\n // - Immediately hide all steps except the incoming one (replicates legacy behavior)\n steps.forEach((el) => {\n const id = el.getAttribute(\"as-step\");\n if (id !== stepId && id !== previousStepId) {\n const htmlEl = el as HTMLElement;\n blurFocusedDescendant(htmlEl);\n htmlEl.style.setProperty(\"display\", \"none\", \"important\");\n htmlEl.setAttribute(\"aria-hidden\", \"true\");\n htmlEl.setAttribute(\"inert\", \"\");\n }\n });\n\n // If we have an outgoing step and animations are enabled, stack them using CSS Grid\n let restoreGridStack: (() => void) | undefined;\n if (incomingEl && outgoingEl && !prefersReducedMotion) {\n const container = incomingEl.parentElement;\n if (container) {\n restoreGridStack = applyGridStack(container, incomingEl, outgoingEl);\n }\n\n // Prime the incoming step so layout doesn't collapse and animation will run smoothly\n const transitionInBase =\n incomingEl.getAttribute(\"as-transition-in\") ||\n incomingEl.getAttribute(\"as-transition\") ||\n \"fade\";\n const transitionIn = resolvePreset(transitionInBase, \"in\");\n const distance = incomingEl.getAttribute(\"as-transition-distance\") || \"24px\";\n const speedIn =\n incomingEl.getAttribute(\"as-transition-speed-in\") ||\n incomingEl.getAttribute(\"as-transition-speed\");\n const presetIn = getPresetStyles(transitionIn, distance, \"in\");\n\n // Ensure it's present in the layout but NOT visible yet\n incomingEl.style.display = \"\";\n incomingEl.style.visibility = \"hidden\";\n // Keep inaccessible until we animate in\n incomingEl.setAttribute(\"aria-hidden\", \"true\");\n incomingEl.setAttribute(\"inert\", \"\");\n\n // Disable transitions while setting initial styles to avoid flicker\n const prevTransitionProperty = incomingEl.style.transitionProperty;\n incomingEl.style.transitionProperty = \"none\";\n Object.assign(incomingEl.style, presetIn.initial);\n void incomingEl.offsetHeight; // apply initial instantly\n\n // Transition sequence: outgoing exit β†’ gap β†’ incoming enter\n // This nested callback chain ensures proper sequencing:\n // 1. Start outgoing exit animation\n // 2. Wait for outgoing transition to complete\n // 3. Add small gap (STEP_TRANSITION_GAP_MS) to avoid visual collision\n // 4. Start incoming enter animation\n // 5. Wait for incoming transition to complete\n // 6. Cleanup and restore focus\n //\n // Note: Rapid showStep calls may cause overlapping animations. The grid stack\n // approach handles visual layering, but very fast navigation could result in\n // incomplete cleanup. For most user interactions this is not an issue.\n if (outgoingEl) {\n blurFocusedDescendant(outgoingEl);\n }\n hideStepWithTransition(outgoingEl, false);\n waitForTransitionEnd(outgoingEl, () => {\n // Gap between exit and enter to prevent visual collision\n setTimeout(() => {\n // Make it accessible and animate in\n incomingEl.setAttribute(\"aria-hidden\", \"false\");\n incomingEl.removeAttribute(\"inert\");\n\n // Re-enable transitions and ensure we animate opacity/transform\n incomingEl.style.transitionProperty = \"opacity, transform\";\n incomingEl.style.transitionDuration = \"300ms\";\n if (speedIn) {\n applySpeedOverride(incomingEl, speedIn);\n }\n if (incomingEl.style.willChange !== \"opacity, transform\") {\n incomingEl.style.willChange = \"opacity, transform\";\n }\n\n // Reveal and animate to target\n incomingEl.style.visibility = \"visible\";\n Object.assign(incomingEl.style, presetIn.target);\n\n // Final cleanup after incoming animation completes\n waitForTransitionEnd(incomingEl, () => {\n // Cleanup temporary hints\n incomingEl.style.transitionDuration = \"\";\n incomingEl.style.transitionProperty = prevTransitionProperty;\n incomingEl.style.willChange = \"\";\n focusFirstInteractive(incomingEl);\n if (restoreGridStack) restoreGridStack();\n });\n }, STEP_TRANSITION_GAP_MS);\n });\n return;\n }\n\n // No outgoing or prefers reduced motion: fall back to simple show/hide\n if (incomingEl) {\n showStepWithTransition(incomingEl, prefersReducedMotion, focusFirstInteractive);\n }\n if (outgoingEl) {\n hideStepWithTransition(outgoingEl, prefersReducedMotion);\n }\n\n announceAria(`Step: ${stepId}`);\n log.debug(`[steps] βœ… Step visible: \"${stepId}\"`);\n\n // Grid stacking cleanup handled in sequencing above\n}\n\nexport function getNextStep(currentStepId: string): string {\n const steps = Array.from(document.querySelectorAll(\"[as-step]\"));\n const currentEl = document.querySelector(`[as-step=\"${currentStepId}\"]`);\n\n // Priority 1: Check for as-next-map (conditional routing)\n const nextMap = currentEl?.getAttribute(\"as-next-map\");\n if (nextMap) {\n log.debug(`[steps] πŸ—ΊοΈ Evaluating next-map for conditional routing`);\n const answers = sessionStore.get().answers;\n const mappedStep = evaluateNextMap(nextMap, answers);\n if (mappedStep) {\n log.debug(`[steps] βœ“ Next-map resolved to: \"${mappedStep}\"`);\n return mappedStep;\n }\n log.debug(`[steps] ⚠️ Next-map evaluation returned no match, falling back to linear`);\n }\n\n // Priority 2: Linear next\n const idx = steps.findIndex((el) => el.getAttribute(\"as-step\") === currentStepId);\n const nextStep = steps[idx + 1]?.getAttribute(\"as-step\") || currentStepId;\n if (nextStep !== currentStepId) {\n log.debug(`[steps] πŸ“‹ Linear next step: \"${nextStep}\"`);\n }\n return nextStep;\n}\n\nfunction attachNavigationHandlers(root: Element): void {\n // Next buttons\n root.querySelectorAll(\"[as-next]\").forEach((btn) => {\n btn.addEventListener(\"click\", (event) => {\n const trigger = event.currentTarget as HTMLElement | null;\n void (async () => {\n const { current, path } = stepsStore.get();\n\n log.debug(`[steps] πŸ”· Next button clicked on step: ${current}`);\n\n // Validate current step before proceeding\n log.debug(`[steps] Validating step: ${current}`);\n const isValid = await validateStep(current);\n if (!isValid) {\n log.debug(`[steps] ❌ Validation failed, staying on step: ${current}`);\n return;\n }\n log.debug(`[steps] βœ“ Validation passed`);\n\n const nextId = getNextStep(current);\n if (nextId !== current) {\n log.debug(`[steps] ➑️ Navigating from \"${current}\" to \"${nextId}\"`);\n stepsStore.set({ current: nextId, path: [...path, nextId] });\n showStep(nextId, current); // Pass current as previous step\n } else {\n // No next step; check for redirect\n log.debug(`[steps] 🏁 No next step found, checking for redirect`);\n await handleRedirect(current, trigger);\n }\n })();\n });\n });\n\n // Back buttons\n root.querySelectorAll(\"[as-back]\").forEach((btn) => {\n btn.addEventListener(\"click\", () => {\n const { current, path } = stepsStore.get();\n log.debug(`[steps] πŸ”™ Back button clicked on step: ${current}`);\n\n if (path.length > 1) {\n const newPath = path.slice(0, -1);\n const prevId = newPath[newPath.length - 1];\n if (prevId) {\n log.debug(`[steps] ⬅️ Navigating back from \"${current}\" to \"${prevId}\"`);\n stepsStore.set({ current: prevId, path: newPath });\n showStep(prevId, current); // Pass current as previous step\n }\n } else {\n log.debug(`[steps] ⚠️ Cannot go back, already at first step`);\n }\n });\n });\n\n // Goto buttons (with debounce for non-button/link elements)\n root.querySelectorAll(\"[as-goto]\").forEach((btn) => {\n btn.addEventListener(\"click\", (event) => {\n const targetId = btn.getAttribute(\"as-goto\");\n if (!targetId || targetId.trim() === \"\") return;\n\n const target = event.currentTarget as HTMLElement;\n const { current } = stepsStore.get();\n\n log.debug(\n `[steps] 🎯 Goto clicked on step \"${current}\", target: \"${targetId}\" (element: ${target.tagName})`\n );\n\n // Abort any pending goto for this button to prevent stale navigation\n const existingController = gotoAbortControllers.get(btn);\n if (existingController) {\n existingController.abort();\n log.debug(`[steps] ⏱️ Aborted previous goto timeout`);\n }\n\n // Create new AbortController for this goto operation\n const controller = new AbortController();\n gotoAbortControllers.set(btn, controller);\n\n // Check if the element is a button or link\n const isButton = target.tagName === \"BUTTON\" || target.tagName === \"A\";\n const isLink = target.tagName === \"A\";\n\n // For non-button/link elements, add 250ms debounce\n const delay = isButton || isLink ? 0 : 250;\n\n const executeGoto = (): void => {\n // Check if this operation was aborted before executing\n if (controller.signal.aborted) {\n log.debug(`[steps] ⏱️ Goto aborted, skipping navigation`);\n return;\n }\n\n const { current, path } = stepsStore.get();\n\n const targetEl = document.querySelector(`[as-step=\"${targetId}\"]`);\n if (!targetEl) {\n log.warn(`[steps] ❌ Target step not found: ${targetId}`);\n return;\n }\n\n log.debug(`[steps] ↗️ Goto navigating from \"${current}\" to \"${targetId}\"`);\n\n stepsStore.set({ current: targetId, path: [...path, targetId] });\n showStep(targetId, current);\n };\n\n if (delay > 0) {\n log.debug(`[steps] ⏱️ Debouncing goto by ${delay}ms`);\n const timeoutId = setTimeout(executeGoto, delay);\n\n // Listen for abort signal to clear the timeout\n controller.signal.addEventListener(\"abort\", () => {\n clearTimeout(timeoutId);\n });\n } else {\n executeGoto();\n }\n });\n });\n\n // Restart buttons\n root.querySelectorAll(\"[as-restart]\").forEach((btn) => {\n btn.addEventListener(\"click\", () => {\n log.debug(`[steps] πŸ”„ Restart button clicked, resetting survey`);\n window.agera?.survey?.reset();\n });\n });\n}\n\nexport function getStepPosition(stepId: string): number {\n if (typeof document === \"undefined\") return 1;\n\n const steps = Array.from(document.querySelectorAll(\"[as-step]\"));\n const index = steps.findIndex((el) => el.getAttribute(\"as-step\") === stepId);\n\n // Return 1-based index (step 1, 2, 3, etc.)\n return index >= 0 ? index + 1 : 1;\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\nexport let atom = (initialValue) => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (let i = lqIndex + QUEUE_ITEMS_PER_LISTENER; i < listenerQueue.length;) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(\n listener,\n $atom.value,\n oldValue,\n changedKey\n )\n }\n\n if (runListenerQueue) {\n for (lqIndex = 0; lqIndex < listenerQueue.length; lqIndex += QUEUE_ITEMS_PER_LISTENER) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n","import { atom } from \"nanostores\";\nimport type { SessionState, StepState } from \"@/types\";\n\nexport const sessionStore = atom<SessionState>({\n id: typeof crypto !== \"undefined\" && \"randomUUID\" in crypto ? crypto.randomUUID() : `${Date.now()}`,\n answers: {},\n startedAt: new Date(),\n});\n\nexport const stepsStore = atom<StepState>({\n current: \"\",\n path: [],\n});\n\n// Persist session to localStorage\nexport function persistSession(): void {\n if (typeof window === \"undefined\") return;\n\n const stored = window.localStorage.getItem(\"as:session\");\n if (stored) {\n try {\n const parsed = JSON.parse(stored) as SessionState;\n // Revive date fields safely\n sessionStore.set({\n ...parsed,\n startedAt: new Date(parsed.startedAt),\n });\n } catch {\n // Ignore corrupted storage\n window.localStorage.removeItem(\"as:session\");\n }\n }\n\n sessionStore.subscribe((state) => {\n try {\n window.localStorage.setItem(\"as:session\", JSON.stringify(state));\n } catch {\n // Storage might be unavailable (quota/permissions)\n }\n });\n}\n\n","import log from \"loglevel\";\nimport { getParsePhoneNumberFromString } from \"./utils/phone-lib\";\nimport { getErrorMessagesForLanguage } from \"./validation-messages\";\nimport { isElementDisabled } from \"./conditions\";\nimport { showWithTransition, hideWithTransition } from \"./utils/transitions\";\nimport type { Validators } from \"@/types\";\n\n/** Error message transition defaults (faster/smaller than step transitions) */\nconst ERROR_TRANSITION_OPTIONS = {\n defaultDuration: \"200ms\",\n defaultDistance: \"12px\",\n};\n\ntype FieldElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nexport const validators: Validators = {\n required: (val: string) => val.trim() !== \"\",\n email: (val: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(val),\n pattern: (val: string, re: string) => new RegExp(re).test(val),\n min: (val: string, n: string) => val.length >= Number(n),\n max: (val: string, n: string) => val.length <= Number(n),\n};\n\nfunction ensureErrorTargetDisplay(target: HTMLElement): void {\n if (target.dataset.asErrorDisplay) return;\n\n let display = \"\";\n\n const inlineDisplay = target.style.display;\n if (inlineDisplay && inlineDisplay !== \"none\") {\n display = inlineDisplay;\n }\n\n if (!display && typeof window !== \"undefined\" && typeof window.getComputedStyle === \"function\") {\n const computed = window.getComputedStyle(target).display;\n if (computed && computed !== \"none\") {\n display = computed;\n }\n }\n\n if (!display) {\n display = target.tagName === \"SPAN\" || target.tagName === \"LABEL\" ? \"inline\" : \"block\";\n }\n\n target.dataset.asErrorDisplay = display;\n}\n\nfunction seedErrorTargetDefaults(target: HTMLElement): void {\n if (!target.dataset.asErrorDefault) {\n target.dataset.asErrorDefault = target.textContent ?? \"\";\n }\n\n ensureErrorTargetDisplay(target);\n\n if (!target.hasAttribute(\"role\")) {\n target.setAttribute(\"role\", \"alert\");\n }\n if (!target.hasAttribute(\"aria-live\")) {\n target.setAttribute(\"aria-live\", \"polite\");\n }\n}\n\nfunction applyErrorTargetVisibility(target: HTMLElement, isActive: boolean): void {\n ensureErrorTargetDisplay(target);\n\n // Check if transition is configured\n const hasTransition = target.hasAttribute(\"as-transition\");\n const display = target.dataset.asErrorDisplay || \"block\";\n\n if (isActive) {\n if (hasTransition) {\n showWithTransition(target, { ...ERROR_TRANSITION_OPTIONS, displayValue: display });\n } else {\n target.style.display = display;\n target.removeAttribute(\"hidden\");\n target.removeAttribute(\"aria-hidden\");\n }\n } else {\n if (hasTransition) {\n hideWithTransition(target, ERROR_TRANSITION_OPTIONS);\n } else {\n target.style.display = \"none\";\n target.setAttribute(\"aria-hidden\", \"true\");\n }\n }\n}\n\nfunction initializeErrorTargets(root: Element): void {\n if (typeof document === \"undefined\") return;\n\n const targets: HTMLElement[] = [];\n if (root instanceof HTMLElement && root.hasAttribute(\"as-error-for\")) {\n targets.push(root);\n }\n\n root.querySelectorAll<HTMLElement>(\"[as-error-for]\").forEach((target) => {\n if (!targets.includes(target)) {\n targets.push(target);\n }\n });\n\n for (const target of targets) {\n seedErrorTargetDefaults(target);\n const isActive = target.dataset.asErrorActive === \"true\";\n applyErrorTargetVisibility(target, isActive);\n }\n}\n\n/**\n * Validates phone number using libphonenumber-js max bundle.\n * Uses isValid() for strict validation against actual number patterns.\n *\n * Tries to detect country from the number itself first (if it includes country code),\n * then falls back to the specified region attribute.\n */\nasync function validatePhone(val: string, input?: HTMLElement): Promise<boolean> {\n try {\n const parsePhoneNumberFromString = await getParsePhoneNumberFromString();\n if (!parsePhoneNumberFromString) {\n log.warn(\"[validation] Phone library not available\");\n return false;\n }\n\n // Get optional region from input attribute (used as fallback)\n const region = input?.getAttribute(\"as-phone-region\") || undefined;\n const hasInternationalPrefix = val.trim().startsWith(\"+\");\n\n log.debug(\n \"[validation] Validating phone:\",\n val,\n \"has + prefix:\",\n hasInternationalPrefix,\n \"region:\",\n region\n );\n\n // If number starts with +, parse without default country to auto-detect\n // Otherwise, use the region as the default country\n if (hasInternationalPrefix) {\n // Parse without region - let library detect from country code\n const parsed = parsePhoneNumberFromString(val);\n log.debug(\"[validation] Parse international:\", parsed ? \"success\" : \"failed\");\n\n if (parsed && typeof parsed.isValid === \"function\") {\n const isValid = parsed.isValid();\n log.debug(\"[validation] Country:\", parsed.country, \"isValid:\", isValid);\n return isValid;\n }\n\n log.debug(\"[validation] International number validation failed\");\n return false;\n } else {\n // Parse with region as default for national numbers\n if (!region) {\n log.debug(\"[validation] No region specified for national number\");\n return false;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parsed = parsePhoneNumberFromString(val, region as any);\n log.debug(\"[validation] Parse with region:\", parsed ? \"success\" : \"failed\");\n\n if (parsed && typeof parsed.isValid === \"function\") {\n const isValid = parsed.isValid();\n log.debug(\"[validation] Country:\", parsed.country, \"isValid:\", isValid);\n return isValid;\n }\n\n log.debug(\"[validation] National number validation failed\");\n return false;\n }\n } catch (error) {\n log.error(\"[validation] Failed to validate phone number:\", error);\n return false;\n }\n}\n\nexport function initValidation(_root: Element): void {\n initializeErrorTargets(_root);\n log.debug(\"[validation] Initialized\");\n}\n\nexport async function validateStep(stepId: string): Promise<boolean> {\n if (typeof document === \"undefined\") return true;\n\n const stepEl = document.querySelector<HTMLElement>(`[as-step=\"${stepId}\"]`);\n if (!stepEl) return true;\n\n const fields = Array.from(\n stepEl.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\n \"input, textarea, select\"\n )\n );\n\n for (const field of fields) {\n // Skip disabled fields (from as-enable-if / as-disable-if logic)\n if (isElementDisabled(field)) {\n clearError(field);\n continue;\n }\n\n if (isFieldDisabled(field)) {\n clearError(field);\n continue;\n }\n\n const rulesAttr = field.getAttribute(\"as-validate\") || \"\";\n const rawTokens = rulesAttr\n .split(\"|\")\n .map((token) => token.trim())\n .filter(Boolean);\n\n const evaluationTokens: string[] = [];\n const seenTokens = new Set<string>();\n\n if (field.hasAttribute(\"required\") || (field as HTMLInputElement).required === true) {\n evaluationTokens.push(\"required\");\n seenTokens.add(\"required\");\n }\n\n for (const token of rawTokens) {\n if (!token) continue;\n if (seenTokens.has(token)) continue;\n seenTokens.add(token);\n evaluationTokens.push(token);\n }\n\n if (evaluationTokens.length === 0) {\n clearError(field);\n continue;\n }\n\n const value = getFieldValue(field);\n\n for (const token of evaluationTokens) {\n const [name, param] = token.split(\":\");\n const ruleName = name || \"\";\n\n let valid: boolean;\n if (ruleName === \"phone\") {\n valid = await validatePhone(value, field);\n } else if (ruleName === \"required\") {\n valid = checkRequired(field, stepEl);\n } else {\n const validator = validators[ruleName as keyof Validators];\n valid = validator ? validator(value, param ?? \"\") : true;\n }\n\n if (!valid) {\n showError(field, getErrorMessage(field, ruleName));\n return false;\n }\n }\n\n clearError(field);\n }\n\n return true;\n}\n\nexport function showError(input: HTMLElement, message: string): void {\n const target = resolveErrorTarget(input);\n if (target) {\n removeInjectedError(input);\n const targetId = prepareErrorTarget(target);\n target.textContent = message;\n target.dataset.asErrorActive = \"true\";\n applyErrorTargetVisibility(target, true);\n input.setAttribute(\"aria-invalid\", \"true\");\n if (targetId) {\n input.setAttribute(\"aria-describedby\", targetId);\n }\n return;\n }\n\n let errDiv = input.nextElementSibling as HTMLElement | null;\n if (!errDiv || !errDiv.classList.contains(\"as-error\")) {\n errDiv = document.createElement(\"div\");\n errDiv.className = \"as-error\";\n errDiv.setAttribute(\"role\", \"alert\");\n input.parentElement?.insertBefore(errDiv, input.nextSibling);\n }\n\n errDiv.textContent = message;\n input.setAttribute(\"aria-invalid\", \"true\");\n input.setAttribute(\n \"aria-describedby\",\n (errDiv.id = `err-${typeof crypto !== \"undefined\" && \"randomUUID\" in crypto ? crypto.randomUUID() : Date.now()}`)\n );\n}\n\nexport function clearError(input: HTMLElement): void {\n const target = resolveErrorTarget(input);\n if (target) {\n const defaultText = target.dataset.asErrorDefault ?? \"\";\n target.textContent = defaultText;\n delete target.dataset.asErrorActive;\n applyErrorTargetVisibility(target, false);\n } else {\n removeInjectedError(input);\n }\n\n input.removeAttribute(\"aria-invalid\");\n input.removeAttribute(\"aria-describedby\");\n}\n\nfunction resolveErrorTarget(input: HTMLElement): HTMLElement | null {\n // Get the field's element ID\n const fieldId =\n input.getAttribute(\"as-element-id\") || input.getAttribute(\"id\") || input.getAttribute(\"name\");\n if (!fieldId) return null;\n\n // Find error message element that references this field ID\n const scope = input.closest<HTMLElement>(\"[as-step]\") ?? document;\n const target = scope.querySelector<HTMLElement>(`[as-error-for=\"${fieldId}\"]`);\n return target ?? null;\n}\n\nfunction removeInjectedError(input: HTMLElement): void {\n const errDiv = input.nextElementSibling as HTMLElement | null;\n if (errDiv && errDiv.classList.contains(\"as-error\")) {\n errDiv.remove();\n }\n}\n\nexport function getErrorMessage(input: HTMLElement, rule: string): string {\n const customMsg = input.getAttribute(\"as-error-message\");\n if (customMsg) return customMsg;\n\n const customMsgs = input.getAttribute(\"as-error-messages\");\n if (customMsgs) {\n try {\n const parsed = JSON.parse(customMsgs) as Record<string, string>;\n if (parsed[rule]) return parsed[rule];\n } catch {\n // ignore invalid JSON and fall back to defaults\n }\n }\n\n // Get localized error messages based on document language\n const messages = getErrorMessagesForLanguage();\n return messages[rule as keyof typeof messages] || \"Invalid input\";\n}\n\nfunction prepareErrorTarget(target: HTMLElement): string {\n seedErrorTargetDefaults(target);\n\n if (!target.id) {\n const newId =\n typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\"\n ? crypto.randomUUID()\n : `err-${Date.now()}`;\n target.id = newId;\n }\n\n return target.id;\n}\n\nfunction isFieldDisabled(field: FieldElement): boolean {\n if (field instanceof HTMLInputElement) return field.disabled;\n if (field instanceof HTMLTextAreaElement) return field.disabled;\n if (field instanceof HTMLSelectElement) return field.disabled;\n return false;\n}\n\nfunction getFieldValue(field: FieldElement): string {\n if (field instanceof HTMLInputElement) {\n const { type } = field;\n if (type === \"checkbox\") {\n return field.checked ? field.value || \"on\" : \"\";\n }\n if (type === \"radio\") {\n return field.checked ? field.value || \"on\" : \"\";\n }\n if (type === \"file\") {\n return field.files && field.files.length > 0 ? \"selected\" : \"\";\n }\n }\n\n if (field instanceof HTMLSelectElement && field.multiple) {\n return Array.from(field.selectedOptions)\n .map((option) => option.value)\n .join(\",\");\n }\n\n return field.value ?? \"\";\n}\n\nfunction checkRequired(field: FieldElement, stepEl: HTMLElement): boolean {\n if (field instanceof HTMLInputElement) {\n if (field.disabled) return true;\n\n switch (field.type) {\n case \"checkbox\":\n return field.checked;\n case \"radio\": {\n const name = field.name;\n if (!name) {\n return field.checked;\n }\n const selector = `input[type=\"radio\"][name=\"${escapeAttributeValue(name)}\"]`;\n const radios = stepEl.querySelectorAll<HTMLInputElement>(selector);\n for (const radio of Array.from(radios)) {\n if (radio.disabled) continue;\n if (radio.checked) {\n return true;\n }\n }\n return false;\n }\n case \"file\":\n return Boolean(field.files && field.files.length > 0);\n default:\n return field.value.trim() !== \"\";\n }\n }\n\n if (field instanceof HTMLSelectElement) {\n if (field.disabled) return true;\n if (field.multiple) {\n return field.selectedOptions.length > 0;\n }\n return field.value.trim() !== \"\";\n }\n\n if (field instanceof HTMLTextAreaElement) {\n if (field.disabled) return true;\n return field.value.trim() !== \"\";\n }\n\n return true;\n}\n\nfunction escapeAttributeValue(value: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(value);\n }\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n","import log from \"loglevel\";\n\n// CDN URLs for libphonenumber-js max bundle (ESM format)\n// Primary: jsDelivr CDN, Fallback: unpkg CDN\n// Max bundle provides full validation capabilities\nconst CDN_URL_PRIMARY = \"https://cdn.jsdelivr.net/npm/libphonenumber-js@1.12.25/max/index.js\";\nconst CDN_URL_FALLBACK = \"https://unpkg.com/libphonenumber-js@1.12.25/max/index.js\";\n\n// Type for the parsePhoneNumberFromString function\ntype ParsePhoneNumber = (\n phoneNumber: string,\n defaultCountry?: string\n) =>\n | {\n isValid(): boolean;\n format(format: string): string;\n formatInternational(): string;\n formatNational(): string;\n country?: string;\n }\n | undefined;\n\n// Type for AsYouType class\ntype AsYouType = new (defaultCountry?: string) => {\n input(text: string): string;\n getNumber(): { isValid(): boolean } | undefined;\n reset(): void;\n};\n\n// Type for getCountryCallingCode function\ntype GetCountryCallingCode = (country: string) => string;\n\n// Cache for the loaded module\ntype PhoneLib = {\n parsePhoneNumberFromString: ParsePhoneNumber;\n AsYouType: AsYouType;\n getCountryCallingCode: GetCountryCallingCode;\n};\n\nlet phoneLibCache: PhoneLib | null = null;\nlet loadingPromise: Promise<PhoneLib> | null = null;\n\n/**\n * Lazily loads libphonenumber-js from CDN using ESM dynamic import.\n * Uses jsDelivr CDN for ESM module support.\n * Caches the loaded module to avoid multiple loads.\n */\nexport async function loadPhoneLib(): Promise<PhoneLib> {\n // Return cached module if already loaded\n if (phoneLibCache) {\n return phoneLibCache;\n }\n\n // Return existing loading promise if already loading\n if (loadingPromise) {\n return loadingPromise;\n }\n\n // Start loading\n loadingPromise = (async () => {\n const urls = [CDN_URL_PRIMARY, CDN_URL_FALLBACK];\n let lastError: Error | null = null;\n\n // Try primary URL first, then fallback\n for (const url of urls) {\n try {\n // Use dynamic import to load ESM module from CDN\n // tsup/esbuild will not bundle this external URL\n const module = await import(/* @vite-ignore */ url);\n\n // The module exports parsePhoneNumberFromString and AsYouType\n // Handle different export structures\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const moduleExports = module as Record<string, any>;\n const parsePhoneNumberFromString =\n moduleExports.parsePhoneNumberFromString ||\n moduleExports.default?.parsePhoneNumberFromString ||\n moduleExports.default;\n const AsYouType = moduleExports.AsYouType || moduleExports.default?.AsYouType;\n const getCountryCallingCode =\n moduleExports.getCountryCallingCode || moduleExports.default?.getCountryCallingCode;\n\n if (!parsePhoneNumberFromString || typeof parsePhoneNumberFromString !== \"function\") {\n throw new Error(\"parsePhoneNumberFromString not found in module\");\n }\n\n if (!AsYouType || typeof AsYouType !== \"function\") {\n throw new Error(\"AsYouType not found in module\");\n }\n\n if (!getCountryCallingCode || typeof getCountryCallingCode !== \"function\") {\n throw new Error(\"getCountryCallingCode not found in module\");\n }\n\n phoneLibCache = { parsePhoneNumberFromString, AsYouType, getCountryCallingCode };\n return phoneLibCache;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n log.warn(`[phone-lib] Failed to load from ${url}, trying fallback...`, lastError);\n // Continue to next URL\n }\n }\n\n // All URLs failed\n const error = new Error(\n `Failed to load libphonenumber-js from all CDN URLs. Last error: ${lastError?.message}`\n );\n log.error(\"[phone-lib] Failed to load libphonenumber-js from all CDNs:\", error);\n loadingPromise = null;\n throw error;\n })();\n\n return loadingPromise;\n}\n\n/**\n * Gets parsePhoneNumberFromString function from the loaded library.\n * Returns null if library failed to load.\n */\nexport async function getParsePhoneNumberFromString(): Promise<ParsePhoneNumber | null> {\n try {\n const lib = await loadPhoneLib();\n return lib?.parsePhoneNumberFromString ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Gets AsYouType class from the loaded library.\n * Returns null if library failed to load.\n */\nexport async function getAsYouType(): Promise<AsYouType | null> {\n try {\n const lib = await loadPhoneLib();\n return lib?.AsYouType ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Gets getCountryCallingCode function from the loaded library.\n * Returns null if library failed to load.\n */\nexport async function getGetCountryCallingCode(): Promise<GetCountryCallingCode | null> {\n try {\n const lib = await loadPhoneLib();\n return lib?.getCountryCallingCode ?? null;\n } catch {\n return null;\n }\n}\n","/**\n * Validation error messages in multiple languages.\n * Language is detected from document.documentElement.lang attribute.\n */\n\nexport type ValidationRule = \"required\" | \"email\" | \"phone\" | \"pattern\" | \"min\" | \"max\";\n\nexport type ErrorMessages = Record<ValidationRule, string>;\n\nexport const errorMessages: Record<string, ErrorMessages> = {\n // Swedish (Sweden)\n \"sv-SE\": {\n required: \"Detta fΓ€lt Γ€r obligatoriskt\",\n email: \"VΓ€nligen ange en giltig e-postadress\",\n phone: \"VΓ€nligen ange ett giltigt telefonnummer\",\n pattern: \"Ogiltigt format\",\n min: \"FΓΆr kort\",\n max: \"FΓΆr lΓ₯ngt\",\n },\n\n // Norwegian BokmΓ₯l (Norway)\n \"nb-NO\": {\n required: \"Dette feltet er obligatorisk\",\n email: \"Vennligst oppgi en gyldig e-postadresse\",\n phone: \"Vennligst oppgi et gyldig telefonnummer\",\n pattern: \"Ugyldig format\",\n min: \"For kort\",\n max: \"For lang\",\n },\n\n // Norwegian (fallback)\n no: {\n required: \"Dette feltet er obligatorisk\",\n email: \"Vennligst oppgi en gyldig e-postadresse\",\n phone: \"Vennligst oppgi et gyldig telefonnummer\",\n pattern: \"Ugyldig format\",\n min: \"For kort\",\n max: \"For lang\",\n },\n\n // Danish (Denmark)\n \"da-DK\": {\n required: \"Dette felt er pΓ₯krΓ¦vet\",\n email: \"Indtast venligst en gyldig e-mailadresse\",\n phone: \"Indtast venligst et gyldigt telefonnummer\",\n pattern: \"Ugyldigt format\",\n min: \"For kort\",\n max: \"For lang\",\n },\n\n // English (United States)\n \"en-US\": {\n required: \"This field is required\",\n email: \"Please enter a valid email\",\n phone: \"Please enter a valid phone number\",\n pattern: \"Invalid format\",\n min: \"Too short\",\n max: \"Too long\",\n },\n\n // English (fallback)\n en: {\n required: \"This field is required\",\n email: \"Please enter a valid email\",\n phone: \"Please enter a valid phone number\",\n pattern: \"Invalid format\",\n min: \"Too short\",\n max: \"Too long\",\n },\n\n // German (Germany)\n \"de-DE\": {\n required: \"Dieses Feld ist erforderlich\",\n email: \"Bitte geben Sie eine gΓΌltige E-Mail-Adresse ein\",\n phone: \"Bitte geben Sie eine gΓΌltige Telefonnummer ein\",\n pattern: \"UngΓΌltiges Format\",\n min: \"Zu kurz\",\n max: \"Zu lang\",\n },\n\n // Spanish (Spain)\n \"es-ES\": {\n required: \"Este campo es obligatorio\",\n email: \"Por favor, introduce un correo electrΓ³nico vΓ‘lido\",\n phone: \"Por favor, introduce un nΓΊmero de telΓ©fono vΓ‘lido\",\n pattern: \"Formato no vΓ‘lido\",\n min: \"Demasiado corto\",\n max: \"Demasiado largo\",\n },\n\n // Finnish (Finland)\n \"fi-FI\": {\n required: \"TΓ€mΓ€ kenttΓ€ on pakollinen\",\n email: \"Anna kelvollinen sΓ€hkΓΆpostiosoite\",\n phone: \"Anna kelvollinen puhelinnumero\",\n pattern: \"Virheellinen muoto\",\n min: \"Liian lyhyt\",\n max: \"Liian pitkΓ€\",\n },\n\n // French (France)\n \"fr-FR\": {\n required: \"Ce champ est obligatoire\",\n email: \"Veuillez saisir une adresse e-mail valide\",\n phone: \"Veuillez saisir un numΓ©ro de tΓ©lΓ©phone valide\",\n pattern: \"Format invalide\",\n min: \"Trop court\",\n max: \"Trop long\",\n },\n};\n\n/**\n * Gets error messages for the current document language.\n * Falls back to English if language is not found.\n *\n * Language detection priority:\n * 1. Exact match (e.g., \"sv-SE\")\n * 2. Language prefix (e.g., \"sv\" from \"sv-SE\")\n * 3. Default to English (\"en\")\n */\nexport function getErrorMessagesForLanguage(): ErrorMessages {\n // Default English messages (fallback)\n const defaultMessages: ErrorMessages = errorMessages.en!;\n\n if (typeof document === \"undefined\") {\n return defaultMessages;\n }\n\n const lang = document.documentElement.lang;\n if (!lang) {\n return defaultMessages;\n }\n\n // Try exact match first\n const exactMatch = errorMessages[lang];\n if (exactMatch) {\n return exactMatch;\n }\n\n // Try language prefix (e.g., \"sv\" from \"sv-SE\")\n const prefix = lang.split(\"-\")[0];\n if (prefix) {\n const prefixMatch = errorMessages[prefix];\n if (prefixMatch) {\n return prefixMatch;\n }\n }\n\n // Fallback to English\n return defaultMessages;\n}\n","import log from \"loglevel\";\nimport { sessionStore } from \"@/core/stores\";\nimport { resolveField, syncAnswersFromInputs } from \"@/core/utils\";\nimport {\n waitForTransitionEnd,\n applySpeedOverride,\n clearTransitionStyles,\n computeMaxEndTime,\n} from \"@/features/utils/transitions\";\nimport { getPresetStyles, resolvePreset } from \"@/features/utils/transition-presets\";\nimport type { Predicate, CompositePredicate } from \"@/types\";\n\nexport function initConditions(root: Element): void {\n if (!root) return;\n\n syncAnswersFromInputs(root);\n attachAnswerSyncListeners(root);\n applyVisibility();\n applyEnableDisable();\n observeDOMMutations();\n\n // Subscribe to answer changes to re-evaluate enable/disable\n sessionStore.subscribe(() => {\n applyVisibility();\n applyEnableDisable();\n });\n\n log.debug(\"[conditions] Initialized\");\n}\n\nexport function evaluateShowIf(predicateJson: string, answers: Record<string, unknown>): boolean {\n try {\n const predicate: Predicate = JSON.parse(predicateJson);\n return evaluatePredicate(predicate, answers);\n } catch (error) {\n log.error(\"[conditions] Invalid predicate JSON:\", error);\n return false;\n }\n}\n\nexport function evaluatePredicate(predicate: Predicate, answers: Record<string, unknown>): boolean {\n // Composite predicates\n if (\"all\" in predicate) {\n const compositePred: CompositePredicate = predicate;\n return compositePred.all!.every((p) => evaluatePredicate(p, answers));\n }\n if (\"any\" in predicate) {\n const compositePred: CompositePredicate = predicate;\n return compositePred.any!.some((p) => evaluatePredicate(p, answers));\n }\n if (\"not\" in predicate) {\n const compositePred: CompositePredicate = predicate;\n return !evaluatePredicate(compositePred.not!, answers);\n }\n\n // Simple predicate - type guard ensures it's SimplePredicate\n if (\"field\" in predicate && \"op\" in predicate) {\n const { field, op, value } = predicate;\n const fieldValue = resolveField(field, answers);\n\n switch (op) {\n case \"eq\":\n return fieldValue === value;\n case \"neq\":\n return fieldValue !== value;\n case \"in\":\n return Array.isArray(value) && value.includes(fieldValue);\n case \"nin\":\n return Array.isArray(value) && !value.includes(fieldValue);\n case \"gt\":\n return Number(fieldValue) > Number(value);\n case \"gte\":\n return Number(fieldValue) >= Number(value);\n case \"lt\":\n return Number(fieldValue) < Number(value);\n case \"lte\":\n return Number(fieldValue) <= Number(value);\n case \"exists\":\n return fieldValue !== undefined && fieldValue !== null;\n case \"truthy\":\n return Boolean(fieldValue);\n case \"falsy\":\n return !fieldValue;\n case \"contains\":\n return String(fieldValue).includes(String(value));\n case \"starts_with\":\n return String(fieldValue).startsWith(String(value));\n case \"ends_with\":\n return String(fieldValue).endsWith(String(value));\n default:\n return false;\n }\n }\n\n // Fallback: if predicate doesn't match expected structure, return false\n return false;\n}\n\nfunction applyVisibility(): void {\n if (typeof document === \"undefined\") return;\n\n const answers = sessionStore.get().answers;\n\n // Handle as-show-if (Show when condition is met)\n document.querySelectorAll(\"[as-show-if]\").forEach((el) => {\n const predicate = el.getAttribute(\"as-show-if\");\n if (!predicate) return;\n\n const visible = evaluateShowIf(predicate, answers);\n toggleVisibility(el as HTMLElement, visible);\n });\n\n // Handle as-hide-if (Hide when condition is met)\n document.querySelectorAll(\"[as-hide-if]\").forEach((el) => {\n const predicate = el.getAttribute(\"as-hide-if\");\n if (!predicate) return;\n\n const shouldHide = evaluateShowIf(predicate, answers);\n toggleVisibility(el as HTMLElement, !shouldHide);\n });\n}\n\nfunction toggleVisibility(el: HTMLElement, visible: boolean): void {\n const currentlyVisible = isElementVisible(el);\n\n if (visible === currentlyVisible) {\n return;\n }\n\n if (visible) {\n showElementWithTransition(el);\n log.debug(\"[conditions] Showing element with transition\");\n return;\n }\n\n hideElementWithTransition(el);\n log.debug(\"[conditions] Hiding element with transition\");\n}\n\nfunction observeDOMMutations(): void {\n if (typeof document === \"undefined\" || typeof MutationObserver === \"undefined\") return;\n\n const observer = new MutationObserver(() => {\n log.debug(\"[conditions] DOM mutation detected, re-applying visibility\");\n applyVisibility();\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n}\n\nfunction attachAnswerSyncListeners(root: Element): void {\n const handler = (): void => {\n syncAnswersFromInputs(root);\n };\n\n root.addEventListener(\"input\", handler);\n root.addEventListener(\"change\", handler);\n}\n\nfunction showElementWithTransition(el: HTMLElement): void {\n const skipAnimation = shouldSkipVisibilityAnimation();\n const token = updateVisibilityToken(el);\n log.debug(\"[conditions] show transition start\", {\n token,\n skipAnimation,\n element: describeElement(el),\n });\n\n el.dataset.asVisibilityState = \"visible\";\n restoreDisplay(el);\n el.setAttribute(\"aria-hidden\", \"false\");\n el.removeAttribute(\"inert\");\n\n if (skipAnimation) {\n clearTransitionStyles(el);\n el.style.opacity = \"\";\n el.style.transform = \"\";\n log.debug(\"[conditions] show transition skipped (reduced motion)\", { token });\n return;\n }\n\n const transitionInBase =\n el.getAttribute(\"as-transition-in\") || el.getAttribute(\"as-transition\") || \"fade\";\n const transitionIn = resolvePreset(transitionInBase, \"in\");\n const distance = el.getAttribute(\"as-transition-distance\") || \"24px\";\n const speedIn =\n el.getAttribute(\"as-transition-speed-in\") || el.getAttribute(\"as-transition-speed\");\n const preset = getPresetStyles(transitionIn, distance, \"in\");\n const computed = window.getComputedStyle(el);\n const hasTransitionDuration =\n computeMaxEndTime(computed.transitionDuration, computed.transitionDelay) > 0;\n const propStr = computed.transitionProperty || \"\";\n const hasNeededProps = /(^|,|\\s)(all|transform|opacity)(,|\\s|$)/.test(propStr);\n\n const previousTransitionProperty = el.style.transitionProperty;\n const previousTransitionDuration = el.style.transitionDuration;\n const previousWillChange = el.style.willChange;\n\n // Seed initial state without animating\n el.style.transitionProperty = \"none\";\n el.style.transitionDuration = \"0ms\";\n Object.assign(el.style, preset.initial);\n void el.offsetHeight;\n\n requestAnimationFrame(() => {\n if (!isCurrentVisibilityToken(el, token)) {\n log.debug(\"[conditions] show transition aborted before animation (token mismatch)\", {\n token,\n });\n el.style.transitionProperty = previousTransitionProperty;\n el.style.transitionDuration = previousTransitionDuration;\n el.style.willChange = previousWillChange;\n return;\n }\n\n let appliedTransitionProperty = false;\n let appliedTransitionDuration = false;\n let appliedWillChange = false;\n\n if (hasNeededProps) {\n el.style.transitionProperty = previousTransitionProperty;\n } else {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n\n if (speedIn) {\n applySpeedOverride(el, speedIn);\n } else if (!hasTransitionDuration) {\n el.style.transitionDuration = \"300ms\";\n appliedTransitionDuration = true;\n } else {\n el.style.transitionDuration = previousTransitionDuration;\n }\n\n if (el.style.willChange !== \"opacity, transform\") {\n el.style.willChange = \"opacity, transform\";\n appliedWillChange = true;\n }\n\n Object.assign(el.style, preset.target);\n\n waitForTransitionEnd(el, () => {\n if (!isCurrentVisibilityToken(el, token)) {\n log.debug(\"[conditions] show transition cleanup skipped (token mismatch)\", { token });\n return;\n }\n\n if (appliedTransitionDuration || speedIn) {\n el.style.transitionDuration = previousTransitionDuration;\n }\n\n if (appliedTransitionProperty) {\n el.style.transitionProperty = previousTransitionProperty;\n }\n\n if (appliedWillChange) {\n el.style.willChange = previousWillChange;\n }\n\n log.debug(\"[conditions] show transition complete\", {\n token,\n element: describeElement(el),\n });\n });\n });\n}\n\nfunction hideElementWithTransition(el: HTMLElement): void {\n const skipAnimation = shouldSkipVisibilityAnimation();\n const token = updateVisibilityToken(el);\n log.debug(\"[conditions] hide transition start\", {\n token,\n skipAnimation,\n element: describeElement(el),\n });\n\n el.dataset.asVisibilityState = \"hidden\";\n\n if (skipAnimation) {\n setDisplayNone(el);\n el.setAttribute(\"aria-hidden\", \"true\");\n el.setAttribute(\"inert\", \"\");\n clearTransitionStyles(el);\n log.debug(\"[conditions] hide transition skipped (reduced motion)\", { token });\n return;\n }\n\n const transitionOutBase =\n el.getAttribute(\"as-transition-out\") || el.getAttribute(\"as-transition\") || \"fade\";\n const transitionOut = resolvePreset(transitionOutBase, \"out\");\n const distance = el.getAttribute(\"as-transition-distance\") || \"24px\";\n const speedOut =\n el.getAttribute(\"as-transition-speed-out\") || el.getAttribute(\"as-transition-speed\");\n const preset = getPresetStyles(transitionOut, distance, \"out\");\n const computed = window.getComputedStyle(el);\n const hasTransitionDuration =\n computeMaxEndTime(computed.transitionDuration, computed.transitionDelay) > 0;\n\n let appliedTransitionProperty = false;\n let appliedWillChange = false;\n\n const propStr = computed.transitionProperty || \"\";\n const hasNeededProps = /(^|,|\\s)(all|transform|opacity)(,|\\s|$)/.test(propStr);\n if (!hasNeededProps) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n\n if (!hasTransitionDuration && !speedOut) {\n el.style.transitionDuration = \"300ms\";\n if (!appliedTransitionProperty) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n }\n\n if (el.style.willChange !== \"opacity, transform\") {\n el.style.willChange = \"opacity, transform\";\n appliedWillChange = true;\n }\n\n if (speedOut) {\n applySpeedOverride(el, speedOut);\n }\n\n Object.assign(el.style, preset.target);\n\n waitForTransitionEnd(el, () => {\n if (!isCurrentVisibilityToken(el, token)) {\n log.debug(\"[conditions] hide transition cleanup skipped (token mismatch)\", { token });\n return;\n }\n\n setDisplayNone(el);\n el.setAttribute(\"aria-hidden\", \"true\");\n el.setAttribute(\"inert\", \"\");\n clearTransitionStyles(el);\n\n if (!hasTransitionDuration && !speedOut) {\n el.style.transitionDuration = \"\";\n } else if (speedOut) {\n el.style.transitionDuration = \"\";\n }\n\n if (appliedTransitionProperty) {\n el.style.transitionProperty = \"\";\n }\n\n if (appliedWillChange) {\n el.style.willChange = \"\";\n }\n\n log.debug(\"[conditions] hide transition complete\", {\n token,\n element: describeElement(el),\n });\n });\n}\n\nfunction shouldSkipVisibilityAnimation(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nfunction updateVisibilityToken(el: HTMLElement): string {\n const token =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(16).slice(2)}`;\n\n el.dataset.asVisibilityToken = token;\n return token;\n}\n\nfunction isCurrentVisibilityToken(el: HTMLElement, token: string): boolean {\n return el.dataset.asVisibilityToken === token;\n}\n\nfunction isElementVisible(el: HTMLElement): boolean {\n const state = el.dataset.asVisibilityState;\n if (state === \"visible\") return true;\n if (state === \"hidden\") return false;\n\n if (el.getAttribute(\"aria-hidden\") === \"true\") return false;\n if (el.style.display === \"none\") return false;\n\n return true;\n}\n\nfunction restoreDisplay(el: HTMLElement): void {\n el.style.removeProperty(\"display\");\n const cached = el.dataset.asDisplayCache;\n if (cached && cached !== \"none\") {\n el.style.display = cached;\n return;\n }\n\n if (!cached) {\n el.style.display = \"\";\n }\n}\n\nfunction setDisplayNone(el: HTMLElement): void {\n cacheDisplay(el);\n el.style.setProperty(\"display\", \"none\", \"important\");\n}\n\nfunction cacheDisplay(el: HTMLElement): void {\n if (el.dataset.asDisplayCache && el.dataset.asDisplayCache !== \"none\") {\n return;\n }\n\n const inlineDisplay = el.style.display;\n if (inlineDisplay && inlineDisplay !== \"none\") {\n el.dataset.asDisplayCache = inlineDisplay;\n return;\n }\n\n if (typeof window !== \"undefined\" && typeof window.getComputedStyle === \"function\") {\n const computedDisplay = window.getComputedStyle(el).display;\n if (computedDisplay && computedDisplay !== \"none\") {\n el.dataset.asDisplayCache = computedDisplay;\n }\n }\n}\n\nfunction describeElement(el: HTMLElement): string {\n const idPart = el.id ? `#${el.id}` : \"\";\n const logicId = el.getAttribute(\"as-element-id\");\n const logicPart = logicId ? `[${logicId}]` : \"\";\n return `<${el.tagName.toLowerCase()}${idPart}${logicPart}>`;\n}\n\nexport function evaluateNextMap(\n nextMapJson: string,\n answers: Record<string, unknown>\n): string | null {\n try {\n const nextMap = JSON.parse(nextMapJson) as Array<{ if: Predicate; then: string }>;\n\n for (const rule of nextMap) {\n if (evaluatePredicate(rule.if, answers)) {\n return rule.then;\n }\n }\n\n return null;\n } catch (error) {\n log.error(\"[conditions] Invalid next-map JSON:\", error);\n return null;\n }\n}\n\n/**\n * Apply enable/disable predicates to all elements with as-enable-if or as-disable-if\n */\nfunction applyEnableDisable(): void {\n if (typeof document === \"undefined\") return;\n\n const answers = sessionStore.get().answers;\n\n // Handle as-disable-if elements (enabled by default, disabled when predicate matches)\n document.querySelectorAll(\"[as-disable-if]\").forEach((el) => {\n const predicate = el.getAttribute(\"as-disable-if\");\n if (!predicate) return;\n\n const shouldDisable = evaluateShowIf(predicate, answers);\n setElementDisabled(el as HTMLElement, shouldDisable);\n });\n\n // Handle as-enable-if elements (disabled by default, enabled when predicate matches)\n document.querySelectorAll(\"[as-enable-if]\").forEach((el) => {\n const predicate = el.getAttribute(\"as-enable-if\");\n if (!predicate) return;\n\n const shouldEnable = evaluateShowIf(predicate, answers);\n setElementDisabled(el as HTMLElement, !shouldEnable);\n });\n}\n\n/**\n * Set the disabled state of an element with proper accessibility attributes\n */\nfunction setElementDisabled(el: HTMLElement, disabled: boolean): void {\n // Store original tabIndex if not already stored\n if (!el.hasAttribute(\"data-as-original-tabindex\") && el.hasAttribute(\"tabindex\")) {\n el.setAttribute(\"data-as-original-tabindex\", el.getAttribute(\"tabindex\") || \"0\");\n }\n\n if (disabled) {\n // Disable the element\n if (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement ||\n el instanceof HTMLButtonElement\n ) {\n el.disabled = true;\n }\n\n el.setAttribute(\"aria-disabled\", \"true\");\n el.setAttribute(\"tabindex\", \"-1\");\n el.classList.add(\"as-disabled\");\n\n // Clear any validation errors\n el.removeAttribute(\"aria-invalid\");\n el.removeAttribute(\"aria-describedby\");\n } else {\n // Enable the element\n if (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement ||\n el instanceof HTMLButtonElement\n ) {\n el.disabled = false;\n }\n\n el.removeAttribute(\"aria-disabled\");\n\n // Restore original tabIndex\n const originalTabIndex = el.getAttribute(\"data-as-original-tabindex\");\n if (originalTabIndex) {\n el.setAttribute(\"tabindex\", originalTabIndex);\n el.removeAttribute(\"data-as-original-tabindex\");\n } else {\n el.removeAttribute(\"tabindex\");\n }\n\n el.classList.remove(\"as-disabled\");\n }\n}\n\n/**\n * Check if an element is disabled (for use in validation)\n */\nexport function isElementDisabled(el: HTMLElement): boolean {\n if (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement ||\n el instanceof HTMLButtonElement\n ) {\n if (el.disabled) return true;\n }\n\n // Also check for as-disabled class (set by enable/disable logic)\n return el.classList.contains(\"as-disabled\");\n}\n","import { sessionStore } from \"@/core/stores\";\n\nconst PRESERVED_ANSWER_KEYS = new Set<string>([\"__quiz__\"]);\n\nexport function getAnswersFromInputs(root: Element): Record<string, unknown> {\n const answers: Record<string, unknown> = {};\n const inputs = root.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\n \"input, textarea, select\"\n );\n\n inputs.forEach((input) => {\n if (!input.name && !input.hasAttribute(\"as-element-id\")) return;\n\n const keys = [];\n if (input.name) keys.push(input.name);\n const logicId = input.getAttribute(\"as-element-id\");\n if (logicId) keys.push(logicId);\n\n let value: unknown = input.value;\n\n if (input instanceof HTMLInputElement && input.type === \"checkbox\") {\n value = Boolean(input.checked);\n } else if (input instanceof HTMLInputElement && input.type === \"radio\") {\n if (!input.checked) return;\n value = input.value;\n }\n\n keys.forEach((key) => {\n answers[key] = value;\n });\n });\n\n return answers;\n}\n\nexport function syncAnswersFromInputs(root: Element): void {\n if (typeof document === \"undefined\") return;\n if (!root) return;\n\n const session = sessionStore.get();\n const domAnswers = getAnswersFromInputs(root);\n const mergedAnswers = mergeAnswers(session.answers, domAnswers);\n\n if (answersChanged(session.answers, mergedAnswers)) {\n sessionStore.set({ ...session, answers: mergedAnswers });\n }\n}\n\nfunction mergeAnswers(\n previous: Record<string, unknown>,\n dom: Record<string, unknown>\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...dom };\n\n for (const [key, value] of Object.entries(previous)) {\n if (!(key in merged) || PRESERVED_ANSWER_KEYS.has(key)) {\n merged[key] = value;\n }\n }\n\n return merged;\n}\n\nfunction answersChanged(previous: Record<string, unknown>, next: Record<string, unknown>): boolean {\n const prevKeys = Object.keys(previous);\n const nextKeys = Object.keys(next);\n\n if (prevKeys.length !== nextKeys.length) {\n return true;\n }\n\n for (const key of nextKeys) {\n if (previous[key] !== next[key]) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function ensureAriaLiveRegion(): HTMLElement {\n if (typeof document === \"undefined\") {\n // SSR guard; return a stub element\n return { style: {} } as HTMLElement;\n }\n\n let region = document.getElementById(\"as-aria-live\");\n if (!region) {\n region = document.createElement(\"div\");\n region.id = \"as-aria-live\";\n region.setAttribute(\"aria-live\", \"polite\");\n region.setAttribute(\"aria-atomic\", \"true\");\n const el = region;\n el.style.position = \"absolute\";\n el.style.left = \"-10000px\";\n el.style.width = \"1px\";\n el.style.height = \"1px\";\n el.style.overflow = \"hidden\";\n document.body.appendChild(region);\n }\n return region;\n}\n\nexport function resolveField(field: string, answers: Record<string, unknown>): unknown {\n // Support env.utm.*, env.clientId, env.surveyId\n if (field.startsWith(\"env.\")) {\n const path = field.slice(4).split(\".\");\n if (path[0] === \"utm\" && path[1]) {\n const params = new URLSearchParams(\n typeof window !== \"undefined\" ? window.location.search : \"\"\n );\n return params.get(`utm_${path[1]}`);\n }\n if (path[0]) {\n return answers[path[0]];\n }\n }\n\n // Support quiz.winner, quiz.winner.score, quiz.scores.{category}\n if (field.startsWith(\"quiz.\")) {\n const path = field.slice(5).split(\".\");\n const quizResults = answers[\"__quiz__\"] as Record<string, unknown> | undefined;\n\n if (!quizResults) return undefined;\n\n if (path[0] === \"winner\") {\n if (path.length === 1) {\n return quizResults.winner;\n }\n if (path[1] === \"score\") {\n return quizResults.winnerScore;\n }\n }\n\n if (path[0] === \"scores\" && path[1]) {\n const scores = quizResults.scores as Record<string, number> | undefined;\n return scores?.[path[1]];\n }\n\n return undefined;\n }\n\n return answers[field];\n}\n","export type TransitionPreset =\n | \"fade\"\n | \"slide-in-left\"\n | \"slide-in-right\"\n | \"slide-in-up\"\n | \"slide-in-down\"\n | \"slide-out-left\"\n | \"slide-out-right\"\n | \"slide-out-up\"\n | \"slide-out-down\"\n | \"scale-in\"\n | \"scale-out\";\n\ninterface PresetStyles {\n initial: Partial<CSSStyleDeclaration>;\n target: Partial<CSSStyleDeclaration>;\n}\n\nexport function resolvePreset(preset: string, direction: \"in\" | \"out\"): TransitionPreset {\n switch (preset) {\n // Unified horizontal combos\n case \"slide-left-right\":\n return direction === \"in\" ? \"slide-in-left\" : \"slide-out-right\";\n case \"slide-right-left\":\n return direction === \"in\" ? \"slide-in-right\" : \"slide-out-left\";\n\n // Unified vertical combos\n case \"slide-up-down\":\n return direction === \"in\" ? \"slide-in-up\" : \"slide-out-down\";\n case \"slide-down-up\":\n return direction === \"in\" ? \"slide-in-down\" : \"slide-out-up\";\n\n // Unified scale\n case \"scale\":\n return direction === \"in\" ? \"scale-in\" : \"scale-out\";\n\n // Unified fade\n case \"fade\":\n return \"fade\";\n\n default:\n return \"fade\";\n }\n}\n\nexport function getPresetStyles(\n preset: TransitionPreset,\n distance: string,\n direction: \"in\" | \"out\"\n): PresetStyles {\n const styles: PresetStyles = {\n initial: {},\n target: {},\n };\n\n switch (preset) {\n case \"fade\":\n if (direction === \"in\") {\n styles.initial = { opacity: \"0\" };\n styles.target = { opacity: \"1\" };\n } else {\n styles.initial = { opacity: \"1\" };\n styles.target = { opacity: \"0\" };\n }\n break;\n\n case \"slide-in-left\":\n styles.initial = { transform: `translateX(-${distance})`, opacity: \"0\" };\n styles.target = { transform: \"translateX(0)\", opacity: \"1\" };\n break;\n\n case \"slide-in-right\":\n styles.initial = { transform: `translateX(${distance})`, opacity: \"0\" };\n styles.target = { transform: \"translateX(0)\", opacity: \"1\" };\n break;\n\n case \"slide-in-up\":\n styles.initial = { transform: `translateY(-${distance})`, opacity: \"0\" };\n styles.target = { transform: \"translateY(0)\", opacity: \"1\" };\n break;\n\n case \"slide-in-down\":\n styles.initial = { transform: `translateY(${distance})`, opacity: \"0\" };\n styles.target = { transform: \"translateY(0)\", opacity: \"1\" };\n break;\n\n case \"slide-out-left\":\n styles.initial = { transform: \"translateX(0)\", opacity: \"1\" };\n styles.target = { transform: `translateX(-${distance})`, opacity: \"0\" };\n break;\n\n case \"slide-out-right\":\n styles.initial = { transform: \"translateX(0)\", opacity: \"1\" };\n styles.target = { transform: `translateX(${distance})`, opacity: \"0\" };\n break;\n\n case \"slide-out-up\":\n styles.initial = { transform: \"translateY(0)\", opacity: \"1\" };\n styles.target = { transform: `translateY(-${distance})`, opacity: \"0\" };\n break;\n\n case \"slide-out-down\":\n styles.initial = { transform: \"translateY(0)\", opacity: \"1\" };\n styles.target = { transform: `translateY(${distance})`, opacity: \"0\" };\n break;\n\n case \"scale-in\":\n styles.initial = { transform: \"scale(0.98)\", opacity: \"0\" };\n styles.target = { transform: \"scale(1)\", opacity: \"1\" };\n break;\n\n case \"scale-out\":\n styles.initial = { transform: \"scale(1)\", opacity: \"1\" };\n styles.target = { transform: \"scale(0.98)\", opacity: \"0\" };\n break;\n }\n\n return styles;\n}\n\n","import { getPresetStyles, resolvePreset } from \"./transition-presets\";\n\nexport interface TransitionOptions {\n /** Default duration if none set in CSS (default: \"300ms\") */\n defaultDuration?: string;\n /** Default distance for slide presets (default: \"24px\") */\n defaultDistance?: string;\n /** Callback when transition completes */\n onComplete?: () => void;\n /** Display value to restore when showing (default: \"\") */\n displayValue?: string;\n}\n\n/**\n * Generic show element with transition\n */\nexport function showWithTransition(el: HTMLElement, options: TransitionOptions = {}): void {\n const {\n defaultDuration = \"300ms\",\n defaultDistance = \"24px\",\n onComplete,\n displayValue = \"\",\n } = options;\n\n // Check reduced motion preference\n const prefersReducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n // Restore display\n el.style.display = displayValue;\n el.removeAttribute(\"hidden\");\n el.removeAttribute(\"aria-hidden\");\n\n if (prefersReducedMotion) {\n el.style.opacity = \"1\";\n onComplete?.();\n return;\n }\n\n // Get transition preset\n const transitionInBase =\n el.getAttribute(\"as-transition-in\") || el.getAttribute(\"as-transition\") || \"fade\";\n const transitionIn = resolvePreset(transitionInBase, \"in\");\n const distance = el.getAttribute(\"as-transition-distance\") || defaultDistance;\n const speedIn =\n el.getAttribute(\"as-transition-speed-in\") || el.getAttribute(\"as-transition-speed\");\n\n // Get preset styles\n const preset = getPresetStyles(transitionIn, distance, \"in\");\n\n // Check if CSS has transition duration set\n const computed = window.getComputedStyle(el);\n const hasTransitionDuration =\n computeMaxEndTime(computed.transitionDuration, computed.transitionDelay) > 0;\n let appliedTransitionProperty = false;\n\n const propStr = computed.transitionProperty || \"\";\n const hasNeededProps = /(^|,|\\s)(all|transform|opacity)(,|\\s|$)/.test(propStr);\n if (!hasNeededProps) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n\n if (!hasTransitionDuration && !speedIn) {\n el.style.transitionDuration = defaultDuration;\n if (!appliedTransitionProperty) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n }\n\n if (speedIn) {\n applySpeedOverride(el, speedIn);\n }\n\n // Apply initial styles\n Object.assign(el.style, preset.initial);\n\n // Force reflow\n void el.offsetHeight;\n\n // Apply target styles\n requestAnimationFrame(() => {\n Object.assign(el.style, preset.target);\n\n waitForTransitionEnd(el, () => {\n if (!hasTransitionDuration && !speedIn) {\n el.style.transitionDuration = \"\";\n }\n if (speedIn) {\n el.style.transitionDuration = \"\";\n }\n if (appliedTransitionProperty) {\n el.style.transitionProperty = \"\";\n }\n onComplete?.();\n });\n });\n}\n\n/**\n * Generic hide element with transition\n */\nexport function hideWithTransition(el: HTMLElement, options: TransitionOptions = {}): void {\n const { defaultDuration = \"300ms\", defaultDistance = \"24px\", onComplete } = options;\n\n // Check reduced motion preference\n const prefersReducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n if (prefersReducedMotion) {\n el.style.display = \"none\";\n el.setAttribute(\"aria-hidden\", \"true\");\n onComplete?.();\n return;\n }\n\n // Get transition preset\n const transitionOutBase =\n el.getAttribute(\"as-transition-out\") || el.getAttribute(\"as-transition\") || \"fade\";\n const transitionOut = resolvePreset(transitionOutBase, \"out\");\n const distance = el.getAttribute(\"as-transition-distance\") || defaultDistance;\n const speedOut =\n el.getAttribute(\"as-transition-speed-out\") || el.getAttribute(\"as-transition-speed\");\n\n // Get preset styles\n const preset = getPresetStyles(transitionOut, distance, \"out\");\n\n // Check if CSS has transition duration set\n const computed = window.getComputedStyle(el);\n const hasTransitionDuration =\n computeMaxEndTime(computed.transitionDuration, computed.transitionDelay) > 0;\n let appliedTransitionProperty = false;\n\n const propStr = computed.transitionProperty || \"\";\n const hasNeededProps = /(^|,|\\s)(all|transform|opacity)(,|\\s|$)/.test(propStr);\n if (!hasNeededProps) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n\n if (!hasTransitionDuration && !speedOut) {\n el.style.transitionDuration = defaultDuration;\n if (!appliedTransitionProperty) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n }\n\n if (speedOut) {\n applySpeedOverride(el, speedOut);\n }\n\n // Apply exit styles\n Object.assign(el.style, preset.target);\n\n // Wait for transition, then hide\n waitForTransitionEnd(el, () => {\n el.style.display = \"none\";\n el.setAttribute(\"aria-hidden\", \"true\");\n clearTransitionStyles(el);\n\n if (!hasTransitionDuration && !speedOut) {\n el.style.transitionDuration = \"\";\n }\n if (speedOut) {\n el.style.transitionDuration = \"\";\n }\n if (appliedTransitionProperty) {\n el.style.transitionProperty = \"\";\n }\n onComplete?.();\n });\n}\n\nexport function applyGridStack(\n container: HTMLElement,\n incomingEl: HTMLElement,\n outgoingEl: HTMLElement\n): () => void {\n const prev = {\n containerDisplay: container.style.display,\n containerAlignItems: container.style.alignItems,\n containerJustifyItems: container.style.justifyItems,\n incGridArea: incomingEl.style.gridArea,\n incZIndex: incomingEl.style.zIndex,\n outGridArea: outgoingEl.style.gridArea,\n outZIndex: outgoingEl.style.zIndex,\n };\n\n const computedDisplay = window.getComputedStyle(container).display;\n if (computedDisplay !== \"grid\" && computedDisplay !== \"inline-grid\") {\n container.style.display = \"grid\";\n }\n\n // Stack both steps in the same grid cell\n incomingEl.style.gridArea = \"1 / 1 / 2 / 2\";\n outgoingEl.style.gridArea = \"1 / 1 / 2 / 2\";\n // Ensure layering order: outgoing on top during exit to avoid ghosting\n incomingEl.style.zIndex = \"1\";\n outgoingEl.style.zIndex = \"2\";\n\n return () => {\n container.style.display = prev.containerDisplay;\n container.style.alignItems = prev.containerAlignItems;\n container.style.justifyItems = prev.containerJustifyItems;\n incomingEl.style.gridArea = prev.incGridArea;\n incomingEl.style.zIndex = prev.incZIndex;\n outgoingEl.style.gridArea = prev.outGridArea;\n outgoingEl.style.zIndex = prev.outZIndex;\n };\n}\n\nexport function showStepWithTransition(\n el: HTMLElement,\n skipAnimation: boolean,\n focusCallback: (el: HTMLElement) => void\n): void {\n // Clear inline display to restore Webflow-defined layout (removes any display:none set earlier)\n el.style.display = \"\";\n\n // Set accessibility attributes\n el.setAttribute(\"aria-hidden\", \"false\");\n el.removeAttribute(\"inert\");\n\n if (skipAnimation) {\n // Skip animation: set opacity to 1 immediately and ensure visible\n el.style.opacity = \"1\";\n focusCallback(el);\n return;\n }\n\n // Get transition preset\n const transitionInBase =\n el.getAttribute(\"as-transition-in\") || el.getAttribute(\"as-transition\") || \"fade\";\n const transitionIn = resolvePreset(transitionInBase, \"in\");\n const distance = el.getAttribute(\"as-transition-distance\") || \"24px\";\n const speedIn =\n el.getAttribute(\"as-transition-speed-in\") || el.getAttribute(\"as-transition-speed\");\n\n // Get preset styles\n const preset = getPresetStyles(transitionIn, distance, \"in\");\n\n // Apply default 300ms duration if Webflow hasn't set one\n const computed = window.getComputedStyle(el);\n const hasTransitionDuration =\n computeMaxEndTime(computed.transitionDuration, computed.transitionDelay) > 0;\n let appliedTransitionProperty = false;\n let appliedWillChange = false;\n\n // Ensure we transition transform/opacity even if designer set other properties\n const propStr = computed.transitionProperty || \"\";\n const hasNeededProps = /(^|,|\\s)(all|transform|opacity)(,|\\s|$)/.test(propStr);\n if (!hasNeededProps) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n\n if (!hasTransitionDuration && !speedIn) {\n el.style.transitionDuration = \"300ms\";\n if (!appliedTransitionProperty) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n }\n\n // Performance hint\n if (el.style.willChange !== \"opacity, transform\") {\n el.style.willChange = \"opacity, transform\";\n appliedWillChange = true;\n }\n\n // Apply speed override if provided\n if (speedIn) {\n applySpeedOverride(el, speedIn);\n }\n\n // Apply initial styles\n Object.assign(el.style, preset.initial);\n\n // Force reflow to ensure initial styles are applied\n void el.offsetHeight;\n\n // Apply target styles on next frame\n requestAnimationFrame(() => {\n Object.assign(el.style, preset.target);\n\n // Wait for transition to complete, then focus\n waitForTransitionEnd(el, () => {\n focusCallback(el);\n // Clear any temporary duration/speed overrides\n if (!hasTransitionDuration && !speedIn) {\n el.style.transitionDuration = \"\";\n }\n if (speedIn) {\n el.style.transitionDuration = \"\";\n }\n if (appliedTransitionProperty) {\n el.style.transitionProperty = \"\";\n }\n if (appliedWillChange) {\n el.style.willChange = \"\";\n }\n });\n });\n}\n\nexport function hideStepWithTransition(el: HTMLElement, skipAnimation: boolean): void {\n if (skipAnimation) {\n // Skip animation: hide immediately (use !important to override pre-CSS if still present)\n el.style.setProperty(\"display\", \"none\", \"important\");\n el.setAttribute(\"aria-hidden\", \"true\");\n el.setAttribute(\"inert\", \"\");\n return;\n }\n\n // Get transition preset\n const transitionOutBase =\n el.getAttribute(\"as-transition-out\") || el.getAttribute(\"as-transition\") || \"fade\";\n const transitionOut = resolvePreset(transitionOutBase, \"out\");\n const distance = el.getAttribute(\"as-transition-distance\") || \"24px\";\n const speedOut =\n el.getAttribute(\"as-transition-speed-out\") || el.getAttribute(\"as-transition-speed\");\n\n // Get preset styles\n const preset = getPresetStyles(transitionOut, distance, \"out\");\n\n // Apply default 300ms duration if Webflow hasn't set one\n const computed = window.getComputedStyle(el);\n const hasTransitionDuration =\n computeMaxEndTime(computed.transitionDuration, computed.transitionDelay) > 0;\n let appliedTransitionProperty = false;\n let appliedWillChange = false;\n\n // Ensure we transition transform/opacity even if designer set other properties\n const propStr = computed.transitionProperty || \"\";\n const hasNeededProps = /(^|,|\\s)(all|transform|opacity)(,|\\s|$)/.test(propStr);\n if (!hasNeededProps) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n\n if (!hasTransitionDuration && !speedOut) {\n el.style.transitionDuration = \"300ms\";\n if (!appliedTransitionProperty) {\n el.style.transitionProperty = \"opacity, transform\";\n appliedTransitionProperty = true;\n }\n }\n\n // Performance hint\n if (el.style.willChange !== \"opacity, transform\") {\n el.style.willChange = \"opacity, transform\";\n appliedWillChange = true;\n }\n\n // Apply speed override if provided\n if (speedOut) {\n applySpeedOverride(el, speedOut);\n }\n\n // Apply exit styles\n Object.assign(el.style, preset.target);\n\n // Wait for transition to complete, then hide\n waitForTransitionEnd(el, () => {\n // Use !important to override pre-CSS if still present\n el.style.setProperty(\"display\", \"none\", \"important\");\n el.setAttribute(\"aria-hidden\", \"true\");\n el.setAttribute(\"inert\", \"\");\n\n // Clear transition styles\n clearTransitionStyles(el);\n\n // Clear any temporary duration/speed overrides\n if (!hasTransitionDuration && !speedOut) {\n el.style.transitionDuration = \"\";\n }\n if (speedOut) {\n el.style.transitionDuration = \"\";\n }\n if (appliedTransitionProperty) {\n el.style.transitionProperty = \"\";\n }\n if (appliedWillChange) {\n el.style.willChange = \"\";\n }\n });\n}\n\nexport function waitForTransitionEnd(el: HTMLElement, callback: () => void): void {\n const computed = window.getComputedStyle(el);\n const duration = computed.transitionDuration;\n const delay = computed.transitionDelay;\n\n // Compute max end time\n const maxEndTime = computeMaxEndTime(duration, delay);\n\n if (maxEndTime === 0) {\n // No transition, call callback immediately\n callback();\n return;\n }\n\n let fired = false;\n const timeoutId = setTimeout(() => {\n if (!fired) {\n fired = true;\n callback();\n }\n }, maxEndTime + 50); // Add 50ms buffer\n\n const handler = (e: TransitionEvent | AnimationEvent): void => {\n if (e.target === el && !fired) {\n fired = true;\n clearTimeout(timeoutId);\n el.removeEventListener(\"transitionend\", handler as EventListener);\n el.removeEventListener(\"animationend\", handler as EventListener);\n callback();\n }\n };\n\n el.addEventListener(\"transitionend\", handler as EventListener);\n el.addEventListener(\"animationend\", handler as EventListener);\n}\n\nexport function applySpeedOverride(el: HTMLElement, speed: string): void {\n const computed = window.getComputedStyle(el);\n const currentDuration = computed.transitionDuration;\n\n switch (speed) {\n case \"fast\":\n el.style.transitionDuration = scaleDuration(currentDuration, 0.7);\n break;\n case \"normal\":\n // No change\n break;\n case \"slow\":\n el.style.transitionDuration = scaleDuration(currentDuration, 1.5);\n break;\n default:\n // Assume it's a specific duration like \"600ms\" or \"0.6s\"\n el.style.transitionDuration = speed;\n break;\n }\n}\n\nexport function scaleDuration(durationStr: string, scale: number): string {\n const durations = durationStr.split(\",\").map((d) => d.trim());\n return durations\n .map((d) => {\n const match = d.match(/^([\\d.]+)(m?s)$/);\n if (!match || !match[1] || !match[2]) return d;\n const value = parseFloat(match[1]);\n const unit = match[2];\n const scaled = value * scale;\n return `${scaled}${unit}`;\n })\n .join(\", \");\n}\n\nexport function computeMaxEndTime(durationStr: string, delayStr: string): number {\n const durations = durationStr.split(\",\").map((d) => parseTimeValue(d.trim()));\n const delays = delayStr.split(\",\").map((d) => parseTimeValue(d.trim()));\n\n let maxEndTime = 0;\n for (let i = 0; i < durations.length; i++) {\n const duration = durations[i] || 0;\n const delay = delays[i] || delays[0] || 0;\n const endTime = duration + delay;\n if (endTime > maxEndTime) {\n maxEndTime = endTime;\n }\n }\n\n return maxEndTime;\n}\n\nexport function parseTimeValue(value: string): number {\n const match = value.match(/^([\\d.]+)(m?s)$/);\n if (!match || !match[1] || !match[2]) return 0;\n const num = parseFloat(match[1]);\n const unit = match[2];\n return unit === \"ms\" ? num : num * 1000;\n}\n\nexport function clearTransitionStyles(el: HTMLElement): void {\n // Clear inline transition-related styles we may have set\n el.style.opacity = \"\";\n el.style.translate = \"\";\n el.style.scale = \"\";\n el.style.transform = \"\";\n}\n","import log from \"loglevel\";\nimport { sessionStore, stepsStore } from \"@/core/stores\";\nimport { sendFinal } from \"@/features/basin\";\nimport { validateStep } from \"@/features/validation\";\nimport { evaluatePredicate } from \"@/features/conditions\";\nimport type { Predicate } from \"@/types\";\n\ntype RedirectSelectionSource = \"map\" | \"attribute\";\n\ntype RedirectSelection = {\n url: string;\n preserveUtm: boolean;\n includeSession: boolean;\n useReplace: boolean;\n source: RedirectSelectionSource;\n};\n\ntype RedirectMapRule = {\n if?: Predicate;\n to: string;\n preserveUtm?: boolean;\n includeSession?: boolean;\n replace?: boolean;\n};\n\nexport function initRedirect(root: Element): void {\n if (!root) return;\n\n attachRedirectHandlers(root);\n log.debug(\"[redirect] Initialized\");\n}\n\nfunction attachRedirectHandlers(root: Element): void {\n root.querySelectorAll<HTMLElement>(\"[as-redirect]\").forEach((el) => {\n if (el.dataset.asRedirectBound === \"true\") return;\n\n el.addEventListener(\"click\", (event) => {\n if (event.defaultPrevented) return;\n\n const trigger = event.currentTarget as HTMLElement;\n\n // Let the step engine manage elements that also advance the survey\n if (trigger.hasAttribute(\"as-next\")) {\n log.debug(\"[redirect] Skipping auto-click handler because element also has [as-next]\");\n return;\n }\n\n event.preventDefault();\n\n const stepEl = trigger.closest(\"[as-step]\");\n const stepId = getStepIdFromElement(stepEl);\n\n if (!stepId) {\n log.warn(\"[redirect] Could not resolve step for redirect trigger:\", describe(trigger));\n return;\n }\n\n void (async () => {\n if (shouldValidateRedirect(trigger, stepEl)) {\n const isValid = await validateStep(stepId);\n if (!isValid) {\n log.debug(\"[redirect] Validation failed, aborting redirect click\");\n return;\n }\n }\n\n await handleRedirect(stepId, trigger);\n })();\n });\n\n el.dataset.asRedirectBound = \"true\";\n });\n}\n\nexport async function handleRedirect(stepId: string, source?: Element | null): Promise<void> {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") return;\n\n const stepEl = document.querySelector(`[as-step=\"${stepId}\"]`);\n const sourceEl = source instanceof Element ? source : null;\n\n const selection = resolveRedirectSelection(stepEl, sourceEl);\n\n // Always send final submission when reaching the end of the survey\n await sendFinal(stepId);\n\n if (!selection) {\n log.debug(\"[redirect] No redirect configured, final submission sent\");\n return;\n }\n\n const url = buildRedirectUrl(\n selection.url,\n selection.preserveUtm,\n selection.includeSession,\n sessionStore.get().id\n );\n\n log.debug(\"[redirect] Redirecting via %s to: %s\", selection.source, url);\n\n if (selection.useReplace) {\n window.location.replace(url);\n return;\n }\n\n window.location.assign(url);\n}\n\nexport function buildRedirectUrl(\n base: string,\n preserveUtm: boolean,\n includeSession: boolean,\n sessionId?: string\n): string {\n if (typeof window === \"undefined\") return base;\n\n const url = new URL(base, window.location.origin);\n\n // Preserve UTM parameters from current page\n if (preserveUtm) {\n const params = new URLSearchParams(window.location.search);\n params.forEach((val, key) => {\n if (!val) return;\n if (key.toLowerCase().startsWith(\"utm\")) {\n url.searchParams.set(key, val);\n }\n });\n }\n\n // Include session ID in redirect URL\n if (includeSession && sessionId) {\n url.searchParams.set(\"sessionId\", sessionId);\n }\n\n return url.toString();\n}\n\nfunction readBooleanAttr(el: Element | null | undefined, name: string): boolean | null {\n if (!el || !el.hasAttribute(name)) return null;\n const value = el.getAttribute(name);\n if (!value) return true;\n const normalized = value.trim().toLowerCase();\n if ([\"false\", \"0\", \"off\", \"no\"].includes(normalized)) return false;\n return true;\n}\n\nfunction resolveRedirectSelection(\n stepEl: Element | null,\n sourceEl: Element | null\n): RedirectSelection | null {\n const answers = sessionStore.get().answers;\n\n const mapAttr =\n sourceEl?.getAttribute(\"as-redirect-map\") ?? stepEl?.getAttribute(\"as-redirect-map\");\n\n if (mapAttr) {\n const mapRule = evaluateRedirectMap(mapAttr, answers);\n if (mapRule) {\n return {\n url: mapRule.to,\n preserveUtm: mapRule.preserveUtm ?? true,\n includeSession: mapRule.includeSession ?? false,\n useReplace: mapRule.replace ?? false,\n source: \"map\",\n };\n }\n log.debug(\"[redirect] Redirect map evaluated with no matching rule, falling back to attribute\");\n }\n\n const url = sourceEl?.getAttribute(\"as-redirect\") ?? stepEl?.getAttribute(\"as-redirect\");\n if (!url) return null;\n\n return {\n url,\n preserveUtm: resolveBooleanPreference(\"as-redirect-preserve-utm\", sourceEl, stepEl, true),\n includeSession: resolveBooleanPreference(\n \"as-redirect-include-session\",\n sourceEl,\n stepEl,\n false\n ),\n useReplace: resolveBooleanPreference(\"as-redirect-replace\", sourceEl, stepEl, false),\n source: \"attribute\",\n };\n}\n\nfunction resolveBooleanPreference(\n attr: string,\n primary: Element | null,\n fallback: Element | null,\n defaultValue: boolean\n): boolean {\n const resolved = readBooleanAttr(primary, attr) ?? readBooleanAttr(fallback, attr);\n return resolved ?? defaultValue;\n}\n\nfunction evaluateRedirectMap(\n json: string,\n answers: Record<string, unknown>\n): RedirectMapRule | null {\n try {\n const parsed = JSON.parse(json) as RedirectMapRule[] | RedirectMapRule;\n\n if (!Array.isArray(parsed)) {\n log.warn(\"[redirect] as-redirect-map must be an array of rules\");\n return null;\n }\n\n for (const rule of parsed) {\n if (!rule || typeof rule.to !== \"string\" || rule.to.trim() === \"\") {\n log.warn(\"[redirect] Redirect map rule missing a 'to' URL, skipping\");\n continue;\n }\n\n if (!rule.if || evaluatePredicate(rule.if, answers)) {\n return rule;\n }\n }\n } catch (error) {\n log.error(\"[redirect] Invalid as-redirect-map JSON:\", error);\n }\n\n return null;\n}\n\nfunction shouldValidateRedirect(sourceEl: Element | null, stepEl: Element | null): boolean {\n const result =\n readBooleanAttr(sourceEl, \"as-redirect-validate\") ??\n readBooleanAttr(stepEl, \"as-redirect-validate\");\n\n // Validation is enabled by default for redirects\n return result ?? true;\n}\n\nfunction getStepIdFromElement(stepEl: Element | null): string | null {\n if (stepEl?.hasAttribute(\"as-step\")) {\n return stepEl.getAttribute(\"as-step\");\n }\n\n const current = stepsStore.get().current;\n return current || null;\n}\n\nfunction describe(el: Element): string {\n const id = el.getAttribute(\"id\");\n const step = el.closest(\"[as-step]\")?.getAttribute(\"as-step\");\n return `<${el.tagName.toLowerCase()}${id ? `#${id}` : \"\"}${step ? ` step=\"${step}\"` : \"\"}>`;\n}\n","import log from \"loglevel\";\nimport { getStepPosition } from \"@/features/steps\";\nimport type { QuestionMetrics } from \"@/types\";\n\nconst questionMetrics = new Map<string, QuestionMetrics>();\n\nexport function initBasin(root: Element): void {\n const endpoint = getBasinEndpointFromMeta();\n if (!endpoint) {\n log.debug(\"[basin] No endpoint found in meta tag, skipping Basin integration\");\n return;\n }\n\n recordQuestionMetrics(root);\n\n // Send beacon on unload (draft mode)\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", () => {\n const formData = collectFormData();\n formData.set(\"basinjsdraft\", \"true\");\n navigator.sendBeacon(endpoint, formData);\n });\n }\n\n log.debug(\"[basin] Initialized with endpoint:\", endpoint);\n}\n\nexport function getBasinEndpointFromMeta(): string {\n if (typeof document === \"undefined\") return \"\";\n\n // Check for meta tag first (preferred method)\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"as:basin-endpoint\"]');\n if (meta?.content) return meta.content;\n\n // Fallback: Check for custom attribute on body or root element\n const body = document.body;\n if (body?.hasAttribute(\"as-basin-endpoint\")) {\n return body.getAttribute(\"as-basin-endpoint\") || \"\";\n }\n\n return \"\";\n}\n\nexport async function fetchBasinJWT(endpoint: string): Promise<string> {\n if (typeof window === \"undefined\") return \"\";\n\n const cached = window.localStorage.getItem(\"as:basin-jwt\");\n if (cached) return cached;\n\n try {\n const res = await fetch(`${endpoint}/generate_jwt`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n });\n\n if (!res.ok) {\n log.warn(\"[basin] JWT endpoint returned\", res.status, \"- multistep may not be supported\");\n return \"\";\n }\n\n const data = (await res.json()) as { jwt: string };\n if (data.jwt) {\n window.localStorage.setItem(\"as:basin-jwt\", data.jwt);\n return data.jwt;\n }\n return \"\";\n } catch (error) {\n log.warn(\"[basin] Failed to fetch JWT (multistep may not be supported):\", error);\n return \"\";\n }\n}\n\nexport async function sendPartial(stepId: string): Promise<void> {\n const endpoint = getBasinEndpointFromMeta();\n if (!endpoint) {\n log.warn(\"[basin] No endpoint, skipping partial submission\");\n return;\n }\n\n const jwt = await fetchBasinJWT(endpoint);\n const formData = collectFormData();\n\n // Add Basin multistep metadata (matching Basin.js naming)\n if (jwt) {\n formData.append(\"basinjwt\", jwt);\n }\n formData.append(\"basinjsmultistep\", \"true\");\n formData.append(\"basinjsdraft\", \"true\");\n\n // Calculate actual step position (not navigation history length)\n const stepNumber = getStepPosition(stepId);\n formData.append(\"basinjsstep\", String(stepNumber));\n\n // Debug: Log what we're sending\n if (log.getLevel() <= log.levels.DEBUG) {\n log.debug(`[basin] Sending partial submission for step: ${stepId}`);\n const entries: string[] = [];\n formData.forEach((value, key) => {\n entries.push(` ${key}: ${typeof value === \"string\" ? value.substring(0, 100) : \"[File]\"}`);\n });\n log.debug(`[basin] FormData contents:\\n${entries.join(\"\\n\")}`);\n }\n\n try {\n const res = await fetch(endpoint, {\n method: \"POST\",\n body: formData,\n keepalive: true,\n });\n\n if (!res.ok) {\n log.warn(\"[basin] Partial submission failed with status:\", res.status);\n return;\n }\n\n log.debug(\"[basin] Sent partial submission for step:\", stepId);\n } catch (error) {\n log.error(\"[basin] Failed to send partial submission:\", error);\n }\n}\n\nexport async function sendFinal(stepId: string): Promise<void> {\n const endpoint = getBasinEndpointFromMeta();\n if (!endpoint) {\n log.warn(\"[basin] No endpoint, skipping final submission\");\n return;\n }\n\n const jwt = await fetchBasinJWT(endpoint);\n const formData = collectFormData();\n\n // Add Basin multistep metadata (matching Basin.js naming)\n if (jwt) {\n formData.append(\"basinjwt\", jwt);\n }\n formData.append(\"basinjsmultistep\", \"true\");\n formData.append(\"basinjsdraft\", \"false\");\n\n try {\n await fetch(endpoint, { method: \"POST\", body: formData, keepalive: true });\n log.debug(\"[basin] Sent final submission for step:\", stepId);\n } catch (error) {\n log.error(\"[basin] Failed to send final submission:\", error);\n }\n}\n\nexport function collectFormData(): FormData {\n const formData = new FormData();\n\n // Collect current form field values from the DOM (like Basin.js does with new FormData(form))\n if (typeof document !== \"undefined\") {\n const allInputs = document.querySelectorAll<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >('input[name]:not([type=\"file\"]), textarea[name], select[name]');\n\n allInputs.forEach((input) => {\n const name = input.name;\n if (!name) return;\n\n // Handle different input types\n if (input instanceof HTMLInputElement) {\n if (input.type === \"checkbox\") {\n if (input.checked) {\n formData.append(name, input.value || \"on\");\n }\n } else if (input.type === \"radio\") {\n if (input.checked) {\n formData.append(name, input.value);\n }\n } else {\n if (input.value) {\n formData.append(name, input.value);\n }\n }\n } else if (input instanceof HTMLTextAreaElement || input instanceof HTMLSelectElement) {\n if (input.value) {\n formData.append(name, input.value);\n }\n }\n });\n\n // Add files separately\n const fileInputs = document.querySelectorAll<HTMLInputElement>('input[type=\"file\"][name]');\n addFilesToFormData(formData, fileInputs);\n }\n\n // Add Basin-compatible metadata (using Basin's naming convention)\n formData.append(\"frombasinjs\", \"false\"); // We're Agera, not Basin.js\n formData.append(\"agera_version\", \"0.1.1\");\n\n // Add UTM params\n if (typeof window !== \"undefined\") {\n const params = new URLSearchParams(window.location.search);\n [\"source\", \"medium\", \"campaign\", \"term\", \"content\"].forEach((key) => {\n const val = params.get(`utm_${key}`);\n if (val) formData.append(`utm_${key}`, val);\n });\n }\n\n return formData;\n}\n\nexport function recordQuestionMetrics(root: Element): void {\n const inputs = root.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\n \"input, textarea, select\"\n );\n\n inputs.forEach((input) => {\n if (!input.name) return;\n\n questionMetrics.set(input.name, { displayedAt: new Date() });\n\n input.addEventListener(\n \"focus\",\n () => {\n const metrics = questionMetrics.get(input.name);\n if (metrics && !metrics.firstFocusedAt) {\n metrics.firstFocusedAt = new Date();\n }\n },\n { once: true }\n );\n\n input.addEventListener(\"input\", () => {\n const metrics = questionMetrics.get(input.name);\n if (metrics) {\n if (!metrics.firstAnsweredAt) {\n metrics.firstAnsweredAt = new Date();\n }\n metrics.lastEditedAt = new Date();\n }\n });\n });\n}\n\nexport function addFilesToFormData(\n formData: FormData,\n fileInputs: NodeListOf<HTMLInputElement>\n): void {\n fileInputs.forEach((input) => {\n if (input.files && input.name) {\n Array.from(input.files).forEach((file) => {\n formData.append(input.name, file);\n });\n }\n });\n}\n","import { stepsStore } from \"@/core/stores\";\n\nexport function attachKeyboardHandlers(): void {\n document.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" && e.target instanceof HTMLInputElement) {\n const nextBtn = document.querySelector(`[as-step=\"${stepsStore.get().current}\"] [as-next]`);\n if (nextBtn instanceof HTMLElement) {\n e.preventDefault();\n nextBtn.click();\n }\n }\n });\n}\n\n","import { ensureAriaLiveRegion } from \"@/core/utils\";\n\nexport function announceAria(message: string): void {\n const region = ensureAriaLiveRegion();\n region.textContent = message;\n}\n\nexport function focusFirstInteractive(el: HTMLElement): void {\n const firstInput = el.querySelector<HTMLElement>(\"input, textarea, select, button\");\n if (firstInput) {\n setTimeout(() => firstInput.focus(), 100);\n }\n}\n\n","import log from \"loglevel\";\nimport { setupRadioOtherInput } from \"./radio-other-input\";\nimport { setupPhoneFormatting } from \"./phone-format\";\n\n/**\n * Initialize interactive components within the given root element.\n * Currently sets up \"other\" radio inputs and phone formatting helpers.\n */\nexport function initComponents(root: Element): void {\n setupRadioOtherInput(root);\n setupPhoneFormatting(root);\n log.debug(\"[components] Initialized\");\n}\n\n// Re-export individual setup functions for granular control\nexport { setupRadioOtherInput } from \"./radio-other-input\";\nexport { setupPhoneFormatting } from \"./phone-format\";\n","import log from \"loglevel\";\nimport {\n getStepScope,\n isBooleanLikeString,\n findRadiosByGroup,\n isRadioGroupRequired,\n parseValidationRules,\n hasValidationRule,\n setValidationRules,\n} from \"./helpers\";\n\n/**\n * Links text inputs to \"other\" radio buttons, allowing users to provide custom values.\n * Handles validation, value syncing, and auto-selection of the \"other\" radio.\n */\nexport function setupRadioOtherInput(container?: Element): void {\n const root = container || document;\n root.querySelectorAll(\"[as-radio-other-input]\").forEach((input) => {\n const inputEl = input as HTMLInputElement;\n const stepRoot = getStepScope(inputEl, root);\n\n // Resolve group name and the corresponding \"other\" radio\n let groupName = input.getAttribute(\"as-radio-other-input\") || \"\";\n let otherRadio: HTMLInputElement | null = null;\n\n // Treat \"true\", \"false\", empty string as \"no explicit group name\"\n if (isBooleanLikeString(groupName)) {\n groupName = \"\";\n }\n\n if (groupName) {\n otherRadio = findOtherRadioByGroupName(stepRoot, groupName);\n if (otherRadio) {\n groupName = otherRadio.name; // Use actual casing from DOM\n }\n } else {\n otherRadio = findClosestOtherRadio(inputEl, stepRoot);\n if (otherRadio) groupName = otherRadio.name;\n }\n\n if (!otherRadio || !groupName) {\n log.debug(\"[components:radio-other-input] 'other' radio not found near input\", inputEl);\n return;\n }\n\n // Get all radios in the resolved group (scoped to step)\n const allRadios = findRadiosByGroup(stepRoot, groupName);\n\n // Configure the input element\n setupOtherInput(inputEl, otherRadio, allRadios);\n });\n log.debug(\"[components:radio-other-input] Initialized\");\n}\n\n/**\n * Find \"other\" radio by group name (case-insensitive)\n */\nfunction findOtherRadioByGroupName(scope: Element, groupName: string): HTMLInputElement | null {\n const allOtherRadios = scope.querySelectorAll<HTMLInputElement>(\n 'input[type=\"radio\"][value=\"other\"]'\n );\n for (const radio of allOtherRadios) {\n if (radio.name.toLowerCase() === groupName.toLowerCase()) {\n return radio;\n }\n }\n return null;\n}\n\n/**\n * Find the closest \"other\" radio by traversing up the DOM tree\n */\nfunction findClosestOtherRadio(\n inputEl: HTMLInputElement,\n stepRoot: Element\n): HTMLInputElement | null {\n let current: Element | null = inputEl.parentElement;\n while (current && current !== stepRoot.parentElement) {\n const candidate = current.querySelector<HTMLInputElement>('input[type=\"radio\"][value=\"other\"]');\n if (candidate) return candidate;\n current = current.parentElement;\n }\n return stepRoot.querySelector<HTMLInputElement>('input[type=\"radio\"][value=\"other\"]');\n}\n\n/**\n * Configure a text input to work with an \"other\" radio button\n */\nfunction setupOtherInput(\n inputEl: HTMLInputElement,\n otherRadio: HTMLInputElement,\n allRadios: NodeListOf<HTMLInputElement>\n): void {\n // Ensure the text input is not named; mirror its value into the 'other' radio value\n inputEl.removeAttribute(\"name\");\n\n // Preserve original validation attributes for conditional toggling\n const originalAsValidate = inputEl.getAttribute(\"as-validate\");\n const originalRequired = inputEl.hasAttribute(\"required\");\n const originalHasRequiredRule = hasValidationRule(originalAsValidate, \"required\");\n\n // Determine if the group should enforce required when \"other\" is selected\n const groupHasRequired = isRadioGroupRequired(allRadios);\n const hasOtherRequiredAttr = inputEl.hasAttribute(\"as-radio-other-required\");\n const enforceRequired = groupHasRequired || hasOtherRequiredAttr;\n\n // Keep radio's value synced to text input\n const syncOtherValue = (): void => {\n const v = inputEl.value.trim();\n otherRadio.value = v || \"other\";\n };\n\n // Toggle conditional required on the text input (runtime + native)\n const applyConditionalRequired = (): void => {\n if (!enforceRequired) return;\n\n if (otherRadio.checked) {\n const base = parseValidationRules(originalAsValidate);\n if (!base.includes(\"required\")) base.push(\"required\");\n setValidationRules(inputEl, base);\n inputEl.setAttribute(\"required\", \"\");\n } else {\n if (originalAsValidate !== null) {\n if (originalHasRequiredRule) {\n inputEl.setAttribute(\"as-validate\", originalAsValidate);\n } else {\n const cur = parseValidationRules(inputEl.getAttribute(\"as-validate\")).filter(\n (r) => r !== \"required\"\n );\n setValidationRules(inputEl, cur);\n }\n } else {\n const cur = parseValidationRules(inputEl.getAttribute(\"as-validate\")).filter(\n (r) => r !== \"required\"\n );\n setValidationRules(inputEl, cur);\n }\n if (!originalRequired) inputEl.removeAttribute(\"required\");\n }\n };\n\n // Listen to changes on all radios in the group\n allRadios.forEach((radio) => {\n radio.addEventListener(\"change\", () => {\n if (radio === otherRadio && otherRadio.checked) {\n syncOtherValue();\n setTimeout(() => {\n inputEl.focus();\n }, 0);\n }\n applyConditionalRequired();\n });\n });\n\n // When input is clicked or focused, select the \"other\" radio\n const ensureOtherSelected = (): void => {\n if (!otherRadio.checked) {\n otherRadio.checked = true;\n otherRadio.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n };\n inputEl.addEventListener(\"click\", ensureOtherSelected);\n inputEl.addEventListener(\"focus\", ensureOtherSelected);\n inputEl.addEventListener(\"input\", syncOtherValue);\n inputEl.addEventListener(\"change\", syncOtherValue);\n inputEl.addEventListener(\"blur\", syncOtherValue);\n\n // Initialize state\n syncOtherValue();\n applyConditionalRequired();\n}\n","/**\n * Shared helper utilities for component setup functions\n */\n\n/**\n * Find the closest element with [as-step] attribute or return the root\n */\nexport function getStepScope(element: Element, fallback: Element | Document = document): Element {\n return (element.closest(\"[as-step]\") as Element) || (fallback as Element);\n}\n\n/**\n * Parse validation rules from as-validate attribute\n */\nexport function parseValidationRules(attributeValue: string | null): string[] {\n if (!attributeValue) return [];\n return attributeValue\n .split(\"|\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/**\n * Check if a validation rule is present in the rules string\n */\nexport function hasValidationRule(attributeValue: string | null, rule: string): boolean {\n return parseValidationRules(attributeValue).includes(rule);\n}\n\n/**\n * Check if any radio in a group has a required validation rule\n */\nexport function isRadioGroupRequired(\n radios: NodeListOf<HTMLInputElement> | HTMLInputElement[]\n): boolean {\n return Array.from(radios).some((radio) =>\n hasValidationRule(radio.getAttribute(\"as-validate\"), \"required\")\n );\n}\n\n/**\n * Treat \"true\", \"false\", or empty string as \"no explicit value\"\n */\nexport function isBooleanLikeString(value: string): boolean {\n return [\"true\", \"false\", \"\"].includes(value.toLowerCase());\n}\n\n/**\n * Find a radio button by value within a scope\n */\nexport function findRadioByValue(\n scope: Element | Document,\n value: string,\n groupName?: string\n): HTMLInputElement | null {\n const selector = groupName\n ? `input[type=\"radio\"][name=\"${groupName}\"][value=\"${value}\"]`\n : `input[type=\"radio\"][value=\"${value}\"]`;\n return scope.querySelector<HTMLInputElement>(selector);\n}\n\n/**\n * Find all radios in a group within a scope\n */\nexport function findRadiosByGroup(\n scope: Element | Document,\n groupName: string\n): NodeListOf<HTMLInputElement> {\n return scope.querySelectorAll<HTMLInputElement>(`input[type=\"radio\"][name=\"${groupName}\"]`);\n}\n\n/**\n * Set or remove validation rules on an input\n */\nexport function setValidationRules(input: HTMLInputElement, rules: string[]): void {\n if (rules.length > 0) {\n input.setAttribute(\"as-validate\", rules.join(\"|\"));\n } else {\n input.removeAttribute(\"as-validate\");\n }\n}\n\n/**\n * Add a validation rule if not already present\n */\nexport function addValidationRule(input: HTMLInputElement, rule: string): void {\n const current = parseValidationRules(input.getAttribute(\"as-validate\"));\n if (!current.includes(rule)) {\n current.push(rule);\n }\n setValidationRules(input, current);\n}\n\n/**\n * Remove a validation rule if present\n */\nexport function removeValidationRule(input: HTMLInputElement, rule: string): void {\n const current = parseValidationRules(input.getAttribute(\"as-validate\"));\n const filtered = current.filter((r) => r !== rule);\n setValidationRules(input, filtered);\n}\n\n/**\n * Get an attribute value that may be on the element itself OR on a parent label.\n * This handles Webflow patterns where attributes are placed on wrapper labels.\n */\nexport function getAttributeFromElementOrLabel(element: Element, attrName: string): string | null {\n // First check the element directly\n const direct = element.getAttribute(attrName);\n if (direct !== null) return direct;\n\n // Check parent label (for inputs wrapped in labels)\n const parentLabel = element.closest(\"label\");\n if (parentLabel) {\n return parentLabel.getAttribute(attrName);\n }\n\n return null;\n}\n\ntype FormInput = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n/**\n * Find all elements with an attribute, including inputs whose parent labels have it.\n * Returns pairs of { attrElement, input } for processing.\n */\nexport function findElementsWithAttribute(\n root: Element,\n attrName: string,\n inputSelector: string = \"input, select, textarea\"\n): Array<{ attrElement: Element; input: FormInput }> {\n const results: Array<{ attrElement: Element; input: FormInput }> = [];\n const seen = new Set<Element>();\n\n // Build selector with attribute for each input type (e.g., \"input[as-weight], select[as-weight]\")\n const inputWithAttrSelector = inputSelector\n .split(\",\")\n .map((s) => `${s.trim()}[${attrName}]`)\n .join(\", \");\n\n // Direct matches on inputs\n root.querySelectorAll<FormInput>(inputWithAttrSelector).forEach((input) => {\n if (!seen.has(input)) {\n seen.add(input);\n results.push({ attrElement: input, input });\n }\n });\n\n // Labels with the attribute containing inputs\n root.querySelectorAll<HTMLLabelElement>(`label[${attrName}]`).forEach((label) => {\n const input = label.querySelector<FormInput>(inputSelector);\n if (input && !seen.has(input)) {\n seen.add(input);\n results.push({ attrElement: label, input });\n }\n });\n\n return results;\n}\n","import log from \"loglevel\";\nimport {\n getParsePhoneNumberFromString,\n getAsYouType,\n getGetCountryCallingCode,\n} from \"../utils/phone-lib\";\n\n/**\n * Sets up automatic phone number formatting for inputs with [as-phone-format] attribute.\n * Supports country-specific formatting, auto-prefill of country codes, and real-time formatting.\n */\nexport function setupPhoneFormatting(container?: Element): void {\n const root = container || document;\n root.querySelectorAll<HTMLInputElement>(\"[as-phone-format]\").forEach((input) => {\n const region = input.getAttribute(\"as-phone-region\") || undefined;\n const format = input.getAttribute(\"as-phone-format\") || \"INTERNATIONAL\";\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let asYouTypeInstance: any = null;\n let hasPrefilled = false;\n\n // Initialize AsYouType instance\n void initializeAsYouType(region).then((instance) => {\n asYouTypeInstance = instance;\n });\n\n // On focus: prefill with country code if field is empty\n input.addEventListener(\"focus\", () => {\n void handlePhoneFocus(input, format, region, hasPrefilled, (value) => {\n hasPrefilled = value;\n });\n });\n\n // Real-time formatting as user types using AsYouType\n input.addEventListener(\"input\", () => {\n void handlePhoneInput(input, region, asYouTypeInstance, (instance) => {\n asYouTypeInstance = instance;\n });\n });\n\n // On blur: validate and clean up formatting\n input.addEventListener(\"blur\", () => {\n void handlePhoneBlur(input, format, region);\n });\n });\n log.debug(\"[components:phone-format] Initialized\");\n}\n\n/**\n * Initialize AsYouType instance for real-time formatting\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function initializeAsYouType(region: string | undefined): Promise<any> {\n try {\n const AsYouType = await getAsYouType();\n if (!AsYouType) return null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new AsYouType(region as any);\n } catch (error) {\n log.warn(\"[components:phone-format] Failed to initialize AsYouType:\", error);\n return null;\n }\n}\n\n/**\n * Handle focus event: prefill country code for INTERNATIONAL format\n */\nasync function handlePhoneFocus(\n input: HTMLInputElement,\n format: string,\n region: string | undefined,\n hasPrefilled: boolean,\n setHasPrefilled: (value: boolean) => void\n): Promise<void> {\n // Only prefill once and if field is empty\n if (hasPrefilled || input.value.trim()) {\n log.debug(\"[components:phone-format] Skipping prefill - already prefilled or has value\");\n return;\n }\n\n try {\n log.debug(\n \"[components:phone-format] Focus handler triggered, format:\",\n format,\n \"region:\",\n region\n );\n\n // Only prefill for INTERNATIONAL format\n if (format.toUpperCase() !== \"INTERNATIONAL\") {\n log.debug(\"[components:phone-format] Format is not INTERNATIONAL, skipping prefill\");\n return;\n }\n\n if (!region) {\n log.debug(\"[components:phone-format] No region specified, skipping prefill\");\n return;\n }\n\n log.debug(\"[components:phone-format] Loading phone library...\");\n const getCountryCallingCode = await getGetCountryCallingCode();\n if (!getCountryCallingCode) {\n log.warn(\"[components:phone-format] Phone library not available\");\n return;\n }\n\n // Double-check field is still empty (user might have started typing)\n if (input.value.trim()) {\n log.debug(\"[components:phone-format] Field now has value, skipping prefill\");\n return;\n }\n\n log.debug(\"[components:phone-format] Getting calling code for region:\", region);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const callingCode = getCountryCallingCode(region as any);\n log.debug(\"[components:phone-format] Calling code:\", callingCode);\n\n if (callingCode) {\n input.value = \"+\" + callingCode + \" \";\n setHasPrefilled(true);\n log.debug(\"[components:phone-format] Prefilled country code:\", input.value);\n // Move cursor to end\n input.setSelectionRange(input.value.length, input.value.length);\n } else {\n log.warn(\"[components:phone-format] Could not get calling code for region:\", region);\n }\n } catch (error) {\n log.error(\"[components:phone-format] Failed to prefill country code:\", error);\n }\n}\n\n/**\n * Handle input event: format phone number in real-time as user types\n */\nasync function handlePhoneInput(\n input: HTMLInputElement,\n region: string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n asYouTypeInstance: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setAsYouTypeInstance: (instance: any) => void\n): Promise<void> {\n try {\n if (!asYouTypeInstance) {\n const instance = await initializeAsYouType(region);\n if (!instance) return;\n setAsYouTypeInstance(instance);\n asYouTypeInstance = instance;\n }\n\n const cursorPosition = input.selectionStart || 0;\n const value = input.value;\n\n // Reset and re-input the entire value to get proper formatting\n asYouTypeInstance.reset();\n const formatted = asYouTypeInstance.input(value);\n\n // Only update if formatting changed\n if (formatted !== value) {\n input.value = formatted;\n\n // Try to preserve cursor position after formatting\n // Adjust cursor position based on how many formatting characters were added/removed\n const diff = formatted.length - value.length;\n const newPosition = Math.max(0, Math.min(cursorPosition + diff, formatted.length));\n input.setSelectionRange(newPosition, newPosition);\n }\n } catch (error) {\n log.warn(\"[components:phone-format] Failed to auto-format phone number:\", error);\n }\n}\n\n/**\n * Handle blur event: validate and apply final formatting\n */\nasync function handlePhoneBlur(\n input: HTMLInputElement,\n format: string,\n region: string | undefined\n): Promise<void> {\n try {\n const value = input.value.trim();\n if (!value) return;\n\n const parsePhoneNumberFromString = await getParsePhoneNumberFromString();\n if (!parsePhoneNumberFromString) return;\n\n // Try to parse without region first (to detect country from number)\n let parsed = parsePhoneNumberFromString(value);\n\n // If that didn't work and we have a region, try with region as fallback\n if (!parsed && region) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parsed = parsePhoneNumberFromString(value, region as any);\n }\n\n // Only update if the number is valid and we want a specific format\n if (parsed && parsed.isValid && parsed.isValid()) {\n const formatted = formatPhoneNumber(parsed, format, value);\n input.value = formatted;\n }\n } catch (error) {\n log.warn(\"[components:phone-format] Failed to format phone number on blur:\", error);\n }\n}\n\n/**\n * Format phone number based on the specified format\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction formatPhoneNumber(parsed: any, format: string, fallback: string): string {\n switch (format.toUpperCase()) {\n case \"E164\":\n // E164 format: no spaces, just +[country code][number]\n return parsed.format ? (parsed.format(\"E.164\") as string) : fallback;\n case \"NATIONAL\":\n // National format: use country-specific formatting\n return parsed.formatNational ? (parsed.formatNational() as string) : fallback;\n case \"INTERNATIONAL\":\n default:\n // Keep AsYouType formatting (international with spaces)\n // Only update if current value is not properly formatted\n if (parsed.formatInternational) {\n const properFormat = parsed.formatInternational() as string;\n // Only update if significantly different (not just whitespace)\n if (fallback.replace(/\\s/g, \"\") === properFormat.replace(/\\s/g, \"\")) {\n return properFormat;\n }\n }\n return fallback;\n }\n}\n","import log from \"loglevel\";\nimport { stepsStore } from \"@/core/stores\";\n\nexport function initProgress(_root: Element): void {\n stepsStore.subscribe(() => updateProgress());\n updateProgress(); // Initial render\n log.debug(\"[progress] Initialized\");\n}\n\nexport function updateProgress(): void {\n if (typeof document === \"undefined\") return;\n\n const { current } = stepsStore.get();\n const steps = Array.from(document.querySelectorAll(\"[as-step]\"));\n const total = steps.length;\n const currentIdx = steps.findIndex((el) => el.getAttribute(\"as-step\") === current);\n\n // Bar mode\n document.querySelectorAll('[as-progress=\"bar\"]').forEach((el) => {\n let bar = el.querySelector<HTMLElement>(\".as-progress-bar\");\n if (!bar) {\n bar = document.createElement(\"div\");\n bar.className = \"as-progress-bar\";\n el.appendChild(bar);\n }\n bar.style.width = `${((currentIdx + 1) / total) * 100}%`;\n });\n\n // Fraction mode\n document.querySelectorAll('[as-progress=\"fraction\"]').forEach((el) => {\n el.textContent = `${currentIdx + 1} / ${total}`;\n });\n\n // Steps mode\n document.querySelectorAll('[as-progress=\"steps\"]').forEach((el) => {\n el.innerHTML = steps\n .map((_, idx) => {\n const status = idx < currentIdx ? \"completed\" : idx === currentIdx ? \"current\" : \"pending\";\n return `<span class=\"as-step-dot ${status}\"></span>`;\n })\n .join(\"\");\n });\n}\n","import log from \"loglevel\";\nimport { sessionStore } from \"@/core/stores\";\nimport { findElementsWithAttribute } from \"@/features/components/helpers\";\nimport type { QuizResults } from \"@/types\";\n\n/**\n * Initialize quiz mode if [as-quiz] is present on the survey root.\n * Sets up answer tracking and score calculation.\n */\nexport function initQuiz(root: Element): void {\n if (!root.hasAttribute(\"as-quiz\")) {\n log.debug(\"[quiz] Quiz mode not enabled\");\n return;\n }\n\n log.info(\"[quiz] Initializing quiz mode\");\n\n // Initial calculation\n updateQuizScores(root);\n\n // Listen for answer changes\n attachAnswerListeners(root);\n\n // Subscribe to display elements\n updateQuizDisplayElements();\n\n // Re-update display elements when session changes\n sessionStore.subscribe(() => {\n updateQuizDisplayElements();\n });\n\n log.debug(\"[quiz] Quiz mode initialized\");\n}\n\n/**\n * Attach change listeners to all inputs to trigger score recalculation\n */\nfunction attachAnswerListeners(root: Element): void {\n const inputs = root.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n \"input, select, textarea\"\n );\n\n inputs.forEach((input) => {\n input.addEventListener(\"change\", () => {\n log.debug(\"[quiz] Answer changed, recalculating scores\");\n updateQuizScores(root);\n });\n });\n}\n\n/**\n * Calculate quiz scores based on current answers and as-weight attributes\n */\nfunction updateQuizScores(root: Element): void {\n const scores: Record<string, number> = {};\n\n // Find all weighted inputs (attribute may be on input or parent label)\n // Covers: radio, checkbox, text inputs, textareas, and selects\n const weightedElements = findElementsWithAttribute(root, \"as-weight\");\n\n weightedElements.forEach(({ attrElement, input }) => {\n const weightAttr = attrElement.getAttribute(\"as-weight\");\n if (!weightAttr) return;\n\n try {\n const weights = JSON.parse(weightAttr) as Record<string, number>;\n\n // Check if this input's value should contribute to scores\n const shouldCount = shouldInputContribute(input);\n\n if (shouldCount) {\n // Add weights to scores\n for (const [category, weight] of Object.entries(weights)) {\n if (typeof weight === \"number\" && weight > 0) {\n scores[category] = (scores[category] || 0) + weight;\n }\n }\n }\n } catch (error) {\n log.warn(\"[quiz] Invalid as-weight JSON:\", attrElement, error);\n }\n });\n\n // Also check option elements (for select dropdowns)\n const selectedOptions = root.querySelectorAll<HTMLOptionElement>(\"option[as-weight]:checked\");\n selectedOptions.forEach((option) => {\n const weightAttr = option.getAttribute(\"as-weight\");\n if (!weightAttr) return;\n\n try {\n const weights = JSON.parse(weightAttr) as Record<string, number>;\n for (const [category, weight] of Object.entries(weights)) {\n if (typeof weight === \"number\" && weight > 0) {\n scores[category] = (scores[category] || 0) + weight;\n }\n }\n } catch (error) {\n log.warn(\"[quiz] Invalid as-weight JSON on option:\", option, error);\n }\n });\n\n // Determine winner\n const results = calculateWinner(scores);\n\n // Update session store with quiz results\n const session = sessionStore.get();\n \n // Also add quiz results to answers for predicate resolution\n const updatedAnswers = {\n ...session.answers,\n __quiz__: results,\n };\n \n sessionStore.set({ \n ...session, \n quiz: results,\n answers: updatedAnswers,\n });\n\n log.debug(\"[quiz] Scores updated:\", results);\n}\n\n/**\n * Determine if an input's value should contribute to quiz scores\n */\nfunction shouldInputContribute(\n input: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n): boolean {\n // Radio buttons: only if checked\n if (input instanceof HTMLInputElement && input.type === \"radio\") {\n return input.checked;\n }\n\n // Checkboxes: only if checked\n if (input instanceof HTMLInputElement && input.type === \"checkbox\") {\n return input.checked;\n }\n\n // Select: check if this specific option is selected\n // This is handled separately in updateQuizScores via option[as-weight]:checked\n\n // Text inputs with as-radio-other-input: only count if associated radio is checked AND has value\n if (input instanceof HTMLInputElement && input.hasAttribute(\"as-radio-other-input\")) {\n const otherRadio = findAssociatedOtherRadio(input);\n return otherRadio?.checked === true && input.value.trim() !== \"\";\n }\n\n // Text inputs, textareas: always count if they have a value\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) {\n return input.value.trim() !== \"\";\n }\n\n // Select elements: count if value is selected\n if (input instanceof HTMLSelectElement) {\n return input.value !== \"\";\n }\n\n return false;\n}\n\n/**\n * Find the \"other\" radio associated with an as-radio-other-input text field\n */\nfunction findAssociatedOtherRadio(input: HTMLInputElement): HTMLInputElement | null {\n const groupAttr = input.getAttribute(\"as-radio-other-input\");\n const stepScope = input.closest(\"[as-step]\") || document;\n\n // If explicit group name provided, find by name attribute\n if (groupAttr && groupAttr !== \"\" && groupAttr !== \"true\") {\n const radios = Array.from(\n stepScope.querySelectorAll<HTMLInputElement>(`input[type=\"radio\"]`)\n ).filter((r) => r.name.toLowerCase() === groupAttr.toLowerCase());\n\n // Return the checked one, or the last one (typically \"other\" is last)\n return radios.find((r) => r.checked) || radios[radios.length - 1] || null;\n }\n\n // Find closest radio by traversing up DOM - the text input is typically\n // a sibling to the label containing the \"other\" radio\n let current: Element | null = input.parentElement;\n while (current && current !== stepScope) {\n const radio = current.querySelector<HTMLInputElement>('input[type=\"radio\"]');\n if (radio) return radio;\n current = current.parentElement;\n }\n\n return null;\n}\n\n/**\n * Calculate the winner from scores, handling ties\n */\nfunction calculateWinner(scores: Record<string, number>): QuizResults {\n const categories = Object.keys(scores);\n\n if (categories.length === 0) {\n return {\n scores: {},\n winner: null,\n winnerScore: 0,\n ties: [],\n };\n }\n\n // Find the highest score\n const maxScore = Math.max(...Object.values(scores));\n\n // Find all categories with the max score\n const winners = categories.filter((cat) => scores[cat] === maxScore);\n\n if (winners.length === 1) {\n return {\n scores,\n winner: winners[0]!,\n winnerScore: maxScore,\n ties: [],\n };\n }\n\n // Tie: use first category as winner (tiebreaker: \"first\")\n return {\n scores,\n winner: winners[0]!,\n winnerScore: maxScore,\n ties: winners,\n };\n}\n\n/**\n * Update all display elements with quiz results\n */\nfunction updateQuizDisplayElements(): void {\n const session = sessionStore.get();\n const quiz = session.quiz;\n\n if (!quiz) return;\n\n // Update category display elements\n document.querySelectorAll<HTMLElement>(\"[as-quiz-category]\").forEach((el) => {\n const categoryAttr = el.getAttribute(\"as-quiz-category\");\n if (!categoryAttr || categoryAttr === \"\" || categoryAttr === \"true\") {\n // No attribute value or \"true\": show winner category\n el.textContent = quiz.winner || \"\";\n } else {\n // Show if winner matches specific category\n el.textContent = quiz.winner === categoryAttr ? categoryAttr : \"\";\n }\n });\n\n // Update score display elements\n document.querySelectorAll<HTMLElement>(\"[as-quiz-score]\").forEach((el) => {\n const categoryAttr = el.getAttribute(\"as-quiz-score\");\n\n if (!categoryAttr || categoryAttr === \"\" || categoryAttr === \"true\") {\n // No attribute value or \"true\": show winner score\n el.textContent = String(quiz.winnerScore);\n } else if (categoryAttr === \"all\") {\n // Show all scores as JSON\n el.textContent = JSON.stringify(quiz.scores);\n } else {\n // Show specific category score\n const score = quiz.scores[categoryAttr] || 0;\n el.textContent = String(score);\n }\n });\n}\n\n/**\n * Public API: Get current quiz results\n */\nexport function getQuizResults(): QuizResults | null {\n const session = sessionStore.get();\n return session.quiz || null;\n}\n\n/**\n * Public API: Get current quiz scores\n */\nexport function getQuizScores(): Record<string, number> {\n const results = getQuizResults();\n return results?.scores || {};\n}\n\n/**\n * Public API: Get quiz winner\n */\nexport function getQuizWinner(): string | null {\n const results = getQuizResults();\n return results?.winner || null;\n}\n\n","import log from \"loglevel\";\n\nlet observer: MutationObserver | null = null;\nlet isInitComplete = false;\n\n/**\n * Inject CSS to hide steps before they paint (most reliable FOUC prevention).\n * Uses CSS sibling combinator to hide all steps except the first.\n */\nfunction injectPreCSS(): void {\n if (typeof document === \"undefined\") return;\n\n // Check if already injected\n if (document.getElementById(\"as-pre-css\")) return;\n\n const style = document.createElement(\"style\");\n style.id = \"as-pre-css\";\n // Hide all steps after the first using sibling combinator (~)\n // Do NOT force position/size; preserve Webflow's layout\n style.textContent =\n `[as-step]~[as-step]{display:none!important;}` +\n `[as-error-for]:not([data-as-error-active=\"true\"]){display:none;}`;\n\n // Insert at the very beginning of head (or create head if missing)\n const head =\n document.head || document.getElementsByTagName(\"head\")[0] || document.documentElement;\n head.insertBefore(style, head.firstChild);\n\n log.debug(\"[prehide] Injected pre-CSS to hide non-first steps\");\n}\n\n/**\n * Prehide all [as-step] elements before first paint to prevent FOUC.\n * Uses display:none to avoid layout stacking issues.\n * Caches original display values for later restoration.\n */\nexport function startPrehide(): void {\n if (typeof document === \"undefined\") return;\n\n // Inject CSS first for immediate FOUC prevention\n injectPreCSS();\n\n // Helper to prehide a single step (skip first step)\n function prehideStep(el: Element, index: number): void {\n const htmlEl = el as HTMLElement;\n\n // Skip the first step (index 0)\n if (index === 0) return;\n\n // Ensure hidden with display:none and accessibility attributes\n htmlEl.style.display = \"none\";\n htmlEl.setAttribute(\"aria-hidden\", \"true\");\n htmlEl.setAttribute(\"inert\", \"\");\n }\n\n // Prehide existing steps (except first)\n const steps = document.querySelectorAll(\"[as-step]\");\n steps.forEach((step, index) => prehideStep(step, index));\n\n if (steps.length > 0) {\n log.debug(`[prehide] Hidden ${steps.length - 1} non-first steps before paint`);\n }\n\n // Observe for dynamically added steps until init completes\n if (!observer && typeof MutationObserver !== \"undefined\") {\n observer = new MutationObserver((mutations) => {\n if (isInitComplete) return;\n\n for (const mutation of mutations) {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n // Check if the added node itself is a step\n // Dynamically added steps are always hidden (never the first step)\n if (el.hasAttribute(\"as-step\")) {\n prehideStep(el, 1); // Pass index > 0 to hide it\n }\n // Check descendants\n el.querySelectorAll(\"[as-step]\").forEach((step) => prehideStep(step, 1));\n }\n });\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n }\n}\n\n/**\n * Stop observing for new steps and remove pre-CSS (called after init completes).\n */\nexport function stopPrehide(): void {\n isInitComplete = true;\n if (observer) {\n observer.disconnect();\n observer = null;\n log.debug(\"[prehide] Observer stopped\");\n }\n\n // Remove the pre-CSS so inline styles can take over\n const preCSS = document.getElementById(\"as-pre-css\");\n if (preCSS) {\n preCSS.remove();\n log.debug(\"[prehide] Removed pre-CSS, inline styles now control visibility\");\n }\n}\n","import log from \"loglevel\";\n\n/**\n * Inject global CSS styles for runtime features\n */\nexport function injectRuntimeStyles(): void {\n if (typeof document === \"undefined\") return;\n\n // Check if already injected\n if (document.getElementById(\"as-runtime-css\")) return;\n\n const style = document.createElement(\"style\");\n style.id = \"as-runtime-css\";\n style.textContent = `\n /* Disabled elements styling */\n [as-disabled],\n [disabled][as-enable-if],\n [disabled][as-disable-if] {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n }\n \n /* Quiz display elements (optional styling hooks) */\n [as-quiz-category],\n [as-quiz-score] {\n /* Authors can override these in Webflow */\n }\n `;\n\n // Insert in head\n const head =\n document.head || document.getElementsByTagName(\"head\")[0] || document.documentElement;\n head.appendChild(style);\n\n log.debug(\"[styles] Injected runtime CSS\");\n}\n\n"],"mappings":"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","names":["import_loglevel","import_loglevel","import_loglevel","error","log","import_loglevel","log","observer","log","import_loglevel","import_loglevel","log","log","log","current","import_loglevel","import_loglevel","log","import_loglevel","log","log","import_loglevel","log","import_loglevel","log","import_loglevel","log","import_loglevel","log","log"]}