@syntrologie/runtime-sdk 2.2.0-canary.8 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/actions/types.d.ts +7 -0
- package/dist/antiFlicker.d.ts +2 -0
- package/dist/apps/builtinRuntimeModules.generated.d.ts +20 -0
- package/dist/{chunk-MEBUEMEZ.js → chunk-V4MDQX67.js} +2868 -1417
- package/dist/chunk-V4MDQX67.js.map +7 -0
- package/dist/configFetcher.d.ts +3 -1
- package/dist/context/ContextManager.d.ts +4 -0
- package/dist/diagnostics/service-worker-check.d.ts +23 -0
- package/dist/editorLoader.d.ts +8 -2
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1563 -12
- package/dist/index.js.map +4 -4
- package/dist/integrations/gtm-bridge.d.ts +36 -0
- package/dist/navigation/NavigationMonitor.d.ts +45 -0
- package/dist/overlays/runtime/utils/AnchorWatcher.d.ts +22 -0
- package/dist/overlays/types.d.ts +2 -0
- package/dist/react.js +1 -1
- package/dist/runtime.d.ts +3 -0
- package/dist/smart-canvas.esm.js +62 -36
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +15828 -23049
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +62 -36
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/telemetry/adapters/posthog.d.ts +19 -0
- package/dist/telemetry/consent.d.ts +62 -0
- package/dist/version.d.ts +1 -1
- package/dist/widgets/WidgetRegistry.d.ts +10 -0
- package/package.json +13 -4
- package/schema/canvas-config.schema.json +124 -22
- package/scripts/syntroReactPlugin.mjs +113 -0
- package/dist/adaptives/adaptive-chatbot/index.js +0 -9
- package/dist/adaptives/adaptive-chatbot/index.js.map +0 -7
- package/dist/adaptives/adaptive-content/index.js +0 -22
- package/dist/adaptives/adaptive-content/index.js.map +0 -7
- package/dist/adaptives/adaptive-faq/index.js +0 -28
- package/dist/adaptives/adaptive-faq/index.js.map +0 -7
- package/dist/adaptives/adaptive-gamification/index.js +0 -2
- package/dist/adaptives/adaptive-gamification/index.js.map +0 -7
- package/dist/adaptives/adaptive-nav/index.js +0 -27
- package/dist/adaptives/adaptive-nav/index.js.map +0 -7
- package/dist/adaptives/adaptive-overlays/index.js +0 -94
- package/dist/adaptives/adaptive-overlays/index.js.map +0 -7
- package/dist/chunk-MEBUEMEZ.js.map +0 -7
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/components/TileWheel.tsx", "../src/config-validator.ts", "../src/overlays/schema.ts", "../src/overlays/fetcher.ts", "../src/SmartCanvasPortal.tsx", "../src/context/schema.ts", "../src/decisions/schema.ts", "../src/events/schema.ts", "../src/state/schema.ts"],
|
|
4
|
-
"sourcesContent": ["// ============================================================================\n// Early SynOS exposure for adaptive self-registration + shared React\n// ============================================================================\n// Adaptive bundles loaded via <script> (IIFE) check window.SynOS.appRegistry\n// to self-register. In the Chrome extension's dev mode, adaptives load BEFORE\n// Syntro.init() runs. Expose the singleton appRegistry here (module scope) so\n// it's available as soon as smart-canvas.min.js loads. Syntro.init() later\n// enriches the SynOS object with runtime/version but reuses the same registry.\n//\n// React and ReactDOM are also exposed here so that adaptive bundles built with\n// syntroReactPlugin can resolve their lazy shims via SynOS.React / SynOS.ReactDOM.\n// This makes the runtime SDK the single React owner \u2014 adaptives and the editor\n// SDK consume React from SynOS, never from their own bundles.\n\nimport React from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport * as ReactDOMClient from 'react-dom/client';\nimport { appRegistry as _earlyAppRegistry } from './apps';\n\nexport * from './api';\nexport * from './components/ShadowCanvasOverlay';\nexport * from './components/TileCard';\nexport * from './components/TileWheel';\nexport * from './config-validator';\nexport * from './configFetcher';\nexport * from './controller';\nexport * from './experiments';\nexport * from './hooks/useShadowCanvasConfig';\n// Metrics for session-based targeting\nexport * from './metrics';\nexport * from './overlays/fetcher';\nexport * from './overlays/schema';\nexport * from './overlays/types';\nexport * from './ShadowRootContext';\nexport * from './SmartCanvasApp';\nexport * from './SmartCanvasElement';\nexport * from './SmartCanvasPortal';\nexport * from './telemetry';\nexport * from './types';\nexport * from './version';\n\n// ============================================================================\n// v2 Runtime Modules\n// ============================================================================\n\n// Actions - Unified execution layer for interventions\nexport * from './actions';\n// Apps - SynOS app system\nexport * from './apps';\n// Context - Page/session/viewport state management\nexport * from './context';\n// Decisions - Strategy-based conditional rendering\nexport * from './decisions';\n// Events - Normalized event stream\nexport * from './events';\n// Events - Normalized event stream\nexport * from './events';\n// Notifications - Toast notification system\nexport * from './notifications';\n// React context for runtime access\nexport {\n RuntimeProvider,\n useDecision,\n usePageContext,\n useRuntime,\n useRuntimeContext,\n useRuntimeEvents,\n useRuntimeState,\n useSessionContext,\n useViewportContext,\n} from './RuntimeProvider';\nexport type { RuntimeMode, SmartCanvasRuntime, SmartCanvasRuntimeOptions } from './runtime';\n// Unified runtime\nexport { createSmartCanvasRuntime, RUNTIME_VERSION } from './runtime';\n// State - Persistent state storage with helpers\nexport * from './state';\n// State - Persistent state storage with helpers\nexport * from './state';\n// Surfaces - Managed surface system for rendering UI\nexport * from './surfaces';\n// Widgets - Mountable component registry\nexport * from './widgets';\n\n// ============================================================================\n// Single-token initialization\n// ============================================================================\n\nexport type { SyntroInitOptions, SyntroInitResult } from './bootstrap';\nexport { Syntro } from './bootstrap';\nexport type { SyntroTokenPayload } from './token';\nexport { decodeToken, encodeToken } from './token';\n\nif (typeof window !== 'undefined') {\n const existing = (window as any).SynOS;\n (window as any).SynOS = {\n ...existing,\n appRegistry: existing?.appRegistry || _earlyAppRegistry,\n React,\n ReactDOM: { ...ReactDOMClient, createPortal, flushSync },\n };\n}\n", "import { border, brand, slateGrey } from '@syntro/design-system/tokens';\nimport { useEffect, useMemo, useState } from 'react';\n\nimport type { TelemetryClient } from '../telemetry/types';\nimport type { TileConfig } from '../types';\n\nimport { TileCard } from './TileCard';\n\nexport interface TileWheelProps {\n tiles: TileConfig[];\n intervalMs?: number;\n telemetry?: TelemetryClient;\n}\n\nexport function TileWheel({ tiles, intervalMs = 7000, telemetry }: TileWheelProps) {\n const [index, setIndex] = useState(0);\n const ordered = useMemo(\n () => [...tiles].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0)),\n [tiles]\n );\n\n useEffect(() => {\n telemetry?.trackCanvasOpened('wheel');\n }, [telemetry]);\n\n useEffect(() => {\n if (ordered.length <= 1) return;\n const id = setInterval(() => {\n setIndex((prev) => (prev + 1) % ordered.length);\n }, intervalMs);\n return () => clearInterval(id);\n }, [ordered, intervalMs]);\n\n useEffect(() => {\n const current = ordered[index];\n if (current) {\n telemetry?.trackRectangleViewed(current.id, 'wheel');\n }\n }, [index, ordered, telemetry]);\n\n if (!ordered.length) return null;\n\n return (\n <div\n style={{\n position: 'relative',\n overflow: 'hidden',\n borderRadius: '1.5rem',\n border: `1px solid ${border.primary}`,\n background: slateGrey[1],\n padding: '1.5rem',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n }}\n data-shadow-canvas-id=\"wheel\"\n >\n <div\n style={{\n display: 'flex',\n transition: 'transform 700ms ease-out',\n transform: `translateX(-${index * 100}%)`,\n width: `${ordered.length * 100}%`,\n }}\n >\n {ordered.map((tile) => (\n <div key={tile.id} style={{ width: '100%', flexShrink: 0, padding: '0 1rem' }}>\n <TileCard config={tile} surface=\"wheel\" telemetry={telemetry} />\n </div>\n ))}\n </div>\n <div style={{ marginTop: '1rem', display: 'flex', justifyContent: 'center', gap: '0.5rem' }}>\n {ordered.map((tile, idx) => (\n <button\n type=\"button\"\n key={tile.id}\n style={{\n height: '0.5rem',\n width: '1.5rem',\n borderRadius: '9999px',\n background: idx === index ? brand[3] : slateGrey[6],\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n }}\n onClick={() => setIndex(idx)}\n />\n ))}\n </div>\n </div>\n );\n}\n", "/**\n * Config validation and migration for SDK versioning.\n *\n * This module handles:\n * - Validating configs against the current SDK schema version\n * - Migrating old config formats to current version\n * - Providing warnings for version mismatches\n */\n\nimport type { CanvasConfigResponse } from './types';\nimport { SDK_SCHEMA_VERSION } from './types';\n\n/**\n * Result of config validation.\n */\nexport interface ConfigValidationResult {\n /** Whether the config is valid and can be used */\n valid: boolean;\n\n /** Warning messages (non-fatal issues) */\n warnings: string[];\n\n /** Error messages (fatal issues that prevent usage) */\n errors: string[];\n\n /** Migrated config if old version was detected */\n migratedConfig?: CanvasConfigResponse;\n}\n\n/**\n * Parse a schema version string into major and minor numbers.\n */\nexport function parseVersion(version: string): { major: number; minor: number } {\n const parts = version.split('.');\n return {\n major: parseInt(parts[0] || '0', 10),\n minor: parseInt(parts[1] || '0', 10),\n };\n}\n\n/**\n * Validate and normalize a config, handling version mismatches.\n *\n * This function:\n * 1. Checks if config is valid object\n * 2. Compares config schema version with SDK version\n * 3. Migrates old configs to current version\n * 4. Returns validation result with warnings/errors\n *\n * @param config - Raw config from backend or fetcher\n * @returns Validation result with any migrations applied\n */\nexport function validateConfig(config: unknown): ConfigValidationResult {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // Type check\n if (!config || typeof config !== 'object') {\n return {\n valid: false,\n errors: ['Config must be an object'],\n warnings,\n };\n }\n\n const typedConfig = config as Partial<CanvasConfigResponse>;\n\n // Check required fields\n if (!typedConfig.tiles) {\n errors.push('Config missing required field: tiles');\n }\n if (!typedConfig.actions) {\n errors.push('Config missing required field: actions');\n }\n if (!typedConfig.fetchedAt) {\n errors.push('Config missing required field: fetchedAt');\n }\n\n if (errors.length > 0) {\n return { valid: false, errors, warnings };\n }\n\n // Check schema version\n const configVersion = typedConfig.schemaVersion || '1.0';\n const configVer = parseVersion(configVersion);\n const sdkVer = parseVersion(SDK_SCHEMA_VERSION);\n\n // Future schema version (newer backend)\n if (configVer.major > sdkVer.major) {\n warnings.push(\n `Config schema v${configVersion} is newer than SDK v${SDK_SCHEMA_VERSION}. ` +\n `Some features may not work. Update SDK to latest version.`\n );\n }\n\n // Old schema version (older backend or missing version)\n if (configVer.major < sdkVer.major || !typedConfig.schemaVersion) {\n warnings.push(\n `Config schema v${configVersion} is older than SDK v${SDK_SCHEMA_VERSION}. ` +\n `Migrating config to current version.`\n );\n return {\n valid: true,\n warnings,\n errors,\n migratedConfig: migrateConfig(typedConfig as CanvasConfigResponse, configVersion),\n };\n }\n\n // Compatible version (same major version)\n return {\n valid: true,\n warnings,\n errors,\n };\n}\n\n/**\n * Migrate old config format to current SDK version.\n *\n * This function applies all necessary transformations to bring\n * an old config up to the current schema version.\n *\n * @param config - Config to migrate\n * @param fromVersion - Version to migrate from\n * @returns Migrated config at current SDK version\n */\nfunction migrateConfig(config: CanvasConfigResponse, fromVersion: string): CanvasConfigResponse {\n let migrated = { ...config };\n\n const fromVer = parseVersion(fromVersion);\n\n // v1.x -> v2.x migration\n if (fromVer.major === 1) {\n migrated = migrateV1ToV2(migrated);\n }\n\n // Update schema version to current\n migrated.schemaVersion = SDK_SCHEMA_VERSION;\n\n return migrated;\n}\n\n/**\n * Migrate v1.x config to v2.0 format.\n *\n * Changes in v2.0:\n * - Introduced ActivationConfig to replace experiment field\n * - Unified ActionStep format\n * - Added schemaVersion field\n */\nfunction migrateV1ToV2(config: any): CanvasConfigResponse {\n const migrated: CanvasConfigResponse = {\n schemaVersion: '2.0',\n tiles: [],\n actions: config.actions || [],\n fetchedAt: config.fetchedAt || new Date().toISOString(),\n };\n\n // Migrate tiles\n if (config.tiles && Array.isArray(config.tiles)) {\n migrated.tiles = config.tiles.map((tile: any) => {\n const migratedTile = { ...tile };\n\n // Migrate deprecated experiment field to activation\n if (tile.experiment && !tile.activation) {\n const exp = tile.experiment;\n\n // Convert old experiment format to new activation format\n if (exp.featureKey) {\n migratedTile.activation = {\n strategy: {\n type: 'external' as const,\n provider: 'growthbook' as const,\n featureKey: exp.featureKey,\n fallback: false,\n },\n };\n }\n\n // Remove deprecated field\n delete migratedTile.experiment;\n }\n\n return migratedTile;\n });\n }\n\n // Copy optional fields\n if (config.configVersion) migrated.configVersion = config.configVersion;\n if (config.canvasTitle) migrated.canvasTitle = config.canvasTitle;\n if (config.theme) migrated.theme = config.theme;\n if (config.launcher) migrated.launcher = config.launcher;\n if (config.routes) migrated.routes = config.routes;\n\n return migrated;\n}\n\n/**\n * Check if a config needs migration.\n *\n * @param config - Config to check\n * @returns True if migration is needed\n */\nexport function needsMigration(config: unknown): boolean {\n if (!config || typeof config !== 'object') {\n return false;\n }\n\n const typedConfig = config as Partial<CanvasConfigResponse>;\n const configVersion = typedConfig.schemaVersion || '1.0';\n const configVer = parseVersion(configVersion);\n const sdkVer = parseVersion(SDK_SCHEMA_VERSION);\n\n return configVer.major < sdkVer.major || !typedConfig.schemaVersion;\n}\n", "import { z } from 'zod';\n\nexport const SelectorZ = z.union([\n z.object({ type: z.literal('data'), key: z.string(), value: z.string().optional() }),\n z.object({ type: z.literal('css'), value: z.string() }),\n z.object({ type: z.literal('aria'), role: z.string().optional(), label: z.string().optional() }),\n z.object({ type: z.literal('shadow-css'), value: z.string() }),\n z.object({ type: z.literal('ref'), el: z.any() }), // runtime-only\n]);\n\nexport const TooltipStepZ = z.object({\n kind: z.literal('tooltip'),\n id: z.string(),\n anchor: SelectorZ,\n content: z.object({ title: z.string().optional(), body: z.string() }),\n placement: z.enum(['top', 'bottom', 'left', 'right', 'auto']).optional(),\n offsetPx: z.number().optional(),\n blocking: z.boolean().optional(),\n trigger: z.enum(['immediate', 'hover', 'click']).optional(),\n dismiss: z\n .object({\n onEsc: z.boolean().optional(),\n closeButton: z.boolean().optional(),\n timeoutMs: z.number().optional(),\n })\n .optional(),\n});\n\nexport const HighlightStepZ = z.object({\n kind: z.literal('highlight'),\n id: z.string(),\n anchor: SelectorZ,\n copy: z.string().optional(),\n ring: z.object({ paddingPx: z.number().optional(), radiusPx: z.number().optional() }).optional(),\n scrim: z.object({ opacity: z.number().optional() }).optional(),\n ringColor: z.string().optional(),\n blocking: z.boolean().optional(),\n dismiss: z\n .object({\n onClickOutside: z.boolean().optional(),\n onEsc: z.boolean().optional(),\n timeoutMs: z.number().optional(),\n })\n .optional(),\n});\n\nexport const CanvasRecipeZ = z.object({\n id: z.string(),\n version: z.number(),\n routes: z.array(z.string()).optional(),\n steps: z.array(z.union([TooltipStepZ, HighlightStepZ])),\n});\n\nexport function validateRecipe(json: unknown) {\n return CanvasRecipeZ.parse(json);\n}\n", "import { type CanvasFetcherOptions, resolveConfigUri } from '../configFetcher';\n\nimport { CanvasRecipeZ } from './schema';\nimport type { CanvasRecipe } from './types';\n\nexport type OverlayRecipeFetcher = () => Promise<CanvasRecipe>;\n\nexport const createOverlayRecipeFetcher =\n ({\n configUri,\n experiments,\n featureKey = 'smart-canvas-overlay-uri',\n credentials = 'include',\n }: CanvasFetcherOptions = {}): OverlayRecipeFetcher =>\n async () => {\n const uri = resolveConfigUri({ configUri, experiments, featureKey });\n if (!uri) {\n throw new Error('SmartCanvas overlays: recipe URI missing (env + feature unset).');\n }\n const response = await fetch(uri, { credentials });\n if (!response.ok) {\n throw new Error(`SmartCanvas overlays: failed to fetch recipe (${response.status})`);\n }\n const json = await response.json();\n return CanvasRecipeZ.parse(json) as CanvasRecipe;\n };\n", "import { type ReactNode, useLayoutEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport type { SmartCanvasElement } from './SmartCanvasElement';\n\nexport interface SmartCanvasPortalProps {\n element: SmartCanvasElement | null;\n children: ReactNode;\n}\n\nexport function SmartCanvasPortal({ element, children }: SmartCanvasPortalProps) {\n const [mountNode, setMountNode] = useState<HTMLElement | null>(null);\n\n useLayoutEffect(() => {\n if (!element) {\n setMountNode(null);\n return;\n }\n setMountNode(element.getMountNode());\n return () => setMountNode(null);\n }, [element]);\n\n if (!mountNode) return null;\n return createPortal(children, mountNode);\n}\n", "/**\n * Zod schemas for RuntimeContext validation.\n */\nimport { z } from 'zod';\n\nexport const PageContextZ = z.object({\n url: z.string(),\n routeId: z.string().optional(),\n title: z.string().optional(),\n locale: z.string().optional(),\n});\n\nexport const PageHistoryEntryZ = z.object({\n url: z.string(),\n ts: z.number(),\n});\n\nexport const SessionContextZ = z.object({\n sessionId: z.string(),\n startTs: z.number(),\n pageHistory: z.array(PageHistoryEntryZ).optional(),\n});\n\nexport const ViewportContextZ = z.object({\n width: z.number(),\n height: z.number(),\n});\n\nexport const BoundingBoxZ = z.object({\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n});\n\nexport const AnchorStateZ = z.object({\n anchorId: z.string(),\n present: z.boolean(),\n visible: z.boolean().optional(),\n boundingBox: BoundingBoxZ.optional(),\n});\n\nexport const AugmentationZ = z.record(\n z.string(),\n z.union([z.number(), z.string(), z.boolean(), z.undefined()])\n);\n\nexport const RuntimeContextZ = z.object({\n page: PageContextZ,\n session: SessionContextZ,\n viewport: ViewportContextZ,\n anchors: z.array(AnchorStateZ).optional(),\n augmented: AugmentationZ.optional(),\n});\n\n/**\n * Validate a RuntimeContext object.\n */\nexport function validateRuntimeContext(data: unknown) {\n return RuntimeContextZ.safeParse(data);\n}\n\n/**\n * Type inference from Zod schema.\n */\nexport type RuntimeContextSchema = z.infer<typeof RuntimeContextZ>;\nexport type PageContextSchema = z.infer<typeof PageContextZ>;\nexport type SessionContextSchema = z.infer<typeof SessionContextZ>;\nexport type ViewportContextSchema = z.infer<typeof ViewportContextZ>;\nexport type AnchorStateSchema = z.infer<typeof AnchorStateZ>;\n", "/**\n * Zod schemas for decision strategy validation.\n */\nimport { z } from 'zod';\n\n// =============================================================================\n// CONDITION SCHEMAS\n// =============================================================================\n\nexport const PageUrlConditionZ = z.object({\n type: z.literal('page_url'),\n url: z.string(),\n});\n\nexport const RouteConditionZ = z.object({\n type: z.literal('route'),\n routeId: z.string(),\n});\n\nexport const AnchorVisibleConditionZ = z.object({\n type: z.literal('anchor_visible'),\n anchorId: z.string(),\n state: z.enum(['visible', 'present', 'absent']),\n});\n\nexport const EventOccurredConditionZ = z.object({\n type: z.literal('event_occurred'),\n eventName: z.string(),\n withinMs: z.number().optional(),\n});\n\nexport const StateEqualsConditionZ = z.object({\n type: z.literal('state_equals'),\n key: z.string(),\n value: z.unknown(),\n});\n\nexport const ViewportConditionZ = z.object({\n type: z.literal('viewport'),\n minWidth: z.number().optional(),\n maxWidth: z.number().optional(),\n minHeight: z.number().optional(),\n maxHeight: z.number().optional(),\n});\n\nexport const SessionMetricConditionZ = z.object({\n type: z.literal('session_metric'),\n key: z.string(),\n operator: z.enum(['gte', 'lte', 'eq', 'gt', 'lt']),\n threshold: z.number(),\n});\n\nexport const DismissedConditionZ = z.object({\n type: z.literal('dismissed'),\n key: z.string(),\n inverted: z.boolean().optional(),\n});\n\nexport const CooldownActiveConditionZ = z.object({\n type: z.literal('cooldown_active'),\n key: z.string(),\n inverted: z.boolean().optional(),\n});\n\nexport const FrequencyLimitConditionZ = z.object({\n type: z.literal('frequency_limit'),\n key: z.string(),\n limit: z.number(),\n inverted: z.boolean().optional(),\n});\n\nexport const EventCountConditionZ = z.object({\n type: z.literal('event_count'),\n key: z.string(),\n operator: z.enum(['gte', 'lte', 'eq', 'gt', 'lt']),\n count: z.number().int().min(0),\n withinMs: z.number().positive().optional(),\n});\n\nexport const ConditionZ = z.discriminatedUnion('type', [\n PageUrlConditionZ,\n RouteConditionZ,\n AnchorVisibleConditionZ,\n EventOccurredConditionZ,\n StateEqualsConditionZ,\n ViewportConditionZ,\n SessionMetricConditionZ,\n DismissedConditionZ,\n CooldownActiveConditionZ,\n FrequencyLimitConditionZ,\n EventCountConditionZ,\n]);\n\n// =============================================================================\n// STRATEGY SCHEMAS\n// =============================================================================\n\nexport const RuleZ = z.object({\n conditions: z.array(ConditionZ),\n value: z.unknown(),\n});\n\nexport const RuleStrategyZ = z.object({\n type: z.literal('rules'),\n rules: z.array(RuleZ),\n default: z.unknown(),\n});\n\nexport const ScoreStrategyZ = z.object({\n type: z.literal('score'),\n field: z.string(),\n threshold: z.number(),\n above: z.unknown(),\n below: z.unknown(),\n});\n\nexport const ModelStrategyZ = z.object({\n type: z.literal('model'),\n modelId: z.string(),\n inputs: z.array(z.string()),\n outputMapping: z.record(z.string(), z.unknown()),\n default: z.unknown(),\n});\n\nexport const ExternalStrategyZ = z.object({\n type: z.literal('external'),\n endpoint: z.string(),\n method: z.enum(['GET', 'POST']).optional(),\n default: z.unknown(),\n timeoutMs: z.number().optional(),\n});\n\nexport const DecisionStrategyZ = z.discriminatedUnion('type', [\n RuleStrategyZ,\n ScoreStrategyZ,\n ModelStrategyZ,\n ExternalStrategyZ,\n]);\n\n// =============================================================================\n// ACTIVATION CONFIG SCHEMA\n// =============================================================================\n\nexport const RouteFilterZ = z.object({\n include: z.array(z.string()).optional(),\n exclude: z.array(z.string()).optional(),\n});\n\nexport const ActivationConfigZ = z.object({\n routes: RouteFilterZ.optional(),\n strategy: DecisionStrategyZ.optional(),\n});\n\n// =============================================================================\n// VALIDATION FUNCTIONS\n// =============================================================================\n\n/**\n * Validate a Condition object.\n */\nexport function validateCondition(data: unknown) {\n return ConditionZ.safeParse(data);\n}\n\n/**\n * Validate a DecisionStrategy object.\n */\nexport function validateStrategy(data: unknown) {\n return DecisionStrategyZ.safeParse(data);\n}\n\n/**\n * Validate an ActivationConfig object.\n */\nexport function validateActivationConfig(data: unknown) {\n return ActivationConfigZ.safeParse(data);\n}\n\n// =============================================================================\n// TYPE INFERENCE\n// =============================================================================\n\nexport type ConditionSchema = z.infer<typeof ConditionZ>;\nexport type RuleSchema = z.infer<typeof RuleZ>;\nexport type DecisionStrategySchema = z.infer<typeof DecisionStrategyZ>;\nexport type ActivationConfigSchema = z.infer<typeof ActivationConfigZ>;\n", "/**\n * Zod schemas for event validation.\n */\nimport { z } from 'zod';\n\nexport const EventSourceZ = z.enum(['posthog', 'canvas', 'derived']);\n\nexport const NormalizedEventZ = z.object({\n ts: z.number(),\n name: z.string(),\n source: EventSourceZ,\n props: z.record(z.string(), z.unknown()).optional(),\n schemaVersion: z.string(),\n});\n\nexport const EventFilterZ = z.object({\n names: z.array(z.string()).optional(),\n patterns: z.array(z.string()).optional(),\n sources: z.array(EventSourceZ).optional(),\n});\n\n/**\n * Validate a NormalizedEvent object.\n */\nexport function validateNormalizedEvent(data: unknown) {\n return NormalizedEventZ.safeParse(data);\n}\n\n/**\n * Validate an EventFilter object.\n */\nexport function validateEventFilter(data: unknown) {\n return EventFilterZ.safeParse(data);\n}\n\n/**\n * Type inference from Zod schema.\n */\nexport type NormalizedEventSchema = z.infer<typeof NormalizedEventZ>;\nexport type EventFilterSchema = z.infer<typeof EventFilterZ>;\n", "/**\n * Zod schemas for state validation.\n */\nimport { z } from 'zod';\n\nexport const StoredValueZ = z.object({\n value: z.unknown(),\n expiresAt: z.number().optional(),\n});\n\nexport const FrequencyEntryZ = z.object({\n count: z.number(),\n resetAt: z.number().optional(),\n});\n\n/**\n * Validate a StoredValue object.\n */\nexport function validateStoredValue(data: unknown) {\n return StoredValueZ.safeParse(data);\n}\n\n/**\n * Validate a FrequencyEntry object.\n */\nexport function validateFrequencyEntry(data: unknown) {\n return FrequencyEntryZ.safeParse(data);\n}\n\n/**\n * Type inference from Zod schema.\n */\nexport type StoredValueSchema = z.infer<typeof StoredValueZ>;\nexport type FrequencyEntrySchema = z.infer<typeof FrequencyEntryZ>;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["createPortal", "useState", "z", "z", "z", "z", "createPortal"]
|
|
3
|
+
"sources": ["../src/index.ts", "../../adaptives/adaptive-chatbot/dist/ChatAssistant.js", "../../adaptives/adaptive-chatbot/dist/useChat.js", "../../adaptives/adaptive-chatbot/dist/actionParser.js", "../../adaptives/adaptive-chatbot/dist/apiClient.js", "../../adaptives/adaptive-chatbot/dist/runtime.js", "../../adaptives/adaptive-faq/dist/executors.js", "../../adaptives/adaptive-faq/dist/FAQWidget.js", "../../adaptives/adaptive-faq/dist/runtime.js", "../../adaptives/adaptive-gamification/dist/runtime.js", "../../adaptives/adaptive-nav/dist/NavWidget.js", "../../adaptives/adaptive-nav/dist/runtime.js", "../src/apps/builtinRuntimeModules.generated.ts", "../src/components/TileWheel.tsx", "../src/config-validator.ts", "../src/overlays/schema.ts", "../src/overlays/fetcher.ts", "../src/SmartCanvasPortal.tsx", "../src/context/schema.ts", "../src/decisions/schema.ts", "../src/events/schema.ts", "../src/state/schema.ts"],
|
|
4
|
+
"sourcesContent": ["// ============================================================================\n// Early SynOS exposure for adaptive self-registration + shared React\n// ============================================================================\n// Adaptive bundles loaded via <script> (IIFE) check window.SynOS.appRegistry\n// to self-register. In the Chrome extension's dev mode, adaptives load BEFORE\n// Syntro.init() runs. Expose the singleton appRegistry here (module scope) so\n// it's available as soon as smart-canvas.min.js loads. Syntro.init() later\n// enriches the SynOS object with runtime/version but reuses the same registry.\n//\n// React and ReactDOM are also exposed here so that adaptive bundles built with\n// syntroReactPlugin can resolve their lazy shims via SynOS.React / SynOS.ReactDOM.\n// This makes the runtime SDK the single React owner \u2014 adaptives and the editor\n// SDK consume React from SynOS, never from their own bundles.\n\nimport React from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport * as ReactDOMClient from 'react-dom/client';\nimport { appRegistry as _earlyAppRegistry } from './apps';\nimport { registerBuiltinRuntimeModules } from './apps/builtinRuntimeModules.generated';\n\n// Build-time constants injected by esbuild `define` in build-cdn.js / build.js\ndeclare const __BUILD_TIMESTAMP__: string;\ndeclare const __BUILD_GIT_HASH__: string;\n\nexport const RUNTIME_SDK_BUILD =\n typeof __BUILD_TIMESTAMP__ !== 'undefined'\n ? `${__BUILD_TIMESTAMP__} (${__BUILD_GIT_HASH__})`\n : 'dev';\n\nexport * from './api';\nexport * from './components/ShadowCanvasOverlay';\nexport * from './components/TileCard';\nexport * from './components/TileWheel';\nexport * from './config-validator';\nexport * from './configFetcher';\nexport * from './controller';\nexport * from './experiments';\nexport * from './hooks/useShadowCanvasConfig';\n// Metrics for session-based targeting\nexport * from './metrics';\nexport * from './overlays/fetcher';\nexport * from './overlays/schema';\nexport * from './overlays/types';\nexport * from './ShadowRootContext';\nexport * from './SmartCanvasApp';\nexport * from './SmartCanvasElement';\nexport * from './SmartCanvasPortal';\nexport * from './telemetry';\nexport * from './types';\nexport * from './version';\n\n// ============================================================================\n// v2 Runtime Modules\n// ============================================================================\n\n// Actions - Unified execution layer for interventions\nexport * from './actions';\n// Apps - SynOS app system\nexport * from './apps';\n// Context - Page/session/viewport state management\nexport * from './context';\n// Decisions - Strategy-based conditional rendering\nexport * from './decisions';\n// Events - Normalized event stream\nexport * from './events';\n// Events - Normalized event stream\nexport * from './events';\nexport type { NavigationDiagnostics, NavigationListener } from './navigation/NavigationMonitor';\n// Navigation - Centralized History API monitoring\nexport { NavigationMonitor } from './navigation/NavigationMonitor';\n// Notifications - Toast notification system\nexport * from './notifications';\n// React context for runtime access\nexport {\n RuntimeProvider,\n useDecision,\n usePageContext,\n useRuntime,\n useRuntimeContext,\n useRuntimeEvents,\n useRuntimeState,\n useSessionContext,\n useViewportContext,\n} from './RuntimeProvider';\nexport type { RuntimeMode, SmartCanvasRuntime, SmartCanvasRuntimeOptions } from './runtime';\n// Unified runtime\nexport { createSmartCanvasRuntime, RUNTIME_VERSION } from './runtime';\n// State - Persistent state storage with helpers\nexport * from './state';\n// State - Persistent state storage with helpers\nexport * from './state';\n// Surfaces - Managed surface system for rendering UI\nexport * from './surfaces';\n// Widgets - Mountable component registry\nexport * from './widgets';\n\n// ============================================================================\n// Single-token initialization\n// ============================================================================\n\nexport type { SyntroInitOptions, SyntroInitResult } from './bootstrap';\nexport { Syntro } from './bootstrap';\nexport type { SyntroTokenPayload } from './token';\nexport { decodeToken, encodeToken } from './token';\n\nif (typeof window !== 'undefined') {\n console.log(`[Syntro Runtime] Build: ${RUNTIME_SDK_BUILD}`);\n\n const existing = (window as any).SynOS;\n const registry = existing?.appRegistry || _earlyAppRegistry;\n (window as any).SynOS = {\n ...existing,\n appRegistry: registry,\n _runtimeBuild: RUNTIME_SDK_BUILD,\n React,\n ReactDOM: { ...ReactDOMClient, createPortal, flushSync },\n };\n\n // Register all built-in adaptive runtime modules at module load time.\n // This ensures executors, widgets, and event handlers are available\n // before Syntro.init() runs or any config is fetched.\n registerBuiltinRuntimeModules(registry);\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Adaptive Chatbot - ChatAssistant Component\n *\n * Main React component for the AI chat assistant widget.\n * Renders a message list with auto-scroll, loading indicator, and input form.\n */\nimport { base, purple, red, slateGrey } from '@syntro/design-system/tokens';\nimport React, { useEffect, useRef } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { useChat } from './useChat';\n// ============================================================================\n// Styles\n// ============================================================================\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '14px',\n touchAction: 'none',\n },\n messageList: {\n flex: 1,\n overflowY: 'auto',\n padding: '12px',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n },\n messageBubble: {\n maxWidth: '85%',\n padding: '8px 12px',\n borderRadius: '12px',\n lineHeight: 1.5,\n wordBreak: 'break-word',\n },\n userMessage: {\n alignSelf: 'flex-end',\n backgroundColor: purple[4],\n color: base.white,\n borderBottomRightRadius: '4px',\n },\n assistantMessage: {\n alignSelf: 'flex-start',\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n color: slateGrey[10],\n borderBottomLeftRadius: '4px',\n },\n loadingDots: {\n alignSelf: 'flex-start',\n padding: '8px 16px',\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n borderRadius: '12px',\n color: slateGrey[8],\n fontSize: '13px',\n },\n errorBanner: {\n padding: '8px 12px',\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\n color: red[4],\n fontSize: '13px',\n borderRadius: '8px',\n margin: '0 12px',\n },\n inputForm: {\n display: 'flex',\n gap: '8px',\n padding: '12px',\n borderTop: '1px solid rgba(255, 255, 255, 0.06)',\n },\n input: {\n flex: 1,\n padding: '8px 12px',\n borderRadius: '8px',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\n color: slateGrey[12],\n fontSize: '14px',\n outline: 'none',\n fontFamily: 'inherit',\n },\n sendButton: {\n padding: '8px 16px',\n borderRadius: '8px',\n border: 'none',\n backgroundColor: purple[4],\n color: base.white,\n fontWeight: 600,\n fontSize: '13px',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n },\n sendButtonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n};\n// ============================================================================\n// MessageBubble Component\n// ============================================================================\nfunction MessageBubble({ message }) {\n const isUser = message.role === 'user';\n const bubbleStyle = {\n ...styles.messageBubble,\n ...(isUser ? styles.userMessage : styles.assistantMessage),\n };\n return _jsx(\"div\", { style: bubbleStyle, children: message.text });\n}\nexport function ChatAssistant({ config, runtime, tileId }) {\n const { messages, isLoading, error, sendMessage, clearMessages: _clearMessages, } = useChat({\n backendUrl: config.backendUrl,\n tileId,\n runtime,\n greeting: config.greeting,\n maxHistory: config.maxHistory,\n mlflowRunId: config.mlflowRunId,\n });\n const messageListRef = useRef(null);\n const inputRef = useRef(null);\n // Auto-scroll to bottom on new messages\n useEffect(() => {\n if (messageListRef.current) {\n messageListRef.current.scrollTop = messageListRef.current.scrollHeight;\n }\n }, []);\n const handleSubmit = (e) => {\n e.preventDefault();\n const input = inputRef.current;\n if (!input || !input.value.trim() || isLoading)\n return;\n const text = input.value;\n input.value = '';\n sendMessage(text);\n };\n return (_jsxs(\"div\", { style: styles.container, \"data-testid\": \"chat-assistant\", children: [_jsxs(\"div\", { ref: messageListRef, style: styles.messageList, children: [messages.map((msg) => (_jsx(MessageBubble, { message: msg }, msg.id))), isLoading && _jsx(\"div\", { style: styles.loadingDots, children: \"Thinking...\" })] }), error && _jsx(\"div\", { style: styles.errorBanner, children: error }), _jsxs(\"form\", { onSubmit: handleSubmit, style: styles.inputForm, children: [_jsx(\"input\", { ref: inputRef, style: styles.input, placeholder: \"Ask anything...\", disabled: isLoading, \"data-testid\": \"chat-input\" }), _jsx(\"button\", { type: \"submit\", disabled: isLoading, style: {\n ...styles.sendButton,\n ...(isLoading ? styles.sendButtonDisabled : {}),\n }, \"data-testid\": \"chat-send\", children: \"Send\" })] })] }));\n}\n// ============================================================================\n// Mountable Widget Interface\n// ============================================================================\nexport const ChatAssistantMountableWidget = {\n mount(container, mountConfig) {\n const { config, runtime, tileId = 'chatbot-widget', } = (mountConfig || {});\n // React rendering when config + runtime + ReactDOM are available\n if (config && runtime && typeof createRoot === 'function') {\n const root = createRoot(container);\n root.render(React.createElement(ChatAssistant, {\n config,\n runtime,\n tileId,\n }));\n return () => {\n root.unmount();\n };\n }\n if (!config || !runtime) {\n container.innerHTML = `<div style=\"padding: 16px; color: ${slateGrey[8]};\">Chat widget requires config and runtime.</div>`;\n return () => {\n container.innerHTML = '';\n };\n }\n // HTML fallback\n container.innerHTML = `\n <div style=\"padding: 16px; font-family: system-ui; color: ${slateGrey[10]};\">\n <p style=\"margin: 0 0 8px; color: ${slateGrey[8]};\">${config.greeting || 'Hi! How can I help?'}</p>\n <p style=\"margin: 0; font-size: 12px; color: ${slateGrey[7]};\">Chat widget mounted. Awaiting React renderer.</p>\n </div>\n `;\n return () => {\n container.innerHTML = '';\n };\n },\n};\nexport default ChatAssistant;\n", "/**\n * Adaptive Chatbot - useChat Hook\n *\n * React hook managing chat message state, API communication,\n * history management, and action execution via the runtime ActionEngine.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport { parseActions } from './actionParser';\nimport { sendMessage } from './apiClient';\nlet nextId = 0;\nfunction generateId() {\n return `msg-${Date.now()}-${++nextId}`;\n}\nexport function useChat(options) {\n const { backendUrl, tileId, runtime, greeting, maxHistory = 20, mlflowRunId, config } = options;\n const [messages, setMessages] = useState(() => {\n if (greeting) {\n return [\n {\n id: generateId(),\n role: 'assistant',\n text: greeting,\n timestamp: Date.now(),\n },\n ];\n }\n return [];\n });\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState(null);\n const batchHandleRef = useRef(null);\n const send = useCallback(async (text) => {\n const trimmed = text.trim();\n if (!trimmed)\n return;\n setError(null);\n const userMessage = {\n id: generateId(),\n role: 'user',\n text: trimmed,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n try {\n // Build history from current messages + new user message\n const currentMessages = [...messages, userMessage];\n const historySlice = currentMessages.slice(-maxHistory).map((m) => ({\n role: m.role,\n content: m.text,\n }));\n const response = await sendMessage(backendUrl, {\n message: trimmed,\n history: historySlice,\n mlflow_run_id: mlflowRunId,\n current_config: config,\n });\n // Parse actions from the LLM response\n const { displayText, actions } = parseActions(response.response);\n const assistantMessage = {\n id: generateId(),\n role: 'assistant',\n text: displayText,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, assistantMessage]);\n // Execute actions if present\n if (actions.length > 0) {\n // Revert previous batch\n if (batchHandleRef.current?.isApplied()) {\n await batchHandleRef.current.revertAll();\n }\n batchHandleRef.current = await runtime.actions.applyBatch(actions);\n runtime.events.publish('chatbot.actions_applied', {\n count: actions.length,\n kinds: actions.map((a) => a.kind),\n tileId,\n });\n }\n }\n catch (err) {\n const message = err instanceof Error ? err.message : 'An unexpected error occurred';\n setError(message);\n }\n finally {\n setIsLoading(false);\n }\n }, [backendUrl, messages, maxHistory, mlflowRunId, config, runtime, tileId]);\n const clearMessages = useCallback(() => {\n setMessages([]);\n setError(null);\n // Revert any active actions\n if (batchHandleRef.current?.isApplied()) {\n batchHandleRef.current.revertAll();\n batchHandleRef.current = null;\n }\n sessionStorage.removeItem(`syntro:chatbot:history:${tileId}`);\n }, [tileId]);\n return {\n messages,\n isLoading,\n error,\n sendMessage: send,\n clearMessages,\n };\n}\n", "/**\n * Adaptive Chatbot - Action Parser\n *\n * Extracts JSON action blocks from LLM markdown responses.\n * Actions are identified by having a `kind` field in a ```json code fence.\n */\nconst JSON_FENCE_RE = /```json\\s*\\n([\\s\\S]*?)```/g;\n/**\n * Parse an LLM response, extracting action blocks from JSON code fences.\n *\n * - Blocks with a `kind` field are treated as actions and removed from display text.\n * - Blocks without `kind` or with invalid JSON are left in the display text.\n */\nexport function parseActions(input) {\n const actions = [];\n let displayText = input;\n // Collect matches in reverse order so we can splice display text without index shifting\n const matches = [];\n let match;\n // Reset regex state\n JSON_FENCE_RE.lastIndex = 0;\n while ((match = JSON_FENCE_RE.exec(input)) !== null) {\n matches.push({\n fullMatch: match[0],\n json: match[1],\n index: match.index,\n });\n }\n // Process in reverse to preserve indices when removing from displayText\n for (let i = matches.length - 1; i >= 0; i--) {\n const { fullMatch, json } = matches[i];\n let parsed;\n try {\n parsed = JSON.parse(json);\n }\n catch {\n // Malformed JSON \u2014 leave in display text\n continue;\n }\n if (typeof parsed === 'object' &&\n parsed !== null &&\n 'kind' in parsed &&\n typeof parsed.kind === 'string') {\n actions.unshift(parsed);\n // Remove the action block from display text\n displayText = displayText.replace(fullMatch, '');\n }\n }\n // Clean up extra blank lines left from removed blocks\n displayText = displayText.replace(/\\n{3,}/g, '\\n\\n').trim();\n return { displayText, actions };\n}\n", "/**\n * Adaptive Chatbot - API Client\n *\n * Auth-aware fetch client that reads Stytch JWT from cookies\n * and workspace ID from localStorage.\n */\nexport class AuthError extends Error {\n constructor(message) {\n super(message);\n this.name = 'AuthError';\n }\n}\n/**\n * Read auth credentials from browser cookie and localStorage.\n * Throws AuthError if credentials are missing.\n */\nexport function getAuthHeaders() {\n const cookieMatch = document.cookie.match(/stytch_session_jwt=([^;]*)/);\n if (!cookieMatch || !cookieMatch[1]) {\n throw new AuthError('No authentication token found');\n }\n const workspaceId = localStorage.getItem('syntrologie_workspace_id');\n if (!workspaceId) {\n throw new AuthError('No workspace ID found');\n }\n return {\n Authorization: `Bearer ${cookieMatch[1]}`,\n 'X-Workspace-Id': workspaceId,\n };\n}\n/**\n * Send a chat message to the backend.\n */\nexport async function sendMessage(url, request) {\n const authHeaders = getAuthHeaders();\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders,\n },\n body: JSON.stringify(request),\n });\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthError('Session expired or unauthorized');\n }\n throw new Error(`Chat request failed: ${response.status} ${response.statusText}`);\n }\n return response.json();\n}\n", "/**\n * Adaptive Chatbot - Runtime Module\n *\n * Runtime manifest for the AI chat assistant adaptive.\n * This is a widget-based adaptive with no action executors.\n */\nimport { ChatAssistantMountableWidget } from './ChatAssistant';\n// ============================================================================\n// App Runtime Manifest\n// ============================================================================\nexport const runtime = {\n id: 'adaptive-chatbot',\n version: '1.0.0',\n name: 'Chat Assistant',\n description: 'AI chat assistant with action execution capabilities',\n /** No action executors \u2014 chatbot uses existing action kinds via applyBatch */\n executors: [],\n /** Widget definitions for the runtime's WidgetRegistry */\n widgets: [\n {\n id: 'adaptive-chatbot:assistant',\n component: ChatAssistantMountableWidget,\n metadata: {\n name: 'Chat Assistant',\n description: 'AI-powered chat assistant that can execute DOM actions',\n icon: '\uD83D\uDCAC',\n },\n },\n ],\n};\nexport default runtime;\n", "/**\n * Adaptive FAQ - Action Executors\n *\n * Three executors that operate on the FAQStore:\n * - executeScrollToFaq: scroll to a FAQ item and optionally expand it\n * - executeToggleFaqItem: open / close / toggle a FAQ item\n * - executeUpdateFaq: add, remove, reorder, or replace FAQ items\n */\n// ============================================================================\n// Helpers\n// ============================================================================\n/**\n * Resolve a FAQ item by direct ID or by fuzzy question text match.\n * Throws if neither yields a result.\n */\nfunction resolveItem(store, itemId, itemQuestion) {\n if (itemId) {\n const found = store.getState().items.find((i) => i.config.id === itemId);\n if (found)\n return found;\n }\n if (itemQuestion) {\n const found = store.findByQuestion(itemQuestion);\n if (found)\n return found;\n }\n throw new Error('FAQ item not found');\n}\n// ============================================================================\n// executeScrollToFaq\n// ============================================================================\n/**\n * Scroll to a FAQ item in the DOM and optionally expand it.\n *\n * Looks up the item by `itemId` or `itemQuestion`, scrolls the matching\n * `[data-faq-item-id]` element into view, and expands it unless\n * `expand` is explicitly set to `false`.\n */\nexport async function executeScrollToFaq(action, context, store) {\n const item = resolveItem(store, action.itemId, action.itemQuestion);\n const { id } = item.config;\n // Expand the item unless explicitly told not to\n if (action.expand !== false) {\n store.expand(id);\n }\n // Scroll the DOM element into view (may be absent in test environments)\n const el = document.querySelector(`[data-faq-item-id=\"${id}\"]`);\n if (el) {\n el.scrollIntoView({\n behavior: action.behavior ?? 'smooth',\n });\n }\n // Publish analytics event\n context.publishEvent('faq:scroll_to', { itemId: id });\n return {\n cleanup: () => {\n // Optionally collapse on revert\n },\n };\n}\n// ============================================================================\n// executeToggleFaqItem\n// ============================================================================\n/**\n * Open, close, or toggle a FAQ item's expanded state.\n */\nexport async function executeToggleFaqItem(action, context, store) {\n const item = resolveItem(store, action.itemId, action.itemQuestion);\n const { id } = item.config;\n const desiredState = action.state ?? 'toggle';\n let newState;\n switch (desiredState) {\n case 'open':\n store.expand(id);\n newState = 'open';\n break;\n case 'closed':\n store.collapse(id);\n newState = 'closed';\n break;\n default: {\n const wasExpanded = store.getState().expandedItems.has(id);\n store.toggle(id);\n newState = wasExpanded ? 'closed' : 'open';\n break;\n }\n }\n context.publishEvent('faq:toggle', { itemId: id, newState });\n return {\n cleanup: () => {\n // Revert toggle on cleanup\n },\n };\n}\n// ============================================================================\n// executeUpdateFaq\n// ============================================================================\n/**\n * Add, remove, reorder, or replace FAQ items in the store.\n */\nexport async function executeUpdateFaq(action, context, store) {\n switch (action.operation) {\n case 'add': {\n const items = action.items ?? [];\n const position = action.position === 'prepend' ? 'prepend' : 'append';\n store.addItems(items, position);\n break;\n }\n case 'remove': {\n if (!action.itemId) {\n throw new Error('FAQ item not found');\n }\n // Verify the item exists before removing\n const exists = store.getState().items.some((i) => i.config.id === action.itemId);\n if (!exists) {\n throw new Error('FAQ item not found');\n }\n store.removeItem(action.itemId);\n break;\n }\n case 'reorder': {\n const order = action.order ?? [];\n store.reorderItems(order);\n break;\n }\n case 'replace': {\n const items = action.items ?? [];\n store.replaceItems(items);\n break;\n }\n }\n context.publishEvent('faq:update', { operation: action.operation });\n return {\n cleanup: () => {\n // Could snapshot previous state for undo\n },\n };\n}\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n/**\n * All executors provided by adaptive-faq.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executorDefinitions = [\n { kind: 'faq:scroll_to', executor: executeScrollToFaq },\n { kind: 'faq:toggle_item', executor: executeToggleFaqItem },\n { kind: 'faq:update', executor: executeUpdateFaq },\n];\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Adaptive FAQ - FAQWidget Component\n *\n * React component that renders a collapsible Q&A accordion with per-item\n * conditional visibility based on showWhen decision strategies.\n *\n * Demonstrates the compositional action pattern where child actions\n * (faq:question) serve as configuration data for the parent widget.\n */\nimport { base, purple, slateGrey } from '@syntro/design-system/tokens';\nimport React, { useCallback, useEffect, useMemo, useReducer, useState } from 'react';\nimport { createRoot } from 'react-dom/client';\n// ============================================================================\n// Helpers\n// ============================================================================\n/** Extract plain text from an FAQAnswer for search matching */\nfunction getAnswerText(answer) {\n if (typeof answer === 'string')\n return answer;\n if (answer.type === 'rich')\n return answer.html;\n return answer.content;\n}\n/** Render an FAQAnswer based on its type */\nfunction renderAnswer(answer) {\n if (typeof answer === 'string') {\n return _jsx(\"p\", { style: { margin: 0 }, children: answer });\n }\n if (answer.type === 'rich') {\n // biome-ignore lint/security/noDangerouslySetInnerHtml: content is pre-sanitized by backend \u2014 FAQAnswer.html is CMS/config content, not user-controlled input\n return _jsx(\"div\", { style: { margin: 0 }, dangerouslySetInnerHTML: { __html: answer.html } });\n }\n // markdown \u2014 render content as text (full markdown rendering is a future enhancement)\n return _jsx(\"p\", { style: { margin: 0 }, children: answer.content });\n}\n/** Resolve feedback config into a normalized FeedbackConfig or null */\nfunction resolveFeedbackConfig(feedback) {\n if (!feedback)\n return null;\n if (feedback === true) {\n return { style: 'thumbs' };\n }\n return feedback;\n}\n/** Get the feedback prompt text */\nfunction getFeedbackPrompt(feedbackConfig) {\n return feedbackConfig.prompt || 'Was this helpful?';\n}\n// ============================================================================\n// Styles\n// ============================================================================\nconst baseStyles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n maxWidth: '800px',\n margin: '0 auto',\n },\n searchWrapper: {\n marginBottom: '16px',\n },\n searchInput: {\n width: '100%',\n padding: '12px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n outline: 'none',\n transition: 'border-color 0.15s ease',\n },\n accordion: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n },\n item: {\n borderRadius: '8px',\n overflow: 'hidden',\n transition: 'box-shadow 0.15s ease',\n },\n question: {\n width: '100%',\n padding: '16px 20px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n border: 'none',\n cursor: 'pointer',\n fontSize: '15px',\n fontWeight: 500,\n textAlign: 'left',\n transition: 'background-color 0.15s ease',\n },\n chevron: {\n fontSize: '18px',\n transition: 'transform 0.2s ease',\n },\n answer: {\n padding: '0 20px 16px 20px',\n fontSize: '14px',\n lineHeight: 1.6,\n overflow: 'hidden',\n transition: 'max-height 0.2s ease, padding 0.2s ease',\n },\n category: {\n display: 'inline-block',\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n padding: '4px 8px',\n borderRadius: '4px',\n marginBottom: '8px',\n },\n categoryHeader: {\n fontSize: '13px',\n fontWeight: 700,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n padding: '12px 4px 6px 4px',\n marginTop: '8px',\n },\n feedback: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginTop: '12px',\n paddingTop: '10px',\n borderTop: '1px solid rgba(0, 0, 0, 0.08)',\n fontSize: '13px',\n },\n feedbackButton: {\n background: 'none',\n border: '1px solid transparent',\n cursor: 'pointer',\n fontSize: '16px',\n padding: '4px 8px',\n borderRadius: '4px',\n transition: 'background-color 0.15s ease, border-color 0.15s ease',\n },\n feedbackButtonSelected: {\n borderColor: 'rgba(0, 0, 0, 0.2)',\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n },\n emptyState: {\n textAlign: 'center',\n padding: '48px 24px',\n fontSize: '14px',\n },\n noResults: {\n textAlign: 'center',\n padding: '32px 16px',\n fontSize: '14px',\n },\n};\nconst themeStyles = {\n light: {\n container: {\n backgroundColor: base.white,\n color: slateGrey[1],\n },\n searchInput: {\n backgroundColor: slateGrey[12],\n border: `1px solid ${slateGrey[11]}`,\n color: slateGrey[1],\n },\n item: {\n backgroundColor: slateGrey[12],\n border: `1px solid ${slateGrey[11]}`,\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',\n },\n question: {\n backgroundColor: 'transparent',\n color: slateGrey[1],\n },\n questionHover: {\n backgroundColor: slateGrey[12],\n },\n answer: {\n color: slateGrey[6],\n },\n category: {\n backgroundColor: purple[8],\n color: purple[2],\n },\n categoryHeader: {\n color: slateGrey[7],\n },\n emptyState: {\n color: slateGrey[8],\n },\n feedbackPrompt: {\n color: slateGrey[7],\n },\n },\n dark: {\n container: {\n backgroundColor: slateGrey[1],\n color: slateGrey[12],\n },\n searchInput: {\n backgroundColor: slateGrey[3],\n border: `1px solid ${slateGrey[5]}`,\n color: slateGrey[12],\n },\n item: {\n backgroundColor: slateGrey[3],\n border: `1px solid ${slateGrey[5]}`,\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n },\n question: {\n backgroundColor: 'transparent',\n color: slateGrey[12],\n },\n questionHover: {\n backgroundColor: slateGrey[5],\n },\n answer: {\n color: slateGrey[8],\n },\n category: {\n backgroundColor: purple[0],\n color: purple[6],\n },\n categoryHeader: {\n color: slateGrey[8],\n },\n emptyState: {\n color: slateGrey[7],\n },\n feedbackPrompt: {\n color: slateGrey[8],\n },\n },\n};\nfunction FAQItem({ item, isExpanded, onToggle, theme, feedbackConfig, feedbackValue, onFeedback, }) {\n const [isHovered, setIsHovered] = useState(false);\n const colors = themeStyles[theme];\n const { question, answer } = item.config;\n const itemStyle = {\n ...baseStyles.item,\n ...colors.item,\n ...(isExpanded ? colors.itemExpanded : {}),\n };\n const questionStyle = {\n ...baseStyles.question,\n ...colors.question,\n ...(isHovered ? colors.questionHover : {}),\n };\n const chevronStyle = {\n ...baseStyles.chevron,\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\n };\n const answerStyle = {\n ...baseStyles.answer,\n ...colors.answer,\n maxHeight: isExpanded ? '500px' : '0',\n paddingBottom: isExpanded ? '16px' : '0',\n };\n const feedbackStyle = {\n ...baseStyles.feedback,\n ...colors.feedbackPrompt,\n };\n return (_jsxs(\"div\", { style: itemStyle, \"data-faq-item-id\": item.config.id, children: [_jsxs(\"button\", { type: \"button\", style: questionStyle, onClick: onToggle, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), \"aria-expanded\": isExpanded, children: [_jsx(\"span\", { children: question }), _jsx(\"span\", { style: chevronStyle, children: '\\u25BC' })] }), _jsxs(\"div\", { style: answerStyle, \"aria-hidden\": !isExpanded, children: [renderAnswer(answer), isExpanded && feedbackConfig && (_jsxs(\"div\", { style: feedbackStyle, children: [_jsx(\"span\", { children: getFeedbackPrompt(feedbackConfig) }), _jsx(\"button\", { type: \"button\", style: {\n ...baseStyles.feedbackButton,\n ...(feedbackValue === 'up' ? baseStyles.feedbackButtonSelected : {}),\n }, \"aria-label\": \"Thumbs up\", onClick: () => onFeedback(item.config.id, question, 'up'), children: '\\uD83D\\uDC4D' }), _jsx(\"button\", { type: \"button\", style: {\n ...baseStyles.feedbackButton,\n ...(feedbackValue === 'down' ? baseStyles.feedbackButtonSelected : {}),\n }, \"aria-label\": \"Thumbs down\", onClick: () => onFeedback(item.config.id, question, 'down'), children: '\\uD83D\\uDC4E' })] }))] })] }));\n}\n// ============================================================================\n// FAQWidget Component\n// ============================================================================\n/**\n * FAQWidget - Renders a collapsible Q&A accordion with per-item activation.\n *\n * This component demonstrates the compositional action pattern:\n * - Parent (FAQWidget) receives `config.actions` array\n * - Each action has optional `showWhen` for per-item visibility\n * - Parent evaluates showWhen and filters visible questions\n * - Parent manages expand state and re-rendering on context changes\n */\nexport function FAQWidget({ config, runtime, instanceId }) {\n // Force re-render when context/accumulator changes.\n // renderTick is used as a useMemo dependency to invalidate cached showWhen evaluations.\n const [renderTick, forceUpdate] = useReducer((x) => x + 1, 0);\n // Track expanded question IDs\n const [expandedIds, setExpandedIds] = useState(new Set());\n // Search query state\n const [searchQuery, setSearchQuery] = useState('');\n // Track feedback state per item\n const [feedbackState, setFeedbackState] = useState(new Map());\n // Resolve feedback config\n const feedbackConfig = useMemo(() => resolveFeedbackConfig(config.feedback), [config.feedback]);\n // Subscribe to context changes for reactive updates\n useEffect(() => {\n const unsubscribe = runtime.context.subscribe(() => {\n forceUpdate();\n });\n return unsubscribe;\n }, [runtime.context]);\n // Subscribe to accumulator changes for event_count-based showWhen\n useEffect(() => {\n if (!runtime.accumulator?.subscribe)\n return;\n return runtime.accumulator.subscribe(() => {\n forceUpdate();\n });\n }, [runtime.accumulator]);\n // Register accumulator predicates from scope config\n useEffect(() => {\n if (!config.scope || !runtime.accumulator?.register)\n return;\n const { events: eventNames, urlContains, props: propFilters } = config.scope;\n // Scan showWhen conditions for event_count keys\n const keys = new Set();\n for (const action of config.actions) {\n if (action.showWhen?.type === 'rules') {\n for (const rule of action.showWhen.rules) {\n for (const cond of rule.conditions) {\n if (cond.type === 'event_count' && cond.key) {\n keys.add(cond.key);\n }\n }\n }\n }\n }\n for (const key of keys) {\n runtime.accumulator.register(key, (event) => {\n if (!eventNames.includes(event.name))\n return false;\n if (urlContains) {\n const pathname = String(event.props?.pathname ?? '');\n if (!pathname.includes(urlContains))\n return false;\n }\n if (propFilters) {\n for (const [k, v] of Object.entries(propFilters)) {\n if (event.props?.[k] !== v)\n return false;\n }\n }\n return true;\n });\n }\n }, [config.scope, config.actions, runtime.accumulator]);\n // Subscribe to faq:open:* events from overlay CTA clicks\n useEffect(() => {\n if (!runtime.events.subscribe)\n return;\n // Check EventBus history for pending faq:open events\n // (may have fired before this widget mounted, e.g. when canvas was closed)\n if (runtime.events.getRecent) {\n const recentEvents = runtime.events.getRecent({ patterns: ['^action\\\\.tooltip_cta_clicked$', '^action\\\\.modal_cta_clicked$'] }, 10);\n const pendingEvent = recentEvents\n .filter((e) => {\n const actionId = e.props?.actionId;\n return typeof actionId === 'string' && actionId.startsWith('faq:open:');\n })\n .pop(); // Most recent\n if (pendingEvent && Date.now() - pendingEvent.ts < 10000) {\n const questionId = pendingEvent.props.actionId.replace('faq:open:', '');\n setExpandedIds(new Set([questionId]));\n // Scroll into view after render\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${questionId}\"]`);\n if (el)\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n }\n }\n // Subscribe to future CTA events\n const unsubscribe = runtime.events.subscribe({ patterns: ['^action\\\\.tooltip_cta_clicked$', '^action\\\\.modal_cta_clicked$'] }, (event) => {\n const actionId = event.props?.actionId;\n if (typeof actionId !== 'string' || !actionId.startsWith('faq:open:'))\n return;\n const questionId = actionId.replace('faq:open:', '');\n setExpandedIds(new Set([questionId]));\n // Scroll the question into view\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${questionId}\"]`);\n if (el)\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n // Request canvas open (for future tile-based FAQ rendering)\n runtime.events.publish('canvas.requestOpen');\n });\n return unsubscribe;\n }, [runtime]);\n // Filter visible questions based on per-item showWhen\n // biome-ignore lint/correctness/useExhaustiveDependencies: renderTick is intentionally included to force re-evaluation when the runtime's mutable context changes (subscribed above via forceUpdate)\n const visibleQuestions = useMemo(() => config.actions.filter((q) => {\n // No showWhen = always visible\n if (!q.showWhen)\n return true;\n // Evaluate the decision strategy\n const result = runtime.evaluateSync(q.showWhen);\n return result.value;\n }), [config.actions, runtime, renderTick]);\n // NOTE: faq:question_revealed is now published by useNotifyWatcher in\n // ShadowCanvasOverlay (always mounted), so it fires even with drawer closed.\n // Apply priority ordering\n const orderedQuestions = useMemo(() => {\n if (config.ordering === 'priority') {\n return [...visibleQuestions].sort((a, b) => (b.config.priority ?? 0) - (a.config.priority ?? 0));\n }\n // 'static' or undefined \u2014 preserve config order\n return visibleQuestions;\n }, [visibleQuestions, config.ordering]);\n // Apply search filter\n const filteredQuestions = useMemo(() => {\n if (!config.searchable || !searchQuery.trim()) {\n return orderedQuestions;\n }\n const query = searchQuery.toLowerCase();\n return orderedQuestions.filter((q) => q.config.question.toLowerCase().includes(query) ||\n getAnswerText(q.config.answer).toLowerCase().includes(query) ||\n q.config.category?.toLowerCase().includes(query));\n }, [orderedQuestions, searchQuery, config.searchable]);\n // Group by category\n const categoryGroups = useMemo(() => {\n const groups = new Map();\n for (const q of filteredQuestions) {\n const cat = q.config.category;\n if (!groups.has(cat)) {\n groups.set(cat, []);\n }\n groups.get(cat).push(q);\n }\n return groups;\n }, [filteredQuestions]);\n // Check if any items have categories\n const hasCategories = useMemo(() => filteredQuestions.some((q) => q.config.category), [filteredQuestions]);\n // Resolve theme (auto -> detect system preference)\n const resolvedTheme = useMemo(() => {\n if (config.theme && config.theme !== 'auto')\n return config.theme;\n // Check system preference (SSR-safe)\n if (typeof window !== 'undefined') {\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n }, [config.theme]);\n // Handle question toggle\n const handleToggle = useCallback((id) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (config.expandBehavior === 'single') {\n // Single mode: collapse all others\n if (prev.has(id)) {\n return new Set();\n }\n return new Set([id]);\n }\n // Multiple mode: toggle this one\n if (prev.has(id)) {\n next.delete(id);\n }\n else {\n next.add(id);\n }\n return next;\n });\n // Publish toggle event for analytics\n runtime.events.publish('faq:toggled', {\n instanceId,\n questionId: id,\n expanded: !expandedIds.has(id),\n timestamp: Date.now(),\n });\n }, [config.expandBehavior, runtime.events, instanceId, expandedIds]);\n // Handle feedback\n const handleFeedback = useCallback((itemId, question, value) => {\n setFeedbackState((prev) => {\n const next = new Map(prev);\n next.set(itemId, value);\n return next;\n });\n runtime.events.publish('faq:feedback', {\n itemId,\n question,\n value,\n });\n }, [runtime.events]);\n // Compute styles\n const containerStyle = {\n ...baseStyles.container,\n ...themeStyles[resolvedTheme].container,\n };\n const searchInputStyle = {\n ...baseStyles.searchInput,\n ...themeStyles[resolvedTheme].searchInput,\n };\n const emptyStateStyle = {\n ...baseStyles.emptyState,\n ...themeStyles[resolvedTheme].emptyState,\n };\n const categoryHeaderStyle = {\n ...baseStyles.categoryHeader,\n ...themeStyles[resolvedTheme].categoryHeader,\n };\n // Render a list of FAQ items\n const renderItems = (items) => items.map((q) => (_jsx(FAQItem, { item: q, isExpanded: expandedIds.has(q.config.id), onToggle: () => handleToggle(q.config.id), theme: resolvedTheme, feedbackConfig: feedbackConfig, feedbackValue: feedbackState.get(q.config.id), onFeedback: handleFeedback }, q.config.id)));\n // Empty state (no visible questions at all)\n if (visibleQuestions.length === 0) {\n return (_jsx(\"div\", { style: containerStyle, \"data-adaptive-id\": instanceId, \"data-adaptive-type\": \"adaptive-faq\", children: _jsx(\"div\", { style: emptyStateStyle, children: \"No FAQ questions available.\" }) }));\n }\n return (_jsxs(\"div\", { style: containerStyle, \"data-adaptive-id\": instanceId, \"data-adaptive-type\": \"adaptive-faq\", children: [config.searchable && (_jsx(\"div\", { style: baseStyles.searchWrapper, children: _jsx(\"input\", { type: \"text\", placeholder: \"Search questions...\", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), style: searchInputStyle }) })), _jsx(\"div\", { style: baseStyles.accordion, children: hasCategories\n ? Array.from(categoryGroups.entries()).map(([category, items]) => (_jsxs(React.Fragment, { children: [category && (_jsx(\"div\", { style: categoryHeaderStyle, \"data-category-header\": category, children: category })), renderItems(items)] }, category ?? '__ungrouped')))\n : renderItems(filteredQuestions) }), config.searchable && filteredQuestions.length === 0 && searchQuery && (_jsxs(\"div\", { style: { ...baseStyles.noResults, ...themeStyles[resolvedTheme].emptyState }, children: [\"No questions found matching \\\"\", searchQuery, \"\\\"\"] }))] }));\n}\n// ============================================================================\n// Mountable Widget Interface\n// ============================================================================\n/**\n * Mountable widget interface for the runtime's WidgetRegistry.\n */\nexport const FAQMountableWidget = {\n mount(container, config) {\n const { runtime, instanceId = 'faq-widget', ...faqConfig } = config || {\n expandBehavior: 'single',\n searchable: false,\n theme: 'auto',\n actions: [],\n };\n // React rendering when runtime + ReactDOM are available\n if (runtime && typeof createRoot === 'function') {\n const root = createRoot(container);\n root.render(React.createElement(FAQWidget, {\n config: faqConfig,\n runtime: runtime,\n instanceId,\n }));\n return () => {\n root.unmount();\n };\n }\n // HTML fallback when React is not available\n const questions = faqConfig.actions || [];\n container.innerHTML = `\n <div style=\"font-family: system-ui; max-width: 800px;\">\n ${questions\n .map((q) => `\n <div style=\"margin-bottom: 8px; padding: 16px; background: ${slateGrey[12]}; border-radius: 8px;\">\n <strong>${q.config.question}</strong>\n <p style=\"margin-top: 8px; color: ${slateGrey[6]};\">${getAnswerText(q.config.answer)}</p>\n </div>\n `)\n .join('')}\n </div>\n `;\n return () => {\n container.innerHTML = '';\n };\n },\n};\nexport default FAQWidget;\n", "/**\n * Adaptive FAQ - Runtime Module\n *\n * Runtime manifest for the FAQ accordion adaptive.\n * Provides action executors and widget registration.\n */\nimport { executorDefinitions } from './executors';\nimport { FAQMountableWidget } from './FAQWidget';\n// ============================================================================\n// App Runtime Manifest\n// ============================================================================\n/**\n * Runtime manifest for adaptive-faq.\n *\n * Provides:\n * - FAQ action executors (scroll_to, toggle_item, update)\n * - Widget-based accordion (compositional faq:question actions)\n */\nexport const runtime = {\n id: 'adaptive-faq',\n version: '2.0.0',\n name: 'FAQ Accordion',\n description: 'Collapsible Q&A accordion with actions, rich content, feedback, and personalization',\n /**\n * Action executors for programmatic FAQ interaction.\n */\n executors: executorDefinitions,\n /**\n * Widget definitions for the runtime's WidgetRegistry.\n */\n widgets: [\n {\n id: 'adaptive-faq:accordion',\n component: FAQMountableWidget,\n metadata: {\n name: 'FAQ Accordion',\n description: 'Collapsible Q&A accordion with search, categories, and feedback',\n icon: '\u2753',\n },\n },\n ],\n /**\n * Extract notify watcher entries from tile config props.\n * The runtime evaluates these continuously (even with drawer closed)\n * and publishes faq:question_revealed when showWhen transitions false \u2192 true.\n */\n notifyWatchers(props) {\n const actions = (props.actions ?? []);\n return actions\n .filter((a) => a.notify && a.showWhen)\n .map((a) => ({\n id: `faq:${a.config.id}`,\n strategy: a.showWhen,\n eventName: 'faq:question_revealed',\n eventProps: {\n questionId: a.config.id,\n question: a.config.question,\n title: a.notify.title,\n body: a.notify.body,\n icon: a.notify.icon,\n },\n }));\n },\n};\nexport default runtime;\n", "/**\n * Adaptive Gamification - Runtime Module\n *\n * Gamification actions: awardBadge, addPoints.\n * Provides gamification features like badges, points, and rewards.\n */\n// ============================================================================\n// Executors\n// ============================================================================\n/**\n * Execute an awardBadge action\n *\n * Note: This executor uses publishEvent to track badge awards.\n * State management is handled at the app level via AppContext,\n * not at the action executor level.\n */\nexport const executeAwardBadge = async (action, context) => {\n const { badgeId } = action;\n // Emit telemetry event (state management handled at app level)\n context.publishEvent('gamification.badge_awarded', {\n badgeId,\n awardedAt: Date.now(),\n });\n return {\n cleanup: () => {\n // Badge awards are permanent, no cleanup needed\n },\n };\n};\n/**\n * Execute an addPoints action\n *\n * Note: This executor uses publishEvent to track points.\n * State management is handled at the app level via AppContext,\n * not at the action executor level.\n */\nexport const executeAddPoints = async (action, context) => {\n const { points, reason } = action;\n // Emit telemetry event (state management handled at app level)\n context.publishEvent('gamification.points_added', {\n points,\n reason,\n timestamp: Date.now(),\n });\n return {\n cleanup: () => {\n // Points are permanent, no cleanup needed\n },\n };\n};\n// ============================================================================\n// Event Handlers\n// ============================================================================\n/**\n * Event handler for auto-awarding badges based on triggers.\n */\nexport const badgeTriggerHandler = {\n names: ['page_view', 'button_click'],\n handler: (_event, _ctx) => {\n // Auto-award badges based on event triggers\n // This would check badge trigger conditions in the config\n console.log('[Gamification] Event received for badge trigger check');\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: 'gamification:awardBadge', executor: executeAwardBadge },\n { kind: 'gamification:addPoints', executor: executeAddPoints },\n];\n/**\n * Event handlers provided by this app.\n */\nexport const eventHandlers = [badgeTriggerHandler];\n/**\n * App runtime manifest.\n */\nexport const runtime = {\n id: 'adaptive-gamification',\n version: '1.0.0',\n name: 'Gamification',\n description: 'Badges, rewards, points, and engagement mechanics',\n executors,\n eventHandlers,\n};\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Adaptive Nav - NavWidget Component\n *\n * React component that renders a collapsible navigation tips accordion\n * with per-item conditional visibility based on showWhen decision strategies.\n *\n * Demonstrates the compositional action pattern where child actions\n * (nav:tip) serve as configuration data for the parent widget.\n */\nimport { base, purple, slateGrey } from '@syntro/design-system/tokens';\nimport React, { useCallback, useEffect, useMemo, useReducer, useState } from 'react';\nimport { createRoot } from 'react-dom/client';\n// ============================================================================\n// Sanitization\n// ============================================================================\nfunction escapeHtml(str) {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n// ============================================================================\n// Styles\n// ============================================================================\nconst baseStyles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n padding: '8px',\n maxWidth: '100%',\n overflow: 'hidden',\n },\n accordion: {\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n },\n item: {\n borderRadius: '8px',\n overflow: 'hidden',\n transition: 'box-shadow 0.2s ease',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n width: '100%',\n padding: '12px 16px',\n border: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'inherit',\n textAlign: 'left',\n transition: 'background-color 0.15s ease',\n },\n chevron: {\n fontSize: '10px',\n transition: 'transform 0.2s ease',\n marginLeft: 'auto',\n flexShrink: 0,\n },\n icon: {\n fontSize: '16px',\n flexShrink: 0,\n },\n body: {\n overflow: 'hidden',\n transition: 'max-height 0.25s ease, padding-bottom 0.25s ease',\n padding: '0 16px',\n },\n description: {\n fontSize: '13px',\n lineHeight: '1.5',\n margin: 0,\n },\n linkButton: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n marginTop: '10px',\n padding: '6px 12px',\n borderRadius: '6px',\n textDecoration: 'none',\n fontSize: '13px',\n fontWeight: 500,\n cursor: 'pointer',\n border: 'none',\n transition: 'background-color 0.15s ease',\n },\n categoryHeader: {\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n padding: '12px 4px 4px',\n },\n emptyState: {\n fontSize: '13px',\n padding: '16px',\n textAlign: 'center',\n },\n};\nconst themeStyles = {\n light: {\n container: {\n backgroundColor: base.white,\n color: slateGrey[1],\n },\n item: {\n backgroundColor: slateGrey[12],\n border: `1px solid ${slateGrey[11]}`,\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',\n },\n header: {\n backgroundColor: 'transparent',\n color: slateGrey[1],\n },\n headerHover: {\n backgroundColor: slateGrey[12],\n },\n body: {\n color: slateGrey[6],\n },\n linkButton: {\n backgroundColor: purple[8],\n color: purple[2],\n },\n categoryHeader: {\n color: slateGrey[7],\n },\n emptyState: {\n color: slateGrey[8],\n },\n },\n dark: {\n container: {\n backgroundColor: slateGrey[1],\n color: slateGrey[12],\n },\n item: {\n backgroundColor: slateGrey[3],\n border: `1px solid ${slateGrey[5]}`,\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n },\n header: {\n backgroundColor: 'transparent',\n color: slateGrey[12],\n },\n headerHover: {\n backgroundColor: slateGrey[5],\n },\n body: {\n color: slateGrey[8],\n },\n linkButton: {\n backgroundColor: purple[0],\n color: purple[6],\n },\n categoryHeader: {\n color: slateGrey[8],\n },\n emptyState: {\n color: slateGrey[7],\n },\n },\n};\nfunction NavTipItem({ item, isExpanded, onToggle, onNavigate, theme }) {\n const [isHovered, setIsHovered] = useState(false);\n const colors = themeStyles[theme];\n const { title, description, href, icon, external } = item.config;\n const itemStyle = {\n ...baseStyles.item,\n ...colors.item,\n ...(isExpanded ? colors.itemExpanded : {}),\n };\n const headerStyle = {\n ...baseStyles.header,\n ...colors.header,\n ...(isHovered ? colors.headerHover : {}),\n };\n const chevronStyle = {\n ...baseStyles.chevron,\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\n };\n const bodyStyle = {\n ...baseStyles.body,\n ...colors.body,\n maxHeight: isExpanded ? '500px' : '0',\n paddingBottom: isExpanded ? '16px' : '0',\n };\n const handleLinkClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (href) {\n onNavigate(href, external ?? false);\n }\n };\n return (_jsxs(\"div\", { style: itemStyle, \"data-nav-tip-id\": item.config.id, children: [_jsxs(\"button\", { type: \"button\", style: headerStyle, onClick: onToggle, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), \"aria-expanded\": isExpanded, children: [icon && _jsx(\"span\", { style: baseStyles.icon, children: icon }), _jsx(\"span\", { children: title }), _jsx(\"span\", { style: chevronStyle, children: '\\u25BC' })] }), _jsxs(\"div\", { style: bodyStyle, \"aria-hidden\": !isExpanded, children: [_jsx(\"p\", { style: baseStyles.description, children: description }), href && (_jsxs(\"a\", { href: href, onClick: handleLinkClick, style: { ...baseStyles.linkButton, ...colors.linkButton }, target: external ? '_blank' : undefined, rel: external ? 'noopener noreferrer' : undefined, children: [\"Go \", external ? '\\u2197' : '\\u2192'] }))] })] }));\n}\n// ============================================================================\n// NavWidget Component\n// ============================================================================\n/**\n * NavWidget - Renders a collapsible navigation tips accordion.\n *\n * This component demonstrates the compositional action pattern:\n * - Parent (NavWidget) receives `config.actions` array\n * - Each action has optional `showWhen` for per-item visibility\n * - Parent evaluates showWhen and filters visible tips\n * - Parent manages expand state and re-rendering on context changes\n */\nexport function NavWidget({ config, runtime, instanceId }) {\n // Force re-render when context/accumulator changes.\n const [renderTick, forceUpdate] = useReducer((x) => x + 1, 0);\n // Track expanded tip IDs\n const [expandedIds, setExpandedIds] = useState(new Set());\n // Subscribe to context changes for reactive updates\n useEffect(() => {\n const unsubscribe = runtime.context.subscribe(() => {\n forceUpdate();\n });\n return unsubscribe;\n }, [runtime.context]);\n // Subscribe to accumulator changes for event_count-based showWhen\n useEffect(() => {\n if (!runtime.accumulator?.subscribe)\n return;\n return runtime.accumulator.subscribe(() => {\n forceUpdate();\n });\n }, [runtime.accumulator]);\n // Register accumulator predicates from scope config\n useEffect(() => {\n if (!config.scope || !runtime.accumulator?.register)\n return;\n const { events: eventNames, urlContains, props: propFilters } = config.scope;\n // Scan showWhen conditions for event_count keys\n const keys = new Set();\n for (const action of config.actions) {\n if (action.showWhen?.type === 'rules') {\n for (const rule of action.showWhen.rules) {\n for (const cond of rule.conditions) {\n if (cond.type === 'event_count' && cond.key) {\n keys.add(cond.key);\n }\n }\n }\n }\n }\n for (const key of keys) {\n runtime.accumulator.register(key, (event) => {\n if (!eventNames.includes(event.name))\n return false;\n if (urlContains) {\n const pathname = String(event.props?.pathname ?? '');\n if (!pathname.includes(urlContains))\n return false;\n }\n if (propFilters) {\n for (const [k, v] of Object.entries(propFilters)) {\n if (event.props?.[k] !== v)\n return false;\n }\n }\n return true;\n });\n }\n }, [config.scope, config.actions, runtime.accumulator]);\n // Filter visible tips based on per-item showWhen\n // biome-ignore lint/correctness/useExhaustiveDependencies: renderTick is intentionally included to force re-evaluation when the runtime's mutable context changes (subscribed above via forceUpdate)\n const visibleTips = useMemo(() => config.actions.filter((tip) => {\n if (!tip.showWhen)\n return true;\n try {\n const result = runtime.evaluateSync(tip.showWhen);\n return result.value;\n }\n catch {\n // If strategy evaluation fails, hide the tip (fail-closed)\n return false;\n }\n }), [config.actions, runtime, renderTick]);\n // Group by category\n const categoryGroups = useMemo(() => {\n const groups = new Map();\n for (const tip of visibleTips) {\n const cat = tip.config.category;\n if (!groups.has(cat)) {\n groups.set(cat, []);\n }\n groups.get(cat).push(tip);\n }\n return groups;\n }, [visibleTips]);\n // Check if any items have categories\n const hasCategories = useMemo(() => visibleTips.some((t) => t.config.category), [visibleTips]);\n // Resolve theme (auto \u2192 detect system preference)\n const resolvedTheme = useMemo(() => {\n if (config.theme && config.theme !== 'auto')\n return config.theme;\n if (typeof window !== 'undefined') {\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n }, [config.theme]);\n // Handle tip toggle\n const handleToggle = useCallback((id) => {\n setExpandedIds((prev) => {\n const wasExpanded = prev.has(id);\n let next;\n if (config.expandBehavior === 'single') {\n // In single mode, emit collapse events for any previously-expanded tips\n for (const prevId of prev) {\n if (prevId !== id) {\n runtime.events.publish('nav:toggled', {\n instanceId,\n tipId: prevId,\n expanded: false,\n timestamp: Date.now(),\n });\n }\n }\n next = wasExpanded ? new Set() : new Set([id]);\n }\n else {\n next = new Set(prev);\n if (wasExpanded) {\n next.delete(id);\n }\n else {\n next.add(id);\n }\n }\n // Emit event for the clicked tip using fresh state from the updater\n runtime.events.publish('nav:toggled', {\n instanceId,\n tipId: id,\n expanded: !wasExpanded,\n timestamp: Date.now(),\n });\n return next;\n });\n }, [config.expandBehavior, runtime.events, instanceId]);\n // Handle navigation with event publishing\n const handleNavigate = useCallback((href, external) => {\n // Reject dangerous URIs to prevent XSS\n const normalizedHref = href.trim().toLowerCase();\n if (normalizedHref.startsWith('javascript:') || normalizedHref.startsWith('data:')) {\n return;\n }\n runtime.events.publish('nav:tip_clicked', {\n instanceId,\n href,\n external,\n timestamp: Date.now(),\n });\n if (external) {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n else {\n window.location.href = href;\n }\n }, [runtime.events, instanceId]);\n // Compute container styles\n const containerStyle = {\n ...baseStyles.container,\n ...themeStyles[resolvedTheme].container,\n };\n const categoryHeaderStyle = {\n ...baseStyles.categoryHeader,\n ...themeStyles[resolvedTheme].categoryHeader,\n };\n const emptyStateStyle = {\n ...baseStyles.emptyState,\n ...themeStyles[resolvedTheme].emptyState,\n };\n // Render a list of nav tip items\n const renderItems = (items) => items.map((tip) => (_jsx(NavTipItem, { item: tip, isExpanded: expandedIds.has(tip.config.id), onToggle: () => handleToggle(tip.config.id), onNavigate: handleNavigate, theme: resolvedTheme }, tip.config.id)));\n // Empty state\n if (visibleTips.length === 0) {\n return (_jsx(\"div\", { style: containerStyle, \"data-adaptive-id\": instanceId, \"data-adaptive-type\": \"adaptive-nav\", children: _jsx(\"div\", { style: emptyStateStyle, children: \"No navigation tips available.\" }) }));\n }\n return (_jsx(\"div\", { style: containerStyle, \"data-adaptive-id\": instanceId, \"data-adaptive-type\": \"adaptive-nav\", children: _jsx(\"div\", { style: baseStyles.accordion, children: hasCategories\n ? Array.from(categoryGroups.entries()).map(([category, items]) => (_jsxs(React.Fragment, { children: [category && (_jsx(\"div\", { style: categoryHeaderStyle, \"data-category-header\": category, children: category })), renderItems(items)] }, category ?? '__ungrouped')))\n : renderItems(visibleTips) }) }));\n}\n// ============================================================================\n// Mountable Widget Interface\n// ============================================================================\n/**\n * Mountable widget interface for the runtime's WidgetRegistry.\n */\nexport const NavMountableWidget = {\n mount(container, config) {\n const { runtime, instanceId = 'nav-widget', ...navConfig } = config || {\n expandBehavior: 'single',\n theme: 'auto',\n actions: [],\n };\n // React rendering when runtime + ReactDOM are available\n if (runtime && typeof createRoot === 'function') {\n const root = createRoot(container);\n root.render(React.createElement(NavWidget, {\n config: navConfig,\n runtime: runtime,\n instanceId,\n }));\n return () => {\n root.unmount();\n };\n }\n // HTML fallback for non-React environments\n const tips = navConfig.actions || [];\n container.innerHTML = `\n <div style=\"font-family: system-ui; max-width: 100%;\">\n ${tips\n .map((tip) => `\n <div style=\"margin-bottom: 4px; padding: 12px 16px; background: ${slateGrey[12]}; border-radius: 8px;\">\n ${tip.config.icon ? `<span>${escapeHtml(tip.config.icon)}</span> ` : ''}<strong>${escapeHtml(tip.config.title)}</strong>\n <p style=\"margin-top: 8px; color: ${slateGrey[6]}; font-size: 13px;\">${escapeHtml(tip.config.description)}</p>\n ${tip.config.href ? `<a href=\"${escapeHtml(tip.config.href)}\" style=\"color: ${purple[2]}; font-size: 13px;\">Go →</a>` : ''}\n </div>\n `)\n .join('')}\n </div>\n `;\n return () => {\n container.innerHTML = '';\n };\n },\n};\nexport default NavWidget;\n", "/**\n * Adaptive Nav - Runtime Module\n *\n * Runtime manifest for the navigation tips accordion adaptive.\n * Includes widget-based nav tips and navigation action executors\n * (scrollTo, navigate) previously in adaptive-navigation.\n */\nimport { NavMountableWidget } from './NavWidget';\n// ============================================================================\n// Navigation Action Executors (merged from adaptive-navigation)\n// ============================================================================\n/**\n * Execute a scrollTo action\n */\nexport const executeScrollTo = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n // Scroll to element\n anchorEl.scrollIntoView({\n behavior: action.behavior ?? 'smooth',\n block: action.block ?? 'center',\n inline: action.inline ?? 'nearest',\n });\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'navigation:scrollTo',\n anchorId: action.anchorId,\n behavior: action.behavior ?? 'smooth',\n });\n return {\n cleanup: () => {\n // Optionally restore scroll position on revert\n },\n };\n};\n/**\n * Check if a URL is same-origin as the current page.\n * Relative URLs (e.g. \"/dashboard\") are always same-origin.\n */\nfunction isSameOrigin(url) {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n }\n catch {\n // If URL parsing fails, fall back to full navigation\n return false;\n }\n}\n/**\n * Execute a navigate action\n */\nexport const executeNavigate = async (action, context) => {\n // Validate URL to prevent javascript: URLs\n const url = action.url.trim();\n if (url.toLowerCase().startsWith('javascript:')) {\n throw new Error('javascript: URLs are not allowed');\n }\n const target = action.target ?? '_self';\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'navigation:navigate',\n url: action.url,\n target,\n });\n if (target === '_blank') {\n // Open in new tab\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n else if (!action.forceFullNavigation && isSameOrigin(url)) {\n // SPA-aware: use pushState for same-origin URLs to avoid full page reload\n window.history.pushState(null, '', url);\n window.dispatchEvent(new PopStateEvent('popstate'));\n }\n else {\n // Full navigation for cross-origin URLs or when explicitly requested\n window.location.href = url;\n }\n return {\n cleanup: () => {\n // Navigation cannot be reverted\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: 'navigation:scrollTo', executor: executeScrollTo },\n { kind: 'navigation:navigate', executor: executeNavigate },\n];\n// ============================================================================\n// App Runtime Manifest\n// ============================================================================\n/**\n * Runtime manifest for adaptive-nav.\n *\n * Provides:\n * - Navigation action executors (scrollTo, navigate)\n * - Widget-based nav tips accordion (compositional nav:tip actions)\n */\nexport const runtime = {\n id: 'adaptive-nav',\n version: '2.0.0',\n name: 'Navigation Tips',\n description: 'Navigation actions and accordion-based tips with per-item conditional visibility',\n /**\n * Navigation action executors (scrollTo, navigate).\n */\n executors,\n /**\n * Widget definitions for the runtime's WidgetRegistry.\n */\n widgets: [\n {\n id: 'adaptive-nav:tips',\n component: NavMountableWidget,\n metadata: {\n name: 'Navigation Tips',\n description: 'Accordion of contextual navigation tips with per-item visibility',\n icon: '\\u{1F9ED}',\n },\n },\n ],\n /**\n * Extract notify watcher entries from tile config props.\n * The runtime evaluates these continuously (even with drawer closed)\n * and publishes nav:tip_revealed when showWhen transitions false \u2192 true.\n */\n notifyWatchers(props) {\n const actions = (props.actions ?? []);\n return actions\n .filter((a) => a.notify && a.showWhen)\n .map((a) => ({\n id: `nav:${a.config.id}`,\n strategy: a.showWhen,\n eventName: 'nav:tip_revealed',\n eventProps: {\n tipId: a.config.id,\n title: a.notify.title,\n body: a.notify.body,\n icon: a.notify.icon,\n },\n }));\n },\n};\nexport default runtime;\n", "// AUTO-GENERATED \u2014 do not edit. Run `npm run generate:builtin-modules` to update.\nimport { runtime as r0 } from '@syntrologie/adapt-chatbot/runtime';\nimport { runtime as r1 } from '@syntrologie/adapt-content/runtime';\nimport { runtime as r2 } from '@syntrologie/adapt-faq/runtime';\nimport { runtime as r3 } from '@syntrologie/adapt-gamification/runtime';\nimport { runtime as r4 } from '@syntrologie/adapt-nav/runtime';\nimport { runtime as r5 } from '@syntrologie/adapt-overlays/runtime';\n\nconst allRuntimes = [r0, r1, r2, r3, r4, r5];\n\nexport const builtinAdaptiveManifests = allRuntimes.map((r: any) => ({\n id: r.id,\n version: r.version,\n name: r.name,\n description: r.description,\n runtime: {\n actions: (r.executors || []).map(({ kind, executor }: any) => ({ kind, executor })),\n widgets: r.widgets,\n notifyWatchers: r.notifyWatchers,\n events: r.eventHandlers,\n },\n editor: undefined,\n metadata: { isBuiltIn: true },\n}));\n\nexport function registerBuiltinRuntimeModules(\n registry: { has: (id: string) => boolean; register: (manifest: any) => void }\n): void {\n let count = 0;\n for (const manifest of builtinAdaptiveManifests) {\n if (!registry.has(manifest.id)) {\n registry.register(manifest);\n count++;\n }\n }\n console.log('[Syntro Runtime] Registered', count, 'built-in runtime modules');\n}\n", "import { border, brand, slateGrey } from '@syntro/design-system/tokens';\nimport { useEffect, useMemo, useState } from 'react';\n\nimport type { TelemetryClient } from '../telemetry/types';\nimport type { TileConfig } from '../types';\n\nimport { TileCard } from './TileCard';\n\nexport interface TileWheelProps {\n tiles: TileConfig[];\n intervalMs?: number;\n telemetry?: TelemetryClient;\n}\n\nexport function TileWheel({ tiles, intervalMs = 7000, telemetry }: TileWheelProps) {\n const [index, setIndex] = useState(0);\n const ordered = useMemo(\n () => [...tiles].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0)),\n [tiles]\n );\n\n useEffect(() => {\n telemetry?.trackCanvasOpened('wheel');\n }, [telemetry]);\n\n useEffect(() => {\n if (ordered.length <= 1) return;\n const id = setInterval(() => {\n setIndex((prev) => (prev + 1) % ordered.length);\n }, intervalMs);\n return () => clearInterval(id);\n }, [ordered, intervalMs]);\n\n useEffect(() => {\n const current = ordered[index];\n if (current) {\n telemetry?.trackRectangleViewed(current.id, 'wheel');\n }\n }, [index, ordered, telemetry]);\n\n if (!ordered.length) return null;\n\n return (\n <div\n style={{\n position: 'relative',\n overflow: 'hidden',\n borderRadius: '1.5rem',\n border: `1px solid ${border.primary}`,\n background: slateGrey[1],\n padding: '1.5rem',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n }}\n data-shadow-canvas-id=\"wheel\"\n >\n <div\n style={{\n display: 'flex',\n transition: 'transform 700ms ease-out',\n transform: `translateX(-${index * 100}%)`,\n width: `${ordered.length * 100}%`,\n }}\n >\n {ordered.map((tile) => (\n <div key={tile.id} style={{ width: '100%', flexShrink: 0, padding: '0 1rem' }}>\n <TileCard config={tile} surface=\"wheel\" telemetry={telemetry} />\n </div>\n ))}\n </div>\n <div style={{ marginTop: '1rem', display: 'flex', justifyContent: 'center', gap: '0.5rem' }}>\n {ordered.map((tile, idx) => (\n <button\n type=\"button\"\n key={tile.id}\n style={{\n height: '0.5rem',\n width: '1.5rem',\n borderRadius: '9999px',\n background: idx === index ? brand[3] : slateGrey[6],\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n }}\n onClick={() => setIndex(idx)}\n />\n ))}\n </div>\n </div>\n );\n}\n", "/**\n * Config validation and migration for SDK versioning.\n *\n * This module handles:\n * - Validating configs against the current SDK schema version\n * - Migrating old config formats to current version\n * - Providing warnings for version mismatches\n */\n\nimport type { CanvasConfigResponse } from './types';\nimport { SDK_SCHEMA_VERSION } from './types';\n\n/**\n * Result of config validation.\n */\nexport interface ConfigValidationResult {\n /** Whether the config is valid and can be used */\n valid: boolean;\n\n /** Warning messages (non-fatal issues) */\n warnings: string[];\n\n /** Error messages (fatal issues that prevent usage) */\n errors: string[];\n\n /** Migrated config if old version was detected */\n migratedConfig?: CanvasConfigResponse;\n}\n\n/**\n * Parse a schema version string into major and minor numbers.\n */\nexport function parseVersion(version: string): { major: number; minor: number } {\n const parts = version.split('.');\n return {\n major: parseInt(parts[0] || '0', 10),\n minor: parseInt(parts[1] || '0', 10),\n };\n}\n\n/**\n * Validate and normalize a config, handling version mismatches.\n *\n * This function:\n * 1. Checks if config is valid object\n * 2. Compares config schema version with SDK version\n * 3. Migrates old configs to current version\n * 4. Returns validation result with warnings/errors\n *\n * @param config - Raw config from backend or fetcher\n * @returns Validation result with any migrations applied\n */\nexport function validateConfig(config: unknown): ConfigValidationResult {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // Type check\n if (!config || typeof config !== 'object') {\n return {\n valid: false,\n errors: ['Config must be an object'],\n warnings,\n };\n }\n\n const typedConfig = config as Partial<CanvasConfigResponse>;\n\n // Check required fields\n if (!typedConfig.tiles) {\n errors.push('Config missing required field: tiles');\n }\n if (!typedConfig.actions) {\n errors.push('Config missing required field: actions');\n }\n if (!typedConfig.fetchedAt) {\n errors.push('Config missing required field: fetchedAt');\n }\n\n if (errors.length > 0) {\n return { valid: false, errors, warnings };\n }\n\n // Check schema version\n const configVersion = typedConfig.schemaVersion || '1.0';\n const configVer = parseVersion(configVersion);\n const sdkVer = parseVersion(SDK_SCHEMA_VERSION);\n\n // Future schema version (newer backend)\n if (configVer.major > sdkVer.major) {\n warnings.push(\n `Config schema v${configVersion} is newer than SDK v${SDK_SCHEMA_VERSION}. ` +\n `Some features may not work. Update SDK to latest version.`\n );\n }\n\n // Old schema version (older backend or missing version)\n if (configVer.major < sdkVer.major || !typedConfig.schemaVersion) {\n warnings.push(\n `Config schema v${configVersion} is older than SDK v${SDK_SCHEMA_VERSION}. ` +\n `Migrating config to current version.`\n );\n return {\n valid: true,\n warnings,\n errors,\n migratedConfig: migrateConfig(typedConfig as CanvasConfigResponse, configVersion),\n };\n }\n\n // Compatible version (same major version)\n return {\n valid: true,\n warnings,\n errors,\n };\n}\n\n/**\n * Migrate old config format to current SDK version.\n *\n * This function applies all necessary transformations to bring\n * an old config up to the current schema version.\n *\n * @param config - Config to migrate\n * @param fromVersion - Version to migrate from\n * @returns Migrated config at current SDK version\n */\nfunction migrateConfig(config: CanvasConfigResponse, fromVersion: string): CanvasConfigResponse {\n let migrated = { ...config };\n\n const fromVer = parseVersion(fromVersion);\n\n // v1.x -> v2.x migration\n if (fromVer.major === 1) {\n migrated = migrateV1ToV2(migrated);\n }\n\n // Update schema version to current\n migrated.schemaVersion = SDK_SCHEMA_VERSION;\n\n return migrated;\n}\n\n/**\n * Migrate v1.x config to v2.0 format.\n *\n * Changes in v2.0:\n * - Introduced ActivationConfig to replace experiment field\n * - Unified ActionStep format\n * - Added schemaVersion field\n */\nfunction migrateV1ToV2(config: any): CanvasConfigResponse {\n const migrated: CanvasConfigResponse = {\n schemaVersion: '2.0',\n tiles: [],\n actions: config.actions || [],\n fetchedAt: config.fetchedAt || new Date().toISOString(),\n };\n\n // Migrate tiles\n if (config.tiles && Array.isArray(config.tiles)) {\n migrated.tiles = config.tiles.map((tile: any) => {\n const migratedTile = { ...tile };\n\n // Migrate deprecated experiment field to activation\n if (tile.experiment && !tile.activation) {\n const exp = tile.experiment;\n\n // Convert old experiment format to new activation format\n if (exp.featureKey) {\n migratedTile.activation = {\n strategy: {\n type: 'external' as const,\n provider: 'growthbook' as const,\n featureKey: exp.featureKey,\n fallback: false,\n },\n };\n }\n\n // Remove deprecated field\n delete migratedTile.experiment;\n }\n\n return migratedTile;\n });\n }\n\n // Copy optional fields\n if (config.configVersion) migrated.configVersion = config.configVersion;\n if (config.canvasTitle) migrated.canvasTitle = config.canvasTitle;\n if (config.theme) migrated.theme = config.theme;\n if (config.launcher) migrated.launcher = config.launcher;\n if (config.routes) migrated.routes = config.routes;\n\n return migrated;\n}\n\n/**\n * Check if a config needs migration.\n *\n * @param config - Config to check\n * @returns True if migration is needed\n */\nexport function needsMigration(config: unknown): boolean {\n if (!config || typeof config !== 'object') {\n return false;\n }\n\n const typedConfig = config as Partial<CanvasConfigResponse>;\n const configVersion = typedConfig.schemaVersion || '1.0';\n const configVer = parseVersion(configVersion);\n const sdkVer = parseVersion(SDK_SCHEMA_VERSION);\n\n return configVer.major < sdkVer.major || !typedConfig.schemaVersion;\n}\n", "import { z } from 'zod';\n\nexport const SelectorZ = z.union([\n z.object({ type: z.literal('data'), key: z.string(), value: z.string().optional() }),\n z.object({ type: z.literal('css'), value: z.string() }),\n z.object({ type: z.literal('aria'), role: z.string().optional(), label: z.string().optional() }),\n z.object({ type: z.literal('shadow-css'), value: z.string() }),\n z.object({ type: z.literal('ref'), el: z.any() }), // runtime-only\n]);\n\nexport const TooltipStepZ = z.object({\n kind: z.literal('tooltip'),\n id: z.string(),\n anchor: SelectorZ,\n content: z.object({ title: z.string().optional(), body: z.string() }),\n placement: z.enum(['top', 'bottom', 'left', 'right', 'auto']).optional(),\n offsetPx: z.number().optional(),\n blocking: z.boolean().optional(),\n trigger: z.enum(['immediate', 'hover', 'click']).optional(),\n dismiss: z\n .object({\n onEsc: z.boolean().optional(),\n closeButton: z.boolean().optional(),\n timeoutMs: z.number().optional(),\n })\n .optional(),\n});\n\nexport const HighlightStepZ = z.object({\n kind: z.literal('highlight'),\n id: z.string(),\n anchor: SelectorZ,\n copy: z.string().optional(),\n ring: z.object({ paddingPx: z.number().optional(), radiusPx: z.number().optional() }).optional(),\n scrim: z.object({ opacity: z.number().optional() }).optional(),\n ringColor: z.string().optional(),\n blocking: z.boolean().optional(),\n dismiss: z\n .object({\n onClickOutside: z.boolean().optional(),\n onEsc: z.boolean().optional(),\n timeoutMs: z.number().optional(),\n })\n .optional(),\n});\n\nexport const CanvasRecipeZ = z.object({\n id: z.string(),\n version: z.number(),\n routes: z.array(z.string()).optional(),\n steps: z.array(z.union([TooltipStepZ, HighlightStepZ])),\n});\n\nexport function validateRecipe(json: unknown) {\n return CanvasRecipeZ.parse(json);\n}\n", "import { type CanvasFetcherOptions, resolveConfigUri } from '../configFetcher';\n\nimport { CanvasRecipeZ } from './schema';\nimport type { CanvasRecipe } from './types';\n\nexport type OverlayRecipeFetcher = () => Promise<CanvasRecipe>;\n\nexport const createOverlayRecipeFetcher =\n ({\n configUri,\n experiments,\n featureKey = 'smart-canvas-overlay-uri',\n credentials = 'include',\n }: CanvasFetcherOptions = {}): OverlayRecipeFetcher =>\n async () => {\n const uri = resolveConfigUri({ configUri, experiments, featureKey });\n if (!uri) {\n throw new Error('SmartCanvas overlays: recipe URI missing (env + feature unset).');\n }\n const response = await fetch(uri, { credentials });\n if (!response.ok) {\n throw new Error(`SmartCanvas overlays: failed to fetch recipe (${response.status})`);\n }\n const json = await response.json();\n return CanvasRecipeZ.parse(json) as CanvasRecipe;\n };\n", "import { type ReactNode, useLayoutEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport type { SmartCanvasElement } from './SmartCanvasElement';\n\nexport interface SmartCanvasPortalProps {\n element: SmartCanvasElement | null;\n children: ReactNode;\n}\n\nexport function SmartCanvasPortal({ element, children }: SmartCanvasPortalProps) {\n const [mountNode, setMountNode] = useState<HTMLElement | null>(null);\n\n useLayoutEffect(() => {\n if (!element) {\n setMountNode(null);\n return;\n }\n setMountNode(element.getMountNode());\n return () => setMountNode(null);\n }, [element]);\n\n if (!mountNode) return null;\n return createPortal(children, mountNode);\n}\n", "/**\n * Zod schemas for RuntimeContext validation.\n */\nimport { z } from 'zod';\n\nexport const PageContextZ = z.object({\n url: z.string(),\n routeId: z.string().optional(),\n title: z.string().optional(),\n locale: z.string().optional(),\n});\n\nexport const PageHistoryEntryZ = z.object({\n url: z.string(),\n ts: z.number(),\n});\n\nexport const SessionContextZ = z.object({\n sessionId: z.string(),\n startTs: z.number(),\n pageHistory: z.array(PageHistoryEntryZ).optional(),\n});\n\nexport const ViewportContextZ = z.object({\n width: z.number(),\n height: z.number(),\n});\n\nexport const BoundingBoxZ = z.object({\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n});\n\nexport const AnchorStateZ = z.object({\n anchorId: z.string(),\n present: z.boolean(),\n visible: z.boolean().optional(),\n boundingBox: BoundingBoxZ.optional(),\n});\n\nexport const AugmentationZ = z.record(\n z.string(),\n z.union([z.number(), z.string(), z.boolean(), z.undefined()])\n);\n\nexport const RuntimeContextZ = z.object({\n page: PageContextZ,\n session: SessionContextZ,\n viewport: ViewportContextZ,\n anchors: z.array(AnchorStateZ).optional(),\n augmented: AugmentationZ.optional(),\n});\n\n/**\n * Validate a RuntimeContext object.\n */\nexport function validateRuntimeContext(data: unknown) {\n return RuntimeContextZ.safeParse(data);\n}\n\n/**\n * Type inference from Zod schema.\n */\nexport type RuntimeContextSchema = z.infer<typeof RuntimeContextZ>;\nexport type PageContextSchema = z.infer<typeof PageContextZ>;\nexport type SessionContextSchema = z.infer<typeof SessionContextZ>;\nexport type ViewportContextSchema = z.infer<typeof ViewportContextZ>;\nexport type AnchorStateSchema = z.infer<typeof AnchorStateZ>;\n", "/**\n * Zod schemas for decision strategy validation.\n */\nimport { z } from 'zod';\n\n// =============================================================================\n// CONDITION SCHEMAS\n// =============================================================================\n\nexport const PageUrlConditionZ = z.object({\n type: z.literal('page_url'),\n url: z.string(),\n});\n\nexport const RouteConditionZ = z.object({\n type: z.literal('route'),\n routeId: z.string(),\n});\n\nexport const AnchorVisibleConditionZ = z.object({\n type: z.literal('anchor_visible'),\n anchorId: z.string(),\n state: z.enum(['visible', 'present', 'absent']),\n});\n\nexport const EventOccurredConditionZ = z.object({\n type: z.literal('event_occurred'),\n eventName: z.string(),\n withinMs: z.number().optional(),\n});\n\nexport const StateEqualsConditionZ = z.object({\n type: z.literal('state_equals'),\n key: z.string(),\n value: z.unknown(),\n});\n\nexport const ViewportConditionZ = z.object({\n type: z.literal('viewport'),\n minWidth: z.number().optional(),\n maxWidth: z.number().optional(),\n minHeight: z.number().optional(),\n maxHeight: z.number().optional(),\n});\n\nexport const SessionMetricConditionZ = z.object({\n type: z.literal('session_metric'),\n key: z.string(),\n operator: z.enum(['gte', 'lte', 'eq', 'gt', 'lt']),\n threshold: z.number(),\n});\n\nexport const DismissedConditionZ = z.object({\n type: z.literal('dismissed'),\n key: z.string(),\n inverted: z.boolean().optional(),\n});\n\nexport const CooldownActiveConditionZ = z.object({\n type: z.literal('cooldown_active'),\n key: z.string(),\n inverted: z.boolean().optional(),\n});\n\nexport const FrequencyLimitConditionZ = z.object({\n type: z.literal('frequency_limit'),\n key: z.string(),\n limit: z.number(),\n inverted: z.boolean().optional(),\n});\n\nexport const EventCountConditionZ = z.object({\n type: z.literal('event_count'),\n key: z.string(),\n operator: z.enum(['gte', 'lte', 'eq', 'gt', 'lt']),\n count: z.number().int().min(0),\n withinMs: z.number().positive().optional(),\n});\n\nexport const ConditionZ = z.discriminatedUnion('type', [\n PageUrlConditionZ,\n RouteConditionZ,\n AnchorVisibleConditionZ,\n EventOccurredConditionZ,\n StateEqualsConditionZ,\n ViewportConditionZ,\n SessionMetricConditionZ,\n DismissedConditionZ,\n CooldownActiveConditionZ,\n FrequencyLimitConditionZ,\n EventCountConditionZ,\n]);\n\n// =============================================================================\n// STRATEGY SCHEMAS\n// =============================================================================\n\nexport const RuleZ = z.object({\n conditions: z.array(ConditionZ),\n value: z.unknown(),\n});\n\nexport const RuleStrategyZ = z.object({\n type: z.literal('rules'),\n rules: z.array(RuleZ),\n default: z.unknown(),\n});\n\nexport const ScoreStrategyZ = z.object({\n type: z.literal('score'),\n field: z.string(),\n threshold: z.number(),\n above: z.unknown(),\n below: z.unknown(),\n});\n\nexport const ModelStrategyZ = z.object({\n type: z.literal('model'),\n modelId: z.string(),\n inputs: z.array(z.string()),\n outputMapping: z.record(z.string(), z.unknown()),\n default: z.unknown(),\n});\n\nexport const ExternalStrategyZ = z.object({\n type: z.literal('external'),\n endpoint: z.string(),\n method: z.enum(['GET', 'POST']).optional(),\n default: z.unknown(),\n timeoutMs: z.number().optional(),\n});\n\nexport const DecisionStrategyZ = z.discriminatedUnion('type', [\n RuleStrategyZ,\n ScoreStrategyZ,\n ModelStrategyZ,\n ExternalStrategyZ,\n]);\n\n// =============================================================================\n// ACTIVATION CONFIG SCHEMA\n// =============================================================================\n\nexport const RouteFilterZ = z.object({\n include: z.array(z.string()).optional(),\n exclude: z.array(z.string()).optional(),\n});\n\nexport const ActivationConfigZ = z.object({\n routes: RouteFilterZ.optional(),\n strategy: DecisionStrategyZ.optional(),\n});\n\n// =============================================================================\n// VALIDATION FUNCTIONS\n// =============================================================================\n\n/**\n * Validate a Condition object.\n */\nexport function validateCondition(data: unknown) {\n return ConditionZ.safeParse(data);\n}\n\n/**\n * Validate a DecisionStrategy object.\n */\nexport function validateStrategy(data: unknown) {\n return DecisionStrategyZ.safeParse(data);\n}\n\n/**\n * Validate an ActivationConfig object.\n */\nexport function validateActivationConfig(data: unknown) {\n return ActivationConfigZ.safeParse(data);\n}\n\n// =============================================================================\n// TYPE INFERENCE\n// =============================================================================\n\nexport type ConditionSchema = z.infer<typeof ConditionZ>;\nexport type RuleSchema = z.infer<typeof RuleZ>;\nexport type DecisionStrategySchema = z.infer<typeof DecisionStrategyZ>;\nexport type ActivationConfigSchema = z.infer<typeof ActivationConfigZ>;\n", "/**\n * Zod schemas for event validation.\n */\nimport { z } from 'zod';\n\nexport const EventSourceZ = z.enum(['posthog', 'canvas', 'derived']);\n\nexport const NormalizedEventZ = z.object({\n ts: z.number(),\n name: z.string(),\n source: EventSourceZ,\n props: z.record(z.string(), z.unknown()).optional(),\n schemaVersion: z.string(),\n});\n\nexport const EventFilterZ = z.object({\n names: z.array(z.string()).optional(),\n patterns: z.array(z.string()).optional(),\n sources: z.array(EventSourceZ).optional(),\n});\n\n/**\n * Validate a NormalizedEvent object.\n */\nexport function validateNormalizedEvent(data: unknown) {\n return NormalizedEventZ.safeParse(data);\n}\n\n/**\n * Validate an EventFilter object.\n */\nexport function validateEventFilter(data: unknown) {\n return EventFilterZ.safeParse(data);\n}\n\n/**\n * Type inference from Zod schema.\n */\nexport type NormalizedEventSchema = z.infer<typeof NormalizedEventZ>;\nexport type EventFilterSchema = z.infer<typeof EventFilterZ>;\n", "/**\n * Zod schemas for state validation.\n */\nimport { z } from 'zod';\n\nexport const StoredValueZ = z.object({\n value: z.unknown(),\n expiresAt: z.number().optional(),\n});\n\nexport const FrequencyEntryZ = z.object({\n count: z.number(),\n resetAt: z.number().optional(),\n});\n\n/**\n * Validate a StoredValue object.\n */\nexport function validateStoredValue(data: unknown) {\n return StoredValueZ.safeParse(data);\n}\n\n/**\n * Validate a FrequencyEntry object.\n */\nexport function validateFrequencyEntry(data: unknown) {\n return FrequencyEntryZ.safeParse(data);\n}\n\n/**\n * Type inference from Zod schema.\n */\nexport type StoredValueSchema = z.infer<typeof StoredValueZ>;\nexport type FrequencyEntrySchema = z.infer<typeof FrequencyEntryZ>;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "createPortal", "useRef", "runtime", "runtime", "sendMessage", "useRef", "runtime", "_jsx", "_jsxs", "React", "useCallback", "useEffect", "useState", "createRoot", "_jsx", "_jsxs", "runtime", "_a", "_b", "runtime", "runtime", "_jsx", "_jsxs", "React", "useCallback", "useEffect", "useMemo", "useReducer", "useState", "createRoot", "baseStyles", "themeStyles", "_jsxs", "_jsx", "runtime", "_a", "_b", "executors", "runtime", "runtime", "useEffect", "useMemo", "useState", "useState", "useMemo", "useEffect", "useState", "z", "z", "z", "z", "React", "createPortal"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GTM DataLayer Bridge
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to the EventBus and pushes events to window.dataLayer
|
|
5
|
+
* so customers' existing GTM setups can surface Syntro events.
|
|
6
|
+
*/
|
|
7
|
+
export interface GtmBridgeConfig {
|
|
8
|
+
/** EventBus to subscribe to */
|
|
9
|
+
eventBus: {
|
|
10
|
+
subscribe: (filter: {
|
|
11
|
+
names?: string[];
|
|
12
|
+
patterns?: string[];
|
|
13
|
+
}, callback: (event: {
|
|
14
|
+
name: string;
|
|
15
|
+
props?: Record<string, unknown>;
|
|
16
|
+
source?: string;
|
|
17
|
+
ts: number;
|
|
18
|
+
}) => void) => () => void;
|
|
19
|
+
};
|
|
20
|
+
/** Prefix for event names in dataLayer. @default "syntro" */
|
|
21
|
+
prefix?: string;
|
|
22
|
+
/** Optional filter -- return true to include event, false to skip */
|
|
23
|
+
eventFilter?: (eventName: string) => boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface GtmBridge {
|
|
26
|
+
destroy: () => void;
|
|
27
|
+
}
|
|
28
|
+
declare global {
|
|
29
|
+
interface Window {
|
|
30
|
+
dataLayer?: Array<Record<string, unknown>>;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create a GTM DataLayer bridge that forwards EventBus events to window.dataLayer.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createGtmBridge(config: GtmBridgeConfig): GtmBridge;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NavigationMonitor - Centralized History API patching.
|
|
3
|
+
*
|
|
4
|
+
* This is the SINGLE point in the SDK that wraps history.pushState and
|
|
5
|
+
* history.replaceState. All other modules that need to react to navigation
|
|
6
|
+
* (ContextManager, overlay runner, tour executor, SmartCanvasApp) must
|
|
7
|
+
* subscribe to this monitor instead of patching the History API directly.
|
|
8
|
+
*
|
|
9
|
+
* This prevents the "quadruple-patching" problem where multiple SDK modules
|
|
10
|
+
* each wrap pushState/replaceState independently, creating a fragile chain
|
|
11
|
+
* that can break when combined with React Router, GA4, and GTM — all of
|
|
12
|
+
* which also wrap the History API.
|
|
13
|
+
*/
|
|
14
|
+
export type NavigationMethod = 'pushState' | 'replaceState' | 'popstate';
|
|
15
|
+
export type NavigationListener = (url: string, method: NavigationMethod) => void;
|
|
16
|
+
export interface NavigationDiagnostics {
|
|
17
|
+
/** Whether pushState was native (not already wrapped) when we captured it */
|
|
18
|
+
isNative: boolean;
|
|
19
|
+
/** Number of active subscribers */
|
|
20
|
+
subscriberCount: number;
|
|
21
|
+
}
|
|
22
|
+
export declare class NavigationMonitor {
|
|
23
|
+
private listeners;
|
|
24
|
+
private capturedPushState;
|
|
25
|
+
private capturedReplaceState;
|
|
26
|
+
private wasNative;
|
|
27
|
+
private destroyed;
|
|
28
|
+
constructor();
|
|
29
|
+
/**
|
|
30
|
+
* Subscribe to navigation events.
|
|
31
|
+
* Returns an unsubscribe function.
|
|
32
|
+
*/
|
|
33
|
+
subscribe(listener: NavigationListener): () => void;
|
|
34
|
+
/**
|
|
35
|
+
* Get diagnostics about the History API chain.
|
|
36
|
+
*/
|
|
37
|
+
diagnose(): NavigationDiagnostics;
|
|
38
|
+
/**
|
|
39
|
+
* Restore the History API to the state we captured and remove all listeners.
|
|
40
|
+
*/
|
|
41
|
+
destroy(): void;
|
|
42
|
+
private onPopState;
|
|
43
|
+
private notify;
|
|
44
|
+
private isNativeFunction;
|
|
45
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnchorWatcher — Detects when an anchor element is removed from the DOM.
|
|
3
|
+
*
|
|
4
|
+
* Uses MutationObserver on document.body to watch for subtree changes
|
|
5
|
+
* that disconnect the watched element. Calls onDetach exactly once
|
|
6
|
+
* when the anchor's isConnected becomes false.
|
|
7
|
+
*/
|
|
8
|
+
export interface AnchorWatcherOptions {
|
|
9
|
+
/** Called once when the anchor element is removed from the DOM. */
|
|
10
|
+
onDetach: () => void;
|
|
11
|
+
}
|
|
12
|
+
export declare class AnchorWatcher {
|
|
13
|
+
private opts;
|
|
14
|
+
private anchor;
|
|
15
|
+
private observer;
|
|
16
|
+
private detached;
|
|
17
|
+
constructor(anchor: HTMLElement, opts: AnchorWatcherOptions);
|
|
18
|
+
/** Returns the current connection status of the anchor. */
|
|
19
|
+
isConnected(): boolean;
|
|
20
|
+
/** Stop watching. Safe to call multiple times. */
|
|
21
|
+
destroy(): void;
|
|
22
|
+
}
|
package/dist/overlays/types.d.ts
CHANGED
|
@@ -119,4 +119,6 @@ export type OverlayContext = {
|
|
|
119
119
|
telemetry?: {
|
|
120
120
|
setPersonPropertiesOnce?: (props: Record<string, unknown>) => void;
|
|
121
121
|
};
|
|
122
|
+
/** Subscribe to navigation changes (from NavigationMonitor) */
|
|
123
|
+
subscribeNavigation?: (callback: (url: string, method: string) => void) => () => void;
|
|
122
124
|
};
|