@syntrologie/runtime-sdk 1.0.0-canary.1 → 1.0.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.
Files changed (169) hide show
  1. package/CAPABILITIES.md +274 -31
  2. package/README.md +87 -0
  3. package/dist/RuntimeProvider.d.ts +1 -1
  4. package/dist/RuntimeProvider.js.map +1 -1
  5. package/dist/SmartCanvasApp.d.ts +4 -4
  6. package/dist/SmartCanvasApp.js +4 -4
  7. package/dist/SmartCanvasApp.js.map +1 -1
  8. package/dist/SmartCanvasElement.d.ts +2 -2
  9. package/dist/SmartCanvasElement.js +1 -1
  10. package/dist/SmartCanvasElement.js.map +1 -1
  11. package/dist/SmartCanvasPortal.js.map +1 -1
  12. package/dist/actions/ActionEngine.js +2 -4
  13. package/dist/actions/ActionEngine.js.map +1 -1
  14. package/dist/actions/executors/index.d.ts +1 -2
  15. package/dist/actions/executors/index.js +5 -7
  16. package/dist/actions/executors/index.js.map +1 -1
  17. package/dist/actions/executors/tour.js +3 -3
  18. package/dist/actions/executors/tour.js.map +1 -1
  19. package/dist/actions/validation.js +6 -31
  20. package/dist/actions/validation.js.map +1 -1
  21. package/dist/adaptives/adaptive-chatbot/index.js +9 -0
  22. package/dist/adaptives/adaptive-chatbot/index.js.map +7 -0
  23. package/dist/adaptives/adaptive-content/index.js +2 -0
  24. package/dist/adaptives/adaptive-content/index.js.map +7 -0
  25. package/dist/adaptives/adaptive-faq/index.js +11 -0
  26. package/dist/adaptives/adaptive-faq/index.js.map +7 -0
  27. package/dist/adaptives/adaptive-gamification/index.js +2 -0
  28. package/dist/adaptives/adaptive-gamification/index.js.map +7 -0
  29. package/dist/adaptives/adaptive-nav/index.js +11 -0
  30. package/dist/adaptives/adaptive-nav/index.js.map +7 -0
  31. package/dist/adaptives/adaptive-overlays/index.js +91 -0
  32. package/dist/adaptives/adaptive-overlays/index.js.map +7 -0
  33. package/dist/api.d.ts +5 -5
  34. package/dist/api.js +4 -7
  35. package/dist/api.js.map +1 -1
  36. package/dist/apps/AppContext.js +3 -5
  37. package/dist/apps/AppContext.js.map +1 -1
  38. package/dist/apps/AppLoader.d.ts +2 -1
  39. package/dist/apps/AppLoader.js +35 -9
  40. package/dist/apps/AppLoader.js.map +1 -1
  41. package/dist/apps/AppRegistry.js.map +1 -1
  42. package/dist/apps/examples/gamification-app.example.d.ts +8 -8
  43. package/dist/apps/examples/gamification-app.example.js.map +1 -1
  44. package/dist/apps/index.d.ts +0 -1
  45. package/dist/apps/index.js +0 -1
  46. package/dist/apps/index.js.map +1 -1
  47. package/dist/apps/types.d.ts +1 -1
  48. package/dist/blocks/data/ComparisonBlock.js +9 -9
  49. package/dist/blocks/data/ComparisonBlock.js.map +1 -1
  50. package/dist/blocks/data/StatsBlock.js +12 -14
  51. package/dist/blocks/data/StatsBlock.js.map +1 -1
  52. package/dist/blocks/index.d.ts +2 -2
  53. package/dist/blocks/index.js +3 -4
  54. package/dist/blocks/index.js.map +1 -1
  55. package/dist/blocks/interactive/ChecklistBlock.js +12 -12
  56. package/dist/blocks/interactive/ChecklistBlock.js.map +1 -1
  57. package/dist/blocks/interactive/RatingBlock.js +12 -14
  58. package/dist/blocks/interactive/RatingBlock.js.map +1 -1
  59. package/dist/blocks/notification/NotificationBlock.js +24 -24
  60. package/dist/blocks/notification/NotificationBlock.js.map +1 -1
  61. package/dist/bootstrap.d.ts +5 -5
  62. package/dist/bootstrap.js +30 -33
  63. package/dist/bootstrap.js.map +1 -1
  64. package/dist/components/ShadowCanvasOverlay.d.ts +2 -2
  65. package/dist/components/ShadowCanvasOverlay.js +25 -24
  66. package/dist/components/ShadowCanvasOverlay.js.map +1 -1
  67. package/dist/components/TileCard.d.ts +2 -2
  68. package/dist/components/TileCard.js +24 -23
  69. package/dist/components/TileCard.js.map +1 -1
  70. package/dist/components/TileWheel.d.ts +1 -1
  71. package/dist/components/TileWheel.js +23 -1
  72. package/dist/components/TileWheel.js.map +1 -1
  73. package/dist/configFetcher.d.ts +6 -2
  74. package/dist/configFetcher.js +65 -36
  75. package/dist/configFetcher.js.map +1 -1
  76. package/dist/context/ContextManager.d.ts +1 -1
  77. package/dist/context/ContextManager.js +4 -3
  78. package/dist/context/ContextManager.js.map +1 -1
  79. package/dist/context/schema.d.ts +8 -8
  80. package/dist/context/schema.js +1 -1
  81. package/dist/context/schema.js.map +1 -1
  82. package/dist/decisions/engine.d.ts +2 -2
  83. package/dist/decisions/engine.js.map +1 -1
  84. package/dist/decisions/schema.d.ts +34 -34
  85. package/dist/decisions/schema.js +1 -1
  86. package/dist/decisions/schema.js.map +1 -1
  87. package/dist/editorLoader.d.ts +19 -9
  88. package/dist/editorLoader.js +107 -96
  89. package/dist/editorLoader.js.map +1 -1
  90. package/dist/events/normalizers/canvas.d.ts +1 -1
  91. package/dist/events/normalizers/canvas.js.map +1 -1
  92. package/dist/events/schema.d.ts +4 -4
  93. package/dist/events/schema.js +1 -1
  94. package/dist/events/schema.js.map +1 -1
  95. package/dist/experiments/adapters/growthbook.d.ts +2 -1
  96. package/dist/experiments/adapters/growthbook.js +9 -1
  97. package/dist/experiments/adapters/growthbook.js.map +1 -1
  98. package/dist/experiments/types.d.ts +5 -0
  99. package/dist/fetchers/cdnFetcher.js.map +1 -1
  100. package/dist/fetchers/experimentsFetcher.d.ts +24 -2
  101. package/dist/fetchers/experimentsFetcher.js +48 -1
  102. package/dist/fetchers/experimentsFetcher.js.map +1 -1
  103. package/dist/fetchers/mergeConfigs.d.ts +29 -0
  104. package/dist/fetchers/mergeConfigs.js +38 -0
  105. package/dist/fetchers/mergeConfigs.js.map +1 -0
  106. package/dist/hooks/useCanvasOverlays.d.ts +1 -1
  107. package/dist/hooks/useCanvasOverlays.js +2 -2
  108. package/dist/hooks/useCanvasOverlays.js.map +1 -1
  109. package/dist/hooks/useHostPatches.js.map +1 -1
  110. package/dist/hooks/useShadowCanvasConfig.d.ts +1 -1
  111. package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
  112. package/dist/hostPatcher/core/patcher.js.map +1 -1
  113. package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -1
  114. package/dist/index.js +15 -0
  115. package/dist/index.js.map +1 -1
  116. package/dist/overlays/fetcher.d.ts +1 -1
  117. package/dist/overlays/fetcher.js +12 -14
  118. package/dist/overlays/fetcher.js.map +1 -1
  119. package/dist/overlays/runtime/overlay/runner.js +18 -5
  120. package/dist/overlays/runtime/overlay/runner.js.map +1 -1
  121. package/dist/overlays/runtime/overlay/tooltip.js +3 -5
  122. package/dist/overlays/runtime/overlay/tooltip.js.map +1 -1
  123. package/dist/react.d.ts +1 -1
  124. package/dist/react.js.map +1 -1
  125. package/dist/render/RenderContext.js.map +1 -1
  126. package/dist/runtime.d.ts +6 -6
  127. package/dist/runtime.js +38 -16
  128. package/dist/runtime.js.map +1 -1
  129. package/dist/smart-canvas.esm.js +97 -85
  130. package/dist/smart-canvas.esm.js.map +4 -4
  131. package/dist/smart-canvas.js +41814 -44141
  132. package/dist/smart-canvas.js.map +4 -4
  133. package/dist/smart-canvas.min.js +97 -85
  134. package/dist/smart-canvas.min.js.map +4 -4
  135. package/dist/state/StateStore.d.ts +0 -6
  136. package/dist/state/StateStore.js +7 -1
  137. package/dist/state/StateStore.js.map +1 -1
  138. package/dist/surfaces/Surfaces.js +1 -1
  139. package/dist/surfaces/Surfaces.js.map +1 -1
  140. package/dist/surfaces/positioning.js.map +1 -1
  141. package/dist/telemetry/adapters/posthog.js +1 -1
  142. package/dist/telemetry/adapters/posthog.js.map +1 -1
  143. package/dist/telemetry/registry.d.ts +0 -7
  144. package/dist/telemetry/registry.js +1 -1
  145. package/dist/telemetry/registry.js.map +1 -1
  146. package/dist/theme/ThemeProvider.js.map +1 -1
  147. package/dist/theme/defaultTheme.d.ts +2 -3
  148. package/dist/theme/defaultTheme.js +60 -51
  149. package/dist/theme/defaultTheme.js.map +1 -1
  150. package/dist/theme/extractHostTheme.js +1 -1
  151. package/dist/theme/extractHostTheme.js.map +1 -1
  152. package/dist/types.d.ts +1 -1
  153. package/dist/types.js +0 -1
  154. package/dist/types.js.map +1 -1
  155. package/dist/version.d.ts +1 -1
  156. package/dist/version.js +1 -1
  157. package/dist/version.js.map +1 -1
  158. package/dist/widgets/WidgetRegistry.d.ts +6 -0
  159. package/dist/widgets/WidgetRegistry.js +12 -3
  160. package/dist/widgets/WidgetRegistry.js.map +1 -1
  161. package/package.json +20 -16
  162. package/dist/apps/adaptive-chatbot/index.js +0 -7
  163. package/dist/apps/adaptive-chatbot/index.js.map +0 -7
  164. package/dist/apps/faq/index.js +0 -11
  165. package/dist/apps/faq/index.js.map +0 -7
  166. package/dist/apps/gamification/index.js +0 -2
  167. package/dist/apps/gamification/index.js.map +0 -7
  168. package/dist/apps/nav/index.js +0 -11
  169. package/dist/apps/nav/index.js.map +0 -7
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["shared-react:react", "../../../../adaptives/adaptive-nav/src/summarize.ts", "../../../../adaptives/adaptive-nav/src/types.ts", "shared-react:react/jsx-runtime", "../../../../adaptives/adaptive-nav/src/editor.tsx", "shared-react:react-dom/client", "../../../../adaptives/adaptive-nav/src/NavWidget.tsx", "../../../../adaptives/adaptive-nav/src/runtime.ts", "../../../../adaptives/adaptive-nav/src/cdn.ts"],
4
+ "sourcesContent": ["\n var R = globalThis.__SYNTRO_REACT__ || {};\n export default R;\n export var useState = R.useState;\n export var useEffect = R.useEffect;\n export var useMemo = R.useMemo;\n export var useCallback = R.useCallback;\n export var useRef = R.useRef;\n export var useContext = R.useContext;\n export var useReducer = R.useReducer;\n export var createElement = R.createElement;\n export var createContext = R.createContext;\n export var Fragment = R.Fragment;\n export var forwardRef = R.forwardRef;\n export var memo = R.memo;\n export var lazy = R.lazy;\n export var Suspense = R.Suspense;\n export var Children = R.Children;\n export var isValidElement = R.isValidElement;\n export var cloneElement = R.cloneElement;\n export var Component = R.Component;\n export var PureComponent = R.PureComponent;\n export var useLayoutEffect = R.useLayoutEffect;\n export var useId = R.useId;\n ", "/**\n * Human-readable summary generation for Nav items.\n * Pure functions \u2014 no DOM access, just string formatting.\n */\n\nimport type { NavLinkAction, DecisionStrategy, RuleStrategy } from './types';\n\nconst MAX_LABEL_LEN = 30;\nconst MAX_HREF_LEN = 30;\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return `${text.slice(0, max).trimEnd()}...`;\n}\n\nfunction isRuleStrategy(s: unknown): s is RuleStrategy<boolean> {\n return (\n typeof s === 'object' &&\n s !== null &&\n (s as Record<string, unknown>).type === 'rules' &&\n Array.isArray((s as Record<string, unknown>).rules)\n );\n}\n\n/**\n * Parse a showWhen strategy into a human-readable trigger description.\n */\nexport function describeTrigger(showWhen?: DecisionStrategy<boolean> | null): string {\n if (!showWhen) return 'All pages';\n if (!isRuleStrategy(showWhen)) return 'All pages';\n\n const pages: string[] = [];\n const anchors: string[] = [];\n\n for (const rule of showWhen.rules) {\n for (const condition of rule.conditions) {\n if (condition.type === 'page_url' && typeof (condition as any).url === 'string') {\n pages.push((condition as any).url);\n }\n if (condition.type === 'anchor_visible' && typeof (condition as any).anchorId === 'string') {\n anchors.push((condition as any).anchorId);\n }\n }\n }\n\n const parts: string[] = [];\n if (pages.length > 0) parts.push(pages[0]);\n if (anchors.length > 0) parts.push(anchors[0]);\n\n return parts.length > 0 ? parts.join(' \\u00b7 ') : 'All pages';\n}\n\n/**\n * Generate a one-liner summary for a Nav link.\n */\nexport function summarizeNavItem(item: NavLinkAction): string {\n const icon = item.config.icon || '\\u{1f517}';\n const label = truncate(item.config.label, MAX_LABEL_LEN);\n const href = truncate(item.config.href, MAX_HREF_LEN);\n return `${icon} ${label} \\u2192 ${href}`;\n}\n", "/**\n * Adaptive Nav - Types\n *\n * Type definitions for the navigation link list adaptive.\n * Demonstrates compositional action pattern with per-item showWhen.\n */\n\n// ============================================================================\n// Decision Strategy Types (from runtime-sdk)\n// ============================================================================\n\n/**\n * Simplified DecisionStrategy type for this package.\n * Full definition is in @syntrologie/runtime-sdk.\n */\nexport type DecisionStrategy<T = unknown> =\n | RuleStrategy<T>\n | ScoreStrategy<T>\n | ModelStrategy<T>\n | ExternalStrategy<T>;\n\nexport interface RuleStrategy<T = unknown> {\n type: 'rules';\n rules: Array<{\n conditions: Array<Record<string, unknown>>;\n value: T;\n }>;\n default: T;\n}\n\nexport interface ScoreStrategy<T = unknown> {\n type: 'score';\n field: string;\n threshold: number;\n above: T;\n below: T;\n}\n\nexport interface ModelStrategy<T = unknown> {\n type: 'model';\n modelId: string;\n inputs: string[];\n outputMapping: Record<string, T>;\n default: T;\n}\n\nexport interface ExternalStrategy<T = unknown> {\n type: 'external';\n endpoint: string;\n method?: 'GET' | 'POST';\n default: T;\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Nav Link Action Types\n// ============================================================================\n\n/**\n * Single navigation link configuration.\n * This is a \"compositional action\" - it's not executed, but rendered by the parent.\n */\nexport interface NavLinkAction {\n /** Action kind identifier */\n kind: 'nav:link';\n /** Link configuration */\n config: {\n /** Display label for the link */\n label: string;\n /** Target URL */\n href: string;\n /** Optional icon (emoji or icon key) */\n icon?: string;\n /** Whether to open in new tab */\n external?: boolean;\n };\n /** Optional per-item activation strategy */\n showWhen?: DecisionStrategy<boolean> | null;\n /** AI-generated reasoning for why this link was recommended */\n rationale?: {\n why: string;\n confidence?: number;\n };\n}\n\n// ============================================================================\n// Nav Widget Configuration\n// ============================================================================\n\n/**\n * Layout orientation for the navigation links.\n */\nexport type NavLayout = 'horizontal' | 'vertical';\n\n/**\n * Theme for the navigation widget.\n */\nexport type NavTheme = 'light' | 'dark' | 'auto';\n\n/**\n * Full configuration for the adaptive-nav widget.\n */\nexport interface NavConfig {\n /** Layout orientation */\n layout: NavLayout;\n /** Color theme */\n theme: NavTheme;\n /** Navigation links (compositional actions) */\n actions: NavLinkAction[];\n}\n\n// ============================================================================\n// Widget Props Types\n// ============================================================================\n\n/**\n * Runtime services passed to the widget.\n */\nexport interface NavWidgetRuntime {\n /** Synchronously evaluate a decision strategy */\n evaluateSync: <T>(strategy: DecisionStrategy<T>) => { value: T; isFallback: boolean };\n /** Context manager for subscribing to changes */\n context: {\n subscribe: (callback: () => void) => () => void;\n };\n /** Event bus for publishing interactions */\n events: {\n publish: (name: string, props?: Record<string, unknown>) => void;\n };\n}\n\n/**\n * Props passed to the NavWidget component.\n */\nexport interface NavWidgetProps {\n /** Widget configuration */\n config: NavConfig;\n /** Runtime services */\n runtime: NavWidgetRuntime;\n /** Instance ID for telemetry */\n instanceId: string;\n}\n\n// ============================================================================\n// Navigation Action Types (merged from adaptive-navigation)\n// ============================================================================\n\ninterface BaseAction {\n label?: string;\n}\n\nexport interface ScrollToAction extends BaseAction {\n kind: 'navigation:scrollTo';\n anchorId: string;\n behavior?: ScrollBehavior;\n block?: ScrollLogicalPosition;\n inline?: ScrollLogicalPosition;\n}\n\nexport interface NavigateAction extends BaseAction {\n kind: 'navigation:navigate';\n url: string;\n target?: '_self' | '_blank';\n}\n\n// ============================================================================\n// Action Namespace\n// ============================================================================\n\nexport const ACTION_NAMESPACES = ['nav', 'navigation'] as const;\n\n/**\n * Returns true if the action belongs to this adaptive package.\n * Uses prefix matching so new kinds (e.g. nav:dropdown) are automatically included.\n * Covers both `nav:*` (compositional) and `navigation:*` (executor) prefixes.\n */\nexport function isOwnAction(action: { kind: string }): boolean {\n return ACTION_NAMESPACES.some((ns) => action.kind.startsWith(`${ns}:`));\n}\n\n// ============================================================================\n// Executor Types\n// ============================================================================\n\nexport type ExecutorCleanup = () => void | Promise<void>;\nexport type ExecutorUpdate = (changes: Record<string, unknown>) => void | Promise<void>;\n\nexport interface ExecutorResult {\n cleanup: ExecutorCleanup;\n updateFn?: ExecutorUpdate;\n}\n\nexport interface ExecutorContext {\n overlayRoot: HTMLElement;\n resolveAnchor: (anchorId: string) => HTMLElement | null;\n generateId: () => string;\n publishEvent: (name: string, props?: Record<string, unknown>) => void;\n adaptiveId?: string;\n}\n\nexport type ActionExecutor<T> = (action: T, context: ExecutorContext) => Promise<ExecutorResult>;\n\n// ============================================================================\n// Editor Types\n// ============================================================================\n\nexport interface EditorPanelProps {\n config: Record<string, unknown>;\n onChange: (config: Record<string, unknown>) => void;\n editor: {\n setDirty: (dirty: boolean) => void;\n navigateHome: () => Promise<boolean>;\n save: () => Promise<void>;\n publish: (captureScreenshot?: boolean) => Promise<void>;\n navigateTo: (route: string) => Promise<void>;\n highlightElement: (selector: string) => void;\n clearHighlight: () => void;\n getCurrentRoute: () => string;\n previewConfig: (config: Record<string, unknown>) => void;\n /** Flat action index to open in edit mode (from accordion navigation). */\n initialEditKey?: string;\n /** Open the editor in create mode. */\n initialCreate?: boolean;\n /** Clear the initial navigation state (call after consuming). */\n clearInitialState?: () => void;\n };\n platformClient?: unknown;\n}\n", "\n function _getR() { return globalThis.__SYNTRO_REACT__; }\n function _jsx(type, props, key) {\n var R = _getR();\n var p = props || {};\n var c = p.children;\n delete p.children;\n if (key !== undefined) p.key = key;\n return Array.isArray(c)\n ? R.createElement.apply(null, [type, p].concat(c))\n : c !== undefined\n ? R.createElement(type, p, c)\n : R.createElement(type, p);\n }\n export var jsx = _jsx;\n export var jsxs = _jsx;\n export var Fragment = (_getR() || {}).Fragment;\n ", "/**\n * Adaptive Nav - Editor Component\n *\n * Review & tweak editor for AI-generated navigation link decisions.\n * Displays a scannable list of link cards with trigger, rationale,\n * and inline editing. Includes detection badges and hover-to-highlight.\n */\n\nimport React, { useState, useCallback, useEffect, useRef } from 'react';\n\nimport { summarizeNavItem, describeTrigger } from './summarize';\nimport { isOwnAction, type NavConfig, type NavLinkAction, type EditorPanelProps, type RuleStrategy } from './types';\n\n// ============================================================================\n// Targeting Extraction (inlined \u2014 CDN builds can't import from editor-sdk)\n// ============================================================================\n\ninterface TargetingInfo {\n pagePatterns: string[];\n anchorSelectors: string[];\n hasTargeting: boolean;\n}\n\nfunction isRuleStrategy(s: unknown): s is RuleStrategy<boolean> {\n return (\n typeof s === 'object' &&\n s !== null &&\n (s as Record<string, unknown>).type === 'rules' &&\n Array.isArray((s as Record<string, unknown>).rules)\n );\n}\n\nfunction extractTargetingInfo(showWhen?: unknown | null): TargetingInfo {\n if (!showWhen || !isRuleStrategy(showWhen)) {\n return { pagePatterns: [], anchorSelectors: [], hasTargeting: false };\n }\n\n const pagePatterns = new Set<string>();\n const anchorSelectors = new Set<string>();\n\n for (const rule of showWhen.rules) {\n for (const cond of rule.conditions) {\n const c = cond as Record<string, unknown>;\n if (c.type === 'page_url' && typeof c.url === 'string') {\n pagePatterns.add(c.url);\n } else if (c.type === 'anchor_visible' && typeof c.anchorId === 'string') {\n anchorSelectors.add(c.anchorId);\n }\n }\n }\n\n const hasTargeting = pagePatterns.size > 0 || anchorSelectors.size > 0;\n return {\n pagePatterns: [...pagePatterns],\n anchorSelectors: [...anchorSelectors],\n hasTargeting,\n };\n}\n\nfunction extractFirstPage(showWhen?: unknown | null): string | null {\n const info = extractTargetingInfo(showWhen);\n return info.pagePatterns[0] || null;\n}\n\nfunction extractFirstAnchor(showWhen?: unknown | null): string | null {\n const info = extractTargetingInfo(showWhen);\n return info.anchorSelectors[0] || null;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\ninterface FlatItem {\n key: string;\n index: number;\n summary: string;\n trigger: string;\n rationale?: { why: string; confidence?: number };\n firstAnchor: string | null;\n link: NavLinkAction;\n}\n\nfunction flattenItems(config: NavConfig): FlatItem[] {\n const actions = (config.actions || []).filter(isOwnAction);\n return actions.map((link, i) => ({\n key: String(i),\n index: i,\n summary: summarizeNavItem(link),\n trigger: describeTrigger(link.showWhen),\n rationale: link.rationale,\n firstAnchor: extractFirstAnchor(link.showWhen),\n link,\n }));\n}\n\nfunction filterConfig(config: NavConfig, dismissedKeys: Set<string>): NavConfig {\n const ownActions = (config.actions || []).filter(isOwnAction);\n return {\n ...config,\n actions: ownActions.filter((_, i) => !dismissedKeys.has(String(i))),\n };\n}\n\n// ============================================================================\n// Detection Hook\n// ============================================================================\n\ninterface DetectionEntry {\n found: boolean;\n element: HTMLElement | null;\n}\n\nfunction useDetection(\n items: FlatItem[],\n getCurrentRoute: () => string\n): Map<string, DetectionEntry> {\n const [detectionMap, setDetectionMap] = useState<Map<string, DetectionEntry>>(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n useEffect(() => {\n const runDetection = () => {\n const map = new Map<string, DetectionEntry>();\n const currentPath = getCurrentRoute();\n\n for (const item of itemsRef.current) {\n const targeting = extractTargetingInfo(item.link.showWhen);\n\n // Check page match\n let pageMatch = true;\n if (targeting.pagePatterns.length > 0) {\n pageMatch = targeting.pagePatterns.some((pattern) => {\n const regex = new RegExp(\n `^${pattern.replace(/\\*\\*/g, '.*').replace(/(?<!\\.)(\\*)/g, '[^/]*')}$`\n );\n return regex.test(currentPath);\n });\n }\n\n // Check anchor presence\n let anchorFound = false;\n let element: HTMLElement | null = null;\n if (item.firstAnchor) {\n try {\n element = document.querySelector(item.firstAnchor) as HTMLElement | null;\n anchorFound = element !== null;\n } catch {\n // Invalid selector\n }\n } else {\n anchorFound = pageMatch;\n }\n\n map.set(item.key, {\n found: pageMatch && anchorFound,\n element,\n });\n }\n\n setDetectionMap(map);\n };\n\n runDetection();\n\n const interval = setInterval(runDetection, 2000);\n window.addEventListener('popstate', runDetection);\n\n return () => {\n clearInterval(interval);\n window.removeEventListener('popstate', runDetection);\n };\n }, [getCurrentRoute]);\n\n return detectionMap;\n}\n\n// ============================================================================\n// Detection Badge\n// ============================================================================\n\nfunction DetectionBadge({ found }: { found: boolean }) {\n return (\n <span\n style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: found ? '#22c55e' : '#475569',\n flexShrink: 0,\n display: 'inline-block',\n }}\n title={found ? 'Found on this page' : 'Not found on this page'}\n />\n );\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column' as const,\n height: '100%',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n header: {\n padding: '16px',\n borderBottom: '1px solid #334155',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n },\n backButton: {\n padding: '6px 12px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: 'rgba(255,255,255,0.05)',\n color: '#94a3b8',\n fontSize: '13px',\n cursor: 'pointer',\n },\n title: {\n margin: 0,\n fontSize: '15px',\n fontWeight: 600,\n color: '#f8fafc',\n },\n subtitle: {\n margin: '2px 0 0 0',\n fontSize: '11px',\n color: '#64748b',\n },\n body: {\n flex: 1,\n overflow: 'auto',\n padding: '16px',\n },\n groupHeader: {\n fontSize: '11px',\n fontWeight: 700,\n color: '#64748b',\n textTransform: 'uppercase' as const,\n letterSpacing: '0.06em',\n padding: '4px 0 8px 0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n groupCount: {\n fontSize: '10px',\n color: '#475569',\n backgroundColor: 'rgba(255,255,255,0.06)',\n padding: '2px 6px',\n borderRadius: '8px',\n },\n card: {\n padding: '8px 10px',\n borderRadius: '6px',\n border: '1px solid rgba(255,255,255,0.06)',\n background: 'rgba(255,255,255,0.02)',\n marginBottom: '4px',\n fontSize: '13px',\n color: '#e2e8f0',\n },\n triggerLine: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n color: '#94a3b8',\n cursor: 'pointer',\n marginBottom: '4px',\n },\n cardBody: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: 'pointer',\n },\n cardText: {\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n },\n rationaleLine: {\n fontSize: '10px',\n color: '#64748b',\n marginTop: '4px',\n },\n dismissButton: {\n padding: '2px 6px',\n borderRadius: '4px',\n border: 'none',\n background: 'transparent',\n color: '#64748b',\n fontSize: '14px',\n cursor: 'pointer',\n flexShrink: 0,\n lineHeight: 1,\n },\n dismissedSection: {\n marginTop: '16px',\n cursor: 'pointer',\n userSelect: 'none' as const,\n },\n dismissedHeader: {\n fontSize: '11px',\n fontWeight: 600,\n color: '#475569',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n },\n dismissedCard: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 10px',\n borderRadius: '6px',\n border: '1px solid rgba(255,255,255,0.03)',\n background: 'transparent',\n marginBottom: '3px',\n cursor: 'pointer',\n fontSize: '12px',\n color: '#475569',\n opacity: 0.6,\n },\n emptyState: {\n textAlign: 'center' as const,\n padding: '32px 16px',\n color: '#64748b',\n fontSize: '13px',\n },\n footer: {\n padding: '12px 16px',\n borderTop: '1px solid #334155',\n display: 'flex',\n gap: '8px',\n },\n saveButton: {\n flex: 1,\n padding: '10px',\n borderRadius: '8px',\n border: 'none',\n background: 'rgba(59, 130, 246, 0.15)',\n color: '#3b82f6',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer',\n },\n publishButton: {\n flex: 1,\n padding: '10px',\n borderRadius: '8px',\n border: 'none',\n background: '#22c55e',\n color: 'white',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer',\n },\n // Edit form styles\n editForm: {\n padding: '4px 0',\n },\n editHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '12px',\n fontSize: '13px',\n fontWeight: 600,\n color: '#e2e8f0',\n },\n editLabel: {\n fontSize: '11px',\n fontWeight: 600,\n color: '#64748b',\n marginBottom: '4px',\n display: 'block',\n },\n editInput: {\n width: '100%',\n padding: '6px 8px',\n borderRadius: '4px',\n border: '1px solid rgba(255,255,255,0.1)',\n background: 'rgba(255,255,255,0.04)',\n color: '#e2e8f0',\n fontSize: '12px',\n fontFamily: 'inherit',\n marginBottom: '8px',\n boxSizing: 'border-box' as const,\n },\n editRationale: {\n padding: '8px',\n borderRadius: '4px',\n border: '1px dashed rgba(255,255,255,0.15)',\n background: 'rgba(255,255,255,0.02)',\n color: '#94a3b8',\n fontSize: '12px',\n marginBottom: '8px',\n },\n editBackButton: {\n padding: '6px 12px',\n borderRadius: '6px',\n border: '1px solid rgba(255,255,255,0.1)',\n background: 'transparent',\n color: '#94a3b8',\n fontSize: '12px',\n cursor: 'pointer',\n marginTop: '8px',\n },\n editCheckbox: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '12px',\n color: '#94a3b8',\n marginBottom: '8px',\n },\n};\n\n// ============================================================================\n// NavEditor Component\n// ============================================================================\n\nexport function NavEditor({ config, onChange, editor }: EditorPanelProps) {\n const typedConfig = config as unknown as NavConfig;\n const [dismissedKeys, setDismissedKeys] = useState<Set<string>>(new Set());\n const [dismissedOpen, setDismissedOpen] = useState(false);\n const [editingKey, setEditingKey] = useState<string | null>(null);\n const [previewMode, setPreviewMode] = useState<'before' | 'after'>('after');\n const [_hoveredKey, setHoveredKey] = useState<string | null>(null);\n\n // Consume initial navigation payload on mount (Nav is a widget mount \u2014\n // initialEditKey points to the mount action, no sub-item to pre-select)\n const initialConsumed = useRef(false);\n useEffect(() => {\n if (!initialConsumed.current && (editor.initialEditKey != null || editor.initialCreate)) {\n initialConsumed.current = true;\n editor.clearInitialState?.();\n }\n }, [editor]);\n\n const allItems = flattenItems(typedConfig);\n const activeItems = allItems.filter((item) => !dismissedKeys.has(item.key));\n const dismissedItems = allItems.filter((item) => dismissedKeys.has(item.key));\n const totalLinks = activeItems.length;\n\n const detectionMap = useDetection(allItems, editor.getCurrentRoute);\n const foundCount = activeItems.filter((item) => detectionMap.get(item.key)?.found).length;\n\n const handleDismiss = useCallback(\n (key: string) => {\n setDismissedKeys((prev) => {\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n if (editingKey === key) setEditingKey(null);\n },\n [editingKey]\n );\n\n const handleRestore = useCallback((key: string) => {\n setDismissedKeys((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }, []);\n\n const handleCardBodyClick = useCallback((item: FlatItem) => {\n setEditingKey(item.key);\n }, []);\n\n const handleTriggerClick = useCallback(\n (item: FlatItem) => {\n const pageUrl = extractFirstPage(item.link.showWhen);\n if (pageUrl) {\n editor.navigateTo(pageUrl);\n }\n if (item.firstAnchor) {\n editor.highlightElement(item.firstAnchor);\n }\n },\n [editor]\n );\n\n const handleBackToList = useCallback(() => {\n setEditingKey(null);\n setPreviewMode('after');\n editor.previewConfig(config);\n editor.clearHighlight();\n }, [editor, config]);\n\n const handleBeforeAfter = useCallback(\n (mode: 'before' | 'after') => {\n setPreviewMode(mode);\n if (mode === 'before') {\n const filtered = filterConfig(typedConfig, new Set([editingKey!]));\n editor.previewConfig(filtered as unknown as Record<string, unknown>);\n } else {\n editor.previewConfig(config);\n }\n },\n [typedConfig, editingKey, editor, config]\n );\n\n const handleFieldChange = useCallback(\n (index: number, field: string, value: unknown) => {\n const ownActions = (typedConfig.actions || []).filter(isOwnAction).slice();\n const link = { ...ownActions[index], config: { ...ownActions[index].config } };\n (link.config as Record<string, unknown>)[field] = value;\n ownActions[index] = link;\n const otherActions = (typedConfig.actions || []).filter((a) => !isOwnAction(a));\n const updated = { ...typedConfig, actions: [...otherActions, ...ownActions] };\n onChange(updated as unknown as Record<string, unknown>);\n editor.setDirty(true);\n },\n [typedConfig, onChange, editor]\n );\n\n const handlePublish = useCallback(() => {\n if (dismissedKeys.size > 0) {\n const filtered = filterConfig(typedConfig, dismissedKeys);\n onChange(filtered as unknown as Record<string, unknown>);\n }\n editor.publish();\n }, [dismissedKeys, typedConfig, onChange, editor]);\n\n const handleCardHover = useCallback(\n (item: FlatItem) => {\n setHoveredKey(item.key);\n if (item.firstAnchor) {\n editor.highlightElement(item.firstAnchor);\n }\n },\n [editor]\n );\n\n const handleCardLeave = useCallback(() => {\n setHoveredKey(null);\n editor.clearHighlight();\n }, [editor]);\n\n // ---- Edit form renderer ----\n\n const renderEditFields = (index: number) => {\n const actions = (typedConfig.actions || []).filter(isOwnAction);\n const link = actions[index];\n if (!link) return null;\n\n const item = allItems.find((it) => it.key === String(index));\n\n return (\n <div style={styles.editForm}>\n {/* Trigger line in edit mode */}\n {item && item.trigger !== 'All pages' && (\n <div data-trigger style={styles.triggerLine} onClick={() => handleTriggerClick(item)}>\n <span>{'\\u{1f4cd}'}</span>\n <span>{item.trigger}</span>\n </div>\n )}\n\n <label style={styles.editLabel}>Label</label>\n <input\n style={styles.editInput}\n value={link.config.label}\n onChange={(e) => handleFieldChange(index, 'label', e.target.value)}\n />\n\n <label style={styles.editLabel}>URL</label>\n <input\n style={styles.editInput}\n value={link.config.href}\n onChange={(e) => handleFieldChange(index, 'href', e.target.value)}\n />\n\n <label style={styles.editLabel}>Icon</label>\n <input\n style={styles.editInput}\n value={link.config.icon || ''}\n onChange={(e) => handleFieldChange(index, 'icon', e.target.value)}\n placeholder=\"e.g., \\u{1f3e0}\"\n />\n\n <label style={styles.editCheckbox}>\n <input\n type=\"checkbox\"\n checked={link.config.external || false}\n onChange={(e) => handleFieldChange(index, 'external', e.target.checked)}\n />\n Open in new tab\n </label>\n\n <label style={styles.editLabel}>AI Rationale</label>\n <div style={styles.editRationale}>{link.rationale ? link.rationale.why : 'N/A'}</div>\n </div>\n );\n };\n\n return (\n <div style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n <button onClick={() => editor.navigateHome()} style={styles.backButton}>\n &larr; Back\n </button>\n <div>\n <h2 style={styles.title}>Navigation Links</h2>\n <p style={styles.subtitle}>\n {totalLinks} link{totalLinks !== 1 ? 's' : ''}\n {totalLinks > 0 && ` (${foundCount} found on this page)`}\n </p>\n </div>\n </div>\n\n {/* Body */}\n <div style={styles.body}>\n {editingKey !== null ? (\n /* ---- Edit mode ---- */\n (() => {\n const editIndex = Number(editingKey);\n const editItem = allItems.find((it) => it.key === editingKey);\n return (\n <>\n <div style={styles.editHeader}>\n <span>{'\\u{1f517}'}</span>\n <span>{editItem?.summary}</span>\n </div>\n <div\n style={{\n display: 'flex',\n gap: '0',\n marginBottom: '12px',\n borderRadius: '6px',\n overflow: 'hidden',\n border: '1px solid rgba(255,255,255,0.1)',\n }}\n >\n <button\n onClick={() => handleBeforeAfter('before')}\n style={{\n flex: 1,\n padding: '6px 12px',\n border: 'none',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n background: previewMode === 'before' ? 'rgba(59,130,246,0.2)' : 'transparent',\n color: previewMode === 'before' ? '#3b82f6' : '#64748b',\n }}\n >\n Before\n </button>\n <button\n onClick={() => handleBeforeAfter('after')}\n style={{\n flex: 1,\n padding: '6px 12px',\n border: 'none',\n borderLeft: '1px solid rgba(255,255,255,0.1)',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n background: previewMode === 'after' ? 'rgba(59,130,246,0.2)' : 'transparent',\n color: previewMode === 'after' ? '#3b82f6' : '#64748b',\n }}\n >\n After\n </button>\n </div>\n {renderEditFields(editIndex)}\n <button style={styles.editBackButton} onClick={handleBackToList}>\n &larr; List\n </button>\n </>\n );\n })()\n ) : (\n /* ---- List mode ---- */\n <>\n {allItems.length === 0 && <div style={styles.emptyState}>No links configured.</div>}\n\n {activeItems.length > 0 && (\n <>\n <div style={styles.groupHeader}>\n <span>NAV</span>\n <span style={styles.groupCount}>{activeItems.length}</span>\n </div>\n {activeItems.map((item) => {\n const detection = detectionMap.get(item.key);\n return (\n <div\n key={item.key}\n style={styles.card}\n data-item-key={item.key}\n onMouseEnter={() => handleCardHover(item)}\n onMouseLeave={handleCardLeave}\n >\n {/* Trigger line */}\n {item.trigger !== 'All pages' && (\n <div\n data-trigger\n style={styles.triggerLine}\n onClick={(e) => {\n e.stopPropagation();\n handleTriggerClick(item);\n }}\n >\n <span>{'\\u{1f4cd}'}</span>\n <span>{item.trigger}</span>\n </div>\n )}\n {/* Card body: badge + summary + dismiss */}\n <div\n data-card-body\n style={styles.cardBody}\n onClick={() => handleCardBodyClick(item)}\n >\n <DetectionBadge found={detection?.found ?? false} />\n <span style={styles.cardText}>{item.summary}</span>\n <button\n style={styles.dismissButton}\n onClick={(e) => {\n e.stopPropagation();\n handleDismiss(item.key);\n }}\n title=\"Dismiss this link\"\n >\n &times;\n </button>\n </div>\n {/* Rationale line */}\n <div style={styles.rationaleLine}>\n WHY: {item.rationale ? item.rationale.why : 'N/A'}\n </div>\n </div>\n );\n })}\n </>\n )}\n\n {/* Dismissed section */}\n {dismissedItems.length > 0 && (\n <div style={styles.dismissedSection}>\n <div\n style={{ ...styles.dismissedHeader, cursor: 'pointer' }}\n onClick={() => setDismissedOpen(!dismissedOpen)}\n >\n <span>{dismissedOpen ? '\\u25be' : '\\u25b8'}</span>\n <span>Dismissed ({dismissedItems.length})</span>\n </div>\n {dismissedOpen && (\n <div style={{ marginTop: '6px' }}>\n {dismissedItems.map((item) => (\n <div key={item.key} style={styles.dismissedCard}>\n <span style={{ ...styles.cardText, textDecoration: 'line-through' }}>\n {item.summary}\n </span>\n <button\n style={{\n ...styles.dismissButton,\n color: '#3b82f6',\n fontSize: '11px',\n }}\n onClick={(e) => {\n e.stopPropagation();\n handleRestore(item.key);\n }}\n >\n Restore\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Footer */}\n <div style={styles.footer}>\n <button onClick={() => editor.save()} style={styles.saveButton}>\n Save Draft\n </button>\n <button onClick={handlePublish} style={styles.publishButton}>\n Publish\n </button>\n </div>\n </div>\n );\n}\n\n/**\n * Editor panel configuration for the app registry.\n */\nexport const editorPanel = {\n title: 'Navigation',\n icon: '\\u{1f517}',\n description: 'Navigation link list with per-item visibility',\n};\n\nexport const editor = {\n panel: editorPanel,\n component: NavEditor,\n};\n\nexport default NavEditor;\n", "\n var RD = globalThis.__SYNTRO_REACT_DOM__;\n export default RD;\n export var createRoot = RD?.createRoot;\n export var createPortal = RD?.createPortal;\n ", "/**\n * Adaptive Nav - NavWidget Component\n *\n * React component that renders a navigation link list with per-item\n * conditional visibility based on showWhen decision strategies.\n *\n * Demonstrates the compositional action pattern where child actions\n * (nav:link) serve as configuration data for the parent widget.\n */\n\nimport React, { useEffect, useReducer, useMemo, useCallback } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport type { NavWidgetProps, NavLinkAction, NavConfig, NavWidgetRuntime } from './types';\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles = {\n nav: {\n display: 'flex',\n gap: '4px',\n padding: '8px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n link: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 12px',\n borderRadius: '6px',\n textDecoration: 'none',\n fontSize: '14px',\n fontWeight: 500,\n transition: 'background-color 0.15s ease, color 0.15s ease',\n cursor: 'pointer',\n border: 'none',\n background: 'transparent',\n },\n icon: {\n fontSize: '16px',\n },\n externalIcon: {\n fontSize: '12px',\n opacity: 0.6,\n },\n} as const;\n\nconst themeStyles = {\n light: {\n nav: {\n backgroundColor: '#ffffff',\n },\n link: {\n color: '#374151',\n },\n linkHover: {\n backgroundColor: '#f3f4f6',\n color: '#111827',\n },\n },\n dark: {\n nav: {\n backgroundColor: '#1f2937',\n },\n link: {\n color: '#d1d5db',\n },\n linkHover: {\n backgroundColor: '#374151',\n color: '#f9fafb',\n },\n },\n} as const;\n\n// ============================================================================\n// NavLink Component\n// ============================================================================\n\ninterface NavLinkComponentProps {\n link: NavLinkAction;\n theme: 'light' | 'dark';\n onNavigate: (href: string, external: boolean) => void;\n}\n\nfunction NavLinkComponent({ link, theme, onNavigate }: NavLinkComponentProps) {\n const [isHovered, setIsHovered] = React.useState(false);\n const { label, href, icon, external } = link.config;\n const colors = themeStyles[theme];\n\n const style: React.CSSProperties = {\n ...baseStyles.link,\n ...colors.link,\n ...(isHovered ? colors.linkHover : {}),\n };\n\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n onNavigate(href, external ?? false);\n };\n\n return (\n <a\n href={href}\n onClick={handleClick}\n style={style}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n target={external ? '_blank' : undefined}\n rel={external ? 'noopener noreferrer' : undefined}\n >\n {icon && <span style={baseStyles.icon}>{icon}</span>}\n <span>{label}</span>\n {external && <span style={baseStyles.externalIcon}>\u2197</span>}\n </a>\n );\n}\n\n// ============================================================================\n// NavWidget Component\n// ============================================================================\n\n/**\n * NavWidget - Renders a navigation link list with per-item activation.\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 links\n * - Parent manages re-rendering on context changes\n */\nexport function NavWidget({ config, runtime, instanceId }: NavWidgetProps) {\n // Force re-render when context changes\n const [, forceUpdate] = useReducer((x) => x + 1, 0);\n\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\n // Filter visible links based on per-item showWhen\n const visibleLinks = useMemo(\n () =>\n config.actions.filter((link) => {\n // No showWhen = always visible\n if (!link.showWhen) return true;\n\n // Evaluate the decision strategy\n const result = runtime.evaluateSync<boolean>(link.showWhen);\n return result.value;\n }),\n [config.actions, runtime]\n );\n\n // Resolve theme (auto \u2192 detect system preference)\n const resolvedTheme = useMemo(() => {\n if (config.theme !== 'auto') return config.theme;\n\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\n // Handle navigation with event publishing\n const handleNavigate = useCallback(\n (href: string, external: boolean) => {\n // Publish navigation event for analytics\n runtime.events.publish('nav:click', {\n instanceId,\n href,\n external,\n timestamp: Date.now(),\n });\n\n // Perform navigation\n if (external) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n window.location.href = href;\n }\n },\n [runtime.events, instanceId]\n );\n\n // Compute nav styles\n const navStyle: React.CSSProperties = {\n ...baseStyles.nav,\n ...themeStyles[resolvedTheme].nav,\n flexDirection: config.layout === 'vertical' ? 'column' : 'row',\n };\n\n // Empty state\n if (visibleLinks.length === 0) {\n return null;\n }\n\n return (\n <nav style={navStyle} data-adaptive-id={instanceId} data-adaptive-type=\"adaptive-nav\">\n {visibleLinks.map((link, index) => (\n <NavLinkComponent\n key={link.config.href + index}\n link={link}\n theme={resolvedTheme}\n onNavigate={handleNavigate}\n />\n ))}\n </nav>\n );\n}\n\n// ============================================================================\n// Mountable Widget Interface\n// ============================================================================\n\n/**\n * Mountable widget interface for the runtime's WidgetRegistry.\n */\nexport const NavMountableWidget = {\n mount(\n container: HTMLElement,\n config?: NavConfig & { runtime?: NavWidgetRuntime; instanceId?: string }\n ) {\n const {\n runtime,\n instanceId = 'nav-widget',\n ...navConfig\n } = config || {\n layout: 'horizontal' as const,\n theme: 'auto' as const,\n actions: [],\n };\n\n // React rendering when runtime + ReactDOM are available\n if (runtime && typeof createRoot === 'function') {\n const root = createRoot(container);\n root.render(\n React.createElement(NavWidget, {\n config: navConfig as NavConfig,\n runtime: runtime as NavWidgetRuntime,\n instanceId,\n })\n );\n return () => { root.unmount(); };\n }\n\n // HTML fallback for non-React environments\n const links = (navConfig as NavConfig).actions || [];\n container.innerHTML = `\n <nav style=\"display: flex; gap: 8px; padding: 8px; font-family: system-ui;\">\n ${links\n .map(\n (link) => `\n <a href=\"${link.config.href}\" style=\"padding: 8px 12px; text-decoration: none; color: #374151;\">\n ${link.config.icon ? `<span>${link.config.icon}</span>` : ''}\n ${link.config.label}\n </a>\n `\n )\n .join('')}\n </nav>\n `;\n\n return () => {\n container.innerHTML = '';\n };\n },\n};\n\nexport default NavWidget;\n", "/**\n * Adaptive Nav - Runtime Module\n *\n * Runtime manifest for the navigation link list adaptive.\n * Includes widget-based nav links and navigation action executors\n * (scrollTo, navigate) previously in adaptive-navigation.\n */\n\nimport { NavMountableWidget } from './NavWidget';\nimport type { ScrollToAction, NavigateAction, ExecutorResult, ActionExecutor } from './types';\n\n// ============================================================================\n// Navigation Action Executors (merged from adaptive-navigation)\n// ============================================================================\n\n/**\n * Execute a scrollTo action\n */\nexport const executeScrollTo: ActionExecutor<ScrollToAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\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\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'navigation:scrollTo',\n anchorId: action.anchorId,\n behavior: action.behavior ?? 'smooth',\n });\n\n return {\n cleanup: () => {\n // Optionally restore scroll position on revert\n },\n };\n};\n\n/**\n * Execute a navigate action\n */\nexport const executeNavigate: ActionExecutor<NavigateAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\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\n const target = action.target ?? '_self';\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'navigation:navigate',\n url: action.url,\n target,\n });\n\n if (target === '_blank') {\n // Open in new tab\n window.open(url, '_blank', 'noopener,noreferrer');\n } else {\n // Navigate in current tab\n window.location.href = url;\n }\n\n return {\n cleanup: () => {\n // Navigation cannot be reverted\n },\n };\n};\n\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\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] as const;\n\n// ============================================================================\n// App Runtime Manifest\n// ============================================================================\n\n/**\n * Runtime manifest for adaptive-nav.\n *\n * Provides:\n * - Navigation action executors (scrollTo, navigate)\n * - Widget-based nav links (compositional nav:link actions)\n */\nexport const runtime = {\n id: 'adaptive-nav',\n version: '1.0.0',\n name: 'Navigation Links',\n description: 'Navigation actions and widget-based link list with per-item conditional visibility',\n\n /**\n * Navigation action executors (scrollTo, navigate).\n */\n executors,\n\n /**\n * Widget definitions for the runtime's WidgetRegistry.\n */\n widgets: [\n {\n id: 'adaptive-nav:links',\n component: NavMountableWidget,\n metadata: {\n name: 'Navigation Links',\n description: 'Horizontal or vertical navigation link list',\n icon: '\uD83D\uDD17',\n },\n },\n ],\n};\n\nexport default runtime;\n", "/**\n * CDN Entry Point for Adaptive Nav\n *\n * This module is bundled for CDN delivery and self-registers with the global\n * SynOS app registry when loaded dynamically via the AppLoader.\n */\n\nimport NavEditor, { editorPanel } from './editor';\nimport { executors, runtime } from './runtime';\n\n/**\n * App manifest for registry registration.\n * Follows the AppManifest interface expected by AppLoader/AppRegistry.\n */\nexport const manifest = {\n id: 'adaptive-nav',\n version: runtime.version,\n name: runtime.name,\n description: runtime.description,\n runtime: {\n actions: executors.map(({ kind, executor }) => ({\n kind,\n executor,\n })),\n widgets: runtime.widgets,\n },\n editor: { component: NavEditor, panel: editorPanel },\n metadata: {\n isBuiltIn: false,\n },\n};\n\n/**\n * Self-register with global registry if available.\n * This happens when loaded via script tag (UMD).\n */\nif (typeof window !== 'undefined') {\n const registry = (window as any).SynOS?.appRegistry;\n if (registry && typeof registry.register === 'function') {\n registry.register(manifest);\n }\n}\n\nexport default manifest;\n"],
5
+ "mappings": "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",
6
+ "names": ["R", "react_default", "useState", "useEffect", "useMemo", "useCallback", "useRef", "useContext", "useReducer", "createElement", "createContext", "Fragment", "forwardRef", "memo", "lazy", "Suspense", "Children", "isValidElement", "cloneElement", "Component", "PureComponent", "useLayoutEffect", "useId", "truncate", "text", "max", "isRuleStrategy", "s", "describeTrigger", "showWhen", "pages", "anchors", "rule", "condition", "parts", "summarizeNavItem", "item", "icon", "label", "href", "ACTION_NAMESPACES", "isOwnAction", "action", "ns", "_getR", "_jsx", "type", "props", "key", "R", "p", "c", "jsx", "jsxs", "Fragment", "isRuleStrategy", "s", "extractTargetingInfo", "showWhen", "pagePatterns", "anchorSelectors", "rule", "cond", "c", "hasTargeting", "extractFirstPage", "extractFirstAnchor", "flattenItems", "config", "isOwnAction", "link", "summarizeNavItem", "describeTrigger", "filterConfig", "dismissedKeys", "ownActions", "_", "i", "useDetection", "items", "getCurrentRoute", "detectionMap", "setDetectionMap", "useState", "itemsRef", "useRef", "useEffect", "runDetection", "map", "currentPath", "item", "targeting", "pageMatch", "pattern", "anchorFound", "element", "interval", "DetectionBadge", "found", "jsx", "styles", "NavEditor", "onChange", "editor", "typedConfig", "setDismissedKeys", "dismissedOpen", "setDismissedOpen", "editingKey", "setEditingKey", "previewMode", "setPreviewMode", "_hoveredKey", "setHoveredKey", "initialConsumed", "allItems", "activeItems", "dismissedItems", "totalLinks", "foundCount", "handleDismiss", "useCallback", "key", "prev", "next", "handleRestore", "handleCardBodyClick", "handleTriggerClick", "pageUrl", "handleBackToList", "handleBeforeAfter", "mode", "filtered", "handleFieldChange", "index", "field", "value", "otherActions", "a", "updated", "handlePublish", "handleCardHover", "handleCardLeave", "renderEditFields", "it", "jsxs", "e", "editIndex", "editItem", "Fragment", "detection", "editorPanel", "editor_default", "NavEditor", "RD", "createRoot", "RD", "createPortal", "baseStyles", "themeStyles", "NavLinkComponent", "link", "theme", "onNavigate", "isHovered", "setIsHovered", "react_default", "label", "href", "icon", "external", "colors", "style", "jsxs", "e", "jsx", "NavWidget", "config", "runtime", "instanceId", "forceUpdate", "useReducer", "x", "useEffect", "visibleLinks", "useMemo", "resolvedTheme", "handleNavigate", "useCallback", "navStyle", "index", "NavMountableWidget", "container", "navConfig", "createRoot", "root", "links", "executeScrollTo", "action", "context", "anchorEl", "executeNavigate", "url", "target", "executors", "runtime", "NavMountableWidget", "manifest", "runtime", "executors", "kind", "executor", "editor_default", "editorPanel", "registry", "cdn_default"]
7
+ }
@@ -0,0 +1,91 @@
1
+ var H=globalThis.__SYNTRO_REACT__||{};var rt=H.useState,Bt=H.useEffect,$n=H.useMemo,tt=H.useCallback,Ct=H.useRef,Pn=H.useContext,Mn=H.useReducer,Hn=H.createElement,Bn=H.createContext,zn=H.Fragment,Dn=H.forwardRef,Fn=H.memo,Nn=H.lazy,Wn=H.Suspense,_n=H.Children,Vn=H.isValidElement,jn=H.cloneElement,Kn=H.Component,qn=H.PureComponent,Xn=H.useLayoutEffect,Yn=H.useId;function At(t){if(!t)return"(no target)";if(t.startsWith("#"))return Kt(t.slice(1),50);let e=t.match(/\[data-testid="([^"]+)"\]/);return e?`${e[1]} element`:Kt(t,50)}function Kt(t,e){return t.length<=e?t:`${t.slice(0,e)}...`}function qt(t,e){return t.length<=e?`"${t}"`:`"${t.slice(0,e)}..."`}function zt(t,e){switch(t){case"tooltips":{let n=e.anchorId||"",o=At(n),r=e.content?.body||"";return`Tooltip on ${o}: ${qt(r,40)}`}case"highlights":{let n=e.anchorId||"";return`Highlight ${At(n)}`}case"badges":{let n=e.anchorId||"",o=At(n);return`Badge "${e.content||""}" on ${o}`}case"pulses":{let n=e.anchorId||"";return`Pulse on ${At(n)}`}case"modals":{let n=e.content,o=n?.title||n?.body||"";return`Modal: ${qt(o,40)}`}case"tours":{let n=e.tourId||"unknown",i=(e.steps||[]).length;return`Tour: ${n} (${i} ${i===1?"step":"steps"})`}default:return"Unknown overlay"}}function Xt(){return globalThis.__SYNTRO_REACT__}function Yt(t,e,n){var o=Xt(),i=e||{},r=i.children;return delete i.children,n!==void 0&&(i.key=n),Array.isArray(r)?o.createElement.apply(null,[t,i].concat(r)):r!==void 0?o.createElement(t,i,r):o.createElement(t,i)}var b=Yt,T=Yt,yt=(Xt()||{}).Fragment;function Dt(t,e){return`${t}:${e}`}var Jt=["tooltips","highlights","badges","pulses","modals"],Ut={tooltips:"\u{1F4AC}",highlights:"\u2728",badges:"\u{1F3F7}\uFE0F",pulses:"\u{1F4AB}",modals:"\u{1F4E6}",tours:"\u{1F3AF}"},y={container:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif"},header:{padding:"16px",borderBottom:"1px solid #334155",display:"flex",alignItems:"center",gap:"12px"},backButton:{padding:"6px 12px",borderRadius:"6px",border:"none",backgroundColor:"rgba(255,255,255,0.05)",color:"#94a3b8",fontSize:"13px",cursor:"pointer"},title:{margin:0,fontSize:"15px",fontWeight:600,color:"#f8fafc"},subtitle:{margin:"2px 0 0 0",fontSize:"11px",color:"#64748b"},body:{flex:1,overflow:"auto",padding:"16px"},groupHeader:{fontSize:"11px",fontWeight:700,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.06em",padding:"4px 0 8px 0",display:"flex",alignItems:"center",justifyContent:"space-between"},groupCount:{fontSize:"10px",color:"#475569",backgroundColor:"rgba(255,255,255,0.06)",padding:"2px 6px",borderRadius:"8px"},card:{display:"flex",alignItems:"center",gap:"8px",padding:"8px 10px",borderRadius:"6px",border:"1px solid rgba(255,255,255,0.06)",background:"rgba(255,255,255,0.02)",marginBottom:"4px",cursor:"pointer",fontSize:"13px",color:"#e2e8f0"},cardIcon:{fontSize:"13px",flexShrink:0},cardText:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},dismissButton:{padding:"2px 6px",borderRadius:"4px",border:"none",background:"transparent",color:"#64748b",fontSize:"14px",cursor:"pointer",flexShrink:0,lineHeight:1},dismissedSection:{marginTop:"16px",cursor:"pointer",userSelect:"none"},dismissedHeader:{fontSize:"11px",fontWeight:600,color:"#475569",display:"flex",alignItems:"center",gap:"6px"},dismissedCard:{display:"flex",alignItems:"center",gap:"8px",padding:"6px 10px",borderRadius:"6px",border:"1px solid rgba(255,255,255,0.03)",background:"transparent",marginBottom:"3px",cursor:"pointer",fontSize:"12px",color:"#475569",opacity:.6},emptyState:{textAlign:"center",padding:"32px 16px",color:"#64748b",fontSize:"13px"},footer:{padding:"12px 16px",borderTop:"1px solid #334155",display:"flex",gap:"8px"},saveButton:{flex:1,padding:"10px",borderRadius:"8px",border:"none",background:"rgba(59, 130, 246, 0.15)",color:"#3b82f6",fontSize:"13px",fontWeight:600,cursor:"pointer"},publishButton:{flex:1,padding:"10px",borderRadius:"8px",border:"none",background:"#22c55e",color:"white",fontSize:"13px",fontWeight:600,cursor:"pointer"},tourDrillIn:{padding:"12px",borderRadius:"8px",border:"1px solid rgba(255,255,255,0.08)",background:"rgba(255,255,255,0.02)",marginTop:"4px",marginBottom:"8px"},tourDrillInHeader:{fontSize:"13px",fontWeight:600,color:"#e2e8f0",marginBottom:"8px"},stepRow:{display:"flex",alignItems:"center",gap:"8px",padding:"6px 8px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.04)",marginBottom:"4px",fontSize:"12px",color:"#d1d5db"},stepNumber:{fontSize:"11px",fontWeight:700,color:"#64748b",minWidth:"18px"},stepInfo:{flex:1,overflow:"hidden"},stepRoute:{fontSize:"10px",color:"#64748b",fontFamily:"monospace"},checkbox:{display:"flex",alignItems:"center",gap:"8px",fontSize:"12px",color:"#d1d5db",marginBottom:"8px"},backToListButton:{padding:"4px 10px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.1)",background:"transparent",color:"#94a3b8",fontSize:"11px",cursor:"pointer",marginTop:"8px"},editForm:{padding:"4px 0"},editHeader:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"12px",fontSize:"13px",fontWeight:600,color:"#e2e8f0"},editTarget:{fontSize:"11px",fontFamily:"monospace",color:"#94a3b8",padding:"4px 8px",background:"rgba(255,255,255,0.04)",borderRadius:"4px",marginBottom:"12px"},editLabel:{fontSize:"11px",fontWeight:600,color:"#64748b",marginBottom:"4px",display:"block"},editInput:{width:"100%",padding:"6px 8px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.1)",background:"rgba(255,255,255,0.04)",color:"#e2e8f0",fontSize:"12px",fontFamily:"inherit",marginBottom:"8px",boxSizing:"border-box"},editTextarea:{width:"100%",padding:"6px 8px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.1)",background:"rgba(255,255,255,0.04)",color:"#e2e8f0",fontSize:"12px",fontFamily:"inherit",marginBottom:"8px",resize:"vertical",minHeight:"60px",boxSizing:"border-box"},editSelect:{width:"100%",padding:"6px 8px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.1)",background:"rgba(255,255,255,0.04)",color:"#e2e8f0",fontSize:"12px",marginBottom:"8px"},editBackButton:{padding:"6px 12px",borderRadius:"6px",border:"1px solid rgba(255,255,255,0.1)",background:"transparent",color:"#94a3b8",fontSize:"12px",cursor:"pointer",marginTop:"8px"}};function Zt(t){let e=[];for(let o of Jt)(t[o]||[]).forEach((r,s)=>{let a=r;e.push({key:Dt(o,s),section:o,index:s,icon:Ut[o],summary:zt(o,a),anchorId:a.anchorId||"",isTour:!1})});return(t.tours||[]).forEach((o,i)=>{e.push({key:Dt("tours",i),section:"tours",index:i,icon:Ut.tours,summary:zt("tours",o),anchorId:"",isTour:!0})}),e}function Gt(t,e){let n={...t},o=[...Jt,"tours"];for(let i of o){let s=(t[i]||[]).filter((a,l)=>!e.has(Dt(i,l)));(s.length>0||t[i]!==void 0)&&(n[i]=s)}return n}function We(t){let n=t.action.kind||"";return n.includes("tooltip")?"\u{1F4AC}":n.includes("highlight")?"\u2728":n.includes("modal")?"\u{1F4E6}":n.includes("badge")?"\u{1F3F7}\uFE0F":n.includes("pulse")?"\u{1F4AB}":"\u25CF"}function _e(t){let e=t.action,n=e.anchorId;if(n)return n;let o=e.content;return o?.title?o.title:o?.body?o.body.slice(0,30):t.id}function Ve(t,e){let[n,o]=rt(new Map),i=Ct(t),r=Ct(e);return i.current=t,r.current=e,Bt(()=>{let s=()=>{let l=new Map;for(let c of i.current){let p=c.anchorId;if(c.isTour&&!p){let g=(r.current.tours||[])[c.index];g&&g.steps.length>0&&(p=g.steps[0].action.anchorId||"")}if(!p){l.set(c.key,{found:!1,element:null});continue}try{let f=document.querySelector(p);l.set(c.key,{found:f!==null,element:f})}catch{l.set(c.key,{found:!1,element:null})}}o(l)};s();let a=setInterval(s,2e3);return()=>clearInterval(a)},[]),n}function je({found:t}){return b("span",{style:{width:"8px",height:"8px",borderRadius:"50%",backgroundColor:t?"#22c55e":"#475569",flexShrink:0,display:"inline-block"},title:t?"Found on this page":"Not found on this page"})}function Ke(t){let[e,n]=t.split(":");return{section:e,index:Number(n)}}function qe({config:t,onChange:e,editor:n}){let o=t,[i,r]=rt(new Set),[s,a]=rt(!1),[l,c]=rt(null),[p,f]=rt(null),[g,d]=rt("after"),x=Ct(!1);Bt(()=>{if(n.initialEditKey!=null&&!x.current){x.current=!0;let m=Zt(o),R=Number(n.initialEditKey);if(R>=0&&R<m.length){let P=m[R];P.isTour?c(P.key):(f(P.key),P.anchorId&&n.highlightElement(P.anchorId))}n.clearInitialState?.()}else n.initialCreate&&!x.current&&(x.current=!0,n.clearInitialState?.())},[n,o]);let v=Zt(o),w=v.filter(m=>!i.has(m.key)),u=v.filter(m=>i.has(m.key)),h=w.filter(m=>!m.isTour),k=w.filter(m=>m.isTour),S=w.length,[E,O]=rt(null),M=Ve(v,o),W=w.filter(m=>M.get(m.key)?.found).length,L=tt(m=>{r(R=>{let P=new Set(R);return P.add(m),P}),l===m&&c(null),p===m&&f(null)},[l,p]),C=tt(m=>{r(R=>{let P=new Set(R);return P.delete(m),P})},[]),$=tt(m=>{m.isTour?c(R=>R===m.key?null:m.key):(m.anchorId&&n.highlightElement(m.anchorId),f(m.key))},[n]),B=tt(()=>{f(null),d("after"),n.previewConfig(t),n.clearHighlight()},[n,t]),z=tt(m=>{if(d(m),m==="before"){let R=Gt(o,new Set([p]));n.previewConfig(R)}else n.previewConfig(t)},[o,p,n,t]),I=tt((m,R,P)=>{let F=(o[m]||[]).slice(),et={...F[R]};F[R]=P(et);let K={...o,[m]:F};e(K),n.setDirty(!0)},[o,e,n]),_=tt(()=>{if(i.size>0){let m=Gt(o,i);e(m)}n.publish()},[i,o,e,n]),A=tt(m=>{O(m.key),m.anchorId&&n.highlightElement(m.anchorId)},[n]),D=tt(()=>{O(null),n.clearHighlight()},[n]),N=(m,R)=>{let F=(o[m]||[])[R];if(!F)return null;let et=F.anchorId||"";switch(m){case"tooltips":{let K=F.content||{};return T("div",{style:y.editForm,children:[b("div",{style:y.editTarget,children:et}),b("label",{style:y.editLabel,children:"Title"}),b("input",{style:y.editInput,value:K.title||"",onChange:V=>I(m,R,U=>({...U,content:{...U.content,title:V.target.value}}))}),b("label",{style:y.editLabel,children:"Body"}),b("textarea",{style:y.editTextarea,value:K.body||"",onChange:V=>I(m,R,U=>({...U,content:{...U.content,body:V.target.value}}))})]})}case"highlights":return T("div",{style:y.editForm,children:[b("div",{style:y.editTarget,children:et}),b("label",{style:y.editLabel,children:"Color"}),b("input",{style:y.editInput,value:F.style?.color||"",onChange:K=>I(m,R,V=>({...V,style:{...V.style||{},color:K.target.value}}))})]});case"badges":return T("div",{style:y.editForm,children:[b("div",{style:y.editTarget,children:et}),b("label",{style:y.editLabel,children:"Content"}),b("input",{style:y.editInput,value:F.content||"",onChange:K=>I(m,R,V=>({...V,content:K.target.value}))})]});case"pulses":return T("div",{style:y.editForm,children:[b("div",{style:y.editTarget,children:et}),b("label",{style:y.editLabel,children:"Duration (ms)"}),b("input",{style:y.editInput,type:"number",value:F.duration||"",onChange:K=>I(m,R,V=>({...V,duration:Number(K.target.value)||void 0}))})]});case"modals":{let K=F.content||{};return T("div",{style:y.editForm,children:[b("label",{style:y.editLabel,children:"Title"}),b("input",{style:y.editInput,value:K.title||"",onChange:V=>I(m,R,U=>({...U,content:{...U.content,title:V.target.value}}))}),b("label",{style:y.editLabel,children:"Body"}),b("textarea",{style:y.editTextarea,value:K.body||"",onChange:V=>I(m,R,U=>({...U,content:{...U.content,body:V.target.value}}))})]})}default:return null}},Q=m=>{let P=(o.tours||[])[m];return P?T("div",{style:y.tourDrillIn,children:[T("div",{style:y.tourDrillInHeader,children:["\u{1F3AF}"," Tour: ",P.tourId]}),T("label",{style:y.checkbox,children:[b("input",{type:"checkbox",checked:P.autoStart||!1,readOnly:!0}),"Auto-start tour"]}),P.steps.map((F,et)=>T("div",{style:y.stepRow,children:[T("span",{style:y.stepNumber,children:[et+1,"."]}),b("span",{children:We(F)}),T("div",{style:y.stepInfo,children:[b("div",{children:_e(F)}),F.route&&b("div",{style:y.stepRoute,children:F.route})]})]},F.id||et)),P.steps.length===0&&b("div",{style:{fontSize:"12px",color:"#64748b",padding:"8px 0"},children:"No steps in this tour."}),b("button",{style:y.backToListButton,onClick:()=>c(null),children:"\u2190 Back to list"})]}):null},St=m=>{let R=M.get(m.key);return T("div",{"data-item-key":m.key,children:[T("div",{style:y.card,onMouseEnter:()=>A(m),onMouseLeave:D,children:[b(je,{found:R?.found??!1}),b("span",{style:y.cardIcon,onClick:P=>{P.stopPropagation(),$(m)},children:m.icon}),b("span",{style:y.cardText,onClick:()=>$(m),children:m.summary}),b("button",{style:y.dismissButton,onClick:P=>{P.stopPropagation(),L(m.key)},title:"Dismiss",children:"\xD7"})]}),m.isTour&&l===m.key&&Q(m.index)]},m.key)};return T("div",{style:y.container,children:[T("div",{style:y.header,children:[b("button",{onClick:()=>n.navigateHome(),style:y.backButton,children:"\u2190 Back"}),T("div",{children:[b("h2",{style:y.title,children:"Review Changes"}),T("p",{style:y.subtitle,children:[S," item",S!==1?"s":"",S>0&&` (${W} found on this page)`]})]})]}),b("div",{style:y.body,children:p!==null?(()=>{let m=Ke(p),R=v.find(P=>P.key===p);return T(yt,{children:[T("div",{style:y.editHeader,children:[b("span",{children:R?.icon}),b("span",{children:R?.summary})]}),T("div",{style:{display:"flex",gap:"0",marginBottom:"12px",borderRadius:"6px",overflow:"hidden",border:"1px solid rgba(255,255,255,0.1)"},children:[b("button",{onClick:()=>z("before"),style:{flex:1,padding:"6px 12px",border:"none",fontSize:"12px",fontWeight:600,cursor:"pointer",background:g==="before"?"rgba(59,130,246,0.2)":"transparent",color:g==="before"?"#3b82f6":"#64748b"},children:"Before"}),b("button",{onClick:()=>z("after"),style:{flex:1,padding:"6px 12px",border:"none",borderLeft:"1px solid rgba(255,255,255,0.1)",fontSize:"12px",fontWeight:600,cursor:"pointer",background:g==="after"?"rgba(59,130,246,0.2)":"transparent",color:g==="after"?"#3b82f6":"#64748b"},children:"After"})]}),N(m.section,m.index),b("button",{style:y.editBackButton,onClick:B,children:"\u2190 List"})]})})():T(yt,{children:[v.length===0&&b("div",{style:y.emptyState,children:"No overlays configured."}),h.length>0&&T(yt,{children:[T("div",{style:y.groupHeader,children:[b("span",{children:"OVERLAYS"}),b("span",{style:y.groupCount,children:h.length})]}),h.map(St)]}),k.length>0&&T(yt,{children:[T("div",{style:{...y.groupHeader,marginTop:h.length>0?"16px":"0"},children:[b("span",{children:"TOURS"}),b("span",{style:y.groupCount,children:k.length})]}),k.map(St)]}),u.length>0&&T("div",{style:y.dismissedSection,children:[T("div",{style:{...y.dismissedHeader,cursor:"pointer"},onClick:()=>a(!s),children:[b("span",{children:s?"\u25BE":"\u25B8"}),T("span",{children:["Dismissed (",u.length,")"]})]}),s&&b("div",{style:{marginTop:"6px"},children:u.map(m=>T("div",{style:y.dismissedCard,children:[b("span",{style:y.cardIcon,children:m.icon}),b("span",{style:{...y.cardText,textDecoration:"line-through"},children:m.summary}),b("button",{style:{...y.dismissButton,color:"#3b82f6",fontSize:"11px"},onClick:R=>{R.stopPropagation(),C(m.key)},children:"Restore"})]},m.key))})]})]})}),T("div",{style:y.footer,children:[b("button",{onClick:()=>n.save(),style:y.saveButton,children:"Save Draft"}),b("button",{onClick:_,style:y.publishButton,children:"Publish"})]})]})}var Ft={panel:{title:"Overlays",icon:"\u{1F4AC}",description:"Tooltips, highlights, and visual overlays"},component:qe},eo=Ft.panel;var Qt=typeof CSS<"u"&&CSS.supports?.("clip-path","path('M0 0 H1 V1 Z')");function te(t,e,n){let o=n?.paddingPx??12,i=n?.radiusPx??12,r=Math.min(Math.max(n?.scrimOpacity??.55,0),1),s=n?.ringColor??"var(--syntro-ring, #5b8cff)",a=n?.blocking??!1,l=n?.onClickOutside??!0,c=n?.onEsc??!0,p=getComputedStyle(document.documentElement),f=p.getPropertyValue("--syntro-spotlight-backdrop").trim(),g=p.getPropertyValue("--syntro-ring").trim(),d=document.createElement("div");d.className="syntro-spotlight-scrim";let x=a||l;Object.assign(d.style,{position:"fixed",inset:"0",zIndex:"2147483646",pointerEvents:x?"auto":"none",background:f||`rgba(2, 6, 23, ${r})`,transition:"opacity 220ms ease",opacity:"0"}),e.appendChild(d),requestAnimationFrame(()=>d.style.opacity="1");let v=document.createElement("div");v.className="syntro-spotlight-ring",Object.assign(v.style,{position:"fixed",pointerEvents:"none",borderRadius:`${i}px`,border:`2px solid ${s||g||"#5b8cff"}`,boxShadow:"0 0 0 4px rgba(255,255,255,0.35)",zIndex:"2147483647",transition:"all 220ms cubic-bezier(0.16,1,0.3,1)"}),e.appendChild(v);let w=[];if(!Qt)for(let L=0;L<4;L++){let C=document.createElement("div");C.style.position="fixed",C.style.background="inherit",w.push(C),d.appendChild(C)}let u=L=>{d.style.clipPath=L,d.style.webkitClipPath=L},h=()=>{let L=t.getBoundingClientRect(),C=Math.max(0,L.left-o),$=Math.max(0,L.top-o),B=Math.min(window.innerWidth,L.width+o*2),z=Math.min(window.innerHeight,L.height+o*2);if(Object.assign(v.style,{left:`${C}px`,top:`${$}px`,width:`${B}px`,height:`${z}px`}),Qt){let I=window.innerWidth,_=window.innerHeight,A=Math.min(i,B/2,z/2),D=`M 0 0 L ${I} 0 L ${I} ${_} L 0 ${_} Z`,N=`M ${C+A} ${$} A ${A} ${A} 0 0 0 ${C} ${$+A} L ${C} ${$+z-A} A ${A} ${A} 0 0 0 ${C+A} ${$+z} L ${C+B-A} ${$+z} A ${A} ${A} 0 0 0 ${C+B} ${$+z-A} L ${C+B} ${$+A} A ${A} ${A} 0 0 0 ${C+B-A} ${$} L ${C+A} ${$} Z`;u(`path('${D} ${N}')`)}else{let[I,_,A,D]=w;Object.assign(I.style,{left:"0px",top:"0px",width:"100vw",height:`${$}px`}),Object.assign(A.style,{left:"0px",top:`${$+z}px`,width:"100vw",height:`${Math.max(0,window.innerHeight-($+z))}px`}),Object.assign(D.style,{left:"0px",top:`${$}px`,width:`${C}px`,height:`${z}px`}),Object.assign(_.style,{left:`${C+B}px`,top:`${$}px`,width:`${Math.max(0,window.innerWidth-(C+B))}px`,height:`${z}px`})}},k=new ResizeObserver(()=>requestAnimationFrame(h));k.observe(t);let S=()=>requestAnimationFrame(h),E=()=>requestAnimationFrame(h);window.addEventListener("scroll",S,!0),window.addEventListener("resize",E);let O=L=>{L.key==="Escape"&&c&&W.destroy()};c&&window.addEventListener("keydown",O);let M=L=>{a?(L.preventDefault(),L.stopPropagation()):l&&W.destroy()};d.addEventListener("click",M);let W={destroy(){k.disconnect(),window.removeEventListener("scroll",S,!0),window.removeEventListener("resize",E),c&&window.removeEventListener("keydown",O),d.removeEventListener("click",M),d.style.opacity="0",setTimeout(()=>{d.remove(),v.remove()},220)}};return h(),W}var Xe=new Set(["b","strong","i","em","u","span","div","p","br","ul","ol","li","code","pre","small","sup","sub","a","button"]);function q(t){if(typeof window.Sanitizer=="function")try{let a=new window.Sanitizer({}).sanitizeToFragment(t),l=document.createElement("div");return l.append(a),l.innerHTML}catch{}let n=document.createElement("template");n.innerHTML=t;let o=n.content,i=document.createTreeWalker(o,NodeFilter.SHOW_ELEMENT,null),r=[];for(;i.nextNode();){let s=i.currentNode,a=s.tagName.toLowerCase();if(!Xe.has(a)){r.push(s);continue}for(let l of Array.from(s.attributes)){let c=l.name.toLowerCase(),p=l.value.trim().toLowerCase(),f=c.startsWith("on"),g=(c==="href"||c==="src")&&p.startsWith("javascript:");(f||g)&&s.removeAttribute(l.name)}}for(let s of r){for(;s.firstChild;)s.parentNode?.insertBefore(s.firstChild,s);s.remove()}return n.innerHTML}var ee=async(t,e)=>{let{content:n,size:o="md",blocking:i=!1,scrim:r,dismiss:s,ctaButtons:a}=t,l=document.createElement("div");l.className="syntro-modal-scrim",l.style.cssText=`
2
+ position: fixed;
3
+ inset: 0;
4
+ background: rgba(0, 0, 0, ${r?.opacity??.6});
5
+ z-index: 2147483645;
6
+ opacity: 0;
7
+ transition: opacity 200ms ease-out;
8
+ `,e.overlayRoot.appendChild(l);let c=document.createElement("div");c.className=`syntro-modal syntro-modal-${o}`,c.setAttribute("role","dialog"),c.setAttribute("aria-modal","true");let p={sm:"360px",md:"480px",lg:"640px"};c.style.cssText=`
9
+ position: fixed;
10
+ top: 50%;
11
+ left: 50%;
12
+ transform: translate(-50%, -50%) scale(0.95);
13
+ max-width: ${p[o]};
14
+ width: 90%;
15
+ background: white;
16
+ border-radius: 12px;
17
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
18
+ z-index: 2147483646;
19
+ opacity: 0;
20
+ transition: opacity 200ms ease-out, transform 200ms ease-out;
21
+ padding: 24px;
22
+ `;let f="";if(n.title&&(f+=`<h2 class="syntro-modal-title" style="margin: 0 0 12px 0; font-size: 18px; font-weight: 600; color: #111827;">${q(n.title)}</h2>`),f+=`<div class="syntro-modal-body" style="color: #4b5563; line-height: 1.5;">${q(n.body)}</div>`,s?.closeButton!==!1&&(f+=`
23
+ <button class="syntro-modal-close" data-syntro-action="dismiss" style="
24
+ position: absolute;
25
+ top: 16px;
26
+ right: 16px;
27
+ background: none;
28
+ border: none;
29
+ cursor: pointer;
30
+ padding: 4px;
31
+ color: #6b7280;
32
+ " aria-label="Close">
33
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor">
34
+ <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"/>
35
+ </svg>
36
+ </button>
37
+ `),a&&a.length>0){f+='<div class="syntro-modal-actions" style="display: flex; gap: 12px; margin-top: 24px; justify-content: flex-end;">';for(let E of a){let O=E.primary??!1;f+=`
38
+ <button
39
+ class="syntro-modal-btn ${O?"syntro-modal-btn-primary":""}"
40
+ data-syntro-action="${q(E.actionId)}"
41
+ style="
42
+ padding: 10px 20px;
43
+ border-radius: 8px;
44
+ font-size: 14px;
45
+ font-weight: 500;
46
+ cursor: pointer;
47
+ transition: background 150ms ease;
48
+ ${O?"background: #4f46e5; color: white; border: none;":"background: white; color: #374151; border: 1px solid #d1d5db;"}
49
+ "
50
+ >
51
+ ${q(E.label)}
52
+ </button>
53
+ `}f+="</div>"}c.innerHTML=f,e.overlayRoot.appendChild(c);let g=null,d=c.querySelectorAll("[data-syntro-action]"),x=E=>{let M=E.currentTarget.getAttribute("data-syntro-action");M&&(g=M,e.publishEvent("action.modal_cta_clicked",{actionId:M}),M==="dismiss"&&S.destroy())};d.forEach(E=>E.addEventListener("click",x));let v=E=>{E.key==="Escape"&&s?.onEsc!==!1&&S.destroy()};window.addEventListener("keydown",v);let w=()=>{i||S.destroy()};l.addEventListener("click",w);let u=[];i&&Array.from(document.body.children).forEach(E=>{E!==e.overlayRoot&&E.getAttribute("inert")===null&&!E.querySelector("[data-syntro-editor-panel]")&&!E.hasAttribute("data-syntro-editor-panel")&&(E.setAttribute("inert",""),u.push(E))});let h;s?.timeoutMs&&(h=setTimeout(()=>{S.destroy()},s.timeoutMs));let k=c.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');k.length>0&&requestAnimationFrame(()=>k[0].focus()),requestAnimationFrame(()=>{l.style.opacity="1",c.style.opacity="1",c.style.transform="translate(-50%, -50%) scale(1)"}),e.publishEvent("action.applied",{id:e.generateId(),kind:"overlays:modal",size:o,blocking:i});let S={destroy(){h&&clearTimeout(h),window.removeEventListener("keydown",v),l.removeEventListener("click",w),d.forEach(E=>E.removeEventListener("click",x)),u.forEach(E=>E.removeAttribute("inert")),c.style.opacity="0",c.style.transform="translate(-50%, -50%) scale(0.95)",l.style.opacity="0",setTimeout(()=>{c.remove(),l.remove()},200),e.publishEvent("action.modal_dismissed",{actionClicked:g})}};return{cleanup:()=>{S.destroy()}}};var ie=["top","right","bottom","left"];var st=Math.min,nt=Math.max,bt=Math.round,vt=Math.floor,Z=t=>({x:t,y:t}),Ye={left:"right",right:"left",bottom:"top",top:"bottom"},Ue={start:"end",end:"start"};function Tt(t,e,n){return nt(t,st(e,n))}function lt(t,e){return typeof t=="function"?t(e):t}function at(t){return t.split("-")[0]}function pt(t){return t.split("-")[1]}function Nt(t){return t==="x"?"y":"x"}function Ot(t){return t==="y"?"height":"width"}var Ze=new Set(["top","bottom"]);function ot(t){return Ze.has(at(t))?"y":"x"}function Lt(t){return Nt(ot(t))}function re(t,e,n){n===void 0&&(n=!1);let o=pt(t),i=Lt(t),r=Ot(i),s=i==="x"?o===(n?"end":"start")?"right":"left":o==="start"?"bottom":"top";return e.reference[r]>e.floating[r]&&(s=xt(s)),[s,xt(s)]}function se(t){let e=xt(t);return[Rt(t),e,Rt(e)]}function Rt(t){return t.replace(/start|end/g,e=>Ue[e])}var ne=["left","right"],oe=["right","left"],Ge=["top","bottom"],Je=["bottom","top"];function Qe(t,e,n){switch(t){case"top":case"bottom":return n?e?oe:ne:e?ne:oe;case"left":case"right":return e?Ge:Je;default:return[]}}function ae(t,e,n,o){let i=pt(t),r=Qe(at(t),n==="start",o);return i&&(r=r.map(s=>s+"-"+i),e&&(r=r.concat(r.map(Rt)))),r}function xt(t){return t.replace(/left|right|bottom|top/g,e=>Ye[e])}function tn(t){return{top:0,right:0,bottom:0,left:0,...t}}function Wt(t){return typeof t!="number"?tn(t):{top:t,right:t,bottom:t,left:t}}function ct(t){let{x:e,y:n,width:o,height:i}=t;return{width:o,height:i,top:n,left:e,right:e+o,bottom:n+i,x:e,y:n}}function le(t,e,n){let{reference:o,floating:i}=t,r=ot(e),s=Lt(e),a=Ot(s),l=at(e),c=r==="y",p=o.x+o.width/2-i.width/2,f=o.y+o.height/2-i.height/2,g=o[a]/2-i[a]/2,d;switch(l){case"top":d={x:p,y:o.y-i.height};break;case"bottom":d={x:p,y:o.y+o.height};break;case"right":d={x:o.x+o.width,y:f};break;case"left":d={x:o.x-i.width,y:f};break;default:d={x:o.x,y:o.y}}switch(pt(e)){case"start":d[s]-=g*(n&&c?-1:1);break;case"end":d[s]+=g*(n&&c?-1:1);break}return d}async function ue(t,e){var n;e===void 0&&(e={});let{x:o,y:i,platform:r,rects:s,elements:a,strategy:l}=t,{boundary:c="clippingAncestors",rootBoundary:p="viewport",elementContext:f="floating",altBoundary:g=!1,padding:d=0}=lt(e,t),x=Wt(d),w=a[g?f==="floating"?"reference":"floating":f],u=ct(await r.getClippingRect({element:(n=await(r.isElement==null?void 0:r.isElement(w)))==null||n?w:w.contextElement||await(r.getDocumentElement==null?void 0:r.getDocumentElement(a.floating)),boundary:c,rootBoundary:p,strategy:l})),h=f==="floating"?{x:o,y:i,width:s.floating.width,height:s.floating.height}:s.reference,k=await(r.getOffsetParent==null?void 0:r.getOffsetParent(a.floating)),S=await(r.isElement==null?void 0:r.isElement(k))?await(r.getScale==null?void 0:r.getScale(k))||{x:1,y:1}:{x:1,y:1},E=ct(r.convertOffsetParentRelativeRectToViewportRelativeRect?await r.convertOffsetParentRelativeRectToViewportRelativeRect({elements:a,rect:h,offsetParent:k,strategy:l}):h);return{top:(u.top-E.top+x.top)/S.y,bottom:(E.bottom-u.bottom+x.bottom)/S.y,left:(u.left-E.left+x.left)/S.x,right:(E.right-u.right+x.right)/S.x}}var fe=async(t,e,n)=>{let{placement:o="bottom",strategy:i="absolute",middleware:r=[],platform:s}=n,a=r.filter(Boolean),l=await(s.isRTL==null?void 0:s.isRTL(e)),c=await s.getElementRects({reference:t,floating:e,strategy:i}),{x:p,y:f}=le(c,o,l),g=o,d={},x=0;for(let w=0;w<a.length;w++){var v;let{name:u,fn:h}=a[w],{x:k,y:S,data:E,reset:O}=await h({x:p,y:f,initialPlacement:o,placement:g,strategy:i,middlewareData:d,rects:c,platform:{...s,detectOverflow:(v=s.detectOverflow)!=null?v:ue},elements:{reference:t,floating:e}});p=k??p,f=S??f,d={...d,[u]:{...d[u],...E}},O&&x<=50&&(x++,typeof O=="object"&&(O.placement&&(g=O.placement),O.rects&&(c=O.rects===!0?await s.getElementRects({reference:t,floating:e,strategy:i}):O.rects),{x:p,y:f}=le(c,g,l)),w=-1)}return{x:p,y:f,placement:g,strategy:i,middlewareData:d}},pe=t=>({name:"arrow",options:t,async fn(e){let{x:n,y:o,placement:i,rects:r,platform:s,elements:a,middlewareData:l}=e,{element:c,padding:p=0}=lt(t,e)||{};if(c==null)return{};let f=Wt(p),g={x:n,y:o},d=Lt(i),x=Ot(d),v=await s.getDimensions(c),w=d==="y",u=w?"top":"left",h=w?"bottom":"right",k=w?"clientHeight":"clientWidth",S=r.reference[x]+r.reference[d]-g[d]-r.floating[x],E=g[d]-r.reference[d],O=await(s.getOffsetParent==null?void 0:s.getOffsetParent(c)),M=O?O[k]:0;(!M||!await(s.isElement==null?void 0:s.isElement(O)))&&(M=a.floating[k]||r.floating[x]);let W=S/2-E/2,L=M/2-v[x]/2-1,C=st(f[u],L),$=st(f[h],L),B=C,z=M-v[x]-$,I=M/2-v[x]/2+W,_=Tt(B,I,z),A=!l.arrow&&pt(i)!=null&&I!==_&&r.reference[x]/2-(I<B?C:$)-v[x]/2<0,D=A?I<B?I-B:I-z:0;return{[d]:g[d]+D,data:{[d]:_,centerOffset:I-_-D,...A&&{alignmentOffset:D}},reset:A}}});var me=function(t){return t===void 0&&(t={}),{name:"flip",options:t,async fn(e){var n,o;let{placement:i,middlewareData:r,rects:s,initialPlacement:a,platform:l,elements:c}=e,{mainAxis:p=!0,crossAxis:f=!0,fallbackPlacements:g,fallbackStrategy:d="bestFit",fallbackAxisSideDirection:x="none",flipAlignment:v=!0,...w}=lt(t,e);if((n=r.arrow)!=null&&n.alignmentOffset)return{};let u=at(i),h=ot(a),k=at(a)===a,S=await(l.isRTL==null?void 0:l.isRTL(c.floating)),E=g||(k||!v?[xt(a)]:se(a)),O=x!=="none";!g&&O&&E.push(...ae(a,v,x,S));let M=[a,...E],W=await l.detectOverflow(e,w),L=[],C=((o=r.flip)==null?void 0:o.overflows)||[];if(p&&L.push(W[u]),f){let I=re(i,s,S);L.push(W[I[0]],W[I[1]])}if(C=[...C,{placement:i,overflows:L}],!L.every(I=>I<=0)){var $,B;let I=((($=r.flip)==null?void 0:$.index)||0)+1,_=M[I];if(_&&(!(f==="alignment"?h!==ot(_):!1)||C.every(N=>ot(N.placement)===h?N.overflows[0]>0:!0)))return{data:{index:I,overflows:C},reset:{placement:_}};let A=(B=C.filter(D=>D.overflows[0]<=0).sort((D,N)=>D.overflows[1]-N.overflows[1])[0])==null?void 0:B.placement;if(!A)switch(d){case"bestFit":{var z;let D=(z=C.filter(N=>{if(O){let Q=ot(N.placement);return Q===h||Q==="y"}return!0}).map(N=>[N.placement,N.overflows.filter(Q=>Q>0).reduce((Q,St)=>Q+St,0)]).sort((N,Q)=>N[1]-Q[1])[0])==null?void 0:z[0];D&&(A=D);break}case"initialPlacement":A=a;break}if(i!==A)return{reset:{placement:A}}}return{}}}};function ce(t,e){return{top:t.top-e.height,right:t.right-e.width,bottom:t.bottom-e.height,left:t.left-e.width}}function de(t){return ie.some(e=>t[e]>=0)}var ge=function(t){return t===void 0&&(t={}),{name:"hide",options:t,async fn(e){let{rects:n,platform:o}=e,{strategy:i="referenceHidden",...r}=lt(t,e);switch(i){case"referenceHidden":{let s=await o.detectOverflow(e,{...r,elementContext:"reference"}),a=ce(s,n.reference);return{data:{referenceHiddenOffsets:a,referenceHidden:de(a)}}}case"escaped":{let s=await o.detectOverflow(e,{...r,altBoundary:!0}),a=ce(s,n.floating);return{data:{escapedOffsets:a,escaped:de(a)}}}default:return{}}}}};var en=new Set(["left","top"]);async function nn(t,e){let{placement:n,platform:o,elements:i}=t,r=await(o.isRTL==null?void 0:o.isRTL(i.floating)),s=at(n),a=pt(n),l=ot(n)==="y",c=en.has(s)?-1:1,p=r&&l?-1:1,f=lt(e,t),{mainAxis:g,crossAxis:d,alignmentAxis:x}=typeof f=="number"?{mainAxis:f,crossAxis:0,alignmentAxis:null}:{mainAxis:f.mainAxis||0,crossAxis:f.crossAxis||0,alignmentAxis:f.alignmentAxis};return a&&typeof x=="number"&&(d=a==="end"?x*-1:x),l?{x:d*p,y:g*c}:{x:g*c,y:d*p}}var he=function(t){return t===void 0&&(t=0),{name:"offset",options:t,async fn(e){var n,o;let{x:i,y:r,placement:s,middlewareData:a}=e,l=await nn(e,t);return s===((n=a.offset)==null?void 0:n.placement)&&(o=a.arrow)!=null&&o.alignmentOffset?{}:{x:i+l.x,y:r+l.y,data:{...l,placement:s}}}}},ye=function(t){return t===void 0&&(t={}),{name:"shift",options:t,async fn(e){let{x:n,y:o,placement:i,platform:r}=e,{mainAxis:s=!0,crossAxis:a=!1,limiter:l={fn:u=>{let{x:h,y:k}=u;return{x:h,y:k}}},...c}=lt(t,e),p={x:n,y:o},f=await r.detectOverflow(e,c),g=ot(at(i)),d=Nt(g),x=p[d],v=p[g];if(s){let u=d==="y"?"top":"left",h=d==="y"?"bottom":"right",k=x+f[u],S=x-f[h];x=Tt(k,x,S)}if(a){let u=g==="y"?"top":"left",h=g==="y"?"bottom":"right",k=v+f[u],S=v-f[h];v=Tt(k,v,S)}let w=l.fn({...e,[d]:x,[g]:v});return{...w,data:{x:w.x-n,y:w.y-o,enabled:{[d]:s,[g]:a}}}}}};function It(){return typeof window<"u"}function dt(t){return be(t)?(t.nodeName||"").toLowerCase():"#document"}function j(t){var e;return(t==null||(e=t.ownerDocument)==null?void 0:e.defaultView)||window}function G(t){var e;return(e=(be(t)?t.ownerDocument:t.document)||window.document)==null?void 0:e.documentElement}function be(t){return It()?t instanceof Node||t instanceof j(t).Node:!1}function X(t){return It()?t instanceof Element||t instanceof j(t).Element:!1}function J(t){return It()?t instanceof HTMLElement||t instanceof j(t).HTMLElement:!1}function xe(t){return!It()||typeof ShadowRoot>"u"?!1:t instanceof ShadowRoot||t instanceof j(t).ShadowRoot}var on=new Set(["inline","contents"]);function gt(t){let{overflow:e,overflowX:n,overflowY:o,display:i}=Y(t);return/auto|scroll|overlay|hidden|clip/.test(e+o+n)&&!on.has(i)}var rn=new Set(["table","td","th"]);function ve(t){return rn.has(dt(t))}var sn=[":popover-open",":modal"];function wt(t){return sn.some(e=>{try{return t.matches(e)}catch{return!1}})}var an=["transform","translate","scale","rotate","perspective"],ln=["transform","translate","scale","rotate","perspective","filter"],cn=["paint","layout","strict","content"];function $t(t){let e=Pt(),n=X(t)?Y(t):t;return an.some(o=>n[o]?n[o]!=="none":!1)||(n.containerType?n.containerType!=="normal":!1)||!e&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!e&&(n.filter?n.filter!=="none":!1)||ln.some(o=>(n.willChange||"").includes(o))||cn.some(o=>(n.contain||"").includes(o))}function we(t){let e=it(t);for(;J(e)&&!ut(e);){if($t(e))return e;if(wt(e))return null;e=it(e)}return null}function Pt(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}var dn=new Set(["html","body","#document"]);function ut(t){return dn.has(dt(t))}function Y(t){return j(t).getComputedStyle(t)}function Et(t){return X(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function it(t){if(dt(t)==="html")return t;let e=t.assignedSlot||t.parentNode||xe(t)&&t.host||G(t);return xe(e)?e.host:e}function Ee(t){let e=it(t);return ut(e)?t.ownerDocument?t.ownerDocument.body:t.body:J(e)&&gt(e)?e:Ee(e)}function mt(t,e,n){var o;e===void 0&&(e=[]),n===void 0&&(n=!0);let i=Ee(t),r=i===((o=t.ownerDocument)==null?void 0:o.body),s=j(i);if(r){let a=Mt(s);return e.concat(s,s.visualViewport||[],gt(i)?i:[],a&&n?mt(a):[])}return e.concat(i,mt(i,[],n))}function Mt(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function Ae(t){let e=Y(t),n=parseFloat(e.width)||0,o=parseFloat(e.height)||0,i=J(t),r=i?t.offsetWidth:n,s=i?t.offsetHeight:o,a=bt(n)!==r||bt(o)!==s;return a&&(n=r,o=s),{width:n,height:o,$:a}}function Vt(t){return X(t)?t:t.contextElement}function ht(t){let e=Vt(t);if(!J(e))return Z(1);let n=e.getBoundingClientRect(),{width:o,height:i,$:r}=Ae(e),s=(r?bt(n.width):n.width)/o,a=(r?bt(n.height):n.height)/i;return(!s||!Number.isFinite(s))&&(s=1),(!a||!Number.isFinite(a))&&(a=1),{x:s,y:a}}var un=Z(0);function Re(t){let e=j(t);return!Pt()||!e.visualViewport?un:{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}}function fn(t,e,n){return e===void 0&&(e=!1),!n||e&&n!==j(t)?!1:e}function ft(t,e,n,o){e===void 0&&(e=!1),n===void 0&&(n=!1);let i=t.getBoundingClientRect(),r=Vt(t),s=Z(1);e&&(o?X(o)&&(s=ht(o)):s=ht(t));let a=fn(r,n,o)?Re(r):Z(0),l=(i.left+a.x)/s.x,c=(i.top+a.y)/s.y,p=i.width/s.x,f=i.height/s.y;if(r){let g=j(r),d=o&&X(o)?j(o):o,x=g,v=Mt(x);for(;v&&o&&d!==x;){let w=ht(v),u=v.getBoundingClientRect(),h=Y(v),k=u.left+(v.clientLeft+parseFloat(h.paddingLeft))*w.x,S=u.top+(v.clientTop+parseFloat(h.paddingTop))*w.y;l*=w.x,c*=w.y,p*=w.x,f*=w.y,l+=k,c+=S,x=j(v),v=Mt(x)}}return ct({width:p,height:f,x:l,y:c})}function Ht(t,e){let n=Et(t).scrollLeft;return e?e.left+n:ft(G(t)).left+n}function Te(t,e){let n=t.getBoundingClientRect(),o=n.left+e.scrollLeft-Ht(t,n),i=n.top+e.scrollTop;return{x:o,y:i}}function pn(t){let{elements:e,rect:n,offsetParent:o,strategy:i}=t,r=i==="fixed",s=G(o),a=e?wt(e.floating):!1;if(o===s||a&&r)return n;let l={scrollLeft:0,scrollTop:0},c=Z(1),p=Z(0),f=J(o);if((f||!f&&!r)&&((dt(o)!=="body"||gt(s))&&(l=Et(o)),J(o))){let d=ft(o);c=ht(o),p.x=d.x+o.clientLeft,p.y=d.y+o.clientTop}let g=s&&!f&&!r?Te(s,l):Z(0);return{width:n.width*c.x,height:n.height*c.y,x:n.x*c.x-l.scrollLeft*c.x+p.x+g.x,y:n.y*c.y-l.scrollTop*c.y+p.y+g.y}}function mn(t){return Array.from(t.getClientRects())}function gn(t){let e=G(t),n=Et(t),o=t.ownerDocument.body,i=nt(e.scrollWidth,e.clientWidth,o.scrollWidth,o.clientWidth),r=nt(e.scrollHeight,e.clientHeight,o.scrollHeight,o.clientHeight),s=-n.scrollLeft+Ht(t),a=-n.scrollTop;return Y(o).direction==="rtl"&&(s+=nt(e.clientWidth,o.clientWidth)-i),{width:i,height:r,x:s,y:a}}var ke=25;function hn(t,e){let n=j(t),o=G(t),i=n.visualViewport,r=o.clientWidth,s=o.clientHeight,a=0,l=0;if(i){r=i.width,s=i.height;let p=Pt();(!p||p&&e==="fixed")&&(a=i.offsetLeft,l=i.offsetTop)}let c=Ht(o);if(c<=0){let p=o.ownerDocument,f=p.body,g=getComputedStyle(f),d=p.compatMode==="CSS1Compat"&&parseFloat(g.marginLeft)+parseFloat(g.marginRight)||0,x=Math.abs(o.clientWidth-f.clientWidth-d);x<=ke&&(r-=x)}else c<=ke&&(r+=c);return{width:r,height:s,x:a,y:l}}var yn=new Set(["absolute","fixed"]);function xn(t,e){let n=ft(t,!0,e==="fixed"),o=n.top+t.clientTop,i=n.left+t.clientLeft,r=J(t)?ht(t):Z(1),s=t.clientWidth*r.x,a=t.clientHeight*r.y,l=i*r.x,c=o*r.y;return{width:s,height:a,x:l,y:c}}function Se(t,e,n){let o;if(e==="viewport")o=hn(t,n);else if(e==="document")o=gn(G(t));else if(X(e))o=xn(e,n);else{let i=Re(t);o={x:e.x-i.x,y:e.y-i.y,width:e.width,height:e.height}}return ct(o)}function Oe(t,e){let n=it(t);return n===e||!X(n)||ut(n)?!1:Y(n).position==="fixed"||Oe(n,e)}function bn(t,e){let n=e.get(t);if(n)return n;let o=mt(t,[],!1).filter(a=>X(a)&&dt(a)!=="body"),i=null,r=Y(t).position==="fixed",s=r?it(t):t;for(;X(s)&&!ut(s);){let a=Y(s),l=$t(s);!l&&a.position==="fixed"&&(i=null),(r?!l&&!i:!l&&a.position==="static"&&!!i&&yn.has(i.position)||gt(s)&&!l&&Oe(t,s))?o=o.filter(p=>p!==s):i=a,s=it(s)}return e.set(t,o),o}function vn(t){let{element:e,boundary:n,rootBoundary:o,strategy:i}=t,s=[...n==="clippingAncestors"?wt(e)?[]:bn(e,this._c):[].concat(n),o],a=s[0],l=s.reduce((c,p)=>{let f=Se(e,p,i);return c.top=nt(f.top,c.top),c.right=st(f.right,c.right),c.bottom=st(f.bottom,c.bottom),c.left=nt(f.left,c.left),c},Se(e,a,i));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function wn(t){let{width:e,height:n}=Ae(t);return{width:e,height:n}}function En(t,e,n){let o=J(e),i=G(e),r=n==="fixed",s=ft(t,!0,r,e),a={scrollLeft:0,scrollTop:0},l=Z(0);function c(){l.x=Ht(i)}if(o||!o&&!r)if((dt(e)!=="body"||gt(i))&&(a=Et(e)),o){let d=ft(e,!0,r,e);l.x=d.x+e.clientLeft,l.y=d.y+e.clientTop}else i&&c();r&&!o&&i&&c();let p=i&&!o&&!r?Te(i,a):Z(0),f=s.left+a.scrollLeft-l.x-p.x,g=s.top+a.scrollTop-l.y-p.y;return{x:f,y:g,width:s.width,height:s.height}}function _t(t){return Y(t).position==="static"}function Ce(t,e){if(!J(t)||Y(t).position==="fixed")return null;if(e)return e(t);let n=t.offsetParent;return G(t)===n&&(n=n.ownerDocument.body),n}function Le(t,e){let n=j(t);if(wt(t))return n;if(!J(t)){let i=it(t);for(;i&&!ut(i);){if(X(i)&&!_t(i))return i;i=it(i)}return n}let o=Ce(t,e);for(;o&&ve(o)&&_t(o);)o=Ce(o,e);return o&&ut(o)&&_t(o)&&!$t(o)?n:o||we(t)||n}var kn=async function(t){let e=this.getOffsetParent||Le,n=this.getDimensions,o=await n(t.floating);return{reference:En(t.reference,await e(t.floating),t.strategy),floating:{x:0,y:0,width:o.width,height:o.height}}};function Sn(t){return Y(t).direction==="rtl"}var Cn={convertOffsetParentRelativeRectToViewportRelativeRect:pn,getDocumentElement:G,getClippingRect:vn,getOffsetParent:Le,getElementRects:kn,getClientRects:mn,getDimensions:wn,getScale:ht,isElement:X,isRTL:Sn};function Ie(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}function An(t,e){let n=null,o,i=G(t);function r(){var a;clearTimeout(o),(a=n)==null||a.disconnect(),n=null}function s(a,l){a===void 0&&(a=!1),l===void 0&&(l=1),r();let c=t.getBoundingClientRect(),{left:p,top:f,width:g,height:d}=c;if(a||e(),!g||!d)return;let x=vt(f),v=vt(i.clientWidth-(p+g)),w=vt(i.clientHeight-(f+d)),u=vt(p),k={rootMargin:-x+"px "+-v+"px "+-w+"px "+-u+"px",threshold:nt(0,st(1,l))||1},S=!0;function E(O){let M=O[0].intersectionRatio;if(M!==l){if(!S)return s();M?s(!1,M):o=setTimeout(()=>{s(!1,1e-7)},1e3)}M===1&&!Ie(c,t.getBoundingClientRect())&&s(),S=!1}try{n=new IntersectionObserver(E,{...k,root:i.ownerDocument})}catch{n=new IntersectionObserver(E,k)}n.observe(t)}return s(!0),r}function $e(t,e,n,o){o===void 0&&(o={});let{ancestorScroll:i=!0,ancestorResize:r=!0,elementResize:s=typeof ResizeObserver=="function",layoutShift:a=typeof IntersectionObserver=="function",animationFrame:l=!1}=o,c=Vt(t),p=i||r?[...c?mt(c):[],...mt(e)]:[];p.forEach(u=>{i&&u.addEventListener("scroll",n,{passive:!0}),r&&u.addEventListener("resize",n)});let f=c&&a?An(c,n):null,g=-1,d=null;s&&(d=new ResizeObserver(u=>{let[h]=u;h&&h.target===c&&d&&(d.unobserve(e),cancelAnimationFrame(g),g=requestAnimationFrame(()=>{var k;(k=d)==null||k.observe(e)})),n()}),c&&!l&&d.observe(c),d.observe(e));let x,v=l?ft(t):null;l&&w();function w(){let u=ft(t);v&&!Ie(v,u)&&n(),v=u,x=requestAnimationFrame(w)}return n(),()=>{var u;p.forEach(h=>{i&&h.removeEventListener("scroll",n),r&&h.removeEventListener("resize",n)}),f?.(),(u=d)==null||u.disconnect(),d=null,l&&cancelAnimationFrame(x)}}var Pe=he;var Me=ye,He=me;var Be=ge,ze=pe;var De=(t,e,n)=>{let o=new Map,i={platform:Cn,...n},r={...i.platform,_c:o};return fe(t,e,{...i,platform:r})};function Rn(t){let e=t.getBoundingClientRect(),n=window.innerWidth,o=window.innerHeight;if(!(e.width>n*.8||e.height>o*.8))return t;let r=Math.max(e.left,0),s=Math.max(e.top,0),a=Math.min(e.right,n),l=Math.min(e.bottom,o),c=(r+a)/2,p=(s+l)/2;return{getBoundingClientRect(){return{width:0,height:0,x:c,y:p,top:p,left:c,right:c,bottom:p}}}}function Fe(t,e,n){let o=t.getBoundingClientRect();o.width>window.innerWidth*.8||o.height>window.innerHeight*.8||t.scrollIntoView({behavior:"smooth",block:"center",inline:"center"});let r=document.createElement("div");if(r.className="syntro-tooltip",r.setAttribute("role","tooltip"),r.innerHTML=q(n.html),!n.trigger||n.trigger==="immediate"){let u=document.createElement("button");u.className="syntro-tooltip-close",u.setAttribute("aria-label","Close"),u.textContent="\xD7",Object.assign(u.style,{position:"absolute",top:"4px",right:"4px",background:"none",border:"none",color:"inherit",fontSize:"16px",lineHeight:"1",cursor:"pointer",opacity:"0.6",padding:"2px 4px"}),u.addEventListener("mouseenter",()=>{u.style.opacity="1"}),u.addEventListener("mouseleave",()=>{u.style.opacity="0.6"}),u.addEventListener("click",()=>w.destroy()),r.style.position="relative",r.appendChild(u)}let s=r.querySelectorAll("[data-syntro-action]"),a=u=>{let k=u.currentTarget.getAttribute("data-syntro-action");k&&n.onAction&&n.onAction(k)};s.forEach(u=>u.addEventListener("click",a));let l=document.createElement("div");l.className="syntro-tooltip-arrow",r.appendChild(l),e.appendChild(r);let c=[Pe(n.offsetPx??8),He(),Me({padding:8}),Be(),ze({element:l})],p=n.placement&&n.placement!=="auto"?n.placement:"top",f=$e(t,r,async()=>{let u=Rn(t),h=await De(u,r,{placement:p,middleware:c}),{x:k,y:S,strategy:E,middlewareData:O,placement:M}=h;if(Object.assign(r.style,{left:`${k}px`,top:`${S}px`,position:E}),O.arrow){let{x:W,y:L}=O.arrow,C=M.split("-")[0],$={top:"bottom",right:"left",bottom:"top",left:"right"};Object.assign(l.style,{left:W!=null?`${W}px`:"",top:L!=null?`${L}px`:"",right:"",bottom:"",[$[C]]:"-4px"});let B={top:"0deg",right:"90deg",bottom:"180deg",left:"270deg"};l.style.transform=`rotate(${B[C]||"0deg"})`}}),g=u=>{u.key==="Escape"&&w.destroy()};window.addEventListener("keydown",g);let d=[];if(n.blocking){Array.from(document.body.children).forEach(h=>{h!==e&&h.getAttribute("inert")===null&&(h.setAttribute("inert",""),d.push(h.id||h.tagName))});let u=Array.from(r.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(u.length>0){let h=u[0],k=u[u.length-1],S=E=>{E.key==="Tab"&&(E.shiftKey?document.activeElement===h&&(k.focus(),E.preventDefault()):document.activeElement===k&&(h.focus(),E.preventDefault()))};r.addEventListener("keydown",S),requestAnimationFrame(()=>h.focus())}}let v=(()=>{if(n.trigger==="hover"){let u=()=>{r.style.visibility="visible",r.style.opacity="1"},h=()=>{r.style.visibility="hidden",r.style.opacity="0"};return r.style.visibility="hidden",r.style.opacity="0",r.style.transition="opacity 200ms ease, visibility 200ms",t.addEventListener("mouseenter",u),t.addEventListener("mouseleave",h),t.addEventListener("focus",u),t.addEventListener("blur",h),()=>{t.removeEventListener("mouseenter",u),t.removeEventListener("mouseleave",h),t.removeEventListener("focus",u),t.removeEventListener("blur",h)}}if(n.trigger==="click"){let u=()=>{r.style.visibility==="visible"?w.destroy():(r.style.visibility="visible",r.style.opacity="1")};return r.style.visibility="hidden",r.style.opacity="0",r.style.transition="opacity 200ms ease, visibility 200ms",t.addEventListener("click",u),()=>t.removeEventListener("click",u)}return r.style.opacity="0",r.style.transition="opacity 200ms ease",requestAnimationFrame(()=>{r.style.opacity="1"}),()=>{}})(),w={el:r,destroy(){f(),v(),window.removeEventListener("keydown",g),s.forEach(u=>u.removeEventListener("click",a)),n.blocking&&Array.from(document.body.children).forEach(u=>{u!==e&&u.removeAttribute("inert")}),r.style.opacity="0",setTimeout(()=>r.remove(),200)}};return w}var Tn=async(t,e)=>{let n=e.resolveAnchor(t.anchorId);if(!n)throw new Error(`Anchor not found: ${t.anchorId}`);let o=te(n,e.overlayRoot,{paddingPx:t.style?.paddingPx??12,radiusPx:t.style?.radiusPx??12,scrimOpacity:t.style?.scrimOpacity??.55,ringColor:t.style?.color,blocking:t.blocking??!1,onClickOutside:t.onClickOutside??!0,onEsc:t.onEsc??!0});return e.publishEvent("action.applied",{id:e.generateId(),kind:"overlays:highlight",anchorId:t.anchorId}),{cleanup:()=>{o.destroy()}}},On=async(t,e)=>{let n=e.resolveAnchor(t.anchorId);if(!n)throw new Error(`Anchor not found: ${t.anchorId}`);let o=t.duration??2e3,i="syntro-pulse-effect";if(!document.querySelector("[data-syntro-pulse-styles]")){let s=document.createElement("style");s.setAttribute("data-syntro-pulse-styles",""),s.textContent=`
54
+ @keyframes syntro-pulse {
55
+ 0%, 100% {
56
+ box-shadow: 0 0 0 0 rgba(79, 70, 229, 0.4);
57
+ }
58
+ 50% {
59
+ box-shadow: 0 0 0 8px rgba(79, 70, 229, 0);
60
+ }
61
+ }
62
+ .${i} {
63
+ animation: syntro-pulse 1s cubic-bezier(0.4, 0, 0.6, 1) infinite;
64
+ }
65
+ `,document.head.appendChild(s)}n.classList.add(i);let r=setTimeout(()=>{n.classList.remove(i)},o);return e.publishEvent("action.applied",{id:e.generateId(),kind:"overlays:pulse",anchorId:t.anchorId,duration:o}),{cleanup:()=>{clearTimeout(r),n.classList.remove(i)}}},Ln=async(t,e)=>{let n=e.resolveAnchor(t.anchorId);if(!n)throw new Error(`Anchor not found: ${t.anchorId}`);let o=document.createElement("div");if(o.className="syntro-badge",o.textContent=t.content,o.setAttribute("data-syntro-badge",t.anchorId),!document.querySelector("[data-syntro-badge-styles]")){let s=document.createElement("style");s.setAttribute("data-syntro-badge-styles",""),s.textContent=`
66
+ .syntro-badge {
67
+ position: absolute;
68
+ padding: 2px 6px;
69
+ font-size: 12px;
70
+ font-weight: 600;
71
+ line-height: 1;
72
+ color: white;
73
+ background: var(--syntro-accent, #4f46e5);
74
+ border-radius: 9999px;
75
+ pointer-events: none;
76
+ z-index: 2147483646;
77
+ white-space: nowrap;
78
+ }
79
+ `,document.head.appendChild(s)}let i=t.position??"top-right",r=n.style.position;switch(getComputedStyle(n).position==="static"&&(n.style.position="relative"),n.appendChild(o),i){case"top-left":Object.assign(o.style,{top:"-8px",left:"-8px"});break;case"top-right":Object.assign(o.style,{top:"-8px",right:"-8px"});break;case"bottom-left":Object.assign(o.style,{bottom:"-8px",left:"-8px"});break;case"bottom-right":Object.assign(o.style,{bottom:"-8px",right:"-8px"});break}return e.publishEvent("action.applied",{id:e.generateId(),kind:"overlays:badge",anchorId:t.anchorId,content:t.content,position:i}),{cleanup:()=>{o.remove(),r!==void 0&&(n.style.position=r)},updateFn:s=>{"content"in s&&typeof s.content=="string"&&(o.textContent=s.content)}}},In=async(t,e)=>{let n=e.resolveAnchor(t.anchorId);if(!n)throw new Error(`Anchor not found: ${t.anchorId}`);let{content:o}=t,i="";if(o.title&&(i+=`<div class="syntro-tt-title">${q(o.title)}</div>`),i+=`<div class="syntro-tt-body">${q(o.body)}</div>`,o.ctaButtons&&o.ctaButtons.length>0){i+='<div class="syntro-tt-actions">';for(let s of o.ctaButtons){let a=s.primary??!1;i+=`
80
+ <button
81
+ class="syntro-tt-btn ${a?"syntro-tt-btn-primary":""}"
82
+ data-syntro-action="${q(s.actionId)}"
83
+ >
84
+ ${q(s.label)}
85
+ </button>
86
+ `}i+="</div>"}else o.cta&&(i+=`<div class="syntro-tt-actions">
87
+ <button class="syntro-tt-btn syntro-tt-btn-primary" data-syntro-action="cta">
88
+ ${q(o.cta.label)}
89
+ </button>
90
+ </div>`);let r=Fe(n,e.overlayRoot,{html:i,placement:t.placement??"top",trigger:t.trigger??"immediate",onAction:s=>{if(s==="cta"&&o.cta)e.publishEvent("action.cta_clicked",{anchorId:t.anchorId,ctaLabel:o.cta.label});else if(o.ctaButtons){let a=o.ctaButtons.find(l=>l.actionId===s);a&&e.publishEvent("action.tooltip_cta_clicked",{anchorId:t.anchorId,actionId:s,label:a.label})}}});return e.publishEvent("action.applied",{id:e.generateId(),kind:"overlays:tooltip",anchorId:t.anchorId,trigger:t.trigger??"immediate"}),{cleanup:()=>{r.destroy()}}},jt=[{kind:"overlays:highlight",executor:Tn},{kind:"overlays:pulse",executor:On},{kind:"overlays:badge",executor:Ln},{kind:"overlays:tooltip",executor:In},{kind:"overlays:modal",executor:ee}],kt={id:"adaptive-overlays",version:"1.0.0",name:"Overlays",description:"Tooltips, highlights, badges, modals, and visual overlays",executors:jt};var Ne={id:kt.id,version:kt.version,name:kt.name,description:kt.description,runtime:{actions:jt.map(({kind:t,executor:e})=>({kind:t,executor:e}))},editor:Ft,metadata:{isBuiltIn:!0}};if(typeof window<"u"){let t=window.SynOS?.appRegistry;t&&typeof t.register=="function"&&t.register(Ne)}var Po=Ne;export{Po as default,Ne as manifest};
91
+ //# sourceMappingURL=index.js.map