@syntrologie/runtime-sdk 2.1.0 → 2.2.0-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/CAPABILITIES.md +50 -43
  2. package/README.md +7 -7
  3. package/dist/RuntimeProvider.d.ts +1 -1
  4. package/dist/ShadowRootContext.d.ts +19 -0
  5. package/dist/SmartCanvasApp.d.ts +3 -3
  6. package/dist/SmartCanvasElement.d.ts +7 -2
  7. package/dist/SmartCanvasPortal.d.ts +1 -1
  8. package/dist/actions/executors/index.d.ts +3 -3
  9. package/dist/actions/executors/tour.d.ts +1 -1
  10. package/dist/actions/index.d.ts +4 -3
  11. package/dist/actions/schema.d.ts +1229 -0
  12. package/dist/actions/schema.js +67 -0
  13. package/dist/actions/schema.js.map +7 -0
  14. package/dist/adaptives/adaptive-chatbot/index.js +4 -4
  15. package/dist/adaptives/adaptive-chatbot/index.js.map +4 -4
  16. package/dist/adaptives/adaptive-content/index.js +2 -2
  17. package/dist/adaptives/adaptive-content/index.js.map +4 -4
  18. package/dist/adaptives/adaptive-faq/index.js +23 -6
  19. package/dist/adaptives/adaptive-faq/index.js.map +4 -4
  20. package/dist/adaptives/adaptive-gamification/index.js.map +1 -1
  21. package/dist/adaptives/adaptive-nav/index.js +22 -7
  22. package/dist/adaptives/adaptive-nav/index.js.map +4 -4
  23. package/dist/adaptives/adaptive-overlays/index.js +13 -13
  24. package/dist/adaptives/adaptive-overlays/index.js.map +4 -4
  25. package/dist/api.d.ts +2 -2
  26. package/dist/apps/examples/gamification-app.example.d.ts +4 -4
  27. package/dist/apps/index.d.ts +7 -7
  28. package/dist/blocks/data/index.d.ts +1 -1
  29. package/dist/blocks/index.d.ts +2 -2
  30. package/dist/blocks/interactive/index.d.ts +1 -1
  31. package/dist/blocks/notification/NotificationBlock.d.ts +1 -1
  32. package/dist/blocks/notification/index.d.ts +1 -1
  33. package/dist/bootstrap.d.ts +4 -4
  34. package/dist/chunk-AYTRRBR5.js +251 -0
  35. package/dist/chunk-AYTRRBR5.js.map +7 -0
  36. package/dist/chunk-HJKAXD5S.js +7921 -0
  37. package/dist/chunk-HJKAXD5S.js.map +7 -0
  38. package/dist/components/ShadowCanvasOverlay.d.ts +2 -2
  39. package/dist/components/TileCard.d.ts +1 -1
  40. package/dist/context/ContextManager.d.ts +1 -1
  41. package/dist/context/index.d.ts +3 -3
  42. package/dist/decisions/engine.d.ts +1 -1
  43. package/dist/decisions/index.d.ts +3 -3
  44. package/dist/decisions/schema.d.ts +24 -24
  45. package/dist/decisions/strategies/rules.d.ts +1 -1
  46. package/dist/decisions/strategies/score.d.ts +1 -1
  47. package/dist/editorLoader.d.ts +4 -4
  48. package/dist/events/EventAccumulator.d.ts +1 -1
  49. package/dist/events/EventBus.d.ts +1 -1
  50. package/dist/events/index.d.ts +7 -6
  51. package/dist/events/registerConfigPredicates.d.ts +19 -0
  52. package/dist/experiments/adapters/growthbook.d.ts +1 -1
  53. package/dist/experiments/index.d.ts +2 -2
  54. package/dist/experiments/registry.d.ts +1 -1
  55. package/dist/fetchers/index.d.ts +2 -2
  56. package/dist/hooks/useShadowCanvasConfig.d.ts +1 -1
  57. package/dist/hostPatcher/index.d.ts +2 -2
  58. package/dist/index.d.ts +24 -21
  59. package/dist/index.js +816 -75
  60. package/dist/index.js.map +7 -1
  61. package/dist/metrics/index.d.ts +1 -1
  62. package/dist/notifications/index.d.ts +6 -6
  63. package/dist/overlays/runtime/index.d.ts +3 -3
  64. package/dist/overlays/runtime/overlay/root.d.ts +17 -1
  65. package/dist/overlays/runtime/overlay/tooltip.d.ts +1 -1
  66. package/dist/react.js +90 -134
  67. package/dist/react.js.map +7 -1
  68. package/dist/render/RenderContext.d.ts +2 -2
  69. package/dist/render/index.d.ts +2 -2
  70. package/dist/render/types.d.ts +2 -2
  71. package/dist/runtime.d.ts +8 -8
  72. package/dist/smart-canvas.esm.js +127 -124
  73. package/dist/smart-canvas.esm.js.map +4 -4
  74. package/dist/smart-canvas.js +17160 -16782
  75. package/dist/smart-canvas.js.map +4 -4
  76. package/dist/smart-canvas.min.js +127 -124
  77. package/dist/smart-canvas.min.js.map +4 -4
  78. package/dist/state/StateStore.d.ts +1 -1
  79. package/dist/state/helpers/cooldowns.d.ts +1 -1
  80. package/dist/state/helpers/dismissals.d.ts +1 -1
  81. package/dist/state/helpers/frequency.d.ts +1 -1
  82. package/dist/state/index.d.ts +3 -3
  83. package/dist/surfaces/index.d.ts +3 -3
  84. package/dist/surfaces/positioning.d.ts +1 -1
  85. package/dist/telemetry/adapters/posthog.d.ts +2 -2
  86. package/dist/telemetry/index.d.ts +3 -3
  87. package/dist/telemetry/registry.d.ts +1 -1
  88. package/dist/theme/ThemeProvider.d.ts +1 -1
  89. package/dist/theme/extractHostTheme.d.ts +1 -1
  90. package/dist/theme/index.d.ts +4 -4
  91. package/dist/types-only.d.ts +1 -1
  92. package/dist/types-only.js +1 -11
  93. package/dist/types-only.js.map +7 -1
  94. package/dist/types.d.ts +1 -1
  95. package/dist/version.d.ts +1 -1
  96. package/dist/widgets/index.d.ts +1 -1
  97. package/package.json +24 -17
  98. package/schema/canvas-config.base.schema.json +351 -0
  99. package/schema/canvas-config.schema.json +3202 -440
  100. package/scripts/validate-config.mjs +54 -58
  101. package/dist/RuntimeProvider.js +0 -113
  102. package/dist/RuntimeProvider.js.map +0 -1
  103. package/dist/SmartCanvasApp.js +0 -143
  104. package/dist/SmartCanvasApp.js.map +0 -1
  105. package/dist/SmartCanvasElement.js +0 -138
  106. package/dist/SmartCanvasElement.js.map +0 -1
  107. package/dist/SmartCanvasPortal.js +0 -17
  108. package/dist/SmartCanvasPortal.js.map +0 -1
  109. package/dist/actions/ActionEngine.js +0 -272
  110. package/dist/actions/ActionEngine.js.map +0 -1
  111. package/dist/actions/executors/index.js +0 -240
  112. package/dist/actions/executors/index.js.map +0 -1
  113. package/dist/actions/executors/tour.js +0 -332
  114. package/dist/actions/executors/tour.js.map +0 -1
  115. package/dist/actions/index.js +0 -12
  116. package/dist/actions/index.js.map +0 -1
  117. package/dist/actions/types.js +0 -8
  118. package/dist/actions/types.js.map +0 -1
  119. package/dist/actions/validation.js +0 -577
  120. package/dist/actions/validation.js.map +0 -1
  121. package/dist/antiFlicker.js +0 -39
  122. package/dist/antiFlicker.js.map +0 -1
  123. package/dist/api.js +0 -205
  124. package/dist/api.js.map +0 -1
  125. package/dist/apps/AppContext.js +0 -91
  126. package/dist/apps/AppContext.js.map +0 -1
  127. package/dist/apps/AppLoader.js +0 -293
  128. package/dist/apps/AppLoader.js.map +0 -1
  129. package/dist/apps/AppRegistry.js +0 -317
  130. package/dist/apps/AppRegistry.js.map +0 -1
  131. package/dist/apps/examples/gamification-app.example.js +0 -329
  132. package/dist/apps/examples/gamification-app.example.js.map +0 -1
  133. package/dist/apps/index.js +0 -16
  134. package/dist/apps/index.js.map +0 -1
  135. package/dist/apps/types.js +0 -8
  136. package/dist/apps/types.js.map +0 -1
  137. package/dist/blocks/data/ComparisonBlock.js +0 -95
  138. package/dist/blocks/data/ComparisonBlock.js.map +0 -1
  139. package/dist/blocks/data/StatsBlock.js +0 -102
  140. package/dist/blocks/data/StatsBlock.js.map +0 -1
  141. package/dist/blocks/data/index.js +0 -3
  142. package/dist/blocks/data/index.js.map +0 -1
  143. package/dist/blocks/index.js +0 -93
  144. package/dist/blocks/index.js.map +0 -1
  145. package/dist/blocks/interactive/ChecklistBlock.js +0 -111
  146. package/dist/blocks/interactive/ChecklistBlock.js.map +0 -1
  147. package/dist/blocks/interactive/RatingBlock.js +0 -147
  148. package/dist/blocks/interactive/RatingBlock.js.map +0 -1
  149. package/dist/blocks/interactive/index.js +0 -3
  150. package/dist/blocks/interactive/index.js.map +0 -1
  151. package/dist/blocks/notification/NotificationBlock.js +0 -171
  152. package/dist/blocks/notification/NotificationBlock.js.map +0 -1
  153. package/dist/blocks/notification/index.js +0 -2
  154. package/dist/blocks/notification/index.js.map +0 -1
  155. package/dist/blocks/theme-tokens.js +0 -25
  156. package/dist/blocks/theme-tokens.js.map +0 -1
  157. package/dist/bootstrap.js +0 -448
  158. package/dist/bootstrap.js.map +0 -1
  159. package/dist/bundle-entry.js +0 -9
  160. package/dist/bundle-entry.js.map +0 -1
  161. package/dist/components/ShadowCanvasOverlay.js +0 -327
  162. package/dist/components/ShadowCanvasOverlay.js.map +0 -1
  163. package/dist/components/TileCard.js +0 -103
  164. package/dist/components/TileCard.js.map +0 -1
  165. package/dist/components/TileWheel.js +0 -50
  166. package/dist/components/TileWheel.js.map +0 -1
  167. package/dist/config-validator.js +0 -173
  168. package/dist/config-validator.js.map +0 -1
  169. package/dist/configFetcher.js +0 -131
  170. package/dist/configFetcher.js.map +0 -1
  171. package/dist/context/ContextManager.js +0 -269
  172. package/dist/context/ContextManager.js.map +0 -1
  173. package/dist/context/index.js +0 -7
  174. package/dist/context/index.js.map +0 -1
  175. package/dist/context/schema.js +0 -50
  176. package/dist/context/schema.js.map +0 -1
  177. package/dist/context/types.js +0 -8
  178. package/dist/context/types.js.map +0 -1
  179. package/dist/controller.js +0 -34
  180. package/dist/controller.js.map +0 -1
  181. package/dist/decisions/engine.js +0 -117
  182. package/dist/decisions/engine.js.map +0 -1
  183. package/dist/decisions/index.js +0 -10
  184. package/dist/decisions/index.js.map +0 -1
  185. package/dist/decisions/schema.js +0 -151
  186. package/dist/decisions/schema.js.map +0 -1
  187. package/dist/decisions/strategies/rules.js +0 -166
  188. package/dist/decisions/strategies/rules.js.map +0 -1
  189. package/dist/decisions/strategies/score.js +0 -29
  190. package/dist/decisions/strategies/score.js.map +0 -1
  191. package/dist/decisions/types.js +0 -2
  192. package/dist/decisions/types.js.map +0 -1
  193. package/dist/earlyPatcher.js +0 -20
  194. package/dist/earlyPatcher.js.map +0 -1
  195. package/dist/editorLoader.js +0 -254
  196. package/dist/editorLoader.js.map +0 -1
  197. package/dist/events/EventAccumulator.js +0 -101
  198. package/dist/events/EventAccumulator.js.map +0 -1
  199. package/dist/events/EventBus.js +0 -152
  200. package/dist/events/EventBus.js.map +0 -1
  201. package/dist/events/index.js +0 -11
  202. package/dist/events/index.js.map +0 -1
  203. package/dist/events/normalizers/canvas.js +0 -116
  204. package/dist/events/normalizers/canvas.js.map +0 -1
  205. package/dist/events/normalizers/posthog.js +0 -171
  206. package/dist/events/normalizers/posthog.js.map +0 -1
  207. package/dist/events/schema.js +0 -30
  208. package/dist/events/schema.js.map +0 -1
  209. package/dist/events/types.js +0 -54
  210. package/dist/events/types.js.map +0 -1
  211. package/dist/experiments/adapters/growthbook.js +0 -81
  212. package/dist/experiments/adapters/growthbook.js.map +0 -1
  213. package/dist/experiments/index.js +0 -4
  214. package/dist/experiments/index.js.map +0 -1
  215. package/dist/experiments/registry.js +0 -30
  216. package/dist/experiments/registry.js.map +0 -1
  217. package/dist/experiments/types.js +0 -2
  218. package/dist/experiments/types.js.map +0 -1
  219. package/dist/fetchers/cdnFetcher.js +0 -96
  220. package/dist/fetchers/cdnFetcher.js.map +0 -1
  221. package/dist/fetchers/experimentsFetcher.js +0 -109
  222. package/dist/fetchers/experimentsFetcher.js.map +0 -1
  223. package/dist/fetchers/index.js +0 -5
  224. package/dist/fetchers/index.js.map +0 -1
  225. package/dist/fetchers/mergeConfigs.js +0 -38
  226. package/dist/fetchers/mergeConfigs.js.map +0 -1
  227. package/dist/fetchers/registry.js +0 -58
  228. package/dist/fetchers/registry.js.map +0 -1
  229. package/dist/fetchers/types.js +0 -2
  230. package/dist/fetchers/types.js.map +0 -1
  231. package/dist/hooks/useCanvasOverlays.js +0 -128
  232. package/dist/hooks/useCanvasOverlays.js.map +0 -1
  233. package/dist/hooks/useHostPatches.js +0 -40
  234. package/dist/hooks/useHostPatches.js.map +0 -1
  235. package/dist/hooks/useShadowCanvasConfig.js +0 -63
  236. package/dist/hooks/useShadowCanvasConfig.js.map +0 -1
  237. package/dist/hostPatcher/core/patcher.js +0 -181
  238. package/dist/hostPatcher/core/patcher.js.map +0 -1
  239. package/dist/hostPatcher/core/sanitizer.js +0 -66
  240. package/dist/hostPatcher/core/sanitizer.js.map +0 -1
  241. package/dist/hostPatcher/core/types.js +0 -2
  242. package/dist/hostPatcher/core/types.js.map +0 -1
  243. package/dist/hostPatcher/index.js +0 -7
  244. package/dist/hostPatcher/index.js.map +0 -1
  245. package/dist/hostPatcher/policy/defaultPolicy.js +0 -23
  246. package/dist/hostPatcher/policy/defaultPolicy.js.map +0 -1
  247. package/dist/hostPatcher/utils/anchors.js +0 -105
  248. package/dist/hostPatcher/utils/anchors.js.map +0 -1
  249. package/dist/hostPatcher/utils/observer.js +0 -11
  250. package/dist/hostPatcher/utils/observer.js.map +0 -1
  251. package/dist/logger.js +0 -81
  252. package/dist/logger.js.map +0 -1
  253. package/dist/metrics/index.js +0 -5
  254. package/dist/metrics/index.js.map +0 -1
  255. package/dist/metrics/sessionMetrics.js +0 -178
  256. package/dist/metrics/sessionMetrics.js.map +0 -1
  257. package/dist/notifications/NotificationToastStack.js +0 -118
  258. package/dist/notifications/NotificationToastStack.js.map +0 -1
  259. package/dist/notifications/index.js +0 -6
  260. package/dist/notifications/index.js.map +0 -1
  261. package/dist/notifications/matcher.js +0 -66
  262. package/dist/notifications/matcher.js.map +0 -1
  263. package/dist/notifications/types.js +0 -13
  264. package/dist/notifications/types.js.map +0 -1
  265. package/dist/notifications/useNotifications.js +0 -104
  266. package/dist/notifications/useNotifications.js.map +0 -1
  267. package/dist/notifications/useNotifyWatcher.js +0 -62
  268. package/dist/notifications/useNotifyWatcher.js.map +0 -1
  269. package/dist/overlays/fetcher.js +0 -15
  270. package/dist/overlays/fetcher.js.map +0 -1
  271. package/dist/overlays/recipeRegistry.js +0 -32
  272. package/dist/overlays/recipeRegistry.js.map +0 -1
  273. package/dist/overlays/runtime/anchor/resolve.js +0 -87
  274. package/dist/overlays/runtime/anchor/resolve.js.map +0 -1
  275. package/dist/overlays/runtime/index.js +0 -8
  276. package/dist/overlays/runtime/index.js.map +0 -1
  277. package/dist/overlays/runtime/overlay/highlight.js +0 -160
  278. package/dist/overlays/runtime/overlay/highlight.js.map +0 -1
  279. package/dist/overlays/runtime/overlay/modal.js +0 -78
  280. package/dist/overlays/runtime/overlay/modal.js.map +0 -1
  281. package/dist/overlays/runtime/overlay/root.js +0 -297
  282. package/dist/overlays/runtime/overlay/root.js.map +0 -1
  283. package/dist/overlays/runtime/overlay/runner.js +0 -602
  284. package/dist/overlays/runtime/overlay/runner.js.map +0 -1
  285. package/dist/overlays/runtime/overlay/tooltip.js +0 -232
  286. package/dist/overlays/runtime/overlay/tooltip.js.map +0 -1
  287. package/dist/overlays/runtime/utils/dom.js +0 -12
  288. package/dist/overlays/runtime/utils/dom.js.map +0 -1
  289. package/dist/overlays/schema.js +0 -52
  290. package/dist/overlays/schema.js.map +0 -1
  291. package/dist/overlays/types.js +0 -2
  292. package/dist/overlays/types.js.map +0 -1
  293. package/dist/render/RenderContext.js +0 -69
  294. package/dist/render/RenderContext.js.map +0 -1
  295. package/dist/render/index.js +0 -3
  296. package/dist/render/index.js.map +0 -1
  297. package/dist/render/types.js +0 -2
  298. package/dist/render/types.js.map +0 -1
  299. package/dist/runtime.js +0 -237
  300. package/dist/runtime.js.map +0 -1
  301. package/dist/state/StateStore.js +0 -176
  302. package/dist/state/StateStore.js.map +0 -1
  303. package/dist/state/helpers/cooldowns.js +0 -31
  304. package/dist/state/helpers/cooldowns.js.map +0 -1
  305. package/dist/state/helpers/dismissals.js +0 -34
  306. package/dist/state/helpers/dismissals.js.map +0 -1
  307. package/dist/state/helpers/frequency.js +0 -43
  308. package/dist/state/helpers/frequency.js.map +0 -1
  309. package/dist/state/index.js +0 -7
  310. package/dist/state/index.js.map +0 -1
  311. package/dist/state/schema.js +0 -25
  312. package/dist/state/schema.js.map +0 -1
  313. package/dist/state/types.js +0 -9
  314. package/dist/state/types.js.map +0 -1
  315. package/dist/store/example.js +0 -43
  316. package/dist/store/example.js.map +0 -1
  317. package/dist/store/mini-effector.js +0 -88
  318. package/dist/store/mini-effector.js.map +0 -1
  319. package/dist/surfaces/Surfaces.js +0 -361
  320. package/dist/surfaces/Surfaces.js.map +0 -1
  321. package/dist/surfaces/index.js +0 -12
  322. package/dist/surfaces/index.js.map +0 -1
  323. package/dist/surfaces/positioning.js +0 -228
  324. package/dist/surfaces/positioning.js.map +0 -1
  325. package/dist/surfaces/types.js +0 -23
  326. package/dist/surfaces/types.js.map +0 -1
  327. package/dist/telemetry/adapters/noop.js +0 -42
  328. package/dist/telemetry/adapters/noop.js.map +0 -1
  329. package/dist/telemetry/adapters/posthog.js +0 -180
  330. package/dist/telemetry/adapters/posthog.js.map +0 -1
  331. package/dist/telemetry/index.js +0 -4
  332. package/dist/telemetry/index.js.map +0 -1
  333. package/dist/telemetry/registry.js +0 -29
  334. package/dist/telemetry/registry.js.map +0 -1
  335. package/dist/telemetry/types.js +0 -2
  336. package/dist/telemetry/types.js.map +0 -1
  337. package/dist/theme/ThemeProvider.js +0 -109
  338. package/dist/theme/ThemeProvider.js.map +0 -1
  339. package/dist/theme/defaultTheme.js +0 -190
  340. package/dist/theme/defaultTheme.js.map +0 -1
  341. package/dist/theme/extractHostTheme.js +0 -259
  342. package/dist/theme/extractHostTheme.js.map +0 -1
  343. package/dist/theme/index.js +0 -7
  344. package/dist/theme/index.js.map +0 -1
  345. package/dist/theme/types.js +0 -6
  346. package/dist/theme/types.js.map +0 -1
  347. package/dist/token.js +0 -44
  348. package/dist/token.js.map +0 -1
  349. package/dist/types.js +0 -17
  350. package/dist/types.js.map +0 -1
  351. package/dist/version.js +0 -14
  352. package/dist/version.js.map +0 -1
  353. package/dist/widgets/WidgetRegistry.js +0 -190
  354. package/dist/widgets/WidgetRegistry.js.map +0 -1
  355. package/dist/widgets/index.js +0 -7
  356. package/dist/widgets/index.js.map +0 -1
@@ -1,232 +0,0 @@
1
- import { computePosition, autoUpdate, offset, flip, shift, hide, arrow as arrowMiddleware, } from '@floating-ui/dom';
2
- import { sanitizeWithFallback } from '../../../hostPatcher/core/sanitizer';
3
- /**
4
- * For large elements (larger than viewport), create a virtual anchor
5
- * at the center of the visible portion. This prevents tooltips from
6
- * appearing at the edge of massive elements.
7
- */
8
- function getAnchorReference(anchorEl) {
9
- const rect = anchorEl.getBoundingClientRect();
10
- const viewportWidth = window.innerWidth;
11
- const viewportHeight = window.innerHeight;
12
- // Check if element is larger than 80% of viewport in either dimension
13
- const isLargeElement = rect.width > viewportWidth * 0.8 || rect.height > viewportHeight * 0.8;
14
- if (!isLargeElement) {
15
- return anchorEl;
16
- }
17
- // For large elements, create a virtual anchor at center of visible portion
18
- const visibleLeft = Math.max(rect.left, 0);
19
- const visibleTop = Math.max(rect.top, 0);
20
- const visibleRight = Math.min(rect.right, viewportWidth);
21
- const visibleBottom = Math.min(rect.bottom, viewportHeight);
22
- const centerX = (visibleLeft + visibleRight) / 2;
23
- const centerY = (visibleTop + visibleBottom) / 2;
24
- console.log(`[SmartCanvas] Large element detected (${Math.round(rect.width)}x${Math.round(rect.height)}), using virtual anchor at center (${Math.round(centerX)}, ${Math.round(centerY)})`);
25
- // Return a virtual element that Floating UI can use
26
- return {
27
- getBoundingClientRect() {
28
- return {
29
- width: 0,
30
- height: 0,
31
- x: centerX,
32
- y: centerY,
33
- top: centerY,
34
- left: centerX,
35
- right: centerX,
36
- bottom: centerY,
37
- };
38
- },
39
- };
40
- }
41
- export function showTooltip(anchorEl, overlayRoot, opts) {
42
- var _a;
43
- // Scroll the anchor element into view (like driver.js does)
44
- // Only scroll if element is not already mostly visible
45
- const rect = anchorEl.getBoundingClientRect();
46
- const isLargeElement = rect.width > window.innerWidth * 0.8 || rect.height > window.innerHeight * 0.8;
47
- if (!isLargeElement) {
48
- anchorEl.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
49
- }
50
- const div = document.createElement('div');
51
- div.className = 'syntro-tooltip';
52
- div.setAttribute('role', 'tooltip');
53
- // Sanitize HTML to prevent XSS
54
- div.innerHTML = sanitizeWithFallback(opts.html);
55
- // Handle action button clicks
56
- const actionBtns = div.querySelectorAll('[data-syntro-action]');
57
- const actionHandler = (e) => {
58
- const btn = e.currentTarget;
59
- const actionId = btn.getAttribute('data-syntro-action');
60
- if (actionId && opts.onAction) {
61
- opts.onAction(actionId);
62
- }
63
- };
64
- actionBtns.forEach((btn) => btn.addEventListener('click', actionHandler));
65
- // Create arrow element
66
- const arrowEl = document.createElement('div');
67
- arrowEl.className = 'syntro-tooltip-arrow';
68
- div.appendChild(arrowEl);
69
- overlayRoot.appendChild(div);
70
- const middleware = [
71
- offset((_a = opts.offsetPx) !== null && _a !== void 0 ? _a : 8),
72
- flip(),
73
- shift({ padding: 8 }),
74
- hide(),
75
- arrowMiddleware({ element: arrowEl }),
76
- ];
77
- const placement = opts.placement && opts.placement !== 'auto' ? opts.placement : 'top';
78
- // Get anchor reference (may be virtual for large elements)
79
- const _anchorRef = getAnchorReference(anchorEl);
80
- const cleanup = autoUpdate(anchorEl, div, async () => {
81
- // Re-compute anchor reference on each update (element size may change)
82
- const currentAnchorRef = getAnchorReference(anchorEl);
83
- const result = await computePosition(currentAnchorRef, div, {
84
- placement,
85
- middleware,
86
- });
87
- const { x, y, strategy, middlewareData, placement: finalPlacement } = result;
88
- Object.assign(div.style, {
89
- left: `${x}px`,
90
- top: `${y}px`,
91
- position: strategy,
92
- });
93
- // Position arrow
94
- if (middlewareData.arrow) {
95
- const { x: arrowX, y: arrowY } = middlewareData.arrow;
96
- const side = finalPlacement.split('-')[0];
97
- const staticSide = {
98
- top: 'bottom',
99
- right: 'left',
100
- bottom: 'top',
101
- left: 'right',
102
- }[side];
103
- Object.assign(arrowEl.style, {
104
- left: arrowX != null ? `${arrowX}px` : '',
105
- top: arrowY != null ? `${arrowY}px` : '',
106
- right: '',
107
- bottom: '',
108
- [staticSide]: '-4px',
109
- });
110
- // Set arrow rotation based on placement
111
- const rotation = {
112
- top: '0deg',
113
- right: '90deg',
114
- bottom: '180deg',
115
- left: '270deg',
116
- }[side] || '0deg';
117
- arrowEl.style.transform = `rotate(${rotation})`;
118
- }
119
- });
120
- const onKey = (e) => {
121
- if (e.key === 'Escape')
122
- handle.destroy();
123
- };
124
- window.addEventListener('keydown', onKey);
125
- // Handle blocking mode (focus trap + inert)
126
- const originalInert = [];
127
- let focusableEls = [];
128
- if (opts.blocking) {
129
- // Make all siblings inert
130
- Array.from(document.body.children).forEach((el) => {
131
- if (el !== overlayRoot && el.getAttribute('inert') === null) {
132
- el.setAttribute('inert', '');
133
- originalInert.push(el.id || el.tagName);
134
- }
135
- });
136
- // Setup focus trap
137
- focusableEls = Array.from(div.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));
138
- if (focusableEls.length > 0) {
139
- const firstFocusable = focusableEls[0];
140
- const lastFocusable = focusableEls[focusableEls.length - 1];
141
- const trapFocus = (e) => {
142
- if (e.key !== 'Tab')
143
- return;
144
- if (e.shiftKey) {
145
- if (document.activeElement === firstFocusable) {
146
- lastFocusable.focus();
147
- e.preventDefault();
148
- }
149
- }
150
- else if (document.activeElement === lastFocusable) {
151
- firstFocusable.focus();
152
- e.preventDefault();
153
- }
154
- };
155
- div.addEventListener('keydown', trapFocus);
156
- requestAnimationFrame(() => firstFocusable.focus());
157
- }
158
- }
159
- const attachTrigger = () => {
160
- if (opts.trigger === 'hover') {
161
- const enter = () => {
162
- div.style.visibility = 'visible';
163
- div.style.opacity = '1';
164
- };
165
- const leave = () => {
166
- div.style.visibility = 'hidden';
167
- div.style.opacity = '0';
168
- };
169
- // Start hidden for hover
170
- div.style.visibility = 'hidden';
171
- div.style.opacity = '0';
172
- div.style.transition = 'opacity 200ms ease, visibility 200ms';
173
- anchorEl.addEventListener('mouseenter', enter);
174
- anchorEl.addEventListener('mouseleave', leave);
175
- anchorEl.addEventListener('focus', enter);
176
- anchorEl.addEventListener('blur', leave);
177
- return () => {
178
- anchorEl.removeEventListener('mouseenter', enter);
179
- anchorEl.removeEventListener('mouseleave', leave);
180
- anchorEl.removeEventListener('focus', enter);
181
- anchorEl.removeEventListener('blur', leave);
182
- };
183
- }
184
- if (opts.trigger === 'click') {
185
- const toggle = () => {
186
- const isVisible = div.style.visibility === 'visible';
187
- if (isVisible) {
188
- handle.destroy();
189
- }
190
- else {
191
- div.style.visibility = 'visible';
192
- div.style.opacity = '1';
193
- }
194
- };
195
- div.style.visibility = 'hidden';
196
- div.style.opacity = '0';
197
- div.style.transition = 'opacity 200ms ease, visibility 200ms';
198
- anchorEl.addEventListener('click', toggle);
199
- return () => anchorEl.removeEventListener('click', toggle);
200
- }
201
- // Immediate - fade in on mount
202
- div.style.opacity = '0';
203
- div.style.transition = 'opacity 200ms ease';
204
- requestAnimationFrame(() => {
205
- div.style.opacity = '1';
206
- });
207
- return () => { };
208
- };
209
- const removeTrigger = attachTrigger();
210
- const handle = {
211
- el: div,
212
- destroy() {
213
- cleanup();
214
- removeTrigger();
215
- window.removeEventListener('keydown', onKey);
216
- actionBtns.forEach((btn) => btn.removeEventListener('click', actionHandler));
217
- // Restore inert state
218
- if (opts.blocking) {
219
- Array.from(document.body.children).forEach((el) => {
220
- if (el !== overlayRoot) {
221
- el.removeAttribute('inert');
222
- }
223
- });
224
- }
225
- // Fade out then remove
226
- div.style.opacity = '0';
227
- setTimeout(() => div.remove(), 200);
228
- },
229
- };
230
- return handle;
231
- }
232
- //# sourceMappingURL=tooltip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../../../../src/overlays/runtime/overlay/tooltip.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- export function isVisible(el) {
2
- const rect = el.getBoundingClientRect();
3
- return (rect.width > 0 &&
4
- rect.height > 0 &&
5
- rect.bottom >= 0 &&
6
- rect.top <= (window.innerHeight || document.documentElement.clientHeight));
7
- }
8
- export function scrollIntoViewIfNeeded(el) {
9
- if (!isVisible(el))
10
- el.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
11
- }
12
- //# sourceMappingURL=dom.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../../../src/overlays/runtime/utils/dom.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,EAAe;IACvC,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;IACxC,OAAO,CACL,IAAI,CAAC,KAAK,GAAG,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,IAAI,CAAC;QAChB,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EAAe;IACpD,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAAE,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AACnG,CAAC"}
@@ -1,52 +0,0 @@
1
- import { z } from 'zod';
2
- export const SelectorZ = z.union([
3
- z.object({ type: z.literal('data'), key: z.string(), value: z.string().optional() }),
4
- z.object({ type: z.literal('css'), value: z.string() }),
5
- z.object({ type: z.literal('aria'), role: z.string().optional(), label: z.string().optional() }),
6
- z.object({ type: z.literal('shadow-css'), value: z.string() }),
7
- z.object({ type: z.literal('ref'), el: z.any() }), // runtime-only
8
- ]);
9
- export const TooltipStepZ = z.object({
10
- kind: z.literal('tooltip'),
11
- id: z.string(),
12
- anchor: SelectorZ,
13
- content: z.object({ title: z.string().optional(), body: z.string() }),
14
- placement: z.enum(['top', 'bottom', 'left', 'right', 'auto']).optional(),
15
- offsetPx: z.number().optional(),
16
- blocking: z.boolean().optional(),
17
- trigger: z.enum(['immediate', 'hover', 'click']).optional(),
18
- dismiss: z
19
- .object({
20
- onEsc: z.boolean().optional(),
21
- closeButton: z.boolean().optional(),
22
- timeoutMs: z.number().optional(),
23
- })
24
- .optional(),
25
- });
26
- export const HighlightStepZ = z.object({
27
- kind: z.literal('highlight'),
28
- id: z.string(),
29
- anchor: SelectorZ,
30
- copy: z.string().optional(),
31
- ring: z.object({ paddingPx: z.number().optional(), radiusPx: z.number().optional() }).optional(),
32
- scrim: z.object({ opacity: z.number().optional() }).optional(),
33
- ringColor: z.string().optional(),
34
- blocking: z.boolean().optional(),
35
- dismiss: z
36
- .object({
37
- onClickOutside: z.boolean().optional(),
38
- onEsc: z.boolean().optional(),
39
- timeoutMs: z.number().optional(),
40
- })
41
- .optional(),
42
- });
43
- export const CanvasRecipeZ = z.object({
44
- id: z.string(),
45
- version: z.number(),
46
- routes: z.array(z.string()).optional(),
47
- steps: z.array(z.union([TooltipStepZ, HighlightStepZ])),
48
- });
49
- export function validateRecipe(json) {
50
- return CanvasRecipeZ.parse(json);
51
- }
52
- //# sourceMappingURL=schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/overlays/schema.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/overlays/types.ts"],"names":[],"mappings":""}
@@ -1,69 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { createContext, useContext, useMemo } from 'react';
3
- const RenderContext = createContext(null);
4
- /**
5
- * Provider for render props and appearance configuration
6
- */
7
- export function RenderProvider({ children, renderProps = {}, appearance = {}, actionHandlers = {}, }) {
8
- const value = useMemo(() => ({
9
- renderProps,
10
- appearance,
11
- actionHandlers,
12
- invoke: (propName, data, defaultRenderer) => {
13
- var _a;
14
- const renderProp = renderProps[propName];
15
- // Check for type-specific override first
16
- if (propName === 'renderContent' && renderProps.renderByType) {
17
- const widgetId = (_a = data.tile) === null || _a === void 0 ? void 0 : _a.widget;
18
- // Extract the widget type suffix (e.g., "faq:panel" -> "panel")
19
- const widgetType = (widgetId === null || widgetId === void 0 ? void 0 : widgetId.includes(':')) ? widgetId.split(':')[1] : widgetId;
20
- if (widgetType && renderProps.renderByType[widgetType]) {
21
- return renderProps.renderByType[widgetType](data, defaultRenderer);
22
- }
23
- }
24
- // Use custom render prop if provided
25
- if (typeof renderProp === 'function') {
26
- return renderProp(data, defaultRenderer);
27
- }
28
- // Fall back to default renderer
29
- return defaultRenderer(data);
30
- },
31
- }), [renderProps, appearance, actionHandlers]);
32
- return _jsx(RenderContext.Provider, { value: value, children: children });
33
- }
34
- /**
35
- * Hook to access render context
36
- */
37
- export function useRenderContext() {
38
- const context = useContext(RenderContext);
39
- if (!context) {
40
- throw new Error('useRenderContext must be used within a RenderProvider');
41
- }
42
- return context;
43
- }
44
- /**
45
- * Hook to get render props
46
- */
47
- export function useRenderProps() {
48
- return useRenderContext().renderProps;
49
- }
50
- /**
51
- * Hook to get appearance config
52
- */
53
- export function useAppearance() {
54
- return useRenderContext().appearance;
55
- }
56
- /**
57
- * Hook to get action handlers
58
- */
59
- export function useActionHandlers() {
60
- return useRenderContext().actionHandlers;
61
- }
62
- /**
63
- * Hook to invoke a render prop
64
- */
65
- export function useRender(propName, data, defaultRenderer) {
66
- const { invoke } = useRenderContext();
67
- return invoke(propName, data, defaultRenderer);
68
- }
69
- //# sourceMappingURL=RenderContext.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RenderContext.js","sourceRoot":"","sources":["../../src/render/RenderContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAa,OAAO,EAAE,MAAM,OAAO,CAAC;AAwBtE,MAAM,aAAa,GAAG,aAAa,CAA4B,IAAI,CAAC,CAAC;AASrE;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,EACR,WAAW,GAAG,EAAE,EAChB,UAAU,GAAG,EAAE,EACf,cAAc,GAAG,EAAE,GACC;IACpB,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,WAAW;QACX,UAAU;QACV,cAAc;QACd,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;;YAC1C,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YAEzC,yCAAyC;YACzC,IAAI,QAAQ,KAAK,eAAe,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;gBAC7D,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,CAAC;gBACnC,gEAAgE;gBAChE,MAAM,UAAU,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,CAAC,GAAG,CAAC,EAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC/E,IAAI,UAAU,IAAI,WAAW,CAAC,YAAY,CAAC,UAAuB,CAAC,EAAE,CAAC;oBACpE,OAAO,WAAW,CAAC,YAAY,CAAC,UAAuB,CAAE,CACvD,IAAI,EACJ,eAAkC,CAC5B,CAAC;gBACX,CAAC;YACH,CAAC;YAED,qCAAqC;YACrC,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrC,OAAO,UAAU,CAAC,IAAI,EAAE,eAAkC,CAAQ,CAAC;YACrE,CAAC;YAED,gCAAgC;YAChC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC,EACF,CAAC,WAAW,EAAE,UAAU,EAAE,cAAc,CAAC,CAC1C,CAAC;IAEF,OAAO,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA0B,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,gBAAgB,EAAE,CAAC,WAAW,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,gBAAgB,EAAE,CAAC,UAAU,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,gBAAgB,EAAE,CAAC,cAAc,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,QAA2B,EAC3B,IAAgB,EAChB,eAAmC;IAEnC,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACtC,OAAO,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;AACjD,CAAC"}
@@ -1,3 +0,0 @@
1
- // Context and hooks
2
- export { RenderProvider, useRenderContext, useRenderProps, useAppearance, useActionHandlers, useRender, } from './RenderContext';
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAYA,oBAAoB;AACpB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,SAAS,GACV,MAAM,iBAAiB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/render/types.ts"],"names":[],"mappings":""}
package/dist/runtime.js DELETED
@@ -1,237 +0,0 @@
1
- /**
2
- * SmartCanvasRuntime - Unified runtime for v2 adaptives.
3
- *
4
- * The runtime provides access to all core providers:
5
- * - telemetry: Event tracking (PostHog)
6
- * - context: Page/session/viewport state
7
- * - events: Normalized event stream
8
- * - state: Persistent state storage
9
- * - actions: ActionEngine for interventions
10
- * - surfaces: Surfaces for UI rendering
11
- *
12
- * Note: ExperimentClient (GrowthBook) is NOT part of the runtime.
13
- * GrowthBook's job is done at page load when it selects which config to deliver.
14
- * The runtime receives the config and makes decisions using DecisionStrategy.
15
- */
16
- import { createActionEngine, executorRegistry, } from './actions';
17
- import { appRegistry as defaultAppRegistry } from './apps';
18
- import { createContextManager } from './context/ContextManager';
19
- import { createDecisionEngine } from './decisions/engine';
20
- import { createEventAccumulator } from './events/EventAccumulator';
21
- import { createEventBus } from './events/EventBus';
22
- import { ensureOverlayRoot } from './overlays/runtime/overlay/root';
23
- import { createStateStore } from './state/StateStore';
24
- import { createSurfaces } from './surfaces';
25
- import { widgetRegistry as defaultWidgetRegistry } from './widgets';
26
- /**
27
- * Runtime version.
28
- */
29
- export const RUNTIME_VERSION = '2.0.0';
30
- /**
31
- * Check if a URL matches a route filter.
32
- */
33
- function matchesRouteFilter(url, filter) {
34
- if (!filter)
35
- return true;
36
- // Extract pathname
37
- let pathname;
38
- try {
39
- pathname = new URL(url).pathname;
40
- }
41
- catch {
42
- pathname = url;
43
- }
44
- // Normalize pathname
45
- const normalizedPath = pathname.replace(/\/$/, '') || '/';
46
- // Check exclude patterns first
47
- if (filter.exclude) {
48
- for (const pattern of filter.exclude) {
49
- if (matchRoutePattern(normalizedPath, pattern)) {
50
- return false; // Explicitly excluded
51
- }
52
- }
53
- }
54
- // If include list exists, must match at least one
55
- if (filter.include && filter.include.length > 0) {
56
- for (const pattern of filter.include) {
57
- if (matchRoutePattern(normalizedPath, pattern)) {
58
- return true; // Matches include list
59
- }
60
- }
61
- return false; // Didn't match any include pattern
62
- }
63
- // No include list, not excluded = pass
64
- return true;
65
- }
66
- /**
67
- * Match a pathname against a route pattern.
68
- */
69
- function matchRoutePattern(pathname, pattern) {
70
- const normalizedPattern = pattern.replace(/\/$/, '') || '/';
71
- // Exact match
72
- if (pathname === normalizedPattern)
73
- return true;
74
- // Convert pattern to regex
75
- const regexPattern = normalizedPattern
76
- .replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape regex chars
77
- .replace(/\*\*/g, '.*') // ** matches anything
78
- .replace(/\*/g, '[^/]*') // * matches within path segment
79
- .replace(/:[^/]+/g, '[^/]+'); // :param matches any segment
80
- const regex = new RegExp(`^${regexPattern}$`);
81
- return regex.test(pathname);
82
- }
83
- /**
84
- * Resolve an anchor ID to an element.
85
- *
86
- * Resolution order:
87
- * 1. Syntro-tracked anchors (context.anchors with data-syntro-anchor attribute)
88
- * 2. Native CSS selector via querySelector (handles tags, classes, IDs,
89
- * attributes, combinators, pseudo-selectors — anything the browser supports)
90
- * 3. Shorthand ID lookup via getElementById (bare strings like "main-content")
91
- * 4. data-syntro-anchor attribute fallback (bare strings used as anchor names)
92
- */
93
- function resolveAnchorById(anchorId, ctx) {
94
- // 1. Check anchors tracked in runtime context
95
- const runtimeContext = ctx.get();
96
- if (runtimeContext.anchors) {
97
- const anchorState = runtimeContext.anchors.find((a) => a.anchorId === anchorId);
98
- if (anchorState === null || anchorState === void 0 ? void 0 : anchorState.present) {
99
- const el = document.querySelector(`[data-syntro-anchor="${anchorId}"]`);
100
- if (el)
101
- return el;
102
- }
103
- }
104
- // 2. Try as CSS selector (let the browser handle all valid CSS)
105
- try {
106
- const el = document.querySelector(anchorId);
107
- if (el)
108
- return el;
109
- }
110
- catch {
111
- // Invalid CSS selector — fall through to shorthand lookups
112
- }
113
- // 3. Try as element ID (bare string like "hero-section")
114
- const byId = document.getElementById(anchorId);
115
- if (byId)
116
- return byId;
117
- // 4. Try as data-syntro-anchor attribute value
118
- return document.querySelector(`[data-syntro-anchor="${anchorId}"]`);
119
- }
120
- /**
121
- * Create a SmartCanvasRuntime instance.
122
- */
123
- export function createSmartCanvasRuntime(options = {}) {
124
- var _a, _b, _c, _d;
125
- const { telemetry, sessionMetrics, routes, mode = 'production', namespace } = options;
126
- // Use provided registries or defaults
127
- const widgets = (_a = options.widgets) !== null && _a !== void 0 ? _a : defaultWidgetRegistry;
128
- const executors = (_b = options.executors) !== null && _b !== void 0 ? _b : executorRegistry;
129
- const apps = (_c = options.apps) !== null && _c !== void 0 ? _c : defaultAppRegistry;
130
- // Create core providers
131
- const context = createContextManager({
132
- telemetry,
133
- routes,
134
- });
135
- // Use external EventBus if provided, otherwise create one
136
- const events = (_d = options.events) !== null && _d !== void 0 ? _d : createEventBus();
137
- const state = createStateStore({
138
- namespace,
139
- });
140
- // Create event accumulator for event_count conditions
141
- const accumulator = createEventAccumulator({
142
- eventBus: events,
143
- stateStore: state,
144
- });
145
- // Create decision engine with bound options
146
- const decisionEngine = createDecisionEngine({
147
- state,
148
- events,
149
- sessionMetrics,
150
- accumulator,
151
- });
152
- // Create overlay root for Surfaces and ActionEngine
153
- const overlayRoot = ensureOverlayRoot();
154
- // Anchor resolver bound to context
155
- const anchorResolver = (anchorId) => resolveAnchorById(anchorId, context);
156
- // Create Surfaces provider with widget registry
157
- const surfaces = createSurfaces({
158
- overlayRoot,
159
- eventBus: events,
160
- anchorResolver,
161
- widgetRegistry: widgets,
162
- });
163
- // Create ActionEngine provider with executor registry
164
- const actions = createActionEngine({
165
- overlayRoot,
166
- eventBus: events,
167
- surfaces,
168
- anchorResolver,
169
- executorRegistry: executors,
170
- });
171
- const runtime = {
172
- telemetry,
173
- context,
174
- events,
175
- state,
176
- sessionMetrics,
177
- actions,
178
- surfaces,
179
- widgets,
180
- executors,
181
- apps,
182
- accumulator,
183
- version: RUNTIME_VERSION,
184
- mode,
185
- async evaluate(strategy) {
186
- return decisionEngine.evaluate(strategy, context.get());
187
- },
188
- evaluateSync(strategy) {
189
- return decisionEngine.evaluateSync(strategy, context.get());
190
- },
191
- async filterTiles(tiles) {
192
- const currentUrl = context.get().page.url;
193
- const results = [];
194
- for (const tile of tiles) {
195
- const activation = tile.activation;
196
- // If no activation config, tile always renders
197
- if (!activation) {
198
- results.push(tile);
199
- continue;
200
- }
201
- // Check route filter first
202
- if (!matchesRouteFilter(currentUrl, activation.routes)) {
203
- continue; // Doesn't match route filter
204
- }
205
- // If no strategy, tile renders (route filter passed)
206
- if (!activation.strategy) {
207
- results.push(tile);
208
- continue;
209
- }
210
- // Evaluate strategy
211
- const result = await this.evaluate(activation.strategy);
212
- if (result.value) {
213
- results.push(tile);
214
- }
215
- }
216
- return results;
217
- },
218
- setRoutes(routes) {
219
- context.setRoutes(routes);
220
- },
221
- destroy() {
222
- // Unbind and clean up apps registry
223
- apps.unbind().catch((err) => {
224
- console.error('[Runtime] Error unbinding apps registry:', err);
225
- });
226
- accumulator.destroy();
227
- context.destroy();
228
- actions.destroy();
229
- surfaces.destroy();
230
- },
231
- };
232
- // Bind apps registry to runtime
233
- apps.bind(runtime);
234
- widgets.bindRuntime(runtime);
235
- return runtime;
236
- }
237
- //# sourceMappingURL=runtime.js.map