@syntrologie/runtime-sdk 2.10.0 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../adaptives/adaptive-content/dist/reconciliation-guard.js", "../../adaptives/adaptive-content/dist/sanitizer.js", "../../adaptives/adaptive-content/dist/runtime.js", "../../adaptives/adaptive-overlays/dist/celebrations/effects/confetti.js", "../../adaptives/adaptive-overlays/dist/celebrations/effects/emoji-rain.js", "../../adaptives/adaptive-overlays/dist/celebrations/effects/fireworks.js", "../../adaptives/adaptive-overlays/dist/celebrations/effects/sparkles.js", "../../adaptives/adaptive-overlays/dist/celebrations/engine.js", "../../adaptives/adaptive-overlays/dist/celebrations/index.js", "../../adaptives/adaptive-overlays/dist/executors/tour.js", "../../design-system/src/tokens/colors.ts", "../../adaptives/adaptive-overlays/dist/highlight.js", "../../adaptives/adaptive-overlays/dist/sanitizer.js", "../../adaptives/adaptive-overlays/dist/modal.js", "../../adaptives/adaptive-overlays/dist/tooltip.js", "../../adaptives/adaptive-overlays/dist/WorkflowWidget.js", "../../adaptives/adaptive-overlays/dist/WorkflowTracker.js", "../../adaptives/adaptive-overlays/dist/runtime.js", "../src/apps/AppContext.ts", "../src/apps/AppLoader.ts", "../src/apps/AppRegistry.ts", "../src/antiFlicker.ts", "../src/version.ts", "../src/types.ts", "../src/fetchers/mergeConfigs.ts", "../src/logger.ts", "../src/configFetcher.ts", "../src/events/registerConfigPredicates.ts", "../src/controller.ts", "../src/ShadowRootContext.tsx", "../src/events/types.ts", "../src/events/normalizers/canvas.ts", "../src/components/emojiToIcon.tsx", "../src/notifications/NotificationToastStack.tsx", "../src/notifications/types.ts", "../src/notifications/matcher.ts", "../src/notifications/useNotifications.ts", "../src/notifications/useNotifyWatcher.ts", "../src/RuntimeProvider.tsx", "../src/components/TileCard.tsx", "../src/components/TileIcon.tsx", "../src/components/ShadowCanvasOverlay.tsx", "../src/theme/defaultTheme.ts", "../src/theme/ThemeProvider.tsx", "../src/hooks/useShadowCanvasConfig.ts", "../src/SmartCanvasApp.tsx", "../src/SmartCanvasElement.tsx", "../src/editorLoader.ts", "../src/overlays/runtime/overlay/root.ts", "../src/api.tsx", "../src/experiments/adapters/growthbook.ts", "../src/metrics/sessionMetrics.ts", "../src/telemetry/adapters/noop.ts", "../src/telemetry/adapters/posthog.ts", "../src/actions/executors/core-flow.ts", "../src/actions/executors/index.ts", "../src/actions/validation.ts", "../src/actions/ActionEngine.ts", "../src/anchor/AnchorResolver.ts", "../src/context/ContextManager.ts", "../src/decisions/strategies/rules.ts", "../src/decisions/strategies/score.ts", "../src/decisions/engine.ts", "../src/events/EventAccumulator.ts", "../src/events/EventBus.ts", "../src/navigation/NavigationMonitor.ts", "../src/state/helpers/cooldowns.ts", "../src/state/helpers/dismissals.ts", "../src/state/helpers/frequency.ts", "../src/state/StateStore.ts", "../src/surfaces/types.ts", "../src/surfaces/positioning.ts", "../src/hostPatcher/core/sanitizer.ts", "../src/surfaces/Surfaces.ts", "../src/widgets/WidgetRegistry.ts", "../src/runtime.ts", "../src/token.ts", "../src/bootstrap.ts", "../src/experiments/registry.ts", "../src/fetchers/cdnFetcher.ts", "../src/fetchers/experimentsFetcher.ts", "../src/fetchers/registry.ts", "../src/telemetry/registry.ts"],
4
+ "sourcesContent": ["/**\n * Reconciliation Guard - MutationObserver defense against React DOM removal.\n *\n * When the Syntrologie SDK inserts DOM nodes into a React-managed subtree\n * (via content:insertHtml), React's reconciliation will silently remove them\n * on the next render because they don't exist in React's virtual DOM.\n *\n * This guard watches for the removal of our inserted container and re-inserts\n * it using a debounced retry mechanism with a maximum retry count to prevent\n * infinite loops (e.g., in React StrictMode which double-invokes effects).\n */\n/**\n * Watch for a container element being removed from the DOM by an external\n * framework (React, Vue, etc.) and call `reinsertFn` to re-insert it.\n *\n * @param container The element we inserted (has data-syntro-action-id)\n * @param anchor The anchor element our container is positioned relative to\n * @param reinsertFn Called when the container is removed \u2014 should re-insert it\n * @param opts Configuration for retry limits and debounce timing\n * @returns Cleanup function that disconnects the observer\n */\nexport function guardAgainstReconciliation(container, anchor, reinsertFn, opts) {\n const maxRetries = opts?.maxRetries ?? 3;\n const debounceMs = opts?.debounceMs ?? 50;\n // Find the nearest parent to observe. Prefer container's parent, then anchor's.\n const observeTarget = container.parentElement ?? anchor.parentElement;\n if (!observeTarget)\n return () => { };\n let retries = 0;\n let debounceTimer = null;\n let disconnected = false;\n const observer = new MutationObserver((mutations) => {\n if (disconnected)\n return;\n for (const mutation of mutations) {\n for (const removed of mutation.removedNodes) {\n // Check if the removed node is our container\n if (removed !== container)\n continue;\n if (retries >= maxRetries) {\n observer.disconnect();\n disconnected = true;\n return;\n }\n // Debounce to coalesce rapid React re-renders\n if (debounceTimer)\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n if (disconnected)\n return;\n // If the anchor has been removed from the DOM (SPA navigation),\n // the page has been torn down \u2014 stop fighting React's reconciler.\n // Re-inserting into a dying subtree triggers removeChild crashes.\n if (!anchor.isConnected) {\n observer.disconnect();\n disconnected = true;\n return;\n }\n retries++;\n try {\n reinsertFn();\n }\n catch {\n // Re-insertion failed \u2014 stop trying\n observer.disconnect();\n disconnected = true;\n }\n }, debounceMs);\n return; // Found our container, no need to check further\n }\n }\n });\n observer.observe(observeTarget, { childList: true, subtree: true });\n return () => {\n disconnected = true;\n observer.disconnect();\n if (debounceTimer)\n clearTimeout(debounceTimer);\n };\n}\n", "/**\n * HTML Sanitizer\n *\n * Sanitizes HTML to prevent XSS attacks.\n * Uses native Sanitizer API when available, falls back to whitelist approach.\n */\nconst ALLOWED_TAGS = new Set([\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 'span',\n 'div',\n 'p',\n 'br',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'small',\n 'sup',\n 'sub',\n 'a',\n 'button',\n // SVG elements (for inline Lucide icons in config HTML)\n 'svg',\n 'path',\n 'circle',\n 'line',\n 'polyline',\n 'polygon',\n 'rect',\n 'g',\n]);\nexport function sanitizeHtml(html) {\n // Try native Sanitizer API first\n const hasNative = typeof window.Sanitizer === 'function';\n if (hasNative) {\n try {\n const s = new window.Sanitizer({});\n const frag = s.sanitizeToFragment(html);\n const div = document.createElement('div');\n div.append(frag);\n return div.innerHTML;\n }\n catch {\n // Fall through to manual sanitizer\n }\n }\n // Conservative fallback sanitizer\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const root = tpl.content;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\n const toRemove = [];\n while (walker.nextNode()) {\n const el = walker.currentNode;\n const tag = el.tagName.toLowerCase();\n if (!ALLOWED_TAGS.has(tag)) {\n toRemove.push(el);\n continue;\n }\n // Remove dangerous attributes\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const isEvent = name.startsWith('on');\n const isUrlAttr = name === 'href' || name === 'src' || name === 'formaction';\n const isDangerousUrl = isUrlAttr &&\n (value.startsWith('javascript:') ||\n value.startsWith('vbscript:') ||\n value.startsWith('data:text/html'));\n if (isEvent || isDangerousUrl) {\n el.removeAttribute(attr.name);\n }\n }\n }\n // Remove disallowed elements but keep their children\n for (const el of toRemove) {\n while (el.firstChild) {\n el.parentNode?.insertBefore(el.firstChild, el);\n }\n el.remove();\n }\n return tpl.innerHTML;\n}\n", "/**\n * Adaptive Content - Runtime Module\n *\n * DOM manipulation actions: insertHtml, setText, setAttr, addClass, removeClass, setStyle.\n * These follow the hostPatcher snapshot pattern for safe reversibility.\n */\nimport { guardAgainstReconciliation } from './reconciliation-guard';\nimport { sanitizeHtml } from './sanitizer';\n// ============================================================================\n// Executors\n// ============================================================================\n/**\n * Execute an insertHtml action\n */\nexport const executeInsertHtml = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-content] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n // Sanitize HTML content using context utility\n const sanitizedHtml = sanitizeHtml(action.html);\n // Dedup: if a container for this action already exists, remove it first.\n // Uses the action label as a stable identifier across re-applications.\n // Check both inside the anchor (prepend/append) and in the parent (before/after).\n const dedupAttr = 'data-syntro-insert-label';\n const label = action.label;\n if (label) {\n const escapedLabel = CSS.escape(label);\n const searchRoot = anchorEl.parentElement ?? anchorEl;\n const existing = searchRoot.querySelector(`[${dedupAttr}=\"${escapedLabel}\"]`);\n if (existing)\n existing.remove();\n }\n // Create container for inserted content\n const container = document.createElement('div');\n container.setAttribute('data-syntro-action-id', context.generateId());\n if (label)\n container.setAttribute(dedupAttr, label);\n container.innerHTML = sanitizedHtml;\n // Keep track of original state for replace position\n let originalContent = null;\n switch (action.position) {\n case 'before':\n anchorEl.insertAdjacentElement('beforebegin', container);\n break;\n case 'after':\n anchorEl.insertAdjacentElement('afterend', container);\n break;\n case 'prepend':\n anchorEl.insertBefore(container, anchorEl.firstChild);\n break;\n case 'append':\n anchorEl.appendChild(container);\n break;\n case 'replace':\n originalContent = anchorEl.innerHTML;\n anchorEl.replaceWith(container);\n break;\n }\n // Deep-link click handler \u2014 opens canvas + publishes deep-link event\n let deepLinkHandler = null;\n if (action.deepLink) {\n const { tileId, itemId } = action.deepLink;\n deepLinkHandler = () => {\n const handle = window.SynOS?.handle;\n if (handle) {\n handle.open();\n handle.runtime?.events?.publish('notification.deep_link', { tileId, itemId });\n }\n };\n container.style.cursor = 'pointer';\n container.addEventListener('click', deepLinkHandler);\n }\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:insertHtml',\n anchorId: action.anchorId,\n position: action.position,\n });\n // Guard against React reconciliation removing our container.\n // The reinsert function re-applies the same insertion strategy.\n const reinsertFn = () => {\n switch (action.position) {\n case 'before':\n anchorEl.insertAdjacentElement('beforebegin', container);\n break;\n case 'after':\n anchorEl.insertAdjacentElement('afterend', container);\n break;\n case 'prepend':\n anchorEl.insertBefore(container, anchorEl.firstChild);\n break;\n case 'append':\n anchorEl.appendChild(container);\n break;\n case 'replace':\n // Cannot re-insert for replace \u2014 anchor was already replaced\n break;\n }\n };\n const guardCleanup = guardAgainstReconciliation(container, anchorEl, reinsertFn);\n return {\n cleanup: () => {\n if (deepLinkHandler) {\n container.removeEventListener('click', deepLinkHandler);\n }\n guardCleanup();\n // Skip DOM mutations if nodes are already detached (SPA navigation)\n if (!container.isConnected)\n return;\n try {\n if (action.position === 'replace' && originalContent !== null) {\n // Restore original element\n const restoredEl = document.createElement(anchorEl.tagName);\n restoredEl.innerHTML = originalContent;\n // Copy attributes\n Array.from(anchorEl.attributes).forEach((attr) => {\n restoredEl.setAttribute(attr.name, attr.value);\n });\n container.replaceWith(restoredEl);\n }\n else {\n container.remove();\n }\n }\n catch {\n // DOM nodes already removed by host framework \u2014 safe to ignore\n }\n },\n updateFn: (changes) => {\n if ('html' in changes && typeof changes.html === 'string') {\n container.innerHTML = sanitizeHtml(changes.html);\n }\n },\n };\n};\n/**\n * Execute a setText action\n */\nexport const executeSetText = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-content] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n // Snapshot original text\n const originalText = anchorEl.textContent ?? '';\n // Set new text\n anchorEl.textContent = action.text;\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:setText',\n anchorId: action.anchorId,\n });\n return {\n cleanup: () => {\n if (!anchorEl.isConnected)\n return;\n anchorEl.textContent = originalText;\n },\n updateFn: (changes) => {\n if ('text' in changes && typeof changes.text === 'string') {\n anchorEl.textContent = changes.text;\n }\n },\n };\n};\n/**\n * Execute a setAttr action\n */\nexport const executeSetAttr = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-content] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n // Block dangerous attributes (case-insensitive)\n const lowerAttr = action.attr.toLowerCase();\n if (lowerAttr.startsWith('on')) {\n throw new Error(`Dangerous attribute not allowed: ${action.attr}`);\n }\n // Block dangerous URIs in URL-bearing attributes\n const isUrlAttr = lowerAttr === 'href' || lowerAttr === 'src' || lowerAttr === 'formaction';\n if (isUrlAttr) {\n const lowerValue = action.value.trim().toLowerCase();\n if (lowerValue.startsWith('javascript:') ||\n lowerValue.startsWith('vbscript:') ||\n lowerValue.startsWith('data:text/html')) {\n throw new Error(`Dangerous URL not allowed in ${action.attr}: ${action.value}`);\n }\n }\n // Snapshot original attribute value\n const originalValue = anchorEl.getAttribute(action.attr);\n const hadAttribute = anchorEl.hasAttribute(action.attr);\n // Set new attribute\n anchorEl.setAttribute(action.attr, action.value);\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:setAttr',\n anchorId: action.anchorId,\n attr: action.attr,\n });\n return {\n cleanup: () => {\n if (!anchorEl.isConnected)\n return;\n if (hadAttribute && originalValue !== null) {\n anchorEl.setAttribute(action.attr, originalValue);\n }\n else {\n anchorEl.removeAttribute(action.attr);\n }\n },\n updateFn: (changes) => {\n if ('value' in changes && typeof changes.value === 'string') {\n anchorEl.setAttribute(action.attr, changes.value);\n }\n },\n };\n};\n/**\n * Execute an addClass action\n */\nexport const executeAddClass = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-content] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n // Check if class was already present\n const hadClass = anchorEl.classList.contains(action.className);\n // Add class\n anchorEl.classList.add(action.className);\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:addClass',\n anchorId: action.anchorId,\n className: action.className,\n });\n return {\n cleanup: () => {\n if (!anchorEl.isConnected)\n return;\n // Only remove if we added it\n if (!hadClass) {\n anchorEl.classList.remove(action.className);\n }\n },\n };\n};\n/**\n * Execute a removeClass action\n */\nexport const executeRemoveClass = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-content] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n // Check if class was present\n const hadClass = anchorEl.classList.contains(action.className);\n // Remove class\n anchorEl.classList.remove(action.className);\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:removeClass',\n anchorId: action.anchorId,\n className: action.className,\n });\n return {\n cleanup: () => {\n if (!anchorEl.isConnected)\n return;\n // Only re-add if we removed it\n if (hadClass) {\n anchorEl.classList.add(action.className);\n }\n },\n };\n};\n/**\n * Execute a setStyle action\n */\nexport const executeSetStyle = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-content] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n // Snapshot original styles\n const originalStyles = new Map();\n for (const prop of Object.keys(action.styles)) {\n const current = anchorEl.style.getPropertyValue(prop);\n originalStyles.set(prop, current);\n }\n // Apply new styles\n for (const [prop, value] of Object.entries(action.styles)) {\n anchorEl.style.setProperty(prop, value);\n }\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:setStyle',\n anchorId: action.anchorId,\n styles: Object.keys(action.styles),\n });\n return {\n cleanup: () => {\n if (!anchorEl.isConnected)\n return;\n // Restore original styles\n for (const [prop, originalValue] of originalStyles) {\n if (originalValue) {\n anchorEl.style.setProperty(prop, originalValue);\n }\n else {\n anchorEl.style.removeProperty(prop);\n }\n }\n },\n updateFn: (changes) => {\n if ('styles' in changes && typeof changes.styles === 'object' && changes.styles) {\n for (const [prop, value] of Object.entries(changes.styles)) {\n anchorEl.style.setProperty(prop, value);\n }\n }\n },\n };\n};\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n/**\n * All executors provided by this app.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executors = [\n { kind: 'content:insertHtml', executor: executeInsertHtml },\n { kind: 'content:setText', executor: executeSetText },\n { kind: 'content:setAttr', executor: executeSetAttr },\n { kind: 'content:addClass', executor: executeAddClass },\n { kind: 'content:removeClass', executor: executeRemoveClass },\n { kind: 'content:setStyle', executor: executeSetStyle },\n];\n/**\n * App runtime manifest.\n */\nexport const runtime = {\n id: 'adaptive-content',\n version: '1.0.0',\n name: 'Content',\n description: 'DOM manipulation for text, attributes, and styles',\n executors,\n};\n", "const INTENSITY_COUNTS = { light: 50, medium: 100, heavy: 200 };\nconst DEFAULT_COLORS = [\n '#ff0000',\n '#00ff00',\n '#0000ff',\n '#ffff00',\n '#ff00ff',\n '#00ffff',\n '#ff8800',\n '#8800ff',\n];\nexport const confettiEffect = {\n init(width, height, config) {\n const count = INTENSITY_COUNTS[config.intensity];\n const colors = config.colors.length > 0 ? config.colors : DEFAULT_COLORS;\n const particles = [];\n for (let i = 0; i < count; i++) {\n particles.push({\n x: Math.random() * width,\n y: Math.random() * -height * 0.3,\n vx: (Math.random() - 0.5) * 4,\n vy: Math.random() * 2 + 1,\n rotation: Math.random() * Math.PI * 2,\n rotationSpeed: (Math.random() - 0.5) * 0.2,\n size: Math.random() * 6 + 4,\n color: colors[Math.floor(Math.random() * colors.length)],\n opacity: 1,\n shape: Math.random() > 0.5 ? 'rect' : 'circle',\n });\n }\n return particles;\n },\n update(particles, _dt, _elapsed) {\n let anyVisible = false;\n for (const p of particles) {\n // Gravity\n p.vy += 0.15;\n // Air resistance\n p.vx *= 0.99;\n // Movement\n p.x += p.vx;\n p.y += p.vy;\n // Rotation\n p.rotation += p.rotationSpeed;\n // Fade when past 80% of a typical viewport height (use a reasonable default)\n if (p.y > 0 && p.opacity > 0) {\n // Gradually fade based on how far the particle has traveled\n if (p.y > 500) {\n p.opacity -= 0.02;\n if (p.opacity < 0)\n p.opacity = 0;\n }\n }\n if (p.opacity > 0.01) {\n anyVisible = true;\n }\n }\n return anyVisible;\n },\n render(ctx, particles) {\n for (const p of particles) {\n if (p.opacity < 0.01)\n continue;\n ctx.save();\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = p.color;\n ctx.translate(p.x, p.y);\n ctx.rotate(p.rotation);\n if (p.shape === 'circle') {\n ctx.beginPath();\n ctx.arc(0, 0, p.size / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n else {\n ctx.fillRect(-p.size / 2, -p.size / 2, p.size, p.size * 0.6);\n }\n ctx.restore();\n }\n },\n};\n", "const INTENSITY_COUNTS = { light: 20, medium: 40, heavy: 80 };\nconst DEFAULT_EMOJI = '\uD83C\uDF89';\nexport const emojiRainEffect = {\n init(width, _height, config) {\n const count = INTENSITY_COUNTS[config.intensity];\n const emoji = typeof config.props?.emoji === 'string' ? config.props.emoji : DEFAULT_EMOJI;\n const particles = [];\n for (let i = 0; i < count; i++) {\n particles.push({\n x: Math.random() * width,\n y: Math.random() * -200,\n vx: 0,\n vy: Math.random() * 1.5 + 1,\n rotation: 0,\n rotationSpeed: 0,\n size: Math.random() * 12 + 16,\n color: '#000000',\n opacity: 1,\n shape: 'emoji',\n emoji,\n data: {\n /** Phase offset for horizontal wobble */\n wobblePhase: Math.random() * Math.PI * 2,\n /** Amplitude of horizontal wobble */\n wobbleAmp: Math.random() * 1.5 + 0.5,\n /** Original x for wobble base */\n originX: 0,\n },\n });\n }\n // Store originX after x is set\n for (const p of particles) {\n if (p.data)\n p.data.originX = p.x;\n }\n return particles;\n },\n update(particles, _dt, elapsed) {\n let anyVisible = false;\n for (const p of particles) {\n // Fall downward\n p.y += p.vy;\n // Horizontal wobble via sine wave\n const phase = p.data?.wobblePhase ?? 0;\n const amp = p.data?.wobbleAmp ?? 1;\n const originX = p.data?.originX ?? p.x;\n p.x = originX + Math.sin(elapsed * 0.003 + phase) * amp * 20;\n // Fade when past bottom of viewport\n if (p.y > 600) {\n p.opacity -= 0.02;\n if (p.opacity < 0)\n p.opacity = 0;\n }\n if (p.opacity > 0.01) {\n anyVisible = true;\n }\n }\n return anyVisible;\n },\n render(ctx, particles) {\n for (const p of particles) {\n if (p.opacity < 0.01 || !p.emoji)\n continue;\n ctx.save();\n ctx.globalAlpha = p.opacity;\n ctx.font = `${p.size}px serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(p.emoji, p.x, p.y);\n ctx.restore();\n }\n },\n};\n", "const PARTICLES_PER_BURST = { light: 20, medium: 40, heavy: 80 };\nconst BURST_COUNTS = { light: 3, medium: 4, heavy: 5 };\nexport const fireworksEffect = {\n init(width, height, config) {\n const perBurst = PARTICLES_PER_BURST[config.intensity];\n const burstCount = BURST_COUNTS[config.intensity];\n const colors = config.colors.length > 0 ? config.colors : ['#ff4444', '#44ff44', '#4444ff'];\n const particles = [];\n for (let b = 0; b < burstCount; b++) {\n const cx = Math.random() * width * 0.8 + width * 0.1;\n const cy = Math.random() * height * 0.6;\n const burstColor = colors[Math.floor(Math.random() * colors.length)];\n for (let i = 0; i < perBurst; i++) {\n const angle = (Math.PI * 2 * i) / perBurst + (Math.random() - 0.5) * 0.3;\n const speed = Math.random() * 3 + 2;\n particles.push({\n x: cx,\n y: cy,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n rotation: 0,\n rotationSpeed: 0,\n size: Math.random() * 3 + 2,\n color: burstColor,\n opacity: 1,\n shape: 'circle',\n data: { centerX: cx, centerY: cy },\n });\n }\n }\n return particles;\n },\n update(particles, _dt, _elapsed) {\n let anyVisible = false;\n for (const p of particles) {\n // Deceleration\n p.vx *= 0.97;\n p.vy *= 0.97;\n // Slight gravity\n p.vy += 0.03;\n // Movement\n p.x += p.vx;\n p.y += p.vy;\n // Fade over time\n p.opacity -= 0.008;\n if (p.opacity < 0)\n p.opacity = 0;\n if (p.opacity > 0.01) {\n anyVisible = true;\n }\n }\n return anyVisible;\n },\n render(ctx, particles) {\n for (const p of particles) {\n if (p.opacity < 0.01)\n continue;\n ctx.save();\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = p.color;\n ctx.shadowBlur = 12;\n ctx.shadowColor = p.color;\n ctx.beginPath();\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n },\n};\n", "const INTENSITY_COUNTS = { light: 30, medium: 60, heavy: 120 };\nexport const sparklesEffect = {\n init(width, height, config) {\n const count = INTENSITY_COUNTS[config.intensity];\n const colors = config.colors.length > 0 ? config.colors : ['#ffd700', '#ffffff', '#fffacd'];\n const particles = [];\n for (let i = 0; i < count; i++) {\n particles.push({\n x: Math.random() * width,\n y: Math.random() * height,\n vx: (Math.random() - 0.5) * 0.3,\n vy: -(Math.random() * 0.5 + 0.2),\n rotation: Math.random() * Math.PI * 2,\n rotationSpeed: (Math.random() - 0.5) * 0.1,\n size: Math.random() * 4 + 2,\n color: colors[Math.floor(Math.random() * colors.length)],\n opacity: Math.random() * 0.5 + 0.5,\n shape: 'circle',\n data: {\n /** Phase offset for sine-wave twinkle */\n phase: Math.random() * Math.PI * 2,\n /** Base opacity before twinkle modulation */\n baseOpacity: Math.random() * 0.5 + 0.5,\n },\n });\n }\n return particles;\n },\n update(particles, _dt, elapsed) {\n let anyVisible = false;\n for (const p of particles) {\n // Gentle upward float\n p.x += p.vx;\n p.y += p.vy;\n p.rotation += p.rotationSpeed;\n // Gradually fade out over lifetime\n if (p.data) {\n p.data.baseOpacity = (p.data.baseOpacity ?? 1) - 0.001;\n if (p.data.baseOpacity < 0)\n p.data.baseOpacity = 0;\n }\n // Twinkle \u2014 oscillate opacity with sine wave\n const phase = p.data?.phase ?? 0;\n const baseOpacity = p.data?.baseOpacity ?? 1;\n if (baseOpacity <= 0.01) {\n p.opacity = 0;\n }\n else {\n const twinkle = Math.sin(elapsed * 0.005 + phase) * 0.4 + 0.6;\n p.opacity = baseOpacity * twinkle;\n }\n if (p.opacity > 0.01) {\n anyVisible = true;\n }\n }\n return anyVisible;\n },\n render(ctx, particles) {\n for (const p of particles) {\n if (p.opacity < 0.01)\n continue;\n ctx.save();\n ctx.globalAlpha = p.opacity;\n ctx.fillStyle = p.color;\n ctx.translate(p.x, p.y);\n ctx.rotate(p.rotation);\n // Draw a 4-point diamond/star shape\n const s = p.size;\n ctx.beginPath();\n ctx.moveTo(0, -s);\n ctx.lineTo(s * 0.3, -s * 0.3);\n ctx.lineTo(s, 0);\n ctx.lineTo(s * 0.3, s * 0.3);\n ctx.lineTo(0, s);\n ctx.lineTo(-s * 0.3, s * 0.3);\n ctx.lineTo(-s, 0);\n ctx.lineTo(-s * 0.3, -s * 0.3);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n }\n },\n};\n", "export class CelebrationEngine {\n constructor() {\n this.canvas = null;\n this.ctx = null;\n this.rafId = null;\n this.particles = [];\n this.startTime = 0;\n this.lastFrame = 0;\n this.duration = 0;\n this.effect = null;\n this.container = null;\n }\n start(container, effect, config) {\n this.container = container;\n this.effect = effect;\n this.duration = config.duration;\n // Create fullscreen canvas\n const canvas = document.createElement('canvas');\n canvas.setAttribute('data-syntro-celebrate', '');\n Object.assign(canvas.style, {\n position: 'fixed',\n inset: '0',\n pointerEvents: 'none',\n zIndex: '2147483646',\n });\n const dpr = window.devicePixelRatio || 1;\n const width = window.innerWidth;\n const height = window.innerHeight;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.scale(dpr, dpr);\n this.canvas = canvas;\n this.ctx = ctx;\n container.appendChild(canvas);\n // Initialize particles\n this.particles = effect.init(width, height, config);\n this.startTime = performance.now();\n this.lastFrame = this.startTime;\n // Start animation loop\n this.tick = this.tick.bind(this);\n this.rafId = requestAnimationFrame(this.tick);\n }\n stop() {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n if (this.canvas && this.container) {\n this.canvas.remove();\n this.canvas = null;\n }\n this.ctx = null;\n this.effect = null;\n this.container = null;\n this.particles = [];\n }\n tick(now) {\n if (!this.ctx || !this.canvas || !this.effect)\n return;\n const elapsed = now - this.startTime;\n const dt = now - this.lastFrame;\n this.lastFrame = now;\n // Auto-stop after duration\n if (elapsed >= this.duration) {\n this.stop();\n return;\n }\n // Clear canvas\n const width = this.canvas.width / (window.devicePixelRatio || 1);\n const height = this.canvas.height / (window.devicePixelRatio || 1);\n this.ctx.clearRect(0, 0, width, height);\n // Update physics \u2014 stop if all particles are done\n const alive = this.effect.update(this.particles, dt, elapsed);\n if (!alive) {\n this.stop();\n return;\n }\n // Render\n this.effect.render(this.ctx, this.particles);\n // Next frame\n this.rafId = requestAnimationFrame(this.tick);\n }\n}\n", "import { confettiEffect } from './effects/confetti';\nimport { emojiRainEffect } from './effects/emoji-rain';\nimport { fireworksEffect } from './effects/fireworks';\nimport { sparklesEffect } from './effects/sparkles';\nimport { CelebrationEngine } from './engine';\nconst FALLBACK_COLORS = [\n '#ff0000',\n '#00ff00',\n '#0000ff',\n '#ffff00',\n '#ff00ff',\n '#00ffff',\n '#ff8800',\n '#8800ff',\n];\n/**\n * Build a celebration palette from the theme's primary/hover colors.\n * Returns 6 color variants (solid, transparent, white accent) for visual variety.\n */\nfunction buildThemePalette(primary, hover) {\n return [primary, hover, `${primary}cc`, `${hover}cc`, '#ffffff', `${primary}80`];\n}\n/**\n * Read --sc-color-primary and --sc-color-primary-hover from the overlay root.\n * Returns a theme palette if both are available, otherwise null.\n */\nfunction readThemeColors(overlayRoot) {\n try {\n const styles = getComputedStyle(overlayRoot);\n const primary = styles.getPropertyValue('--sc-color-primary')?.trim();\n const hover = styles.getPropertyValue('--sc-color-primary-hover')?.trim();\n if (primary?.startsWith('#') && primary.length >= 7) {\n return buildThemePalette(primary, hover || primary);\n }\n }\n catch {\n /* fallback */\n }\n return null;\n}\nconst effectRegistry = new Map([\n ['confetti', confettiEffect],\n ['fireworks', fireworksEffect],\n ['sparkles', sparklesEffect],\n ['emoji-rain', emojiRainEffect],\n]);\nexport const executeCelebrate = async (action, context) => {\n const effect = effectRegistry.get(action.effect);\n if (!effect) {\n console.warn(`[adaptive-overlays] Unknown celebration effect: \"${action.effect}\". Available: ${[...effectRegistry.keys()].join(', ')}`);\n return { cleanup: () => { } };\n }\n // Colors priority: action.colors > theme palette > hardcoded fallback\n const colors = action.colors ?? readThemeColors(context.overlayRoot) ?? FALLBACK_COLORS;\n const config = {\n duration: action.duration ?? 3000,\n intensity: action.intensity ?? 'medium',\n colors,\n props: action.props,\n };\n const engine = new CelebrationEngine();\n engine.start(context.overlayRoot, effect, config);\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:celebrate',\n effect: action.effect,\n });\n return {\n cleanup: () => {\n engine.stop();\n },\n };\n};\n", "/**\n * Tour Executor\n *\n * Orchestrates sequential tour steps with cross-page state persistence.\n * Tours can span multiple pages and resume after navigation.\n *\n * Each step contains an inner action (modal, tooltip) that gets executed.\n * The tour listens for CTA click events to advance to the next step.\n */\n/** Storage key for active tour state */\nconst ACTIVE_TOUR_KEY = 'syntro_active_tour';\n/** Track active tour executors to prevent duplicates */\nconst activeTours = new Map();\n/**\n * Get active tour state from localStorage\n */\nfunction getTourState(tourId) {\n try {\n const data = localStorage.getItem(ACTIVE_TOUR_KEY);\n if (!data)\n return null;\n const state = JSON.parse(data);\n // Only return if it matches the requested tour\n if (state.tourId !== tourId)\n return null;\n return state;\n }\n catch {\n return null;\n }\n}\n/**\n * Save tour state to localStorage\n */\nfunction saveTourState(state) {\n try {\n localStorage.setItem(ACTIVE_TOUR_KEY, JSON.stringify(state));\n }\n catch {\n // Storage may be full or unavailable\n }\n}\n/**\n * Clear tour state from localStorage\n */\nfunction clearTourState() {\n try {\n localStorage.removeItem(ACTIVE_TOUR_KEY);\n }\n catch {\n // Ignore errors\n }\n}\n/**\n * Get current route/path\n */\nfunction getCurrentRoute() {\n return window.location.pathname;\n}\n/**\n * Check if a step matches the current route\n */\nfunction stepMatchesRoute(step) {\n if (!step.route)\n return true;\n const currentRoute = getCurrentRoute();\n // Simple pattern matching - step.route can be exact path or glob pattern\n if (step.route.includes('*')) {\n const pattern = new RegExp(`^${step.route.replace(/\\*/g, '.*')}$`);\n return pattern.test(currentRoute);\n }\n return currentRoute === step.route;\n}\n/**\n * Execute a tour action\n *\n * Tours orchestrate a sequence of steps, persisting state to localStorage\n * to support cross-page navigation. Each step contains an action to execute\n * and optionally defines transitions based on action events.\n */\nexport const executeTour = async (action, context) => {\n const { tourId, steps, startStep, autoStart = true } = action;\n if (steps.length === 0) {\n throw new Error(`Tour \"${tourId}\" has no steps`);\n }\n // Self-guard: if this tour is already running, return no-op\n // This prevents duplicate modals when applyBatch is called multiple times\n if (activeTours.has(tourId)) {\n return {\n cleanup: async () => {\n // Delegate to the original tour's cleanup\n const existing = activeTours.get(tourId);\n if (existing) {\n await existing.cleanup();\n }\n },\n };\n }\n // Check if we can execute inner actions\n if (!context.applyAction) {\n throw new Error('Tour executor requires applyAction in context');\n }\n // Get or initialize tour state\n let state = getTourState(tourId);\n const isResumingTour = !!state;\n // If not resuming and autoStart is false, don't start the tour\n if (!isResumingTour && !autoStart) {\n return {\n cleanup: () => { },\n };\n }\n if (!state) {\n state = {\n tourId,\n currentStepId: startStep || steps[0].id,\n startedAt: Date.now(),\n };\n saveTourState(state);\n }\n // Find the current step\n let currentStepIndex = steps.findIndex((s) => s.id === state.currentStepId);\n if (currentStepIndex === -1) {\n // Step not found, use startStep or first step\n const initialStepId = startStep || steps[0].id;\n currentStepIndex = steps.findIndex((s) => s.id === initialStepId);\n if (currentStepIndex === -1)\n currentStepIndex = 0;\n state.currentStepId = steps[currentStepIndex].id;\n saveTourState(state);\n }\n const currentStep = steps[currentStepIndex];\n // Check if current step matches the route\n if (!stepMatchesRoute(currentStep)) {\n // Current page doesn't match this step's route\n // Tour is \"waiting\" for navigation to the correct page\n context.publishEvent('tour.waiting_for_route', {\n tourId,\n stepId: currentStep.id,\n expectedRoute: currentStep.route,\n currentRoute: getCurrentRoute(),\n });\n // Return a no-op that cleans up when tour ends\n return {\n cleanup: () => { },\n };\n }\n // Track state\n let isDestroyed = false;\n let currentActionHandle = null;\n let eventUnsubscribe = null;\n let routeWatcher = null;\n /**\n * Clean up current step\n */\n const cleanupCurrentStep = async () => {\n if (eventUnsubscribe) {\n eventUnsubscribe();\n eventUnsubscribe = null;\n }\n if (currentActionHandle?.isApplied()) {\n await currentActionHandle.revert();\n currentActionHandle = null;\n }\n };\n /**\n * Advance to the next step\n */\n const advanceToStep = async (nextStepId) => {\n if (isDestroyed)\n return;\n // Clean up current step\n await cleanupCurrentStep();\n if (nextStepId === 'end') {\n // Tour complete\n clearTourState();\n context.publishEvent('tour.completed', {\n tourId,\n totalSteps: steps.length,\n });\n isDestroyed = true;\n return;\n }\n // Find next step\n const nextStep = steps.find((s) => s.id === nextStepId);\n if (!nextStep) {\n console.error(`[Tour] Step \"${nextStepId}\" not found`);\n return;\n }\n // Update state\n state.currentStepId = nextStepId;\n saveTourState(state);\n context.publishEvent('tour.step_changed', {\n tourId,\n previousStepId: currentStep.id,\n nextStepId,\n });\n // If the next step has a different route, let navigation happen\n if (nextStep.route && nextStep.route !== getCurrentRoute()) {\n context.publishEvent('tour.awaiting_navigation', {\n tourId,\n stepId: nextStepId,\n targetRoute: nextStep.route,\n });\n // Tour will resume when page reloads and this executor runs again\n return;\n }\n // Execute the next step's action\n await executeStep(nextStep);\n };\n /**\n * Execute a step's inner action and set up event listeners\n */\n const executeStep = async (step) => {\n if (isDestroyed)\n return;\n context.publishEvent('tour.step_started', {\n tourId,\n stepId: step.id,\n stepIndex: steps.findIndex((s) => s.id === step.id),\n totalSteps: steps.length,\n });\n // Execute the inner action\n try {\n currentActionHandle = await context.applyAction(step.action);\n }\n catch (error) {\n console.error(`[Tour] Failed to execute step \"${step.id}\":`, error);\n context.publishEvent('tour.step_failed', {\n tourId,\n stepId: step.id,\n error: String(error),\n });\n return;\n }\n // Subscribe to CTA click events if there are transitions defined\n if (step.onAction && context.subscribeEvent) {\n eventUnsubscribe = context.subscribeEvent('action.modal_cta_clicked', (props) => {\n const actionId = props?.actionId;\n if (actionId && step.onAction) {\n const nextStepId = step.onAction[actionId];\n if (nextStepId) {\n advanceToStep(nextStepId);\n }\n }\n });\n // Also listen for tooltip CTA clicks\n const tooltipUnsubscribe = context.subscribeEvent('action.tooltip_cta_clicked', (props) => {\n const actionId = props?.actionId;\n if (actionId && step.onAction) {\n const nextStepId = step.onAction[actionId];\n if (nextStepId) {\n advanceToStep(nextStepId);\n }\n }\n });\n // Combine unsubscribes\n const originalUnsubscribe = eventUnsubscribe;\n eventUnsubscribe = () => {\n originalUnsubscribe();\n tooltipUnsubscribe();\n };\n }\n };\n // Set up route change watcher for SPAs\n const setupRouteWatcher = () => {\n let lastPath = getCurrentRoute();\n const checkRoute = () => {\n const currentPath = getCurrentRoute();\n if (currentPath !== lastPath) {\n lastPath = currentPath;\n context.publishEvent('tour.route_changed', {\n tourId,\n newRoute: currentPath,\n });\n }\n };\n // Use NavigationMonitor if available (single patch point),\n // otherwise fall back to direct History API patching (legacy)\n if (context.subscribeNavigation) {\n return context.subscribeNavigation(() => checkRoute());\n }\n // Legacy: direct History API patching\n window.addEventListener('popstate', checkRoute);\n const origPushState = history.pushState.bind(history);\n const origReplaceState = history.replaceState.bind(history);\n history.pushState = (...args) => {\n origPushState(...args);\n queueMicrotask(checkRoute);\n };\n history.replaceState = (...args) => {\n origReplaceState(...args);\n queueMicrotask(checkRoute);\n };\n return () => {\n window.removeEventListener('popstate', checkRoute);\n history.pushState = origPushState;\n history.replaceState = origReplaceState;\n };\n };\n routeWatcher = setupRouteWatcher();\n // Publish tour started/resumed event\n if (!isResumingTour) {\n context.publishEvent('tour.started', {\n tourId,\n totalSteps: steps.length,\n startStepId: state.currentStepId,\n });\n }\n else {\n context.publishEvent('tour.resumed', {\n tourId,\n stepId: state.currentStepId,\n });\n }\n // Execute the current step\n await executeStep(currentStep);\n // Create cleanup function\n const cleanup = async () => {\n isDestroyed = true;\n // Remove from active tours\n activeTours.delete(tourId);\n await cleanupCurrentStep();\n if (routeWatcher) {\n routeWatcher();\n }\n // Don't clear tour state on cleanup - allow resume\n context.publishEvent('tour.paused', {\n tourId,\n stepId: state.currentStepId,\n });\n };\n // Register this tour as active\n activeTours.set(tourId, { cleanup });\n return { cleanup };\n};\n", "/**\n * Syntro Design System - Color Tokens\n *\n * This file contains all color tokens from the Figma design system.\n * Colors are organized by scale and semantic meaning.\n *\n * @see https://www.figma.com/design/U0Ol5vM7FQvgPfIgCAgxgb/Design-System\n */\n\n// ============================================================================\n// BASE COLORS\n// ============================================================================\n\nexport const base = {\n white: '#ffffff',\n black: '#000000',\n} as const;\n\n// ============================================================================\n// BRAND COLORS\n// ============================================================================\n\nexport const brand = {\n 0: '#2c0b0a',\n 1: '#5b1715',\n 2: '#89221f',\n 3: '#b72e2a',\n 4: '#d44844',\n 5: '#dd6d69',\n 6: '#e5918f',\n 7: '#eeb6b4',\n 8: '#f6dada',\n 9: '#faebea',\n} as const;\n\n// ============================================================================\n// NEUTRAL COLORS\n// ============================================================================\n\nexport const slateGrey = {\n 0: '#07080a',\n 1: '#0f1318',\n 2: '#0e1114',\n 3: '#1c222a',\n 4: '#2b333f',\n 5: '#394454',\n 6: '#475569',\n 7: '#677384',\n 8: '#87919f',\n 9: '#a8afba',\n 10: '#cbd0d7',\n 11: '#e8eaee',\n 12: '#f6f7f9',\n} as const;\n\n// ============================================================================\n// SEMANTIC COLOR SCALES\n// ============================================================================\n\nexport const green = {\n 0: '#07230a',\n 1: '#0e4514',\n 2: '#16681e',\n 3: '#1d8a28',\n 4: '#24ad32',\n 5: '#4fbd5a',\n 6: '#7acd82',\n 7: '#a5deab',\n 8: '#d0eed3',\n 9: '#e5f6e7',\n} as const;\n\nexport const yellow = {\n 0: '#301f09',\n 1: '#5f3e12',\n 2: '#8f5e1b',\n 3: '#be7d24',\n 4: '#ee9c2d',\n 5: '#f1b057',\n 6: '#f5c481',\n 7: '#f8d7ab',\n 8: '#fcebd5',\n 9: '#fdf5ea',\n} as const;\n\nexport const red = {\n 0: '#330707',\n 1: '#660f0e',\n 2: '#991616',\n 3: '#cc1e1d',\n 4: '#ff2524',\n 5: '#ff5150',\n 6: '#ff7c7c',\n 7: '#ffa8a7',\n 8: '#ffd3d3',\n 9: '#ffe9e9',\n} as const;\n\nexport const blue = {\n 0: '#051533',\n 1: '#0a2a66',\n 2: '#0f3f98',\n 3: '#1454cb',\n 4: '#1969fe',\n 5: '#4787fe',\n 6: '#75a5fe',\n 7: '#a3c3ff',\n 8: '#d1e1ff',\n 9: '#e8f0ff',\n} as const;\n\nexport const orange = {\n 0: '#662500',\n 1: '#993d00',\n 2: '#cc5800',\n 3: '#ff7700',\n 4: '#fea85d',\n 5: '#fec58f',\n 6: '#ffd6ae',\n 7: '#fee6cd',\n 8: '#fff1e1',\n 9: '#fff8f0',\n} as const;\n\nexport const purple = {\n 0: '#151229',\n 1: '#2a2452',\n 2: '#40357c',\n 3: '#5547a5',\n 4: '#6a59ce',\n 5: '#887ad8',\n 6: '#a69be2',\n 7: '#c3bdeb',\n 8: '#e1def5',\n 9: '#f0eefa',\n} as const;\n\nexport const pink = {\n 0: '#37091f',\n 1: '#69123c',\n 2: '#9b1c58',\n 3: '#cd2575',\n 4: '#ff2e92',\n 5: '#ff58a8',\n 6: '#ff82be',\n 7: '#ffabd3',\n 8: '#ffd5e9',\n 9: '#ffeaf4',\n} as const;\n\n// ============================================================================\n// LEGACY COLORS (Being phased out)\n// ============================================================================\n\nexport const legacy = {\n aqua: {\n 0: '#0c5f8d',\n 1: '#146b99',\n 2: '#1d78a6',\n 3: '#2e89b6',\n 4: '#4a9fc4',\n 5: '#6bb4d1',\n 6: '#93cce0',\n 7: '#bddff0',\n 8: '#dceef8',\n 9: '#f2f8fc',\n },\n violet: {\n 0: '#6927da',\n 1: '#7839ee',\n 2: '#875bf7',\n 3: '#a48afb',\n 4: '#c3b4fd',\n 5: '#ddd6fe',\n 6: '#ece9fe',\n 7: '#f5f3ff',\n 8: '#fbfaff',\n },\n fuchsia: {\n 0: '#9f1ab1',\n 1: '#ba24d5',\n 2: '#d444f1',\n 3: '#e478fa',\n 4: '#eeaafd',\n 5: '#f6d0fe',\n 6: '#fbe8ff',\n 7: '#fdf4ff',\n 8: '#fefaff',\n },\n pink: {\n 0: '#a10f5f',\n 1: '#dd2590',\n 2: '#ee46bc',\n 3: '#f670c7',\n 4: '#faa7e0',\n 5: '#fcceee',\n 6: '#fce7f6',\n 7: '#fdf2fa',\n 8: '#fef6fb',\n },\n} as const;\n\n// ============================================================================\n// TEXT TOKENS\n// ============================================================================\n\nexport const text = {\n primary: slateGrey[10],\n secondary: slateGrey[9],\n tertiary: slateGrey[8],\n} as const;\n\n// ============================================================================\n// BACKGROUND TOKENS\n// ============================================================================\n\nexport const background = {\n primary: slateGrey[2],\n secondary: slateGrey[0],\n} as const;\n\n// ============================================================================\n// BORDER TOKENS\n// ============================================================================\n\nexport const border = {\n primary: slateGrey[4],\n secondary: slateGrey[3],\n} as const;\n\n// ============================================================================\n// BUTTON TOKENS\n// ============================================================================\n\nexport const button = {\n primary: {\n text: base.white,\n icon: base.white,\n border: brand[3],\n backgroundDefault: brand[3],\n backgroundHover: brand[2],\n },\n neutral: {\n text: slateGrey[10],\n textHover: base.white,\n icon: slateGrey[10],\n iconHover: base.white,\n border: slateGrey[4],\n background: slateGrey[2],\n },\n link: {\n text: base.white,\n icon: base.white,\n hover: brand[5],\n },\n error: {\n text: red[5],\n hover: red[6],\n },\n success: {\n text: green[5],\n hover: green[6],\n },\n} as const;\n\n// ============================================================================\n// BADGE TOKENS\n// ============================================================================\n\nexport const badge = {\n slateGrey: {\n content: slateGrey[10],\n pillOutline: slateGrey[10],\n borderPrimary: slateGrey[5],\n borderSecondary: slateGrey[5],\n background: slateGrey[3],\n },\n brand: {\n content: brand[9],\n pillOutline: brand[9],\n borderPrimary: brand[6],\n borderSecondary: brand[6],\n background: brand[0],\n },\n red: {\n content: red[8],\n pillOutline: red[4],\n borderPrimary: red[2],\n borderSecondary: red[2],\n background: red[0],\n },\n yellow: {\n content: yellow[8],\n pillOutline: yellow[4],\n borderPrimary: yellow[2],\n borderSecondary: yellow[2],\n background: yellow[0],\n },\n green: {\n content: green[8],\n pillOutline: green[4],\n borderPrimary: green[2],\n borderSecondary: green[2],\n background: green[0],\n },\n purple: {\n content: purple[8],\n pillOutline: purple[4],\n borderPrimary: purple[2],\n borderSecondary: purple[2],\n background: purple[0],\n },\n blue: {\n content: blue[8],\n pillOutline: blue[4],\n borderPrimary: blue[2],\n borderSecondary: blue[2],\n background: blue[0],\n },\n orange: {\n content: orange[8],\n pillOutline: orange[4],\n borderPrimary: orange[2],\n borderSecondary: orange[2],\n background: orange[0],\n },\n pink: {\n content: pink[8],\n pillOutline: pink[4],\n borderPrimary: pink[2],\n borderSecondary: pink[2],\n background: pink[0],\n },\n} as const;\n\n// ============================================================================\n// BADGE BANNER TOKENS\n// ============================================================================\n\nexport const badgeBanner = {\n green: {\n content: green[8],\n border: green[2],\n background: green[0],\n },\n yellow: {\n content: yellow[8],\n border: yellow[2],\n background: yellow[0],\n },\n red: {\n content: red[8],\n border: red[2],\n background: red[0],\n },\n} as const;\n\n// ============================================================================\n// ALERT TOKENS\n// ============================================================================\n\nexport const alert = {\n green: {\n content: green[1],\n background: green[9],\n },\n yellow: {\n content: yellow[1],\n background: yellow[9],\n },\n red: {\n content: red[1],\n background: red[9],\n },\n} as const;\n\n// ============================================================================\n// TAG TOKENS\n// ============================================================================\n\nexport const tag = {\n content: slateGrey[10],\n border: slateGrey[4],\n background: '#1c2124',\n} as const;\n\n// ============================================================================\n// MENU TOKENS\n// ============================================================================\n\nexport const menu = {\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n selected: slateGrey[3],\n} as const;\n\n// ============================================================================\n// INPUT/DROPDOWN TOKENS\n// ============================================================================\n\nexport const inputDropdown = {\n background: slateGrey[2],\n icon: slateGrey[10],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n} as const;\n\nexport const inputField = {\n backgroundDefault: slateGrey[2],\n backgroundDisabled: slateGrey[0],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n textError: red[5],\n iconDefault: slateGrey[9],\n iconPlaceholder: slateGrey[10],\n iconError: red[5],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n borderError: red[5],\n} as const;\n\n// ============================================================================\n// TOGGLE TOKENS\n// ============================================================================\n\nexport const toggle = {\n handleDefault: base.white,\n handleDisabled: slateGrey[10],\n off: {\n backgroundDefault: slateGrey[4],\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[4],\n },\n on: {\n backgroundDefault: green[3],\n backgroundHover: green[2],\n backgroundDisabled: slateGrey[4],\n },\n} as const;\n\n// ============================================================================\n// CHECKBOX TOKENS\n// ============================================================================\n\nexport const checkbox = {\n off: {\n backgroundDefault: '#00000000',\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[2],\n border: slateGrey[6],\n },\n on: {\n backgroundDefault: green[0],\n backgroundHover: green[1],\n backgroundDisabled: slateGrey[2],\n border: green[3],\n },\n} as const;\n\n// ============================================================================\n// AVATAR TOKENS\n// ============================================================================\n\nexport const avatar = {\n content: slateGrey[10],\n background: slateGrey[4],\n} as const;\n\n// ============================================================================\n// PROGRESS BAR & SLIDER TOKENS\n// ============================================================================\n\nexport const progressBarSlider = {\n background: slateGrey[4],\n active: green[3],\n} as const;\n\n// ============================================================================\n// CARD TOKENS\n// ============================================================================\n\nexport const card = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n} as const;\n\n// ============================================================================\n// SIDEBAR TOKENS\n// ============================================================================\n\nexport const sidebar = {\n backgroundDefault: slateGrey[1],\n backgroundHover: slateGrey[3],\n backgroundActive: slateGrey[4],\n border: slateGrey[4],\n contentPrimary: slateGrey[10],\n contentSecondary: slateGrey[9],\n contentTertiary: slateGrey[8],\n} as const;\n\n// ============================================================================\n// MODAL TOKENS\n// ============================================================================\n\nexport const modal = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n} as const;\n\n// ============================================================================\n// TAB TOKENS\n// ============================================================================\n\nexport const tab = {\n activeBackground: slateGrey[3],\n activeContent: brand[5],\n inactiveContent: slateGrey[9],\n border: slateGrey[4],\n} as const;\n\n// ============================================================================\n// TABLE TOKENS\n// ============================================================================\n\nexport const table = {\n header: {\n textDefault: slateGrey[9],\n textHover: slateGrey[8],\n backgroundDefault: slateGrey[1],\n },\n border: slateGrey[4],\n cell: {\n textPrimary: slateGrey[10],\n textSecondary: slateGrey[9],\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n },\n} as const;\n\n// ============================================================================\n// BREADCRUMBS TOKENS\n// ============================================================================\n\nexport const breadcrumbs = {\n textPrimaryDefault: slateGrey[10],\n textPrimaryHover: slateGrey[10],\n textSecondaryDefault: slateGrey[8],\n textSecondaryHover: slateGrey[9],\n iconPrimary: slateGrey[10],\n iconSecondary: slateGrey[8],\n} as const;\n\n// ============================================================================\n// LOADING INDICATOR TOKENS\n// ============================================================================\n\nexport const loadingIndicator = {\n background: green[1],\n active: green[5],\n} as const;\n\n// ============================================================================\n// DATE PICKER TOKENS\n// ============================================================================\n\nexport const datePicker = {\n textDefault: slateGrey[10],\n textSelected: base.white,\n textDisabled: slateGrey[7],\n backgroundDefault: slateGrey[2],\n backgroundMiddle: slateGrey[3],\n backgroundSelected: brand[3],\n border: slateGrey[4],\n} as const;\n\n// ============================================================================\n// MISC TOKENS\n// ============================================================================\n\nexport const scroll = slateGrey[9];\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport const colors = {\n base,\n brand,\n slateGrey,\n green,\n yellow,\n red,\n blue,\n orange,\n purple,\n pink,\n legacy,\n text,\n background,\n border,\n button,\n badge,\n badgeBanner,\n alert,\n tag,\n menu,\n inputDropdown,\n inputField,\n toggle,\n checkbox,\n avatar,\n progressBarSlider,\n card,\n sidebar,\n modal,\n tab,\n table,\n breadcrumbs,\n loadingIndicator,\n datePicker,\n scroll,\n} as const;\n\nexport default colors;\n", "/**\n * Highlight Overlay\n *\n * Creates a spotlight effect around an element with a scrim backdrop.\n */\nimport { blue } from '@syntro/design-system/tokens';\nconst supportsPathClip = typeof CSS !== 'undefined' && CSS.supports?.('clip-path', \"path('M0 0 H1 V1 Z')\");\nexport function showHighlight(anchorEl, overlayRoot, opts) {\n const padding = opts?.paddingPx ?? 12;\n const radius = opts?.radiusPx ?? 12;\n const opacity = Math.min(Math.max(opts?.scrimOpacity ?? 0.55, 0), 1);\n const ringColor = opts?.ringColor ?? `var(--syntro-ring, ${blue[5]})`;\n const blocking = opts?.blocking ?? false;\n const onClickOutside = opts?.onClickOutside ?? true;\n const onEsc = opts?.onEsc ?? true;\n const rootStyles = getComputedStyle(document.documentElement);\n const tokenScrim = rootStyles.getPropertyValue('--syntro-spotlight-backdrop').trim();\n const tokenRing = rootStyles.getPropertyValue('--syntro-ring').trim();\n const scrim = document.createElement('div');\n scrim.className = 'syntro-spotlight-scrim';\n const needsPointerEvents = blocking || onClickOutside;\n Object.assign(scrim.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483646',\n pointerEvents: needsPointerEvents ? 'auto' : 'none',\n background: tokenScrim || `rgba(2, 6, 23, ${opacity})`,\n transition: 'opacity 220ms ease',\n opacity: '0',\n });\n overlayRoot.appendChild(scrim);\n requestAnimationFrame(() => (scrim.style.opacity = '1'));\n const ring = document.createElement('div');\n ring.className = 'syntro-spotlight-ring';\n Object.assign(ring.style, {\n position: 'fixed',\n pointerEvents: 'none',\n borderRadius: `${radius}px`,\n border: `2px solid ${ringColor || tokenRing || blue[5]}`,\n boxShadow: `0 0 0 4px rgba(255,255,255,0.35)`,\n zIndex: '2147483647',\n transition: 'all 220ms cubic-bezier(0.16,1,0.3,1)',\n });\n overlayRoot.appendChild(ring);\n const fallbackSlices = [];\n if (!supportsPathClip) {\n for (let i = 0; i < 4; i++) {\n const slice = document.createElement('div');\n slice.style.position = 'fixed';\n slice.style.background = 'inherit';\n fallbackSlices.push(slice);\n scrim.appendChild(slice);\n }\n }\n const setClipPath = (path) => {\n scrim.style.clipPath = path;\n scrim.style.webkitClipPath = path;\n };\n const update = () => {\n // Guard: if anchor was removed from DOM (e.g. React Router navigation),\n // destroy the overlay gracefully instead of positioning at (0,0).\n if (!anchorEl.isConnected) {\n handle.destroy();\n return;\n }\n const rect = anchorEl.getBoundingClientRect();\n // Use unclamped coordinates so the ring and clip-path track the anchor's\n // true position. When the anchor is partially off-screen the browser\n // naturally clips the fixed-position ring at the viewport edge.\n const x = rect.left - padding;\n const y = rect.top - padding;\n const w = rect.width + padding * 2;\n const h = rect.height + padding * 2;\n Object.assign(ring.style, {\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n });\n if (supportsPathClip) {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const r = Math.min(radius, w / 2, h / 2);\n const outer = `M 0 0 L ${vw} 0 L ${vw} ${vh} L 0 ${vh} Z`;\n const inner = `M ${x + r} ${y} ` +\n `A ${r} ${r} 0 0 0 ${x} ${y + r} ` +\n `L ${x} ${y + h - r} ` +\n `A ${r} ${r} 0 0 0 ${x + r} ${y + h} ` +\n `L ${x + w - r} ${y + h} ` +\n `A ${r} ${r} 0 0 0 ${x + w} ${y + h - r} ` +\n `L ${x + w} ${y + r} ` +\n `A ${r} ${r} 0 0 0 ${x + w - r} ${y} ` +\n `L ${x + r} ${y} ` +\n `Z`;\n setClipPath(`path('${outer} ${inner}')`);\n }\n else {\n const [top, right, bottom, left] = fallbackSlices;\n Object.assign(top.style, {\n left: '0px',\n top: '0px',\n width: '100vw',\n height: `${y}px`,\n });\n Object.assign(bottom.style, {\n left: '0px',\n top: `${y + h}px`,\n width: '100vw',\n height: `${Math.max(0, window.innerHeight - (y + h))}px`,\n });\n Object.assign(left.style, {\n left: '0px',\n top: `${y}px`,\n width: `${x}px`,\n height: `${h}px`,\n });\n Object.assign(right.style, {\n left: `${x + w}px`,\n top: `${y}px`,\n width: `${Math.max(0, window.innerWidth - (x + w))}px`,\n height: `${h}px`,\n });\n }\n };\n const ro = new ResizeObserver(() => requestAnimationFrame(update));\n ro.observe(anchorEl);\n const onScroll = () => requestAnimationFrame(update);\n const onResize = () => requestAnimationFrame(update);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n const onKey = (e) => {\n if (e.key === 'Escape' && onEsc) {\n opts?.onDismiss?.();\n handle.destroy();\n }\n };\n if (onEsc) {\n window.addEventListener('keydown', onKey);\n }\n const onClick = (event) => {\n if (blocking) {\n event.preventDefault();\n event.stopPropagation();\n }\n else if (onClickOutside) {\n opts?.onDismiss?.();\n handle.destroy();\n }\n };\n scrim.addEventListener('click', onClick);\n const handle = {\n destroy() {\n ro.disconnect();\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n if (onEsc) {\n window.removeEventListener('keydown', onKey);\n }\n scrim.removeEventListener('click', onClick);\n scrim.style.pointerEvents = 'none';\n scrim.style.opacity = '0';\n setTimeout(() => {\n try {\n scrim.remove();\n }\n catch {\n /* already detached */\n }\n try {\n ring.remove();\n }\n catch {\n /* already detached */\n }\n }, 220);\n },\n };\n update();\n return handle;\n}\n", "/**\n * HTML Sanitizer\n *\n * Sanitizes HTML to prevent XSS attacks.\n * Uses native Sanitizer API when available, falls back to whitelist approach.\n */\nconst ALLOWED_TAGS = new Set([\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 'span',\n 'div',\n 'p',\n 'br',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'small',\n 'sup',\n 'sub',\n 'a',\n 'button',\n // SVG elements (for inline Lucide icons in config HTML)\n 'svg',\n 'path',\n 'circle',\n 'line',\n 'polyline',\n 'polygon',\n 'rect',\n 'g',\n]);\nexport function sanitizeHtml(html) {\n // Try native Sanitizer API first\n const hasNative = typeof window.Sanitizer === 'function';\n if (hasNative) {\n try {\n const s = new window.Sanitizer({});\n const frag = s.sanitizeToFragment(html);\n const div = document.createElement('div');\n div.append(frag);\n return div.innerHTML;\n }\n catch {\n // Fall through to manual sanitizer\n }\n }\n // Conservative fallback sanitizer\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const root = tpl.content;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\n const toRemove = [];\n while (walker.nextNode()) {\n const el = walker.currentNode;\n const tag = el.tagName.toLowerCase();\n if (!ALLOWED_TAGS.has(tag)) {\n toRemove.push(el);\n continue;\n }\n // Remove dangerous attributes\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const isEvent = name.startsWith('on');\n const isJsUrl = (name === 'href' || name === 'src') && value.startsWith('javascript:');\n if (isEvent || isJsUrl) {\n el.removeAttribute(attr.name);\n }\n }\n }\n // Remove disallowed elements but keep their children\n for (const el of toRemove) {\n while (el.firstChild) {\n el.parentNode?.insertBefore(el.firstChild, el);\n }\n el.remove();\n }\n return tpl.innerHTML;\n}\n", "/**\n * Modal Executor\n *\n * Displays a centered modal dialog with optional CTA buttons.\n * Uses CSS custom properties (var()) directly in inline styles so theming\n * is live \u2014 no timing dependency on when ThemeProvider injects vars.\n */\nimport { sanitizeHtml } from './sanitizer';\n// CSS var shorthands with fallbacks (mirrors tooltip/toast pattern)\nconst V = {\n bg: 'var(--sc-overlay-background, #ffffff)',\n title: 'var(--sc-overlay-title-color, var(--sc-overlay-text-color, #111827))',\n text: 'var(--sc-overlay-text-color, #4b5563)',\n accent: 'var(--sc-color-primary, #4f46e5)',\n radius: 'var(--sc-border-radius, 12px)',\n};\n/**\n * Execute a modal action\n */\nexport const executeModal = async (action, context) => {\n const { content, size = 'md', blocking = false, scrim, dismiss, ctaButtons } = action;\n // Create scrim backdrop\n const scrimEl = document.createElement('div');\n scrimEl.className = 'syntro-modal-scrim';\n scrimEl.style.cssText = `\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, ${scrim?.opacity ?? 0.6});\n z-index: 2147483645;\n opacity: 0;\n transition: opacity 200ms ease-out;\n `;\n context.overlayRoot.appendChild(scrimEl);\n // Create modal container\n const modal = document.createElement('div');\n modal.className = `syntro-modal syntro-modal-${size}`;\n modal.setAttribute('role', 'dialog');\n modal.setAttribute('aria-modal', 'true');\n // Size-based max-widths\n const sizeMap = { sm: '360px', md: '480px', lg: '640px' };\n modal.style.cssText = `\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n max-width: ${sizeMap[size]};\n width: 90%;\n background: ${V.bg};\n border-radius: ${V.radius};\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n z-index: 2147483646;\n opacity: 0;\n transition: opacity 200ms ease-out, transform 200ms ease-out;\n padding: 24px;\n `;\n // Build modal HTML content\n let html = '';\n if (content.title) {\n html += `<h2 class=\"syntro-modal-title\" style=\"margin: 0 0 12px 0; font-size: 18px; font-weight: 600; color: ${V.title};\">${sanitizeHtml(content.title)}</h2>`;\n }\n html += `<div class=\"syntro-modal-body\" style=\"color: ${V.text}; line-height: 1.5;\">${sanitizeHtml(content.body)}</div>`;\n // Add close button if enabled\n if (dismiss?.closeButton !== false) {\n html += `\n <button class=\"syntro-modal-close\" data-syntro-action=\"dismiss\" style=\"\n position: absolute;\n top: 16px;\n right: 16px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: ${V.text};\n opacity: 0.6;\n \" aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\"/>\n </svg>\n </button>\n `;\n }\n // Add CTA buttons\n if (ctaButtons && ctaButtons.length > 0) {\n html += `<div class=\"syntro-modal-actions\" style=\"display: flex; gap: 12px; margin-top: 24px; justify-content: flex-end;\">`;\n for (const btn of ctaButtons) {\n const isPrimary = btn.primary ?? false;\n html += `\n <button\n class=\"syntro-modal-btn ${isPrimary ? 'syntro-modal-btn-primary' : ''}\"\n data-syntro-action=\"${sanitizeHtml(btn.actionId)}\"\n style=\"\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n ${isPrimary\n ? `background: ${V.accent}; color: white; border: none;`\n : `background: transparent; color: ${V.accent}; border: 1px solid currentColor; opacity: 0.7;`}\n \"\n >\n ${sanitizeHtml(btn.label)}\n </button>\n `;\n }\n html += `</div>`;\n }\n modal.innerHTML = html;\n context.overlayRoot.appendChild(modal);\n // Track state for waitFor\n let actionClicked = null;\n // Handle action button clicks\n const actionBtns = modal.querySelectorAll('[data-syntro-action]');\n const actionHandler = (e) => {\n const btn = e.currentTarget;\n const actionId = btn.getAttribute('data-syntro-action');\n if (actionId) {\n actionClicked = actionId;\n context.publishEvent('action.modal_cta_clicked', {\n actionId,\n });\n handle.destroy();\n }\n };\n actionBtns.forEach((btn) => btn.addEventListener('click', actionHandler));\n // Handle escape key\n const onKey = (e) => {\n if (e.key === 'Escape' && dismiss?.onEsc !== false) {\n handle.destroy();\n }\n };\n window.addEventListener('keydown', onKey);\n // Handle click outside (on scrim)\n const onScrimClick = () => {\n if (!blocking) {\n handle.destroy();\n }\n };\n scrimEl.addEventListener('click', onScrimClick);\n // Blocking mode - make siblings inert (except editor panel)\n const originalInert = [];\n if (blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== context.overlayRoot &&\n el.getAttribute('inert') === null &&\n !el.querySelector('[data-syntro-editor-panel]') &&\n !el.hasAttribute('data-syntro-editor-panel')) {\n el.setAttribute('inert', '');\n originalInert.push(el);\n }\n });\n }\n // Set up timeout if specified\n let timeoutId;\n if (dismiss?.timeoutMs) {\n timeoutId = setTimeout(() => {\n handle.destroy();\n }, dismiss.timeoutMs);\n }\n // Focus first focusable element\n const focusableEls = modal.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\n if (focusableEls.length > 0) {\n requestAnimationFrame(() => focusableEls[0].focus());\n }\n // Fade in\n requestAnimationFrame(() => {\n scrimEl.style.opacity = '1';\n modal.style.opacity = '1';\n modal.style.transform = 'translate(-50%, -50%) scale(1)';\n });\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:modal',\n size,\n blocking,\n });\n const handle = {\n destroy() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n window.removeEventListener('keydown', onKey);\n scrimEl.removeEventListener('click', onScrimClick);\n actionBtns.forEach((btn) => btn.removeEventListener('click', actionHandler));\n // Restore inert state\n originalInert.forEach((el) => el.removeAttribute('inert'));\n // Fade out then remove\n modal.style.pointerEvents = 'none';\n scrimEl.style.pointerEvents = 'none';\n modal.style.opacity = '0';\n modal.style.transform = 'translate(-50%, -50%) scale(0.95)';\n scrimEl.style.opacity = '0';\n setTimeout(() => {\n try {\n modal.remove();\n }\n catch {\n /* already detached */\n }\n try {\n scrimEl.remove();\n }\n catch {\n /* already detached */\n }\n }, 200);\n context.publishEvent('action.modal_dismissed', {\n actionClicked,\n });\n },\n };\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n", "/**\n * Tooltip Overlay\n *\n * Creates a positioned tooltip near an element using Floating UI.\n */\nimport { arrow as arrowMiddleware, autoUpdate, computePosition, flip, hide, offset, shift, } from '@floating-ui/dom';\nimport { sanitizeHtml } from './sanitizer';\n/**\n * For large elements (larger than viewport), create a virtual anchor\n * at the center of the visible portion.\n */\nfunction getAnchorReference(anchorEl) {\n const rect = anchorEl.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const isLargeElement = rect.width > viewportWidth * 0.8 || rect.height > viewportHeight * 0.8;\n if (!isLargeElement) {\n return anchorEl;\n }\n const visibleLeft = Math.max(rect.left, 0);\n const visibleTop = Math.max(rect.top, 0);\n const visibleRight = Math.min(rect.right, viewportWidth);\n const visibleBottom = Math.min(rect.bottom, viewportHeight);\n const centerX = (visibleLeft + visibleRight) / 2;\n const centerY = (visibleTop + visibleBottom) / 2;\n return {\n getBoundingClientRect() {\n return {\n width: 0,\n height: 0,\n x: centerX,\n y: centerY,\n top: centerY,\n left: centerX,\n right: centerX,\n bottom: centerY,\n };\n },\n };\n}\nexport function showTooltip(anchorEl, overlayRoot, opts) {\n // Scroll anchor into view only for immediate tooltips \u2014 hover/click tooltips\n // are triggered by user interaction so the element is already in view.\n if (!opts.trigger || opts.trigger === 'immediate') {\n const rect = anchorEl.getBoundingClientRect();\n const isLargeElement = rect.width > window.innerWidth * 0.8 || rect.height > window.innerHeight * 0.8;\n if (!isLargeElement) {\n anchorEl.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });\n }\n }\n const div = document.createElement('div');\n div.className = 'syntro-tooltip';\n div.setAttribute('role', 'tooltip');\n div.innerHTML = sanitizeHtml(opts.html);\n // Add close button for immediate tooltips so users can dismiss them\n if (!opts.trigger || opts.trigger === 'immediate') {\n const closeBtn = document.createElement('button');\n closeBtn.className = 'syntro-tooltip-close';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.textContent = '\\u00d7';\n Object.assign(closeBtn.style, {\n position: 'absolute',\n top: '4px',\n right: '4px',\n background: 'none',\n border: 'none',\n color: 'inherit',\n fontSize: '16px',\n lineHeight: '1',\n cursor: 'pointer',\n opacity: '0.6',\n padding: '2px 4px',\n });\n closeBtn.addEventListener('mouseenter', () => {\n closeBtn.style.opacity = '1';\n });\n closeBtn.addEventListener('mouseleave', () => {\n closeBtn.style.opacity = '0.6';\n });\n closeBtn.addEventListener('click', () => handle.destroy());\n div.style.position = 'relative';\n div.appendChild(closeBtn);\n }\n // Handle action button clicks\n const actionBtns = div.querySelectorAll('[data-syntro-action]');\n const actionHandler = (e) => {\n const btn = e.currentTarget;\n const actionId = btn.getAttribute('data-syntro-action');\n if (actionId && opts.onAction) {\n opts.onAction(actionId);\n }\n };\n actionBtns.forEach((btn) => btn.addEventListener('click', actionHandler));\n // Create arrow element\n const arrowEl = document.createElement('div');\n arrowEl.className = 'syntro-tooltip-arrow';\n div.appendChild(arrowEl);\n overlayRoot.appendChild(div);\n const middleware = [\n offset(opts.offsetPx ?? 8),\n flip(),\n shift({ padding: 8 }),\n hide(),\n arrowMiddleware({ element: arrowEl }),\n ];\n const placement = opts.placement && opts.placement !== 'auto' ? opts.placement : 'top';\n const cleanup = autoUpdate(anchorEl, div, async () => {\n // Guard: if anchor was removed from DOM (e.g. React Router navigation),\n // destroy the overlay gracefully instead of positioning at stale coords.\n if (!anchorEl.isConnected) {\n handle.destroy();\n return;\n }\n const currentAnchorRef = getAnchorReference(anchorEl);\n const result = await computePosition(currentAnchorRef, div, {\n placement,\n strategy: 'fixed',\n middleware,\n });\n const { x, y, strategy, middlewareData, placement: finalPlacement } = result;\n Object.assign(div.style, {\n left: `${x}px`,\n top: `${y}px`,\n position: strategy,\n });\n // Position arrow\n if (middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n const side = finalPlacement.split('-')[0];\n const staticSide = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n };\n Object.assign(arrowEl.style, {\n left: arrowX != null ? `${arrowX}px` : '',\n top: arrowY != null ? `${arrowY}px` : '',\n right: '',\n bottom: '',\n [staticSide[side]]: '-4px',\n });\n const rotation = {\n top: '0deg',\n right: '90deg',\n bottom: '180deg',\n left: '270deg',\n };\n arrowEl.style.transform = `rotate(${rotation[side] || '0deg'})`;\n }\n });\n const onKey = (e) => {\n if (e.key === 'Escape')\n handle.destroy();\n };\n window.addEventListener('keydown', onKey);\n // Handle blocking mode\n const originalInert = [];\n if (opts.blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== overlayRoot && el.getAttribute('inert') === null) {\n el.setAttribute('inert', '');\n originalInert.push(el.id || el.tagName);\n }\n });\n const focusableEls = Array.from(div.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'));\n if (focusableEls.length > 0) {\n const firstFocusable = focusableEls[0];\n const lastFocusable = focusableEls[focusableEls.length - 1];\n const trapFocus = (e) => {\n if (e.key !== 'Tab')\n return;\n if (e.shiftKey) {\n if (document.activeElement === firstFocusable) {\n lastFocusable.focus();\n e.preventDefault();\n }\n }\n else if (document.activeElement === lastFocusable) {\n firstFocusable.focus();\n e.preventDefault();\n }\n };\n div.addEventListener('keydown', trapFocus);\n requestAnimationFrame(() => firstFocusable.focus());\n }\n }\n const attachTrigger = () => {\n if (opts.trigger === 'hover') {\n let hideTimeout = null;\n const show = () => {\n if (hideTimeout) {\n clearTimeout(hideTimeout);\n hideTimeout = null;\n }\n div.style.visibility = 'visible';\n div.style.opacity = '1';\n };\n const scheduleHide = () => {\n hideTimeout = setTimeout(() => {\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n hideTimeout = null;\n }, 100);\n };\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease, visibility 200ms';\n anchorEl.addEventListener('mouseenter', show);\n anchorEl.addEventListener('mouseleave', scheduleHide);\n div.addEventListener('mouseenter', show);\n div.addEventListener('mouseleave', scheduleHide);\n anchorEl.addEventListener('focus', show);\n anchorEl.addEventListener('blur', scheduleHide);\n return () => {\n if (hideTimeout)\n clearTimeout(hideTimeout);\n anchorEl.removeEventListener('mouseenter', show);\n anchorEl.removeEventListener('mouseleave', scheduleHide);\n div.removeEventListener('mouseenter', show);\n div.removeEventListener('mouseleave', scheduleHide);\n anchorEl.removeEventListener('focus', show);\n anchorEl.removeEventListener('blur', scheduleHide);\n };\n }\n if (opts.trigger === 'click') {\n const toggle = () => {\n const isVisible = div.style.visibility === 'visible';\n if (isVisible) {\n handle.destroy();\n }\n else {\n div.style.visibility = 'visible';\n div.style.opacity = '1';\n }\n };\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease, visibility 200ms';\n anchorEl.addEventListener('click', toggle);\n return () => anchorEl.removeEventListener('click', toggle);\n }\n // Immediate - fade in on mount\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease';\n requestAnimationFrame(() => {\n div.style.opacity = '1';\n });\n return () => { };\n };\n const removeTrigger = attachTrigger();\n const handle = {\n el: div,\n destroy() {\n cleanup();\n removeTrigger();\n window.removeEventListener('keydown', onKey);\n actionBtns.forEach((btn) => btn.removeEventListener('click', actionHandler));\n if (opts.blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== overlayRoot) {\n el.removeAttribute('inert');\n }\n });\n }\n div.style.pointerEvents = 'none';\n div.style.opacity = '0';\n setTimeout(() => {\n try {\n div.remove();\n }\n catch {\n /* already detached */\n }\n }, 200);\n },\n };\n return handle;\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\n/**\n * Workflow Widget - MountableWidget for the WorkflowTracker\n *\n * Bridges runtime.actions.getActive() (tour actions with workflow metadata),\n * runtime events (tour.started, tour.step_started, etc.), and the\n * WorkflowTracker presentational component.\n *\n * Responsibilities:\n * 1. Scan runtime.actions.getActive() for tours with `workflow` field\n * 2. Re-scan on tour.started events (tiles render before actions are applied)\n * 3. Load persisted state from runtime.state.user namespace\n * 4. Subscribe to tour.* events and update workflow entries\n * 5. Render WorkflowTracker with derived workflow entries\n * 6. Handle step clicks (publish workflow:jump_to_step)\n * 7. Handle dismiss (persist and re-render)\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { WorkflowTracker } from './WorkflowTracker';\n// ============================================================================\n// Helpers\n// ============================================================================\n/**\n * Show a toast notification for a workflow tour.\n * Creates a DOM element, appends it to the container, and auto-removes after 4 seconds.\n */\nfunction showWorkflowToast(notification) {\n const toast = document.createElement('div');\n toast.setAttribute('data-testid', 'workflow-toast');\n toast.className = 'se-fixed se-bottom-4 se-right-4 se-z-50';\n Object.assign(toast.style, {\n position: 'fixed',\n bottom: '16px',\n right: '16px',\n zIndex: '2147483646',\n padding: '12px 16px',\n borderRadius: '8px',\n backgroundColor: 'var(--se-color-bg-surface, #fff)',\n color: 'var(--se-color-text-primary, #1a1a1a)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n maxWidth: '320px',\n fontFamily: 'var(--se-font-family, system-ui, sans-serif)',\n fontSize: '14px',\n lineHeight: '1.4',\n transition: 'opacity 0.3s ease',\n });\n const titleEl = document.createElement('div');\n titleEl.className = 'se-font-semibold';\n titleEl.style.fontWeight = '600';\n titleEl.textContent = notification.title;\n toast.appendChild(titleEl);\n if (notification.body) {\n const bodyEl = document.createElement('div');\n bodyEl.className = 'se-mt-1 se-text-sm';\n bodyEl.style.marginTop = '4px';\n bodyEl.style.fontSize = '13px';\n bodyEl.style.color = 'var(--se-color-text-secondary, #666)';\n bodyEl.textContent = notification.body;\n toast.appendChild(bodyEl);\n }\n // Append to document.body so the toast is visible at the viewport level\n // (the container is inside shadow DOM, where position:fixed is scoped)\n document.body.appendChild(toast);\n // Auto-remove after 4 seconds\n let removeTimer;\n const fadeTimer = setTimeout(() => {\n toast.style.opacity = '0';\n removeTimer = setTimeout(() => {\n toast.remove();\n }, 300);\n }, 4000);\n // Return cleanup function for unmount safety\n return () => {\n clearTimeout(fadeTimer);\n clearTimeout(removeTimer);\n toast.remove();\n };\n}\n/**\n * Extract workflow-enabled tours from active actions (runtime.actions.getActive()).\n * Only actions with kind 'core:tour', a tourId, and a workflow field are included.\n */\nfunction extractWorkflowsFromActive(activeActions) {\n const workflows = new Map();\n for (const entry of activeActions) {\n const action = entry.action;\n if (action.kind === 'core:tour' && action.workflow && action.tourId) {\n const meta = action.workflow;\n const rawSteps = action.steps || [];\n const steps = rawSteps.map((s) => ({\n id: s.id,\n title: meta.stepTitles?.[s.id] || s.id,\n }));\n workflows.set(action.tourId, { meta, steps });\n }\n }\n return workflows;\n}\nexport function WorkflowWidgetInner({ runtime }) {\n // Scan active actions for workflow-enabled tours.\n // Re-scans when actionVersion bumps (triggered by tour.started events).\n const [actionVersion, setActionVersion] = useState(0);\n const tourWorkflows = useMemo(() => {\n const active = runtime?.actions?.getActive?.() || [];\n return extractWorkflowsFromActive(active);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runtime, actionVersion]);\n // Keep a ref so event handlers always see the latest tourWorkflows\n const tourWorkflowsRef = useRef(tourWorkflows);\n tourWorkflowsRef.current = tourWorkflows;\n // Re-scan active actions when a tour starts (handles tile-renders-before-actions timing)\n useEffect(() => {\n if (!runtime?.events?.subscribe)\n return;\n return runtime.events.subscribe({ names: ['tour.started', 'tour.resumed'] }, () => setActionVersion((v) => v + 1));\n }, [runtime]);\n // Load persisted state\n const stateNs = useMemo(() => runtime?.state?.user?.ns?.('workflows'), [runtime]);\n // Ref to track which tours have had a toast notification\n const notifiedRef = useRef(new Set());\n // Ref to track toast cleanup functions for unmount safety\n const toastCleanupsRef = useRef([]);\n // Ref to track the container element for toast rendering\n const containerRef = useRef(null);\n // Ref to track completed tour timestamps\n const completedMapRef = useRef({});\n // Build workflow entries from discovered tours + persisted state\n const [workflowEntries, setWorkflowEntries] = useState([]);\n // Initialize persisted state refs once\n const persistInitialized = useRef(false);\n if (!persistInitialized.current && stateNs) {\n const notified = stateNs.get?.('notified') || [];\n for (const id of notified) {\n notifiedRef.current.add(id);\n }\n const completed = stateNs.get?.('completed') || {};\n completedMapRef.current = { ...completed };\n persistInitialized.current = true;\n }\n // Sync workflowEntries when tourWorkflows changes (new tours discovered via getActive)\n useEffect(() => {\n if (tourWorkflows.size === 0)\n return;\n const dismissed = stateNs?.get?.('dismissed') || [];\n const completed = stateNs?.get?.('completed') || {};\n setWorkflowEntries((prev) => {\n const existingIds = new Set(prev.map((e) => e.tourId));\n const newEntries = [];\n for (const [tourId, { meta, steps }] of tourWorkflows) {\n if (existingIds.has(tourId))\n continue; // Already tracked\n let status = 'active';\n if (dismissed.includes(tourId)) {\n status = 'dismissed';\n }\n else if (completed[tourId]) {\n status = 'completed';\n }\n newEntries.push({\n tourId,\n meta,\n steps,\n currentStepId: null,\n completedSteps: [],\n status,\n completedAt: completed[tourId] || undefined,\n });\n }\n return newEntries.length > 0 ? [...prev, ...newEntries] : prev;\n });\n // Fire toast for newly discovered active tours.\n // This handles the race condition where tour.started fires before the\n // widget discovers the tour via getActive() re-scan.\n for (const [tourId, { meta }] of tourWorkflows) {\n if (!notifiedRef.current.has(tourId) &&\n meta.notification &&\n !dismissed.includes(tourId) &&\n !completed[tourId]) {\n notifiedRef.current.add(tourId);\n stateNs?.set?.('notified', [...notifiedRef.current]);\n const cleanup = showWorkflowToast(meta.notification);\n toastCleanupsRef.current.push(cleanup);\n }\n }\n }, [tourWorkflows, stateNs]);\n // Subscribe to tour events\n useEffect(() => {\n if (!runtime?.events?.subscribe)\n return;\n const unsubscribe = runtime.events.subscribe({ patterns: ['^tour\\\\.'] }, (event) => {\n const tourId = event.props?.tourId;\n if (!tourId)\n return;\n // Re-scan active actions on tour.started (handles tile-renders-before-actions timing)\n const currentWorkflows = tourWorkflowsRef.current;\n if (!currentWorkflows.has(tourId) && event.name === 'tour.started') {\n // Tour just became active \u2014 re-scan will pick it up on next render\n setActionVersion((v) => v + 1);\n return;\n }\n // Only process events for tours that have workflow metadata\n if (!currentWorkflows.has(tourId))\n return;\n setWorkflowEntries((prev) => {\n const updated = prev.map((entry) => {\n if (entry.tourId !== tourId)\n return entry;\n switch (event.name) {\n case 'tour.started': {\n const startStepId = event.props?.startStepId || entry.steps[0]?.id || null;\n // Fire toast notification if not already notified\n if (!notifiedRef.current.has(tourId)) {\n notifiedRef.current.add(tourId);\n stateNs?.set?.('notified', [...notifiedRef.current]);\n const workflow = currentWorkflows.get(tourId);\n if (workflow?.meta.notification) {\n const cleanup = showWorkflowToast(workflow.meta.notification);\n toastCleanupsRef.current.push(cleanup);\n }\n }\n // Persist active state\n const activeIds = prev\n .filter((e) => e.status === 'active' || e.tourId === tourId)\n .map((e) => e.tourId);\n if (!activeIds.includes(tourId)) {\n activeIds.push(tourId);\n }\n stateNs?.set?.('active', [...new Set(activeIds)]);\n return {\n ...entry,\n status: 'active',\n currentStepId: startStepId,\n completedSteps: entry.status === 'active' ? entry.completedSteps : [],\n };\n }\n case 'tour.step_started': {\n const stepId = event.props?.stepId;\n return {\n ...entry,\n currentStepId: stepId || entry.currentStepId,\n };\n }\n case 'tour.step_changed': {\n const previousStepId = event.props?.previousStepId;\n const nextStepId = event.props?.nextStepId;\n const completedSteps = previousStepId && !entry.completedSteps.includes(previousStepId)\n ? [...entry.completedSteps, previousStepId]\n : entry.completedSteps;\n return {\n ...entry,\n currentStepId: nextStepId || entry.currentStepId,\n completedSteps,\n };\n }\n case 'tour.completed': {\n const completedAt = Date.now();\n // Persist completed state with timestamp\n completedMapRef.current[tourId] = completedAt;\n stateNs?.set?.('completed', { ...completedMapRef.current });\n return {\n ...entry,\n status: 'completed',\n currentStepId: null,\n completedSteps: entry.steps.map((s) => s.id),\n completedAt,\n };\n }\n case 'tour.paused': {\n // Keep current state, just note it was paused\n return entry;\n }\n default:\n return entry;\n }\n });\n return updated;\n });\n });\n return () => {\n unsubscribe();\n // Clean up any pending toast timers\n for (const cleanup of toastCleanupsRef.current) {\n cleanup();\n }\n toastCleanupsRef.current = [];\n };\n }, [runtime, stateNs]);\n // Handle step click \u2014 publish jump event\n const handleStepClick = useCallback((tourId, stepId) => {\n runtime?.events?.publish?.('workflow:jump_to_step', { tourId, stepId });\n }, [runtime]);\n // Handle dismiss\n const handleDismiss = useCallback((tourId) => {\n setWorkflowEntries((prev) => {\n const updated = prev.map((entry) => entry.tourId === tourId ? { ...entry, status: 'dismissed' } : entry);\n // Persist dismissed state\n const dismissedIds = updated.filter((e) => e.status === 'dismissed').map((e) => e.tourId);\n stateNs?.set?.('dismissed', dismissedIds);\n return updated;\n });\n }, [stateNs]);\n // Filter to active workflows only for rendering\n const activeWorkflows = useMemo(() => workflowEntries.filter((w) => w.status === 'active'), [workflowEntries]);\n return (_jsx(\"div\", { ref: containerRef, children: _jsx(WorkflowTracker, { workflows: activeWorkflows, onStepClick: handleStepClick, onDismiss: handleDismiss }) }));\n}\n// ============================================================================\n// MountableWidget Interface\n// ============================================================================\n/**\n * Mountable widget interface for the runtime's WidgetRegistry.\n *\n * Follows the MountableWidget contract:\n * mount(container, config?) -> cleanup | void\n *\n * Config is enriched with `runtime` by WidgetRegistry.bindRuntime().\n */\nexport const WorkflowMountableWidget = {\n mount(container, config) {\n const runtime = config?.runtime || null;\n const root = createRoot(container);\n root.render(React.createElement(WorkflowWidgetInner, {\n runtime,\n }));\n // Return cleanup function\n return () => {\n root.unmount();\n };\n },\n};\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction ProgressBar({ completed, total }) {\n const percent = total > 0 ? Math.round((completed / total) * 100) : 0;\n return (_jsx(\"div\", { className: \"se-w-full se-h-1.5 se-rounded-full se-bg-white/[0.08] se-overflow-hidden\", children: _jsx(\"div\", { role: \"progressbar\", \"aria-valuenow\": percent, \"aria-valuemin\": 0, \"aria-valuemax\": 100, className: \"se-h-full se-rounded-full se-bg-blue-5 se-transition-all se-duration-300\", style: { width: `${percent}%` } }) }));\n}\nfunction StepItem({ step, isCompleted, isCurrent, tourId, onStepClick, }) {\n return (_jsxs(\"button\", { type: \"button\", \"data-testid\": `step-${step.id}`, \"data-current\": isCurrent ? 'true' : undefined, \"data-completed\": isCompleted ? 'true' : undefined, \"aria-current\": isCurrent ? 'step' : undefined, className: `se-flex se-items-center se-gap-2 se-w-full se-py-1.5 se-px-2 se-rounded se-border-none se-bg-transparent se-cursor-pointer se-text-left se-text-xs ${isCurrent ? 'se-font-semibold se-text-slate-grey-10' : 'se-text-slate-grey-8'}`, onClick: () => onStepClick(tourId, step.id), children: [_jsx(\"span\", { className: \"se-shrink-0 se-w-4 se-text-center\", children: isCompleted ? (_jsx(\"span\", { role: \"img\", \"aria-label\": \"completed\", className: \"se-text-green-5\", children: \"\\u2713\" })) : isCurrent ? (_jsx(\"span\", { className: \"se-inline-block se-w-1.5 se-h-1.5 se-rounded-full se-bg-blue-5\" })) : (_jsx(\"span\", { className: \"se-inline-block se-w-1.5 se-h-1.5 se-rounded-full se-bg-white/[0.12]\" })) }), _jsx(\"span\", { className: \"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap\", children: step.title })] }));\n}\nfunction WorkflowCard({ workflow, expanded, onStepClick, onDismiss, }) {\n const completedCount = workflow.completedSteps.length;\n const totalSteps = workflow.steps.length;\n return (_jsxs(\"div\", { className: \"se-p-3 se-rounded-lg se-border se-border-white/[0.08] se-bg-white/[0.02]\", children: [_jsxs(\"div\", { className: \"se-flex se-items-center se-gap-2 se-mb-2\", children: [workflow.meta.icon && (_jsx(\"span\", { \"data-testid\": \"workflow-icon\", className: \"se-shrink-0 se-text-sm\", children: workflow.meta.icon })), _jsx(\"span\", { className: \"se-flex-1 se-text-[13px] se-font-semibold se-text-slate-grey-10 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap\", children: workflow.meta.title }), _jsx(\"button\", { type: \"button\", \"data-testid\": `dismiss-${workflow.tourId}`, className: \"se-shrink-0 se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-slate-grey-7 se-text-xs se-cursor-pointer se-leading-none\", onClick: () => onDismiss(workflow.tourId), \"aria-label\": `Dismiss ${workflow.meta.title}`, children: \"\\u2715\" })] }), _jsxs(\"div\", { className: \"se-mb-2\", children: [_jsx(ProgressBar, { completed: completedCount, total: totalSteps }), _jsxs(\"div\", { className: \"se-text-[10px] se-text-slate-grey-7 se-mt-1\", children: [completedCount, \" of \", totalSteps, \" steps\"] })] }), _jsx(\"div\", { className: \"se-flex se-flex-col\", children: workflow.steps.map((step) => (_jsx(StepItem, { step: step, isCompleted: workflow.completedSteps.includes(step.id), isCurrent: workflow.currentStepId === step.id, tourId: workflow.tourId, onStepClick: onStepClick }, step.id))) }), expanded && workflow.meta.description && (_jsx(\"div\", { className: \"se-mt-2 se-text-[11px] se-text-slate-grey-7\", children: workflow.meta.description }))] }));\n}\nexport function WorkflowTracker({ workflows, expanded, onStepClick, onDismiss, }) {\n if (workflows.length === 0) {\n return (_jsx(\"div\", { className: \"se-flex se-items-center se-justify-center se-py-6 se-text-xs se-text-slate-grey-7\", children: \"No active workflows\" }));\n }\n return (_jsx(\"div\", { className: \"se-flex se-flex-col se-gap-2\", children: workflows.map((workflow) => (_jsx(WorkflowCard, { workflow: workflow, expanded: expanded, onStepClick: onStepClick, onDismiss: onDismiss }, workflow.tourId))) }));\n}\n", "/**\n * Adaptive Overlays - Runtime Module\n *\n * Visual overlay actions: highlight, pulse, badge, tooltip, celebrations.\n */\nimport { executeCelebrate } from './celebrations';\nimport { executeTour } from './executors/tour';\nimport { showHighlight } from './highlight';\nimport { executeModal } from './modal';\nimport { sanitizeHtml } from './sanitizer';\nimport { showTooltip } from './tooltip';\nimport { WorkflowMountableWidget } from './WorkflowWidget';\n// Re-export executeModal and executeTour for use by other packages\nexport { executeModal, executeTour };\n// ============================================================================\n// Executors\n// ============================================================================\n/**\n * Execute a highlight action\n */\nexport const executeHighlight = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-overlays] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n // Skip re-application if the user previously dismissed this highlight.\n // The dismissed attribute is set by onDismiss (user click-outside / Esc)\n // and survives config-driven revert+reapply cycles.\n if (anchorEl.getAttribute('data-syntro-highlight-dismissed')) {\n return { cleanup: () => { } };\n }\n // Self-guard: destroy any existing highlight on this anchor to prevent duplicates\n // (batch re-apply on navigation can call this executor multiple times for the same anchor)\n const existing = anchorEl.getAttribute('data-syntro-highlight');\n if (existing) {\n const prev = context.overlayRoot.querySelectorAll('.syntro-spotlight-scrim, .syntro-spotlight-ring');\n prev.forEach((el) => el.remove());\n }\n anchorEl.setAttribute('data-syntro-highlight', 'true');\n // Resolve ring color: action override \u2192 theme primary \u2192 host page var \u2192 fallback\n let ringColor = action.style?.color;\n if (!ringColor) {\n try {\n const primary = getComputedStyle(context.overlayRoot)\n .getPropertyValue('--sc-color-primary')\n ?.trim();\n if (primary)\n ringColor = primary;\n }\n catch {\n /* fallback to showHighlight default */\n }\n }\n const handle = showHighlight(anchorEl, context.overlayRoot, {\n paddingPx: action.style?.paddingPx ?? 12,\n radiusPx: action.style?.radiusPx ?? 12,\n scrimOpacity: action.style?.scrimOpacity ?? 0.55,\n ringColor,\n blocking: action.blocking ?? false,\n onClickOutside: action.onClickOutside ?? true,\n onEsc: action.onEsc ?? true,\n onDismiss: () => {\n anchorEl.setAttribute('data-syntro-highlight-dismissed', 'true');\n },\n });\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:highlight',\n anchorId: action.anchorId,\n });\n return {\n cleanup: () => {\n handle.destroy();\n anchorEl.removeAttribute('data-syntro-highlight');\n anchorEl.removeAttribute('data-syntro-highlight-dismissed');\n },\n };\n};\n/**\n * Execute a pulse action\n */\nexport const executePulse = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-overlays] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n const duration = action.duration ?? 4000;\n // Wait one frame so ThemeProvider's useEffect has injected CSS vars\n await new Promise((resolve) => requestAnimationFrame(resolve));\n // Read primary + secondary colors from theme (shadow DOM overlay root has --sc-* vars)\n const parseHex = (hex) => ({\n r: parseInt(hex.slice(1, 3), 16),\n g: parseInt(hex.slice(3, 5), 16),\n b: parseInt(hex.slice(5, 7), 16),\n });\n const fallback = { r: 79, g: 70, b: 229 }; // indigo-600\n let primary = fallback;\n let secondary = null;\n try {\n const styles = getComputedStyle(context.overlayRoot);\n const pHex = styles.getPropertyValue('--sc-color-primary')?.trim();\n const sHex = styles.getPropertyValue('--sc-color-primary-hover')?.trim();\n if (pHex?.startsWith('#') && pHex.length >= 7) {\n primary = parseHex(pHex);\n }\n if (sHex?.startsWith('#') && sHex.length >= 7) {\n secondary = parseHex(sHex);\n }\n }\n catch {\n /* fallback to default */\n }\n // Inject/update pulse animation with theme colors\n // Two-tone pulse when both primary and secondary are available\n const existing = document.querySelector('[data-syntro-pulse-styles]');\n if (existing)\n existing.remove();\n const style = document.createElement('style');\n style.setAttribute('data-syntro-pulse-styles', '');\n const { r: pr, g: pg, b: pb } = primary;\n if (secondary) {\n const { r: sr, g: sg, b: sb } = secondary;\n style.textContent = `\n @keyframes syntro-pulse-anim {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(${pr}, ${pg}, ${pb}, 0.35);\n }\n 25% {\n box-shadow: 0 0 0 12px rgba(${pr}, ${pg}, ${pb}, 0);\n }\n 50% {\n box-shadow: 0 0 0 0 rgba(${sr}, ${sg}, ${sb}, 0.35);\n }\n 75% {\n box-shadow: 0 0 0 12px rgba(${sr}, ${sg}, ${sb}, 0);\n }\n }\n `;\n }\n else {\n style.textContent = `\n @keyframes syntro-pulse-anim {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(${pr}, ${pg}, ${pb}, 0.35);\n }\n 50% {\n box-shadow: 0 0 0 12px rgba(${pr}, ${pg}, ${pb}, 0);\n }\n }\n `;\n }\n document.head.appendChild(style);\n // Apply pulse animation via inline style (scoped to this element)\n const originalAnimation = anchorEl.style.animation;\n anchorEl.style.animation = 'syntro-pulse-anim 2.5s cubic-bezier(0.4, 0, 0.6, 1) infinite';\n anchorEl.setAttribute('data-syntro-pulse', 'true');\n // Set up auto-remove timeout\n const timeoutId = setTimeout(() => {\n anchorEl.style.animation = originalAnimation;\n anchorEl.removeAttribute('data-syntro-pulse');\n }, duration);\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:pulse',\n anchorId: action.anchorId,\n duration,\n });\n return {\n cleanup: () => {\n clearTimeout(timeoutId);\n if (!anchorEl.isConnected)\n return;\n anchorEl.style.animation = originalAnimation;\n anchorEl.removeAttribute('data-syntro-pulse');\n },\n };\n};\n/**\n * Execute a badge action\n */\nexport const executeBadge = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-overlays] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n // Read primary color from theme (overlay root has --sc-* vars from shadow DOM)\n let badgeColor = '#4f46e5';\n try {\n const primary = getComputedStyle(context.overlayRoot)\n .getPropertyValue('--sc-color-primary')\n ?.trim();\n if (primary?.startsWith('#') && primary.length >= 7) {\n badgeColor = primary;\n }\n }\n catch {\n /* fallback to default */\n }\n // Create badge element with inline styles (no global style injection)\n const badge = document.createElement('div');\n badge.textContent = action.content;\n badge.setAttribute('data-syntro-badge', action.anchorId.selector);\n // Apply styles directly to element\n Object.assign(badge.style, {\n position: 'absolute',\n padding: '2px 6px',\n fontSize: '12px',\n fontWeight: '600',\n lineHeight: '1',\n color: 'white',\n background: badgeColor,\n borderRadius: '9999px',\n pointerEvents: 'none',\n zIndex: '2147483646',\n whiteSpace: 'nowrap',\n });\n // Position badge relative to anchor\n const position = action.position ?? 'top-right';\n // Ensure anchor has relative positioning for badge\n const originalPosition = anchorEl.style.position;\n if (getComputedStyle(anchorEl).position === 'static') {\n anchorEl.style.position = 'relative';\n }\n // Append to anchor for relative positioning\n anchorEl.appendChild(badge);\n // Position based on config\n switch (position) {\n case 'top-left':\n Object.assign(badge.style, { top: '-8px', left: '-8px' });\n break;\n case 'top-right':\n Object.assign(badge.style, { top: '-8px', right: '-8px' });\n break;\n case 'bottom-left':\n Object.assign(badge.style, { bottom: '-8px', left: '-8px' });\n break;\n case 'bottom-right':\n Object.assign(badge.style, { bottom: '-8px', right: '-8px' });\n break;\n }\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:badge',\n anchorId: action.anchorId,\n content: action.content,\n position,\n });\n return {\n cleanup: () => {\n try {\n badge.remove();\n }\n catch {\n /* already detached */\n }\n if (!anchorEl.isConnected)\n return;\n if (originalPosition !== undefined) {\n anchorEl.style.position = originalPosition;\n }\n },\n updateFn: (changes) => {\n if ('content' in changes && typeof changes.content === 'string') {\n badge.textContent = changes.content;\n }\n },\n };\n};\n/**\n * Execute a tooltip action\n */\nexport const executeTooltip = async (action, context) => {\n let anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl && context.waitForAnchor) {\n anchorEl = await context.waitForAnchor(action.anchorId, 3000);\n }\n if (!anchorEl) {\n console.warn(`[adaptive-overlays] Anchor not found after waiting: ${action.anchorId.selector}`);\n return { cleanup: () => { } };\n }\n // Build tooltip HTML\n const { content } = action;\n let html = '';\n if (content.title) {\n html += `<div class=\"syntro-tt-title\">${sanitizeHtml(content.title)}</div>`;\n }\n html += `<div class=\"syntro-tt-body\">${sanitizeHtml(content.body)}</div>`;\n // Add CTA buttons if provided (new multi-button support)\n if (content.ctaButtons && content.ctaButtons.length > 0) {\n html += `<div class=\"syntro-tt-actions\">`;\n for (const btn of content.ctaButtons) {\n const isPrimary = btn.primary ?? false;\n html += `\n <button\n class=\"syntro-tt-btn ${isPrimary ? 'syntro-tt-btn-primary' : ''}\"\n data-syntro-action=\"${sanitizeHtml(btn.actionId)}\"\n >\n ${sanitizeHtml(btn.label)}\n </button>\n `;\n }\n html += `</div>`;\n }\n else if (content.cta) {\n // Legacy single CTA support\n html += `<div class=\"syntro-tt-actions\">\n <button class=\"syntro-tt-btn syntro-tt-btn-primary\" data-syntro-action=\"cta\">\n ${sanitizeHtml(content.cta.label)}\n </button>\n </div>`;\n }\n const handle = showTooltip(anchorEl, context.overlayRoot, {\n html,\n placement: action.placement ?? 'top',\n trigger: action.trigger ?? 'immediate',\n onAction: (actionId) => {\n // Handle dismiss CTA \u2014 destroy the tooltip\n if (actionId === 'dismiss') {\n handle.destroy();\n return;\n }\n if (actionId === 'cta' && content.cta) {\n context.publishEvent('action.cta_clicked', {\n anchorId: action.anchorId,\n ctaLabel: content.cta.label,\n });\n }\n else if (content.ctaButtons) {\n const clickedBtn = content.ctaButtons.find((b) => b.actionId === actionId);\n if (clickedBtn) {\n context.publishEvent('action.tooltip_cta_clicked', {\n anchorId: action.anchorId,\n actionId,\n label: clickedBtn.label,\n });\n }\n }\n handle.destroy();\n },\n });\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:tooltip',\n anchorId: action.anchorId,\n trigger: action.trigger ?? 'immediate',\n });\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n/**\n * All executors provided by this app.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executors = [\n { kind: 'overlays:highlight', executor: executeHighlight },\n { kind: 'overlays:pulse', executor: executePulse },\n { kind: 'overlays:badge', executor: executeBadge },\n { kind: 'overlays:tooltip', executor: executeTooltip },\n { kind: 'overlays:modal', executor: executeModal },\n { kind: 'core:tour', executor: executeTour },\n { kind: 'overlays:celebrate', executor: executeCelebrate },\n];\n/**\n * App runtime manifest.\n */\nexport const runtime = {\n id: 'adaptive-overlays',\n version: '1.0.0',\n name: 'Overlays',\n description: 'Tooltips, highlights, badges, modals, celebrations, visual overlays, and workflow tracking',\n executors,\n widgets: [\n {\n id: 'adaptive-overlays:workflow-tracker',\n component: WorkflowMountableWidget,\n metadata: {\n name: 'Workflow Tracker',\n icon: '\uD83D\uDCCB',\n description: 'Tracks multi-step workflow progress across tours',\n },\n },\n ],\n};\n", "/**\n * App Context\n *\n * Provides a sandboxed runtime context for apps.\n * Apps receive an AppContext when they activate, giving them controlled\n * access to runtime functionality.\n */\n\nimport type { SmartCanvasRuntime } from '../runtime';\n\nimport type { AppActionDefinition, AppContext, AppWidgetDefinition } from './types';\n\n/**\n * Options for creating an AppContext.\n */\nexport interface CreateAppContextOptions {\n /** The app ID */\n appId: string;\n /** The runtime instance */\n runtime: SmartCanvasRuntime;\n /** Whether this is a built-in app (prevents executor override) */\n isBuiltIn?: boolean;\n}\n\n/**\n * Create a sandboxed AppContext for an app.\n *\n * The context provides controlled access to runtime functionality,\n * with state namespaced to the app.\n */\nexport function createAppContext(options: CreateAppContextOptions): AppContext {\n const { appId, runtime, isBuiltIn = false } = options;\n const _statePrefix = `app:${appId}:`;\n\n // Track registered actions and widgets for cleanup\n const registeredActions: string[] = [];\n const registeredWidgets: string[] = [];\n\n // Get or create namespaced storage for this app\n const appStorage = runtime.state.ns(`app:${appId}`);\n\n const context: AppContext = {\n appId,\n\n // Namespaced state access (using session storage scoped to this app)\n state: {\n get: (key: string) => appStorage.get(key),\n set: (key: string, value: unknown) => appStorage.set(key, value),\n remove: (key: string) => appStorage.remove(key),\n },\n\n // Telemetry access (if available) - using EventBus for custom events\n telemetry: runtime.telemetry\n ? {\n emit: (eventName: string, props?: Record<string, unknown>) => {\n // Use EventBus to emit custom events since TelemetryClient doesn't have generic emit\n runtime.events.publish(eventName, {\n ...props,\n _appId: appId,\n });\n },\n getSessionId: () => runtime.telemetry?.getSessionId?.(),\n }\n : undefined,\n\n // Surfaces access\n surfaces: {\n mount: (slot, content, opts) => {\n const handle = runtime.surfaces.mount(slot as any, content as any, {\n ...(opts as any),\n adaptiveId: appId,\n });\n return {\n unmount: () => handle.unmount(),\n update: (newContent) => handle.update(newContent as any),\n };\n },\n canMount: (slot, priority) => runtime.surfaces.canMount(slot as any, priority),\n },\n\n // Events access\n events: {\n subscribe: (callback) =>\n runtime.events.subscribe((event) => {\n callback(event);\n }),\n publish: (name, props) => {\n runtime.events.publish(name, {\n ...props,\n _appId: appId,\n });\n },\n },\n\n // Action registration\n registerAction: (definition: AppActionDefinition) => {\n runtime.executors.register(\n definition.kind,\n definition.executor,\n definition.schema,\n appId,\n isBuiltIn\n );\n registeredActions.push(definition.kind);\n },\n\n // Widget registration\n registerWidget: (definition: AppWidgetDefinition) => {\n runtime.widgets.register(definition.id, definition.component, appId, definition.metadata);\n registeredWidgets.push(definition.id);\n },\n };\n\n return context;\n}\n\n/**\n * Clean up all resources registered by an app context.\n */\nexport function cleanupAppContext(appId: string, runtime: SmartCanvasRuntime): void {\n // Unregister all executors from this app\n runtime.executors.unregisterBySource(appId);\n\n // Unregister all widgets from this app\n runtime.widgets.unregisterBySource(appId);\n}\n", "/**\n * App Loader\n *\n * Handles loading apps from CDN based on canvas config requirements.\n *\n * Loading Strategy:\n * 1. Core apps (built-in actions) are bundled with runtime - no loading needed\n * 2. External apps are loaded from CDN when config references them\n *\n * The loader determines which apps are needed by scanning the canvas config for:\n * - Action kinds with namespaces (e.g., \"gamification:awardBadge\")\n * - Widget IDs with namespaces (e.g., \"gamification:leaderboard\")\n * - Explicit app references in config\n */\n\nimport type { AppRegistry } from './AppRegistry';\nimport type { AppManifest } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * App loading options.\n */\nexport interface AppLoaderOptions {\n /** Base URL for CDN app bundles */\n cdnBase: string;\n /** App registry to register loaded apps */\n registry: AppRegistry;\n /** Timeout for loading apps (ms) */\n timeout?: number;\n /** Callback when an app starts loading */\n onLoadStart?: (appId: string) => void;\n /** Callback when an app finishes loading */\n onLoadEnd?: (appId: string, success: boolean, error?: string) => void;\n}\n\n/**\n * App load result.\n */\nexport interface AppLoadResult {\n appId: string;\n success: boolean;\n error?: string;\n manifest?: AppManifest;\n}\n\n/**\n * Canvas config for determining which apps to load.\n */\nexport interface CanvasConfigForLoader {\n /** Actions in the config */\n actions?: Array<{ kind: string; [key: string]: unknown }>;\n /** Explicit app IDs to load */\n apps?: string[];\n /** Widgets referenced in actions */\n widgets?: Array<{ widgetId?: string; widget?: { widgetId: string } }>;\n /** Tiles in the config (each may reference a widget) */\n tiles?: Array<{ widget?: string; [key: string]: unknown }>;\n}\n\n// ============================================================================\n// Core Apps (bundled with runtime)\n// ============================================================================\n\n/**\n * Core action kinds that are bundled with the runtime.\n * These don't require loading external apps.\n */\nconst CORE_ACTION_KINDS = new Set([\n // Overlay actions (bundled via @syntrologie/adapt-overlays)\n 'overlays:highlight',\n 'overlays:pulse',\n 'overlays:badge',\n 'overlays:tooltip',\n 'overlays:modal',\n // Content actions (bundled via @syntrologie/adapt-content)\n 'content:insertHtml',\n 'content:setText',\n 'content:setAttr',\n 'content:addClass',\n 'content:removeClass',\n 'content:setStyle',\n // Core actions (bundled with runtime)\n 'core:mountWidget',\n 'core:wait',\n 'core:sequence',\n 'core:parallel',\n 'core:tour',\n]);\n\n/**\n * Map action/widget namespace prefixes to CDN app IDs.\n * Needed when the action kind prefix doesn't match the CDN bundle directory name.\n * e.g., action \"faq:update\" has namespace \"faq\" but the CDN bundle is \"adaptive-faq\".\n */\nconst NAMESPACE_TO_APP_ID: Record<string, string> = {\n faq: 'adaptive-faq',\n nav: 'adaptive-nav',\n gamification: 'adaptive-gamification',\n chatbot: 'adaptive-chatbot',\n};\n\n/**\n * Resolve a namespace prefix to its CDN app ID.\n */\nfunction resolveAppId(namespace: string): string {\n return NAMESPACE_TO_APP_ID[namespace] ?? namespace;\n}\n\n/**\n * Check if an action kind is a core action.\n */\nexport function isCoreActionKind(kind: string): boolean {\n return CORE_ACTION_KINDS.has(kind);\n}\n\n/**\n * Extract app ID from a namespaced action kind.\n * e.g., \"gamification:awardBadge\" \u2192 \"gamification\"\n * e.g., \"navigation:scrollTo\" \u2192 \"nav\" (via namespace mapping)\n */\nexport function getAppIdFromActionKind(kind: string): string | null {\n if (isCoreActionKind(kind)) return null;\n const colonIndex = kind.indexOf(':');\n if (colonIndex === -1) return null;\n return resolveAppId(kind.slice(0, colonIndex));\n}\n\n/**\n * Extract app ID from a namespaced widget ID.\n * e.g., \"gamification:leaderboard\" \u2192 \"gamification\"\n */\nexport function getAppIdFromWidgetId(widgetId: string): string | null {\n const colonIndex = widgetId.indexOf(':');\n if (colonIndex === -1) return null;\n return resolveAppId(widgetId.slice(0, colonIndex));\n}\n\n// ============================================================================\n// App Loader\n// ============================================================================\n\n/**\n * Create an app loader instance.\n */\nexport function createAppLoader(options: AppLoaderOptions) {\n const { cdnBase, registry, timeout = 10000, onLoadStart, onLoadEnd } = options;\n\n /** Cache of loading promises to avoid duplicate loads */\n const loadingPromises = new Map<string, Promise<AppLoadResult>>();\n\n /** Cache of loaded app URLs */\n const loadedUrls = new Set<string>();\n\n /** Cache of failed CDN loads to avoid repeated attempts in the same session */\n const failedApps = new Map<string, AppLoadResult>();\n\n /**\n * Get the CDN URL for an app.\n */\n function getAppUrl(appId: string): string {\n // Convention: adaptives are at {cdnBase}/adaptives/{appId}/index.js\n return `${cdnBase}/adaptives/${appId}/index.js`;\n }\n\n /**\n * Load a single app from CDN.\n */\n async function loadApp(appId: string): Promise<AppLoadResult> {\n // Check if already registered (covers locally-injected bundles)\n if (registry.has(appId)) {\n return { appId, success: true, manifest: registry.get(appId)?.manifest };\n }\n\n // Check if previously failed \u2014 don't retry CDN in the same session.\n // If the app gets loaded by other means (e.g., local script tag),\n // the registry.has() check above will catch it on the next call.\n if (failedApps.has(appId)) {\n return failedApps.get(appId)!;\n }\n\n // Check if already loading\n if (loadingPromises.has(appId)) {\n return loadingPromises.get(appId)!;\n }\n\n // Start loading\n const loadPromise = (async (): Promise<AppLoadResult> => {\n onLoadStart?.(appId);\n\n try {\n const url = getAppUrl(appId);\n\n // Skip if already loaded this URL\n if (loadedUrls.has(url)) {\n const registration = registry.get(appId);\n if (registration) {\n onLoadEnd?.(appId, true);\n return { appId, success: true, manifest: registration.manifest };\n }\n }\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Timeout loading app: ${appId}`)), timeout);\n });\n\n // Fetch and execute the app bundle\n const loadPromise = loadAppBundle(url, appId);\n await Promise.race([loadPromise, timeoutPromise]);\n\n loadedUrls.add(url);\n\n // Get the registered manifest\n const registration = registry.get(appId);\n if (!registration) {\n throw new Error(`App ${appId} did not register after loading`);\n }\n\n onLoadEnd?.(appId, true);\n return { appId, success: true, manifest: registration.manifest };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n onLoadEnd?.(appId, false, errorMessage);\n const result: AppLoadResult = { appId, success: false, error: errorMessage };\n failedApps.set(appId, result);\n return result;\n } finally {\n loadingPromises.delete(appId);\n }\n })();\n\n loadingPromises.set(appId, loadPromise);\n return loadPromise;\n }\n\n /**\n * Load an app bundle from a URL.\n */\n async function loadAppBundle(url: string, appId: string): Promise<void> {\n // For browser environments, we use dynamic import or script loading\n if (typeof window !== 'undefined') {\n // Try dynamic import first (for ES modules)\n try {\n const module = await import(/* webpackIgnore: true */ url);\n\n // The module should export a manifest and optionally auto-register\n if (module.manifest) {\n registry.register(module.manifest);\n } else if (module.default?.manifest) {\n registry.register(module.default.manifest);\n } else if (module.default) {\n // If module.default is the manifest itself\n registry.register(module.default);\n }\n return;\n } catch {\n // Fall back to script tag loading for UMD bundles\n }\n\n // Script tag loading for UMD bundles\n return new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n\n script.onload = () => {\n // UMD bundles should register themselves via global\n const registered = registry.get(appId);\n if (registered) {\n resolve();\n } else {\n reject(new Error(`App ${appId} did not self-register`));\n }\n };\n\n script.onerror = () => {\n reject(new Error(`Failed to load app script: ${url}`));\n };\n\n document.head.appendChild(script);\n });\n }\n\n // For SSR/Node environments, we can't dynamically load apps\n throw new Error('Dynamic app loading not supported in SSR');\n }\n\n /**\n * Analyze config to determine which apps need to be loaded.\n */\n function getRequiredApps(config: CanvasConfigForLoader): string[] {\n const appIds = new Set<string>();\n\n // Check explicit app references\n if (config.apps) {\n for (const appId of config.apps) {\n appIds.add(appId);\n }\n }\n\n // Check action kinds for namespaced actions\n if (config.actions) {\n for (const action of config.actions) {\n const appId = getAppIdFromActionKind(action.kind);\n if (appId) {\n appIds.add(appId);\n }\n\n // Also check core:mountWidget actions for widget namespaces\n if (action.kind === 'core:mountWidget') {\n const widgetId = (action as any).widget?.widgetId;\n if (widgetId) {\n const widgetAppId = getAppIdFromWidgetId(widgetId);\n if (widgetAppId) {\n appIds.add(widgetAppId);\n }\n }\n }\n }\n }\n\n // Check tiles for widget references\n if (config.tiles) {\n for (const tile of config.tiles) {\n if (tile.widget) {\n const widgetAppId = getAppIdFromWidgetId(tile.widget);\n if (widgetAppId) {\n appIds.add(widgetAppId);\n }\n }\n }\n }\n\n return Array.from(appIds);\n }\n\n /**\n * Load all apps required by a config.\n */\n async function loadAppsForConfig(config: CanvasConfigForLoader): Promise<AppLoadResult[]> {\n const requiredApps = getRequiredApps(config);\n\n if (requiredApps.length === 0) {\n return [];\n }\n\n // Load all apps in parallel\n const results = await Promise.all(requiredApps.map((appId) => loadApp(appId)));\n\n return results;\n }\n\n /**\n * Preload apps without activating them.\n */\n async function preloadApps(appIds: string[]): Promise<AppLoadResult[]> {\n return Promise.all(appIds.map((appId) => loadApp(appId)));\n }\n\n return {\n loadApp,\n loadAppsForConfig,\n preloadApps,\n getRequiredApps,\n getAppUrl,\n };\n}\n\nexport type AppLoader = ReturnType<typeof createAppLoader>;\n", "/**\n * App Registry\n *\n * Central registry for managing SynOS apps.\n * Handles app registration, activation, deactivation, and lifecycle management.\n */\n\nimport type { SmartCanvasRuntime } from '../runtime';\n\nimport { cleanupAppContext, createAppContext } from './AppContext';\nimport type { AppManifest, AppRegistration, AppRegistryEvent } from './types';\n\n/**\n * Callback for app registry events.\n */\nexport type AppRegistryEventCallback = (event: AppRegistryEvent) => void;\n\n/**\n * App registry for managing SynOS apps.\n */\nexport class AppRegistry {\n private apps = new Map<string, AppRegistration>();\n private eventListeners = new Set<AppRegistryEventCallback>();\n private runtime: SmartCanvasRuntime | null = null;\n\n /**\n * Bind the registry to a runtime instance.\n * Must be called before apps can be activated.\n */\n bind(runtime: SmartCanvasRuntime): void {\n this.runtime = runtime;\n }\n\n /**\n * Unbind from the current runtime.\n * Deactivates all active apps first.\n */\n async unbind(): Promise<void> {\n // Deactivate all active apps\n for (const [appId, registration] of this.apps) {\n if (registration.state === 'active') {\n await this.deactivate(appId);\n }\n }\n this.runtime = null;\n }\n\n /**\n * Register an app.\n *\n * Registration makes the app available but does not activate it.\n * Call activate() to start the app's runtime extensions.\n */\n register(manifest: AppManifest): AppRegistration {\n // Validate manifest\n if (!manifest.id || typeof manifest.id !== 'string') {\n throw new Error(\"App manifest must have an 'id' property\");\n }\n if (!manifest.version || typeof manifest.version !== 'string') {\n throw new Error(\"App manifest must have a 'version' property\");\n }\n if (!manifest.name || typeof manifest.name !== 'string') {\n throw new Error(\"App manifest must have a 'name' property\");\n }\n\n // Check for existing registration\n if (this.apps.has(manifest.id)) {\n const existing = this.apps.get(manifest.id)!;\n if (existing.state === 'active') {\n throw new Error(`Cannot re-register active app: ${manifest.id}`);\n }\n console.warn(`[AppRegistry] Overriding existing app registration: ${manifest.id}`);\n }\n\n // Create registration\n const registration: AppRegistration = {\n manifest,\n state: 'registered',\n registeredAt: Date.now(),\n };\n\n this.apps.set(manifest.id, registration);\n\n // Emit event\n this.emit({\n type: 'app:registered',\n appId: manifest.id,\n manifest,\n });\n\n return registration;\n }\n\n /**\n * Activate an app.\n *\n * Activating an app:\n * 1. Creates an AppContext for sandboxed runtime access\n * 2. Registers the app's actions with ExecutorRegistry\n * 3. Registers the app's widgets with WidgetRegistry\n * 4. Sets up the app's event handlers\n */\n async activate(appId: string): Promise<void> {\n const registration = this.apps.get(appId);\n if (!registration) {\n throw new Error(`App not registered: ${appId}`);\n }\n\n if (registration.state === 'active' || registration.state === 'activating') {\n console.warn(`[AppRegistry] App already ${registration.state}: ${appId}`);\n return;\n }\n\n if (!this.runtime) {\n throw new Error('AppRegistry not bound to a runtime. Call bind() first.');\n }\n\n // Check dependencies\n if (registration.manifest.dependencies) {\n for (const depId of registration.manifest.dependencies) {\n const dep = this.apps.get(depId);\n if (!dep || dep.state !== 'active') {\n throw new Error(`App ${appId} depends on ${depId}, which is not active`);\n }\n }\n }\n\n // Update state\n registration.state = 'activating';\n\n try {\n // Create app context\n const isBuiltIn = registration.manifest.metadata?.isBuiltIn === true;\n const context = createAppContext({\n appId,\n runtime: this.runtime,\n isBuiltIn,\n });\n\n // Register runtime extensions\n const { runtime: runtimeExtensions } = registration.manifest;\n const cleanupFns: (() => void | Promise<void>)[] = [];\n\n if (runtimeExtensions) {\n // Register actions\n if (runtimeExtensions.actions) {\n for (const actionDef of runtimeExtensions.actions) {\n context.registerAction(actionDef);\n }\n }\n\n // Register widgets\n if (runtimeExtensions.widgets) {\n for (const widgetDef of runtimeExtensions.widgets) {\n context.registerWidget(widgetDef);\n }\n }\n\n // Set up event handlers\n if (runtimeExtensions.events) {\n for (const handler of runtimeExtensions.events) {\n const unsubscribe = this.runtime.events.subscribe((event) => {\n if (handler.names.includes(event.name)) {\n const eventContext = {\n appId,\n state: context.state,\n telemetry: context.telemetry,\n surfaces: context.surfaces,\n };\n try {\n handler.handler(event, eventContext);\n } catch (error) {\n console.error(`[AppRegistry] Event handler error in ${appId}:`, error);\n }\n }\n });\n cleanupFns.push(unsubscribe);\n }\n }\n }\n\n // Store cleanup function\n registration.cleanup = async () => {\n // Run cleanup functions\n for (const fn of cleanupFns) {\n try {\n await fn();\n } catch (error) {\n console.error(`[AppRegistry] Cleanup error in ${appId}:`, error);\n }\n }\n // Clean up app context resources\n cleanupAppContext(appId, this.runtime!);\n };\n\n // Update state\n registration.state = 'active';\n registration.activatedAt = Date.now();\n\n // Emit event\n this.emit({ type: 'app:activated', appId });\n } catch (error) {\n registration.state = 'error';\n registration.error = String(error);\n this.emit({ type: 'app:error', appId, error: String(error) });\n throw error;\n }\n }\n\n /**\n * Deactivate an app.\n *\n * Deactivating an app:\n * 1. Runs the cleanup function\n * 2. Unregisters all actions and widgets\n * 3. Removes event handlers\n */\n async deactivate(appId: string): Promise<void> {\n const registration = this.apps.get(appId);\n if (!registration) {\n throw new Error(`App not registered: ${appId}`);\n }\n\n if (registration.state !== 'active') {\n console.warn(`[AppRegistry] App not active: ${appId}`);\n return;\n }\n\n // Check if any active apps depend on this one\n for (const [otherId, other] of this.apps) {\n if (other.state === 'active' && other.manifest.dependencies?.includes(appId)) {\n throw new Error(`Cannot deactivate ${appId}: app ${otherId} depends on it`);\n }\n }\n\n // Update state\n registration.state = 'deactivating';\n\n try {\n // Run cleanup\n if (registration.cleanup) {\n await registration.cleanup();\n registration.cleanup = undefined;\n }\n\n // Update state\n registration.state = 'inactive';\n\n // Emit event\n this.emit({ type: 'app:deactivated', appId });\n } catch (error) {\n registration.state = 'error';\n registration.error = String(error);\n this.emit({ type: 'app:error', appId, error: String(error) });\n throw error;\n }\n }\n\n /**\n * Unregister an app.\n *\n * The app must be inactive before it can be unregistered.\n */\n async unregister(appId: string): Promise<void> {\n const registration = this.apps.get(appId);\n if (!registration) {\n return;\n }\n\n if (registration.state === 'active') {\n await this.deactivate(appId);\n }\n\n this.apps.delete(appId);\n\n // Emit event\n this.emit({ type: 'app:unregistered', appId });\n }\n\n /**\n * Get an app registration.\n */\n get(appId: string): AppRegistration | undefined {\n return this.apps.get(appId);\n }\n\n /**\n * Check if an app is registered.\n */\n has(appId: string): boolean {\n return this.apps.has(appId);\n }\n\n /**\n * Check if an app is active.\n */\n isActive(appId: string): boolean {\n const registration = this.apps.get(appId);\n return registration?.state === 'active';\n }\n\n /**\n * List all registered apps.\n */\n list(): AppRegistration[] {\n return Array.from(this.apps.values());\n }\n\n /**\n * List all active apps.\n */\n listActive(): AppRegistration[] {\n return Array.from(this.apps.values()).filter((r) => r.state === 'active');\n }\n\n /**\n * List all apps with editor modules.\n */\n listEditable(): AppRegistration[] {\n return Array.from(this.apps.values()).filter((r) => r.manifest.editor !== undefined);\n }\n\n /**\n * Subscribe to registry events.\n */\n subscribe(callback: AppRegistryEventCallback): () => void {\n this.eventListeners.add(callback);\n return () => {\n this.eventListeners.delete(callback);\n };\n }\n\n /**\n * Emit an event to all listeners.\n */\n private emit(event: AppRegistryEvent): void {\n for (const listener of this.eventListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('[AppRegistry] Event listener error:', error);\n }\n }\n }\n\n /**\n * Clean up all apps.\n */\n async destroy(): Promise<void> {\n await this.unbind();\n this.apps.clear();\n this.eventListeners.clear();\n }\n}\n\n/**\n * Default singleton instance of AppRegistry.\n */\nexport const appRegistry = new AppRegistry();\n", "/**\n * Anti-flicker functionality to prevent content flash during patch application\n */\n\nexport interface AntiFlickerConfig {\n timeout?: number; // Max time to hide content (default: 300ms)\n className?: string; // Class to add for hiding (default: 'sc-anti-flicker')\n style?: string; // CSS to inject (default: opacity: 0)\n hostLoadingSelector?: string; // If a matching element exists, skip anti-flicker entirely\n waitForHostReady?: string; // Defer anti-flicker removal until this custom event fires on document\n}\n\nconst DEFAULT_CONFIG: Required<AntiFlickerConfig> = {\n timeout: 300,\n className: 'sc-anti-flicker',\n style: 'opacity: 0 !important',\n hostLoadingSelector: '',\n waitForHostReady: '',\n};\n\nexport function initAntiFlicker(config: AntiFlickerConfig = {}): () => void {\n const { timeout, className, style, hostLoadingSelector, waitForHostReady } = {\n ...DEFAULT_CONFIG,\n ...config,\n };\n\n // If host is already showing its own loading UI, skip anti-flicker entirely\n if (hostLoadingSelector && document.querySelector(hostLoadingSelector)) {\n return () => {};\n }\n\n // Inject style\n const styleEl = document.createElement('style');\n styleEl.textContent = `.${className} { ${style} }`;\n document.head.appendChild(styleEl);\n\n // Add class to hide content\n document.documentElement.classList.add(className);\n\n // Shared removal logic (idempotent \u2014 safe to call multiple times)\n let removed = false;\n const remove = () => {\n if (removed) return;\n removed = true;\n clearTimeout(timeoutId);\n document.documentElement.classList.remove(className);\n styleEl.remove();\n if (waitForHostReady && hostReadyHandler) {\n document.removeEventListener(waitForHostReady, hostReadyHandler);\n }\n };\n\n // Listen for host-ready custom event if configured\n let hostReadyHandler: (() => void) | undefined;\n if (waitForHostReady) {\n hostReadyHandler = () => remove();\n document.addEventListener(waitForHostReady, hostReadyHandler);\n }\n\n // Set timeout to remove class (failsafe)\n const timeoutId = setTimeout(() => {\n remove();\n }, timeout);\n\n // Return function to remove anti-flicker\n return () => {\n remove();\n };\n}\n\n// For inline script usage\nexport function getAntiFlickerSnippet(config: AntiFlickerConfig = {}): string {\n const { className, style } = { ...DEFAULT_CONFIG, ...config };\n return `\n(function() {\n var s = document.createElement('style');\n s.textContent = '.${className} { ${style} }';\n document.head.appendChild(s);\n document.documentElement.className += ' ${className}';\n})();`;\n}\n", "/**\n * SDK package version.\n *\n * This file is auto-generated at release time by `scripts/prepare-release.mjs`.\n * The sentinel value below is overwritten with the real semver version\n * during the semantic-release prepare phase.\n *\n * DO NOT import version from package.json \u2014 this constant is the single\n * source of truth for the runtime bundle.\n *\n * @since 2.0.0\n */\nexport const SDK_VERSION = '2.11.0';\n", "// =============================================================================\n// SDK VERSION CONSTANTS\n// =============================================================================\n\n// Re-export SDK_VERSION from the auto-generated version file\n// =============================================================================\n// CANVAS CONFIG RESPONSE\n// =============================================================================\n\nimport type { z } from 'zod';\nimport type { ActionStep } from './actions/types';\nimport type {\n CanvasConfigResponseZ,\n CanvasThemeConfigZ,\n LauncherConfigZ,\n TileZ,\n} from './config/schema';\nimport type { ActivationConfig } from './decisions/types';\n\nexport { SDK_VERSION } from './version';\n\n/**\n * SDK schema version in Major.Minor format (e.g., \"2.0\", \"2.1\").\n * Used for compatibility checking between SDK and backend configs.\n * Sent in X-SDK-Schema-Version header.\n *\n * Bump rules:\n * - Major: Breaking changes (field removal, type changes)\n * - Minor: Backwards-compatible additions (new optional fields)\n *\n * @since 2.0.0\n */\nexport const SDK_SCHEMA_VERSION = '2.0';\n\n// =============================================================================\n// RE-EXPORT ACTION TYPES\n// =============================================================================\n\n// Re-export ActionStep from actions module for convenience\nexport type { ActionStep } from './actions/types';\n\n// =============================================================================\n// BLOCK TYPE DEFINITIONS\n// =============================================================================\n\n/**\n * All available block types organized by category\n */\nexport type NotificationBlockType = 'alert' | 'success' | 'warning' | 'info' | 'error';\nexport type MediaBlockType = 'video' | 'gallery' | 'code';\nexport type InteractiveBlockType = 'form' | 'rating' | 'progress' | 'survey' | 'checklist';\nexport type DataBlockType = 'stats' | 'comparison' | 'chart' | 'table';\nexport type LegacyBlockType = 'text' | 'metric' | 'chatbot' | 'embed';\n\n/**\n * Union of all block types\n */\nexport type BlockType =\n | NotificationBlockType\n | MediaBlockType\n | InteractiveBlockType\n | DataBlockType\n | LegacyBlockType\n | 'custom';\n\n// =============================================================================\n// NOTIFICATION BLOCK CONTENT\n// =============================================================================\n\nexport interface NotificationContentBase {\n title: string;\n body?: string;\n dismissible?: boolean;\n icon?: string;\n timestamp?: string;\n}\n\nexport interface AlertContent extends NotificationContentBase {\n type: 'alert';\n severity?: 'low' | 'medium' | 'high' | 'critical';\n}\n\nexport interface SuccessContent extends NotificationContentBase {\n type: 'success';\n confetti?: boolean;\n}\n\nexport interface WarningContent extends NotificationContentBase {\n type: 'warning';\n countdown?: number; // seconds until action required\n}\n\nexport interface InfoContent extends NotificationContentBase {\n type: 'info';\n learnMoreUrl?: string;\n}\n\nexport interface ErrorContent extends NotificationContentBase {\n type: 'error';\n errorCode?: string;\n retryable?: boolean;\n}\n\nexport type NotificationContent =\n | AlertContent\n | SuccessContent\n | WarningContent\n | InfoContent\n | ErrorContent;\n\n// =============================================================================\n// MEDIA BLOCK CONTENT\n// =============================================================================\n\nexport interface VideoContent {\n type: 'video';\n src: string;\n provider?: 'youtube' | 'vimeo' | 'custom';\n poster?: string;\n autoplay?: boolean;\n muted?: boolean;\n loop?: boolean;\n aspectRatio?: '16:9' | '4:3' | '1:1' | '9:16';\n}\n\nexport interface GalleryContent {\n type: 'gallery';\n images: Array<{\n src: string;\n alt?: string;\n caption?: string;\n }>;\n layout?: 'carousel' | 'grid' | 'masonry';\n columns?: 2 | 3 | 4;\n}\n\nexport interface CodeContent {\n type: 'code';\n code: string;\n language?: string;\n lineNumbers?: boolean;\n highlightLines?: number[];\n copyable?: boolean;\n filename?: string;\n}\n\nexport type MediaContent = VideoContent | GalleryContent | CodeContent;\n\n// =============================================================================\n// INTERACTIVE BLOCK CONTENT\n// =============================================================================\n\nexport interface FormField {\n id: string;\n type: 'text' | 'email' | 'select' | 'checkbox' | 'radio' | 'textarea';\n label: string;\n placeholder?: string;\n required?: boolean;\n options?: Array<{ value: string; label: string }>;\n defaultValue?: string | boolean;\n}\n\nexport interface FormContent {\n type: 'form';\n fields: FormField[];\n submitLabel?: string;\n submitActionId?: string;\n}\n\nexport interface RatingContent {\n type: 'rating';\n variant: 'stars' | 'thumbs' | 'nps' | 'emoji';\n question?: string;\n maxValue?: number; // for stars (default 5), nps (default 10)\n submitActionId?: string;\n}\n\nexport interface ProgressContent {\n type: 'progress';\n variant: 'bar' | 'steps' | 'circular';\n value: number; // 0-100 for bar/circular, current step for steps\n max?: number; // total steps for steps variant\n steps?: Array<{ label: string; completed?: boolean }>;\n showPercentage?: boolean;\n}\n\nexport interface SurveyChoice {\n id: string;\n label: string;\n icon?: string;\n}\n\nexport interface SurveyContent {\n type: 'survey';\n question: string;\n choices: SurveyChoice[];\n multiSelect?: boolean;\n showResults?: boolean;\n results?: Record<string, number>; // choice id -> vote count\n submitActionId?: string;\n}\n\nexport interface ChecklistItem {\n id: string;\n title: string;\n description?: string;\n href?: string;\n linkLabel?: string;\n completed?: boolean;\n}\n\nexport interface ChecklistContent {\n type: 'checklist';\n items: ChecklistItem[];\n title?: string;\n showProgress?: boolean;\n}\n\nexport type InteractiveContent =\n | FormContent\n | RatingContent\n | ProgressContent\n | SurveyContent\n | ChecklistContent;\n\n// =============================================================================\n// DATA BLOCK CONTENT\n// =============================================================================\n\nexport interface TrendIndicator {\n direction: 'up' | 'down' | 'neutral';\n value: string; // e.g., \"+12%\", \"-5\"\n timeframe?: string; // e.g., \"vs last week\"\n}\n\nexport interface StatsContent {\n type: 'stats';\n value: string;\n label: string;\n trend?: TrendIndicator;\n sparkline?: number[]; // array of values for mini chart\n prefix?: string; // e.g., \"$\"\n suffix?: string; // e.g., \"users\"\n}\n\nexport interface ComparisonItem {\n label: string;\n value: string | number;\n highlight?: boolean;\n icon?: string;\n}\n\nexport interface ComparisonContent {\n type: 'comparison';\n items: ComparisonItem[];\n layout?: 'grid' | 'list' | 'table';\n columns?: 2 | 3 | 4;\n highlightBest?: boolean;\n}\n\nexport interface ChartContent {\n type: 'chart';\n chartType: 'bar' | 'line' | 'pie' | 'donut';\n data: Array<{ label: string; value: number; color?: string }>;\n showLegend?: boolean;\n showLabels?: boolean;\n animated?: boolean;\n}\n\nexport interface TableColumn {\n key: string;\n label: string;\n sortable?: boolean;\n width?: string;\n}\n\nexport interface TableContent {\n type: 'table';\n columns: TableColumn[];\n rows: Array<Record<string, string | number>>;\n sortable?: boolean;\n scrollable?: boolean;\n maxHeight?: string;\n}\n\nexport type DataContent = StatsContent | ComparisonContent | ChartContent | TableContent;\n\n// =============================================================================\n// CANVAS ORCHESTRATION CONFIG \u2014 inferred from Zod schemas (single source of truth)\n// =============================================================================\n\nexport type { ActivationConfig, DecisionStrategy, RouteFilter } from './decisions/types';\n\n/**\n * Full tile configuration. Inferred from TileZ in config/schema.ts.\n * The `activation` field is overridden with the generic-typed ActivationConfig\n * from decisions/types.ts since Zod can't express TypeScript generics.\n */\nexport type TileConfig = Omit<z.infer<typeof TileZ>, 'activation'> & {\n activation?: ActivationConfig;\n};\n\n/** Theme configuration. Inferred from CanvasThemeConfigZ in config/schema.ts. */\nexport type CanvasThemeConfig = z.infer<typeof CanvasThemeConfigZ>;\n\n/** Launcher button configuration. Inferred from LauncherConfigZ in config/schema.ts. */\nexport type LauncherConfig = z.infer<typeof LauncherConfigZ>;\n\n/**\n * Canvas configuration response.\n * Inferred from CanvasConfigResponseZ, with actions narrowed to ActionStep[].\n * (Zod uses z.any() for actions since the union is resolved at schema generation time.)\n */\nexport type CanvasConfigResponse = Omit<\n z.infer<typeof CanvasConfigResponseZ>,\n 'actions' | 'tiles'\n> & {\n tiles: TileConfig[];\n actions: ActionStep[];\n};\n\nexport type CanvasConfigFetcher = () => Promise<CanvasConfigResponse>;\n", "import type { ExperimentClient } from '../experiments/types';\nimport type { CanvasConfigResponse } from '../types';\n\n/**\n * Partial config as returned by a single variant feature flag.\n * Variant flags may only contain a subset of CanvasConfigResponse fields.\n */\nexport type VariantFlagValue = Partial<CanvasConfigResponse> & {\n overlays?: unknown[];\n};\n\n/**\n * Strategy for resolving multiple active variant configs into one.\n *\n * Currently: \"first-match\" \u2014 returns the first non-empty variant config.\n * Future: \"merge\" \u2014 concatenate tiles/actions/overlays from all variants.\n */\nexport type MergeStrategy = 'first-match';\n\n/**\n * Resolve multiple variant feature flags into a single CanvasConfigResponse.\n *\n * Evaluates each flag key against the experiment client and applies the\n * configured strategy. Currently uses \"first-match\": the first flag that\n * returns a non-empty config wins.\n *\n * @param client - Experiment client to evaluate feature flags\n * @param keys - Ordered list of variant flag keys to evaluate\n * @param _strategy - Resolution strategy (reserved for future use)\n * @returns Resolved config, or null if no flags are active\n */\nexport function resolveVariantConfigs(\n client: ExperimentClient,\n keys: string[],\n _strategy: MergeStrategy = 'first-match'\n): CanvasConfigResponse | null {\n for (const key of keys) {\n const value = client.getFeatureValue?.(key, null);\n if (!value || typeof value !== 'object') continue;\n\n const variant = value as VariantFlagValue;\n const hasTiles = variant.tiles && variant.tiles.length > 0;\n const hasActions = variant.actions && variant.actions.length > 0;\n\n if (hasTiles || hasActions) {\n return {\n tiles: variant.tiles ?? [],\n actions: variant.actions ?? [],\n fetchedAt: variant.fetchedAt ?? new Date().toISOString(),\n ...(variant.schemaVersion && { schemaVersion: variant.schemaVersion }),\n ...(variant.configVersion && { configVersion: variant.configVersion }),\n ...(variant.canvasTitle && { canvasTitle: variant.canvasTitle }),\n ...(variant.theme && { theme: variant.theme }),\n ...(variant.launcher && { launcher: variant.launcher }),\n };\n }\n }\n\n return null;\n}\n", "/**\n * Debug logger for Syntro SDK.\n *\n * Debug mode is enabled by:\n * 1. URL param: ?syntro_debug=true (highest priority)\n * 2. Token field: d: true\n * 3. Default: false\n */\n\nlet debugEnabled = false;\n\n/**\n * Check if debug mode is enabled via URL param.\n */\nfunction checkUrlParam(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const params = new URLSearchParams(window.location.search);\n return params.get('syntro_debug') === 'true';\n } catch {\n return false;\n }\n}\n\n/**\n * Initialize the logger with token debug flag.\n * URL param always overrides token setting.\n */\nexport function initLogger(tokenDebug?: boolean): void {\n // URL param takes priority\n if (checkUrlParam()) {\n debugEnabled = true;\n return;\n }\n // Otherwise use token setting (default false)\n debugEnabled = tokenDebug ?? false;\n}\n\n/**\n * Check if debug mode is currently enabled.\n */\nexport function isDebugEnabled(): boolean {\n // Always check URL param first (allows runtime override)\n if (checkUrlParam()) return true;\n return debugEnabled;\n}\n\n/**\n * Log a debug message (only if debug mode enabled).\n */\nexport function debug(prefix: string, message: string, data?: any): void {\n if (!isDebugEnabled()) return;\n if (data !== undefined) {\n console.log(`[${prefix}]`, message, data);\n } else {\n console.log(`[${prefix}]`, message);\n }\n}\n\n/**\n * Log a warning (always shown).\n */\nexport function warn(prefix: string, message: string, data?: any): void {\n if (data !== undefined) {\n console.warn(`[${prefix}]`, message, data);\n } else {\n console.warn(`[${prefix}]`, message);\n }\n}\n\n/**\n * Log an error (always shown).\n */\nexport function error(prefix: string, message: string, data?: any): void {\n if (data !== undefined) {\n console.error(`[${prefix}]`, message, data);\n } else {\n console.error(`[${prefix}]`, message);\n }\n}\n", "import type { ExperimentClient } from './experiments/types';\nimport { resolveVariantConfigs } from './fetchers/mergeConfigs';\nimport { debug } from './logger';\nimport type { CanvasConfigFetcher, CanvasConfigResponse } from './types';\nimport { SDK_SCHEMA_VERSION } from './types';\nimport { SDK_VERSION } from './version';\n\n/**\n * Allowed hosts for fetching config.\n * Only config from these hosts will be fetched.\n */\nconst ALLOWED_CONFIG_HOSTS = [\n 'api.syntrologie.com',\n 'cdn.syntrologie.com',\n 'localhost',\n '127.0.0.1',\n];\n\n/**\n * Validates that a config URI is from an allowed host.\n * Requires HTTPS for non-localhost URLs.\n */\nfunction validateConfigUri(uri: string): boolean {\n try {\n const parsed = new URL(uri);\n const isLocalhost = /^(localhost|127\\.0\\.0\\.1)$/.test(parsed.hostname);\n\n // Require HTTPS for non-localhost\n if (parsed.protocol !== 'https:' && !isLocalhost) {\n console.warn('[SmartCanvas] Config URI must use HTTPS:', uri);\n return false;\n }\n\n // Check against allowlist\n const isAllowed = ALLOWED_CONFIG_HOSTS.some((host) => parsed.hostname === host);\n if (!isAllowed) {\n console.warn('[SmartCanvas] Config URI host not in allowlist:', parsed.hostname);\n return false;\n }\n\n return true;\n } catch {\n console.warn('[SmartCanvas] Invalid config URI:', uri);\n return false;\n }\n}\n\n/**\n * Checks if a URI is same-origin with the current page.\n */\nfunction isSameOrigin(uri: string): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const parsed = new URL(uri);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n}\n\nexport interface CanvasFetcherOptions {\n configUri?: string;\n experiments?: ExperimentClient;\n featureKey?: string;\n credentials?: RequestCredentials;\n // New: support for config feature key (direct config instead of URI)\n configFeatureKey?: string;\n /** Manifest feature key for multi-flag mode */\n manifestKey?: string;\n /** Prefix for variant flag discovery */\n variantFlagPrefix?: string;\n /** SDK version for offline config caching. When set, enables localStorage caching. */\n sdkVersion?: string;\n}\n\n// =============================================================================\n// OFFLINE CONFIG CACHING\n// =============================================================================\n\nconst CONFIG_CACHE_KEY = 'syntro_config_cache';\nconst CACHE_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface CachedConfig {\n config: CanvasConfigResponse;\n timestamp: number;\n sdkVersion: string;\n}\n\n/**\n * Returns true if localStorage is available (false in SSR or restricted contexts).\n */\nfunction hasLocalStorage(): boolean {\n try {\n return typeof localStorage !== 'undefined' && localStorage !== null;\n } catch {\n return false;\n }\n}\n\n/**\n * Writes a config to localStorage for offline fallback.\n */\nfunction cacheConfig(config: CanvasConfigResponse, sdkVersion: string): void {\n if (!hasLocalStorage()) return;\n try {\n const entry: CachedConfig = {\n config,\n timestamp: Date.now(),\n sdkVersion,\n };\n localStorage.setItem(CONFIG_CACHE_KEY, JSON.stringify(entry));\n } catch {\n // Silently fail \u2014 quota exceeded or other storage errors should not break the SDK\n }\n}\n\n/**\n * Reads a cached config from localStorage, validating age and SDK version.\n * Returns null if cache is missing, stale, corrupt, or version-mismatched.\n */\nfunction getCachedConfig(sdkVersion: string): CanvasConfigResponse | null {\n if (!hasLocalStorage()) return null;\n try {\n const raw = localStorage.getItem(CONFIG_CACHE_KEY);\n if (!raw) return null;\n\n const entry: CachedConfig = JSON.parse(raw);\n\n // Validate required fields\n if (!entry.config || typeof entry.timestamp !== 'number' || !entry.sdkVersion) {\n return null;\n }\n\n // Validate SDK version match\n if (entry.sdkVersion !== sdkVersion) return null;\n\n // Validate cache age (must be less than 24 hours old)\n const age = Date.now() - entry.timestamp;\n if (age > CACHE_MAX_AGE_MS) return null;\n\n return entry.config;\n } catch {\n // Corrupt JSON or other errors \u2014 treat as cache miss\n return null;\n }\n}\n\nexport const resolveConfigUri = ({\n configUri,\n experiments,\n featureKey = 'smart-canvas-config-uri',\n}: {\n configUri?: string;\n experiments?: ExperimentClient;\n featureKey?: string;\n}) => {\n if (configUri) return configUri;\n const fromFeature = experiments?.getFeatureValue?.(featureKey, null);\n if (fromFeature) return fromFeature;\n return undefined;\n};\n\n/**\n * Get variant flag keys from manifest or prefix discovery.\n */\nfunction getVariantFlagKeys(\n experiments: ExperimentClient,\n manifestKey?: string,\n variantFlagPrefix?: string\n): string[] {\n if (manifestKey) {\n const manifest = experiments.getFeatureValue?.(manifestKey, null);\n if (manifest && typeof manifest === 'object') {\n const keys = (manifest as { variant_flags?: string[] }).variant_flags;\n if (keys && keys.length > 0) return keys;\n }\n }\n if (experiments.getAllFeatures) {\n const all = experiments.getAllFeatures();\n if (variantFlagPrefix) {\n return Object.keys(all).filter((k) => k.startsWith(variantFlagPrefix));\n }\n return Object.keys(all);\n }\n return [];\n}\n\nexport const createCanvasConfigFetcher =\n ({\n configUri,\n experiments,\n featureKey,\n credentials,\n configFeatureKey = 'smart-canvas-config',\n manifestKey,\n variantFlagPrefix,\n sdkVersion,\n }: CanvasFetcherOptions): CanvasConfigFetcher =>\n async () => {\n // First check if we have a direct config object from experiment platform\n if (experiments && configFeatureKey) {\n const directConfig = experiments.getFeatureValue?.(configFeatureKey, null);\n if (directConfig && typeof directConfig === 'object') {\n debug('SmartCanvas Config', 'Resolved config directly from feature flag', directConfig);\n return directConfig as CanvasConfigResponse;\n }\n }\n\n // Try multi-flag mode: manifest, prefix, or all-features discovery\n if (experiments && (manifestKey || variantFlagPrefix || experiments.getAllFeatures)) {\n const variantKeys = getVariantFlagKeys(experiments, manifestKey, variantFlagPrefix);\n if (variantKeys.length > 0) {\n const resolved = resolveVariantConfigs(experiments, variantKeys);\n if (resolved) {\n debug('SmartCanvas Config', 'Resolved config from variant flags', resolved);\n return resolved;\n }\n }\n }\n\n // Fall back to URI-based fetching\n const uri = resolveConfigUri({ configUri, experiments, featureKey });\n if (!uri) {\n debug('SmartCanvas Config', 'No config available \u2014 returning empty config');\n return { tiles: [], actions: [], fetchedAt: new Date().toISOString() };\n }\n\n // Security: Validate URI against allowlist\n if (!validateConfigUri(uri)) {\n throw new Error(`SmartCanvas: config URI not allowed: ${uri}`);\n }\n\n // Security: Only send credentials to same-origin requests\n // This prevents leaking cookies to third-party servers\n const effectiveCredentials = credentials ?? (isSameOrigin(uri) ? 'include' : 'omit');\n\n try {\n const response = await fetch(uri, {\n credentials: effectiveCredentials,\n headers: {\n 'X-SDK-Version': SDK_VERSION,\n 'X-SDK-Schema-Version': SDK_SCHEMA_VERSION,\n },\n });\n if (!response.ok) {\n throw new Error(`SmartCanvas: failed to fetch config (${response.status})`);\n }\n const config = await response.json();\n debug('SmartCanvas Config', 'Fetched config from URI', config);\n\n // Cache on success when sdkVersion is provided\n if (sdkVersion) {\n cacheConfig(config, sdkVersion);\n }\n\n return config;\n } catch (error) {\n // On fetch failure, try to serve from cache if sdkVersion is provided\n if (sdkVersion) {\n const cached = getCachedConfig(sdkVersion);\n if (cached) {\n debug('SmartCanvas Config', 'Serving config from offline cache');\n return cached;\n }\n }\n // No valid cache \u2014 re-throw the original error\n throw error;\n }\n };\n", "/**\n * Register accumulator predicates from tile configs at config-load time.\n *\n * Scans all triggerWhen conditions (in tile actions and top-level actions)\n * for event_count conditions with a `counter` definition. For each, builds\n * a predicate and registers it with the accumulator.\n *\n * Safe to call multiple times \u2014 accumulator.register() is idempotent.\n */\n\nimport type { TileConfig } from '../types';\nimport type { EventAccumulator } from './EventAccumulator';\nimport type { NormalizedEvent } from './types';\n\n/** Match operator: exactly one of equals or contains. */\ninterface MatchOp {\n equals?: string | number | boolean;\n contains?: string;\n}\n\n/** Inline counter definition on an event_count condition. */\ninterface CounterDef {\n events: string[];\n match?: Record<string, MatchOp>;\n}\n\ninterface TriggerWhenConfig {\n type: 'rules';\n rules: Array<{\n conditions: Array<{ type: string; key?: string; counter?: CounterDef; [k: string]: unknown }>;\n value: boolean;\n }>;\n default: boolean;\n}\n\n/** Known element-chain field prefixes. These are checked against the\n * elements array instead of flat event props. */\nconst ELEMENT_CHAIN_FIELDS = new Set(['tag_name', '$el_text']);\nfunction isElementChainField(key: string): boolean {\n return ELEMENT_CHAIN_FIELDS.has(key) || key.startsWith('attr__');\n}\n\n/** Check a single MatchOp against a value. */\nfunction checkMatchOp(op: MatchOp, value: unknown): boolean {\n if (op.equals !== undefined) {\n return value === op.equals;\n }\n if (op.contains !== undefined) {\n return typeof value === 'string' && value.includes(op.contains);\n }\n return false;\n}\n\n/** Build a predicate function from a CounterDef. */\nfunction buildPredicate(counter: CounterDef): (event: NormalizedEvent) => boolean {\n const { events: eventNames, match } = counter;\n\n return (event: NormalizedEvent) => {\n // Check event name\n if (!eventNames.includes(event.name)) return false;\n\n // Check match filters\n if (match) {\n for (const [key, op] of Object.entries(match)) {\n if (isElementChainField(key)) {\n // Check elements array \u2014 match if ANY element satisfies\n const elements = event.props?.elements as Array<Record<string, unknown>> | undefined;\n if (!elements) return false;\n const anyMatch = elements.some((el) => checkMatchOp(op, el[key]));\n if (!anyMatch) return false;\n } else {\n // Check flat event prop\n if (!checkMatchOp(op, event.props?.[key])) return false;\n }\n }\n }\n\n return true;\n };\n}\n\n/** Extract event_count conditions from a triggerWhen config and register predicates. */\nfunction registerFromTriggerWhen(\n triggerWhen: TriggerWhenConfig,\n accumulator: EventAccumulator\n): void {\n for (const rule of triggerWhen.rules) {\n for (const cond of rule.conditions) {\n if (cond.type === 'event_count' && cond.key) {\n const counter = cond.counter as CounterDef | undefined;\n const predicate = counter ? buildPredicate(counter) : () => true;\n const needsTimestamps = typeof cond.withinMs === 'number';\n accumulator.register(cond.key, predicate, needsTimestamps);\n }\n }\n }\n}\n\n/**\n * Scan tile configs and top-level actions for event_count conditions\n * and register accumulator predicates from their counter definitions.\n */\nexport function registerConfigPredicates(\n tiles: TileConfig[],\n accumulator: EventAccumulator,\n actions?: unknown[]\n): void {\n // --- Scan tile actions ---\n for (const tile of tiles) {\n const props = tile.props;\n if (!props) continue;\n\n const tileActions = props.actions as Array<{ triggerWhen?: TriggerWhenConfig }> | undefined;\n if (!tileActions) continue;\n\n for (const action of tileActions) {\n if (action.triggerWhen?.type === 'rules') {\n registerFromTriggerWhen(action.triggerWhen, accumulator);\n }\n }\n }\n\n // --- Scan top-level actions ---\n if (actions) {\n for (const rawAction of actions) {\n const action = rawAction as { triggerWhen?: TriggerWhenConfig };\n if (action.triggerWhen?.type === 'rules') {\n registerFromTriggerWhen(action.triggerWhen, accumulator);\n }\n }\n }\n}\n", "export interface SmartCanvasState {\n open: boolean;\n}\n\nexport type SmartCanvasListener = (state: SmartCanvasState) => void;\n\nexport class SmartCanvasController {\n private state: SmartCanvasState;\n private listeners = new Set<SmartCanvasListener>();\n\n constructor(initial?: Partial<SmartCanvasState>) {\n let open = initial?.open ?? false;\n if (initial?.open === undefined) {\n try {\n const stored = sessionStorage?.getItem('syntro:editor:panel-open');\n if (stored !== null) open = JSON.parse(stored);\n } catch {\n // sessionStorage unavailable or corrupt \u2014 use default\n }\n }\n this.state = { open };\n }\n\n getState(): SmartCanvasState {\n return this.state;\n }\n\n subscribe(listener: SmartCanvasListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n setOpen(open: boolean) {\n if (this.state.open === open) return;\n this.state = { ...this.state, open };\n try {\n sessionStorage?.setItem('syntro:editor:panel-open', JSON.stringify(open));\n } catch {\n // sessionStorage unavailable \u2014 silently ignore\n }\n this.emit();\n }\n\n toggle() {\n this.setOpen(!this.state.open);\n }\n\n private emit() {\n for (const listener of this.listeners) {\n listener(this.state);\n }\n }\n}\n\nexport const createSmartCanvasController = (initial?: Partial<SmartCanvasState>) =>\n new SmartCanvasController(initial);\n", "import { createContext, type ReactNode, useContext } from 'react';\n\ninterface ShadowRootContextValue {\n shadowRoot: ShadowRoot;\n portalRoot: HTMLElement;\n overlayContainer: HTMLElement;\n}\n\nconst ShadowRootContext = createContext<ShadowRootContextValue | null>(null);\n\nexport interface ShadowRootProviderProps {\n shadowRoot: ShadowRoot;\n portalRoot: HTMLElement;\n overlayContainer: HTMLElement;\n children: ReactNode;\n}\n\nexport function ShadowRootProvider({\n shadowRoot,\n portalRoot,\n overlayContainer,\n children,\n}: ShadowRootProviderProps) {\n return (\n <ShadowRootContext.Provider value={{ shadowRoot, portalRoot, overlayContainer }}>\n {children}\n </ShadowRootContext.Provider>\n );\n}\n\n/**\n * Access the shadow root context. Always available \u2014 SmartCanvasElement\n * wraps the React tree in ShadowRootProvider, and tests use the helper.\n */\nexport function useShadowRoot(): ShadowRootContextValue {\n const ctx = useContext(ShadowRootContext);\n if (!ctx) {\n throw new Error('useShadowRoot() called outside ShadowRootProvider');\n }\n return ctx;\n}\n", "/**\n * Event Bus Types\n *\n * The EventBus provides a normalized event stream that unifies events from\n * PostHog autocapture, Canvas events, and derived behavioral signals.\n */\n\n// Re-export shared types from event-processor (canonical source)\nexport type { EventSource, NormalizedEvent } from '@syntrologie/event-processor';\nexport { EVENT_SCHEMA_VERSION } from '@syntrologie/event-processor';\n\n/**\n * Event filter for subscriptions.\n */\nexport interface EventFilter {\n /** Filter by event names (exact match) */\n names?: string[];\n /** Filter by event name patterns (regex) */\n patterns?: string[];\n /** Filter by sources */\n sources?: import('@syntrologie/event-processor').EventSource[];\n}\n\n/**\n * Callback for event subscriptions.\n */\nexport type EventCallback = (event: import('@syntrologie/event-processor').NormalizedEvent) => void;\n\n/**\n * Unsubscribe function returned by subscribe().\n */\nexport type EventUnsubscribe = () => void;\n\n/**\n * Standard event names used by the runtime.\n *\n * This is a superset of event-processor's StandardEvents, adding\n * canvas, overlay, action, notification, and surface events that\n * are specific to the runtime SDK.\n */\nexport const StandardEvents = {\n // UI events (from PostHog autocapture)\n UI_CLICK: 'ui.click',\n UI_SCROLL: 'ui.scroll',\n UI_INPUT: 'ui.input',\n UI_CHANGE: 'ui.change',\n UI_SUBMIT: 'ui.submit',\n\n // Navigation events\n NAV_PAGE_VIEW: 'nav.page_view',\n NAV_PAGE_LEAVE: 'nav.page_leave',\n\n // Canvas events\n CANVAS_OPENED: 'canvas.opened',\n CANVAS_CLOSED: 'canvas.closed',\n TILE_VIEWED: 'tile.viewed',\n TILE_EXPANDED: 'tile.expanded',\n TILE_COLLAPSED: 'tile.collapsed',\n TILE_ACTION: 'tile.action',\n\n // Overlay/tour events\n OVERLAY_STARTED: 'overlay.started',\n OVERLAY_COMPLETED: 'overlay.completed',\n OVERLAY_DISMISSED: 'overlay.dismissed',\n OVERLAY_STEP_VIEWED: 'overlay.step_viewed',\n\n // Derived behavioral signals (Phase 3)\n BEHAVIOR_RAGE_CLICK: 'behavior.rage_click',\n BEHAVIOR_HESITATION: 'behavior.hesitation',\n BEHAVIOR_CONFUSION: 'behavior.confusion',\n\n // Action events\n ACTION_APPLIED: 'action.applied',\n ACTION_REVERTED: 'action.reverted',\n ACTION_FAILED: 'action.failed',\n ACTION_CTA_CLICKED: 'action.cta_clicked',\n\n // Notification events\n NOTIFICATION_SHOWN: 'notification.shown',\n NOTIFICATION_CLICKED: 'notification.clicked',\n NOTIFICATION_DISMISSED: 'notification.dismissed',\n NOTIFICATION_DEEP_LINK: 'notification.deep_link',\n\n // Surface events\n SURFACE_MOUNTED: 'surface.mounted',\n SURFACE_UNMOUNTED: 'surface.unmounted',\n} as const;\n", "/**\n * Canvas Event Normalizer\n *\n * Transforms Smart Canvas events into normalized events for the EventBus.\n */\nimport type { CanvasSurface } from '../../telemetry/types';\nimport type { EventSource, NormalizedEvent } from '../types';\nimport { EVENT_SCHEMA_VERSION, StandardEvents } from '../types';\n\n/**\n * Create a canvas event with standard metadata.\n */\nfunction createCanvasEvent(name: string, props?: Record<string, unknown>): NormalizedEvent {\n return {\n ts: Date.now(),\n name,\n source: 'canvas' as EventSource,\n props,\n schemaVersion: EVENT_SCHEMA_VERSION,\n };\n}\n\n/**\n * Canvas opened event.\n */\nexport function canvasOpened(surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.CANVAS_OPENED, { surface });\n}\n\n/**\n * Canvas closed event.\n */\nexport function canvasClosed(surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.CANVAS_CLOSED, { surface });\n}\n\n/**\n * Tile viewed event.\n */\nexport function tileViewed(tileId: string, surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.TILE_VIEWED, { tileId, surface });\n}\n\n/**\n * Tile expanded event.\n */\nexport function tileExpanded(tileId: string, surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.TILE_EXPANDED, { tileId, surface });\n}\n\n/**\n * Tile collapsed event.\n */\nexport function tileCollapsed(tileId: string, surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.TILE_COLLAPSED, { tileId, surface });\n}\n\n/**\n * Tile action event.\n */\nexport function tileAction(\n tileId: string,\n actionId: string,\n surface: CanvasSurface\n): NormalizedEvent {\n return createCanvasEvent(StandardEvents.TILE_ACTION, {\n tileId,\n actionId,\n surface,\n });\n}\n\n/**\n * Overlay/tour started event.\n */\nexport function overlayStarted(recipeId: string, recipeName?: string): NormalizedEvent {\n return createCanvasEvent(StandardEvents.OVERLAY_STARTED, {\n recipeId,\n recipeName,\n });\n}\n\n/**\n * Overlay/tour completed event.\n */\nexport function overlayCompleted(recipeId: string, recipeName?: string): NormalizedEvent {\n return createCanvasEvent(StandardEvents.OVERLAY_COMPLETED, {\n recipeId,\n recipeName,\n });\n}\n\n/**\n * Overlay/tour dismissed event.\n */\nexport function overlayDismissed(\n recipeId: string,\n recipeName?: string,\n stepIndex?: number\n): NormalizedEvent {\n return createCanvasEvent(StandardEvents.OVERLAY_DISMISSED, {\n recipeId,\n recipeName,\n stepIndex,\n });\n}\n\n/**\n * Overlay step viewed event.\n */\nexport function overlayStepViewed(\n recipeId: string,\n stepIndex: number,\n stepTitle?: string\n): NormalizedEvent {\n return createCanvasEvent(StandardEvents.OVERLAY_STEP_VIEWED, {\n recipeId,\n stepIndex,\n stepTitle,\n });\n}\n\n/**\n * Create a custom canvas event.\n */\nexport function customCanvasEvent(name: string, props?: Record<string, unknown>): NormalizedEvent {\n // Prefix custom events with \"canvas.\" if not already prefixed\n const eventName = name.startsWith('canvas.') ? name : `canvas.${name}`;\n return createCanvasEvent(eventName, props);\n}\n\n/**\n * Canvas event factory for easy event creation.\n */\nexport const CanvasEvents = {\n canvasOpened,\n canvasClosed,\n tileViewed,\n tileExpanded,\n tileCollapsed,\n tileAction,\n overlayStarted,\n overlayCompleted,\n overlayDismissed,\n overlayStepViewed,\n custom: customCanvasEvent,\n};\n", "/**\n * Shared emoji \u2192 Lucide icon mapping.\n *\n * Used by TileIcon, NavWidget, and NotificationToastStack to render\n * Lucide SVG icons in place of emoji strings. This keeps icon rendering\n * consistent and styleable across all surfaces.\n *\n * To add a new mapping, add the emoji key and Lucide component here.\n */\n\nimport {\n AlertTriangle,\n ArrowRight,\n Banknote,\n Bell,\n BookOpen,\n CheckCircle,\n ClipboardList,\n Compass,\n FileText,\n Gamepad2,\n HelpCircle,\n Landmark,\n Layers,\n Lightbulb,\n MessageCircle,\n SkipForward,\n Sparkles,\n Timer,\n Trophy,\n} from 'lucide-react';\nimport type { ReactElement } from 'react';\n\nconst EMOJI_ICON_MAP: Record<string, React.ComponentType<{ size?: number; color?: string }>> = {\n '\u2753': HelpCircle,\n '\uD83E\uDDED': Compass,\n '\uD83D\uDCDD': FileText,\n '\uD83C\uDFAF': Layers,\n '\uD83C\uDFC6': Trophy,\n '\u2728': Sparkles,\n '\uD83D\uDCAC': MessageCircle,\n '\uD83C\uDFAE': Gamepad2,\n '\uD83D\uDCA1': Lightbulb,\n '\uD83D\uDCB0': Banknote,\n '\uD83D\uDCCB': ClipboardList,\n '\u2705': CheckCircle,\n '\u26A0\uFE0F': AlertTriangle,\n '\uD83D\uDCB5': Banknote,\n '\uD83C\uDFDB\uFE0F': Landmark,\n '\u23ED\uFE0F': SkipForward,\n '\u27A1\uFE0F': ArrowRight,\n '\u23F1\uFE0F': Timer,\n '\uD83D\uDCD6': BookOpen,\n '\uD83D\uDD14': Bell,\n};\n\ninterface EmojiIconProps {\n emoji: string;\n size?: number;\n color?: string;\n}\n\n/**\n * Render a Lucide icon for a known emoji, or fall back to the raw string.\n */\nexport function EmojiIcon({\n emoji,\n size = 14,\n color = 'currentColor',\n}: EmojiIconProps): ReactElement {\n const Icon = EMOJI_ICON_MAP[emoji];\n if (!Icon) {\n return <span>{emoji}</span>;\n }\n return <Icon size={size} color={color} />;\n}\n\n/**\n * Check if an emoji string has a Lucide mapping.\n */\nexport function hasIconMapping(emoji: string): boolean {\n return emoji in EMOJI_ICON_MAP;\n}\n", "import { EmojiIcon } from '../components/emojiToIcon';\nimport { useShadowRoot } from '../ShadowRootContext';\n\nimport type { ActiveNotification } from './types';\n\nconst TOAST_STYLES_ID = 'syntro-toast-styles';\nconst TOAST_CSS = `\n @keyframes syntro-toast-slide-in {\n from { opacity: 0; transform: translateY(12px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes syntro-toast-progress {\n from { width: 100%; }\n to { width: 0%; }\n }\n .syntro-toast-enter {\n animation: syntro-toast-slide-in 200ms cubic-bezier(0.16, 1, 0.3, 1) forwards;\n }\n .syntro-toast-progress {\n animation: syntro-toast-progress linear forwards;\n }\n .syntro-toast-progress.paused {\n animation-play-state: paused;\n }\n`;\n\nfunction ensureToastStyles(target: ShadowRoot | DocumentOrShadowRoot) {\n if ((target as ParentNode).querySelector(`#${TOAST_STYLES_ID}`)) return;\n const style = document.createElement('style');\n style.id = TOAST_STYLES_ID;\n style.textContent = TOAST_CSS;\n (target as Node).appendChild(style);\n}\n\nexport interface NotificationToastStackProps {\n notifications: ActiveNotification[];\n onDismiss: (id: string) => void;\n onClickNotification: (notification: ActiveNotification) => void;\n position: 'left' | 'right';\n}\n\nexport function NotificationToastStack({\n notifications,\n onDismiss,\n onClickNotification,\n position,\n}: NotificationToastStackProps) {\n const { shadowRoot } = useShadowRoot();\n ensureToastStyles(shadowRoot);\n\n if (notifications.length === 0) return null;\n\n return (\n <div\n data-testid=\"notification-toast-stack\"\n style={{\n position: 'fixed',\n bottom: '6rem',\n [position === 'right' ? 'right' : 'left']: '2.5rem',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n zIndex: 2147483648,\n pointerEvents: 'auto',\n width: '280px',\n }}\n >\n {notifications.map((notif) => (\n // biome-ignore lint/a11y/noStaticElementInteractions: Hover effects for pause-on-hover UX; not interactive in the a11y sense\n <div\n key={notif.id}\n className=\"syntro-toast-enter\"\n style={{\n background: 'var(--sc-notification-background)',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: 'var(--sc-notification-border)',\n borderRadius: 'var(--sc-notification-border-radius)',\n overflow: 'hidden',\n cursor: 'pointer',\n transition: 'transform 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'translateY(-1px)';\n const bar = e.currentTarget.querySelector('.syntro-toast-progress');\n if (bar) bar.classList.add('paused');\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n const bar = e.currentTarget.querySelector('.syntro-toast-progress');\n if (bar) bar.classList.remove('paused');\n }}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Notification click-to-open; dismiss button is the primary interactive element */}\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: Notification click-to-open; dismiss button is the primary interactive element */}\n <div\n onClick={() => onClickNotification(notif)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '10px',\n padding: '10px 12px',\n }}\n >\n <div\n style={{\n width: '28px',\n height: '28px',\n borderRadius: '8px',\n background: 'var(--sc-notification-icon-background)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n fontSize: '14px',\n }}\n >\n <EmojiIcon emoji={notif.icon ?? '\uD83D\uDD14'} size={14} />\n </div>\n\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '13px',\n fontWeight: 600,\n color: 'var(--sc-notification-text-color)',\n lineHeight: '1.3',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {notif.title}\n </div>\n {notif.body && (\n <div\n style={{\n fontSize: '12px',\n color: 'var(--sc-notification-text-secondary-color)',\n lineHeight: '1.3',\n marginTop: '2px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {notif.body}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onDismiss(notif.id);\n }}\n aria-label=\"Dismiss notification\"\n style={{\n background: 'none',\n border: 'none',\n color: 'var(--sc-notification-text-secondary-color)',\n cursor: 'pointer',\n padding: '2px',\n fontSize: '14px',\n lineHeight: 1,\n flexShrink: 0,\n }}\n >\n \u00D7\n </button>\n </div>\n\n <div style={{ height: '2px', background: 'rgba(0, 0, 0, 0.08)' }}>\n <div\n className=\"syntro-toast-progress\"\n style={{\n height: '100%',\n background: 'var(--sc-notification-progress-gradient)',\n animationDuration: `${notif.ttl}ms`,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n", "/**\n * Notification System Types\n *\n * Config-driven toast notifications that surface adaptive events\n * (FAQ triggers, nav suggestions) above the launcher button.\n */\n\n/**\n * A declarative rule on a TileConfig that maps an EventBus event\n * to a toast notification.\n */\nexport interface TileNotificationRule {\n /** EventBus event name to match (exact string or regex pattern) */\n on: string;\n /** Toast title \u2014 supports {{props.x}} template interpolation */\n title: string;\n /** Toast body text \u2014 supports {{props.x}} template interpolation */\n body?: string;\n /** Lucide icon name or emoji (falls back to tile icon if omitted) */\n icon?: string;\n /** Auto-dismiss duration in ms (default: 8000) */\n ttl?: number;\n /** Deep link target when user clicks the toast */\n deepLink?: NotificationDeepLink;\n /** Cooldown in ms before the same rule can fire again (default: 30000) */\n cooldown?: number;\n}\n\n/**\n * What happens when a user clicks a notification toast.\n */\nexport interface NotificationDeepLink {\n /** Tile ID to navigate to */\n tileId: string;\n /** Item-level target \u2014 supports {{props.x}} interpolation */\n itemId?: string;\n}\n\n/**\n * An active (visible) notification in the toast queue.\n */\nexport interface ActiveNotification {\n /** Unique ID for React key */\n id: string;\n /** Resolved title (templates already interpolated) */\n title: string;\n /** Resolved body (templates already interpolated) */\n body?: string;\n /** Icon name or emoji */\n icon?: string;\n /** Source tile ID (for dedup) */\n tileId: string;\n /** Resolved deep link item ID */\n itemId?: string;\n /** When this toast expires (Date.now() + ttl) */\n expiresAt: number;\n /** When this toast was created */\n createdAt: number;\n /** TTL for progress bar calculation */\n ttl: number;\n}\n\n/** Max number of visible toasts at once */\nexport const MAX_VISIBLE_TOASTS = 3;\n\n/** Default auto-dismiss duration in ms */\nexport const DEFAULT_TTL = 8000;\n\n/** Default cooldown between same rule firing in ms */\nexport const DEFAULT_COOLDOWN = 30000;\n", "import type { NormalizedEvent } from '../events/types';\nimport type { TileConfig } from '../types';\n\nimport type { ActiveNotification, TileNotificationRule } from './types';\nimport { DEFAULT_TTL } from './types';\n\n/**\n * Result of matching an event against tile notification rules.\n * Includes both the resolved notification and the original rule\n * so callers can access rule-level settings (e.g., cooldown).\n */\nexport interface MatchResult {\n notification: ActiveNotification;\n rule: TileNotificationRule;\n}\n\nlet notificationCounter = 0;\n\n/**\n * Replace {{props.x}} placeholders in a template string with values\n * from the event props. Leaves placeholders intact when the referenced\n * prop is missing or props is undefined.\n */\nexport function interpolateTemplate(\n template: string,\n props: Record<string, unknown> | undefined\n): string {\n return template.replace(/\\{\\{props\\.(\\w+)\\}\\}/g, (_match, key: string) => {\n if (!props || !(key in props)) return _match;\n return String(props[key]);\n });\n}\n\n/**\n * Check whether an event name matches a rule's `on` field.\n * Tries exact match first, then falls back to regex matching.\n */\nfunction matchesRule(eventName: string, ruleOn: string): boolean {\n if (eventName === ruleOn) return true;\n try {\n return new RegExp(ruleOn).test(eventName);\n } catch {\n return false;\n }\n}\n\n/**\n * Given a NormalizedEvent and a list of tile configs, find the first\n * matching notification rule and return a MatchResult containing\n * both the resolved ActiveNotification and the original rule.\n * Returns null when no rules match.\n */\nexport function matchEvent(event: NormalizedEvent, tiles: TileConfig[]): MatchResult | null {\n for (const tile of tiles) {\n const rules = tile.notifications;\n if (!rules || rules.length === 0) continue;\n\n for (const rule of rules) {\n if (!matchesRule(event.name, rule.on)) continue;\n\n const now = Date.now();\n const ttl = rule.ttl ?? DEFAULT_TTL;\n\n return {\n notification: {\n id: `notif-${++notificationCounter}-${now}`,\n title: interpolateTemplate(rule.title, event.props),\n body: rule.body ? interpolateTemplate(rule.body, event.props) : undefined,\n icon: rule.icon,\n tileId: tile.id,\n itemId: rule.deepLink?.itemId\n ? interpolateTemplate(rule.deepLink.itemId, event.props)\n : undefined,\n expiresAt: now + ttl,\n createdAt: now,\n ttl,\n },\n rule,\n };\n }\n }\n\n return null;\n}\n", "import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { EventBus } from '../events/EventBus';\nimport { StandardEvents } from '../events/types';\nimport type { TileConfig } from '../types';\n\nimport { matchEvent } from './matcher';\nimport type { ActiveNotification } from './types';\nimport { DEFAULT_COOLDOWN, MAX_VISIBLE_TOASTS } from './types';\n\nexport interface UseNotificationsReturn {\n notifications: ActiveNotification[];\n dismiss: (id: string) => void;\n}\n\n/**\n * React hook that subscribes to the EventBus, evaluates notification rules\n * from tile configs, and manages the active toast queue.\n *\n * Features:\n * - Max 3 visible toasts (FIFO eviction when exceeded)\n * - Deduplication by tileId + itemId\n * - Cooldown per rule (prevents rapid re-firing)\n * - Auto-dismiss after TTL\n * - Publishes NOTIFICATION_SHOWN / NOTIFICATION_DISMISSED telemetry events\n */\nexport function useNotifications(\n eventBus: EventBus | null,\n tiles: TileConfig[]\n): UseNotificationsReturn {\n const [notifications, setNotifications] = useState<ActiveNotification[]>([]);\n const cooldownMap = useRef<Map<string, number>>(new Map());\n const timerIds = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n const publishDismissed = useCallback(\n (notif: ActiveNotification) => {\n // biome-ignore lint: intentional field subset for telemetry event payload\n eventBus?.publish(StandardEvents.NOTIFICATION_DISMISSED, {\n notificationId: notif.id,\n tileId: notif.tileId,\n itemId: notif.itemId,\n });\n },\n [eventBus]\n );\n\n const scheduleDismiss = useCallback(\n (notif: ActiveNotification) => {\n const timerId = setTimeout(() => {\n setNotifications((prev) => prev.filter((n) => n.id !== notif.id));\n timerIds.current.delete(notif.id);\n publishDismissed(notif);\n }, notif.ttl);\n timerIds.current.set(notif.id, timerId);\n },\n [publishDismissed]\n );\n\n const dismiss = useCallback(\n (id: string) => {\n setNotifications((prev) => {\n const notif = prev.find((n) => n.id === id);\n if (notif) publishDismissed(notif);\n return prev.filter((n) => n.id !== id);\n });\n const timerId = timerIds.current.get(id);\n if (timerId) {\n clearTimeout(timerId);\n timerIds.current.delete(id);\n }\n },\n [publishDismissed]\n );\n\n useEffect(() => {\n if (!eventBus) return;\n\n const unsubscribe = eventBus.subscribe((event) => {\n const match = matchEvent(event, tiles);\n if (!match) return;\n\n const { notification: matched, rule: matchedRule } = match;\n\n // --- Cooldown check ---\n // When itemId is present (via deepLink template interpolation), scope the\n // cooldown per-item so different items sharing the same rule can each fire.\n const cooldownKey = matched.itemId\n ? `${matched.tileId}:${event.name}:${matched.itemId}`\n : `${matched.tileId}:${event.name}`;\n const lastFired = cooldownMap.current.get(cooldownKey);\n const now = Date.now();\n const cooldown = matchedRule.cooldown ?? DEFAULT_COOLDOWN;\n\n if (lastFired !== undefined && now - lastFired < cooldown) return;\n cooldownMap.current.set(cooldownKey, now);\n\n // --- Dedup check + queue management ---\n setNotifications((prev) => {\n // Dedup: skip if a notification with the same tileId + itemId already exists\n if (matched.itemId) {\n const isDuplicate = prev.some(\n (n) => n.tileId === matched.tileId && n.itemId === matched.itemId\n );\n if (isDuplicate) return prev;\n }\n\n const next = [...prev, matched];\n\n // FIFO eviction: remove oldest when exceeding max visible\n if (next.length > MAX_VISIBLE_TOASTS) {\n const evicted = next.shift()!;\n const timerId = timerIds.current.get(evicted.id);\n if (timerId) {\n clearTimeout(timerId);\n timerIds.current.delete(evicted.id);\n }\n }\n\n return next;\n });\n\n // Publish shown event\n // biome-ignore lint: intentional field subset for telemetry event payload\n eventBus.publish(StandardEvents.NOTIFICATION_SHOWN, {\n notificationId: matched.id,\n tileId: matched.tileId,\n itemId: matched.itemId,\n title: matched.title,\n });\n\n scheduleDismiss(matched);\n });\n\n return () => {\n unsubscribe();\n for (const timerId of timerIds.current.values()) {\n clearTimeout(timerId);\n }\n timerIds.current.clear();\n };\n }, [eventBus, tiles, scheduleDismiss]);\n\n return { notifications, dismiss };\n}\n", "/**\n * useNotifyWatcher\n *\n * Runs in ShadowCanvasOverlay (always mounted). Collects NotifyWatcherEntry\n * registrations from each app's `runtime.notifyWatchers(props)` callback,\n * subscribes to EventBus, and publishes events when DecisionStrategy\n * conditions transition false \u2192 true.\n *\n * This lets adaptives fire notification events even when their widgets\n * aren't mounted (e.g., drawer is closed).\n */\n\nimport { useEffect, useRef } from 'react';\n\nimport type { AppRegistry } from '../apps/AppRegistry';\nimport type { NotifyWatcherEntry } from '../apps/types';\nimport type { SmartCanvasRuntime } from '../runtime';\nimport type { TileConfig } from '../types';\n\n/**\n * Collect NotifyWatcherEntry[] from all registered apps for the given tiles.\n */\nfunction collectEntries(tiles: TileConfig[], appRegistry: AppRegistry): NotifyWatcherEntry[] {\n const entries: NotifyWatcherEntry[] = [];\n\n for (const tile of tiles) {\n // Widget format: \"adaptive-faq:accordion\" \u2192 appId = \"adaptive-faq\"\n const appId = tile.widget.split(':')[0];\n const registration = appRegistry.get(appId);\n const watcherFn = registration?.manifest.runtime?.notifyWatchers;\n\n if (watcherFn) {\n entries.push(...watcherFn(tile.props ?? {}));\n }\n }\n\n return entries;\n}\n\nexport function useNotifyWatcher(\n runtime: SmartCanvasRuntime | null,\n tiles: TileConfig[],\n appRegistry: AppRegistry | undefined\n): void {\n const prevStateRef = useRef<Map<string, boolean>>(new Map());\n\n useEffect(() => {\n if (!runtime?.events || !appRegistry) return;\n\n const entries = collectEntries(tiles, appRegistry);\n if (entries.length === 0) return;\n\n // Persist \"already notified\" across MPA navigations (sessionStorage-backed)\n const notifiedStore = runtime.state.ns('notified');\n\n // Snapshot current state so we don't fire on conditions already true (SPA).\n // On MPA remount: if condition is already true and we haven't notified\n // this session, fire now (accumulator counts survive in sessionStorage\n // but the in-memory prevStateRef was lost on navigation).\n for (const entry of entries) {\n if (!prevStateRef.current.has(entry.id)) {\n const result = runtime.evaluateSync<boolean>(entry.strategy);\n prevStateRef.current.set(entry.id, result.value);\n\n // MPA fix: condition already true on mount, not yet notified this session\n if (result.value && !notifiedStore.has(entry.id)) {\n notifiedStore.set(entry.id, true);\n runtime.events.publish(entry.eventName, entry.eventProps);\n }\n }\n }\n\n const unsub = runtime.events.subscribe(() => {\n for (const entry of entries) {\n const result = runtime.evaluateSync<boolean>(entry.strategy);\n const wasVisible = prevStateRef.current.get(entry.id) ?? false;\n\n // Update state BEFORE publishing to prevent re-entrant loops.\n // EventBus.publish() synchronously notifies subscribers, so without\n // this guard the nested callback would see wasVisible=false again.\n prevStateRef.current.set(entry.id, result.value);\n\n if (!wasVisible && result.value) {\n notifiedStore.set(entry.id, true);\n runtime.events.publish(entry.eventName, entry.eventProps);\n } else if (wasVisible && !result.value) {\n notifiedStore.remove(entry.id);\n }\n }\n });\n\n return unsub;\n }, [runtime, tiles, appRegistry]);\n}\n", "/**\n * RuntimeProvider - React context for accessing the v2 Runtime.\n *\n * Provides access to the SmartCanvasRuntime from any component in the tree.\n */\nimport { createContext, type ReactNode, useContext, useEffect, useMemo, useState } from 'react';\n\nimport type { RuntimeContext } from './context/types';\nimport type { SmartCanvasRuntime } from './runtime';\n\n/**\n * Context value for the RuntimeProvider.\n */\ninterface RuntimeContextValue {\n /** The SmartCanvasRuntime instance */\n runtime: SmartCanvasRuntime | null;\n /** Current runtime context (reactive) */\n context: RuntimeContext | null;\n}\n\nconst RuntimeReactContext = createContext<RuntimeContextValue>({\n runtime: null,\n context: null,\n});\n\nexport interface RuntimeProviderProps {\n /** The SmartCanvasRuntime instance */\n runtime: SmartCanvasRuntime | null;\n children: ReactNode;\n}\n\n/**\n * Provider component for the SmartCanvasRuntime.\n */\nexport function RuntimeProvider({ runtime, children }: RuntimeProviderProps) {\n // Subscribe to context changes and re-render when they occur\n const [context, setContext] = useState<RuntimeContext | null>(\n runtime ? runtime.context.get() : null\n );\n\n useEffect(() => {\n if (!runtime) return;\n\n // Set initial context\n setContext(runtime.context.get());\n\n // Subscribe to changes\n const unsubscribe = runtime.context.subscribe((ctx) => {\n setContext(ctx);\n });\n\n return unsubscribe;\n }, [runtime]);\n\n const value = useMemo(() => ({ runtime, context }), [runtime, context]);\n\n return <RuntimeReactContext.Provider value={value}>{children}</RuntimeReactContext.Provider>;\n}\n\n/**\n * Hook to access the SmartCanvasRuntime.\n */\nexport function useRuntime(): SmartCanvasRuntime | null {\n const { runtime } = useContext(RuntimeReactContext);\n return runtime;\n}\n\n/**\n * Hook to access the current runtime context (reactive).\n */\nexport function useRuntimeContext(): RuntimeContext | null {\n const { context } = useContext(RuntimeReactContext);\n return context;\n}\n\n/**\n * Hook to access a specific part of the runtime context.\n */\nexport function usePageContext() {\n const context = useRuntimeContext();\n return context?.page ?? null;\n}\n\nexport function useSessionContext() {\n const context = useRuntimeContext();\n return context?.session ?? null;\n}\n\nexport function useViewportContext() {\n const context = useRuntimeContext();\n return context?.viewport ?? null;\n}\n\n/**\n * Hook to subscribe to runtime events.\n */\nexport function useRuntimeEvents(\n filter:\n | { names?: string[]; patterns?: string[]; sources?: Array<'posthog' | 'canvas' | 'derived'> }\n | undefined,\n callback: (event: import('./events/types').NormalizedEvent) => void,\n deps: React.DependencyList = []\n) {\n const runtime = useRuntime();\n\n useEffect(() => {\n if (!runtime) return;\n\n const unsubscribe = filter\n ? runtime.events.subscribe(filter, callback)\n : runtime.events.subscribe(callback);\n\n return unsubscribe;\n }, [runtime, ...deps, callback, filter]);\n}\n\n/**\n * Hook to access state helpers.\n */\nexport function useRuntimeState() {\n const runtime = useRuntime();\n return runtime?.state ?? null;\n}\n\n/**\n * Hook to evaluate a decision strategy.\n */\nexport function useDecision<T>(\n strategy: import('./decisions/types').DecisionStrategy<T> | undefined | null,\n defaultValue: T\n): { value: T; isFallback: boolean; isLoading: boolean } {\n const runtime = useRuntime();\n const [result, setResult] = useState<{ value: T; isFallback: boolean; isLoading: boolean }>({\n value: defaultValue,\n isFallback: true,\n isLoading: true,\n });\n\n useEffect(() => {\n if (!runtime || !strategy) {\n setResult({ value: defaultValue, isFallback: true, isLoading: false });\n return;\n }\n\n let cancelled = false;\n\n runtime.evaluate(strategy).then((res) => {\n if (!cancelled) {\n setResult({ value: res.value, isFallback: res.isFallback, isLoading: false });\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [runtime, strategy, defaultValue]);\n\n return result;\n}\n", "import {\n type CSSProperties,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'react';\n\nimport { useRuntime } from '../RuntimeProvider';\nimport type { TelemetryClient } from '../telemetry/types';\nimport type { TileConfig } from '../types';\nimport type { MountedWidgetHandle } from '../widgets/WidgetRegistry';\nimport { TileIcon } from './TileIcon';\n\n// ---------------------------------------------------------------------------\n// WidgetMount - mounts a registered widget into a DOM container\n// ---------------------------------------------------------------------------\n\nfunction WidgetMount({ widgetId, props }: { widgetId: string; props?: Record<string, unknown> }) {\n const runtime = useRuntime();\n // parentRef is the React-rendered wrapper; the actual widget container is\n // created imperatively inside it so that React's reconciliation never\n // touches the inner React root's DOM (prevents removeChild errors and\n // broken event delegation in Shadow DOM).\n const parentRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<MountedWidgetHandle | null>(null);\n\n const registry = runtime?.widgets;\n const widgetAvailable = registry?.has(widgetId) ?? false;\n\n // Keep a ref so the mount effect can read current props without depending\n // on the object reference (which changes every parent render).\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // Re-render when the target widget registers (late activation)\n const [, forceUpdate] = useReducer((x: number) => x + 1, 0);\n useEffect(() => {\n if (!registry || widgetAvailable) return;\n return registry.subscribe((event) => {\n if (event.type === 'registered' && event.widgetId === widgetId) {\n forceUpdate();\n }\n });\n }, [registry, widgetId, widgetAvailable]);\n\n // Mount/unmount only when widget identity changes \u2014 NOT on prop changes.\n // The widget container is created via DOM API (not JSX) so that React's\n // reconciliation of the parent div never interferes with the widget's\n // inner React root. This prevents removeChild errors when the outer\n // canvas root re-renders.\n useEffect(() => {\n if (!parentRef.current || !registry || !widgetAvailable) return;\n\n const container = document.createElement('div');\n container.style.width = '100%';\n container.style.minHeight = '40px';\n parentRef.current.appendChild(container);\n\n const handle = registry.mount(widgetId, container, propsRef.current);\n handleRef.current = handle;\n\n return () => {\n handle.unmount();\n handleRef.current = null;\n // Don't call container.remove() \u2014 React will remove the parent\n // <div ref={parentRef}> which naturally removes the container.\n // Eagerly removing it causes a removeChild crash when React's\n // reconciler tries to unmount the parent and finds the child gone.\n };\n }, [registry, widgetId, widgetAvailable]);\n\n // Forward prop value changes to the existing handle without remounting.\n // JSON serialization gives us value-based comparison for the dependency.\n const propsJson = JSON.stringify(props);\n const prevPropsJsonRef = useRef(propsJson);\n useEffect(() => {\n if (prevPropsJsonRef.current === propsJson) return;\n prevPropsJsonRef.current = propsJson;\n handleRef.current?.update(propsRef.current);\n }, [propsJson]);\n\n if (!registry || !registry.has(widgetId)) {\n return (\n <div\n style={{\n padding: '0.75rem',\n fontSize: '0.8rem',\n color: 'var(--sc-tile-text-color)',\n fontStyle: 'italic',\n }}\n >\n Widget not available: {widgetId}\n </div>\n );\n }\n\n return <div ref={parentRef} />;\n}\n\n// ---------------------------------------------------------------------------\n// TileCard\n// ---------------------------------------------------------------------------\n\ninterface TileCardProps {\n config: TileConfig;\n surface: 'overlay' | 'wheel';\n telemetry?: TelemetryClient;\n style?: CSSProperties;\n}\n\nexport function TileCard({\n config,\n surface: _surface,\n telemetry: _telemetry,\n style,\n}: TileCardProps) {\n const { title, subtitle, widget, props, icon } = config;\n const [, setTick] = useState(0);\n\n // Force a re-render once the runtime becomes available so WidgetMount can\n // pick up the registry. This covers the case where TileCard renders before\n // the RuntimeProvider has propagated the runtime value.\n const runtime = useRuntime();\n useEffect(() => {\n if (runtime) setTick((t) => t + 1);\n }, [runtime]);\n\n // Resolve icon: config.icon > widget metadata icon > '+'\n const registration = useMemo(\n () => runtime?.widgets?.getRegistration?.(widget),\n [runtime?.widgets, widget]\n );\n\n const resolvedIcon = useMemo(() => {\n if (icon) return icon;\n return registration?.metadata?.icon ?? '+';\n }, [icon, registration]);\n\n // Resolve subtitle: config.subtitle > widget metadata subtitle > undefined\n const resolvedSubtitle = useMemo(() => {\n if (subtitle) return subtitle;\n return registration?.metadata?.subtitle;\n }, [subtitle, registration]);\n\n const [hovered, setHovered] = useState(false);\n const onMouseEnter = useCallback(() => setHovered(true), []);\n const onMouseLeave = useCallback(() => setHovered(false), []);\n\n const cardStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 'var(--sc-tile-border-radius)',\n background: hovered ? 'var(--sc-tile-background-hover)' : 'var(--sc-tile-background)',\n backdropFilter: 'blur(16px) saturate(1.2)',\n WebkitBackdropFilter: 'blur(16px) saturate(1.2)',\n border: 'var(--sc-tile-border)',\n boxShadow: 'var(--sc-tile-shadow)',\n color: 'var(--sc-tile-title-color)',\n fontFamily: 'var(--sc-font-family)',\n overflow: 'hidden',\n cursor: 'default',\n transition: 'all 0.25s ease',\n transform: hovered ? 'scale(1.01)' : 'scale(1)',\n ...style,\n };\n\n const headerStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--sc-tile-gap, 0.25rem)',\n padding: 'var(--sc-tile-header-padding, 0.375rem 0.75rem)',\n minHeight: '44px',\n };\n\n const iconStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n };\n\n return (\n <article\n data-shadow-canvas-id={`tile-${config.id}`}\n style={cardStyle}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {/* Header */}\n <div style={headerStyle}>\n <div style={iconStyle}>\n <TileIcon emoji={resolvedIcon} size={resolvedSubtitle ? 36 : 24} />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <h3\n style={{\n fontSize: '1.14rem',\n fontWeight: 600,\n color: 'var(--sc-tile-title-color)',\n margin: '0.125rem 0 0',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {title ?? widget}\n </h3>\n {resolvedSubtitle && (\n <p\n style={{\n fontSize: '0.8rem',\n fontWeight: 400,\n color: 'var(--sc-tile-text-color)',\n margin: '0.125rem 0 0',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {resolvedSubtitle}\n </p>\n )}\n </div>\n </div>\n\n {/* Widget Content \u2014 always rendered */}\n <div\n style={{\n padding: 'var(--sc-tile-body-padding, 0 0.75rem 0.5rem)',\n borderTop: '1px solid rgba(255, 255, 255, 0.06)',\n }}\n >\n <div style={{ paddingTop: 'var(--sc-tile-gap, 0.25rem)' }}>\n <WidgetMount widgetId={widget} props={{ ...props, instanceId: config.id }} />\n </div>\n </div>\n </article>\n );\n}\n", "/**\n * TileIcon \u2014 maps emoji identifiers to Lucide icons.\n *\n * Uses the shared emoji-to-icon mapping so tiles render the same\n * icons as the editor sidebar, nav tips, and notifications.\n */\n\nimport type { ReactElement } from 'react';\nimport { EmojiIcon } from './emojiToIcon';\n\ninterface TileIconProps {\n emoji: string;\n size?: number;\n color?: string;\n}\n\nexport function TileIcon({\n emoji,\n size = 18,\n color = 'currentColor',\n}: TileIconProps): ReactElement {\n return <EmojiIcon emoji={emoji} size={size} color={color} />;\n}\n", "import { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { CanvasEvents } from '../events/normalizers/canvas';\nimport { StandardEvents } from '../events/types';\nimport { NotificationToastStack } from '../notifications/NotificationToastStack';\nimport type { ActiveNotification } from '../notifications/types';\nimport { useNotifications } from '../notifications/useNotifications';\nimport { useNotifyWatcher } from '../notifications/useNotifyWatcher';\nimport { useRuntime } from '../RuntimeProvider';\nimport { useShadowRoot } from '../ShadowRootContext';\nimport type { TelemetryClient } from '../telemetry/types';\nimport { useTheme } from '../theme';\nimport type { TileConfig } from '../types';\n\nimport { TileCard } from './TileCard';\n\n// Launcher animation CSS style element ID\nconst LAUNCHER_STYLES_ID = 'syntro-launcher-styles';\n\nfunction ensureLauncherStyles(target: ShadowRoot | DocumentOrShadowRoot, css: string) {\n if ((target as ParentNode).querySelector(`#${LAUNCHER_STYLES_ID}`)) return;\n const style = document.createElement('style');\n style.id = LAUNCHER_STYLES_ID;\n style.textContent = css;\n (target as Node).appendChild(style);\n}\n\nexport interface ShadowCanvasOverlayProps {\n isOpen: boolean;\n onToggle: () => void;\n telemetry?: TelemetryClient;\n launcherLabel?: string;\n launcherIcon?: string;\n launcherAnimate?: boolean;\n launcherAnimationStyle?: 'pulse' | 'bounce' | 'glow';\n notificationCount?: number;\n footerSlot?: ReactNode;\n tiles: TileConfig[];\n isLoading: boolean;\n error?: string;\n canvasTitle?: string;\n displayMode?: 'standard' | 'focused';\n}\n\nexport function ShadowCanvasOverlay({\n isOpen,\n onToggle,\n telemetry,\n launcherLabel: _launcherLabel = 'Adaptives',\n launcherIcon,\n launcherAnimate = false,\n launcherAnimationStyle: _launcherAnimationStyle = 'pulse',\n notificationCount: _notificationCount,\n footerSlot,\n tiles,\n isLoading,\n error,\n canvasTitle,\n displayMode = 'standard',\n}: ShadowCanvasOverlayProps) {\n const [mounted, setMounted] = useState(false);\n const [launcherPos, setLauncherPos] = useState<{ x: number; y: number } | null>(null);\n const dragRef = useRef<{\n startX: number;\n startY: number;\n startElX: number;\n startElY: number;\n dragged: boolean;\n } | null>(null);\n // Get runtime for publishing events to the EventBus\n const runtime = useRuntime();\n const { shadowRoot, portalRoot } = useShadowRoot();\n const { config } = useTheme();\n\n // Notification toast system\n const { notifications, dismiss: dismissNotification } = useNotifications(\n runtime?.events ?? null,\n tiles\n );\n\n // Watch for notify-bearing actions crossing triggerWhen thresholds (runs even with drawer closed)\n useNotifyWatcher(runtime, tiles, runtime?.apps);\n\n const handleNotificationClick = useCallback(\n (notif: ActiveNotification) => {\n // Publish telemetry event\n if (runtime) {\n // biome-ignore lint: intentional field subset for telemetry event payload\n runtime.events.publish(StandardEvents.NOTIFICATION_CLICKED, {\n notificationId: notif.id,\n tileId: notif.tileId,\n itemId: notif.itemId,\n });\n }\n\n // Open canvas if closed\n if (!isOpen) {\n onToggle();\n }\n\n // Publish deep link event for the target adaptive to handle\n if (runtime && notif.tileId) {\n runtime.events.publish(StandardEvents.NOTIFICATION_DEEP_LINK, {\n tileId: notif.tileId,\n itemId: notif.itemId,\n });\n }\n\n // Dismiss the clicked toast\n dismissNotification(notif.id);\n },\n [runtime, isOpen, onToggle, dismissNotification]\n );\n\n // Build launcher CSS dynamically using theme config values\n // (keyframe animations cannot use var() in all browsers)\n const launcherCss = useMemo(\n () => `\n @keyframes syntro-launcher-pulse {\n 0%, 100% {\n box-shadow: 0 20px 45px rgba(0,0,0,0.35), 0 0 0 0 ${config.colorPrimary}66;\n }\n 50% {\n box-shadow: 0 20px 45px rgba(0,0,0,0.35), 0 0 0 8px ${config.colorPrimary}00;\n }\n }\n @keyframes syntro-launcher-glow {\n 0%, 100% { border-color: rgba(255,255,255,0.1); }\n 50% { border-color: ${config.colorPrimaryHover}99; }\n }\n .syntro-launcher-animate {\n animation: syntro-launcher-pulse 2s ease-in-out infinite, syntro-launcher-glow 2s ease-in-out infinite;\n }\n .syntro-launcher-animate:hover { animation: none; }\n @keyframes syntro-badge-ping {\n 0% { transform: scale(1); opacity: 1; }\n 75%, 100% { transform: scale(2.2); opacity: 0; }\n }\n @keyframes syntro-badge-glow {\n 0%, 100% { box-shadow: 0 0 8px 2px ${config.colorPrimaryHover}4d; }\n 50% { box-shadow: 0 0 20px 6px ${config.colorPrimaryHover}80; }\n }\n @keyframes syntro-badge-bounce {\n 0%, 100% { transform: translateY(0); }\n 25% { transform: translateY(-6px); }\n 50% { transform: translateY(-3px); }\n }\n .syntro-badge-ping { animation: syntro-badge-ping 1.5s cubic-bezier(0,0,0.2,1) infinite; }\n .syntro-badge-glow { animation: syntro-badge-glow 2s ease-in-out infinite; }\n .syntro-badge-bounce { animation: syntro-badge-bounce 2s ease-in-out infinite; }\n`,\n [config.colorPrimary, config.colorPrimaryHover]\n );\n\n // Track tile viewed events\n useEffect(() => {\n if (!isOpen) return;\n\n tiles.forEach((tile) => {\n // Telemetry tracking (PostHog)\n telemetry?.trackRectangleViewed(tile.id, 'overlay');\n\n // EventBus publishing\n if (runtime) {\n const event = CanvasEvents.tileViewed(tile.id, 'overlay');\n runtime.events.publish(event.name, event.props, event.source);\n }\n });\n }, [telemetry, runtime, isOpen, tiles]);\n\n useEffect(() => {\n setMounted(true);\n ensureLauncherStyles(shadowRoot, launcherCss);\n }, [shadowRoot, launcherCss]);\n\n const toggle = useCallback(() => {\n const next = !isOpen;\n\n // Telemetry tracking (PostHog)\n if (next) {\n telemetry?.trackCanvasOpened('overlay');\n } else {\n telemetry?.trackCanvasClosed('overlay');\n }\n\n // EventBus publishing\n if (runtime) {\n const event = next\n ? CanvasEvents.canvasOpened('overlay')\n : CanvasEvents.canvasClosed('overlay');\n runtime.events.publish(event.name, event.props, event.source);\n }\n\n onToggle();\n }, [isOpen, telemetry, runtime, onToggle]);\n\n // Drag-to-reposition: pointerdown starts tracking, pointermove updates position,\n // pointerup commits. If total movement < 5px, treat as a click instead.\n const onLauncherPointerDown = useCallback((e: React.PointerEvent<HTMLButtonElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n dragRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startElX: rect.left,\n startElY: rect.top,\n dragged: false,\n };\n e.currentTarget.setPointerCapture(e.pointerId);\n }, []);\n\n const onLauncherPointerMove = useCallback((e: React.PointerEvent<HTMLButtonElement>) => {\n const drag = dragRef.current;\n if (!drag) return;\n const dx = e.clientX - drag.startX;\n const dy = e.clientY - drag.startY;\n if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {\n drag.dragged = true;\n }\n if (drag.dragged) {\n setLauncherPos({ x: drag.startElX + dx, y: drag.startElY + dy });\n }\n }, []);\n\n const onLauncherPointerUp = useCallback(\n (_e: React.PointerEvent<HTMLButtonElement>) => {\n const drag = dragRef.current;\n dragRef.current = null;\n if (drag && !drag.dragged) {\n toggle();\n }\n },\n [toggle]\n );\n\n const isFocused = displayMode === 'focused';\n const isRight = config.canvas.position === 'right';\n const isPush = config.canvas.layout === 'push';\n const canvasBorder = config.canvas.border ?? 'none';\n const containerRef = useRef<HTMLDivElement>(null);\n const zIndex = 2147483600;\n\n // Push mode: apply margin to document root so page content shifts aside\n useEffect(() => {\n if (!isPush) return;\n\n const root = document.documentElement;\n const prop = isRight ? 'marginRight' : 'marginLeft';\n\n // Add smooth transition to root element\n const duration = config.canvas.transitionDuration ?? '300ms';\n const easing = config.canvas.transitionEasing ?? 'cubic-bezier(0.16, 1, 0.3, 1)';\n const prevTransition = root.style.transition;\n root.style.transition = `${prop} ${duration} ${easing}`;\n\n if (isOpen) {\n const width = containerRef.current?.offsetWidth ?? 380;\n root.style[prop] = `${width}px`;\n } else {\n root.style[prop] = '0px';\n }\n\n return () => {\n root.style[prop] = '';\n root.style.transition = prevTransition;\n };\n }, [isPush, isOpen, isRight, config.canvas.transitionDuration, config.canvas.transitionEasing]);\n\n // Push mode: ResizeObserver to keep margin in sync if canvas width changes\n useEffect(() => {\n if (!isPush || !isOpen) return;\n const container = containerRef.current;\n if (!container) return;\n\n const prop = isRight ? 'marginRight' : 'marginLeft';\n const observer = new ResizeObserver(([entry]) => {\n document.documentElement.style[prop] = `${entry.contentRect.width}px`;\n });\n observer.observe(container);\n return () => observer.disconnect();\n }, [isPush, isOpen, isRight]);\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n width: isFocused ? '40vw' : config.canvas.width,\n minWidth: '320px',\n height: '100%',\n maxHeight: '100%',\n pointerEvents: 'auto',\n opacity: isOpen ? 1 : 0,\n transition: (() => {\n const dur = config.canvas.transitionDuration ?? '300ms';\n const ease = config.canvas.transitionEasing ?? 'cubic-bezier(0.16, 1, 0.3, 1)';\n return isOpen\n ? `transform ${dur} ${ease}, opacity ${dur} ease-out`\n : `transform ${dur} ${ease}, opacity ${dur} ease-in`;\n })(),\n color: 'var(--sc-overlay-text-color)',\n\n background: 'var(--sc-canvas-background)',\n // Standard mode: config blur only. Focused mode: config blur + saturate boost.\n ...(() => {\n const blur = config.canvas.blur ?? 'blur(24px)';\n const filter = isFocused && blur !== 'none' ? `${blur} saturate(1.2)` : blur;\n return { backdropFilter: filter, WebkitBackdropFilter: filter };\n })(),\n // Tight fade mask so blur cuts off sharply at the leading edge.\n // Disabled when a visible border is configured (mask would fade the border).\n ...(() => {\n if (isFocused || (canvasBorder && canvasBorder !== 'none')) return {};\n const fade = config.canvas.transitionFade ?? '6%';\n const mask = isRight\n ? `linear-gradient(to right, transparent, black ${fade})`\n : `linear-gradient(to left, transparent, black ${fade})`;\n return { maskImage: mask, WebkitMaskImage: mask };\n })(),\n\n border: canvasBorder,\n borderRadius: 'var(--sc-overlay-border-radius, 0)',\n boxShadow: 'none',\n\n // Transform logic\n transform: isOpen ? 'translateX(0)' : isRight ? 'translateX(120%)' : 'translateX(-120%)',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: isRight ? 'row-reverse' : 'row',\n alignItems: 'stretch',\n pointerEvents: 'none',\n padding: '0',\n };\n\n const content = (\n <div\n data-shadow-canvas-id=\"overlay-root\"\n style={{\n position: 'fixed',\n inset: 0,\n pointerEvents: isOpen ? 'auto' : 'none',\n zIndex,\n }}\n >\n <div style={wrapperStyle}>\n <div ref={containerRef} data-shadow-canvas-id=\"overlay-container\" style={containerStyle}>\n {isFocused && canvasTitle && (\n <header style={{ color: 'white', padding: '1.5rem 1.5rem 0' }}>\n <p\n style={{\n margin: 0,\n fontSize: '0.7rem',\n textTransform: 'uppercase',\n letterSpacing: '0.5em',\n color: 'var(--sc-notification-text-secondary-color)',\n }}\n >\n {canvasTitle}\n </p>\n </header>\n )}\n\n <div style={{ flex: 1, overflowY: 'auto', padding: isFocused ? '0' : '1rem' }}>\n {isLoading ? (\n <div\n style={{ color: 'var(--sc-overlay-text-color)', padding: isFocused ? '1rem' : '0' }}\n >\n Loading...\n </div>\n ) : error ? (\n <div\n style={{\n color: 'var(--sc-notification-error-color)',\n padding: isFocused ? '1rem' : '0',\n }}\n >\n Failed to load: {error}\n </div>\n ) : isFocused ? (\n /* Focused Mode: Render first tile full size */\n tiles.length > 0 ? (\n <TileCard\n config={tiles[0]}\n surface=\"overlay\"\n telemetry={telemetry}\n style={{ width: '100%', height: '100%' }}\n />\n ) : null\n ) : (\n /* Standard Mode: Stacked cards \u2014 widgets always visible */\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '0.75rem',\n width: '100%',\n }}\n >\n {tiles.map((tile) => (\n <TileCard\n key={tile.id}\n config={tile}\n surface=\"overlay\"\n telemetry={telemetry}\n style={{ width: '100%' }}\n />\n ))}\n </div>\n )}\n </div>\n {footerSlot}\n </div>\n\n {/* Click backdrop to close */}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Backdrop click-to-close; keyboard users can press Escape */}\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: Backdrop click-to-close; keyboard users can press Escape */}\n <div\n onClick={toggle}\n style={{\n flex: '1 1 auto',\n pointerEvents: isOpen ? 'auto' : 'none',\n cursor: 'default',\n }}\n />\n </div>\n </div>\n );\n\n if (!mounted) return null;\n\n return (\n <>\n {createPortal(\n <div\n data-shadow-canvas-id=\"overlay-launcher\"\n style={{\n position: 'fixed',\n inset: 0,\n pointerEvents: 'none',\n zIndex: zIndex + 47,\n }}\n >\n <NotificationToastStack\n notifications={notifications}\n onDismiss={dismissNotification}\n onClickNotification={handleNotificationClick}\n position={config.canvas.position ?? 'right'}\n />\n <button\n type=\"button\"\n aria-label=\"Toggle shadow canvas\"\n className={launcherAnimate && !isOpen ? 'syntro-launcher-animate' : undefined}\n style={{\n position: 'fixed',\n ...(launcherPos\n ? { top: launcherPos.y, left: launcherPos.x }\n : {\n bottom: '2.5rem',\n right: isRight ? '2.5rem' : undefined,\n left: !isRight ? '2.5rem' : undefined,\n }),\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 'var(--sc-launcher-size, 56px)',\n height: 'var(--sc-launcher-size, 56px)',\n borderRadius: 'var(--sc-launcher-border-radius, 9999px)',\n color: 'var(--sc-launcher-color)',\n boxShadow: 'var(--sc-launcher-shadow)',\n transition: dragRef.current\n ? 'none'\n : 'transform 0.2s ease, opacity 0.3s ease, background-color 0.2s ease',\n outline: 'none',\n padding: 0,\n border: 'none',\n backgroundColor: 'var(--sc-launcher-background)',\n cursor: dragRef.current?.dragged ? 'grabbing' : 'pointer',\n touchAction: 'none',\n }}\n onPointerDown={onLauncherPointerDown}\n onPointerMove={onLauncherPointerMove}\n onPointerUp={onLauncherPointerUp}\n onMouseEnter={(e) => {\n if (!dragRef.current?.dragged) {\n e.currentTarget.style.backgroundColor =\n config.launcher.backgroundHover ?? 'var(--sc-launcher-background-hover)';\n }\n }}\n onMouseLeave={(e) => {\n if (!dragRef.current?.dragged) {\n e.currentTarget.style.backgroundColor =\n config.launcher.background ?? 'var(--sc-launcher-background)';\n }\n }}\n >\n {/* Custom icon when closed (if configured), X when open, sparkles default */}\n {isOpen ? (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n style={{ transition: 'transform 200ms ease' }}\n >\n <path d=\"M18 6L6 18\" />\n <path d=\"M6 6l12 12\" />\n </svg>\n ) : launcherIcon ? (\n <img\n src={launcherIcon}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n width: '60%',\n height: '60%',\n objectFit: 'contain',\n pointerEvents: 'none',\n }}\n />\n ) : (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n style={{ transition: 'transform 200ms ease' }}\n >\n <path d=\"M12 3l1.912 5.813a2 2 0 0 0 1.275 1.275L21 12l-5.813 1.912a2 2 0 0 0-1.275 1.275L12 21l-1.912-5.813a2 2 0 0 0-1.275-1.275L3 12l5.813-1.912a2 2 0 0 0 1.275-1.275L12 3Z\" />\n <path d=\"M5 3v4\" />\n <path d=\"M3 5h4\" />\n <path d=\"M19 17v4\" />\n <path d=\"M17 19h4\" />\n </svg>\n )}\n\n {/* Notification Badge \u2014 driven by active toast notifications */}\n {!isOpen && notifications.length > 0 && (\n <div style={{ position: 'absolute', top: -2, right: -2, pointerEvents: 'none' }}>\n {/* Layer 1: Expanding ping ring */}\n <span\n className=\"syntro-badge-ping\"\n style={{\n position: 'absolute',\n inset: 0,\n borderRadius: '9999px',\n background: `${config.colorPrimaryHover}66`,\n }}\n />\n {/* Layer 2: Glow pulse */}\n <span\n className=\"syntro-badge-glow\"\n style={{\n position: 'absolute',\n inset: -4,\n borderRadius: '9999px',\n }}\n />\n {/* Layer 3: Bouncing count badge */}\n <span\n className=\"syntro-badge-bounce\"\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '9999px',\n background: config.colorPrimaryHover,\n color: '#ffffff',\n fontSize: 11,\n fontWeight: 700,\n }}\n >\n {notifications.length > 99 ? '99+' : notifications.length}\n </span>\n </div>\n )}\n </button>\n </div>,\n portalRoot\n )}\n {createPortal(content, portalRoot)}\n </>\n );\n}\n", "import {\n blue,\n border,\n brand,\n button,\n green,\n red,\n slateGrey,\n text,\n yellow,\n} from '@syntro/design-system/tokens';\n\nimport type { CanvasThemeConfig, CanvasThemeTokens } from './types';\n\n/**\n * Apply alpha transparency to a hex color.\n * Converts a 0-1 alpha value to a 2-digit hex suffix.\n */\nexport function withAlpha(hex: string, alpha: number): string {\n return `${hex}${Math.round(alpha * 255)\n .toString(16)\n .padStart(2, '0')}`;\n}\n\n/**\n * Default dark theme using Syntro Design System tokens\n */\nexport const darkTheme: CanvasThemeTokens = {\n // Brand colors\n colorPrimary: brand[3],\n colorPrimaryHover: brand[4],\n colorPrimaryMuted: brand[0],\n\n // Surface colors (with alpha for glass/vibrancy effects)\n colorBackground: withAlpha(slateGrey[1], 0.95),\n colorBackgroundElevated: withAlpha(slateGrey[3], 0.95),\n colorBackgroundSubtle: withAlpha(slateGrey[0], 0.2),\n colorSurface: withAlpha(slateGrey[4], 0.8),\n colorSurfaceHover: withAlpha(slateGrey[5], 0.8),\n\n // Text colors\n colorText: text.primary,\n colorTextSecondary: text.secondary,\n colorTextMuted: text.tertiary,\n colorTextInverse: slateGrey[1],\n\n // Border colors\n colorBorder: border.primary,\n colorBorderSubtle: border.secondary,\n\n // Semantic colors\n colorSuccess: green[4],\n colorSuccessMuted: green[0],\n colorWarning: yellow[4],\n colorWarningMuted: yellow[0],\n colorError: red[4],\n colorErrorMuted: red[0],\n colorInfo: blue[4],\n colorInfoMuted: blue[0],\n\n // Notification badge\n colorNotification: brand[4],\n colorNotificationMuted: withAlpha(brand[4], 0.4),\n\n // Glass morphism\n glassBackground: withAlpha(slateGrey[1], 0.6),\n glassBackgroundHover: withAlpha(slateGrey[1], 0.7),\n glassBorder: 'rgba(255, 255, 255, 0.08)',\n glassBlur: 'blur(24px)',\n glassSaturate: 'saturate(1.2)',\n\n // Typography (SF Pro stack)\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto, sans-serif\",\n fontFamilyMono: \"'SF Mono', 'Fira Code', Consolas, monospace\",\n fontSizeXs: '0.7rem',\n fontSizeSm: '0.8rem',\n fontSizeMd: '0.9rem',\n fontSizeLg: '1rem',\n fontSizeXl: '1.25rem',\n fontSizeXxl: '1.5rem',\n fontWeightNormal: '400',\n fontWeightMedium: '500',\n fontWeightSemibold: '600',\n fontWeightBold: '700',\n lineHeightTight: '1.25',\n lineHeightNormal: '1.5',\n lineHeightRelaxed: '1.75',\n\n // Spacing\n spacingXs: '0.25rem',\n spacingSm: '0.5rem',\n spacingMd: '0.75rem',\n spacingLg: '1rem',\n spacingXl: '1.5rem',\n\n // Border radius\n borderRadiusSm: '6px',\n borderRadiusMd: '10px',\n borderRadiusLg: '14px',\n borderRadiusXl: '20px',\n borderRadiusFull: '9999px',\n\n // Shadows\n shadowSm: '0 1px 2px rgba(0, 0, 0, 0.2)',\n shadowMd: '0 2px 12px rgba(0, 0, 0, 0.3)',\n shadowLg: '0 8px 24px rgba(0, 0, 0, 0.4)',\n shadowXl: '0 16px 48px rgba(0, 0, 0, 0.5)',\n\n // Backdrop effects\n backdropBlur: 'blur(20px)',\n backdropSaturate: 'saturate(180%)',\n\n // Animation\n transitionFast: '0.1s ease',\n transitionNormal: '0.25s ease',\n transitionSlow: '0.4s ease',\n};\n\n/**\n * Light theme variant using Syntro Design System tokens\n */\nexport const lightTheme: CanvasThemeTokens = {\n // Brand colors\n colorPrimary: brand[3],\n colorPrimaryHover: brand[2],\n colorPrimaryMuted: withAlpha(brand[5], 0.1),\n\n // Surface colors\n colorBackground: withAlpha(slateGrey[12], 0.95),\n colorBackgroundElevated: withAlpha(slateGrey[11], 0.95),\n colorBackgroundSubtle: withAlpha(slateGrey[0], 0.02),\n colorSurface: withAlpha(slateGrey[11], 0.6),\n colorSurfaceHover: withAlpha(slateGrey[10], 0.6),\n\n // Text colors\n colorText: slateGrey[1],\n colorTextSecondary: slateGrey[6],\n colorTextMuted: slateGrey[8],\n colorTextInverse: slateGrey[12],\n\n // Border colors\n colorBorder: withAlpha(slateGrey[0], 0.12),\n colorBorderSubtle: withAlpha(slateGrey[0], 0.06),\n\n // Semantic colors\n colorSuccess: green[4],\n colorSuccessMuted: withAlpha(green[4], 0.12),\n colorWarning: yellow[4],\n colorWarningMuted: withAlpha(yellow[4], 0.12),\n colorError: red[4],\n colorErrorMuted: withAlpha(red[4], 0.12),\n colorInfo: blue[4],\n colorInfoMuted: withAlpha(blue[4], 0.12),\n\n // Notification badge\n colorNotification: brand[3],\n colorNotificationMuted: withAlpha(brand[3], 0.4),\n\n // Glass morphism\n glassBackground: withAlpha(slateGrey[12], 0.7),\n glassBackgroundHover: withAlpha(slateGrey[12], 0.8),\n glassBorder: 'rgba(0, 0, 0, 0.06)',\n glassBlur: 'blur(24px)',\n glassSaturate: 'saturate(1.2)',\n\n // Typography (same as dark)\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto, sans-serif\",\n fontFamilyMono: \"'SF Mono', 'Fira Code', Consolas, monospace\",\n fontSizeXs: '0.7rem',\n fontSizeSm: '0.8rem',\n fontSizeMd: '0.9rem',\n fontSizeLg: '1rem',\n fontSizeXl: '1.25rem',\n fontSizeXxl: '1.5rem',\n fontWeightNormal: '400',\n fontWeightMedium: '500',\n fontWeightSemibold: '600',\n fontWeightBold: '700',\n lineHeightTight: '1.25',\n lineHeightNormal: '1.5',\n lineHeightRelaxed: '1.75',\n\n // Spacing (same as dark)\n spacingXs: '0.25rem',\n spacingSm: '0.5rem',\n spacingMd: '0.75rem',\n spacingLg: '1rem',\n spacingXl: '1.5rem',\n\n // Border radius (same as dark)\n borderRadiusSm: '6px',\n borderRadiusMd: '10px',\n borderRadiusLg: '14px',\n borderRadiusXl: '20px',\n borderRadiusFull: '9999px',\n\n // Shadows (lighter for light mode)\n shadowSm: '0 1px 2px rgba(0, 0, 0, 0.08)',\n shadowMd: '0 2px 12px rgba(0, 0, 0, 0.12)',\n shadowLg: '0 8px 24px rgba(0, 0, 0, 0.16)',\n shadowXl: '0 16px 48px rgba(0, 0, 0, 0.2)',\n\n // Backdrop effects\n backdropBlur: 'blur(20px)',\n backdropSaturate: 'saturate(180%)',\n\n // Animation\n transitionFast: '0.1s ease',\n transitionNormal: '0.25s ease',\n transitionSlow: '0.4s ease',\n};\n\n/**\n * Get default theme based on mode\n */\nexport function getDefaultTheme(mode: 'light' | 'dark' = 'dark'): CanvasThemeTokens {\n return mode === 'light' ? lightTheme : darkTheme;\n}\n\n/**\n * Convert theme tokens to CSS custom properties\n */\n// ---------------------------------------------------------------------------\n// Shared utility: camelCase \u2192 kebab-case\n// ---------------------------------------------------------------------------\n\nfunction kebabCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\n/**\n * Convert theme tokens to CSS custom properties\n */\nexport function themeToCssVariables(theme: CanvasThemeTokens): Record<string, string> {\n const variables: Record<string, string> = {};\n for (const [key, value] of Object.entries(theme)) {\n variables[`--sc-${kebabCase(key)}`] = value;\n }\n return variables;\n}\n\n// ---------------------------------------------------------------------------\n// Default themes (nested by visual element)\n// ---------------------------------------------------------------------------\n\nexport const darkDefaults: Required<CanvasThemeConfig> = {\n mode: 'dark',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto, sans-serif\",\n colorPrimary: brand[3],\n colorPrimaryHover: brand[4],\n borderRadius: '12px',\n canvas: {\n position: 'right',\n layout: 'overlay',\n background: withAlpha(slateGrey[1], 0.6),\n blur: 'blur(24px)',\n border: 'none',\n width: 'clamp(380px, 25vw, 520px)',\n transitionDuration: '300ms',\n transitionEasing: 'cubic-bezier(0.16, 1, 0.3, 1)',\n transitionFade: '6%',\n },\n launcher: {\n background: button.primary.backgroundDefault,\n backgroundHover: button.primary.backgroundHover,\n color: button.primary.icon,\n size: '56px',\n shadow: `0 8px 32px ${withAlpha(slateGrey[0], 0.6)}`,\n borderRadius: '9999px',\n },\n tile: {\n background: withAlpha(slateGrey[1], 0.6),\n backgroundHover: withAlpha(slateGrey[1], 0.7),\n border: '1px solid rgba(255, 255, 255, 0.08)',\n borderRadius: '14px',\n shadow: '0 2px 12px rgba(0, 0, 0, 0.3)',\n titleColor: text.primary,\n textColor: text.secondary,\n iconBackground: `linear-gradient(135deg, ${brand[3]} 0%, ${brand[3]}cc 100%)`,\n iconShadow: `0 2px 8px ${brand[3]}40`,\n headerPadding: '0.375rem 0.75rem',\n bodyPadding: '0 0.75rem 0.5rem',\n gap: '0.25rem',\n },\n overlay: {\n background: withAlpha(slateGrey[1], 0.6),\n textColor: text.primary,\n titleColor: text.primary,\n arrowColor: withAlpha(slateGrey[1], 0.6),\n arrowSize: '8px',\n border: 'none',\n borderRadius: '0',\n scrimOpacity: '0',\n highlightRing: `2px solid ${brand[3]}`,\n },\n notification: {\n background: withAlpha(slateGrey[0], 0.95),\n textColor: text.primary,\n textSecondaryColor: text.secondary,\n border: `1px solid ${slateGrey[5]}`,\n borderRadius: '12px',\n successColor: green[4],\n warningColor: yellow[4],\n errorColor: red[4],\n iconBackground: withAlpha(brand[3], 0.15),\n progressGradient: `linear-gradient(90deg, ${brand[3]}, ${brand[4]})`,\n },\n content: {\n background: withAlpha(slateGrey[3], 0.8),\n backgroundHover: withAlpha(slateGrey[5], 0.6),\n border: `1px solid ${withAlpha(slateGrey[5], 0.5)}`,\n borderRadius: '8px',\n textColor: text.primary,\n textSecondaryColor: text.secondary,\n itemDivider: 'none',\n itemGap: '6px',\n itemPadding: '12px 16px',\n itemFontSize: '15px',\n bodyPadding: '0 16px 12px 16px',\n bodyFontSize: '14px',\n categoryPadding: '8px 4px 4px 4px',\n categoryGap: '4px',\n categoryFontSize: '12px',\n searchBackground: withAlpha(slateGrey[3], 0.8),\n searchColor: text.primary,\n chevronColor: 'currentColor',\n },\n};\n\nexport const lightDefaults: Required<CanvasThemeConfig> = {\n mode: 'light',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto, sans-serif\",\n colorPrimary: brand[3],\n colorPrimaryHover: brand[2],\n borderRadius: '12px',\n canvas: {\n position: 'right',\n layout: 'overlay',\n background: withAlpha(slateGrey[12], 0.7),\n blur: 'blur(24px)',\n border: 'none',\n width: 'clamp(380px, 25vw, 520px)',\n transitionDuration: '300ms',\n transitionEasing: 'cubic-bezier(0.16, 1, 0.3, 1)',\n transitionFade: '6%',\n },\n launcher: {\n background: brand[3],\n backgroundHover: brand[2],\n color: '#ffffff',\n size: '56px',\n shadow: '0 8px 32px rgba(0, 0, 0, 0.15)',\n borderRadius: '9999px',\n },\n tile: {\n background: withAlpha(slateGrey[12], 0.7),\n backgroundHover: withAlpha(slateGrey[12], 0.8),\n border: '1px solid rgba(0, 0, 0, 0.06)',\n borderRadius: '14px',\n shadow: '0 2px 12px rgba(0, 0, 0, 0.12)',\n titleColor: slateGrey[1],\n textColor: slateGrey[6],\n iconBackground: `linear-gradient(135deg, ${brand[3]} 0%, ${brand[3]}cc 100%)`,\n iconShadow: `0 2px 8px ${brand[3]}40`,\n headerPadding: '0.375rem 0.75rem',\n bodyPadding: '0 0.75rem 0.5rem',\n gap: '0.25rem',\n },\n overlay: {\n background: withAlpha(slateGrey[12], 0.7),\n textColor: slateGrey[1],\n titleColor: slateGrey[1],\n arrowColor: withAlpha(slateGrey[12], 0.7),\n arrowSize: '8px',\n border: 'none',\n borderRadius: '0',\n scrimOpacity: '0',\n highlightRing: `2px solid ${brand[3]}`,\n },\n notification: {\n background: withAlpha(slateGrey[12], 0.95),\n textColor: slateGrey[1],\n textSecondaryColor: slateGrey[6],\n border: `1px solid ${withAlpha(slateGrey[0], 0.12)}`,\n borderRadius: '12px',\n successColor: green[4],\n warningColor: yellow[4],\n errorColor: red[4],\n iconBackground: withAlpha(brand[3], 0.1),\n progressGradient: `linear-gradient(90deg, ${brand[3]}, ${brand[2]})`,\n },\n content: {\n background: withAlpha(slateGrey[12], 0.8),\n backgroundHover: withAlpha(slateGrey[11], 0.6),\n border: `1px solid ${slateGrey[11]}`,\n borderRadius: '8px',\n textColor: slateGrey[1],\n textSecondaryColor: slateGrey[6],\n itemDivider: 'none',\n itemGap: '6px',\n itemPadding: '12px 16px',\n itemFontSize: '15px',\n bodyPadding: '0 16px 12px 16px',\n bodyFontSize: '14px',\n categoryPadding: '8px 4px 4px 4px',\n categoryGap: '4px',\n categoryFontSize: '12px',\n searchBackground: slateGrey[12],\n searchColor: slateGrey[1],\n chevronColor: 'currentColor',\n },\n};\n\n// ---------------------------------------------------------------------------\n// Merge: deep-merge customer config on top of defaults\n// ---------------------------------------------------------------------------\n\nexport function mergeThemeConfig(customer: CanvasThemeConfig): Required<CanvasThemeConfig> {\n const base = customer.mode === 'light' ? lightDefaults : darkDefaults;\n return {\n mode: customer.mode ?? base.mode,\n fontFamily: customer.fontFamily ?? base.fontFamily,\n colorPrimary: customer.colorPrimary ?? base.colorPrimary,\n colorPrimaryHover: customer.colorPrimaryHover ?? base.colorPrimaryHover,\n borderRadius: customer.borderRadius ?? base.borderRadius,\n canvas: { ...base.canvas, ...customer.canvas },\n launcher: { ...base.launcher, ...customer.launcher },\n tile: { ...base.tile, ...customer.tile },\n overlay: { ...base.overlay, ...customer.overlay },\n notification: { ...base.notification, ...customer.notification },\n content: { ...base.content, ...customer.content },\n };\n}\n\n// ---------------------------------------------------------------------------\n// 3-layer merge: defaults \u2192 workspace theme \u2192 config theme\n// ---------------------------------------------------------------------------\n\nexport function mergeThemeWithWorkspace(\n workspaceTheme: CanvasThemeConfig,\n configTheme: CanvasThemeConfig\n): Required<CanvasThemeConfig> {\n const mode = configTheme.mode ?? workspaceTheme.mode ?? 'dark';\n const base = mode === 'light' ? lightDefaults : darkDefaults;\n return {\n mode,\n fontFamily: configTheme.fontFamily ?? workspaceTheme.fontFamily ?? base.fontFamily,\n colorPrimary: configTheme.colorPrimary ?? workspaceTheme.colorPrimary ?? base.colorPrimary,\n colorPrimaryHover:\n configTheme.colorPrimaryHover ?? workspaceTheme.colorPrimaryHover ?? base.colorPrimaryHover,\n borderRadius: configTheme.borderRadius ?? workspaceTheme.borderRadius ?? base.borderRadius,\n canvas: { ...base.canvas, ...workspaceTheme.canvas, ...configTheme.canvas },\n launcher: { ...base.launcher, ...workspaceTheme.launcher, ...configTheme.launcher },\n tile: { ...base.tile, ...workspaceTheme.tile, ...configTheme.tile },\n overlay: { ...base.overlay, ...workspaceTheme.overlay, ...configTheme.overlay },\n notification: {\n ...base.notification,\n ...workspaceTheme.notification,\n ...configTheme.notification,\n },\n content: { ...base.content, ...workspaceTheme.content, ...configTheme.content },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Flatten: nested config -> --sc-{element}-{property} CSS variables\n// ---------------------------------------------------------------------------\n\nconst ELEMENT_SECTIONS = [\n 'canvas',\n 'launcher',\n 'tile',\n 'overlay',\n 'notification',\n 'content',\n] as const;\n\nexport function flattenThemeConfig(config: Required<CanvasThemeConfig>): Record<string, string> {\n const vars: Record<string, string> = {};\n if (config.fontFamily) vars['--sc-font-family'] = config.fontFamily;\n if (config.colorPrimary) vars['--sc-color-primary'] = config.colorPrimary;\n if (config.colorPrimaryHover) vars['--sc-color-primary-hover'] = config.colorPrimaryHover;\n if (config.borderRadius) vars['--sc-border-radius'] = config.borderRadius;\n for (const section of ELEMENT_SECTIONS) {\n const sectionConfig = config[section];\n if (!sectionConfig) continue;\n for (const [key, value] of Object.entries(sectionConfig)) {\n if (value !== undefined) {\n vars[`--sc-${section}-${kebabCase(key)}`] = value;\n }\n }\n }\n return vars;\n}\n", "import { createContext, type ReactNode, useContext, useEffect, useMemo } from 'react';\n\nimport { flattenThemeConfig, mergeThemeConfig, mergeThemeWithWorkspace } from './defaultTheme';\nimport type { CanvasThemeConfig } from './types';\n\ninterface ThemeContextValue {\n config: Required<CanvasThemeConfig>;\n mode: 'light' | 'dark';\n cssVariables: Record<string, string>;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface ThemeProviderProps {\n children: ReactNode;\n /** Customer theme overrides (nested by visual element) */\n themeConfig?: CanvasThemeConfig;\n /** Workspace-level theme (applied between defaults and config overrides) */\n workspaceTheme?: CanvasThemeConfig;\n shadowRoot?: ShadowRoot | null;\n}\n\n/**\n * Theme provider: config \u2192 merge with defaults \u2192 flatten to CSS vars \u2192 inject into shadow root.\n * When workspaceTheme is provided, uses 3-layer merge: defaults \u2192 workspace \u2192 config.\n * No auto-detection. Fully deterministic.\n */\nexport function ThemeProvider({\n children,\n themeConfig,\n workspaceTheme,\n shadowRoot,\n}: ThemeProviderProps) {\n // Merge customer config with defaults (optionally via workspace layer)\n const merged = useMemo(\n () =>\n workspaceTheme\n ? mergeThemeWithWorkspace(workspaceTheme, themeConfig ?? {})\n : mergeThemeConfig(themeConfig ?? {}),\n [themeConfig, workspaceTheme]\n );\n\n // Flatten to CSS variables\n const cssVariables = useMemo(() => flattenThemeConfig(merged), [merged]);\n\n // Inject CSS variables into shadow root\n useEffect(() => {\n if (!shadowRoot) return;\n\n let styleEl = shadowRoot.querySelector<HTMLStyleElement>('#sc-theme-vars');\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = 'sc-theme-vars';\n shadowRoot.insertBefore(styleEl, shadowRoot.firstChild);\n }\n\n const cssRules = Object.entries(cssVariables)\n .map(([key, value]) => ` ${key}: ${value};`)\n .join('\\n');\n\n styleEl.textContent = `:host {\\n${cssRules}\\n}`;\n }, [shadowRoot, cssVariables]);\n\n const value: ThemeContextValue = {\n config: merged,\n mode: merged.mode,\n cssVariables,\n };\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\n/**\n * Hook to access theme context\n */\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}\n", "import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { ExperimentClient } from '../experiments/types';\nimport { debug } from '../logger';\nimport type { SmartCanvasRuntime } from '../runtime';\nimport type {\n ActionStep,\n CanvasConfigFetcher,\n CanvasConfigResponse,\n CanvasThemeConfig,\n LauncherConfig,\n TileConfig,\n} from '../types';\n\nexport interface UseShadowCanvasConfigOptions {\n fetcher: CanvasConfigFetcher;\n /** @deprecated Use runtime instead */\n experiments?: ExperimentClient;\n /** v2 Runtime for activation-based filtering */\n runtime?: SmartCanvasRuntime;\n /** Current page URL \u2014 triggers re-filter when URL changes (route-based activation).\n * Full URL (not just pathname) so hash-based routing also triggers re-filter. */\n pageUrl?: string;\n /** Polling interval in milliseconds. Set to 0 or omit to disable polling. */\n pollIntervalMs?: number;\n}\n\nexport interface ShadowCanvasConfigState {\n tiles: TileConfig[];\n isLoading: boolean;\n error?: string;\n fetchedAt?: string;\n canvasTitle?: string;\n configVersion?: string;\n /** Actions to execute (tooltips, highlights, DOM changes, etc.) */\n actions: ActionStep[];\n displayMode?: 'standard' | 'focused';\n /** Theme configuration from the canvas config (workspace settings) */\n theme?: CanvasThemeConfig;\n /** Launcher button configuration */\n launcher?: LauncherConfig;\n}\n\nconst sortTiles = (tiles: TileConfig[]) =>\n [...tiles].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n\nexport function useShadowCanvasConfig({\n fetcher,\n experiments,\n runtime,\n pageUrl,\n pollIntervalMs,\n}: UseShadowCanvasConfigOptions): ShadowCanvasConfigState {\n const [state, setState] = useState<ShadowCanvasConfigState>({\n tiles: [],\n actions: [],\n isLoading: true,\n });\n\n // Track serialized actions to stabilize the reference across fetches.\n // SmartCanvasApp's useEffect depends on configState.actions \u2014 if the reference\n // changes, it reverts and re-applies all overlays, causing dismissed overlays\n // to reappear. By keeping the same array when content hasn't changed, we\n // prevent unnecessary revert-and-reapply cycles. (BUG-1772396380)\n const prevActionsJsonRef = useRef<string>('[]');\n\n // Cache the last fetched config for reactive re-filtering (onlyIfPopulated).\n // When accumulator or context changes, we re-filter tiles without re-fetching.\n const rawConfigRef = useRef<CanvasConfigResponse | null>(null);\n\n const refilter = useCallback(async () => {\n const raw = rawConfigRef.current;\n if (!raw || !runtime) return;\n let tiles: TileConfig[] = raw.tiles || [];\n tiles = await runtime.filterTiles(tiles);\n if (experiments) {\n tiles = tiles.filter((tile) => experiments.shouldRenderRectangle(tile));\n }\n setState((prev) => ({ ...prev, tiles: sortTiles(tiles) }));\n }, [runtime, experiments]);\n\n const load = useCallback(async () => {\n try {\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n const response = await fetcher();\n debug('SmartCanvas Config', 'Raw config response', response);\n rawConfigRef.current = response;\n let tiles: TileConfig[] = response.tiles || [];\n\n // Filter tiles based on activation config (v2) or experiments (v1)\n if (runtime) {\n tiles = await runtime.filterTiles(tiles);\n if (experiments) {\n tiles = tiles.filter((tile) => experiments.shouldRenderRectangle(tile));\n }\n } else if (experiments) {\n tiles = tiles.filter((tile) => experiments.shouldRenderRectangle(tile));\n }\n\n debug('SmartCanvas Config', `Tile count after filtering: ${tiles.length}`);\n\n const newActions = response.actions || [];\n const newActionsJson = JSON.stringify(newActions);\n const actionsChanged = newActionsJson !== prevActionsJsonRef.current;\n if (actionsChanged) {\n prevActionsJsonRef.current = newActionsJson;\n }\n\n setState((prev) => ({\n tiles: sortTiles(tiles),\n actions: actionsChanged ? newActions : prev.actions,\n isLoading: false,\n fetchedAt: response.fetchedAt,\n canvasTitle: response.canvasTitle,\n configVersion: response.configVersion,\n theme: response.theme,\n launcher: response.launcher,\n }));\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n console.error('[SmartCanvas Config] Failed to fetch/filter config:', message, err);\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: message,\n }));\n }\n }, [experiments, fetcher, runtime]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: pageUrl triggers re-filter for route-based activation (filterTiles reads current URL internally)\n useEffect(() => {\n load();\n\n // Subscribe to experiment provider for event-driven config updates.\n if (experiments?.onFeaturesChanged) {\n return experiments.onFeaturesChanged(() => load());\n }\n }, [load, experiments, pageUrl]);\n\n // Re-filter tiles when accumulator fires (event_count conditions change).\n // Only fires when a registered counter changes, so reasonably scoped.\n useEffect(() => {\n if (!runtime?.accumulator) return;\n return runtime.accumulator.subscribe(() => {\n refilter();\n });\n }, [runtime, refilter]);\n\n // Re-filter tiles when context changes (session_metric conditions).\n useEffect(() => {\n if (!runtime?.context) return;\n return runtime.context.subscribe(() => {\n refilter();\n });\n }, [runtime, refilter]);\n\n // Polling: re-fetch at the specified interval\n useEffect(() => {\n if (!pollIntervalMs) return;\n const id = setInterval(() => {\n load();\n }, pollIntervalMs);\n return () => clearInterval(id);\n }, [load, pollIntervalMs]);\n\n return useMemo(() => state, [state]);\n}\n", "import { type ReactNode, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { BatchActionHandle } from './actions/types';\nimport { ShadowCanvasOverlay } from './components/ShadowCanvasOverlay';\nimport { createCanvasConfigFetcher } from './configFetcher';\nimport type { SmartCanvasController } from './controller';\nimport type { ExperimentClient } from './experiments/types';\nimport { useShadowCanvasConfig } from './hooks/useShadowCanvasConfig';\nimport { RuntimeProvider, usePageContext } from './RuntimeProvider';\nimport type { SmartCanvasRuntime } from './runtime';\nimport { useShadowRoot } from './ShadowRootContext';\nimport type { TelemetryClient } from './telemetry/types';\nimport type { CanvasThemeConfig } from './theme';\nimport { ThemeProvider } from './theme';\nimport type { CanvasConfigFetcher } from './types';\n\nexport interface SmartCanvasAppProps {\n controller: SmartCanvasController;\n fetcher?: CanvasConfigFetcher;\n configUri?: string;\n configUriFeatureKey?: string;\n configFeatureKey?: string; // New: for direct config objects\n fetchCredentials?: RequestCredentials;\n /** @deprecated No longer used \u2014 config updates are event-driven via ExperimentClient.onFeaturesChanged */\n pollIntervalMs?: number;\n experiments?: ExperimentClient;\n telemetry?: TelemetryClient;\n /** v2 Runtime instance for context, events, state, and decisions */\n runtime?: SmartCanvasRuntime;\n /** @deprecated Actions replace overlay recipes. Use config.actions instead. */\n overlayFetcher?: () => Promise<unknown>;\n /** @deprecated Actions replace overlay recipes. Use config.actions instead. */\n overlayConfigUri?: string;\n /** @deprecated Actions replace overlay recipes. Use config.actions instead. */\n overlayConfigFeatureKey?: string;\n /** @deprecated Actions replace overlay recipes. Use config.actions instead. */\n overlayFetchCredentials?: RequestCredentials;\n footerSlot?: ReactNode;\n launcherLabel?: string;\n canvasHost?: HTMLElement | null;\n /** Batch handle from eager action application in createSmartCanvas(). Prevents double-apply. */\n initialBatchHandle?: BatchActionHandle | null;\n /** Workspace-level theme for 3-layer inheritance (defaults \u2192 workspace \u2192 config) */\n workspaceTheme?: CanvasThemeConfig;\n}\n\nexport function SmartCanvasApp({\n controller,\n fetcher,\n configUri,\n configUriFeatureKey = 'smart-canvas-config-uri',\n configFeatureKey = 'smart-canvas-config',\n fetchCredentials = 'include',\n pollIntervalMs,\n experiments,\n telemetry,\n runtime,\n overlayFetcher,\n overlayConfigUri,\n overlayConfigFeatureKey = 'smart-canvas-overlay-uri',\n overlayFetchCredentials = 'include',\n footerSlot,\n launcherLabel,\n canvasHost,\n initialBatchHandle,\n workspaceTheme,\n}: SmartCanvasAppProps) {\n // Wrap the app with RuntimeProvider if runtime is available\n if (runtime) {\n return (\n <RuntimeProvider runtime={runtime}>\n <SmartCanvasAppInner\n controller={controller}\n fetcher={fetcher}\n configUri={configUri}\n configUriFeatureKey={configUriFeatureKey}\n configFeatureKey={configFeatureKey}\n fetchCredentials={fetchCredentials}\n pollIntervalMs={pollIntervalMs}\n experiments={experiments}\n telemetry={telemetry}\n runtime={runtime}\n overlayFetcher={overlayFetcher}\n overlayConfigUri={overlayConfigUri}\n overlayConfigFeatureKey={overlayConfigFeatureKey}\n overlayFetchCredentials={overlayFetchCredentials}\n footerSlot={footerSlot}\n launcherLabel={launcherLabel}\n canvasHost={canvasHost}\n initialBatchHandle={initialBatchHandle}\n workspaceTheme={workspaceTheme}\n />\n </RuntimeProvider>\n );\n }\n\n // No runtime - render directly (legacy mode)\n return (\n <SmartCanvasAppInner\n controller={controller}\n fetcher={fetcher}\n configUri={configUri}\n configUriFeatureKey={configUriFeatureKey}\n configFeatureKey={configFeatureKey}\n fetchCredentials={fetchCredentials}\n pollIntervalMs={pollIntervalMs}\n experiments={experiments}\n telemetry={telemetry}\n overlayFetcher={overlayFetcher}\n overlayConfigUri={overlayConfigUri}\n overlayConfigFeatureKey={overlayConfigFeatureKey}\n overlayFetchCredentials={overlayFetchCredentials}\n footerSlot={footerSlot}\n launcherLabel={launcherLabel}\n canvasHost={canvasHost}\n initialBatchHandle={initialBatchHandle}\n workspaceTheme={workspaceTheme}\n />\n );\n}\n\n/**\n * Inner component that handles the actual rendering logic.\n * Separated to allow RuntimeProvider to wrap it when runtime is available.\n */\nfunction SmartCanvasAppInner({\n controller,\n fetcher,\n configUri,\n configUriFeatureKey = 'smart-canvas-config-uri',\n configFeatureKey = 'smart-canvas-config',\n fetchCredentials = 'include',\n pollIntervalMs,\n experiments,\n telemetry,\n runtime,\n overlayFetcher: _overlayFetcher,\n overlayConfigUri: _overlayConfigUri,\n overlayConfigFeatureKey: _overlayConfigFeatureKey = 'smart-canvas-overlay-uri',\n overlayFetchCredentials: _overlayFetchCredentials = 'include',\n footerSlot,\n launcherLabel,\n canvasHost: _canvasHost,\n initialBatchHandle,\n workspaceTheme,\n}: SmartCanvasAppProps) {\n const [open, setOpen] = useState(controller.getState().open);\n\n // Use runtime context for page URL if available, otherwise track locally.\n // We track the full URL (not just pathname) so hash-based routing\n // (e.g. HashRouter: /#/income \u2192 /#/deductions) also triggers re-application.\n const pageContext = usePageContext();\n const [localUrl, setLocalUrl] = useState(() =>\n typeof window !== 'undefined' ? window.location.href : '/'\n );\n\n // If runtime is available, use its context (ContextManager tracks location.href).\n // Otherwise, track locally (legacy mode).\n const pageUrl = pageContext?.url ?? localUrl;\n\n // Track route changes locally only when runtime is not available (legacy mode)\n useEffect(() => {\n if (runtime) return; // Runtime handles this via ContextManager\n if (typeof window === 'undefined') return;\n\n const updateUrl = () => setLocalUrl(window.location.href);\n\n // Listen for popstate (back/forward navigation) and hashchange\n window.addEventListener('popstate', updateUrl);\n window.addEventListener('hashchange', updateUrl);\n\n // Intercept pushState/replaceState for SPA navigation\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function (...args) {\n originalPushState.apply(this, args);\n queueMicrotask(updateUrl);\n };\n\n history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n queueMicrotask(updateUrl);\n };\n\n return () => {\n window.removeEventListener('popstate', updateUrl);\n window.removeEventListener('hashchange', updateUrl);\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n };\n }, [runtime]);\n\n const derivedFetcher = useMemo(() => {\n if (fetcher) return fetcher;\n return createCanvasConfigFetcher({\n configUri,\n experiments,\n featureKey: configUriFeatureKey,\n configFeatureKey,\n credentials: fetchCredentials,\n });\n }, [fetcher, configUri, experiments, configUriFeatureKey, configFeatureKey, fetchCredentials]);\n\n const configState = useShadowCanvasConfig({\n fetcher: derivedFetcher,\n experiments,\n runtime,\n pageUrl,\n });\n const hasContent = configState.tiles.length > 0 && !configState.error;\n\n useEffect(() => controller.subscribe((state) => setOpen(state.open)), [controller]);\n\n useEffect(() => {\n if (!configState.isLoading && !hasContent && controller.getState().open) {\n controller.setOpen(false);\n }\n }, [controller, hasContent, configState.isLoading]);\n\n // Apply actions when config loads, revert previous batch when actions change.\n // Without revert-then-reapply, removing an action (e.g., the editor's\n // Before/After toggle) has no visible effect because old actions stay applied.\n //\n // initialBatchHandle: adopted from createSmartCanvas()'s eager apply to\n // prevent duplicate overlays. On the first run, if a handle exists, we\n // skip re-applying and just adopt it.\n const batchHandleRef = useRef<BatchActionHandle | null>(initialBatchHandle ?? null);\n const adoptedInitialRef = useRef(!!initialBatchHandle);\n // Version counter prevents concurrent run() calls from racing.\n // Each useEffect invocation increments the version; stale closures bail out.\n const runVersionRef = useRef(0);\n\n useEffect(() => {\n if (!runtime?.actions) return;\n\n // Skip re-applying when we've adopted the eager batch handle from\n // createSmartCanvas(). Two runs need skipping:\n // 1. Initial render (configState.actions = []) \u2014 still loading\n // 2. First fetch arrives (configState.actions = same as eagerly applied)\n // Without skipping #2 the tooltip's 200ms fade-out from revertAll() overlaps\n // with the freshly applied tooltip, causing duplicate overlays.\n if (adoptedInitialRef.current) {\n if (configState.actions.length > 0) {\n // First real actions arrived \u2014 same as the eagerly applied ones.\n // Clear the flag so future config changes are handled normally.\n adoptedInitialRef.current = false;\n }\n return;\n }\n\n const version = ++runVersionRef.current;\n const stale = () => version !== runVersionRef.current;\n\n const run = async () => {\n // Revert the previous batch before applying the new one\n if (batchHandleRef.current) {\n try {\n await batchHandleRef.current.revertAll();\n } catch (err) {\n console.error('[SmartCanvasApp] Failed to revert actions:', err);\n }\n batchHandleRef.current = null;\n }\n\n if (stale()) return;\n\n // Apply the new batch (if non-empty)\n // Note: After SPA navigation, executors use waitForAnchor() to wait for\n // their specific anchors to appear, replacing the old blanket waitForDomSettle() hack.\n if (configState.actions.length > 0) {\n try {\n const handle = await runtime.actions.applyBatch(configState.actions);\n if (stale()) {\n // A newer run started while we were applying \u2014 revert immediately\n await handle.revertAll();\n } else {\n batchHandleRef.current = handle;\n }\n } catch (err) {\n if (!stale()) {\n console.error('[SmartCanvasApp] Failed to apply actions:', err);\n }\n }\n }\n };\n\n run();\n\n return () => {\n // Synchronous cleanup: revert current batch when actions change or unmount.\n // The version counter already ensures any in-flight run() will bail out,\n // but we still need to revert the current batch's DOM side-effects.\n if (batchHandleRef.current) {\n batchHandleRef.current.revertAll().catch((err) => {\n console.error('[SmartCanvasApp] Failed to revert actions on cleanup:', err);\n });\n batchHandleRef.current = null;\n }\n };\n // pageUrl is included so that after SPA navigation (host page swaps\n // the DOM), we revert stale overlay handles and re-apply the same\n // actions against the new anchors. The config hasn't changed \u2014 the\n // DOM under us has. We use the full URL (not just pathname) so that\n // hash-based routing (HashRouter) also triggers re-application.\n // biome-ignore lint/correctness/useExhaustiveDependencies: pageUrl drives DOM-change re-application, not a missing dep\n }, [runtime, configState.actions, pageUrl]);\n\n // Allow adaptives to programmatically open the canvas via EventBus\n useEffect(() => {\n if (!runtime) return;\n return runtime.events.subscribe({ names: ['canvas.requestOpen'] }, () =>\n controller.setOpen(true)\n );\n }, [runtime, controller]);\n\n // NOTE: This must be called BEFORE any early returns to maintain consistent hook order\n const { shadowRoot } = useShadowRoot();\n const themeConfig = configState.theme;\n\n // Always render ThemeProvider so CSS vars are injected into the shadow root\n // even for actions-only configs (no tiles). Without this, the component would\n // return null and unmount ThemeProvider, leaving stale default CSS vars.\n return (\n <ThemeProvider\n themeConfig={themeConfig}\n workspaceTheme={workspaceTheme}\n shadowRoot={shadowRoot}\n >\n {!configState.isLoading && !hasContent ? null : (\n <ShadowCanvasOverlay\n tiles={configState.tiles}\n isLoading={configState.isLoading}\n error={configState.error}\n canvasTitle={configState.canvasTitle}\n telemetry={telemetry}\n launcherLabel={launcherLabel ?? configState.launcher?.label}\n launcherIcon={configState.launcher?.icon}\n launcherAnimate={configState.launcher?.animate}\n launcherAnimationStyle={configState.launcher?.animationStyle}\n notificationCount={configState.launcher?.notificationCount ?? configState.tiles.length}\n footerSlot={footerSlot}\n isOpen={open}\n onToggle={() => controller.toggle()}\n displayMode={configState.displayMode}\n />\n )}\n </ThemeProvider>\n );\n}\n", "import { createRoot, type Root } from 'react-dom/client';\n\nimport { createSmartCanvasController, type SmartCanvasController } from './controller';\nimport { ShadowRootProvider } from './ShadowRootContext';\nimport { SmartCanvasApp, type SmartCanvasAppProps } from './SmartCanvasApp';\n\nconst TAG_NAME = 'smart-canvas';\nconst BASE_CSS = `\n:host {\n font: inherit;\n color: inherit;\n position: relative;\n contain: style;\n z-index: 2147483647;\n}\n:host([hidden]) {\n display: none;\n}\n*, *::before, *::after {\n box-sizing: border-box;\n}\n`;\n\nexport class SmartCanvasElement extends HTMLElement {\n #shadow: ShadowRoot;\n #mount: HTMLDivElement;\n #portalRoot: HTMLDivElement;\n #overlayContainer: HTMLDivElement;\n #controller: SmartCanvasController;\n #root: Root | null = null;\n #lastAppProps: Omit<SmartCanvasAppProps, 'controller'> | null = null;\n\n constructor() {\n super();\n this.#shadow = this.attachShadow({ mode: 'open', delegatesFocus: true });\n\n this.#mount = document.createElement('div');\n this.#mount.setAttribute('part', 'mount');\n this.#shadow.appendChild(this.#mount);\n\n // Portal root: React createPortal targets (launcher FAB, drawer, toasts)\n this.#portalRoot = document.createElement('div');\n this.#portalRoot.id = 'portalRoot';\n this.#shadow.appendChild(this.#portalRoot);\n\n // Overlay container: vanilla JS overlays (tooltips, modals, spotlights)\n this.#overlayContainer = document.createElement('div');\n this.#overlayContainer.id = 'overlayContainer';\n Object.assign(this.#overlayContainer.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483645',\n pointerEvents: 'none',\n });\n this.#shadow.appendChild(this.#overlayContainer);\n\n this.#controller = createSmartCanvasController();\n this.applyBaseStyles();\n }\n\n connectedCallback() {\n this.style.setProperty('font-family', 'inherit');\n }\n\n disconnectedCallback() {\n this.#root?.unmount();\n this.#root = null;\n }\n\n getMountNode() {\n return this.#mount;\n }\n\n getController() {\n return this.#controller;\n }\n\n /** React portal target inside shadow root (launcher, drawer, toasts) */\n getPortalRoot() {\n return this.#portalRoot;\n }\n\n /** Vanilla JS overlay container inside shadow root (tooltips, modals, spotlights) */\n getOverlayContainer() {\n return this.#overlayContainer;\n }\n\n /** Direct access to the shadow root (for style injection) */\n getShadowRoot() {\n return this.#shadow;\n }\n\n open() {\n this.#controller.setOpen(true);\n }\n\n close() {\n this.#controller.setOpen(false);\n }\n\n toggle() {\n this.#controller.toggle();\n }\n\n setOverrideFetcher(fetcher: any) {\n if (this.#lastAppProps) {\n this.#lastAppProps = { ...this.#lastAppProps, fetcher };\n this.render();\n }\n }\n\n /**\n * Used by standalone create() helper to bootstrap React into the shadow.\n */\n mountReactApp(appProps: Omit<SmartCanvasAppProps, 'controller'>) {\n this.#lastAppProps = appProps;\n this.render();\n }\n\n private render() {\n if (!this.isConnected || !this.#lastAppProps) return;\n if (!this.#root) {\n this.#root = createRoot(this.#mount);\n }\n this.#root.render(\n <ShadowRootProvider\n shadowRoot={this.#shadow}\n portalRoot={this.#portalRoot}\n overlayContainer={this.#overlayContainer}\n >\n <SmartCanvasApp {...this.#lastAppProps} controller={this.#controller} canvasHost={this} />\n </ShadowRootProvider>\n );\n }\n\n private applyBaseStyles() {\n if ((this.#shadow as any).adoptedStyleSheets !== undefined) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(BASE_CSS);\n (this.#shadow as any).adoptedStyleSheets = [sheet];\n } else {\n const style = document.createElement('style');\n style.textContent = BASE_CSS;\n this.#shadow.appendChild(style);\n }\n }\n}\n\nexport const registerSmartCanvasElement = () => {\n if (typeof window === 'undefined') return;\n if (!customElements.get(TAG_NAME)) {\n customElements.define(TAG_NAME, SmartCanvasElement);\n }\n};\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'smart-canvas': SmartCanvasElement;\n }\n}\n", "import { debug, warn } from './logger';\n\n/**\n * Allowed hosts for loading the editor SDK.\n * Only scripts from these hosts will be loaded.\n */\nconst ALLOWED_EDITOR_HOSTS = [\n 'cdn.syntrologie.com',\n 'api.syntrologie.com',\n 'dev-api.syntrologie.com',\n 'localhost',\n '127.0.0.1',\n // Allow any .syntrologie.com subdomain for dev/staging\n '.syntrologie.com',\n];\n\n// =============================================================================\n// Encoded URL params: editor_source & editor_conf\n//\n// Two opaque base64url-encoded JSON params:\n// editor_source = { api_base, token } \u2014 what runtime needs to load editor\n// editor_conf = { mode, audit_session_id } \u2014 what editor needs after load\n// =============================================================================\n\n/** Decoded editor_source payload (needed by runtime to load editor SDK). */\nexport interface EditorSource {\n api_base?: string;\n token: string;\n}\n\n/** Decoded editor_conf payload (passed through to editor SDK). */\nexport interface EditorConf {\n mode: string;\n audit_session_id?: string;\n [key: string]: unknown;\n}\n\n/**\n * Decode a base64url-encoded JSON param from the URL.\n * Returns null if param missing or malformed.\n */\nfunction decodeParam<T>(paramName: string): T | null {\n if (typeof window === 'undefined') return null;\n const params = new URLSearchParams(window.location.search);\n const raw = params.get(paramName);\n if (!raw) return null;\n try {\n const b64 = raw.replace(/-/g, '+').replace(/_/g, '/');\n return JSON.parse(atob(b64)) as T;\n } catch (e) {\n warn('Syntro Runtime', `Failed to decode ${paramName}:`, e);\n return null;\n }\n}\n\n// Cache states: undefined = never evaluated, null = evaluated but not found,\n// object = found and cached. Null results are NOT cached \u2014 the next call will\n// re-evaluate, allowing late-arriving URL params (e.g. replaceState after\n// redirect) to be picked up. Once a non-null result is found, it IS cached\n// permanently (params don't change during a page session).\nlet _cachedSource: EditorSource | null | undefined;\nlet _cachedConf: EditorConf | null | undefined;\n\n/**\n * Reset the editor params cache, forcing re-evaluation on next access.\n * Called by the Chrome extension after restoring URL params via replaceState,\n * or in tests to simulate fresh state without module reloading.\n */\nexport function resetEditorParamsCache(): void {\n _cachedSource = undefined;\n _cachedConf = undefined;\n}\n\n/** Get decoded editor_source from URL or global (re-evaluates on null). */\nexport function getEditorSource(): EditorSource | null {\n // Re-evaluate if never checked OR if previous result was null (params may\n // have appeared via replaceState since last call).\n if (_cachedSource === undefined || _cachedSource === null) {\n // Check global variable first (set by Chrome extension)\n const globalParams =\n typeof window !== 'undefined' ? (window as any).__SYNTRO_EDITOR_PARAMS__ : null;\n if (globalParams?.token) {\n _cachedSource = { token: globalParams.token, api_base: globalParams.apiBase || '' };\n console.log(\n `[DIAG] getEditorSource: from __SYNTRO_EDITOR_PARAMS__ (token=${_cachedSource.token.slice(0, 15)}...)`\n );\n } else {\n const decoded = decodeParam<EditorSource>('editor_source');\n if (decoded) {\n _cachedSource = decoded;\n }\n console.log(\n `[DIAG] getEditorSource: from URL param \u2192 ${decoded ? `token=${decoded.token?.slice(0, 15)}...` : 'NULL'}`\n );\n if (!decoded && typeof window !== 'undefined') {\n console.log(`[DIAG] getEditorSource: URL search = ${window.location.search.slice(0, 200)}`);\n }\n }\n }\n return _cachedSource ?? null;\n}\n\n/** Get decoded editor_conf from URL or global (re-evaluates on null). */\nexport function getEditorConf(): EditorConf | null {\n // Re-evaluate if never checked OR if previous result was null\n if (_cachedConf === undefined || _cachedConf === null) {\n // Check global variable first (set by Chrome extension)\n const globalParams =\n typeof window !== 'undefined' ? (window as any).__SYNTRO_EDITOR_PARAMS__ : null;\n if (globalParams?.mode) {\n // biome-ignore lint: intentional field mapping from camelCase global to snake_case conf\n _cachedConf = {\n mode: globalParams.mode,\n audit_session_id: globalParams.auditSessionId,\n syntro_token: globalParams.syntroToken,\n workspace_id: globalParams.workspaceId,\n };\n console.log(`[DIAG] getEditorConf: from __SYNTRO_EDITOR_PARAMS__ (mode=${_cachedConf.mode})`);\n } else {\n const decoded = decodeParam<EditorConf>('editor_conf');\n if (decoded) {\n _cachedConf = decoded;\n }\n console.log(\n `[DIAG] getEditorConf: from URL param \u2192 ${decoded ? `mode=${decoded.mode}` : 'NULL'}`\n );\n }\n }\n return _cachedConf ?? null;\n}\n\n// =============================================================================\n// URL validation\n// =============================================================================\n\n/**\n * Validates that an editor URL is from an allowed host.\n * Requires HTTPS for non-localhost URLs.\n * Relative URLs (starting with /) are allowed and assumed to be same-origin.\n */\nfunction validateEditorUrl(url: string): boolean {\n debug('Syntro Runtime', 'Validating editor URL:', url);\n try {\n if (url.startsWith('/')) {\n debug('Syntro Runtime', '\u2713 Relative URL allowed (same-origin):', url);\n return true;\n }\n\n const parsed = new URL(url);\n const isLocalhost = /^(localhost|127\\.0\\.0\\.1)$/.test(parsed.hostname);\n\n if (parsed.protocol !== 'https:' && !isLocalhost) {\n warn('Syntro Runtime', '\u274C Editor URL must use HTTPS:', url);\n return false;\n }\n\n const isAllowed = ALLOWED_EDITOR_HOSTS.some((host) => {\n if (host.startsWith('.')) {\n return parsed.hostname.endsWith(host) || parsed.hostname === host.slice(1);\n }\n return parsed.hostname === host;\n });\n if (!isAllowed) {\n warn('Syntro Runtime', '\u274C Editor URL host not in allowlist:', parsed.hostname);\n return false;\n }\n\n debug('Syntro Runtime', '\u2713 Editor URL validated');\n return true;\n } catch (e) {\n warn('Syntro Runtime', `\u274C Invalid editor URL: ${url}`, e);\n return false;\n }\n}\n\n// =============================================================================\n// Mode detection\n// =============================================================================\n\n/**\n * Checks if the editor should be loaded.\n * Requires editor_source + editor_conf encoded params with mode === 'editor'.\n */\nexport const shouldLoadEditor = (): boolean => {\n debug('Syntro Runtime', '====== EDITOR LOAD CHECK ======');\n if (typeof window === 'undefined') return false;\n\n const source = getEditorSource();\n const conf = getEditorConf();\n if (!source?.token || !conf) {\n debug('Syntro Runtime', 'No encoded params found');\n debug('Syntro Runtime', '================================');\n return false;\n }\n\n const should = conf.mode === 'editor';\n debug('Syntro Runtime', `mode: ${conf.mode}, shouldLoad: ${should}`);\n debug('Syntro Runtime', '================================');\n return should;\n};\n\n/**\n * Checks if audit mode should be activated.\n * Requires editor_source + editor_conf encoded params with mode === 'audit'.\n */\nexport const isAuditMode = (): boolean => {\n debug('Syntro Runtime', '====== AUDIT MODE CHECK ======');\n if (typeof window === 'undefined') return false;\n\n const source = getEditorSource();\n const conf = getEditorConf();\n if (!source?.token || !conf) {\n debug('Syntro Runtime', 'No encoded params found');\n debug('Syntro Runtime', '================================');\n return false;\n }\n\n const isAudit = conf.mode === 'audit';\n debug('Syntro Runtime', `mode: ${conf.mode}, isAudit: ${isAudit}`);\n debug('Syntro Runtime', '================================');\n return isAudit;\n};\n\n/**\n * Checks if the editor SDK should be loaded.\n * Returns the mode string if a valid token and conf exist, null otherwise.\n * The runtime does not gate on specific mode values \u2014 the editor SDK\n * decides what to do with the mode.\n */\nexport const getActiveSdkMode = (): string | null => {\n const conf = getEditorConf();\n const source = getEditorSource();\n if (!source?.token || !conf?.mode) return null;\n return conf.mode;\n};\n\nexport interface EditorLoadOptions {\n editorUrl?: string;\n integrity?: string;\n}\n\n/**\n * Gets the auth token from editor_source encoded param.\n */\nfunction getToken(): string | null {\n return getEditorSource()?.token ?? null;\n}\n\n/**\n * Gets the api_base from editor_source encoded param.\n */\nfunction getApiBase(): string | null {\n return getEditorSource()?.api_base ?? null;\n}\n\n/** Singleton promise to prevent concurrent editor SDK loads. */\nlet _editorLoadPromise: Promise<void> | null = null;\n\n/**\n * Dynamically loads the Editor SDK script.\n * Validates URL against allowlist and supports SRI integrity checking.\n */\nexport const loadEditorSdk = async (\n editorUrlOrOptions?: string | EditorLoadOptions\n): Promise<void> => {\n debug('Syntro Runtime', '====== LOAD EDITOR SDK ======');\n\n if (typeof window === 'undefined') {\n debug('Syntro Runtime', 'Not in browser - skipping editor SDK load');\n return;\n }\n\n if ((window as any).SyntroEditor) {\n debug('Syntro Runtime', 'Editor SDK already loaded (window.SyntroEditor exists)');\n return;\n }\n\n // Prevent concurrent loads (two Syntro.init() calls racing)\n if (_editorLoadPromise) {\n debug('Syntro Runtime', 'Editor SDK load already in progress, waiting...');\n return _editorLoadPromise;\n }\n\n const options: EditorLoadOptions =\n typeof editorUrlOrOptions === 'string'\n ? { editorUrl: editorUrlOrOptions }\n : (editorUrlOrOptions ?? {});\n\n // Allow callers (e.g. Chrome extension) to skip editor loading entirely.\n // The extension loads the editor SDK from its own bundle to avoid mixed content.\n if (options.editorUrl === 'skip') {\n debug('Syntro Runtime', 'editorUrl=\"skip\" \u2014 deferring to caller');\n debug('Syntro Runtime', '================================');\n return;\n }\n\n // Derive editor SDK URL from api_base in editor_source\n const apiBase = getApiBase();\n const derivedEditorSdk = apiBase ? `${apiBase}/api/editor/sdk/editor-sdk.js` : null;\n\n // Priority: api_base derived > options\n const baseEditorUrl = derivedEditorSdk || options.editorUrl;\n\n if (!baseEditorUrl) {\n warn('Syntro Runtime', '\u274C No editor SDK URL available (no api_base, no editorUrl option)');\n debug('Syntro Runtime', '================================');\n return;\n }\n\n const token = getToken();\n if (!token) {\n warn('Syntro Runtime', '\u274C No token found in editor_source.');\n debug('Syntro Runtime', '================================');\n return;\n }\n\n // Append token as query param to the SDK URL\n const editorUrl = `${baseEditorUrl}?token=${encodeURIComponent(token)}`;\n\n debug('Syntro Runtime', 'Editor URL:', editorUrl);\n debug('Syntro Runtime', 'Options:', {\n hasIntegrity: !!options.integrity,\n hasEditorUrl: !!baseEditorUrl,\n hasApiBase: !!apiBase,\n tokenPrefix: `${token.slice(0, 10)}...`,\n });\n\n // Security: Validate URL against allowlist (check base URL without token)\n if (!validateEditorUrl(baseEditorUrl)) {\n console.error('[Syntro Runtime] \u274C BLOCKED: Editor from untrusted URL:', baseEditorUrl);\n debug('Syntro Runtime', '================================');\n return;\n }\n\n debug('Syntro Runtime', '\u2713 URL validated, injecting script tag...');\n\n _editorLoadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = editorUrl;\n script.async = true;\n\n if (options.integrity) {\n script.integrity = options.integrity;\n script.crossOrigin = 'anonymous';\n debug('Syntro Runtime', 'SRI integrity check enabled');\n }\n\n script.onload = () => {\n debug('Syntro Runtime', '\u2713 Editor SDK script loaded successfully');\n debug('Syntro Runtime', '================================');\n resolve();\n };\n script.onerror = (err) => {\n console.error('[Syntro Runtime] \u274C Failed to load Editor SDK:', err);\n console.error('[Syntro Runtime] URL attempted:', editorUrl);\n debug('Syntro Runtime', '================================');\n _editorLoadPromise = null; // Allow retry on failure\n reject(err);\n };\n document.head.appendChild(script);\n debug('Syntro Runtime', 'Script tag appended to <head>');\n });\n\n return _editorLoadPromise;\n};\n", "let overlayRootEl: HTMLElement | null = null;\n\n/**\n * Redirect overlay rendering into the shadow root's #overlayContainer.\n *\n * If `ensureOverlayRoot()` was already called (e.g. during runtime creation\n * before the canvas element exists), the temporary fallback element is\n * reparented into `container` so that existing references remain valid.\n */\nexport function setOverlayRoot(container: HTMLElement): void {\n if (overlayRootEl && overlayRootEl !== container) {\n // Reparent the stable fallback element into the shadow root container.\n // Surfaces/ActionEngine already hold a reference to overlayRootEl,\n // so moving it preserves their ability to appendChild into the shadow DOM.\n container.appendChild(overlayRootEl);\n } else {\n overlayRootEl = container;\n }\n\n // Inject base styles into the shadow root that contains the overlay container\n const shadowRoot = container.getRootNode();\n if (shadowRoot instanceof ShadowRoot) {\n injectBaseStyles(shadowRoot);\n }\n}\n\n/**\n * Return the overlay root element for appending overlays (tooltips, modals, etc).\n *\n * On first call (before `setOverlayRoot()`), creates a temporary element on\n * document.body. When `setOverlayRoot()` is called later during shadow DOM\n * bootstrap, this element is reparented into the shadow root so all existing\n * references continue to work.\n */\nexport function ensureOverlayRoot(): HTMLElement {\n if (!overlayRootEl) {\n overlayRootEl = document.createElement('div');\n overlayRootEl.id = 'syntro-overlays';\n Object.assign(overlayRootEl.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483645',\n pointerEvents: 'none',\n });\n document.body.appendChild(overlayRootEl);\n }\n return overlayRootEl;\n}\n\nlet stylesInjected = false;\nexport function injectBaseStyles(target: ShadowRoot | DocumentOrShadowRoot) {\n if (stylesInjected) return;\n const css = `\n:host {\n --syntro-surface: var(--sc-overlay-background, #0f1318);\n --syntro-fg: var(--sc-overlay-text-color, #cbd0d7);\n --syntro-accent: var(--sc-color-primary, #b72e2a);\n --syntro-accent-hover: var(--sc-color-primary-hover, #d44844);\n --syntro-radius: var(--sc-border-radius, 12px);\n --syntro-shadow: 0 25px 50px -12px rgba(16,24,40,0.25);\n --syntro-ring: var(--sc-overlay-highlight-ring, #d44844);\n --syntro-border: var(--sc-overlay-border, #2b333f);\n --syntro-tooltip-bg: var(--syntro-surface);\n --syntro-tooltip-fg: var(--syntro-fg);\n --syntro-tooltip-title-color: var(--sc-overlay-title-color, var(--syntro-fg));\n --syntro-tooltip-arrow-bg: var(--sc-overlay-arrow-color, var(--syntro-tooltip-bg));\n --syntro-tooltip-arrow-size: var(--sc-overlay-arrow-size, 8px);\n --syntro-tooltip-radius: var(--syntro-radius);\n --syntro-tooltip-padding: 12px 16px;\n --syntro-tooltip-shadow: var(--syntro-shadow);\n --syntro-spotlight-backdrop: rgba(0,0,0, var(--sc-overlay-scrim-opacity, 0.70));\n}\n\n/* Tooltip container */\n.syntro-tooltip {\n position: fixed;\n background: var(--syntro-tooltip-bg);\n color: var(--syntro-tooltip-fg);\n border-radius: var(--syntro-tooltip-radius);\n padding: var(--syntro-tooltip-padding);\n box-shadow: var(--syntro-tooltip-shadow);\n pointer-events: auto;\n max-width: min(320px, 90vw);\n font-family: inherit;\n font-size: 14px;\n line-height: 1.5;\n z-index: 2147483647;\n opacity: 1;\n visibility: visible;\n transition: opacity 200ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* Tooltip arrow \u2014 triangle via clip-path (square box so rotation is symmetric) */\n.syntro-tooltip-arrow {\n position: absolute;\n width: var(--syntro-tooltip-arrow-size);\n height: var(--syntro-tooltip-arrow-size);\n background: var(--syntro-tooltip-arrow-bg);\n clip-path: polygon(0 0, 100% 0, 50% 100%);\n}\n\n/* Tooltip content */\n.syntro-tt-title {\n font-weight: 600;\n font-size: 15px;\n margin-bottom: 6px;\n color: var(--syntro-tooltip-title-color);\n}\n\n.syntro-tt-body {\n font-size: 14px;\n opacity: 0.9;\n}\n\n.syntro-tt-close {\n position: absolute;\n top: 8px;\n right: 8px;\n background: transparent;\n border: none;\n color: inherit;\n font-size: 20px;\n line-height: 1;\n cursor: pointer;\n opacity: 0.6;\n transition: opacity 150ms;\n padding: 4px;\n}\n\n.syntro-tt-close:hover {\n opacity: 1;\n}\n\n/* Tooltip action buttons (for tours) */\n.syntro-tt-actions {\n display: flex;\n gap: 8px;\n margin-top: 12px;\n justify-content: flex-end;\n}\n\n.syntro-tt-btn {\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms;\n border: 1px solid var(--syntro-border, #2b333f);\n background: transparent;\n color: inherit;\n}\n\n.syntro-tt-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n}\n\n.syntro-tt-btn-primary {\n background: var(--syntro-accent, #b72e2a);\n border-color: transparent;\n color: #fff;\n}\n\n.syntro-tt-btn-primary:hover {\n background: var(--syntro-accent-hover, #d44844);\n}\n\n/* Buttons inside tooltips inherit font */\n.syntro-tooltip button {\n font-family: inherit;\n cursor: pointer;\n}\n\n/* Spotlight scrim with fade animation */\n.syntro-spotlight-scrim {\n position: fixed;\n inset: 0;\n background: var(--syntro-spotlight-backdrop, rgba(2,6,23,.55));\n backdrop-filter: blur(2px);\n transition: opacity 220ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* Spotlight ring with pulse animation */\n.syntro-spotlight-ring {\n position: fixed;\n border: 2px solid var(--syntro-ring, #d44844);\n box-shadow: 0 0 0 4px rgba(212, 72, 68, 0.25),\n 0 4px 12px rgba(0, 0, 0, 0.3);\n pointer-events: none;\n animation: syntro-ring-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n transition: all 220ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes syntro-ring-pulse {\n 0%, 100% {\n box-shadow: 0 0 0 4px rgba(212, 72, 68, 0.25),\n 0 4px 12px rgba(0, 0, 0, 0.3);\n }\n 50% {\n box-shadow: 0 0 0 8px rgba(212, 72, 68, 0.15),\n 0 4px 16px rgba(0, 0, 0, 0.4);\n }\n}\n\n/* Fade in animation for tooltip */\n@keyframes syntro-fade-in {\n from {\n opacity: 0;\n transform: scale(0.96) translateY(-4px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Modal scrim */\n.syntro-modal-scrim {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.6);\n backdrop-filter: blur(4px);\n opacity: 0;\n transition: opacity 200ms ease;\n pointer-events: auto;\n}\n\n/* Modal container */\n.syntro-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n background: var(--syntro-surface, #0f172a);\n color: var(--syntro-fg, #fff);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4);\n pointer-events: auto;\n opacity: 0;\n transition: opacity 200ms ease, transform 200ms ease;\n z-index: 2147483647;\n}\n\n.syntro-modal-sm { max-width: 320px; width: 90vw; }\n.syntro-modal-md { max-width: 480px; width: 90vw; }\n.syntro-modal-lg { max-width: 640px; width: 90vw; }\n\n/* Modal content */\n.syntro-modal-title {\n font-size: 20px;\n font-weight: 600;\n margin-bottom: 12px;\n}\n\n.syntro-modal-body {\n font-size: 15px;\n line-height: 1.6;\n opacity: 0.9;\n margin-bottom: 20px;\n}\n\n.syntro-modal-close {\n position: absolute;\n top: 12px;\n right: 12px;\n background: transparent;\n border: none;\n color: inherit;\n font-size: 24px;\n line-height: 1;\n cursor: pointer;\n opacity: 0.6;\n transition: opacity 150ms;\n padding: 4px;\n}\n\n.syntro-modal-close:hover {\n opacity: 1;\n}\n\n/* Modal buttons */\n.syntro-modal-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.syntro-modal-btn {\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms;\n border: 1px solid var(--syntro-border, #2b333f);\n background: transparent;\n color: inherit;\n}\n\n.syntro-modal-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n}\n\n.syntro-modal-btn-primary {\n background: var(--syntro-accent, #b72e2a);\n border-color: transparent;\n color: #fff;\n}\n\n.syntro-modal-btn-primary:hover {\n background: var(--syntro-accent-hover, #d44844);\n}\n`;\n const style = document.createElement('style');\n style.setAttribute('data-syntro', 'base-overlay');\n style.textContent = css;\n (target as Node).appendChild(style);\n stylesInjected = true;\n}\n\n// Inert helpers (polyfill loaded by caller if needed)\n// Must set inert on both document.body children (host page) AND shadow root\n// siblings when a blocking modal needs to trap focus.\nexport function setDocumentInertExcept(keepEl: HTMLElement) {\n // Inert host page children\n const bodyChildren = Array.from(document.body.children).filter((n) => n !== keepEl);\n bodyChildren.forEach((el) => el.setAttribute('inert', ''));\n\n // Also inert shadow root siblings if keepEl is inside a shadow root\n const root = keepEl.getRootNode();\n if (root instanceof ShadowRoot) {\n const shadowSiblings = Array.from(root.children).filter((n) => n !== keepEl);\n shadowSiblings.forEach((el) => el.setAttribute('inert', ''));\n }\n}\n\nexport function clearDocumentInert() {\n Array.from(document.body.children).forEach((el) => el.removeAttribute('inert'));\n\n // Also clear inert on shadow root children if overlay root is inside one\n if (overlayRootEl) {\n const root = overlayRootEl.getRootNode();\n if (root instanceof ShadowRoot) {\n Array.from(root.children).forEach((el) => el.removeAttribute('inert'));\n }\n }\n}\n", "/**\n * SmartCanvas API\n *\n * Entry point for the SmartCanvas SDK. Creates and manages the canvas element,\n * handles configuration, and coordinates between the ActionEngine and UI.\n */\n\nimport type { ActionStep, BatchActionHandle } from './actions/types';\nimport { initAntiFlicker } from './antiFlicker';\nimport { createCanvasConfigFetcher } from './configFetcher';\nimport { getActiveSdkMode, loadEditorSdk } from './editorLoader';\nimport { registerConfigPredicates } from './events/registerConfigPredicates';\nimport type { ExperimentClient } from './experiments/types';\nimport type { OverlayRecipeFetcher } from './overlays/fetcher';\nimport { setOverlayRoot } from './overlays/runtime/overlay/root';\nimport type { ActionHandler, AppearanceConfig, RenderProps } from './render/types';\nimport type { SmartCanvasRuntime } from './runtime';\nimport type { SmartCanvasAppProps } from './SmartCanvasApp';\nimport { registerSmartCanvasElement, type SmartCanvasElement } from './SmartCanvasElement';\nimport type { TelemetryClient } from './telemetry/types';\nimport type { CanvasThemeConfig } from './theme';\nimport type { CanvasConfigFetcher, CanvasConfigResponse } from './types';\n\n// Theme and render system imports\n\nexport interface SmartCanvasIntegrations {\n experiments?: ExperimentClient;\n telemetry?: TelemetryClient;\n}\n\nexport interface SmartCanvasConfig {\n target?: HTMLElement;\n defaultOpen?: boolean;\n tokens?: Record<string, string>;\n fetcher?: CanvasConfigFetcher;\n configUri?: string;\n configUriFeatureKey?: string;\n fetchCredentials?: RequestCredentials;\n overlayFetcher?: OverlayRecipeFetcher;\n overlayConfigUri?: string;\n overlayConfigFeatureKey?: string;\n overlayFetchCredentials?: RequestCredentials;\n pollIntervalMs?: number;\n integrations?: SmartCanvasIntegrations;\n antiFlicker?: boolean | { timeout?: number; className?: string };\n editorUrl?: string;\n\n /**\n * v2 Runtime instance.\n * Required for action execution. If not provided, actions will not be applied.\n */\n runtime?: SmartCanvasRuntime;\n\n // New block system configuration\n appearance?: AppearanceConfig;\n renderProps?: RenderProps;\n actionHandlers?: ActionHandler;\n\n /** Workspace-level theme for 3-layer inheritance (defaults \u2192 workspace \u2192 config) */\n workspaceTheme?: CanvasThemeConfig;\n}\n\n/**\n * Handle for interacting with a SmartCanvas instance.\n */\nexport interface SmartCanvasHandle {\n el: SmartCanvasElement;\n open(): void;\n close(): void;\n destroy(): void;\n setTokens(tokens: Record<string, string>): void;\n\n /**\n * Get the current config.\n */\n getConfig(): Promise<CanvasConfigResponse>;\n\n /**\n * Enable or disable the canvas.\n * When disabled, all actions are reverted.\n */\n setEnabled(enabled: boolean): Promise<void>;\n\n setOverrideFetcher(fetcher: CanvasConfigFetcher): void;\n registerTelemetryProperties(properties: Record<string, unknown>): void;\n getSessionId(): string | undefined;\n startSessionRecording(): void;\n /** Track a custom event. Returns true if telemetry is available and event was sent. */\n track(eventName: string, properties?: Record<string, unknown>): boolean;\n\n /**\n * v2 Runtime instance for context, events, state, and decisions.\n */\n runtime?: SmartCanvasRuntime;\n}\n\nexport const createSmartCanvas = async (\n config: SmartCanvasConfig = {}\n): Promise<SmartCanvasHandle> => {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error('SmartCanvas can only be created in a browser-like environment');\n }\n\n // Initialize anti-flicker if enabled\n let removeAntiFlicker: (() => void) | null = null;\n if (config.antiFlicker) {\n const antiFlickerConfig = typeof config.antiFlicker === 'object' ? config.antiFlicker : {};\n removeAntiFlicker = initAntiFlicker(antiFlickerConfig);\n }\n\n // State\n let currentConfig: CanvasConfigResponse | null = null;\n let currentFetcher: CanvasConfigFetcher | null = null;\n let currentBatchHandle: BatchActionHandle | null = null;\n\n const { runtime } = config;\n\n /**\n * Apply actions from config via ActionEngine.\n */\n async function applyActions(actions: ActionStep[]): Promise<void> {\n if (!runtime?.actions || actions.length === 0) {\n return;\n }\n\n // Revert previous actions\n if (currentBatchHandle?.isApplied()) {\n await currentBatchHandle.revertAll();\n }\n\n // Apply new actions\n currentBatchHandle = await runtime.actions.applyBatch(actions);\n }\n\n /**\n * Revert all current actions.\n */\n async function revertActions(): Promise<void> {\n if (currentBatchHandle?.isApplied()) {\n await currentBatchHandle.revertAll();\n currentBatchHandle = null;\n }\n }\n\n // Apply initial config if fetcher provided\n if (config.fetcher) {\n try {\n currentFetcher = config.fetcher;\n console.log('[SmartCanvas] Fetching initial config...');\n const canvasConfig = await config.fetcher();\n currentConfig = canvasConfig;\n\n console.log(\n '[SmartCanvas] Config fetched:',\n `tiles=${canvasConfig.tiles?.length ?? 0},`,\n `actions=${canvasConfig.actions?.length ?? 0},`,\n `theme=${canvasConfig.theme?.mode ?? 'default'}`\n );\n if (canvasConfig.actions?.length) {\n console.log(\n '[SmartCanvas] Actions to apply:',\n canvasConfig.actions\n .map(\n (a: any, i: number) =>\n `[${i}] ${a.kind}${a.anchorId ? ` anchor=\"${a.anchorId.selector}\"` : ''}${a.label ? ` \"${a.label}\"` : ''}`\n )\n .join(', ')\n );\n }\n\n // Apply actions eagerly (before React mounts) to avoid flicker.\n // The batch handle is passed to SmartCanvasApp so the React useEffect\n // can adopt it instead of re-applying and creating duplicates.\n if (canvasConfig.actions && canvasConfig.actions.length > 0 && runtime?.actions) {\n await applyActions(canvasConfig.actions);\n console.log('[SmartCanvas] Initial actions applied successfully');\n }\n\n // Register accumulator predicates from tile configs so event counting\n // is active immediately \u2014 not deferred until widget mounts.\n if (canvasConfig.tiles && runtime?.accumulator) {\n registerConfigPredicates(canvasConfig.tiles, runtime.accumulator, canvasConfig.actions);\n }\n } catch (error) {\n console.error('[SmartCanvas] Error fetching/applying initial config:', error);\n }\n }\n\n // Remove anti-flicker\n if (removeAntiFlicker) {\n removeAntiFlicker();\n }\n\n // Create the canvas element (must exist before editor SDK loads)\n const sdkMode = getActiveSdkMode();\n registerSmartCanvasElement();\n\n const host = document.createElement('smart-canvas') as SmartCanvasElement;\n\n // Redirect vanilla JS overlays (tooltips, modals) into the shadow root\n setOverlayRoot(host.getOverlayContainer());\n\n if (config.tokens) {\n for (const [key, value] of Object.entries(config.tokens)) {\n host.style.setProperty(key, value);\n }\n }\n\n // Wait for body to exist if running in <head>\n const appendToTarget = () => {\n const target = config.target ?? document.body;\n if (target) {\n target.appendChild(host);\n }\n };\n\n if (document.body) {\n appendToTarget();\n } else {\n // Script running before body exists - wait for DOMContentLoaded\n document.addEventListener('DOMContentLoaded', appendToTarget, { once: true });\n }\n\n // Load editor SDK AFTER <smart-canvas> is created and appended.\n // The editor auto-inits and needs the shadow root to exist.\n if (sdkMode) {\n console.log(`[SmartCanvas] Loading editor SDK for ${sdkMode} mode`);\n loadEditorSdk(config.editorUrl).catch(console.error);\n }\n\n const experiments = config.integrations?.experiments;\n const telemetry = config.integrations?.telemetry;\n\n const fetcher =\n config.fetcher ??\n createCanvasConfigFetcher({\n configUri: config.configUri,\n experiments,\n featureKey: config.configUriFeatureKey,\n credentials: config.fetchCredentials,\n });\n\n if (!currentFetcher) {\n currentFetcher = fetcher;\n }\n\n const appProps: Omit<SmartCanvasAppProps, 'controller'> = {\n fetcher,\n pollIntervalMs: config.pollIntervalMs,\n experiments,\n telemetry,\n runtime,\n overlayFetcher: config.overlayFetcher,\n overlayConfigUri: config.overlayConfigUri,\n overlayConfigFeatureKey: config.overlayConfigFeatureKey,\n overlayFetchCredentials: config.overlayFetchCredentials,\n configUri: config.configUri,\n configUriFeatureKey: config.configUriFeatureKey,\n fetchCredentials: config.fetchCredentials,\n initialBatchHandle: currentBatchHandle,\n workspaceTheme: config.workspaceTheme,\n };\n\n host.mountReactApp(appProps);\n if (config.defaultOpen) {\n host.open();\n }\n\n const handle: SmartCanvasHandle = {\n el: host,\n open: () => host.open(),\n close: () => host.close(),\n destroy: () => {\n revertActions();\n host.remove();\n },\n setTokens: (tokens) => {\n for (const [key, value] of Object.entries(tokens)) {\n host.style.setProperty(key, value);\n }\n },\n getConfig: async () => {\n if (currentFetcher) {\n try {\n const freshConfig = await currentFetcher();\n currentConfig = freshConfig;\n return freshConfig;\n } catch (error) {\n console.error('[SmartCanvas] Error fetching config:', error);\n }\n }\n return currentConfig ?? ({ tiles: [], actions: [], fetchedAt: '' } as CanvasConfigResponse);\n },\n setEnabled: async (enabled) => {\n if (enabled) {\n if (currentConfig) {\n await applyActions(currentConfig.actions);\n }\n } else {\n await revertActions();\n }\n },\n setOverrideFetcher: (newFetcher) => {\n currentFetcher = newFetcher;\n host.setOverrideFetcher(newFetcher);\n // Register accumulator predicates from the new config so event_count\n // conditions work when config is loaded via setOverrideFetcher\n // (e.g. editor SDK draft loading).\n if (runtime?.accumulator) {\n newFetcher()\n .then((config) => {\n if (config?.tiles) {\n registerConfigPredicates(config.tiles, runtime.accumulator, config.actions);\n }\n })\n .catch(() => {});\n }\n },\n registerTelemetryProperties: (properties) => {\n telemetry?.register?.(properties);\n },\n getSessionId: () => telemetry?.getSessionId?.(),\n startSessionRecording: () => {\n telemetry?.startSessionRecording?.();\n },\n track: (eventName, properties) => {\n if (!telemetry?.track) return false;\n telemetry.track(eventName, properties);\n return true;\n },\n runtime,\n };\n\n // Expose handle on SynOS \u2014 same namespace as React, appRegistry, etc.\n // Any app (editor, adaptives, tests) accesses it the same way.\n if (typeof window !== 'undefined') {\n const syn = (window as any).SynOS;\n if (syn) {\n syn.handle = handle;\n }\n }\n\n return handle;\n};\n\ndeclare global {\n interface Window {\n SmartCanvas?: {\n create(config?: SmartCanvasConfig): Promise<SmartCanvasHandle>;\n };\n }\n}\n\n// Export anti-flicker snippet for inline usage\nexport { getAntiFlickerSnippet } from './antiFlicker';\n\nif (typeof window !== 'undefined') {\n window.SmartCanvas = {\n async create(config?: SmartCanvasConfig) {\n return createSmartCanvas(config);\n },\n };\n}\n", "/**\n * GrowthBook adapter for the ExperimentClient interface.\n *\n * This file is INTERNAL - consumers should only import from experiments/types.ts\n * and use the ExperimentClient interface.\n */\n\nimport type { Experiment, Context as GrowthBookInitOptions, Result } from '@growthbook/growthbook';\nimport { GrowthBook } from '@growthbook/growthbook';\n\nimport type { TileConfig } from '../../types';\nimport type { ExperimentClient } from '../types';\n\n/**\n * Callback fired when a user is assigned to an experiment.\n */\nexport type ExperimentTrackingCallback = (\n experimentKey: string,\n variationId: number,\n variationName: string\n) => void;\n\n/**\n * Default API host for GrowthBook experiments.\n */\nexport const DEFAULT_EXPERIMENT_API_HOST = 'https://experiment.syntrologie.com';\n\nexport interface GrowthBookAdapterOptions extends GrowthBookInitOptions {\n /**\n * Existing GrowthBook instance to wrap.\n * If not provided, a new instance will be created.\n */\n client?: GrowthBook;\n\n /**\n * Auto-initialize with streaming enabled.\n */\n autoInit?: boolean;\n\n /**\n * Enable dev mode for URL parameter overrides and forced variations.\n * When true, allows ?syntro_exp=xxx&syntro_var=N to force specific variations.\n * @default true\n */\n enableDevMode?: boolean;\n\n /**\n * Callback fired when a user is assigned to an experiment.\n * Use this to send experiment data to your analytics provider.\n */\n onExperimentViewed?: ExperimentTrackingCallback;\n}\n\n/**\n * Internal adapter that implements ExperimentClient using GrowthBook.\n */\nexport class GrowthBookAdapter implements ExperimentClient {\n private readonly gb: GrowthBook;\n private readonly featureListeners = new Set<() => void>();\n\n constructor(options: GrowthBookAdapterOptions = {}) {\n if (options.client) {\n this.gb = options.client;\n } else {\n // Set up tracking callback to bridge to telemetry\n const trackingCallback = options.onExperimentViewed\n ? (experiment: Experiment<unknown>, result: Result<unknown>) => {\n options.onExperimentViewed!(\n experiment.key,\n result.variationId,\n typeof result.value === 'string' ? result.value : `variation_${result.variationId}`\n );\n }\n : undefined;\n\n this.gb = new GrowthBook({\n ...options,\n apiHost: options.apiHost ?? DEFAULT_EXPERIMENT_API_HOST,\n // Enable dev mode for URL param overrides (?syntro_exp=xxx&syntro_var=N)\n // Set to false in production if you want to disable preview functionality\n enableDevMode: options.enableDevMode ?? true,\n // Wire up experiment tracking callback\n trackingCallback,\n });\n if (options.autoInit) {\n this.gb.init({ streaming: true });\n }\n }\n }\n\n /**\n * Access to the underlying GrowthBook instance.\n * Only use this internally - don't expose to consumers.\n */\n get _internal(): GrowthBook {\n return this.gb;\n }\n\n async refreshFeatures() {\n await this.gb.loadFeatures();\n }\n\n setAttributes(attrs: Record<string, unknown>) {\n this.gb.setAttributes({ ...this.gb.getAttributes(), ...attrs });\n }\n\n setForcedVariations(variations: Record<string, number>) {\n this.gb.setForcedVariations(variations);\n }\n\n getFeatureValue<T>(key: string, fallback: T): T {\n return this.gb.getFeatureValue(key, fallback) as T;\n }\n\n getAllFeatures(): Record<string, unknown> {\n const features = this.gb.getFeatures();\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(features)) {\n result[key] = this.gb.getFeatureValue(key, null);\n }\n return result;\n }\n\n shouldRenderRectangle(_tile: TileConfig): boolean {\n // Legacy experiment-based filtering has been removed.\n // Tile visibility is now managed via WidgetRegistry and runtime.filterTiles().\n return true;\n }\n\n onFeaturesChanged(callback: () => void): () => void {\n this.featureListeners.add(callback);\n\n // Install the GrowthBook renderer on first subscriber.\n // setRenderer fires whenever feature values are updated (streaming, refresh, etc.)\n if (this.featureListeners.size === 1) {\n this.gb.setRenderer(() => {\n for (const cb of this.featureListeners) cb();\n });\n }\n\n return () => {\n this.featureListeners.delete(callback);\n if (this.featureListeners.size === 0) {\n this.gb.setRenderer(null);\n }\n };\n }\n}\n\n/**\n * Create an ExperimentClient backed by GrowthBook.\n */\nexport function createGrowthBookClient(options: GrowthBookAdapterOptions = {}): ExperimentClient {\n return new GrowthBookAdapter(options);\n}\n", "/**\n * SessionMetricTracker - Real-time session-based metrics for segment targeting.\n *\n * This module tracks metrics during a user's session and updates GrowthBook\n * attributes in real-time, enabling instant segment targeting without waiting\n * for batch PostHog cohort computation.\n *\n * Use cases:\n * - \"Show action plan after 3+ button clicks in this session\"\n * - \"Target users who viewed 5+ products this session\"\n * - \"Trigger intervention when user hovers a CTA 2+ times\"\n */\n\nimport type { ExperimentClient } from '../experiments/types';\n\nconst STORAGE_KEY = 'syntro_session_metrics';\n\n/**\n * Session metric value stored in sessionStorage.\n */\ninterface SessionMetricValue {\n count: number;\n lastUpdated: number;\n}\n\n/**\n * Options for creating a SessionMetricTracker.\n */\nexport interface SessionMetricTrackerOptions {\n /**\n * The experiment client to update attributes on.\n * When a metric changes, the session_${metricKey} attribute is updated.\n */\n experiments?: ExperimentClient;\n\n /**\n * Prefix for attribute keys sent to GrowthBook.\n * @default \"session_\"\n */\n attributePrefix?: string;\n\n /**\n * Callback fired when any metric value changes.\n * Useful for debugging or custom integrations.\n */\n onMetricChange?: (key: string, newValue: number) => void;\n}\n\n/**\n * Tracks session-based metrics for real-time segment targeting.\n */\nexport class SessionMetricTracker {\n private metrics: Map<string, number> = new Map();\n private experiments?: ExperimentClient;\n private attributePrefix: string;\n private onMetricChange?: (key: string, newValue: number) => void;\n\n constructor(options: SessionMetricTrackerOptions = {}) {\n this.experiments = options.experiments;\n this.attributePrefix = options.attributePrefix ?? 'session_';\n this.onMetricChange = options.onMetricChange;\n\n // Restore metrics from sessionStorage\n this.loadFromStorage();\n }\n\n /**\n * Increment a metric by the specified amount.\n *\n * @param metricKey - The metric to increment (e.g., \"button_clicks\", \"page_views\")\n * @param amount - Amount to increment by (default: 1)\n * @returns The new metric value\n */\n increment(metricKey: string, amount = 1): number {\n const currentValue = this.metrics.get(metricKey) ?? 0;\n const newValue = currentValue + amount;\n\n this.metrics.set(metricKey, newValue);\n this.saveToStorage();\n\n // Update GrowthBook attributes for real-time targeting\n this.updateExperimentAttributes(metricKey, newValue);\n\n // Fire callback if configured\n this.onMetricChange?.(metricKey, newValue);\n\n return newValue;\n }\n\n /**\n * Set a metric to a specific value.\n *\n * @param metricKey - The metric to set\n * @param value - The value to set\n */\n set(metricKey: string, value: number): void {\n this.metrics.set(metricKey, value);\n this.saveToStorage();\n this.updateExperimentAttributes(metricKey, value);\n this.onMetricChange?.(metricKey, value);\n }\n\n /**\n * Get the current value of a metric.\n *\n * @param metricKey - The metric to get\n * @returns The current value (0 if not set)\n */\n get(metricKey: string): number {\n return this.metrics.get(metricKey) ?? 0;\n }\n\n /**\n * Check if a metric meets or exceeds a threshold.\n *\n * @param metricKey - The metric to check\n * @param threshold - The threshold value\n * @returns True if metric >= threshold\n */\n meetsThreshold(metricKey: string, threshold: number): boolean {\n return this.get(metricKey) >= threshold;\n }\n\n /**\n * Get all current metric values.\n *\n * @returns Record of metric keys to values\n */\n getAll(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n\n /**\n * Reset a specific metric to zero.\n *\n * @param metricKey - The metric to reset\n */\n reset(metricKey: string): void {\n this.metrics.delete(metricKey);\n this.saveToStorage();\n this.updateExperimentAttributes(metricKey, 0);\n this.onMetricChange?.(metricKey, 0);\n }\n\n /**\n * Reset all metrics (clear the session).\n */\n resetAll(): void {\n const keys = Array.from(this.metrics.keys());\n this.metrics.clear();\n this.saveToStorage();\n\n // Update all attributes to 0\n const attrs: Record<string, number> = {};\n for (const key of keys) {\n attrs[`${this.attributePrefix}${key}`] = 0;\n this.onMetricChange?.(key, 0);\n }\n this.experiments?.setAttributes?.(attrs);\n }\n\n /**\n * Update the experiment client (useful if experiments client changes).\n */\n setExperiments(experiments: ExperimentClient): void {\n this.experiments = experiments;\n // Sync all current metrics to the new experiment client\n this.syncAllToExperiments();\n }\n\n // ==================== Private Methods ====================\n\n private updateExperimentAttributes(metricKey: string, value: number): void {\n if (!this.experiments?.setAttributes) return;\n\n const attributeKey = `${this.attributePrefix}${metricKey}`;\n this.experiments.setAttributes({ [attributeKey]: value });\n }\n\n private syncAllToExperiments(): void {\n if (!this.experiments?.setAttributes) return;\n\n const attrs: Record<string, number> = {};\n for (const [key, value] of this.metrics) {\n attrs[`${this.attributePrefix}${key}`] = value;\n }\n this.experiments.setAttributes(attrs);\n }\n\n private loadFromStorage(): void {\n if (typeof window === 'undefined' || typeof sessionStorage === 'undefined') return;\n\n try {\n const stored = sessionStorage.getItem(STORAGE_KEY);\n if (stored) {\n const data: Record<string, SessionMetricValue> = JSON.parse(stored);\n for (const [key, value] of Object.entries(data)) {\n this.metrics.set(key, value.count);\n }\n }\n } catch (err) {\n console.warn('[SessionMetricTracker] Failed to load from sessionStorage:', err);\n }\n }\n\n private saveToStorage(): void {\n if (typeof window === 'undefined' || typeof sessionStorage === 'undefined') return;\n\n try {\n const data: Record<string, SessionMetricValue> = {};\n for (const [key, count] of this.metrics) {\n data[key] = { count, lastUpdated: Date.now() };\n }\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n } catch (err) {\n console.warn('[SessionMetricTracker] Failed to save to sessionStorage:', err);\n }\n }\n}\n\n/**\n * Create a SessionMetricTracker instance.\n */\nexport function createSessionMetricTracker(\n options: SessionMetricTrackerOptions = {}\n): SessionMetricTracker {\n return new SessionMetricTracker(options);\n}\n", "/**\n * No-op adapter for the TelemetryClient interface.\n *\n * Used when telemetry is disabled (e.g. demo mode with t=\"noop\").\n * All tracking methods silently do nothing. Session/distinct IDs\n * return stable values so downstream code that reads them still works.\n */\nimport type { CanvasSurface, TelemetryClient } from '../types';\n\nfunction randomId(): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let id = '';\n for (let i = 0; i < 16; i++) {\n id += chars[Math.floor(Math.random() * chars.length)];\n }\n return id;\n}\n\nclass NoopAdapter implements TelemetryClient {\n private readonly sessionId: string;\n\n constructor() {\n this.sessionId = randomId();\n console.log(\n `[Syntro Telemetry] Using noop adapter (no telemetry configured). sessionId=${this.sessionId}`\n );\n }\n\n trackCanvasOpened(_surface: CanvasSurface): void {}\n trackCanvasClosed(_surface: CanvasSurface): void {}\n trackRectangleViewed(_rectangleId: string, _surface: CanvasSurface): void {}\n trackAction(_action: string, _rectangleId: string, _surface: CanvasSurface): void {}\n\n register(_properties: Record<string, unknown>): void {}\n getSessionId(): string {\n return this.sessionId;\n }\n startSessionRecording(): void {}\n trackExperiment(_key: string, _variationId: number, _variationName?: string): void {}\n setPersonProperties(_properties: Record<string, unknown>): void {}\n setPersonPropertiesOnce(_properties: Record<string, unknown>): void {}\n\n getDistinctId(): string {\n return 'demo-user';\n }\n\n getAllFeatureFlags(): Record<string, boolean | string> {\n return {};\n }\n\n getSegmentFlags(): Record<string, boolean> {\n return {};\n }\n\n track(_eventName: string, _properties?: Record<string, unknown>): void {}\n}\n\n/**\n * Create a TelemetryClient that silently discards all events.\n */\nexport function createNoopClient(): TelemetryClient {\n return new NoopAdapter();\n}\n", "/**\n * PostHog adapter for the TelemetryClient interface.\n *\n * This file is INTERNAL - consumers should only import from telemetry/types.ts\n * and use the TelemetryClient interface.\n */\nimport type { PostHog, Properties } from 'posthog-js';\nimport posthog from 'posthog-js';\n\nimport type { ConsentGate } from '../consent';\nimport type { CanvasSurface, TelemetryClient } from '../types';\n\nexport interface PostHogAdapterOptions {\n /**\n * PostHog API key.\n */\n apiKey?: string;\n\n /**\n * PostHog API host.\n * @default \"https://telemetry.syntrologie.com\"\n */\n apiHost?: string;\n\n /**\n * Existing PostHog client to wrap.\n */\n client?: PostHog;\n\n /**\n * Enable full-page autocapture (clicks, form submissions, etc.)\n * @default true\n */\n autocapture?: boolean;\n\n /**\n * Enable session recording.\n * @default true\n */\n sessionRecording?: boolean;\n\n /**\n * Enable pageview capture.\n * @default true\n */\n capturePageview?: boolean;\n\n /**\n * Enable page leave capture.\n * @default true\n */\n capturePageleave?: boolean;\n\n /**\n * Enable PostHog feature flags for segment membership.\n * When true, PostHog's /decide endpoint is called to get segment flags.\n * These flags (in_segment_*) are used for segment-based targeting.\n *\n * @default true\n */\n enableFeatureFlags?: boolean;\n\n /**\n * Callback when PostHog feature flags are loaded.\n * Used to update GrowthBook attributes with segment membership.\n */\n onFeatureFlagsLoaded?: (flags: Record<string, boolean | string>) => void;\n\n /**\n * Callback when any event is captured by PostHog.\n * Used to feed events into the EventBus for runtime decisions.\n */\n onCapture?: (eventName: string, properties?: Record<string, unknown>) => void;\n\n /**\n * Consent gate for GDPR compliance.\n * When provided with requireExplicitConsent, PostHog initialization is\n * deferred until consent is granted.\n */\n consent?: ConsentGate;\n\n /**\n * Require explicit consent before initializing PostHog.\n * When true, PostHog will not init until consent.grant() is called.\n * @default false\n */\n requireExplicitConsent?: boolean;\n\n /**\n * Enable behavioral signal detection (hesitation, rage click, etc.)\n * Pass `true` for defaults, or a partial DetectorConfig to customize thresholds.\n * @default false\n */\n behavioralSignals?: boolean | Record<string, number>;\n\n /**\n * Endpoint URL to mirror session recording payloads.\n * When set, recording requests to PostHog's /s/ endpoint are also\n * sent (fire-and-forget) to this URL.\n */\n replayMirrorEndpoint?: string;\n\n /**\n * Callback for raw rrweb events from session recording.\n * Called with each rrweb eventWithTime before PostHog processes it.\n * Used by the event processor for behavioral signal detection.\n */\n onRRWebEvent?: (event: Record<string, unknown>) => void;\n}\n\ninterface CanvasAnalyticsPayload extends Properties {\n rectangleId?: string;\n surface?: CanvasSurface;\n}\n\n/**\n * Internal adapter that implements TelemetryClient using PostHog.\n */\nexport class PostHogAdapter implements TelemetryClient {\n private client?: PostHog;\n private featureFlagsCallback?: (flags: Record<string, boolean | string>) => void;\n private captureCallback?: (eventName: string, properties?: Record<string, unknown>) => void;\n private rrwebCallback?: (event: Record<string, unknown>) => void;\n private consentUnsub?: () => void;\n\n constructor(readonly options: PostHogAdapterOptions = {}) {\n this.client = options.client;\n this.featureFlagsCallback = options.onFeatureFlagsLoaded;\n this.captureCallback = options.onCapture;\n this.rrwebCallback = options.onRRWebEvent;\n\n // Consent gating: defer init until consent is granted\n if (\n !this.client &&\n options.consent &&\n options.requireExplicitConsent &&\n typeof window !== 'undefined' &&\n options.apiKey\n ) {\n const consent = options.consent;\n const currentStatus = consent.getStatus();\n\n if (currentStatus === 'granted') {\n // Already granted \u2014 init now\n this.initPostHog();\n }\n\n // Always subscribe for future consent transitions (grant\u2192deny\u2192re-grant)\n this.consentUnsub = consent.subscribe((status) => {\n if (status === 'granted') {\n if (!this.client) {\n this.initPostHog();\n } else {\n this.client.opt_in_capturing();\n }\n } else if (status === 'denied' && this.client) {\n this.client.opt_out_capturing();\n }\n });\n return;\n }\n\n if (!this.client && typeof window !== 'undefined' && options.apiKey) {\n this.initPostHog();\n }\n }\n\n /**\n * Initialize the PostHog client. Called immediately (no consent gate)\n * or deferred (when consent gate grants).\n */\n private initPostHog(): void {\n const options = this.options;\n if (!options.apiKey) return;\n\n // Determine if we should enable feature flags (for segment membership)\n // Default: true (enabled) to support segment targeting via /decide\n const enableFeatureFlags = options.enableFeatureFlags ?? true;\n\n // Use a named instance so we don't clobber the customer's global PostHog.\n // posthog.init() with a 3rd arg returns an isolated instance.\n const instanceName = `syntro_${options.apiKey.slice(-6) || 'sdk'}`;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.client = posthog.init(\n options.apiKey,\n {\n api_host: options.apiHost ?? 'https://telemetry.syntrologie.com',\n // Feature flags for segment membership (in_segment_* flags)\n // When enabled, /decide is called to get segment flags\n advanced_disable_feature_flags: !enableFeatureFlags,\n advanced_disable_feature_flags_on_first_load: !enableFeatureFlags,\n // Full-page tracking - all ON by default\n autocapture: options.autocapture ?? true,\n capture_pageview: options.capturePageview ?? true,\n capture_pageleave: options.capturePageleave ?? true,\n disable_session_recording: !(options.sessionRecording ?? true),\n // CRITICAL: Disable user agent filtering to allow headless Chrome\n // PostHog blocks \"HeadlessChrome\" user agents by default as bot detection\n // This enables session recording in Playwright/crawler sessions\n opt_out_useragent_filter: true,\n // Cross-domain iframe recording for embeds\n session_recording: {\n recordCrossDomainIFrames: true,\n },\n // Capture performance metrics\n capture_performance: true,\n // Enable web vitals\n enable_recording_console_log: true,\n // Bootstrap callback for when flags are loaded\n loaded: (ph: PostHog) => {\n if (enableFeatureFlags && this.featureFlagsCallback) {\n // Register callback for when feature flags are ready\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ph as any).onFeatureFlags(() => {\n const allFlags = this.getAllFeatureFlags();\n if (allFlags && this.featureFlagsCallback) {\n this.featureFlagsCallback(allFlags);\n }\n });\n\n // If flags already loaded before callback was registered, fire immediately\n const existingFlags = this.getAllFeatureFlags();\n if (existingFlags && Object.keys(existingFlags).length > 0) {\n this.featureFlagsCallback(existingFlags);\n }\n }\n\n // Wire up capture callback to feed events into EventBus\n if (this.captureCallback) {\n // PostHog's eventCaptured passes a single CaptureResult object:\n // { uuid, event, properties, $set, $set_once, timestamp }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ph as any).on('eventCaptured', (data: any) => {\n const eventName = typeof data === 'string' ? data : data?.event;\n const properties = typeof data === 'string' ? undefined : data?.properties;\n if (typeof eventName === 'string') {\n this.captureCallback?.(eventName, properties);\n }\n });\n }\n },\n } as any,\n instanceName\n ) as PostHog;\n\n // Wire rrweb event intercept for behavioral signal detection\n if (this.rrwebCallback && this.client) {\n this.setupRRWebIntercept();\n }\n\n // Wire replay mirror if configured\n if (options.replayMirrorEndpoint && this.client) {\n import('../replayMirror').then(({ setupReplayMirror }) => {\n setupReplayMirror({\n posthogHost: options.apiHost ?? 'https://telemetry.syntrologie.com',\n mirrorEndpoint: options.replayMirrorEndpoint!,\n });\n });\n }\n }\n\n /**\n * Set up rrweb event interception on PostHog's session recording.\n *\n * PostHog lazy-loads the rrweb recorder. The SessionRecording wrapper has\n * an `onRRwebEmit` method, but rrweb delivers events directly to the\n * lazy-loaded recorder instance's `onRRwebEmit`, bypassing the wrapper.\n * We must find and patch the recorder instance, not the wrapper.\n *\n * The recorder instance is stored on a minified property of SessionRecording.\n * We detect it by looking for an object with both `onRRwebEmit` and `start` methods.\n */\n private setupRRWebIntercept(retries = 30): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sr = (this.client as any)?.sessionRecording;\n if (!sr) {\n if (retries > 0) {\n setTimeout(() => this.setupRRWebIntercept(retries - 1), 500);\n }\n return;\n }\n\n // Find the lazy-loaded recorder instance on SessionRecording.\n // It's stored under a minified property name, so we search for an object\n // that has both `onRRwebEmit` and `start` methods (the recorder's signature).\n let recorder: any = null;\n for (const key of Object.getOwnPropertyNames(sr)) {\n const val = sr[key];\n if (\n val &&\n typeof val === 'object' &&\n typeof val.onRRwebEmit === 'function' &&\n typeof val.start === 'function' &&\n val !== sr // not self-reference\n ) {\n recorder = val;\n break;\n }\n }\n\n if (!recorder) {\n if (retries > 0) {\n setTimeout(() => this.setupRRWebIntercept(retries - 1), 500);\n }\n return;\n }\n\n // Patch the recorder's onRRwebEmit \u2014 this is where rrweb delivers events\n const originalEmit = recorder.onRRwebEmit.bind(recorder);\n recorder.onRRwebEmit = (rawEvent: Record<string, unknown>) => {\n this.rrwebCallback?.({ kind: 'rrweb', ...rawEvent });\n originalEmit(rawEvent);\n };\n\n // Signal that rrweb intercept is active (used by E2E tests)\n if (typeof window !== 'undefined') {\n (window as any).__RRWEB_INTERCEPT_READY__ = true;\n }\n }\n\n /**\n * Get all feature flags from PostHog.\n * Used to extract segment membership flags (in_segment_*).\n */\n getAllFeatureFlags(): Record<string, boolean | string> | undefined {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const flags = (this.client as any)?.featureFlags?.getFlagVariants?.();\n return flags;\n }\n\n /**\n * Get segment membership flags (in_segment_*) from PostHog.\n */\n getSegmentFlags(): Record<string, boolean> {\n const allFlags = this.getAllFeatureFlags();\n if (!allFlags) return {};\n\n const segmentFlags: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(allFlags)) {\n if (key.startsWith('in_segment_')) {\n segmentFlags[key] = value === true;\n }\n }\n return segmentFlags;\n }\n\n identify(id: string, props?: Properties) {\n this.client?.identify(id, props);\n }\n\n alias(id: string, aliasId: string) {\n this.client?.alias(id, aliasId);\n }\n\n track(eventName: string, payload?: CanvasAnalyticsPayload) {\n this.client?.capture(eventName, payload);\n }\n\n trackCanvasOpened(surface: CanvasSurface) {\n this.track('shadow_canvas_opened', { surface });\n }\n\n trackCanvasClosed(surface: CanvasSurface) {\n this.track('shadow_canvas_closed', { surface });\n }\n\n trackRectangleViewed(rectangleId: string, surface: CanvasSurface) {\n this.track('shadow_canvas_rectangle_viewed', { rectangleId, surface });\n }\n\n trackAction(action: string, rectangleId: string, surface: CanvasSurface) {\n this.track('shadow_canvas_action', { action, rectangleId, surface });\n }\n\n register(properties: Record<string, unknown>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.client as any)?.register?.(properties);\n }\n\n getSessionId(): string | undefined {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.client as any)?.get_session_id?.();\n }\n\n startSessionRecording(): void {\n // Force start recording - bypasses bot detection for crawler sessions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.client as any)?.startSessionRecording?.();\n }\n\n trackExperiment(experimentKey: string, variationId: number, variationName?: string): void {\n // Register as super property so all subsequent events include experiment data\n const experimentProperty = `$experiment_${experimentKey}`;\n this.register({\n [experimentProperty]: variationName ?? `variation_${variationId}`,\n [`${experimentProperty}_id`]: variationId,\n });\n\n // Fire discrete event for experiment assignment tracking\n this.track('$experiment_started', {\n $experiment_key: experimentKey,\n $experiment_variation_id: variationId,\n $experiment_variation_name: variationName ?? `variation_${variationId}`,\n });\n }\n\n setPersonProperties(properties: Record<string, unknown>): void {\n // PostHog's $set event sets person properties\n this.client?.capture('$set', { $set: properties });\n }\n\n setPersonPropertiesOnce(properties: Record<string, unknown>): void {\n // PostHog's $set_once only sets if property doesn't exist\n this.client?.capture('$set', { $set_once: properties });\n }\n\n getDistinctId(): string | undefined {\n // PostHog's get_distinct_id returns the current user's ID\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.client as any)?.get_distinct_id?.();\n }\n}\n\n/**\n * Create a TelemetryClient backed by PostHog.\n */\nexport function createPostHogClient(options: PostHogAdapterOptions = {}): TelemetryClient {\n return new PostHogAdapter(options);\n}\n", "/**\n * Core Flow Executors\n *\n * Executors for core:sequence, core:parallel, and core:wait action kinds.\n * These enable composing actions into ordered/parallel flows with waits.\n */\n\nimport type {\n ActionExecutor,\n ActionHandle,\n ExecutorResult,\n ParallelAction,\n SequenceAction,\n WaitAction,\n} from '../types';\n\n/**\n * Execute actions in sequence, awaiting each one's completion.\n */\nexport const executeSequence: ActionExecutor<SequenceAction> = async (action, context) => {\n const handles: ActionHandle[] = [];\n\n if (context.applyAction) {\n for (const childAction of action.actions) {\n const handle = await context.applyAction(childAction);\n handles.push(handle);\n }\n }\n\n return {\n cleanup: async () => {\n // Revert in reverse order\n for (let i = handles.length - 1; i >= 0; i--) {\n try {\n await handles[i].revert();\n } catch {\n // Ignore cleanup errors\n }\n }\n },\n };\n};\n\n/**\n * Execute actions in parallel.\n */\nexport const executeParallel: ActionExecutor<ParallelAction> = async (action, context) => {\n const handles: ActionHandle[] = [];\n\n if (context.applyAction) {\n const promises = action.actions.map((childAction) => context.applyAction!(childAction));\n\n if (action.waitFor === 'any') {\n // Complete when the first action finishes\n const firstHandle = await Promise.race(promises);\n handles.push(firstHandle);\n // Still collect remaining handles for cleanup\n const remaining = await Promise.allSettled(promises);\n for (const result of remaining) {\n if (result.status === 'fulfilled' && result.value !== firstHandle) {\n handles.push(result.value);\n }\n }\n } else {\n // Default: wait for all\n const allHandles = await Promise.all(promises);\n handles.push(...allHandles);\n }\n }\n\n return {\n cleanup: async () => {\n for (const handle of handles) {\n try {\n await handle.revert();\n } catch {\n // Ignore cleanup errors\n }\n }\n },\n };\n};\n\n/**\n * Wait for a duration or an event on the EventBus.\n */\nexport const executeWait: ActionExecutor<WaitAction> = async (action, context) => {\n let unsubscribe: (() => void) | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let cancelled = false;\n\n const result: ExecutorResult = {\n cleanup: () => {\n cancelled = true;\n if (timeoutId) clearTimeout(timeoutId);\n if (unsubscribe) unsubscribe();\n },\n };\n\n // If waiting for an event, subscribe and return when it fires\n if (action.event && context.subscribeEvent) {\n await new Promise<void>((resolve) => {\n unsubscribe = context.subscribeEvent!(action.event!, () => {\n if (!cancelled) resolve();\n });\n\n // If also has durationMs, use as timeout\n if (action.durationMs !== undefined) {\n timeoutId = setTimeout(() => {\n if (!cancelled) resolve();\n }, action.durationMs);\n }\n });\n } else if (action.durationMs !== undefined) {\n // Simple duration wait\n await new Promise<void>((resolve) => {\n timeoutId = setTimeout(() => {\n if (!cancelled) resolve();\n }, action.durationMs);\n });\n }\n\n return result;\n};\n", "/**\n * Action Executor Registry\n *\n * Extensible registry that maps action kinds to their executor functions.\n * Apps can register custom executors at runtime.\n *\n * Core app executors are imported from their respective app packages.\n */\n\n// Import executors from CORE app packages only (bundled with runtime)\n// Lazy apps (gamification, faq, nav) are loaded dynamically from CDN\nimport { executors as contentExecutors } from '@syntrologie/adapt-content/runtime';\nimport { executors as overlayExecutors } from '@syntrologie/adapt-overlays/runtime';\nimport type { ZodSchema } from 'zod';\n\nimport type {\n ActionExecutor,\n ActionKind,\n ActionStep,\n ValidationError,\n ValidationResult,\n} from '../types';\n\nimport { executeParallel, executeSequence, executeWait } from './core-flow';\n\n/**\n * Registration entry for an executor.\n */\nexport interface ExecutorRegistration {\n kind: string;\n executor: ActionExecutor<any>;\n schema?: ZodSchema;\n source: string; // App ID that registered this executor\n isBuiltIn: boolean; // Whether this is from a built-in app (prevents override)\n}\n\n/**\n * Extensible registry for action executors.\n *\n * Core executors (setText, highlight, etc.) are registered synchronously\n * at construction time for immediate availability - no async loading.\n *\n * External app executors are registered when apps activate.\n */\nexport class ExecutorRegistry {\n private executors = new Map<string, ExecutorRegistration>();\n\n /**\n * Constructor - registers core executors synchronously.\n * These are available IMMEDIATELY when the module loads,\n * enabling instant action execution without waiting for app activation.\n */\n constructor() {\n // Register all executors from core app packages\n for (const { kind, executor } of contentExecutors) {\n this.registerCore(kind, executor as ActionExecutor<any>);\n }\n for (const { kind, executor } of overlayExecutors) {\n this.registerCore(kind, executor as ActionExecutor<any>);\n }\n // NOTE: Lazy apps (gamification, faq, nav) are NOT registered here.\n // They are loaded dynamically from CDN via AppLoader when config requires them.\n\n // core:mountWidget is handled specially in ActionEngine since it delegates to Surfaces\n this.registerCore('core:mountWidget', async () => {\n throw new Error('core:mountWidget must be handled by ActionEngine');\n });\n\n // Register core flow executors (sequence, parallel, wait)\n this.registerCore('core:sequence', executeSequence);\n this.registerCore('core:parallel', executeParallel);\n this.registerCore('core:wait', executeWait);\n\n // NOTE: core:tour is now registered via overlayExecutors from @syntrologie/adapt-overlays\n }\n\n /**\n * Register a core executor (synchronous, built-in, cannot be overridden).\n */\n private registerCore(kind: string, executor: ActionExecutor<any>, schema?: ZodSchema): void {\n this.executors.set(kind, {\n kind,\n executor,\n schema,\n source: 'core',\n isBuiltIn: true,\n });\n }\n\n /**\n * Register an executor for an action kind.\n *\n * @param kind - The action kind (e.g., \"gamification:awardBadge\")\n * @param executor - The executor function\n * @param schema - Optional Zod schema for validation\n * @param source - The source app ID (for tracking)\n * @param isBuiltIn - Whether this is from a built-in app (prevents override)\n */\n register(\n kind: string,\n executor: ActionExecutor<any>,\n schema?: ZodSchema,\n source: string = 'custom',\n isBuiltIn: boolean = false\n ): void {\n if (this.executors.has(kind)) {\n const existing = this.executors.get(kind)!;\n if (existing.isBuiltIn) {\n // Silently skip \u2014 app is re-registering an executor already bundled\n // with the runtime. This happens when adaptive CDN bundles activate\n // for apps whose executors are also compiled into the core bundle.\n return;\n }\n console.warn(`[ExecutorRegistry] Overriding executor for kind: ${kind} (source: ${source})`);\n }\n\n console.log(`[ExecutorRegistry] Registered executor: ${kind} (source: ${source})`);\n this.executors.set(kind, {\n kind,\n executor,\n schema,\n source,\n isBuiltIn,\n });\n }\n\n /**\n * Unregister an executor.\n *\n * @param kind - The action kind to unregister\n * @returns true if the executor was unregistered, false if not found or built-in\n */\n unregister(kind: string): boolean {\n const existing = this.executors.get(kind);\n if (!existing) {\n return false;\n }\n\n if (existing.isBuiltIn) {\n console.warn(`[ExecutorRegistry] Cannot unregister built-in executor: ${kind}`);\n return false;\n }\n\n this.executors.delete(kind);\n return true;\n }\n\n /**\n * Unregister all executors from a specific source.\n *\n * @param source - The source app ID\n */\n unregisterBySource(source: string): void {\n for (const [kind, registration] of this.executors.entries()) {\n if (registration.source === source) {\n this.executors.delete(kind);\n }\n }\n }\n\n /**\n * Get the executor for an action kind.\n */\n get(kind: string): ActionExecutor<ActionStep> | undefined {\n return this.executors.get(kind)?.executor;\n }\n\n /**\n * Get the full registration for an action kind.\n */\n getRegistration(kind: string): ExecutorRegistration | undefined {\n return this.executors.get(kind);\n }\n\n /**\n * Check if an executor exists for a given action kind.\n */\n has(kind: string): boolean {\n return this.executors.has(kind);\n }\n\n /**\n * Validate an action using its registered schema.\n *\n * @param action - The action to validate\n * @returns Validation result\n */\n validate(action: unknown): ValidationResult {\n const errors: ValidationError[] = [];\n\n if (!action || typeof action !== 'object') {\n errors.push({\n code: 'INVALID_ACTION',\n message: 'Action must be an object',\n });\n return { valid: false, errors, warnings: [] };\n }\n\n const { kind } = action as any;\n if (!kind || typeof kind !== 'string') {\n errors.push({\n code: 'MISSING_KIND',\n message: \"Action must have a 'kind' property\",\n });\n return { valid: false, errors, warnings: [] };\n }\n\n const registration = this.executors.get(kind);\n if (!registration) {\n errors.push({\n code: 'UNKNOWN_KIND',\n message: `Unknown action kind: ${kind}`,\n field: 'kind',\n });\n return { valid: false, errors, warnings: [] };\n }\n\n // If schema is provided, validate against it\n if (registration.schema) {\n const result = registration.schema.safeParse(action);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push({\n code: 'SCHEMA_VALIDATION_ERROR',\n message: issue.message,\n field: issue.path.join('.'),\n });\n }\n return { valid: false, errors, warnings: [] };\n }\n }\n\n return { valid: true, errors: [], warnings: [] };\n }\n\n /**\n * List all registered action kinds.\n */\n list(): string[] {\n return Array.from(this.executors.keys());\n }\n\n /**\n * List all registrations.\n */\n listRegistrations(): ExecutorRegistration[] {\n return Array.from(this.executors.values());\n }\n\n /**\n * Get all built-in action kinds.\n */\n getBuiltInKinds(): string[] {\n return Array.from(this.executors.entries())\n .filter(([, reg]) => reg.isBuiltIn)\n .map(([kind]) => kind);\n }\n\n /**\n * Get all custom action kinds.\n */\n getCustomKinds(): string[] {\n return Array.from(this.executors.entries())\n .filter(([, reg]) => !reg.isBuiltIn)\n .map(([kind]) => kind);\n }\n}\n\n// ============================================================================\n// Singleton and backwards-compatible exports\n// ============================================================================\n\n/**\n * Default singleton instance of ExecutorRegistry.\n */\nexport const executorRegistry = new ExecutorRegistry();\n\n/**\n * Get the executor for an action kind.\n * @deprecated Use executorRegistry.get() instead\n */\nexport function getExecutor(kind: ActionKind | string): ActionExecutor<ActionStep> | undefined {\n return executorRegistry.get(kind);\n}\n\n/**\n * Check if an executor exists for a given action kind.\n * @deprecated Use executorRegistry.has() instead\n */\nexport function hasExecutor(kind: ActionKind | string): boolean {\n return executorRegistry.has(kind);\n}\n\n// Re-export individual executors from app packages for backwards compatibility\nexport {\n executeAddClass,\n executeInsertHtml,\n executeRemoveClass,\n executeSetAttr,\n executeSetStyle,\n executeSetText,\n} from '@syntrologie/adapt-content/runtime';\n\nexport {\n executeBadge,\n executeHighlight,\n executeModal,\n executePulse,\n executeTooltip,\n executeTour,\n} from '@syntrologie/adapt-overlays/runtime';\n\n// NOTE: Lazy app executors (gamification, faq, nav) are NOT re-exported here.\n// They are loaded dynamically from CDN via AppLoader when config requires them.\n\n// Core executors\nexport { executeParallel, executeSequence, executeWait } from './core-flow';\n", "/**\n * Action Validation\n *\n * Validates action steps before execution.\n */\n\nimport { executorRegistry, hasExecutor } from './executors';\nimport type {\n ActionStep,\n AnchorId,\n ValidationError,\n ValidationResult,\n ValidationWarning,\n} from './types';\n\n/** Dangerous attribute names that should not be set */\nconst DANGEROUS_ATTRS = new Set([\n 'onclick',\n 'onerror',\n 'onload',\n 'onmouseover',\n 'onfocus',\n 'onblur',\n 'onchange',\n 'onsubmit',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n]);\n\n/** Maximum HTML content length */\nconst MAX_HTML_LENGTH = 50000;\n\n/** Maximum style count */\nconst MAX_STYLE_COUNT = 50;\n\n/**\n * Validate an action step.\n */\nexport function validateAction(action: ActionStep): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Check action has a kind\n if (!action || typeof action !== 'object') {\n errors.push({\n code: 'INVALID_ACTION',\n message: 'Action must be an object',\n });\n return { valid: false, errors, warnings };\n }\n\n const { kind } = action as any;\n\n // Check kind is valid\n if (!kind || typeof kind !== 'string') {\n errors.push({\n code: 'MISSING_KIND',\n message: \"Action must have a 'kind' property\",\n });\n return { valid: false, errors, warnings };\n }\n\n // The executor registry is the source of truth for valid action kinds.\n // Core executors are registered at startup; app executors are registered\n // dynamically when apps activate via AppRegistry.activate().\n // core:mountWidget is special-cased (handled by ActionEngine, not ExecutorRegistry).\n if (!hasExecutor(kind) && kind !== 'core:mountWidget') {\n const registered = executorRegistry.list();\n console.error(\n `[ActionValidation] Unknown action kind: \"${kind}\". ` +\n `Registered kinds (${registered.length}): [${registered.join(', ')}]. ` +\n `This usually means the app that provides \"${kind}\" hasn't been activated yet, ` +\n `or the executor was never registered in ExecutorRegistry.`\n );\n errors.push({\n code: 'UNKNOWN_KIND',\n message: `Unknown action kind: ${kind}`,\n field: 'kind',\n });\n return { valid: false, errors, warnings };\n }\n\n // Kind-specific validation\n switch (kind) {\n case 'overlays:highlight':\n case 'overlays:pulse':\n case 'navigation:scrollTo':\n validateAnchorAction(action as { anchorId: AnchorId }, errors, warnings);\n break;\n\n case 'overlays:badge':\n validateAnchorAction(action as { anchorId: AnchorId }, errors, warnings);\n validateBadgeAction(action as any, errors, warnings);\n break;\n\n case 'overlays:tooltip':\n validateAnchorAction(action as { anchorId: AnchorId }, errors, warnings);\n validateTooltipAction(action as any, errors, warnings);\n break;\n\n case 'overlays:modal':\n validateModalAction(action as any, errors, warnings);\n break;\n\n case 'content:insertHtml':\n validateAnchorAction(action as { anchorId: AnchorId }, errors, warnings);\n validateInsertHtmlAction(action as any, errors, warnings);\n break;\n\n case 'content:setText':\n validateAnchorAction(action as { anchorId: AnchorId }, errors, warnings);\n validateSetTextAction(action as any, errors, warnings);\n break;\n\n case 'content:setAttr':\n validateAnchorAction(action as { anchorId: AnchorId }, errors, warnings);\n validateSetAttrAction(action as any, errors, warnings);\n break;\n\n case 'content:addClass':\n case 'content:removeClass':\n validateAnchorAction(action as { anchorId: AnchorId }, errors, warnings);\n validateClassAction(action as any, errors, warnings);\n break;\n\n case 'content:setStyle':\n validateAnchorAction(action as { anchorId: AnchorId }, errors, warnings);\n validateSetStyleAction(action as any, errors, warnings);\n break;\n\n case 'core:mountWidget':\n validateMountWidgetAction(action as any, errors, warnings);\n break;\n\n case 'core:wait':\n validateWaitAction(action as any, errors, warnings);\n break;\n\n case 'core:sequence':\n validateSequenceAction(action as any, errors, warnings);\n break;\n\n case 'core:parallel':\n validateParallelAction(action as any, errors, warnings);\n break;\n\n case 'core:tour':\n validateTourAction(action as any, errors, warnings);\n break;\n\n case 'navigation:navigate':\n validateNavigateAction(action as any, errors, warnings);\n break;\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nfunction validateAnchorAction(\n action: { anchorId: AnchorId },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n const anchorId = action.anchorId;\n\n if (!anchorId || typeof anchorId !== 'object') {\n errors.push({\n code: 'MISSING_ANCHOR_ID',\n message: \"Action requires an 'anchorId' object with a 'selector' string\",\n field: 'anchorId',\n });\n return;\n }\n\n if (!anchorId.selector || typeof anchorId.selector !== 'string') {\n errors.push({\n code: 'MISSING_ANCHOR_SELECTOR',\n message: \"anchorId requires a 'selector' string\",\n field: 'anchorId.selector',\n });\n } else if (anchorId.selector.length > 200) {\n warnings.push({\n code: 'LONG_ANCHOR_ID',\n message: 'Anchor selector is unusually long',\n suggestion: 'Consider using a shorter, more descriptive selector',\n });\n }\n\n if (anchorId.route === undefined || anchorId.route === null) {\n errors.push({\n code: 'MISSING_ANCHOR_ROUTE',\n message:\n 'anchorId requires a \\'route\\' (string or array of strings). Use \"**\" for all routes.',\n field: 'anchorId.route',\n });\n } else {\n const routes = Array.isArray(anchorId.route) ? anchorId.route : [anchorId.route];\n for (const route of routes) {\n if (typeof route !== 'string') {\n errors.push({\n code: 'INVALID_ANCHOR_ROUTE',\n message: 'anchorId.route must be a string or array of strings',\n field: 'anchorId.route',\n });\n break;\n }\n }\n }\n}\n\nfunction validateBadgeAction(\n action: { content: string },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.content || typeof action.content !== 'string') {\n errors.push({\n code: 'MISSING_CONTENT',\n message: \"Badge action requires 'content' property\",\n field: 'content',\n });\n } else if (action.content.length > 100) {\n warnings.push({\n code: 'LONG_BADGE_CONTENT',\n message: 'Badge content is quite long',\n suggestion: 'Keep badge content short (under 100 characters)',\n });\n }\n}\n\nfunction validateTooltipAction(\n action: { content: { title?: string; body: string } },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.content || typeof action.content !== 'object') {\n errors.push({\n code: 'MISSING_CONTENT',\n message: \"Tooltip action requires 'content' object\",\n field: 'content',\n });\n return;\n }\n\n if (!action.content.body || typeof action.content.body !== 'string') {\n errors.push({\n code: 'MISSING_BODY',\n message: \"Tooltip content requires 'body' property\",\n field: 'content.body',\n });\n }\n}\n\nfunction validateInsertHtmlAction(\n action: { html: string; position: string },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.html || typeof action.html !== 'string') {\n errors.push({\n code: 'MISSING_HTML',\n message: \"insertHtml action requires 'html' property\",\n field: 'html',\n });\n } else if (action.html.length > MAX_HTML_LENGTH) {\n errors.push({\n code: 'HTML_TOO_LONG',\n message: `HTML content exceeds maximum length of ${MAX_HTML_LENGTH}`,\n field: 'html',\n });\n }\n\n const validPositions = ['before', 'after', 'prepend', 'append', 'replace'];\n if (!action.position || !validPositions.includes(action.position)) {\n errors.push({\n code: 'INVALID_POSITION',\n message: `Position must be one of: ${validPositions.join(', ')}`,\n field: 'position',\n });\n }\n}\n\nfunction validateSetTextAction(\n action: { text: string },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (action.text === undefined || action.text === null) {\n errors.push({\n code: 'MISSING_TEXT',\n message: \"setText action requires 'text' property\",\n field: 'text',\n });\n }\n}\n\nfunction validateSetAttrAction(\n action: { attr: string; value: string },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.attr || typeof action.attr !== 'string') {\n errors.push({\n code: 'MISSING_ATTR',\n message: \"setAttr action requires 'attr' property\",\n field: 'attr',\n });\n } else if (\n DANGEROUS_ATTRS.has(action.attr.toLowerCase()) ||\n action.attr.toLowerCase().startsWith('on')\n ) {\n errors.push({\n code: 'DANGEROUS_ATTR',\n message: `Event handler attributes are not allowed: ${action.attr}`,\n field: 'attr',\n });\n }\n\n if (action.value === undefined || action.value === null) {\n errors.push({\n code: 'MISSING_VALUE',\n message: \"setAttr action requires 'value' property\",\n field: 'value',\n });\n }\n}\n\nfunction validateClassAction(\n action: { className: string },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.className || typeof action.className !== 'string') {\n errors.push({\n code: 'MISSING_CLASS_NAME',\n message: \"Class action requires 'className' property\",\n field: 'className',\n });\n } else if (!/^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(action.className)) {\n warnings.push({\n code: 'INVALID_CLASS_NAME',\n message: 'Class name contains unusual characters',\n suggestion: 'Use alphanumeric characters, hyphens, and underscores',\n });\n }\n}\n\nfunction validateSetStyleAction(\n action: { styles: Record<string, string> },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.styles || typeof action.styles !== 'object') {\n errors.push({\n code: 'MISSING_STYLES',\n message: \"setStyle action requires 'styles' object\",\n field: 'styles',\n });\n } else {\n const styleCount = Object.keys(action.styles).length;\n if (styleCount > MAX_STYLE_COUNT) {\n errors.push({\n code: 'TOO_MANY_STYLES',\n message: `Too many styles (${styleCount}). Maximum is ${MAX_STYLE_COUNT}`,\n field: 'styles',\n });\n }\n\n // Check for potentially dangerous style values\n for (const [prop, value] of Object.entries(action.styles)) {\n if (typeof value === 'string' && value.includes('expression(')) {\n errors.push({\n code: 'DANGEROUS_STYLE',\n message: `Style expressions are not allowed: ${prop}`,\n field: `styles.${prop}`,\n });\n }\n }\n }\n}\n\nfunction validateMountWidgetAction(\n action: { slot: string; widget: { widgetId: string } },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.slot || typeof action.slot !== 'string') {\n errors.push({\n code: 'MISSING_SLOT',\n message: \"mountWidget action requires 'slot' property\",\n field: 'slot',\n });\n }\n\n if (!action.widget || typeof action.widget !== 'object') {\n errors.push({\n code: 'MISSING_WIDGET',\n message: \"mountWidget action requires 'widget' object\",\n field: 'widget',\n });\n } else if (!action.widget.widgetId || typeof action.widget.widgetId !== 'string') {\n errors.push({\n code: 'MISSING_WIDGET_ID',\n message: \"Widget must have a 'widgetId' property\",\n field: 'widget.widgetId',\n });\n }\n}\n\nfunction validateWaitAction(\n action: { durationMs?: number; event?: string },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (action.durationMs === undefined && !action.event) {\n errors.push({\n code: 'MISSING_WAIT_CONFIG',\n message: \"wait action requires either 'durationMs' or 'event' property\",\n });\n }\n\n if (action.durationMs !== undefined && action.durationMs < 0) {\n errors.push({\n code: 'INVALID_DURATION',\n message: 'durationMs must be a positive number',\n field: 'durationMs',\n });\n }\n\n if (action.event !== undefined && typeof action.event !== 'string') {\n errors.push({\n code: 'INVALID_EVENT',\n message: 'event must be a string',\n field: 'event',\n });\n }\n}\n\nfunction validateSequenceAction(\n action: { actions: ActionStep[] },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.actions || !Array.isArray(action.actions)) {\n errors.push({\n code: 'MISSING_ACTIONS',\n message: \"sequence action requires 'actions' array\",\n field: 'actions',\n });\n return;\n }\n\n if (action.actions.length === 0) {\n warnings.push({\n code: 'EMPTY_SEQUENCE',\n message: 'sequence has no actions',\n suggestion: 'Add at least one action to the sequence',\n });\n }\n\n // Recursively validate nested actions\n for (let i = 0; i < action.actions.length; i++) {\n const result = validateAction(action.actions[i]);\n for (const error of result.errors) {\n errors.push({\n ...error,\n field: `actions[${i}]${error.field ? `.${error.field}` : ''}`,\n });\n }\n for (const warning of result.warnings) {\n warnings.push(warning);\n }\n }\n}\n\nfunction validateParallelAction(\n action: { actions: ActionStep[]; waitFor?: string },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.actions || !Array.isArray(action.actions)) {\n errors.push({\n code: 'MISSING_ACTIONS',\n message: \"parallel action requires 'actions' array\",\n field: 'actions',\n });\n return;\n }\n\n if (action.actions.length === 0) {\n warnings.push({\n code: 'EMPTY_PARALLEL',\n message: 'parallel has no actions',\n suggestion: 'Add at least one action to the parallel group',\n });\n }\n\n if (action.waitFor && !['all', 'any'].includes(action.waitFor)) {\n errors.push({\n code: 'INVALID_WAIT_FOR',\n message: \"waitFor must be 'all' or 'any'\",\n field: 'waitFor',\n });\n }\n\n // Recursively validate nested actions\n for (let i = 0; i < action.actions.length; i++) {\n const result = validateAction(action.actions[i]);\n for (const error of result.errors) {\n errors.push({\n ...error,\n field: `actions[${i}]${error.field ? `.${error.field}` : ''}`,\n });\n }\n for (const warning of result.warnings) {\n warnings.push(warning);\n }\n }\n}\n\nfunction validateNavigateAction(\n action: { url: string },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.url || typeof action.url !== 'string') {\n errors.push({\n code: 'MISSING_URL',\n message: \"navigate action requires 'url' property\",\n field: 'url',\n });\n } else {\n const url = action.url.trim().toLowerCase();\n if (url.startsWith('javascript:')) {\n errors.push({\n code: 'DANGEROUS_URL',\n message: 'javascript: URLs are not allowed',\n field: 'url',\n });\n }\n\n // Warn about data: URLs\n if (url.startsWith('data:')) {\n warnings.push({\n code: 'DATA_URL',\n message: 'data: URLs may have limited support',\n suggestion: 'Consider using a regular URL instead',\n });\n }\n }\n}\n\nfunction validateModalAction(\n action: {\n content: { title?: string; body: string };\n size?: string;\n ctaButtons?: { label: string; actionId: string }[];\n },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.content || typeof action.content !== 'object') {\n errors.push({\n code: 'MISSING_CONTENT',\n message: \"Modal action requires 'content' object\",\n field: 'content',\n });\n return;\n }\n\n if (!action.content.body || typeof action.content.body !== 'string') {\n errors.push({\n code: 'MISSING_BODY',\n message: \"Modal content requires 'body' property\",\n field: 'content.body',\n });\n }\n\n if (action.size && !['sm', 'md', 'lg'].includes(action.size)) {\n errors.push({\n code: 'INVALID_SIZE',\n message: \"Modal size must be 'sm', 'md', or 'lg'\",\n field: 'size',\n });\n }\n\n if (action.ctaButtons) {\n if (!Array.isArray(action.ctaButtons)) {\n errors.push({\n code: 'INVALID_CTA_BUTTONS',\n message: 'ctaButtons must be an array',\n field: 'ctaButtons',\n });\n } else {\n for (let i = 0; i < action.ctaButtons.length; i++) {\n const btn = action.ctaButtons[i];\n if (!btn.label || typeof btn.label !== 'string') {\n errors.push({\n code: 'MISSING_BUTTON_LABEL',\n message: `CTA button at index ${i} requires 'label' property`,\n field: `ctaButtons[${i}].label`,\n });\n }\n if (!btn.actionId || typeof btn.actionId !== 'string') {\n errors.push({\n code: 'MISSING_BUTTON_ACTION_ID',\n message: `CTA button at index ${i} requires 'actionId' property`,\n field: `ctaButtons[${i}].actionId`,\n });\n }\n }\n }\n }\n}\n\nfunction validateTourAction(\n action: {\n tourId: string;\n steps: { id: string; action: ActionStep; route?: string; onAction?: Record<string, string> }[];\n },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.tourId || typeof action.tourId !== 'string') {\n errors.push({\n code: 'MISSING_TOUR_ID',\n message: \"Tour action requires 'tourId' property\",\n field: 'tourId',\n });\n }\n\n if (!action.steps || !Array.isArray(action.steps)) {\n errors.push({\n code: 'MISSING_STEPS',\n message: \"Tour action requires 'steps' array\",\n field: 'steps',\n });\n return;\n }\n\n if (action.steps.length === 0) {\n errors.push({\n code: 'EMPTY_STEPS',\n message: 'Tour must have at least one step',\n field: 'steps',\n });\n }\n\n const stepIds = new Set<string>();\n for (let i = 0; i < action.steps.length; i++) {\n const step = action.steps[i];\n\n if (!step.id || typeof step.id !== 'string') {\n errors.push({\n code: 'MISSING_STEP_ID',\n message: `Step at index ${i} requires 'id' property`,\n field: `steps[${i}].id`,\n });\n } else {\n if (stepIds.has(step.id)) {\n errors.push({\n code: 'DUPLICATE_STEP_ID',\n message: `Duplicate step ID: ${step.id}`,\n field: `steps[${i}].id`,\n });\n }\n stepIds.add(step.id);\n }\n\n if (!step.action) {\n errors.push({\n code: 'MISSING_STEP_ACTION',\n message: `Step at index ${i} requires 'action' property`,\n field: `steps[${i}].action`,\n });\n } else {\n // Recursively validate nested action\n const result = validateAction(step.action);\n for (const error of result.errors) {\n errors.push({\n ...error,\n field: `steps[${i}].action${error.field ? `.${error.field}` : ''}`,\n });\n }\n for (const warning of result.warnings) {\n warnings.push(warning);\n }\n }\n\n // Validate onAction references\n if (step.onAction) {\n for (const [_actionId, targetStepId] of Object.entries(step.onAction)) {\n if (targetStepId !== 'end' && !action.steps.some((s) => s.id === targetStepId)) {\n warnings.push({\n code: 'UNKNOWN_TARGET_STEP',\n message: `Step \"${step.id}\" references unknown target step: ${targetStepId}`,\n suggestion: `Make sure step \"${targetStepId}\" exists in the tour`,\n });\n }\n }\n }\n }\n}\n\n/**\n * Validate a batch of actions.\n */\nexport function validateActions(actions: ActionStep[]): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n if (!Array.isArray(actions)) {\n console.error('[ActionValidation] validateActions called with non-array:', typeof actions);\n errors.push({\n code: 'INVALID_ACTIONS',\n message: 'Actions must be an array',\n });\n return { valid: false, errors, warnings };\n }\n\n for (let i = 0; i < actions.length; i++) {\n const result = validateAction(actions[i]);\n if (!result.valid) {\n const action = actions[i] as any;\n console.error(\n `[ActionValidation] Action [${i}] failed validation:`,\n `kind=\"${action?.kind ?? 'undefined'}\"`,\n result.errors.map((e) => `${e.code}: ${e.message}`).join('; '),\n action\n );\n }\n for (const error of result.errors) {\n errors.push({\n ...error,\n field: error.field ? `[${i}].${error.field}` : `[${i}]`,\n });\n }\n for (const warning of result.warnings) {\n warnings.push({\n ...warning,\n suggestion: warning.suggestion ? `Action ${i}: ${warning.suggestion}` : undefined,\n });\n }\n }\n\n if (errors.length > 0) {\n console.error(\n `[ActionValidation] Batch validation failed: ${errors.length} error(s) in ${actions.length} action(s).`,\n errors.map((e) => `${e.field ?? '?'}: ${e.message}`).join(' | ')\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n", "/**\n * ActionEngine\n *\n * Unified execution layer for interventions. Provides a high-level API for\n * applying, reverting, and managing action steps.\n */\n\nimport type { DecisionStrategy } from '../decisions/types';\nimport { executorRegistry as defaultExecutorRegistry } from './executors';\nimport type {\n ActionEngine,\n ActionEngineOptions,\n ActionHandle,\n ActionState,\n ActionStep,\n ActiveAction,\n BatchActionHandle,\n ExecutorContext,\n ExecutorResult,\n MountWidgetAction,\n ValidationResult,\n} from './types';\nimport { validateAction, validateActions } from './validation';\n\n/** Counter for generating unique action IDs */\nlet actionIdCounter = 0;\n\n/**\n * Create an ActionEngine instance.\n */\nexport function createActionEngine(options: ActionEngineOptions): ActionEngine {\n const {\n overlayRoot,\n eventBus,\n surfaces,\n anchorResolver,\n waitForAnchor,\n adaptiveId,\n executorRegistry = defaultExecutorRegistry,\n subscribeNavigation,\n runtime,\n } = options;\n\n /** Map of active actions by ID */\n const activeActions = new Map<string, InternalActionEntry>();\n\n /** Unsubscribe functions for conditional action subscriptions */\n const conditionalUnsubs = new Map<string, Array<() => void>>();\n\n /**\n * Generate a unique action ID.\n */\n function generateId(): string {\n return `action-${++actionIdCounter}`;\n }\n\n /**\n * Publish an event to the EventBus if available.\n */\n function publishEvent(name: string, props?: Record<string, unknown>): void {\n if (eventBus) {\n eventBus.publish(name, props);\n }\n }\n\n /**\n * Create the executor context.\n */\n function createExecutorContext(): ExecutorContext {\n return {\n overlayRoot,\n resolveAnchor: anchorResolver,\n waitForAnchor,\n generateId,\n publishEvent,\n adaptiveId,\n // Allow composite executors (like tours) to execute nested actions\n applyAction: apply,\n // Allow composite executors to subscribe to events\n subscribeEvent: eventBus\n ? (name: string, callback: (props?: Record<string, unknown>) => void) =>\n eventBus.subscribe({ names: [name] }, (event) => callback(event.props))\n : undefined,\n // Allow composite executors to subscribe to navigation changes\n subscribeNavigation,\n };\n }\n\n /**\n * Execute a mountWidget action via Surfaces.\n */\n async function executeMountWidget(\n action: MountWidgetAction,\n context: ExecutorContext\n ): Promise<ExecutorResult> {\n if (!surfaces) {\n throw new Error('Surfaces provider required for core:mountWidget actions');\n }\n\n const handle = surfaces.mount(\n action.slot,\n {\n type: 'widget',\n widgetId: action.widget.widgetId,\n config: action.widget.props,\n },\n {\n priority: action.widget.priority,\n }\n );\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'core:mountWidget',\n slot: action.slot,\n widgetId: action.widget.widgetId,\n });\n\n return {\n cleanup: () => {\n handle.unmount();\n },\n updateFn: (changes) => {\n if ('widget' in changes && changes.widget) {\n const w = changes.widget as { props?: Record<string, unknown> };\n if (w.props) {\n handle.update({\n type: 'widget',\n widgetId: action.widget.widgetId,\n config: w.props,\n });\n }\n }\n },\n };\n }\n\n /**\n * Execute an action through the executor pipeline (mountWidget or registry).\n * Returns the ExecutorResult with cleanup/updateFn.\n */\n async function executeAction(\n action: ActionStep,\n context: ExecutorContext\n ): Promise<ExecutorResult> {\n if (action.kind === 'core:mountWidget') {\n return executeMountWidget(action as MountWidgetAction, context);\n }\n\n const executor = executorRegistry.get(action.kind);\n if (!executor) {\n const registered =\n 'list' in executorRegistry ? (executorRegistry as any).list() : '(list unavailable)';\n console.error(\n `[ActionEngine] No executor for kind=\"${action.kind}\".`,\n `Registered: [${registered}]`\n );\n throw new Error(`No executor for action kind: ${action.kind}`);\n }\n return executor(action, context);\n }\n\n /**\n * Subscribe for reactive re-evaluation of a conditional action.\n * When context or accumulator changes, re-evaluates triggerWhen and\n * applies/defers accordingly.\n */\n function subscribeForReeval(\n id: string,\n action: ActionStep,\n triggerWhen: DecisionStrategy<boolean>,\n handle: ActionHandle\n ): void {\n if (!runtime) return;\n\n const unsubs: Array<() => void> = [];\n\n const onReeval = async () => {\n const entry = activeActions.get(id);\n if (!entry) return;\n\n const result = runtime.evaluateSync<boolean>(triggerWhen);\n const shouldApply = result.value;\n\n if (entry.state === 'applied' && !shouldApply) {\n // Revert: condition flipped to false\n try {\n await entry.cleanup();\n } catch (error) {\n console.error(`[ActionEngine] Error reverting conditional action ${id}:`, error);\n }\n entry.state = 'deferred';\n entry.cleanup = () => {};\n entry.updateFn = undefined;\n publishEvent('action.deferred', { id, kind: action.kind });\n } else if (entry.state === 'deferred' && shouldApply) {\n // Apply: condition flipped to true\n try {\n const context = createExecutorContext();\n const execResult = await executeAction(action, context);\n entry.state = 'applied';\n entry.cleanup = execResult.cleanup;\n entry.updateFn = execResult.updateFn;\n entry.appliedTs = Date.now();\n publishEvent('action.applied', {\n id,\n kind: action.kind,\n anchorId: 'anchorId' in action ? action.anchorId : undefined,\n });\n } catch (error) {\n console.error(`[ActionEngine] Error applying deferred action ${id}:`, error);\n entry.state = 'failed';\n }\n }\n };\n\n if (runtime.context) {\n unsubs.push(runtime.context.subscribe(onReeval));\n }\n if (runtime.accumulator) {\n unsubs.push(runtime.accumulator.subscribe(onReeval));\n }\n\n conditionalUnsubs.set(id, unsubs);\n }\n\n /**\n * Apply a single action.\n */\n async function apply(action: ActionStep): Promise<ActionHandle> {\n const validation = validateAction(action);\n if (!validation.valid) {\n const errorMessages = validation.errors.map((e) => e.message).join('; ');\n console.error(\n `[ActionEngine] Validation failed for action kind=\"${(action as any)?.kind}\":`,\n errorMessages,\n action\n );\n throw new Error(`Action validation failed: ${errorMessages}`);\n }\n\n const id = generateId();\n\n // Check for conditional execution via triggerWhen\n const triggerWhen = (action as any).triggerWhen as DecisionStrategy<boolean> | null | undefined;\n\n if (triggerWhen && runtime) {\n const evalResult = runtime.evaluateSync<boolean>(triggerWhen);\n\n if (!evalResult.value) {\n // Condition is false \u2014 defer the action\n const entry: InternalActionEntry = {\n id,\n action,\n adaptiveId,\n appliedTs: Date.now(),\n state: 'deferred',\n cleanup: () => {},\n };\n activeActions.set(id, entry);\n\n const handle: ActionHandle = {\n id,\n action,\n\n async revert(): Promise<void> {\n const entry = activeActions.get(id);\n if (!entry) return;\n // Clean up subscriptions\n const unsubs = conditionalUnsubs.get(id);\n if (unsubs) {\n for (const unsub of unsubs) unsub();\n conditionalUnsubs.delete(id);\n }\n entry.state = 'reverted';\n activeActions.delete(id);\n },\n\n isApplied(): boolean {\n const entry = activeActions.get(id);\n return entry?.state === 'applied';\n },\n\n async update(changes: Partial<ActionStep>): Promise<void> {\n const entry = activeActions.get(id);\n if (!entry || entry.state !== 'applied') {\n throw new Error('Cannot update action that is not applied');\n }\n if (entry.updateFn) {\n await entry.updateFn(changes);\n } else {\n throw new Error(`Action kind ${action.kind} does not support updates`);\n }\n },\n\n getState(): ActionState {\n const entry = activeActions.get(id);\n return entry?.state ?? 'reverted';\n },\n };\n\n // Subscribe for re-evaluation so it can flip to applied later\n subscribeForReeval(id, action, triggerWhen, handle);\n\n return handle;\n }\n\n // Condition is true \u2014 fall through to normal execution below,\n // but we will also subscribe for re-evaluation after execution\n }\n\n const context = createExecutorContext();\n const result = await executeAction(action, context);\n\n // Track active action\n const entry: InternalActionEntry = {\n id,\n action,\n adaptiveId,\n appliedTs: Date.now(),\n state: 'applied',\n cleanup: result.cleanup,\n updateFn: result.updateFn,\n };\n activeActions.set(id, entry);\n\n // Publish applied event\n publishEvent('action.applied', {\n id,\n kind: action.kind,\n anchorId: 'anchorId' in action ? action.anchorId : undefined,\n });\n\n // Create and return handle\n const handle: ActionHandle = {\n id,\n action,\n\n async revert(): Promise<void> {\n const entry = activeActions.get(id);\n if (!entry || entry.state !== 'applied') return;\n\n // Clean up conditional subscriptions if any\n const unsubs = conditionalUnsubs.get(id);\n if (unsubs) {\n for (const unsub of unsubs) unsub();\n conditionalUnsubs.delete(id);\n }\n\n try {\n await entry.cleanup();\n entry.state = 'reverted';\n publishEvent('action.reverted', { id, kind: action.kind });\n } catch (error) {\n // Swallow cleanup errors \u2014 DOM nodes may already be gone after SPA\n // navigation. Re-throwing here would crash the SDK's React tree.\n console.warn(`[ActionEngine] Cleanup error for ${action.kind} (${id}), ignoring:`, error);\n entry.state = 'reverted';\n publishEvent('action.reverted', { id, kind: action.kind });\n } finally {\n activeActions.delete(id);\n }\n },\n\n isApplied(): boolean {\n const entry = activeActions.get(id);\n return entry?.state === 'applied';\n },\n\n async update(changes: Partial<ActionStep>): Promise<void> {\n const entry = activeActions.get(id);\n if (!entry || entry.state !== 'applied') {\n throw new Error('Cannot update action that is not applied');\n }\n\n if (entry.updateFn) {\n await entry.updateFn(changes);\n } else {\n throw new Error(`Action kind ${action.kind} does not support updates`);\n }\n },\n\n getState(): ActionState {\n const entry = activeActions.get(id);\n return entry?.state ?? 'reverted';\n },\n };\n\n // If this action has a triggerWhen (and evaluated true), subscribe for re-evaluation\n if (triggerWhen && runtime) {\n subscribeForReeval(id, action, triggerWhen, handle);\n }\n\n return handle;\n }\n\n /**\n * Apply multiple actions as a batch.\n */\n async function applyBatch(actions: ActionStep[]): Promise<BatchActionHandle> {\n console.log(\n `[ActionEngine] applyBatch: ${actions.length} action(s)`,\n actions.map((a: any) => a.kind).join(', ')\n );\n\n const validation = validateActions(actions);\n if (!validation.valid) {\n const errorMessages = validation.errors.map((e) => e.message).join('; ');\n console.error(\n `[ActionEngine] Batch validation FAILED for ${actions.length} action(s):`,\n errorMessages,\n '\\nActions:',\n actions\n .map(\n (a: any, i: number) =>\n ` [${i}] ${a.kind} ${a.anchorId ? `anchor=\"${a.anchorId.selector}\"` : ''} ${a.label ? `label=\"${a.label}\"` : ''}`\n )\n .join('\\n')\n );\n throw new Error(`Batch validation failed: ${errorMessages}`);\n }\n\n const batchId = generateId();\n const handles: ActionHandle[] = [];\n const appliedHandles: ActionHandle[] = [];\n\n try {\n for (const action of actions) {\n const handle = await apply(action);\n handles.push(handle);\n appliedHandles.push(handle);\n }\n } catch (error) {\n console.error(\n `[ActionEngine] Batch apply FAILED at action ${appliedHandles.length + 1}/${actions.length}.`,\n `Successfully applied: ${appliedHandles.length}. Rolling back...`,\n error\n );\n // Rollback on failure\n for (const handle of appliedHandles) {\n try {\n await handle.revert();\n } catch {\n // Ignore cleanup errors during rollback\n }\n }\n throw error;\n }\n\n const batchHandle: BatchActionHandle = {\n id: batchId,\n handles,\n\n async revertAll(): Promise<void> {\n // Revert in reverse order\n for (let i = handles.length - 1; i >= 0; i--) {\n try {\n await handles[i].revert();\n } catch (error) {\n console.error(`[ActionEngine] Error reverting action ${handles[i].id}:`, error);\n }\n }\n },\n\n isApplied(): boolean {\n return handles.every((h) => h.isApplied());\n },\n };\n\n return batchHandle;\n }\n\n /**\n * Validate an action without applying it.\n */\n function validate(action: ActionStep): ValidationResult {\n return validateAction(action);\n }\n\n /**\n * Get all currently active actions.\n */\n function getActive(): ActiveAction[] {\n // biome-ignore lint: intentional field mapping to ActiveAction interface (excludes internal fields)\n return Array.from(activeActions.values()).map((entry) => ({\n id: entry.id,\n action: entry.action,\n adaptiveId: entry.adaptiveId,\n appliedTs: entry.appliedTs,\n state: entry.state,\n }));\n }\n\n /**\n * Clean up all active actions.\n */\n function destroy(): void {\n // Clean up all conditional subscriptions\n for (const unsubs of conditionalUnsubs.values()) {\n for (const unsub of unsubs) {\n try {\n unsub();\n } catch {\n // Ignore unsubscribe errors during destroy\n }\n }\n }\n conditionalUnsubs.clear();\n\n // Revert all active actions\n for (const entry of activeActions.values()) {\n if (entry.state === 'applied') {\n try {\n entry.cleanup();\n } catch (error) {\n console.error(`[ActionEngine] Error during cleanup:`, error);\n }\n }\n }\n activeActions.clear();\n }\n\n return {\n apply,\n applyBatch,\n validate,\n getActive,\n destroy,\n };\n}\n\n/**\n * Internal tracking entry for active actions.\n */\ninterface InternalActionEntry {\n id: string;\n action: ActionStep;\n adaptiveId?: string;\n appliedTs: number;\n state: ActionState;\n cleanup: () => void | Promise<void>;\n updateFn?: (changes: Partial<ActionStep>) => void | Promise<void>;\n}\n", "/**\n * AnchorResolver \u2014 Centralized DOM observation for anchor element resolution.\n *\n * Provides a single MutationObserver that multiple callers share to wait for\n * DOM elements to appear. Replaces scattered observation mechanisms.\n */\n\nexport interface AnchorResolverOptions {\n root?: HTMLElement;\n defaultTimeoutMs?: number;\n}\n\nexport interface AnchorResolver {\n resolve(selector: string): HTMLElement | null;\n waitFor(selector: string, timeoutMs?: number): Promise<HTMLElement>;\n onAppear(selector: string, cb: (el: HTMLElement) => void): () => void;\n pendingCount(): number;\n destroy(): void;\n}\n\ninterface Waiter {\n resolve: (el: HTMLElement) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\ninterface AppearWatcher {\n cb: (el: HTMLElement) => void;\n cancelled: boolean;\n}\n\nexport function createAnchorResolver(opts?: AnchorResolverOptions): AnchorResolver {\n const root = opts?.root ?? (typeof document !== 'undefined' ? document.body : null);\n const defaultTimeoutMs = opts?.defaultTimeoutMs ?? 5000;\n\n const waiters = new Map<string, Set<Waiter>>();\n const appearWatchers = new Map<string, Set<AppearWatcher>>();\n let observer: MutationObserver | null = null;\n let destroyed = false;\n\n function resolve(selector: string): HTMLElement | null {\n if (!root) return null;\n try {\n // root.querySelector won't find root itself (body), so check if root matches\n if (root.matches(selector)) return root;\n return root.querySelector(selector) as HTMLElement | null;\n } catch {\n return null;\n }\n }\n\n function checkPending(): void {\n // Check waiters\n for (const [selector, set] of waiters) {\n const el = resolve(selector);\n if (el) {\n for (const w of set) {\n clearTimeout(w.timer);\n w.resolve(el);\n }\n waiters.delete(selector);\n }\n }\n\n // Check appear watchers\n for (const [selector, set] of appearWatchers) {\n const el = resolve(selector);\n if (el) {\n for (const watcher of set) {\n if (!watcher.cancelled) {\n watcher.cb(el);\n }\n }\n appearWatchers.delete(selector);\n }\n }\n\n // Disconnect observer if nothing left to watch\n if (waiters.size === 0 && appearWatchers.size === 0) {\n disconnectObserver();\n }\n }\n\n function ensureObserver(): void {\n if (observer || destroyed) return;\n if (typeof MutationObserver === 'undefined' || !root) return;\n\n observer = new MutationObserver(() => {\n checkPending();\n });\n observer.observe(root, { childList: true, subtree: true });\n }\n\n function disconnectObserver(): void {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n }\n\n function removeWaiter(selector: string, waiter: Waiter): void {\n const set = waiters.get(selector);\n if (set) {\n set.delete(waiter);\n if (set.size === 0) {\n waiters.delete(selector);\n }\n }\n if (waiters.size === 0 && appearWatchers.size === 0) {\n disconnectObserver();\n }\n }\n\n function waitFor(selector: string, timeoutMs?: number): Promise<HTMLElement> {\n if (destroyed) {\n return Promise.reject(new Error('AnchorResolver destroyed'));\n }\n\n // Check synchronously first\n const existing = resolve(selector);\n if (existing) return Promise.resolve(existing);\n\n const timeout = timeoutMs ?? defaultTimeoutMs;\n\n return new Promise<HTMLElement>((res, rej) => {\n const waiter: Waiter = {\n resolve: res,\n reject: rej,\n timer: setTimeout(() => {\n removeWaiter(selector, waiter);\n rej(new Error(`waitFor(\"${selector}\") timed out after ${timeout}ms`));\n }, timeout),\n };\n\n let set = waiters.get(selector);\n if (!set) {\n set = new Set();\n waiters.set(selector, set);\n }\n set.add(waiter);\n\n ensureObserver();\n });\n }\n\n function onAppear(selector: string, cb: (el: HTMLElement) => void): () => void {\n if (destroyed) return () => {};\n\n // Fire immediately if element exists\n const existing = resolve(selector);\n if (existing) {\n cb(existing);\n return () => {};\n }\n\n const watcher: AppearWatcher = { cb, cancelled: false };\n\n let set = appearWatchers.get(selector);\n if (!set) {\n set = new Set();\n appearWatchers.set(selector, set);\n }\n set.add(watcher);\n\n ensureObserver();\n\n return () => {\n watcher.cancelled = true;\n const s = appearWatchers.get(selector);\n if (s) {\n s.delete(watcher);\n if (s.size === 0) {\n appearWatchers.delete(selector);\n }\n }\n if (waiters.size === 0 && appearWatchers.size === 0) {\n disconnectObserver();\n }\n };\n }\n\n function pendingCount(): number {\n let count = 0;\n for (const set of waiters.values()) {\n count += set.size;\n }\n return count;\n }\n\n function destroy(): void {\n destroyed = true;\n disconnectObserver();\n\n const err = new Error('AnchorResolver destroyed');\n for (const set of waiters.values()) {\n for (const w of set) {\n clearTimeout(w.timer);\n w.reject(err);\n }\n }\n waiters.clear();\n appearWatchers.clear();\n }\n\n return { resolve, waitFor, onAppear, pendingCount, destroy };\n}\n", "/**\n * ContextManager - Manages runtime context and notifies subscribers of changes.\n *\n * The ContextManager is responsible for:\n * - Collecting context from various sources (page, session, viewport)\n * - Notifying subscribers when context changes\n * - Providing the current context snapshot\n */\n\nimport type { RouteFilter } from '../decisions/types';\nimport type { NavigationMonitor } from '../navigation/NavigationMonitor';\nimport type { TelemetryClient } from '../telemetry/types';\n\nimport type {\n AnchorState,\n ContextChangeCallback,\n PageContext,\n PageHistoryEntry,\n RuntimeContext,\n Unsubscribe,\n ViewportContext,\n} from './types';\n\nexport interface ContextManagerOptions {\n /** Telemetry client for session ID */\n telemetry?: TelemetryClient;\n /** Routes config for route matching */\n routes?: RouteFilter;\n /** Initial page history (optional) */\n initialPageHistory?: PageHistoryEntry[];\n /** Centralized navigation monitor for History API change detection. */\n navigation: NavigationMonitor;\n}\n\n/**\n * Creates a default RuntimeContext.\n */\nfunction createDefaultContext(): RuntimeContext {\n const now = Date.now();\n return {\n page: {\n url: typeof window !== 'undefined' ? window.location.href : '',\n title: typeof document !== 'undefined' ? document.title : undefined,\n },\n session: {\n sessionId: '',\n startTs: now,\n pageHistory: [],\n },\n viewport: {\n width: typeof window !== 'undefined' ? window.innerWidth : 0,\n height: typeof window !== 'undefined' ? window.innerHeight : 0,\n },\n };\n}\n\n/**\n * Match a URL against route patterns from RouteFilter.\n * Returns the matched pattern or undefined.\n */\nfunction matchRoute(url: string, routes?: RouteFilter): string | undefined {\n if (!routes) return undefined;\n\n // Extract pathname from URL\n let pathname: string;\n try {\n pathname = new URL(url).pathname;\n } catch {\n pathname = url;\n }\n\n // Check exclude patterns first\n if (routes.exclude) {\n for (const pattern of routes.exclude) {\n if (matchPattern(pathname, pattern)) {\n return undefined; // Excluded route\n }\n }\n }\n\n // Check include patterns\n if (routes.include) {\n for (const pattern of routes.include) {\n if (matchPattern(pathname, pattern)) {\n return pattern;\n }\n }\n return undefined; // No match in include list\n }\n\n return pathname; // No include list, return pathname as route\n}\n\n/**\n * Simple pattern matching for routes.\n * Supports:\n * - Exact matches: \"/products\"\n * - Wildcard segments: \"/products/*\"\n * - Parameter segments: \"/products/:id\"\n */\nfunction matchPattern(pathname: string, pattern: string): boolean {\n // Normalize paths\n const normalizedPath = pathname.replace(/\\/$/, '') || '/';\n const normalizedPattern = pattern.replace(/\\/$/, '') || '/';\n\n // Exact match\n if (normalizedPath === normalizedPattern) return true;\n\n // Convert pattern to regex\n const regexPattern = normalizedPattern\n .replace(/:[^/]+/g, '[^/]+') // :param -> [^/]+\n .replace(/\\*/g, '.*'); // * -> .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(normalizedPath);\n}\n\n/**\n * ContextManager class for managing runtime context.\n */\nexport class ContextManager {\n private context: RuntimeContext;\n private previousContext: RuntimeContext;\n private listeners: Set<ContextChangeCallback> = new Set();\n private telemetry?: TelemetryClient;\n private routes?: RouteFilter;\n private navigation: NavigationMonitor;\n\n // Event listener cleanup functions\n private cleanupFns: Array<() => void> = [];\n\n constructor(options: ContextManagerOptions) {\n this.telemetry = options.telemetry;\n this.routes = options.routes;\n this.navigation = options.navigation;\n\n // Initialize context\n this.context = createDefaultContext();\n this.previousContext = { ...this.context };\n\n // Set initial session ID from telemetry\n if (options.telemetry?.getSessionId) {\n const sessionId = options.telemetry.getSessionId();\n if (sessionId) {\n this.context.session.sessionId = sessionId;\n }\n }\n\n // Set initial page history\n if (options.initialPageHistory) {\n this.context.session.pageHistory = options.initialPageHistory;\n }\n\n // Set initial route ID\n this.context.page.routeId = matchRoute(this.context.page.url, this.routes);\n\n // Add current page to history\n this.addPageToHistory(this.context.page.url);\n\n // Setup browser event listeners\n if (typeof window !== 'undefined') {\n this.setupBrowserListeners();\n }\n }\n\n /**\n * Get the current runtime context.\n */\n get(): RuntimeContext {\n return { ...this.context };\n }\n\n /**\n * Subscribe to context changes.\n * Returns an unsubscribe function.\n */\n subscribe(callback: ContextChangeCallback): Unsubscribe {\n this.listeners.add(callback);\n return () => {\n this.listeners.delete(callback);\n };\n }\n\n /**\n * Update the routes config (e.g., when config is fetched).\n */\n setRoutes(routes: RouteFilter): void {\n this.routes = routes;\n // Re-evaluate current route\n const newRouteId = matchRoute(this.context.page.url, this.routes);\n if (newRouteId !== this.context.page.routeId) {\n this.updateContext({ page: { ...this.context.page, routeId: newRouteId } });\n }\n }\n\n /**\n * Update anchor states.\n */\n setAnchors(anchors: AnchorState[]): void {\n this.updateContext({ anchors });\n }\n\n /**\n * Manually update the session ID (e.g., when telemetry initializes).\n */\n setSessionId(sessionId: string): void {\n if (sessionId !== this.context.session.sessionId) {\n this.updateContext({\n session: { ...this.context.session, sessionId },\n });\n }\n }\n\n /**\n * Clean up event listeners and subscriptions.\n */\n destroy(): void {\n for (const cleanup of this.cleanupFns) {\n cleanup();\n }\n this.cleanupFns = [];\n this.listeners.clear();\n }\n\n // ==================== Private Methods ====================\n\n private setupBrowserListeners(): void {\n // Viewport resize listener (debounced)\n let resizeTimeout: ReturnType<typeof setTimeout>;\n const handleResize = () => {\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(() => {\n this.updateViewport();\n }, 100);\n };\n window.addEventListener('resize', handleResize);\n this.cleanupFns.push(() => window.removeEventListener('resize', handleResize));\n\n // Navigation: subscribe to NavigationMonitor (single patch point for History API).\n const unsub = this.navigation.subscribe(() => this.updatePage());\n this.cleanupFns.push(unsub);\n }\n\n private updateViewport(): void {\n const newViewport: ViewportContext = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n\n if (\n newViewport.width !== this.context.viewport.width ||\n newViewport.height !== this.context.viewport.height\n ) {\n this.updateContext({ viewport: newViewport });\n }\n }\n\n private updatePage(): void {\n const url = window.location.href;\n const { title } = document;\n const routeId = matchRoute(url, this.routes);\n\n const newPage: PageContext = {\n url,\n title,\n routeId,\n };\n\n // Only update if something changed\n if (\n newPage.url !== this.context.page.url ||\n newPage.title !== this.context.page.title ||\n newPage.routeId !== this.context.page.routeId\n ) {\n // Add to page history if URL changed\n if (newPage.url !== this.context.page.url) {\n this.addPageToHistory(newPage.url);\n }\n\n this.updateContext({ page: newPage });\n }\n }\n\n private addPageToHistory(url: string): void {\n const entry: PageHistoryEntry = {\n url,\n ts: Date.now(),\n };\n\n const pageHistory = [...(this.context.session.pageHistory || []), entry];\n\n // Keep last 50 pages in history\n if (pageHistory.length > 50) {\n pageHistory.shift();\n }\n\n this.context.session.pageHistory = pageHistory;\n }\n\n private updateContext(partial: Partial<RuntimeContext>): void {\n // Save previous context\n this.previousContext = { ...this.context };\n\n // Merge updates\n this.context = {\n ...this.context,\n ...partial,\n };\n\n // Notify listeners\n this.notifyListeners();\n }\n\n private notifyListeners(): void {\n for (const callback of this.listeners) {\n try {\n callback(this.context, this.previousContext);\n } catch (err) {\n console.error('[ContextManager] Listener error:', err);\n }\n }\n }\n}\n\n/**\n * Create a ContextManager instance.\n */\nexport function createContextManager(options: ContextManagerOptions): ContextManager {\n return new ContextManager(options);\n}\n", "/**\n * Rule Strategy Evaluator\n *\n * Evaluates rules in order and returns the value of the first matching rule.\n */\nimport type {\n Condition,\n DecisionResult,\n EvaluationContext,\n EventCountCondition,\n Rule,\n RuleStrategy,\n} from '../types';\n\n/**\n * Evaluate a single condition against the evaluation context.\n */\nexport function evaluateCondition(condition: Condition, evalContext: EvaluationContext): boolean {\n const { context, state, events } = evalContext;\n\n switch (condition.type) {\n case 'page_url': {\n const { url } = condition;\n // Strip query string and hash \u2014 page_url patterns target the path, not params\n const currentUrl = context.page.url.split('?')[0].split('#')[0];\n\n // Simple pattern matching with wildcards\n // Use placeholder to prevent ** \u2192 .* from being clobbered by * \u2192 [^/]*\n const pattern = url\n .replace(/\\*\\*/g, '\\0GLOBSTAR\\0') // Protect ** with placeholder\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex chars except * and ?\n .replace(/\\*/g, '[^/]*') // * matches within single path segment\n .replace(/\\0GLOBSTAR\\0/g, '.*'); // ** matches anything (including /)\n\n const regex = new RegExp(`^${pattern}$`);\n return regex.test(currentUrl);\n }\n\n case 'route': {\n return context.page.routeId === condition.routeId;\n }\n\n case 'anchor_visible': {\n const anchor = context.anchors?.find((a) => a.anchorId === condition.anchorId);\n\n switch (condition.state) {\n case 'visible':\n return anchor?.visible === true;\n case 'present':\n return anchor?.present === true;\n case 'absent':\n return !anchor?.present;\n default:\n return false;\n }\n }\n\n case 'event_occurred': {\n if (!events) return false;\n const withinMs = condition.withinMs ?? 60000; // Default 1 minute\n return events.hasRecentEvent(condition.eventName, withinMs);\n }\n\n case 'state_equals': {\n if (!state?.getValue) return false;\n const actual = state.getValue(condition.key);\n return actual === condition.value;\n }\n\n case 'viewport': {\n const { width, height } = context.viewport;\n if (condition.minWidth !== undefined && width < condition.minWidth) return false;\n if (condition.maxWidth !== undefined && width > condition.maxWidth) return false;\n if (condition.minHeight !== undefined && height < condition.minHeight) return false;\n if (condition.maxHeight !== undefined && height > condition.maxHeight) return false;\n return true;\n }\n\n case 'session_metric': {\n if (!state) return false;\n const metricValue = state.getSessionMetric(condition.key);\n const { operator, threshold } = condition;\n\n switch (operator) {\n case 'gte':\n return metricValue >= threshold;\n case 'lte':\n return metricValue <= threshold;\n case 'eq':\n return metricValue === threshold;\n case 'gt':\n return metricValue > threshold;\n case 'lt':\n return metricValue < threshold;\n default:\n return false;\n }\n }\n\n case 'dismissed': {\n if (!state) return condition.inverted ?? false;\n const isDismissed = state.isDismissed(condition.key);\n return condition.inverted ? !isDismissed : isDismissed;\n }\n\n case 'cooldown_active': {\n if (!state) return condition.inverted ?? false;\n const isActive = state.isCooldownActive(condition.key);\n return condition.inverted ? !isActive : isActive;\n }\n\n case 'frequency_limit': {\n if (!state) return condition.inverted ?? false;\n const count = state.getFrequencyCount(condition.key);\n const limitReached = count >= condition.limit;\n return condition.inverted ? !limitReached : limitReached;\n }\n\n case 'event_count': {\n if (!evalContext.accumulator) return false;\n const ec = condition as EventCountCondition;\n const count = evalContext.accumulator.getCount(ec.key, ec.withinMs);\n switch (ec.operator) {\n case 'gte':\n return count >= ec.count;\n case 'lte':\n return count <= ec.count;\n case 'eq':\n return count === ec.count;\n case 'gt':\n return count > ec.count;\n case 'lt':\n return count < ec.count;\n default:\n return false;\n }\n }\n\n default:\n // Unknown condition type - fail closed (return false)\n console.warn('[RuleStrategy] Unknown condition type:', (condition as any).type);\n return false;\n }\n}\n\n/**\n * Evaluate a single rule (all conditions must be true).\n */\nexport function evaluateRule(\n rule: Rule,\n evalContext: EvaluationContext\n): { matched: boolean; conditionResults: Array<{ condition: Condition; result: boolean }> } {\n const conditionResults: Array<{ condition: Condition; result: boolean }> = [];\n\n for (const condition of rule.conditions) {\n const result = evaluateCondition(condition, evalContext);\n conditionResults.push({ condition, result });\n\n // Short-circuit: if any condition fails, rule doesn't match\n if (!result) {\n return { matched: false, conditionResults };\n }\n }\n\n // All conditions passed\n return { matched: true, conditionResults };\n}\n\n/**\n * Evaluate a RuleStrategy and return the result.\n */\nexport function evaluateRuleStrategy<T>(\n strategy: RuleStrategy<T>,\n evalContext: EvaluationContext\n): DecisionResult<T> {\n // Evaluate rules in order\n for (let i = 0; i < strategy.rules.length; i++) {\n const rule = strategy.rules[i];\n const { matched, conditionResults } = evaluateRule(rule, evalContext);\n\n if (matched) {\n return {\n value: rule.value as T,\n isFallback: false,\n matchInfo: {\n strategyType: 'rules',\n matchedRuleIndex: i,\n evaluatedConditions: conditionResults,\n },\n };\n }\n }\n\n // No rules matched, return default\n return {\n value: strategy.default as T,\n isFallback: true,\n matchInfo: {\n strategyType: 'rules',\n },\n };\n}\n", "/**\n * Score Strategy Evaluator\n *\n * Compares an augmented field value against a threshold.\n */\nimport type { DecisionResult, EvaluationContext, ScoreStrategy } from '../types';\n\n/**\n * Evaluate a ScoreStrategy and return the result.\n */\nexport function evaluateScoreStrategy<T>(\n strategy: ScoreStrategy<T>,\n evalContext: EvaluationContext\n): DecisionResult<T> {\n const { context } = evalContext;\n\n // Get the score from augmented context\n const score = context.augmented?.[strategy.field];\n\n // If no score available, return below value as fallback\n if (score === undefined || typeof score !== 'number') {\n return {\n value: strategy.below as T,\n isFallback: true,\n matchInfo: {\n strategyType: 'score',\n },\n };\n }\n\n // Compare against threshold\n const isAbove = score >= strategy.threshold;\n\n return {\n value: isAbove ? (strategy.above as T) : (strategy.below as T),\n isFallback: false,\n matchInfo: {\n strategyType: 'score',\n },\n };\n}\n", "/**\n * Decision Engine\n *\n * The central evaluation engine for DecisionStrategy objects.\n * Routes strategies to their appropriate evaluators.\n */\nimport type { RuntimeContext } from '../context/types';\nimport type { EventBus } from '../events/EventBus';\nimport type { SessionMetricTracker } from '../metrics/sessionMetrics';\nimport type { StateStore } from '../state/StateStore';\n\nimport { evaluateRuleStrategy } from './strategies/rules';\nimport { evaluateScoreStrategy } from './strategies/score';\nimport type {\n DecisionResult,\n DecisionStrategy,\n EvaluationContext,\n ExternalStrategy,\n ModelStrategy,\n RuleStrategy,\n ScoreStrategy,\n} from './types';\n\n/**\n * Options for the decision engine evaluate function.\n */\nexport interface EvaluateOptions {\n /** State store for dismissal/cooldown/frequency checks */\n state?: StateStore;\n /** Event bus for event_occurred checks */\n events?: EventBus;\n /** Session metric tracker for session_metric checks */\n sessionMetrics?: SessionMetricTracker;\n /** Event accumulator for event_count conditions */\n accumulator?: { getCount(key: string, withinMs?: number): number };\n}\n\n/**\n * Create an EvaluationContext from runtime components.\n */\nfunction createEvaluationContext(\n context: RuntimeContext,\n options: EvaluateOptions\n): EvaluationContext {\n const { state, events, sessionMetrics, accumulator } = options;\n\n return {\n context,\n state: state\n ? {\n isDismissed: (key: string) => state.dismissals.isDismissed(key),\n isCooldownActive: (key: string) => state.cooldowns.isActive(key),\n getFrequencyCount: (key: string) => state.frequency.count(key),\n getSessionMetric: (key: string) => sessionMetrics?.get(key) ?? 0,\n getValue: (key: string) => state.session.get(key) ?? state.user.get(key),\n }\n : undefined,\n events: events\n ? {\n hasRecentEvent: (eventName: string, withinMs: number) =>\n events.hasRecentEvent(eventName, withinMs),\n }\n : undefined,\n accumulator: accumulator\n ? {\n getCount: (key, withinMs) => accumulator.getCount(key, withinMs),\n }\n : undefined,\n };\n}\n\n/**\n * Evaluate a DecisionStrategy against the current context.\n *\n * @param strategy - The decision strategy to evaluate\n * @param context - The runtime context\n * @param options - Additional evaluation options\n * @returns The decision result\n */\nexport async function evaluate<T>(\n strategy: DecisionStrategy<T>,\n context: RuntimeContext,\n options: EvaluateOptions = {}\n): Promise<DecisionResult<T>> {\n const evalContext = createEvaluationContext(context, options);\n\n switch (strategy.type) {\n case 'rules':\n return evaluateRuleStrategy(strategy as RuleStrategy<T>, evalContext);\n\n case 'score':\n return evaluateScoreStrategy(strategy as ScoreStrategy<T>, evalContext);\n\n case 'model':\n // Phase 3: Model-based strategy\n // For now, return default\n return {\n value: (strategy as ModelStrategy<T>).default as T,\n isFallback: true,\n matchInfo: {\n strategyType: 'model',\n },\n };\n\n case 'external':\n // Phase 3: External strategy\n // For now, return default\n return {\n value: (strategy as ExternalStrategy<T>).default as T,\n isFallback: true,\n matchInfo: {\n strategyType: 'external',\n },\n };\n\n default:\n // Unknown strategy type\n console.warn('[DecisionEngine] Unknown strategy type:', (strategy as any).type);\n return {\n value: undefined as T,\n isFallback: true,\n matchInfo: {\n strategyType: (strategy as any).type,\n },\n };\n }\n}\n\n/**\n * Synchronous version of evaluate for simple strategies.\n * Use this when you know the strategy doesn't require async operations.\n */\nexport function evaluateSync<T>(\n strategy: DecisionStrategy<T>,\n context: RuntimeContext,\n options: EvaluateOptions = {}\n): DecisionResult<T> {\n const evalContext = createEvaluationContext(context, options);\n\n switch (strategy.type) {\n case 'rules':\n return evaluateRuleStrategy(strategy as RuleStrategy<T>, evalContext);\n\n case 'score':\n return evaluateScoreStrategy(strategy as ScoreStrategy<T>, evalContext);\n\n case 'model':\n case 'external':\n // These require async, return default\n return {\n value: (strategy as ModelStrategy<T> | ExternalStrategy<T>).default as T,\n isFallback: true,\n matchInfo: {\n strategyType: strategy.type,\n },\n };\n\n default:\n return {\n value: undefined as T,\n isFallback: true,\n matchInfo: {\n strategyType: (strategy as any).type,\n },\n };\n }\n}\n\n/**\n * Create a decision engine with pre-bound options.\n */\nexport function createDecisionEngine(options: EvaluateOptions) {\n return {\n evaluate: <T>(strategy: DecisionStrategy<T>, context: RuntimeContext) =>\n evaluate(strategy, context, options),\n evaluateSync: <T>(strategy: DecisionStrategy<T>, context: RuntimeContext) =>\n evaluateSync(strategy, context, options),\n };\n}\n", "/**\n * EventAccumulator \u2014 Shared module that bridges events to counters.\n *\n * - Adaptives call register(key, predicate) to register named counters\n * - EventBus events are run through predicates\n * - Counts stored in StateStore.session (session-scoped)\n * - Subscribers notified on every counter increment\n */\n\nimport type { StateStore } from '../state/StateStore';\nimport type { EventBus } from './EventBus';\nimport type { NormalizedEvent } from './types';\n\n/**\n * A registered pattern to accumulate.\n */\ninterface TrackedPattern {\n stateKey: string;\n needsTimestamps: boolean;\n predicate: (event: NormalizedEvent) => boolean;\n}\n\n/**\n * Stored counter data in StateStore.\n */\ninterface CounterData {\n count: number;\n /** Timestamps of individual events (only stored when withinMs is needed). Capped at 200. */\n timestamps?: number[];\n}\n\nconst MAX_TIMESTAMPS = 200;\nconst STATE_PREFIX = 'ev:';\n\nexport interface EventAccumulator {\n /** Register a named counter with a predicate callback. The adaptive provides ALL filtering logic. */\n register(\n key: string,\n predicate: (event: NormalizedEvent) => boolean,\n needsTimestamps?: boolean\n ): void;\n /** Read the accumulated count for a registered key. */\n getCount(key: string, withinMs?: number): number;\n /** Subscribe to counter changes. Returns unsubscribe function. */\n subscribe(callback: () => void): () => void;\n /** Stop accumulating and unsubscribe from EventBus. */\n destroy(): void;\n}\n\nexport interface EventAccumulatorOptions {\n eventBus: EventBus;\n stateStore: StateStore;\n}\n\n/**\n * Create an EventAccumulator instance.\n */\nexport function createEventAccumulator(options: EventAccumulatorOptions): EventAccumulator {\n const { eventBus, stateStore } = options;\n const patterns = new Map<string, TrackedPattern>();\n const subscribers = new Set<() => void>();\n let unsubscribeFromBus: (() => void) | null = null;\n\n // Get the session-scoped storage namespace for accumulator\n const storage = stateStore.ns('accumulator');\n\n /**\n * Handle an incoming event from EventBus.\n */\n function handleEvent(event: NormalizedEvent): void {\n let anyIncremented = false;\n\n for (const pattern of patterns.values()) {\n if (!pattern.predicate(event)) continue;\n\n // Increment counter in state\n const existing = storage.get<CounterData>(pattern.stateKey) || { count: 0 };\n existing.count++;\n\n // Store timestamp if needed\n if (pattern.needsTimestamps) {\n if (!existing.timestamps) existing.timestamps = [];\n existing.timestamps.push(event.ts);\n // Cap at MAX_TIMESTAMPS (keep most recent)\n if (existing.timestamps.length > MAX_TIMESTAMPS) {\n existing.timestamps = existing.timestamps.slice(-MAX_TIMESTAMPS);\n }\n }\n\n storage.set(pattern.stateKey, existing);\n anyIncremented = true;\n }\n\n // Notify subscribers if any counter changed\n if (anyIncremented) {\n for (const cb of subscribers) {\n try {\n cb();\n } catch (err) {\n console.error('[EventAccumulator] Subscriber error:', err);\n }\n }\n }\n }\n\n /**\n * Ensure the EventBus subscription is active when we have patterns.\n */\n function ensureSubscription(): void {\n if (unsubscribeFromBus || patterns.size === 0) return;\n unsubscribeFromBus = eventBus.subscribe(handleEvent);\n }\n\n return {\n register(key, predicate, needsTimestamps = false) {\n const stateKey = `${STATE_PREFIX}${key}`;\n\n // If pattern already registered, update needsTimestamps if upgrading\n const existing = patterns.get(stateKey);\n if (existing) {\n if (needsTimestamps && !existing.needsTimestamps) {\n existing.needsTimestamps = true;\n }\n return;\n }\n\n patterns.set(stateKey, { stateKey, needsTimestamps, predicate });\n ensureSubscription();\n },\n\n getCount(key, withinMs) {\n const stateKey = `${STATE_PREFIX}${key}`;\n const data = storage.get<CounterData>(stateKey);\n if (!data) return 0;\n\n // If no time window, return total count\n if (withinMs === undefined) return data.count;\n\n // Time-windowed count from timestamps\n if (!data.timestamps) return data.count; // No timestamps stored, return total as best effort\n const cutoff = Date.now() - withinMs;\n return data.timestamps.filter((ts) => ts >= cutoff).length;\n },\n\n subscribe(callback) {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n\n destroy() {\n if (unsubscribeFromBus) {\n unsubscribeFromBus();\n unsubscribeFromBus = null;\n }\n patterns.clear();\n subscribers.clear();\n },\n };\n}\n", "/**\n * EventBus - Normalized event stream for the runtime.\n *\n * The EventBus provides:\n * - Publish/subscribe for normalized events\n * - Event history for recent event lookups\n * - Filtering by name, pattern, or source\n */\nimport type { EventCallback, EventFilter, EventUnsubscribe, NormalizedEvent } from './types';\nimport { EVENT_SCHEMA_VERSION } from './types';\n\nexport interface EventBusOptions {\n /** Maximum number of events to keep in history */\n maxHistorySize?: number;\n}\n\ninterface Subscription {\n filter: EventFilter | undefined;\n callback: EventCallback;\n}\n\n/**\n * Check if an event matches a filter.\n */\nfunction matchesFilter(event: NormalizedEvent, filter?: EventFilter): boolean {\n if (!filter) return true;\n\n // Check name filter\n if (filter.names && filter.names.length > 0) {\n if (!filter.names.includes(event.name)) {\n return false;\n }\n }\n\n // Check pattern filter\n if (filter.patterns && filter.patterns.length > 0) {\n const matched = filter.patterns.some((pattern) => {\n try {\n const regex = new RegExp(pattern);\n return regex.test(event.name);\n } catch {\n return false;\n }\n });\n if (!matched) return false;\n }\n\n // Check source filter\n if (filter.sources && filter.sources.length > 0) {\n if (!filter.sources.includes(event.source)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * EventBus class for managing normalized events.\n */\nexport class EventBus {\n private subscriptions: Set<Subscription> = new Set();\n private history: NormalizedEvent[] = [];\n private maxHistorySize: number;\n\n constructor(options: EventBusOptions = {}) {\n this.maxHistorySize = options.maxHistorySize ?? 100;\n }\n\n /**\n * Subscribe to events matching an optional filter.\n * Returns an unsubscribe function.\n */\n subscribe(\n filterOrCallback: EventFilter | EventCallback,\n maybeCallback?: EventCallback\n ): EventUnsubscribe {\n let filter: EventFilter | undefined;\n let callback: EventCallback;\n\n // Handle overloaded signatures\n if (typeof filterOrCallback === 'function') {\n filter = undefined;\n callback = filterOrCallback;\n } else {\n filter = filterOrCallback;\n callback = maybeCallback!;\n }\n\n const subscription: Subscription = { filter, callback };\n this.subscriptions.add(subscription);\n\n return () => {\n this.subscriptions.delete(subscription);\n };\n }\n\n /**\n * Publish an event to all matching subscribers.\n */\n publish(\n name: string,\n props?: Record<string, unknown>,\n source: NormalizedEvent['source'] = 'canvas'\n ): void {\n const event: NormalizedEvent = {\n ts: Date.now(),\n name,\n source,\n props,\n schemaVersion: EVENT_SCHEMA_VERSION,\n };\n\n this.publishEvent(event);\n }\n\n /**\n * Publish a pre-constructed NormalizedEvent.\n */\n publishEvent(event: NormalizedEvent): void {\n // Add to history\n this.history.push(event);\n if (this.history.length > this.maxHistorySize) {\n this.history.shift();\n }\n\n // Notify matching subscribers\n for (const subscription of this.subscriptions) {\n if (matchesFilter(event, subscription.filter)) {\n try {\n subscription.callback(event);\n } catch (err) {\n console.error('[EventBus] Subscriber error:', err);\n }\n }\n }\n }\n\n /**\n * Get recent events matching an optional filter.\n */\n getRecent(filter?: EventFilter, limit?: number): NormalizedEvent[] {\n let events = this.history;\n\n if (filter) {\n events = events.filter((e) => matchesFilter(e, filter));\n }\n\n if (limit && limit > 0) {\n events = events.slice(-limit);\n }\n\n return events;\n }\n\n /**\n * Check if an event with a specific name occurred within a time window.\n */\n hasRecentEvent(eventName: string, withinMs: number, source?: NormalizedEvent['source']): boolean {\n const cutoff = Date.now() - withinMs;\n return this.history.some(\n (e) => e.name === eventName && e.ts >= cutoff && (source === undefined || e.source === source)\n );\n }\n\n /**\n * Count events matching a filter within a time window.\n */\n countRecentEvents(filter: EventFilter, withinMs?: number): number {\n let events = this.history.filter((e) => matchesFilter(e, filter));\n\n if (withinMs !== undefined) {\n const cutoff = Date.now() - withinMs;\n events = events.filter((e) => e.ts >= cutoff);\n }\n\n return events.length;\n }\n\n /**\n * Clear all event history.\n */\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * Get the number of current subscribers.\n */\n getSubscriberCount(): number {\n return this.subscriptions.size;\n }\n}\n\n/**\n * Create an EventBus instance.\n */\nexport function createEventBus(options: EventBusOptions = {}): EventBus {\n return new EventBus(options);\n}\n", "/**\n * NavigationMonitor - Centralized History API patching.\n *\n * This is the SINGLE point in the SDK that wraps history.pushState and\n * history.replaceState. All other modules that need to react to navigation\n * (ContextManager, overlay runner, tour executor, SmartCanvasApp) must\n * subscribe to this monitor instead of patching the History API directly.\n *\n * This prevents the \"quadruple-patching\" problem where multiple SDK modules\n * each wrap pushState/replaceState independently, creating a fragile chain\n * that can break when combined with React Router, GA4, and GTM \u2014 all of\n * which also wrap the History API.\n */\n\nexport type NavigationMethod = 'pushState' | 'replaceState' | 'popstate';\n\nexport type NavigationListener = (url: string, method: NavigationMethod) => void;\n\nexport interface NavigationDiagnostics {\n /** Whether pushState was native (not already wrapped) when we captured it */\n isNative: boolean;\n /** Number of active subscribers */\n subscriberCount: number;\n}\n\nexport class NavigationMonitor {\n private listeners = new Set<NavigationListener>();\n private capturedPushState: typeof history.pushState;\n private capturedReplaceState: typeof history.replaceState;\n private wasNative: boolean;\n private destroyed = false;\n\n constructor() {\n // Detect if pushState is already wrapped by another library\n this.wasNative = this.isNativeFunction(history.pushState);\n\n // Capture whatever is current (may already be wrapped by React Router / GA4).\n // Do NOT .bind() \u2014 preserve the exact reference so destroy() restores it cleanly.\n this.capturedPushState = history.pushState;\n this.capturedReplaceState = history.replaceState;\n\n // Apply our single wrapper\n history.pushState = (...args: Parameters<typeof history.pushState>) => {\n this.capturedPushState.call(history, ...args);\n // Defer notification to avoid conflicts with React's commit phase\n queueMicrotask(() => this.notify(window.location.href, 'pushState'));\n };\n\n history.replaceState = (...args: Parameters<typeof history.replaceState>) => {\n this.capturedReplaceState.call(history, ...args);\n queueMicrotask(() => this.notify(window.location.href, 'replaceState'));\n };\n\n // Listen for back/forward navigation\n window.addEventListener('popstate', this.onPopState);\n }\n\n /**\n * Subscribe to navigation events.\n * Returns an unsubscribe function.\n */\n subscribe(listener: NavigationListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Get diagnostics about the History API chain.\n */\n diagnose(): NavigationDiagnostics {\n return {\n isNative: this.wasNative,\n subscriberCount: this.listeners.size,\n };\n }\n\n /**\n * Restore the History API to the state we captured and remove all listeners.\n */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n history.pushState = this.capturedPushState;\n history.replaceState = this.capturedReplaceState;\n window.removeEventListener('popstate', this.onPopState);\n this.listeners.clear();\n }\n\n // \u2500\u2500\u2500 Private \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private onPopState = (): void => {\n this.notify(window.location.href, 'popstate');\n };\n\n private notify(url: string, method: NavigationMethod): void {\n if (this.destroyed) return;\n for (const listener of this.listeners) {\n try {\n listener(url, method);\n } catch {\n // Subscriber errors must not crash the navigation chain\n }\n }\n }\n\n private isNativeFunction(fn: Function): boolean {\n try {\n return Function.prototype.toString.call(fn).includes('[native code]');\n } catch {\n return false;\n }\n }\n}\n", "/**\n * Cooldown Store Implementation\n *\n * Tracks time-based cooldowns to prevent items from showing too frequently.\n */\nimport type { CooldownStore, ScopedStorage } from '../types';\n\nconst COOLDOWN_PREFIX = 'cooldown:';\n\nexport function createCooldownStore(storage: ScopedStorage): CooldownStore {\n return {\n set(key: string, durationMs: number): void {\n const storageKey = COOLDOWN_PREFIX + key;\n const expiresAt = Date.now() + durationMs;\n storage.set(storageKey, expiresAt);\n },\n\n isActive(key: string): boolean {\n return this.remaining(key) > 0;\n },\n\n remaining(key: string): number {\n const storageKey = COOLDOWN_PREFIX + key;\n const expiresAt = storage.get<number>(storageKey);\n if (expiresAt === undefined) return 0;\n\n const remaining = expiresAt - Date.now();\n if (remaining <= 0) {\n // Clean up expired cooldown\n storage.remove(storageKey);\n return 0;\n }\n\n return remaining;\n },\n\n clear(key: string): void {\n const storageKey = COOLDOWN_PREFIX + key;\n storage.remove(storageKey);\n },\n };\n}\n", "/**\n * Dismissal Store Implementation\n *\n * Tracks dismissed items in session or user storage.\n */\nimport type { DismissalStore, ScopedStorage } from '../types';\n\nconst DISMISSAL_PREFIX = 'dismissed:';\n\nexport function createDismissalStore(\n sessionStorage: ScopedStorage,\n userStorage: ScopedStorage\n): DismissalStore {\n return {\n mark(key: string, permanent = false): void {\n const storageKey = DISMISSAL_PREFIX + key;\n const storage = permanent ? userStorage : sessionStorage;\n storage.set(storageKey, true);\n },\n\n isDismissed(key: string): boolean {\n const storageKey = DISMISSAL_PREFIX + key;\n // Check both session and user storage\n return sessionStorage.has(storageKey) || userStorage.has(storageKey);\n },\n\n clear(key: string): void {\n const storageKey = DISMISSAL_PREFIX + key;\n sessionStorage.remove(storageKey);\n userStorage.remove(storageKey);\n },\n\n clearAll(): void {\n // Clear all dismissal keys from both storages\n for (const key of sessionStorage.keys()) {\n if (key.startsWith(DISMISSAL_PREFIX)) {\n sessionStorage.remove(key);\n }\n }\n for (const key of userStorage.keys()) {\n if (key.startsWith(DISMISSAL_PREFIX)) {\n userStorage.remove(key);\n }\n }\n },\n };\n}\n", "/**\n * Frequency Store Implementation\n *\n * Tracks how many times items have been shown or actions taken,\n * optionally resetting after a time window.\n */\nimport type { FrequencyEntry, FrequencyStore, ScopedStorage } from '../types';\n\nconst FREQUENCY_PREFIX = 'freq:';\n\nexport function createFrequencyStore(storage: ScopedStorage): FrequencyStore {\n function getEntry(key: string): FrequencyEntry | undefined {\n const storageKey = FREQUENCY_PREFIX + key;\n const entry = storage.get<FrequencyEntry>(storageKey);\n if (!entry) return undefined;\n\n // Check if reset time has passed\n if (entry.resetAt && Date.now() >= entry.resetAt) {\n storage.remove(storageKey);\n return undefined;\n }\n\n return entry;\n }\n\n return {\n increment(key: string, resetAfterMs?: number): number {\n const storageKey = FREQUENCY_PREFIX + key;\n const existing = getEntry(key);\n\n const newCount = (existing?.count ?? 0) + 1;\n const entry: FrequencyEntry = {\n count: newCount,\n // Keep existing resetAt or set new one\n resetAt: existing?.resetAt ?? (resetAfterMs ? Date.now() + resetAfterMs : undefined),\n };\n\n storage.set(storageKey, entry);\n return newCount;\n },\n\n count(key: string): number {\n const entry = getEntry(key);\n return entry?.count ?? 0;\n },\n\n reset(key: string): void {\n const storageKey = FREQUENCY_PREFIX + key;\n storage.remove(storageKey);\n },\n\n hasReachedLimit(key: string, limit: number): boolean {\n return this.count(key) >= limit;\n },\n };\n}\n", "/**\n * StateStore - Unified state management for the runtime.\n *\n * Provides scoped storage (session and user) with built-in helpers\n * for common patterns like dismissals, cooldowns, and frequency caps.\n */\nimport { createCooldownStore } from './helpers/cooldowns';\nimport { createDismissalStore } from './helpers/dismissals';\nimport { createFrequencyStore } from './helpers/frequency';\nimport type {\n CooldownStore,\n DismissalStore,\n FrequencyStore,\n ScopedStorage,\n StoredValue,\n} from './types';\n\nexport interface StateStoreOptions {\n /** Namespace prefix for storage keys */\n namespace?: string;\n}\n\nconst DEFAULT_NAMESPACE = 'syntro';\n\n/**\n * Create a ScopedStorage backed by browser storage.\n */\nfunction createBrowserStorage(storage: Storage | undefined, namespace: string): ScopedStorage {\n const prefix = `${namespace}:`;\n\n return {\n get<T>(key: string): T | undefined {\n if (!storage) return undefined;\n\n try {\n const raw = storage.getItem(prefix + key);\n if (!raw) return undefined;\n\n const stored: StoredValue<T> = JSON.parse(raw);\n\n // Check TTL\n if (stored.expiresAt && Date.now() >= stored.expiresAt) {\n storage.removeItem(prefix + key);\n return undefined;\n }\n\n return stored.value;\n } catch {\n return undefined;\n }\n },\n\n set<T>(key: string, value: T, ttlMs?: number): void {\n if (!storage) return;\n\n try {\n const stored: StoredValue<T> = {\n value,\n expiresAt: ttlMs ? Date.now() + ttlMs : undefined,\n };\n storage.setItem(prefix + key, JSON.stringify(stored));\n } catch (err) {\n console.warn('[StateStore] Failed to save:', err);\n }\n },\n\n remove(key: string): void {\n if (!storage) return;\n storage.removeItem(prefix + key);\n },\n\n has(key: string): boolean {\n if (!storage) return false;\n return this.get(key) !== undefined;\n },\n\n keys(): string[] {\n if (!storage) return [];\n\n const keys: string[] = [];\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key?.startsWith(prefix)) {\n keys.push(key.slice(prefix.length));\n }\n }\n return keys;\n },\n\n clear(): void {\n if (!storage) return;\n\n const keysToRemove = this.keys();\n for (const key of keysToRemove) {\n storage.removeItem(prefix + key);\n }\n },\n };\n}\n\n/**\n * Create an in-memory ScopedStorage (for SSR/testing).\n */\nfunction createMemoryStorage(namespace: string): ScopedStorage {\n const store = new Map<string, StoredValue>();\n const prefix = `${namespace}:`;\n\n return {\n get<T>(key: string): T | undefined {\n const stored = store.get(prefix + key);\n if (!stored) return undefined;\n\n if (stored.expiresAt && Date.now() >= stored.expiresAt) {\n store.delete(prefix + key);\n return undefined;\n }\n\n return stored.value as T;\n },\n\n set<T>(key: string, value: T, ttlMs?: number): void {\n store.set(prefix + key, {\n value,\n expiresAt: ttlMs ? Date.now() + ttlMs : undefined,\n });\n },\n\n remove(key: string): void {\n store.delete(prefix + key);\n },\n\n has(key: string): boolean {\n return this.get(key) !== undefined;\n },\n\n keys(): string[] {\n const keys: string[] = [];\n for (const key of store.keys()) {\n if (key.startsWith(prefix)) {\n keys.push(key.slice(prefix.length));\n }\n }\n return keys;\n },\n\n clear(): void {\n for (const key of store.keys()) {\n if (key.startsWith(prefix)) {\n store.delete(key);\n }\n }\n },\n };\n}\n\n/**\n * StateStore class for unified state management.\n */\nexport class StateStore {\n /** Session-scoped storage (cleared on browser close) */\n readonly session: ScopedStorage;\n\n /** User-scoped storage (persists across sessions) */\n readonly user: ScopedStorage;\n\n /** Dismissal tracking */\n readonly dismissals: DismissalStore;\n\n /** Cooldown tracking */\n readonly cooldowns: CooldownStore;\n\n /** Frequency tracking */\n readonly frequency: FrequencyStore;\n\n private readonly namespace: string;\n private readonly namespacedStorages: Map<string, ScopedStorage> = new Map();\n\n constructor(options: StateStoreOptions = {}) {\n this.namespace = options.namespace ?? DEFAULT_NAMESPACE;\n\n // Validate the storage object has setItem/getItem \u2014 Node.js v22+ exposes\n // a native localStorage global that lacks these methods when\n // --localstorage-file is not set, which can shadow jsdom's implementation.\n const isUsable = (s: unknown): s is Storage =>\n typeof s === 'object' && s !== null && typeof (s as Storage).setItem === 'function';\n\n // Create scoped storages with fallback to in-memory when browser APIs\n // are unavailable or non-functional (SSR, broken Node.js localStorage, etc.)\n if (typeof window !== 'undefined') {\n this.session = isUsable(window.sessionStorage)\n ? createBrowserStorage(window.sessionStorage, this.namespace)\n : createMemoryStorage(this.namespace);\n this.user = isUsable(window.localStorage)\n ? createBrowserStorage(window.localStorage, this.namespace)\n : createMemoryStorage(this.namespace);\n } else {\n // SSR fallback to in-memory storage\n this.session = createMemoryStorage(this.namespace);\n this.user = createMemoryStorage(this.namespace);\n }\n\n // Create helpers\n this.dismissals = createDismissalStore(this.session, this.user);\n this.cooldowns = createCooldownStore(this.user); // Cooldowns persist\n this.frequency = createFrequencyStore(this.session); // Frequency is session-based\n }\n\n /**\n * Create a namespaced storage scope.\n * Useful for isolating state by adaptive/tile.\n *\n * @param namespace - Additional namespace segment\n * @returns A ScopedStorage with the nested namespace\n */\n ns(namespace: string): ScopedStorage {\n const fullNamespace = `${this.namespace}:${namespace}`;\n\n if (!this.namespacedStorages.has(fullNamespace)) {\n const storage =\n typeof window !== 'undefined' && typeof sessionStorage !== 'undefined'\n ? createBrowserStorage(sessionStorage, fullNamespace)\n : createMemoryStorage(fullNamespace);\n this.namespacedStorages.set(fullNamespace, storage);\n }\n\n return this.namespacedStorages.get(fullNamespace)!;\n }\n}\n\n/**\n * Create a StateStore instance.\n */\nexport function createStateStore(options: StateStoreOptions = {}): StateStore {\n return new StateStore(options);\n}\n", "/**\n * Surfaces Types\n *\n * Defines types for the managed surface system that renders UI into named slots.\n * Surfaces handles layout, stacking, animations, and priority-based arbitration.\n */\n\nimport type { Placement } from '@floating-ui/dom';\nimport type { AnchorId } from '../actions/types.js';\n\n// ============================================================================\n// Surface Slot Types\n// ============================================================================\n\n/** Static surface slots with fixed positioning */\nexport type StaticSurfaceSlot =\n | 'drawer_right'\n | 'drawer_left'\n | 'drawer_bottom'\n | 'overlay_center'\n | 'overlay_corner_br'\n | 'overlay_corner_bl'\n | 'toast_top'\n | 'toast_bottom';\n\n/** Dynamic inline slot (rendered inside anchor) */\nexport type InlineSurfaceSlot = `inline:${string}`;\n\n/** Dynamic adjacent slot (positioned near anchor) */\nexport type AdjacentSurfaceSlot = `adjacent:${string}`;\n\n/** All surface slot types */\nexport type SurfaceSlot = StaticSurfaceSlot | InlineSurfaceSlot | AdjacentSurfaceSlot;\n\n// ============================================================================\n// Content Types\n// ============================================================================\n\n/** React component content */\nexport interface ReactContent {\n type: 'react';\n component: unknown;\n props?: Record<string, unknown>;\n}\n\n/** HTML string content */\nexport interface HtmlContent {\n type: 'html';\n content: string;\n}\n\n/** Widget reference content */\nexport interface WidgetContent {\n type: 'widget';\n widgetId: string;\n config?: Record<string, unknown>;\n}\n\n/** Custom mount function content */\nexport interface CustomContent {\n type: 'custom';\n mount: (container: HTMLElement) => () => void;\n}\n\n/** Union of all renderable content types */\nexport type RenderableContent = ReactContent | HtmlContent | WidgetContent | CustomContent;\n\n// ============================================================================\n// Position & Layout Types\n// ============================================================================\n\n/** Position configuration for adjacent slots */\nexport interface PositionConfig {\n placement: Placement | 'auto';\n offset?: { x: number; y: number };\n flip?: boolean;\n shift?: boolean;\n}\n\n/** Size constraints for mounted content */\nexport interface MountConstraints {\n maxWidth?: string;\n maxHeight?: string;\n minWidth?: string;\n minHeight?: string;\n}\n\n/** Animation types for enter/exit */\nexport type AnimationType = 'fade' | 'slide' | 'scale' | 'none';\n\n// ============================================================================\n// Mount Options & Handle Types\n// ============================================================================\n\n/** Options when mounting content to a surface */\nexport interface MountOptions {\n /** Priority for conflict resolution (higher wins) */\n priority?: number;\n\n /** Whether to unmount other content in the same slot */\n exclusive?: boolean;\n\n /** Animation for enter/exit */\n animation?: AnimationType;\n\n /** Position configuration for adjacent slots */\n position?: PositionConfig;\n\n /** Size constraints */\n constraints?: MountConstraints;\n\n /** ID of the adaptive mounting this content */\n adaptiveId?: string;\n\n /** Whether to auto-unmount on route change */\n autoUnmountOnRouteChange?: boolean;\n}\n\n/** Handle returned when content is mounted */\nexport interface MountHandle {\n /** Unique ID for this mount */\n id: string;\n\n /** Update the content */\n update: (content: RenderableContent) => void;\n\n /** Update mount options */\n setOptions: (opts: Partial<MountOptions>) => void;\n\n /** Unmount the content */\n unmount: () => void;\n\n /** Check if still mounted */\n isMounted: () => boolean;\n\n /** Get the DOM container element */\n getContainer: () => HTMLElement | null;\n}\n\n// ============================================================================\n// Surface State Types\n// ============================================================================\n\n/** State of a surface slot */\nexport interface SurfaceState {\n /** The slot identifier */\n slot: SurfaceSlot;\n\n /** Whether the slot is currently occupied */\n occupied: boolean;\n\n /** Priority of the current content (if occupied) */\n currentPriority?: number;\n\n /** Adaptive ID that owns current content */\n currentAdaptiveId?: string;\n\n /** Total number of mounts to this slot this session */\n mountCount: number;\n\n /** ID of the current mount (if occupied) */\n currentMountId?: string;\n}\n\n/** Callback for surface state changes */\nexport type SurfaceChangeCallback = (state: SurfaceState) => void;\n\n// ============================================================================\n// Surfaces Interface\n// ============================================================================\n\n/** Widget registry interface (subset needed by Surfaces) */\nexport interface SurfacesWidgetRegistry {\n has: (id: string) => boolean;\n mount: (\n id: string,\n container: HTMLElement,\n config?: Record<string, unknown>\n ) => { unmount: () => void; update: (config?: Record<string, unknown>) => void };\n}\n\n/** Options for creating a Surfaces instance */\nexport interface SurfacesOptions {\n /** Overlay root element for rendering */\n overlayRoot: HTMLElement;\n\n /** Event bus for publishing surface events */\n eventBus?: {\n publish: (name: string, props?: Record<string, unknown>) => void;\n };\n\n /** Function to resolve anchor IDs to elements (for inline/adjacent slots) */\n anchorResolver?: (anchorId: AnchorId) => HTMLElement | null;\n\n /** Default animation type */\n defaultAnimation?: AnimationType;\n\n /** Widget registry for resolving widget content */\n widgetRegistry?: SurfacesWidgetRegistry;\n}\n\n/** The Surfaces interface */\nexport interface Surfaces {\n /** Mount content to a surface slot */\n mount: (slot: SurfaceSlot, content: RenderableContent, opts?: MountOptions) => MountHandle;\n\n /** Get the current state of a slot */\n getState: (slot: SurfaceSlot) => SurfaceState;\n\n /** Subscribe to state changes for a slot */\n onStateChange: (slot: SurfaceSlot, fn: SurfaceChangeCallback) => () => void;\n\n /** Check if content can be mounted to a slot */\n canMount: (slot: SurfaceSlot, priority?: number) => boolean;\n\n /** Clean up all mounted surfaces */\n destroy: () => void;\n}\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\n/** Resolved internal options (with defaults applied) */\nexport interface InternalMountOptions {\n priority: number;\n exclusive: boolean;\n animation: AnimationType;\n position: PositionConfig;\n constraints: MountConstraints;\n adaptiveId?: string;\n autoUnmountOnRouteChange: boolean;\n}\n\n/** Internal mount entry */\nexport interface InternalMountEntry {\n id: string;\n slot: SurfaceSlot;\n content: RenderableContent;\n options: InternalMountOptions;\n container: HTMLElement;\n cleanup?: () => void;\n mountedAt: number;\n}\n\n/** Slot type classifier */\nexport function getSlotType(slot: SurfaceSlot): 'static' | 'inline' | 'adjacent' {\n if (slot.startsWith('inline:')) return 'inline';\n if (slot.startsWith('adjacent:')) return 'adjacent';\n return 'static';\n}\n\n/** Extract anchor ID from inline/adjacent slots */\nexport function getSlotAnchorId(slot: SurfaceSlot): string | null {\n if (slot.startsWith('inline:')) return slot.slice(7);\n if (slot.startsWith('adjacent:')) return slot.slice(9);\n return null;\n}\n", "/**\n * Surfaces Positioning\n *\n * Handles positioning for different slot types using CSS for static slots\n * and Floating UI for adjacent slots.\n */\n\nimport { autoUpdate, computePosition, flip, offset, type Placement, shift } from '@floating-ui/dom';\n\nimport type {\n AnimationType,\n MountConstraints,\n PositionConfig,\n StaticSurfaceSlot,\n SurfaceSlot,\n} from './types';\nimport { getSlotType } from './types';\n\n/**\n * CSS styles for static surface slots.\n */\nexport const STATIC_SLOT_STYLES: Record<StaticSurfaceSlot, Record<string, string>> = {\n drawer_right: {\n position: 'fixed',\n top: '0',\n right: '0',\n bottom: '0',\n width: '360px',\n maxWidth: '90vw',\n },\n drawer_left: {\n position: 'fixed',\n top: '0',\n left: '0',\n bottom: '0',\n width: '360px',\n maxWidth: '90vw',\n },\n drawer_bottom: {\n position: 'fixed',\n left: '0',\n right: '0',\n bottom: '0',\n maxHeight: '50vh',\n },\n overlay_center: {\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n maxWidth: '90vw',\n maxHeight: '90vh',\n },\n overlay_corner_br: {\n position: 'fixed',\n bottom: '16px',\n right: '16px',\n maxWidth: '400px',\n maxHeight: '80vh',\n },\n overlay_corner_bl: {\n position: 'fixed',\n bottom: '16px',\n left: '16px',\n maxWidth: '400px',\n maxHeight: '80vh',\n },\n toast_top: {\n position: 'fixed',\n top: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n maxWidth: '90vw',\n },\n toast_bottom: {\n position: 'fixed',\n bottom: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n maxWidth: '90vw',\n },\n};\n\n/**\n * Animation keyframes for different animation types.\n */\nexport const ANIMATION_KEYFRAMES: Record<AnimationType, Keyframe[]> = {\n fade: [{ opacity: 0 }, { opacity: 1 }],\n slide: [\n { opacity: 0, transform: 'translateY(10px)' },\n { opacity: 1, transform: 'translateY(0)' },\n ],\n scale: [\n { opacity: 0, transform: 'scale(0.95)' },\n { opacity: 1, transform: 'scale(1)' },\n ],\n none: [],\n};\n\n/**\n * Animation options.\n */\nexport const ANIMATION_OPTIONS: KeyframeAnimationOptions = {\n duration: 200,\n easing: 'cubic-bezier(0.16, 1, 0.3, 1)',\n fill: 'forwards',\n};\n\n/**\n * Apply static slot positioning to an element.\n */\nexport function applyStaticSlotStyles(\n element: HTMLElement,\n slot: StaticSurfaceSlot,\n constraints?: MountConstraints\n): void {\n const styles = STATIC_SLOT_STYLES[slot];\n Object.assign(element.style, styles);\n\n // Apply constraints\n if (constraints) {\n if (constraints.maxWidth) element.style.maxWidth = constraints.maxWidth;\n if (constraints.maxHeight) element.style.maxHeight = constraints.maxHeight;\n if (constraints.minWidth) element.style.minWidth = constraints.minWidth;\n if (constraints.minHeight) element.style.minHeight = constraints.minHeight;\n }\n}\n\n/**\n * Set up adjacent slot positioning using Floating UI.\n * Returns a cleanup function.\n */\nexport function setupAdjacentPositioning(\n container: HTMLElement,\n anchorEl: HTMLElement,\n config: PositionConfig\n): () => void {\n const placement: Placement = config.placement === 'auto' ? 'bottom' : config.placement;\n\n const middleware = [\n offset(config.offset ? { mainAxis: config.offset.y, crossAxis: config.offset.x } : 8),\n ];\n\n if (config.flip !== false) {\n middleware.push(flip());\n }\n\n if (config.shift !== false) {\n middleware.push(shift({ padding: 8 }));\n }\n\n // Set initial position style\n container.style.position = 'absolute';\n container.style.zIndex = '2147483646';\n\n const cleanup = autoUpdate(anchorEl, container, async () => {\n const { x, y, strategy } = await computePosition(anchorEl, container, {\n placement,\n middleware,\n });\n\n Object.assign(container.style, {\n position: strategy,\n left: `${x}px`,\n top: `${y}px`,\n });\n });\n\n return cleanup;\n}\n\n/**\n * Set up inline slot positioning.\n * Inline slots render content inside the anchor element.\n */\nexport function setupInlinePositioning(\n container: HTMLElement,\n anchorEl: HTMLElement,\n position: 'prepend' | 'append' = 'append'\n): () => void {\n // Reset container positioning (inline is flow-based)\n container.style.position = 'relative';\n container.style.display = 'inline-block';\n\n if (position === 'prepend') {\n anchorEl.insertBefore(container, anchorEl.firstChild);\n } else {\n anchorEl.appendChild(container);\n }\n\n return () => {\n container.remove();\n };\n}\n\n/**\n * Play enter animation on an element.\n */\nexport function playEnterAnimation(\n element: HTMLElement,\n animationType: AnimationType\n): Animation | null {\n if (animationType === 'none' || ANIMATION_KEYFRAMES[animationType].length === 0) {\n return null;\n }\n\n return element.animate(ANIMATION_KEYFRAMES[animationType], ANIMATION_OPTIONS);\n}\n\n/**\n * Play exit animation on an element.\n * Returns a promise that resolves when the animation completes.\n */\nexport function playExitAnimation(\n element: HTMLElement,\n animationType: AnimationType\n): Promise<void> {\n if (animationType === 'none' || ANIMATION_KEYFRAMES[animationType].length === 0) {\n return Promise.resolve();\n }\n\n const keyframes = [...ANIMATION_KEYFRAMES[animationType]].reverse();\n const animation = element.animate(keyframes, ANIMATION_OPTIONS);\n\n return new Promise((resolve) => {\n animation.onfinish = () => resolve();\n animation.oncancel = () => resolve();\n });\n}\n\n/**\n * Create and style a surface container element.\n */\nexport function createSurfaceContainer(slot: SurfaceSlot, id: string): HTMLElement {\n const container = document.createElement('div');\n container.setAttribute('data-syntro-surface', slot);\n container.setAttribute('data-syntro-mount-id', id);\n container.className = 'syntro-surface';\n\n // Base styles for all surfaces\n Object.assign(container.style, {\n pointerEvents: 'auto',\n boxSizing: 'border-box',\n overflow: 'auto',\n });\n\n return container;\n}\n\n/**\n * Get the z-index for a slot type.\n */\nexport function getSlotZIndex(slot: SurfaceSlot): number {\n const type = getSlotType(slot);\n switch (type) {\n case 'static':\n // Drawers and overlays\n if (slot.startsWith('drawer')) return 2147483640;\n if (slot.startsWith('overlay')) return 2147483642;\n if (slot.startsWith('toast')) return 2147483644;\n return 2147483640;\n case 'inline':\n // Inline content doesn't need high z-index\n return 1;\n case 'adjacent':\n // Adjacent content needs to be above page content\n return 2147483638;\n default:\n return 2147483640;\n }\n}\n", "export function sanitizeWithFallback(html: string): string {\n const hasNative = typeof (window as any).Sanitizer === 'function';\n if (hasNative) {\n try {\n const s = new (window as any).Sanitizer({});\n const frag = s.sanitizeToFragment(html);\n const div = document.createElement('div');\n div.append(frag);\n return div.innerHTML;\n } catch {\n // Fallback to conservative sanitizer below\n }\n }\n // very conservative fallback\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const root = tpl.content;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\n const allowed = new Set([\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 'span',\n 'div',\n 'p',\n 'br',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'small',\n 'sup',\n 'sub',\n 'a',\n 'button',\n ]);\n const toRemove: Element[] = [];\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n const tag = el.tagName.toLowerCase();\n if (!allowed.has(tag)) {\n toRemove.push(el);\n continue;\n }\n for (const attr of Array.from(el.attributes)) {\n const n = attr.name.toLowerCase();\n const v = attr.value.trim().toLowerCase();\n const isEvent = n.startsWith('on');\n const isJsUrl = (n === 'href' || n === 'src') && v.startsWith('javascript:');\n if (isEvent || isJsUrl) el.removeAttribute(attr.name);\n }\n }\n for (const el of toRemove) {\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\n el.remove();\n }\n return (tpl.innerHTML = root.firstChild ? tpl.innerHTML : tpl.innerHTML);\n}\n", "/**\n * Surfaces\n *\n * Managed surface system for rendering UI into named slots.\n * Handles layout, stacking, animations, and priority-based arbitration.\n */\n\nimport { sanitizeWithFallback } from '../hostPatcher/core/sanitizer';\n\nimport {\n applyStaticSlotStyles,\n createSurfaceContainer,\n getSlotZIndex,\n playEnterAnimation,\n playExitAnimation,\n setupAdjacentPositioning,\n setupInlinePositioning,\n} from './positioning';\nimport type {\n InternalMountEntry,\n MountHandle,\n MountOptions,\n RenderableContent,\n StaticSurfaceSlot,\n SurfaceChangeCallback,\n SurfaceSlot,\n SurfaceState,\n Surfaces,\n SurfacesOptions,\n} from './types';\nimport { getSlotAnchorId, getSlotType } from './types';\n\n/** Counter for generating unique mount IDs */\nlet mountIdCounter = 0;\n\n/**\n * Create a Surfaces instance.\n */\nexport function createSurfaces(options: SurfacesOptions): Surfaces {\n const {\n overlayRoot,\n eventBus,\n anchorResolver,\n defaultAnimation = 'fade',\n widgetRegistry,\n } = options;\n\n /** Map of current mounts by slot */\n const mounts = new Map<SurfaceSlot, InternalMountEntry>();\n\n /** Map of mount counts by slot (for stats) */\n const mountCounts = new Map<SurfaceSlot, number>();\n\n /** Map of state change callbacks by slot */\n const stateCallbacks = new Map<SurfaceSlot, Set<SurfaceChangeCallback>>();\n\n /**\n * Generate a unique mount ID.\n */\n function generateMountId(): string {\n return `mount-${++mountIdCounter}`;\n }\n\n /**\n * Publish an event to the EventBus if available.\n */\n function publishEvent(name: string, props?: Record<string, unknown>): void {\n if (eventBus) {\n eventBus.publish(name, props);\n }\n }\n\n /**\n * Notify state change callbacks for a slot.\n */\n function notifyStateChange(slot: SurfaceSlot): void {\n const callbacks = stateCallbacks.get(slot);\n if (callbacks) {\n const state = getState(slot);\n for (const callback of callbacks) {\n try {\n callback(state);\n } catch (error) {\n console.error('[Surfaces] State callback error:', error);\n }\n }\n }\n }\n\n /** Track mounted widget handles for cleanup */\n const widgetHandles = new Map<\n string,\n { unmount: () => void; update: (config?: Record<string, unknown>) => void }\n >();\n\n /**\n * Render content into a container.\n */\n function renderContent(\n container: HTMLElement,\n content: RenderableContent,\n mountId?: string\n ): (() => void) | undefined {\n switch (content.type) {\n case 'html':\n container.innerHTML = sanitizeWithFallback(content.content);\n return undefined;\n\n case 'widget': {\n // Use widget registry if available\n if (widgetRegistry?.has(content.widgetId)) {\n const handle = widgetRegistry.mount(content.widgetId, container, content.config);\n if (mountId) {\n widgetHandles.set(mountId, handle);\n }\n return () => {\n handle.unmount();\n if (mountId) {\n widgetHandles.delete(mountId);\n }\n };\n }\n // Fallback: create a placeholder if widget not found\n console.warn(`[Surfaces] Widget not found: ${content.widgetId}`);\n container.innerHTML = `<div data-widget-id=\"${content.widgetId}\" data-widget-missing=\"true\">Widget: ${content.widgetId}</div>`;\n return undefined;\n }\n\n case 'custom':\n return content.mount(container);\n\n case 'react':\n // React rendering would require ReactDOM\n // For now, create a placeholder\n container.innerHTML = `<div data-react-component>React Component</div>`;\n return undefined;\n\n default:\n console.warn('[Surfaces] Unknown content type');\n return undefined;\n }\n }\n\n /**\n * Mount content to a surface slot.\n */\n function mount(slot: SurfaceSlot, content: RenderableContent, opts?: MountOptions): MountHandle {\n const id = generateMountId();\n const slotType = getSlotType(slot);\n const priority = opts?.priority ?? 0;\n const animation = opts?.animation ?? defaultAnimation;\n const exclusive = opts?.exclusive ?? true;\n\n // Check for existing mount\n const existingMount = mounts.get(slot);\n if (existingMount) {\n if (exclusive) {\n // Priority-based arbitration\n if (existingMount.options.priority > priority) {\n throw new Error(\n `Slot ${slot} is occupied by higher priority content (${existingMount.options.priority} > ${priority})`\n );\n }\n // Unmount existing content\n unmountEntry(existingMount);\n }\n }\n\n // Create container\n const container = createSurfaceContainer(slot, id);\n container.style.zIndex = String(getSlotZIndex(slot));\n\n // Set up positioning based on slot type\n let positionCleanup: (() => void) | undefined;\n\n if (slotType === 'static') {\n applyStaticSlotStyles(container, slot as StaticSurfaceSlot, opts?.constraints);\n overlayRoot.appendChild(container);\n } else if (slotType === 'inline') {\n const anchorId = getSlotAnchorId(slot);\n if (!anchorId) {\n throw new Error(`Invalid inline slot: ${slot}`);\n }\n if (!anchorResolver) {\n throw new Error('Anchor resolver required for inline slots');\n }\n const anchorEl = anchorResolver({ selector: anchorId, route: '**' });\n if (!anchorEl) {\n throw new Error(`Anchor not found for inline slot: ${anchorId}`);\n }\n positionCleanup = setupInlinePositioning(container, anchorEl);\n } else if (slotType === 'adjacent') {\n const anchorId = getSlotAnchorId(slot);\n if (!anchorId) {\n throw new Error(`Invalid adjacent slot: ${slot}`);\n }\n if (!anchorResolver) {\n throw new Error('Anchor resolver required for adjacent slots');\n }\n const anchorEl = anchorResolver({ selector: anchorId, route: '**' });\n if (!anchorEl) {\n throw new Error(`Anchor not found for adjacent slot: ${anchorId}`);\n }\n overlayRoot.appendChild(container);\n positionCleanup = setupAdjacentPositioning(\n container,\n anchorEl,\n opts?.position ?? { placement: 'bottom' }\n );\n }\n\n // Render content\n const contentCleanup = renderContent(container, content, id);\n\n // Play enter animation\n playEnterAnimation(container, animation);\n\n // Create internal entry\n const entry: InternalMountEntry = {\n id,\n slot,\n content,\n options: {\n priority,\n exclusive,\n animation,\n position: opts?.position ?? { placement: 'auto' },\n constraints: opts?.constraints ?? {},\n adaptiveId: opts?.adaptiveId,\n autoUnmountOnRouteChange: opts?.autoUnmountOnRouteChange ?? true,\n },\n container,\n cleanup: () => {\n positionCleanup?.();\n contentCleanup?.();\n },\n mountedAt: Date.now(),\n };\n\n // Store mount\n mounts.set(slot, entry);\n\n // Update mount count\n mountCounts.set(slot, (mountCounts.get(slot) ?? 0) + 1);\n\n // Publish event\n publishEvent('surface.mounted', {\n slot,\n id,\n adaptiveId: opts?.adaptiveId,\n });\n\n // Notify state change\n notifyStateChange(slot);\n\n // Create and return handle\n const handle: MountHandle = {\n id,\n\n update(newContent: RenderableContent): void {\n const entry = mounts.get(slot);\n if (!entry || entry.id !== id) {\n throw new Error('Mount no longer active');\n }\n\n // Clean up existing widget handle if present\n const existingWidgetHandle = widgetHandles.get(id);\n if (existingWidgetHandle) {\n // If content is a widget and we have an update method, use it\n if (newContent.type === 'widget') {\n existingWidgetHandle.update(newContent.config);\n entry.content = newContent;\n return;\n }\n // Otherwise, unmount the old widget\n existingWidgetHandle.unmount();\n widgetHandles.delete(id);\n }\n\n // Clear existing content\n entry.container.innerHTML = '';\n\n // Render new content\n const newCleanup = renderContent(entry.container, newContent, id);\n entry.content = newContent;\n\n // Update cleanup if needed\n if (newCleanup) {\n const oldCleanup = entry.cleanup;\n entry.cleanup = () => {\n oldCleanup?.();\n newCleanup();\n };\n }\n },\n\n setOptions(newOpts: Partial<MountOptions>): void {\n const entry = mounts.get(slot);\n if (!entry || entry.id !== id) {\n throw new Error('Mount no longer active');\n }\n\n // Update options\n if (newOpts.priority !== undefined) {\n entry.options.priority = newOpts.priority;\n }\n if (newOpts.animation !== undefined) {\n entry.options.animation = newOpts.animation;\n }\n\n // Re-apply constraints if changed\n if (newOpts.constraints && slotType === 'static') {\n if (newOpts.constraints.maxWidth)\n entry.container.style.maxWidth = newOpts.constraints.maxWidth;\n if (newOpts.constraints.maxHeight)\n entry.container.style.maxHeight = newOpts.constraints.maxHeight;\n if (newOpts.constraints.minWidth)\n entry.container.style.minWidth = newOpts.constraints.minWidth;\n if (newOpts.constraints.minHeight)\n entry.container.style.minHeight = newOpts.constraints.minHeight;\n }\n\n notifyStateChange(slot);\n },\n\n async unmount(): Promise<void> {\n const entry = mounts.get(slot);\n if (!entry || entry.id !== id) return;\n\n await unmountEntry(entry);\n },\n\n isMounted(): boolean {\n const entry = mounts.get(slot);\n return entry?.id === id;\n },\n\n getContainer(): HTMLElement | null {\n const entry = mounts.get(slot);\n return entry?.id === id ? entry.container : null;\n },\n };\n\n return handle;\n }\n\n /**\n * Unmount an entry with animation.\n */\n async function unmountEntry(entry: InternalMountEntry): Promise<void> {\n // Play exit animation (skip if container already detached from DOM)\n if (entry.container.isConnected) {\n await playExitAnimation(entry.container, entry.options.animation);\n }\n\n // Run cleanup\n try {\n entry.cleanup?.();\n } catch (error) {\n console.warn('[Surfaces] Cleanup error during unmount, ignoring:', error);\n }\n\n // Remove container (safe even if already detached)\n try {\n entry.container.remove();\n } catch {\n // Container already removed from DOM \u2014 nothing to do\n }\n\n // Remove from mounts\n mounts.delete(entry.slot);\n\n // Publish event\n publishEvent('surface.unmounted', {\n slot: entry.slot,\n id: entry.id,\n });\n\n // Notify state change\n notifyStateChange(entry.slot);\n }\n\n /**\n * Get the current state of a slot.\n */\n function getState(slot: SurfaceSlot): SurfaceState {\n const entry = mounts.get(slot);\n return {\n slot,\n occupied: !!entry,\n currentPriority: entry?.options.priority,\n currentAdaptiveId: entry?.options.adaptiveId,\n mountCount: mountCounts.get(slot) ?? 0,\n currentMountId: entry?.id,\n };\n }\n\n /**\n * Subscribe to state changes for a slot.\n */\n function onStateChange(slot: SurfaceSlot, fn: SurfaceChangeCallback): () => void {\n let callbacks = stateCallbacks.get(slot);\n if (!callbacks) {\n callbacks = new Set();\n stateCallbacks.set(slot, callbacks);\n }\n callbacks.add(fn);\n\n return () => {\n callbacks?.delete(fn);\n if (callbacks?.size === 0) {\n stateCallbacks.delete(slot);\n }\n };\n }\n\n /**\n * Check if content can be mounted to a slot.\n */\n function canMount(slot: SurfaceSlot, priority?: number): boolean {\n const existingMount = mounts.get(slot);\n if (!existingMount) return true;\n\n // Check priority if provided\n if (priority !== undefined) {\n return priority >= existingMount.options.priority;\n }\n\n return false;\n }\n\n /**\n * Clean up all mounted surfaces.\n */\n function destroy(): void {\n // Unmount all surfaces\n for (const entry of mounts.values()) {\n try {\n entry.cleanup?.();\n entry.container.remove();\n } catch (error) {\n console.error('[Surfaces] Error during cleanup:', error);\n }\n }\n\n mounts.clear();\n stateCallbacks.clear();\n }\n\n return {\n mount,\n getState,\n onStateChange,\n canMount,\n destroy,\n };\n}\n", "/**\n * Widget Registry\n *\n * Extensible registry for mountable widget components.\n * Apps can register custom widgets that can be rendered via mountWidget actions.\n */\n\n/**\n * Cleanup function returned when unmounting a widget.\n */\nexport type WidgetCleanup = () => void;\n\n/**\n * Mountable widget component interface.\n *\n * Widgets must implement this interface to be registered and mounted\n * via the Surfaces system or mountWidget actions.\n */\nexport interface MountableWidget {\n /**\n * Mount the widget into a container element.\n *\n * @param container - The DOM element to mount into\n * @param config - Configuration/props for the widget\n * @returns A cleanup function to unmount the widget, or void\n */\n mount(container: HTMLElement, config?: Record<string, unknown>): WidgetCleanup | void;\n\n /**\n * Optional: Update the widget with new config.\n * If not provided, the widget will be unmounted and remounted on updates.\n *\n * @param container - The DOM element containing the widget\n * @param config - New configuration/props\n */\n update?(container: HTMLElement, config?: Record<string, unknown>): void;\n}\n\n/**\n * Widget registration entry.\n */\nexport interface WidgetRegistration {\n /** Widget ID (e.g., \"gamification:leaderboard\") */\n id: string;\n /** The widget component */\n widget: MountableWidget;\n /** Source app ID or \"built-in\" */\n source: 'built-in' | string;\n /** Optional metadata */\n metadata?: {\n name?: string;\n description?: string;\n icon?: string;\n subtitle?: string;\n };\n}\n\n/**\n * Mounted widget handle.\n */\nexport interface MountedWidgetHandle {\n /** The widget ID */\n widgetId: string;\n /** The container element */\n container: HTMLElement;\n /** Unmount the widget */\n unmount: () => void;\n /** Update the widget config */\n update: (config?: Record<string, unknown>) => void;\n}\n\n/**\n * Extensible registry for widget components.\n *\n * Allows apps to register custom widgets that can be rendered via\n * mountWidget actions or directly through the Surfaces system.\n */\nexport type WidgetRegistryListener = (event: {\n type: 'registered' | 'unregistered';\n widgetId: string;\n}) => void;\n\nexport class WidgetRegistry {\n private widgets = new Map<string, WidgetRegistration>();\n private mountedWidgets = new Map<string, { cleanup?: WidgetCleanup; container: HTMLElement }>();\n private mountIdCounter = 0;\n private runtimeRef?: unknown;\n private listeners = new Set<WidgetRegistryListener>();\n\n /**\n * Bind a runtime reference so it can be injected into widget mount() calls.\n * Uses `unknown` to avoid circular imports (WidgetRegistry \u2190 runtime.ts).\n */\n bindRuntime(runtime: unknown): void {\n this.runtimeRef = runtime;\n }\n\n /**\n * Register a widget.\n *\n * @param id - The widget ID (e.g., \"gamification:leaderboard\")\n * @param widget - The widget component\n * @param source - The source app ID (for tracking)\n * @param metadata - Optional metadata about the widget\n */\n register(\n id: string,\n widget: MountableWidget,\n source: string = 'custom',\n metadata?: WidgetRegistration['metadata']\n ): void {\n if (this.widgets.has(id)) {\n const existing = this.widgets.get(id)!;\n if (existing.source === 'built-in') {\n throw new Error(`Cannot override built-in widget: ${id}`);\n }\n console.warn(`[WidgetRegistry] Overriding widget: ${id}`);\n }\n\n this.widgets.set(id, {\n id,\n widget,\n source,\n metadata,\n });\n\n this.notify({ type: 'registered', widgetId: id });\n }\n\n /**\n * Unregister a widget.\n *\n * @param id - The widget ID to unregister\n * @returns true if the widget was unregistered, false if not found or built-in\n */\n unregister(id: string): boolean {\n const existing = this.widgets.get(id);\n if (!existing) {\n return false;\n }\n\n if (existing.source === 'built-in') {\n console.warn(`[WidgetRegistry] Cannot unregister built-in widget: ${id}`);\n return false;\n }\n\n this.widgets.delete(id);\n this.notify({ type: 'unregistered', widgetId: id });\n return true;\n }\n\n /**\n * Unregister all widgets from a specific source.\n *\n * @param source - The source app ID\n */\n unregisterBySource(source: string): void {\n for (const [id, registration] of this.widgets.entries()) {\n if (registration.source === source) {\n this.widgets.delete(id);\n }\n }\n }\n\n /**\n * Get a widget by ID.\n */\n get(id: string): MountableWidget | undefined {\n return this.widgets.get(id)?.widget;\n }\n\n /**\n * Get the full registration for a widget.\n */\n getRegistration(id: string): WidgetRegistration | undefined {\n return this.widgets.get(id);\n }\n\n /**\n * Check if a widget exists.\n */\n has(id: string): boolean {\n return this.widgets.has(id);\n }\n\n /**\n * Mount a widget into a container.\n *\n * @param id - The widget ID\n * @param container - The DOM element to mount into\n * @param config - Configuration/props for the widget\n * @returns A handle for managing the mounted widget\n */\n mount(id: string, container: HTMLElement, config?: Record<string, unknown>): MountedWidgetHandle {\n const registration = this.widgets.get(id);\n if (!registration) {\n throw new Error(`Widget not found: ${id}`);\n }\n\n const mountId = `widget-mount-${++this.mountIdCounter}`;\n container.setAttribute('data-widget-mount-id', mountId);\n container.setAttribute('data-widget-id', id);\n\n // Mount the widget \u2014 inject runtime so widgets can render as React components\n const enrichedConfig = { ...config, runtime: this.runtimeRef };\n const cleanup = registration.widget.mount(container, enrichedConfig);\n\n // Track the mounted widget\n this.mountedWidgets.set(mountId, {\n cleanup: cleanup ?? undefined,\n container,\n });\n\n const handle: MountedWidgetHandle = {\n widgetId: id,\n container,\n\n unmount: () => {\n const mounted = this.mountedWidgets.get(mountId);\n if (mounted) {\n // Only call widget cleanup (which unmounts inner React roots) if the\n // container is still in the DOM. When React's outer commit phase has\n // already removed the parent subtree, calling root.unmount() on the\n // inner root throws removeChild errors on detached nodes.\n if (container.isConnected) {\n mounted.cleanup?.();\n }\n this.mountedWidgets.delete(mountId);\n container.removeAttribute('data-widget-mount-id');\n container.removeAttribute('data-widget-id');\n container.innerHTML = '';\n }\n },\n\n update: (newConfig?: Record<string, unknown>) => {\n if (registration.widget.update) {\n registration.widget.update(container, newConfig);\n } else {\n // Unmount and remount with new config\n const mounted = this.mountedWidgets.get(mountId);\n if (mounted) {\n mounted.cleanup?.();\n container.innerHTML = '';\n const enrichedNewConfig = { ...newConfig, runtime: this.runtimeRef };\n const newCleanup = registration.widget.mount(container, enrichedNewConfig);\n mounted.cleanup = newCleanup ?? undefined;\n }\n }\n },\n };\n\n return handle;\n }\n\n /**\n * List all registered widget IDs.\n */\n list(): string[] {\n return Array.from(this.widgets.keys());\n }\n\n /**\n * List all registrations.\n */\n listRegistrations(): WidgetRegistration[] {\n return Array.from(this.widgets.values());\n }\n\n /**\n * Get all widgets from a specific source.\n */\n getBySource(source: string): WidgetRegistration[] {\n return Array.from(this.widgets.values()).filter(\n (registration) => registration.source === source\n );\n }\n\n /**\n * Subscribe to widget registration changes.\n */\n subscribe(callback: WidgetRegistryListener): () => void {\n this.listeners.add(callback);\n return () => {\n this.listeners.delete(callback);\n };\n }\n\n private notify(event: { type: 'registered' | 'unregistered'; widgetId: string }): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('[WidgetRegistry] Listener error:', error);\n }\n }\n }\n\n /**\n * Clean up all mounted widgets.\n */\n destroy(): void {\n for (const [_mountId, mounted] of this.mountedWidgets.entries()) {\n mounted.cleanup?.();\n mounted.container.innerHTML = '';\n }\n this.mountedWidgets.clear();\n }\n}\n\n/**\n * Default singleton instance of WidgetRegistry.\n */\nexport const widgetRegistry = new WidgetRegistry();\n", "/**\n * SmartCanvasRuntime - Unified runtime for v2 adaptives.\n *\n * The runtime provides access to all core providers:\n * - telemetry: Event tracking (PostHog)\n * - context: Page/session/viewport state\n * - events: Normalized event stream\n * - state: Persistent state storage\n * - actions: ActionEngine for interventions\n * - surfaces: Surfaces for UI rendering\n *\n * Note: ExperimentClient (GrowthBook) is NOT part of the runtime.\n * GrowthBook's job is done at page load when it selects which config to deliver.\n * The runtime receives the config and makes decisions using DecisionStrategy.\n */\nimport {\n type ActionEngine,\n type AnchorId,\n createActionEngine,\n type ExecutorRegistry,\n executorRegistry,\n} from './actions';\nimport { type AnchorResolver, createAnchorResolver } from './anchor';\nimport { type AppRegistry, appRegistry as defaultAppRegistry } from './apps';\nimport { type ContextManager, createContextManager } from './context/ContextManager';\nimport { createDecisionEngine } from './decisions/engine';\nimport type { DecisionResult, DecisionStrategy, RouteFilter } from './decisions/types';\nimport { createEventAccumulator, type EventAccumulator } from './events/EventAccumulator';\nimport { createEventBus, type EventBus } from './events/EventBus';\nimport type { SessionMetricTracker } from './metrics/sessionMetrics';\nimport { NavigationMonitor } from './navigation/NavigationMonitor';\nimport { ensureOverlayRoot } from './overlays/runtime/overlay/root';\nimport { createStateStore, type StateStore } from './state/StateStore';\nimport { createSurfaces, type Surfaces } from './surfaces';\nimport type { TelemetryClient } from './telemetry/types';\nimport type { TileConfig } from './types';\nimport { widgetRegistry as defaultWidgetRegistry, type WidgetRegistry } from './widgets';\n\n/**\n * Runtime version.\n */\nexport const RUNTIME_VERSION = '2.0.0';\n\n/**\n * Runtime mode.\n */\nexport type RuntimeMode = 'production' | 'development' | 'editor' | 'audit' | 'review';\n\n/**\n * SmartCanvasRuntime interface.\n */\nexport interface SmartCanvasRuntime {\n /** Telemetry client for event tracking */\n telemetry?: TelemetryClient;\n\n /** Context manager for page/session/viewport state */\n context: ContextManager;\n\n /** Event bus for normalized event stream */\n events: EventBus;\n\n /** State store for persistent state */\n state: StateStore;\n\n /** Session metric tracker (optional) */\n sessionMetrics?: SessionMetricTracker;\n\n /** ActionEngine for applying interventions */\n actions: ActionEngine;\n\n /** Surfaces for rendering UI into named slots */\n surfaces: Surfaces;\n\n /** Widget registry for mountable components */\n widgets: WidgetRegistry;\n\n /** Executor registry for action executors */\n executors: ExecutorRegistry;\n\n /** App registry for SynOS apps */\n apps: AppRegistry;\n\n /** Event accumulator for event_count conditions */\n accumulator: EventAccumulator;\n\n /** Centralized anchor resolver for DOM observation */\n anchorResolver: AnchorResolver;\n\n /** Centralized navigation monitor for History API interception */\n navigation: NavigationMonitor;\n\n /** Runtime version */\n version: string;\n\n /** Runtime mode */\n mode: RuntimeMode;\n\n /**\n * Evaluate a decision strategy against the current context.\n */\n evaluate<T>(strategy: DecisionStrategy<T>): Promise<DecisionResult<T>>;\n\n /**\n * Synchronously evaluate a decision strategy (for simple strategies).\n */\n evaluateSync<T>(strategy: DecisionStrategy<T>): DecisionResult<T>;\n\n /**\n * Filter tiles based on their activation configs.\n */\n filterTiles(tiles: TileConfig[]): Promise<TileConfig[]>;\n\n /**\n * Update the routes config (e.g., when config is fetched).\n */\n setRoutes(routes: RouteFilter): void;\n\n /**\n * Clean up runtime resources.\n */\n destroy(): void;\n}\n\n/**\n * Options for creating a SmartCanvasRuntime.\n */\nexport interface SmartCanvasRuntimeOptions {\n /** Telemetry client */\n telemetry?: TelemetryClient;\n\n /** Session metric tracker */\n sessionMetrics?: SessionMetricTracker;\n\n /** Initial routes config */\n routes?: RouteFilter;\n\n /** Runtime mode */\n mode?: RuntimeMode;\n\n /** State namespace */\n namespace?: string;\n\n /** External EventBus (if not provided, one will be created) */\n events?: EventBus;\n\n /** Custom widget registry (if not provided, default singleton is used) */\n widgets?: WidgetRegistry;\n\n /** Custom executor registry (if not provided, default singleton is used) */\n executors?: ExecutorRegistry;\n\n /** Custom app registry (if not provided, default singleton is used) */\n apps?: AppRegistry;\n}\n\n/**\n * Check if a URL matches a route filter.\n */\nfunction matchesRouteFilter(url: string, filter?: RouteFilter): boolean {\n if (!filter) return true;\n\n // Extract pathname\n let pathname: string;\n try {\n pathname = new URL(url).pathname;\n } catch {\n pathname = url;\n }\n\n // Normalize pathname\n const normalizedPath = pathname.replace(/\\/$/, '') || '/';\n\n // Check exclude patterns first\n if (filter.exclude) {\n for (const pattern of filter.exclude) {\n if (matchRoutePattern(normalizedPath, pattern)) {\n return false; // Explicitly excluded\n }\n }\n }\n\n // If include list exists, must match at least one\n if (filter.include && filter.include.length > 0) {\n for (const pattern of filter.include) {\n if (matchRoutePattern(normalizedPath, pattern)) {\n return true; // Matches include list\n }\n }\n return false; // Didn't match any include pattern\n }\n\n // No include list, not excluded = pass\n return true;\n}\n\n/**\n * Match a pathname against a route pattern.\n */\nfunction matchRoutePattern(pathname: string, pattern: string): boolean {\n const normalizedPattern = pattern.replace(/\\/$/, '') || '/';\n\n // Exact match\n if (pathname === normalizedPattern) return true;\n\n // Convert pattern to regex\n // Use placeholder to prevent ** \u2192 .* from being clobbered by * \u2192 [^/]*\n const regexPattern = normalizedPattern\n .replace(/\\*\\*/g, '\\0GLOBSTAR\\0') // Protect ** with placeholder\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex chars\n .replace(/\\*/g, '[^/]*') // * matches within path segment\n .replace(/\\0GLOBSTAR\\0/g, '.*') // ** matches anything (restored)\n .replace(/:[^/]+/g, '[^/]+'); // :param matches any segment\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(pathname);\n}\n\n/**\n * Check if an anchor's route constraint matches the current page.\n */\nfunction matchesAnchorRoute(anchorId: AnchorId): boolean {\n const pathname = typeof window !== 'undefined' ? window.location.pathname : '/';\n const normalizedPath = pathname.replace(/\\/$/, '') || '/';\n const routes = Array.isArray(anchorId.route) ? anchorId.route : [anchorId.route];\n return routes.some((pattern) => matchRoutePattern(normalizedPath, pattern));\n}\n\n/**\n * Create a SmartCanvasRuntime instance.\n */\nexport function createSmartCanvasRuntime(\n options: SmartCanvasRuntimeOptions = {}\n): SmartCanvasRuntime {\n const { telemetry, sessionMetrics, routes, mode = 'production', namespace } = options;\n\n // Use provided registries or defaults\n const widgets = options.widgets ?? defaultWidgetRegistry;\n const executors = options.executors ?? executorRegistry;\n const apps = options.apps ?? defaultAppRegistry;\n\n // Create centralized navigation monitor (single History API patch point)\n const navigation = new NavigationMonitor();\n\n // Create core providers\n const context = createContextManager({\n telemetry,\n routes,\n navigation,\n });\n\n // Use external EventBus if provided, otherwise create one\n const events = options.events ?? createEventBus();\n\n const state = createStateStore({\n namespace,\n });\n\n // Create event accumulator for event_count conditions\n const accumulator = createEventAccumulator({\n eventBus: events,\n stateStore: state,\n });\n\n // Create decision engine with bound options\n const decisionEngine = createDecisionEngine({\n state,\n events,\n sessionMetrics,\n accumulator,\n });\n\n // Create overlay root for Surfaces and ActionEngine\n const overlayRoot = ensureOverlayRoot();\n\n // Create centralized AnchorResolver service\n const anchorResolverService = createAnchorResolver();\n\n // Route-aware sync anchor resolver (replaces raw resolveAnchorById)\n const anchorResolver = (anchorId: AnchorId) => {\n if (!matchesAnchorRoute(anchorId)) return null;\n return anchorResolverService.resolve(anchorId.selector);\n };\n\n // Route-aware async anchor resolver for executors waiting on DOM\n const waitForAnchor = async (\n anchorId: AnchorId,\n timeoutMs?: number\n ): Promise<HTMLElement | null> => {\n if (!matchesAnchorRoute(anchorId)) return null;\n try {\n return await anchorResolverService.waitFor(anchorId.selector, timeoutMs);\n } catch {\n return null; // timeout \u2192 null\n }\n };\n\n // Create Surfaces provider with widget registry\n const surfaces = createSurfaces({\n overlayRoot,\n eventBus: events,\n anchorResolver,\n widgetRegistry: widgets,\n });\n\n // Create ActionEngine provider with executor registry\n const actions = createActionEngine({\n overlayRoot,\n eventBus: events,\n surfaces,\n anchorResolver,\n waitForAnchor,\n executorRegistry: executors,\n subscribeNavigation: (callback) => navigation.subscribe(callback),\n runtime: {\n evaluateSync: (strategy) => decisionEngine.evaluateSync(strategy, context.get()),\n context,\n accumulator,\n },\n });\n\n // Wire up page_views session metric: increment on actual page navigations\n let unsubPageViews: (() => void) | undefined;\n if (sessionMetrics) {\n // Count the initial page load\n sessionMetrics.increment('page_views');\n\n // Track path to avoid counting replaceState or same-path navigations\n let lastCountedPath = typeof window !== 'undefined' ? window.location.pathname : '/';\n\n unsubPageViews = navigation.subscribe((url, method) => {\n // Only count pushState and popstate (real navigations), not replaceState\n if (method === 'replaceState') return;\n try {\n const newPath = new URL(url).pathname;\n if (newPath !== lastCountedPath) {\n lastCountedPath = newPath;\n sessionMetrics!.increment('page_views');\n }\n } catch {\n // Invalid URL \u2014 skip\n }\n });\n }\n\n const runtime: SmartCanvasRuntime = {\n telemetry,\n context,\n events,\n state,\n sessionMetrics,\n actions,\n surfaces,\n widgets,\n executors,\n apps,\n accumulator,\n anchorResolver: anchorResolverService,\n navigation,\n version: RUNTIME_VERSION,\n mode,\n\n async evaluate<T>(strategy: DecisionStrategy<T>): Promise<DecisionResult<T>> {\n return decisionEngine.evaluate(strategy, context.get());\n },\n\n evaluateSync<T>(strategy: DecisionStrategy<T>): DecisionResult<T> {\n return decisionEngine.evaluateSync(strategy, context.get());\n },\n\n async filterTiles(tiles: TileConfig[]): Promise<TileConfig[]> {\n const currentUrl = context.get().page.url;\n const results: TileConfig[] = [];\n\n for (const tile of tiles) {\n const activation = tile.activation;\n\n // If no activation config, tile always renders\n if (!activation) {\n results.push(tile);\n continue;\n }\n\n // Check route filter\n if (!matchesRouteFilter(currentUrl, activation.routes)) {\n continue;\n }\n\n // onlyIfPopulated: hide tile if none of its actions have an active triggerWhen\n if (activation.onlyIfPopulated) {\n const actions = (tile.props?.actions as Array<{ triggerWhen?: unknown }>) ?? [];\n if (actions.length > 0) {\n const hasVisible = actions.some((a) => {\n if (!a.triggerWhen) return true;\n return decisionEngine.evaluateSync(\n a.triggerWhen as DecisionStrategy<boolean>,\n context.get()\n ).value;\n });\n if (!hasVisible) continue;\n }\n }\n\n results.push(tile);\n }\n\n return results;\n },\n\n setRoutes(routes: RouteFilter): void {\n context.setRoutes(routes);\n },\n\n destroy(): void {\n // Unbind and clean up apps registry\n apps.unbind().catch((err) => {\n console.error('[Runtime] Error unbinding apps registry:', err);\n });\n\n unsubPageViews?.();\n anchorResolverService.destroy();\n accumulator.destroy();\n navigation.destroy();\n context.destroy();\n actions.destroy();\n surfaces.destroy();\n },\n };\n\n // Bind apps registry to runtime\n apps.bind(runtime);\n widgets.bindRuntime(runtime);\n\n return runtime;\n}\n", "/**\n * Token encoding/decoding utilities for Syntro client keys.\n *\n * A Syntro token is a base64url-encoded JSON payload prefixed with \"syn_\".\n * It bundles all necessary credentials (experiments, telemetry, config) into\n * a single string that clients can use to initialize the SDK.\n */\n\nconst TOKEN_PREFIX = 'syn_';\n\nexport interface SyntroTokenPayload {\n /** Token version for future compatibility */\n v: 1;\n\n /** Experiments key (assumes growthbook provider by default) */\n e?: string;\n\n /** Experiments host URL (e.g., \"http://localhost:8110\" for dev) */\n eh?: string;\n\n /** Telemetry key (assumes posthog provider by default) */\n t?: string;\n\n /** Telemetry host URL (e.g., \"https://us.i.posthog.com\") */\n th?: string;\n\n /** Config fetcher type (e.g., \"cdn\", \"experiments\") */\n f?: string;\n\n /** Fetcher-specific options (e.g., configId for cdn fetcher) */\n o?: Record<string, string>;\n\n /** Debug mode - enables console logging (default: false) */\n d?: boolean;\n}\n\n/**\n * Decode a Syntro token into its payload.\n *\n * @param token - The token string (e.g., \"syn_eyJ2IjoxfQ\")\n * @returns The decoded payload\n * @throws Error if the token is invalid or unsupported version\n */\nexport function decodeToken(token: string): SyntroTokenPayload {\n if (!token.startsWith(TOKEN_PREFIX)) {\n throw new Error(\"Invalid Syntro token: must start with 'syn_'\");\n }\n\n const base64 = token.slice(TOKEN_PREFIX.length);\n // Convert base64url to standard base64\n const standardBase64 = base64.replace(/-/g, '+').replace(/_/g, '/');\n const json = atob(standardBase64);\n const payload = JSON.parse(json) as SyntroTokenPayload;\n\n if (payload.v !== 1) {\n throw new Error(`Unsupported token version: ${payload.v}`);\n }\n\n return payload;\n}\n\n/**\n * Encode a payload into a Syntro token.\n *\n * This is primarily for admin/dashboard use, but exported for testing.\n *\n * @param payload - The payload to encode\n * @returns The encoded token string\n */\nexport function encodeToken(payload: SyntroTokenPayload): string {\n const json = JSON.stringify(payload);\n // Convert to base64url (URL-safe, no padding)\n const base64 = btoa(json).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n return TOKEN_PREFIX + base64;\n}\n", "/**\n * Bootstrap module for single-token SDK initialization.\n *\n * Usage:\n * ```typescript\n * import { Syntro } from '@syntrologie/runtime-sdk';\n *\n * const { canvas, runtime } = await Syntro.init({\n * token: \"syn_eyJ2IjoxLCJleHAiOnsiayI6InNkay14eHgiLCJwIjoiZ3Jvd3RoYm9vayJ9fQ\"\n * });\n *\n * // Access runtime providers\n * runtime.telemetry?.trackAction(...);\n * runtime.context.subscribe((ctx, prev) => { ... });\n * runtime.events.subscribe({ names: ['ui.click'] }, (event) => { ... });\n * runtime.state.dismissals.mark('my-tile');\n * ```\n */\n\nimport { createEventProcessor, type ElementInfo } from '@syntrologie/event-processor';\nimport { createSmartCanvas, type SmartCanvasConfig, type SmartCanvasHandle } from './api';\nimport type { appRegistry } from './apps';\nimport { type AppLoader, type CanvasConfigForLoader, createAppLoader } from './apps/AppLoader';\nimport { createCanvasConfigFetcher } from './configFetcher';\nimport { getActiveSdkMode, getEditorConf, getEditorSource } from './editorLoader';\nimport { createEventBus } from './events/EventBus';\nimport { createExperimentClient } from './experiments/registry';\nimport type { ExperimentClient } from './experiments/types';\nimport { createConfigFetcher } from './fetchers/registry';\nimport { debug, initLogger, error as logError, warn } from './logger';\nimport { createSessionMetricTracker, type SessionMetricTracker } from './metrics';\nimport { createSmartCanvasRuntime, type RuntimeMode, type SmartCanvasRuntime } from './runtime';\nimport { createTelemetryClient } from './telemetry/registry';\nimport type { TelemetryClient } from './telemetry/types';\nimport { decodeToken, encodeToken, type SyntroTokenPayload } from './token';\nimport type { CanvasConfigFetcher } from './types';\n\nexport interface SyntroInitOptions {\n /**\n * The Syntro token containing all credentials.\n * Generated from your admin dashboard.\n *\n * Optional in editor mode (when editor_token is present in URL params).\n */\n token?: string;\n\n /**\n * Optional canvas configuration overrides.\n */\n canvas?: Partial<Omit<SmartCanvasConfig, 'integrations' | 'fetcher'>>;\n\n /**\n * Custom config fetcher to override the default experiment-based fetcher.\n * Use this for local development or when bypassing the experiment server.\n *\n * When provided, this fetcher is used instead of the experiments-based config lookup.\n * The token's telemetry credentials (t field) are still used if present.\n */\n fetcher?: CanvasConfigFetcher;\n\n /**\n * @deprecated Session metrics are always enabled. This flag has no effect.\n */\n enableSessionMetrics?: boolean;\n\n /**\n * CDN base URL for loading adaptive bundles.\n * Adaptives are loaded from: {cdnBase}/adaptives/{appId}/index.js\n *\n * @default \"https://cdn.syntrologie.com\"\n */\n cdnBase?: string;\n\n /**\n * @deprecated Core app executors are now registered synchronously.\n * This option has no effect and will be removed in a future version.\n */\n registerBuiltInApps?: boolean;\n}\n\nexport interface SyntroInitResult {\n /**\n * The SmartCanvas handle for controlling the canvas.\n */\n canvas: SmartCanvasHandle;\n\n /**\n * The unified v2 runtime with all providers.\n * Use this to access telemetry, context, events, and state.\n */\n runtime: SmartCanvasRuntime;\n\n /**\n * The experiment client, if experiments are configured in the token.\n * @deprecated Access via runtime.telemetry or use DecisionStrategy instead\n */\n experiments?: ExperimentClient;\n\n /**\n * The telemetry client, if telemetry is configured in the token.\n * @deprecated Access via runtime.telemetry instead\n */\n telemetry?: TelemetryClient;\n\n /**\n * The session metric tracker, if enableSessionMetrics is true.\n * @deprecated Access via runtime.sessionMetrics instead\n */\n sessionMetrics?: SessionMetricTracker;\n\n /**\n * App loader for loading external apps from CDN.\n * Exposed for manual app loading if needed.\n */\n appLoader: AppLoader;\n}\n\n/**\n * Get environment variable, supporting both Vite and Next.js patterns.\n */\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n // Next.js / Node.js\n return process.env[name];\n }\n // Vite uses import.meta.env - use try/catch to avoid esbuild IIFE warning\n try {\n // biome-ignore lint/security/noGlobalEval: Required for Vite compatibility; import.meta cannot be accessed statically in IIFE bundles\n const meta = (0, eval)('import.meta');\n if (meta?.env) {\n return meta.env[name];\n }\n } catch {\n // import.meta not available (IIFE bundle)\n }\n return undefined;\n}\n\n// ============================================================================\n// Segment Attribute Caching (localStorage)\n// ============================================================================\n\nconst SEGMENT_CACHE_KEY = 'syntro_segment_attributes';\n\n/**\n * Load cached segment attributes from localStorage.\n * Returns cached values for instant Phase 1 evaluation.\n */\nfunction loadCachedSegmentAttributes(): Record<string, boolean> {\n if (typeof window === 'undefined') return {};\n try {\n const cached = localStorage.getItem(SEGMENT_CACHE_KEY);\n if (cached) {\n const attrs = JSON.parse(cached);\n debug('Syntro Bootstrap', 'Loaded cached segment attributes:', attrs);\n return attrs;\n }\n } catch (err) {\n warn('Syntro Bootstrap', 'Failed to load cached segment attributes:', err);\n }\n return {};\n}\n\n/**\n * Save segment attributes to localStorage for faster future loads.\n */\nfunction cacheSegmentAttributes(attrs: Record<string, boolean>): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(SEGMENT_CACHE_KEY, JSON.stringify(attrs));\n debug('Syntro Bootstrap', 'Cached segment attributes:', attrs);\n } catch (err) {\n warn('Syntro Bootstrap', 'Failed to cache segment attributes:', err);\n }\n}\n\n/**\n * Extract segment flags (in_segment_*) from PostHog feature flags.\n */\nfunction extractSegmentFlags(\n allFlags: Record<string, boolean | string> | undefined\n): Record<string, boolean> {\n if (!allFlags) return {};\n\n const segmentFlags: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(allFlags)) {\n if (key.startsWith('in_segment_')) {\n segmentFlags[key] = value === true;\n }\n }\n return segmentFlags;\n}\n\n/**\n * Collect browser metadata for instant GrowthBook targeting.\n * This data is available synchronously from browser APIs \u2014 no network call needed.\n * Only non-empty values are included.\n */\nexport function collectBrowserMetadata(): Record<string, string | string[]> {\n if (typeof window === 'undefined') return {};\n const attrs: Record<string, string | string[]> = {};\n\n // UTM params from URL\n try {\n const params = new URLSearchParams(window.location.search);\n for (const key of ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term']) {\n const val = params.get(key);\n if (val) attrs[key] = val;\n }\n } catch {\n /* SSR safety */\n }\n\n // Browser language\n try {\n if (navigator.language) attrs.browser_language = navigator.language;\n if (navigator.languages?.length) attrs.browser_languages = [...navigator.languages];\n } catch {\n /* SSR safety */\n }\n\n // Device type (simple width heuristic \u2014 available instantly)\n try {\n const w = window.innerWidth;\n attrs.device_type = w < 768 ? 'mobile' : w < 1024 ? 'tablet' : 'desktop';\n } catch {\n /* SSR safety */\n }\n\n // Referrer\n try {\n if (document.referrer) {\n attrs.referrer = document.referrer;\n try {\n attrs.referrer_hostname = new URL(document.referrer).hostname;\n } catch {\n /* invalid URL */\n }\n }\n } catch {\n /* SSR safety */\n }\n\n // Current page\n try {\n attrs.page_url = window.location.href;\n attrs.page_path = window.location.pathname;\n } catch {\n /* SSR safety */\n }\n\n return attrs;\n}\n\n/**\n * Initialize the Syntro SDK with a single token.\n *\n * Environment variable overrides (for dev):\n * SYNTRO_EXPERIMENT_HOST - Override experiment server URL\n * SYNTRO_TELEMETRY_HOST - Override telemetry server URL\n *\n * In editor mode (when editor_token is in URL), the token is optional.\n * The editor SDK handles its own authentication.\n *\n * @param options - Initialization options\n * @returns The initialized SDK components\n */\nasync function init(options: SyntroInitOptions): Promise<SyntroInitResult> {\n // Initialize logger early (URL param works without token)\n initLogger();\n\n debug('Syntro Bootstrap', '====== INIT ======');\n debug('Syntro Bootstrap', 'Options:', {\n hasToken: !!options.token,\n tokenPrefix: `${options.token?.slice(0, 15)}...`,\n hasCanvasOptions: !!options.canvas,\n });\n\n // If editor_conf + token exist, the editor SDK will be loaded \u2014 the runtime\n // does not gate on specific mode values (the editor SDK handles that).\n const sdkMode = getActiveSdkMode();\n console.log(`[DIAG] Mode detection: sdkMode=${sdkMode}`);\n console.log(`[DIAG] editorSource:`, getEditorSource());\n console.log(`[DIAG] editorConf:`, getEditorConf());\n debug('Syntro Bootstrap', 'SDK mode:', sdkMode ?? 'normal');\n\n // Defensive warning: if mode detection failed but mode-specific globals exist,\n // something went wrong (redirect stripped params, race condition, etc.).\n if (!sdkMode && typeof window !== 'undefined') {\n const hasEditorGlobal = !!(window as any).__SYNTRO_EDITOR_PARAMS__;\n const hasAuditLegend = !!(window as any).__SYNTRO_AUDIT_LEGEND__;\n const hasReviewData = !!(window as any).__SYNTRO_REVIEW_DATA__;\n if (hasEditorGlobal || hasAuditLegend || hasReviewData) {\n const globals = [\n hasEditorGlobal && '__SYNTRO_EDITOR_PARAMS__',\n hasAuditLegend && '__SYNTRO_AUDIT_LEGEND__',\n hasReviewData && '__SYNTRO_REVIEW_DATA__',\n ].filter(Boolean);\n console.warn(\n `[Syntro Bootstrap] \u26A0 Mode detection returned null but mode-specific globals found: ${globals.join(', ')}. ` +\n 'This suggests URL params were lost (redirect?) but the service worker injected mode data. ' +\n 'Check if replaceState failed or if page JS changed the URL before init().'\n );\n }\n }\n\n // Resolve token: options.token > editor_conf.syntro_token (embedded by backend)\n console.log(\n `[DIAG] Token resolution: options.token=${options.token ? options.token.slice(0, 15) + '...' : 'null'}`\n );\n let resolvedToken = options.token;\n if (!resolvedToken && sdkMode) {\n const conf = getEditorConf();\n const embeddedToken = conf?.syntro_token as string | undefined;\n if (embeddedToken?.startsWith('syn_')) {\n resolvedToken = embeddedToken;\n debug('Syntro Bootstrap', `\u2713 Using syntro_token from editor_conf (${sdkMode} mode)`);\n }\n }\n\n let payload: SyntroTokenPayload | undefined;\n if (resolvedToken) {\n // If token is provided and starts with syn_, decode it\n if (resolvedToken.startsWith('syn_')) {\n debug('Syntro Bootstrap', 'Token starts with syn_, decoding...');\n payload = decodeToken(resolvedToken);\n // Re-init logger with token's debug flag\n initLogger(payload.d);\n } else if (!sdkMode) {\n // Not a syn_ token and not in special mode - error\n logError(\n 'Syntro Bootstrap',\n '\u274C Token does not start with syn_ and NOT in editor/audit/review mode!'\n );\n logError('Syntro Bootstrap', 'Token received:', resolvedToken);\n throw new Error(\"Invalid Syntro token: must start with 'syn_'\");\n } else {\n debug('Syntro Bootstrap', `\u2713 Non-syn_ token allowed (${sdkMode} mode)`);\n }\n // If in editor/audit/review mode with non-syn_ token, skip token decoding\n } else if (!sdkMode) {\n // No token and not in special mode - error\n logError('Syntro Bootstrap', '\u274C No token provided and NOT in editor/audit/review mode!');\n throw new Error('Syntro token is required (unless in editor, audit, or review mode)');\n } else {\n debug('Syntro Bootstrap', `\u2713 No token, but ${sdkMode} mode - proceeding`);\n }\n\n // Host resolution priority: env var > token > default\n // Env vars are checked at build time by bundlers (Next.js/Vite)\n const experimentHost =\n getEnvVar('NEXT_PUBLIC_SYNTRO_EXPERIMENT_HOST') ||\n getEnvVar('VITE_SYNTRO_EXPERIMENT_HOST') ||\n payload?.eh; // from token\n\n const telemetryHost =\n getEnvVar('NEXT_PUBLIC_SYNTRO_TELEMETRY_HOST') ||\n getEnvVar('VITE_SYNTRO_TELEMETRY_HOST') ||\n payload?.th; // from token\n\n // Editor SDK URL (for loading editor in edit mode)\n const editorUrl =\n getEnvVar('NEXT_PUBLIC_SYNTRO_EDITOR_URL') ||\n getEnvVar('VITE_SYNTRO_EDITOR_URL') ||\n options.canvas?.editorUrl;\n\n // ============================================================================\n // PHASE 1: Load cached segment attributes + browser metadata for instant evaluation\n // ============================================================================\n const cachedSegmentAttrs = loadCachedSegmentAttributes();\n const browserMetadata = collectBrowserMetadata();\n const phaseOneAttrs = { ...browserMetadata, ...cachedSegmentAttrs };\n debug('Syntro Bootstrap', 'Phase 1: Browser metadata:', browserMetadata);\n debug('Syntro Bootstrap', 'Phase 1: Cached segment attributes:', cachedSegmentAttrs);\n\n // Will be set when experiments client is created\n let experiments: ExperimentClient | undefined;\n\n // ============================================================================\n // Create EventBus early so we can wire PostHog events into it\n // ============================================================================\n const events = createEventBus();\n console.log('[Syntro Bootstrap] EventBus created');\n\n // Create event processor with behavioral signal detection\n const processor = createEventProcessor({\n elementResolver:\n typeof window !== 'undefined'\n ? (x, y) => {\n const el = document.elementFromPoint(x, y);\n if (!el) return null;\n const info: ElementInfo = { tag_name: el.tagName.toLowerCase() };\n if (el.id) info.attr__id = el.id;\n if (el.className && typeof el.className === 'string') {\n info.classes = el.className.split(' ').filter(Boolean);\n }\n for (const attr of el.attributes) {\n if (attr.name.startsWith('data-')) info[`attr__${attr.name}`] = attr.value;\n }\n return info;\n }\n : undefined,\n });\n processor.onEvent((event) => events.publishEvent(event));\n\n // Periodic tick for idle/hesitation detection\n if (typeof window !== 'undefined') {\n setInterval(() => processor.tick(Date.now()), 1000);\n\n // Click attribute enrichment \u2014 captures full data-* attributes that PostHog strips from sensitive elements\n document.addEventListener(\n 'click',\n (e) => {\n const chain: Array<Record<string, unknown>> = [];\n let el: Element | null = e.target as Element;\n while (el && el !== document.body) {\n const info: Record<string, unknown> = { tag_name: el.tagName.toLowerCase() };\n for (const attr of el.attributes) {\n if (\n attr.name.startsWith('data-') ||\n attr.name === 'id' ||\n attr.name === 'class' ||\n attr.name === 'aria-label'\n ) {\n info[`attr__${attr.name}`] = attr.value;\n }\n }\n chain.push(info);\n el = el.parentElement;\n }\n processor.enrichClickAttributes(Date.now(), chain);\n },\n true\n );\n }\n\n // Callback for when PostHog feature flags are loaded (Phase 2)\n const onFeatureFlagsLoaded = (allFlags: Record<string, boolean | string>) => {\n debug('Syntro Bootstrap', 'Phase 2: PostHog feature flags loaded');\n\n // Extract segment flags (in_segment_*)\n const segmentFlags = extractSegmentFlags(allFlags);\n debug('Syntro Bootstrap', 'Segment flags from PostHog:', segmentFlags);\n\n // Cache for next page load\n cacheSegmentAttributes(segmentFlags);\n\n // Update GrowthBook with fresh segment attributes\n if (experiments) {\n // Get current session metrics if available\n const sessionAttrs = sessionMetrics?.getAll?.() ?? {};\n\n // Merge browser metadata + session metrics + segment flags and update GrowthBook\n const updatedAttrs = { ...browserMetadata, ...sessionAttrs, ...segmentFlags };\n debug('Syntro Bootstrap', 'Updating GrowthBook with attributes:', updatedAttrs);\n\n experiments.setAttributes?.(updatedAttrs);\n }\n };\n\n // Initialize telemetry client with feature flags callback and event capture\n let telemetry: TelemetryClient | undefined;\n if (payload?.t) {\n const provider = payload.t === 'noop' ? 'noop' : 'posthog';\n telemetry = createTelemetryClient(provider, {\n apiKey: payload.t,\n apiHost: telemetryHost, // undefined falls back to adapter default\n // Enable PostHog feature flags for segment membership\n enableFeatureFlags: true,\n // Wire up callback for when flags are loaded (Phase 2)\n onFeatureFlagsLoaded,\n // Wire up event capture to feed into event processor\n onCapture: (eventName, properties) => {\n processor.ingest({ kind: 'posthog', event: eventName, properties, timestamp: Date.now() });\n },\n // Wire rrweb events for behavioral signal detection\n onRRWebEvent: (event) => {\n processor.ingest(event as any);\n },\n });\n console.log(`[Syntro Bootstrap] Telemetry client created (${provider}) with EventBus wiring`);\n }\n\n // ============================================================================\n // Initialize experiment client with CACHED attributes (Phase 1)\n // PostHog will update these when /decide returns (Phase 2)\n // ============================================================================\n let sessionMetrics: SessionMetricTracker | undefined;\n\n if (payload?.e) {\n experiments = createExperimentClient('growthbook', {\n clientKey: payload.e,\n apiHost: experimentHost, // undefined falls back to adapter default\n // Phase 1: Use browser metadata + cached segment attributes for instant evaluation\n attributes: phaseOneAttrs,\n // Wire experiment tracking to telemetry provider\n onExperimentViewed: telemetry?.trackExperiment\n ? (key, variationId, variationName) => {\n telemetry!.trackExperiment!(key, variationId, variationName);\n }\n : undefined,\n });\n }\n\n // Always create session metric tracker so session_metric conditions work\n // out of the box. The tracker is lightweight (Map + sessionStorage).\n sessionMetrics = createSessionMetricTracker({\n experiments,\n onMetricChange: (key, value) => {\n debug('Syntro Bootstrap', `Session metric changed: ${key} = ${value}`);\n },\n });\n debug('Syntro Bootstrap', 'SessionMetricTracker created');\n\n // Determine runtime mode\n let runtimeMode: RuntimeMode = 'production';\n if (sdkMode === 'editor') runtimeMode = 'editor';\n else if (sdkMode === 'audit') runtimeMode = 'audit';\n else if (getEnvVar('NODE_ENV') === 'development') runtimeMode = 'development';\n\n // ============================================================================\n // Create runtime FIRST (before canvas, so we can wire up app loading)\n // ============================================================================\n const runtime = createSmartCanvasRuntime({\n telemetry,\n sessionMetrics,\n mode: runtimeMode,\n events, // Use the EventBus we created earlier (already wired to PostHog)\n });\n\n debug('Syntro Bootstrap', 'Runtime created:', {\n version: runtime.version,\n mode: runtime.mode,\n hasContext: !!runtime.context,\n hasEvents: !!runtime.events,\n hasState: !!runtime.state,\n });\n\n // ============================================================================\n // Core app executors are registered synchronously in ExecutorRegistry\n // No async registration needed - they're available immediately\n // ============================================================================\n debug('Syntro Bootstrap', 'Core app executors already registered');\n\n // ============================================================================\n // Create app loader for external apps from CDN\n // ============================================================================\n const cdnBase =\n options.cdnBase ||\n getEnvVar('NEXT_PUBLIC_SYNTRO_CDN_BASE') ||\n getEnvVar('VITE_SYNTRO_CDN_BASE') ||\n 'https://cdn.syntrologie.com';\n\n const appLoader = createAppLoader({\n cdnBase,\n registry: runtime.apps,\n onLoadStart: (appId) => {\n debug('Syntro Bootstrap', `Loading app from CDN: ${appId}`);\n },\n onLoadEnd: (appId, success, error) => {\n if (success) {\n debug('Syntro Bootstrap', `App loaded successfully: ${appId}`);\n } else {\n warn('Syntro Bootstrap', `Failed to load app: ${appId}`, error);\n }\n },\n });\n\n // ============================================================================\n // Expose global SynOS object for UMD app self-registration\n // ============================================================================\n if (typeof window !== 'undefined') {\n (window as any).SynOS = {\n ...(window as any).SynOS,\n appRegistry: runtime.apps,\n runtime,\n version: runtime.version,\n };\n debug('Syntro Bootstrap', 'Global SynOS object exposed');\n }\n\n // Auto-activate built-in apps (registered at module load by builtinRuntimeModules).\n // This ensures widgets and event handlers are wired up before config fetching begins.\n const registeredApps = runtime.apps.list?.() ?? [];\n console.log(\n `[DIAG] Activation loop: ${registeredApps.length} apps in registry:`,\n registeredApps.map((a) => `${a.manifest.id}(${a.state})`).join(', ')\n );\n for (const app of registeredApps) {\n if (app.state === 'registered') {\n try {\n await runtime.apps.activate(app.manifest.id);\n console.log(\n `[DIAG] Activated: ${app.manifest.id} \u2192 widgets: [${runtime.widgets.list().join(', ')}]`\n );\n } catch (err) {\n console.error(`[DIAG] FAILED to activate: ${app.manifest.id}`, err);\n warn('Syntro Bootstrap', `Failed to auto-activate built-in app: ${app.manifest.id}`, err);\n }\n }\n }\n console.log(`[DIAG] Activation complete. Total widgets: [${runtime.widgets.list().join(', ')}]`);\n\n // ============================================================================\n // Ensure experiment features are loaded before config resolution\n // gb.init({ streaming: true }) is fire-and-forget in the adapter constructor,\n // so features may not be ready yet. Await them now.\n // ============================================================================\n if (experiments?.refreshFeatures) {\n try {\n await experiments.refreshFeatures();\n debug('Syntro Bootstrap', 'GrowthBook features loaded');\n } catch (err) {\n warn('Syntro Bootstrap', 'Failed to load GrowthBook features:', err);\n }\n }\n\n // ============================================================================\n // Create base config fetcher\n // Priority: custom fetcher > token-specified fetcher > experiments-based\n // ============================================================================\n let baseFetcher: CanvasConfigFetcher | undefined;\n if (options.fetcher) {\n // Custom fetcher provided - use it directly (for local dev / bypassing experiments)\n baseFetcher = options.fetcher;\n } else if (payload?.f) {\n // Explicit fetcher type specified in token\n const configFetcher = createConfigFetcher(payload.f, payload.o ?? {});\n baseFetcher = async () => {\n const result = await configFetcher.fetch();\n return {\n ...result.config,\n tiles: result.config.tiles ?? [],\n };\n };\n } else if (experiments) {\n // Default: use experiments-based fetcher (GrowthBook config or URI)\n baseFetcher = createCanvasConfigFetcher({ experiments });\n }\n\n // ============================================================================\n // Wrap fetcher to automatically load required apps when config is fetched\n // ============================================================================\n // Track which app load failures we've already warned about\n const warnedAppFailures = new Set<string>();\n\n const appLoadingFetcher: CanvasConfigFetcher | undefined = baseFetcher\n ? async () => {\n const config = await baseFetcher!();\n\n console.log(\n '[Syntro Bootstrap] Config fetched:',\n `tiles=${config.tiles?.length ?? 0},`,\n `actions=${(config as any).actions?.length ?? 0},`,\n `theme=${(config as any).theme?.name ?? 'none'}`\n );\n\n if ((config as any).actions?.length > 0) {\n console.log(\n '[Syntro Bootstrap] Actions in config:',\n (config as any).actions\n .map(\n (a: any, i: number) =>\n `[${i}] ${a.kind}${a.anchorId ? ` anchor=\"${a.anchorId.selector}\"` : ''}${a.label ? ` \"${a.label}\"` : ''}`\n )\n .join(', ')\n );\n }\n\n // Analyze config for required apps\n // Cast to CanvasConfigForLoader - the loader only looks at action kinds\n const configForLoader = config as unknown as CanvasConfigForLoader;\n const requiredApps = appLoader.getRequiredApps(configForLoader);\n if (requiredApps.length > 0) {\n console.log('[Syntro Bootstrap] Required external apps:', requiredApps.join(', '));\n } else {\n debug('Syntro Bootstrap', 'No external apps required (all executors are built-in)');\n }\n\n if (requiredApps.length > 0) {\n // Load external apps from CDN (built-in apps are already registered)\n // This runs in parallel - we don't block on it\n const loadPromise = appLoader.loadAppsForConfig(configForLoader).then(async (results) => {\n const successes = results.filter((r) => r.success);\n const failures = results.filter((r) => !r.success);\n\n if (successes.length > 0) {\n console.log(\n `[Syntro Bootstrap] Apps loaded from CDN: ${successes.map((r) => r.appId).join(', ')}`\n );\n }\n\n // Only warn about new failures (not previously warned)\n const newFailures = failures.filter((r) => !warnedAppFailures.has(r.appId));\n if (newFailures.length > 0) {\n console.error(\n `[Syntro Bootstrap] Apps FAILED to load from CDN:`,\n newFailures.map((r) => `${r.appId} (${r.error})`).join(', ')\n );\n newFailures.forEach((r) => warnedAppFailures.add(r.appId));\n }\n\n // Activate required apps after loading\n for (const appId of requiredApps) {\n if (runtime.apps.has(appId)) {\n try {\n await runtime.apps.activate(appId);\n console.log(`[Syntro Bootstrap] App activated: ${appId}`);\n } catch (err) {\n console.error(`[Syntro Bootstrap] Failed to activate app: ${appId}`, err);\n }\n } else {\n console.error(\n `[Syntro Bootstrap] App \"${appId}\" required by config but NOT registered.`,\n `Available apps: [${Array.from(runtime.apps.list?.() ?? []).join(', ')}]`\n );\n }\n }\n });\n\n // For actions that need external apps, we need to wait\n // But for core app actions, they can execute immediately\n await loadPromise;\n }\n\n return config;\n }\n : undefined;\n\n // ============================================================================\n // Create canvas with runtime and app-loading fetcher\n // ============================================================================\n const canvas = await createSmartCanvas({\n ...options.canvas,\n fetcher: appLoadingFetcher,\n integrations: { experiments, telemetry },\n editorUrl,\n runtime, // Pass runtime so actions can be applied\n });\n\n return { canvas, runtime, experiments, telemetry, sessionMetrics, appLoader };\n}\n\n/**\n * The Syntro namespace for single-token initialization.\n */\nexport const Syntro = {\n init,\n encodeToken,\n decodeToken,\n};\n\n// Also set up global for script tag usage\ndeclare global {\n interface Window {\n Syntro?: typeof Syntro;\n SynOS?: {\n appRegistry: typeof appRegistry;\n runtime: SmartCanvasRuntime;\n version: string;\n };\n }\n}\n\nif (typeof window !== 'undefined') {\n window.Syntro = Syntro;\n}\n", "/**\n * Experiment provider registry.\n *\n * Maps provider names to their adapter factories.\n * This allows the bootstrap module to dynamically create\n * experiment clients based on token configuration.\n */\nimport {\n createGrowthBookClient,\n type ExperimentTrackingCallback,\n type GrowthBookAdapterOptions,\n} from './adapters/growthbook';\nimport type { ExperimentClient } from './types';\n\ntype AdapterFactory = (config: any) => ExperimentClient;\n\nconst adapters: Record<string, AdapterFactory> = {\n growthbook: (config: GrowthBookAdapterOptions) =>\n createGrowthBookClient({\n ...config,\n autoInit: true,\n }),\n};\n\nexport interface CreateExperimentClientConfig {\n clientKey: string;\n apiHost?: string;\n /**\n * Initial user attributes for targeting.\n * Used for segment-based targeting.\n */\n attributes?: Record<string, unknown>;\n /**\n * Callback fired when a user is assigned to an experiment.\n * Use this to send experiment data to your analytics provider.\n */\n onExperimentViewed?: ExperimentTrackingCallback;\n}\n\n/**\n * Create an experiment client for the specified provider.\n *\n * @param provider - Provider name (e.g., \"growthbook\")\n * @param config - Provider-specific configuration\n * @returns An ExperimentClient instance\n * @throws Error if the provider is not supported\n */\nexport function createExperimentClient(\n provider: string,\n config: CreateExperimentClientConfig\n): ExperimentClient {\n const factory = adapters[provider];\n if (!factory) {\n throw new Error(\n `Unknown experiment provider: ${provider}. Supported: ${Object.keys(adapters).join(', ')}`\n );\n }\n return factory(config);\n}\n", "import type { CanvasConfigResponse } from '../types';\n\nimport type { ConfigFetcher, FetchResult } from './types';\n\n/**\n * Allowed CDN hosts for config fetching.\n */\nconst ALLOWED_CDN_HOSTS = ['cdn.syntrologie.com', 'localhost', '127.0.0.1'];\n\nexport interface CdnFetcherOptions {\n /**\n * Base CDN URL (e.g., \"https://cdn.syntrologie.com/configs\")\n */\n baseUrl: string;\n\n /**\n * Unique config identifier (UUID).\n * This should be unguessable to prevent unauthorized access.\n */\n configId: string;\n\n /**\n * Optional SRI hash for integrity verification.\n */\n integrity?: string;\n}\n\n/**\n * Validates that a CDN URL is from an allowed host.\n */\nfunction validateCdnUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n const isLocalhost = /^(localhost|127\\.0\\.0\\.1)$/.test(parsed.hostname);\n\n if (parsed.protocol !== 'https:' && !isLocalhost) {\n console.warn('[SmartCanvas] CDN URL must use HTTPS:', url);\n return false;\n }\n\n const isAllowed = ALLOWED_CDN_HOSTS.some((host) => parsed.hostname === host);\n if (!isAllowed) {\n console.warn('[SmartCanvas] CDN host not in allowlist:', parsed.hostname);\n return false;\n }\n\n return true;\n } catch {\n console.warn('[SmartCanvas] Invalid CDN URL:', url);\n return false;\n }\n}\n\n/**\n * Fetches config from CDN using UUID-based paths.\n *\n * Security: Config paths use UUIDs which are unguessable.\n * Each client has a unique config path that cannot be enumerated.\n *\n * Performance: CDN-cached with long TTL for versioned configs.\n */\nexport class CdnFetcher implements ConfigFetcher {\n readonly name = 'cdn';\n\n private url: string;\n private integrity?: string;\n\n constructor(options: CdnFetcherOptions) {\n this.url = `${options.baseUrl}/${options.configId}.json`;\n this.integrity = options.integrity;\n\n if (!validateCdnUrl(this.url)) {\n throw new Error(`[SmartCanvas] CDN URL not allowed: ${this.url}`);\n }\n }\n\n async fetch(): Promise<FetchResult> {\n const start = performance.now();\n\n const response = await fetch(this.url, {\n credentials: 'omit', // Never send cookies to CDN\n cache: 'default',\n });\n\n if (!response.ok) {\n throw new Error(`[SmartCanvas] Failed to fetch config from CDN (${response.status})`);\n }\n\n const text = await response.text();\n\n // Verify integrity if provided\n if (this.integrity) {\n const hash = await computeSha384(text);\n const expected = this.integrity.replace('sha384-', '');\n if (hash !== expected) {\n throw new Error(\n `[SmartCanvas] Config integrity check failed. Expected ${expected}, got ${hash}`\n );\n }\n }\n\n const config = JSON.parse(text) as CanvasConfigResponse;\n const fetchTimeMs = performance.now() - start;\n\n // Check cache headers\n const cacheControl = response.headers.get('cache-control');\n const age = response.headers.get('age');\n\n return {\n config,\n meta: {\n source: 'cdn',\n fetchTimeMs,\n cached: cacheControl?.includes('public') ?? false,\n cacheAge: age ? parseInt(age, 10) : undefined,\n },\n };\n }\n}\n\n/**\n * Compute SHA-384 hash in base64 format (for SRI).\n */\nasync function computeSha384(content: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-384', data);\n const hashArray = new Uint8Array(hashBuffer);\n return btoa(String.fromCharCode(...hashArray));\n}\n\n/**\n * Factory function for creating a CDN fetcher.\n */\nexport function createCdnFetcher(options: CdnFetcherOptions): ConfigFetcher {\n return new CdnFetcher(options);\n}\n", "import type { ExperimentClient } from '../experiments/types';\nimport type { CanvasConfigResponse } from '../types';\n\nimport { resolveVariantConfigs } from './mergeConfigs';\nimport type { ConfigFetcher, FetchResult } from './types';\n\n/**\n * URL parameters for forcing experiment variations in preview mode.\n * Usage: ?syntro_exp=experiment_tracking_key&syntro_var=1\n */\nconst PREVIEW_EXP_PARAM = 'syntro_exp';\nconst PREVIEW_VAR_PARAM = 'syntro_var';\n\nexport interface ExperimentsFetcherOptions {\n /**\n * Experiment client instance (e.g., from createGrowthBookClient).\n */\n client: ExperimentClient;\n\n /**\n * Single feature key for the monolithic config (legacy mode).\n * @default \"smart-canvas-config\"\n */\n featureKey?: string;\n\n /**\n * Feature key for the variant manifest (lists active variant flag keys).\n * When set, enables multi-flag mode.\n */\n manifestKey?: string;\n\n /**\n * Prefix for convention-based variant flag discovery.\n * All GrowthBook features matching this prefix will be evaluated.\n * Used as fallback when manifestKey is not set or returns empty.\n */\n variantFlagPrefix?: string;\n}\n\n/**\n * Fetches config from an experiment/feature flag system.\n *\n * Security: Config is scoped to the experiment client's environment/SDK key.\n * Each client only sees their own config.\n *\n * Performance: No network request needed if features are already cached.\n * Config is delivered with the feature flag payload.\n */\nexport class ExperimentsFetcher implements ConfigFetcher {\n readonly name = 'experiments';\n\n private client: ExperimentClient;\n private featureKey: string;\n private manifestKey?: string;\n private variantFlagPrefix?: string;\n\n constructor(options: ExperimentsFetcherOptions) {\n this.client = options.client;\n this.featureKey = options.featureKey ?? 'smart-canvas-config';\n this.manifestKey = options.manifestKey;\n this.variantFlagPrefix = options.variantFlagPrefix;\n }\n\n async fetch(): Promise<FetchResult> {\n const start = performance.now();\n\n // Check for preview URL params to force a specific variation\n if (typeof window !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n const expName = params.get(PREVIEW_EXP_PARAM);\n const varIndex = params.get(PREVIEW_VAR_PARAM);\n\n if (expName && varIndex !== null && this.client.setForcedVariations) {\n const index = parseInt(varIndex, 10);\n if (!Number.isNaN(index)) {\n console.log(`[SmartCanvas] Preview mode: forcing \"${expName}\" to variation ${index}`);\n this.client.setForcedVariations({ [expName]: index });\n }\n }\n }\n\n // Multi-flag mode: evaluate multiple feature flags and merge configs\n if (this.manifestKey || this.variantFlagPrefix || this.client.getAllFeatures) {\n const config = this.fetchMultiFlag();\n if (config) {\n const fetchTimeMs = performance.now() - start;\n return {\n config,\n meta: { source: 'experiments', fetchTimeMs, cached: true },\n };\n }\n }\n\n // Legacy single-flag mode\n const config = this.client.getFeatureValue?.(this.featureKey, null);\n\n if (!config || typeof config !== 'object') {\n throw new Error(\n `[SmartCanvas] Feature \"${this.featureKey}\" not found or invalid. ` +\n `Ensure the feature is configured in your experiment platform.`\n );\n }\n\n const fetchTimeMs = performance.now() - start;\n\n return {\n config: config as CanvasConfigResponse,\n meta: {\n source: 'experiments',\n fetchTimeMs,\n cached: true,\n },\n };\n }\n\n /**\n * Resolve config from multiple variant feature flags.\n * Returns the first active variant config, or null if none match.\n */\n private fetchMultiFlag(): CanvasConfigResponse | null {\n const variantKeys = this.getVariantFlagKeys();\n\n if (!variantKeys || variantKeys.length === 0) {\n return null;\n }\n\n return resolveVariantConfigs(this.client, variantKeys);\n }\n\n /**\n * Get variant flag keys from manifest or prefix discovery.\n */\n private getVariantFlagKeys(): string[] {\n // Try manifest first\n if (this.manifestKey) {\n const manifest = this.client.getFeatureValue?.(this.manifestKey, null);\n if (manifest && typeof manifest === 'object') {\n const keys = (manifest as { variant_flags?: string[] }).variant_flags;\n if (keys && keys.length > 0) {\n return keys;\n }\n }\n }\n\n // Fall back to discovery using getAllFeatures (with optional prefix filter)\n if (this.client.getAllFeatures) {\n const allFeatures = this.client.getAllFeatures();\n if (this.variantFlagPrefix) {\n return Object.keys(allFeatures).filter((key) => key.startsWith(this.variantFlagPrefix!));\n }\n return Object.keys(allFeatures);\n }\n\n return [];\n }\n}\n\n/**\n * Factory function for creating an experiments-based fetcher.\n */\nexport function createExperimentsFetcher(options: ExperimentsFetcherOptions): ConfigFetcher {\n return new ExperimentsFetcher(options);\n}\n", "/**\n * Config fetcher registry.\n *\n * Maps fetcher type names to their factory functions.\n * This allows the bootstrap module to dynamically create\n * fetchers based on token configuration.\n */\nimport { type CdnFetcherOptions, createCdnFetcher } from './cdnFetcher';\nimport { createExperimentsFetcher, type ExperimentsFetcherOptions } from './experimentsFetcher';\nimport type { ConfigFetcher } from './types';\n\n/**\n * Default CDN base URL for config fetching.\n */\nexport const DEFAULT_CDN_BASE_URL = 'https://cdn.syntrologie.com/configs';\n\ntype FetcherFactory = (options: Record<string, string>) => ConfigFetcher;\n\nconst fetchers: Record<string, FetcherFactory> = {\n /**\n * CDN fetcher - fetches config from Syntrologie CDN.\n * Options: configId (required), integrity (optional)\n */\n cdn: (options) => {\n if (!options.configId) {\n throw new Error(\"CDN fetcher requires 'configId' option\");\n }\n return createCdnFetcher({\n baseUrl: options.baseUrl ?? DEFAULT_CDN_BASE_URL,\n configId: options.configId,\n integrity: options.integrity,\n } as CdnFetcherOptions);\n },\n\n /**\n * Experiments fetcher - fetches config based on experiment variations.\n * Options: featureKey (required)\n */\n experiments: (options) => {\n if (!options.featureKey) {\n throw new Error(\"Experiments fetcher requires 'featureKey' option\");\n }\n return createExperimentsFetcher({\n featureKey: options.featureKey,\n } as ExperimentsFetcherOptions);\n },\n};\n\n/**\n * Create a config fetcher for the specified type.\n *\n * @param type - Fetcher type (e.g., \"cdn\", \"experiments\")\n * @param options - Fetcher-specific options\n * @returns A ConfigFetcher instance\n * @throws Error if the fetcher type is not supported\n */\nexport function createConfigFetcher(\n type: string,\n options: Record<string, string> = {}\n): ConfigFetcher {\n const factory = fetchers[type];\n if (!factory) {\n throw new Error(\n `Unknown config fetcher type: ${type}. Supported: ${Object.keys(fetchers).join(', ')}`\n );\n }\n return factory(options);\n}\n", "/**\n * Telemetry provider registry.\n *\n * Maps provider names to their adapter factories.\n * This allows the bootstrap module to dynamically create\n * telemetry clients based on token configuration.\n */\nimport { createNoopClient } from './adapters/noop';\nimport { createPostHogClient, type PostHogAdapterOptions } from './adapters/posthog';\nimport type { TelemetryClient } from './types';\n\ntype AdapterFactory = (config: any) => TelemetryClient;\n\nconst adapters: Record<string, AdapterFactory> = {\n posthog: (config: PostHogAdapterOptions) => createPostHogClient(config),\n noop: () => createNoopClient(),\n};\n\n/**\n * Create a telemetry client for the specified provider.\n *\n * @param provider - Provider name (e.g., \"posthog\")\n * @param config - Provider-specific configuration\n * @returns A TelemetryClient instance\n * @throws Error if the provider is not supported\n */\nexport function createTelemetryClient(\n provider: string,\n config: PostHogAdapterOptions\n): TelemetryClient {\n const factory = adapters[provider];\n if (!factory) {\n throw new Error(\n `Unknown telemetry provider: ${provider}. Supported: ${Object.keys(adapters).join(', ')}`\n );\n }\n return factory(config);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["_a", "_a", "tag", "_a", "INTENSITY_COUNTS", "_a", "INTENSITY_COUNTS", "_a", "_a", "error", "_a", "ALLOWED_TAGS", "sanitizeHtml", "_a", "tag", "_a", "modal", "sanitizeHtml", "_a", "sanitizeHtml", "toggle", "_jsx", "_a", "runtime", "_b", "_jsx", "_a", "badge", "sanitizeHtml", "executors", "runtime", "runtime", "_a", "_a", "registration", "loadPromise", "error", "runtime", "_a", "error", "_a", "_a", "error", "_a", "_a", "jsx", "jsx", "_a", "_a", "useCallback", "useEffect", "useRef", "useState", "useState", "useRef", "useCallback", "useEffect", "_a", "useEffect", "useRef", "appRegistry", "_a", "runtime", "createContext", "useContext", "useEffect", "useMemo", "useState", "jsx", "runtime", "_a", "useCallback", "useEffect", "useMemo", "useRef", "useState", "jsx", "jsx", "jsxs", "_a", "runtime", "useRef", "useEffect", "useState", "useMemo", "useCallback", "useCallback", "useEffect", "useMemo", "useRef", "useState", "_a", "base", "createContext", "useContext", "useEffect", "useMemo", "jsx", "createContext", "useMemo", "useEffect", "value", "useContext", "jsx", "jsxs", "error", "_a", "useState", "useRef", "runtime", "useCallback", "useMemo", "useEffect", "toggle", "_b", "_c", "_d", "useCallback", "useEffect", "useMemo", "useRef", "useState", "_a", "runtime", "useState", "useRef", "useCallback", "useEffect", "useMemo", "useEffect", "useMemo", "useRef", "useState", "jsx", "runtime", "_a", "useState", "useEffect", "useMemo", "useRef", "createRoot", "jsx", "_a", "createRoot", "_a", "_a", "_a", "runtime", "error", "config", "_a", "_a", "_a", "executors", "_a", "error", "_a", "executorRegistry", "runtime", "error", "entry", "handle", "_a", "_a", "_a", "_a", "_a", "_a", "_a", "sessionStorage", "_a", "_a", "autoUpdate", "computePosition", "flip", "offset", "shift", "offset", "flip", "shift", "autoUpdate", "computePosition", "_a", "tag", "widgetRegistry", "error", "_a", "entry", "runtime", "_a", "error", "_a", "executors", "runtime", "_b", "actions", "routes", "_a", "text", "_a", "config", "fetchTimeMs", "_a", "adapters", "_a", "_b", "_c", "runtime", "error", "_d", "_e", "_f"]
7
+ }