@syntrologie/runtime-sdk 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +185 -0
  2. package/dist/SmartCanvasApp.d.ts +29 -0
  3. package/dist/SmartCanvasApp.js +68 -0
  4. package/dist/SmartCanvasApp.js.map +1 -0
  5. package/dist/SmartCanvasElement.d.ts +29 -0
  6. package/dist/SmartCanvasElement.js +133 -0
  7. package/dist/SmartCanvasElement.js.map +1 -0
  8. package/dist/SmartCanvasPortal.d.ts +7 -0
  9. package/dist/SmartCanvasPortal.js +17 -0
  10. package/dist/SmartCanvasPortal.js.map +1 -0
  11. package/dist/antiFlicker.d.ts +10 -0
  12. package/dist/antiFlicker.js +39 -0
  13. package/dist/antiFlicker.js.map +1 -0
  14. package/dist/api.d.ts +60 -0
  15. package/dist/api.js +159 -0
  16. package/dist/api.js.map +1 -0
  17. package/dist/bootstrap.d.ts +62 -0
  18. package/dist/bootstrap.js +83 -0
  19. package/dist/bootstrap.js.map +1 -0
  20. package/dist/bundle-entry.d.ts +4 -0
  21. package/dist/bundle-entry.js +9 -0
  22. package/dist/bundle-entry.js.map +1 -0
  23. package/dist/components/RectangleCard.d.ts +15 -0
  24. package/dist/components/RectangleCard.js +226 -0
  25. package/dist/components/RectangleCard.js.map +1 -0
  26. package/dist/components/RectangleWheel.d.ts +8 -0
  27. package/dist/components/RectangleWheel.js +30 -0
  28. package/dist/components/RectangleWheel.js.map +1 -0
  29. package/dist/components/ShadowCanvasOverlay.d.ts +26 -0
  30. package/dist/components/ShadowCanvasOverlay.js +163 -0
  31. package/dist/components/ShadowCanvasOverlay.js.map +1 -0
  32. package/dist/configFetcher.d.ts +15 -0
  33. package/dist/configFetcher.js +90 -0
  34. package/dist/configFetcher.js.map +1 -0
  35. package/dist/controller.d.ts +15 -0
  36. package/dist/controller.js +34 -0
  37. package/dist/controller.js.map +1 -0
  38. package/dist/earlyPatcher.d.ts +23 -0
  39. package/dist/earlyPatcher.js +70 -0
  40. package/dist/earlyPatcher.js.map +1 -0
  41. package/dist/editorLoader.d.ts +17 -0
  42. package/dist/editorLoader.js +95 -0
  43. package/dist/editorLoader.js.map +1 -0
  44. package/dist/experiments/adapters/growthbook.d.ts +45 -0
  45. package/dist/experiments/adapters/growthbook.js +79 -0
  46. package/dist/experiments/adapters/growthbook.js.map +1 -0
  47. package/dist/experiments/index.d.ts +3 -0
  48. package/dist/experiments/index.js +4 -0
  49. package/dist/experiments/index.js.map +1 -0
  50. package/dist/experiments/registry.d.ts +13 -0
  51. package/dist/experiments/registry.js +30 -0
  52. package/dist/experiments/registry.js.map +1 -0
  53. package/dist/experiments/types.d.ts +25 -0
  54. package/dist/experiments/types.js +2 -0
  55. package/dist/experiments/types.js.map +1 -0
  56. package/dist/fetchers/cdnFetcher.d.ts +35 -0
  57. package/dist/fetchers/cdnFetcher.js +100 -0
  58. package/dist/fetchers/cdnFetcher.js.map +1 -0
  59. package/dist/fetchers/experimentsFetcher.d.ts +33 -0
  60. package/dist/fetchers/experimentsFetcher.js +42 -0
  61. package/dist/fetchers/experimentsFetcher.js.map +1 -0
  62. package/dist/fetchers/index.d.ts +3 -0
  63. package/dist/fetchers/index.js +5 -0
  64. package/dist/fetchers/index.js.map +1 -0
  65. package/dist/fetchers/registry.d.ts +14 -0
  66. package/dist/fetchers/registry.js +58 -0
  67. package/dist/fetchers/registry.js.map +1 -0
  68. package/dist/fetchers/types.d.ts +26 -0
  69. package/dist/fetchers/types.js +2 -0
  70. package/dist/fetchers/types.js.map +1 -0
  71. package/dist/hooks/useCanvasOverlays.d.ts +13 -0
  72. package/dist/hooks/useCanvasOverlays.js +59 -0
  73. package/dist/hooks/useCanvasOverlays.js.map +1 -0
  74. package/dist/hooks/useHostPatches.d.ts +9 -0
  75. package/dist/hooks/useHostPatches.js +40 -0
  76. package/dist/hooks/useHostPatches.js.map +1 -0
  77. package/dist/hooks/useShadowCanvasConfig.d.ts +20 -0
  78. package/dist/hooks/useShadowCanvasConfig.js +46 -0
  79. package/dist/hooks/useShadowCanvasConfig.js.map +1 -0
  80. package/dist/hostPatcher/core/patcher.d.ts +3 -0
  81. package/dist/hostPatcher/core/patcher.js +173 -0
  82. package/dist/hostPatcher/core/patcher.js.map +1 -0
  83. package/dist/hostPatcher/core/sanitizer.d.ts +1 -0
  84. package/dist/hostPatcher/core/sanitizer.js +45 -0
  85. package/dist/hostPatcher/core/sanitizer.js.map +1 -0
  86. package/dist/hostPatcher/core/types.d.ts +94 -0
  87. package/dist/hostPatcher/core/types.js +2 -0
  88. package/dist/hostPatcher/core/types.js.map +1 -0
  89. package/dist/hostPatcher/index.d.ts +6 -0
  90. package/dist/hostPatcher/index.js +7 -0
  91. package/dist/hostPatcher/index.js.map +1 -0
  92. package/dist/hostPatcher/policy/defaultPolicy.d.ts +2 -0
  93. package/dist/hostPatcher/policy/defaultPolicy.js +41 -0
  94. package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -0
  95. package/dist/hostPatcher/utils/anchors.d.ts +13 -0
  96. package/dist/hostPatcher/utils/anchors.js +107 -0
  97. package/dist/hostPatcher/utils/anchors.js.map +1 -0
  98. package/dist/hostPatcher/utils/observer.d.ts +3 -0
  99. package/dist/hostPatcher/utils/observer.js +11 -0
  100. package/dist/hostPatcher/utils/observer.js.map +1 -0
  101. package/dist/index.d.ts +20 -0
  102. package/dist/index.js +20 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/overlays/fetcher.d.ts +4 -0
  105. package/dist/overlays/fetcher.js +17 -0
  106. package/dist/overlays/fetcher.js.map +1 -0
  107. package/dist/overlays/runtime/anchor/resolve.d.ts +4 -0
  108. package/dist/overlays/runtime/anchor/resolve.js +87 -0
  109. package/dist/overlays/runtime/anchor/resolve.js.map +1 -0
  110. package/dist/overlays/runtime/index.d.ts +6 -0
  111. package/dist/overlays/runtime/index.js +7 -0
  112. package/dist/overlays/runtime/index.js.map +1 -0
  113. package/dist/overlays/runtime/overlay/highlight.d.ts +10 -0
  114. package/dist/overlays/runtime/overlay/highlight.js +152 -0
  115. package/dist/overlays/runtime/overlay/highlight.js.map +1 -0
  116. package/dist/overlays/runtime/overlay/root.d.ts +4 -0
  117. package/dist/overlays/runtime/overlay/root.js +165 -0
  118. package/dist/overlays/runtime/overlay/root.js.map +1 -0
  119. package/dist/overlays/runtime/overlay/runner.d.ts +2 -0
  120. package/dist/overlays/runtime/overlay/runner.js +101 -0
  121. package/dist/overlays/runtime/overlay/runner.js.map +1 -0
  122. package/dist/overlays/runtime/overlay/tooltip.d.ts +14 -0
  123. package/dist/overlays/runtime/overlay/tooltip.js +174 -0
  124. package/dist/overlays/runtime/overlay/tooltip.js.map +1 -0
  125. package/dist/overlays/runtime/utils/dom.d.ts +2 -0
  126. package/dist/overlays/runtime/utils/dom.js +9 -0
  127. package/dist/overlays/runtime/utils/dom.js.map +1 -0
  128. package/dist/overlays/schema.d.ts +907 -0
  129. package/dist/overlays/schema.js +48 -0
  130. package/dist/overlays/schema.js.map +1 -0
  131. package/dist/overlays/types.d.ts +68 -0
  132. package/dist/overlays/types.js +2 -0
  133. package/dist/overlays/types.js.map +1 -0
  134. package/dist/react.d.ts +99 -0
  135. package/dist/react.js +119 -0
  136. package/dist/react.js.map +1 -0
  137. package/dist/smart-canvas.esm.js +202 -0
  138. package/dist/smart-canvas.esm.js.map +7 -0
  139. package/dist/smart-canvas.js +40406 -0
  140. package/dist/smart-canvas.js.map +7 -0
  141. package/dist/smart-canvas.min.js +202 -0
  142. package/dist/smart-canvas.min.js.map +7 -0
  143. package/dist/telemetry/adapters/posthog.d.ts +67 -0
  144. package/dist/telemetry/adapters/posthog.js +61 -0
  145. package/dist/telemetry/adapters/posthog.js.map +1 -0
  146. package/dist/telemetry/index.d.ts +3 -0
  147. package/dist/telemetry/index.js +3 -0
  148. package/dist/telemetry/index.js.map +1 -0
  149. package/dist/telemetry/registry.d.ts +13 -0
  150. package/dist/telemetry/registry.js +27 -0
  151. package/dist/telemetry/registry.js.map +1 -0
  152. package/dist/telemetry/types.d.ts +28 -0
  153. package/dist/telemetry/types.js +2 -0
  154. package/dist/telemetry/types.js.map +1 -0
  155. package/dist/token.d.ts +36 -0
  156. package/dist/token.js +47 -0
  157. package/dist/token.js.map +1 -0
  158. package/dist/types.d.ts +147 -0
  159. package/dist/types.js +5 -0
  160. package/dist/types.js.map +1 -0
  161. package/package.json +64 -0
  162. package/schema/canvas-config.schema.json +329 -0
  163. package/scripts/validate-config.mjs +80 -0
@@ -0,0 +1,165 @@
1
+ let overlayRootEl = null;
2
+ export function ensureOverlayRoot() {
3
+ if (overlayRootEl && document.body.contains(overlayRootEl))
4
+ return overlayRootEl;
5
+ let el = document.getElementById('syntro-overlays');
6
+ if (!el) {
7
+ el = document.createElement('div');
8
+ el.id = 'syntro-overlays';
9
+ Object.assign(el.style, {
10
+ position: 'fixed',
11
+ inset: '0',
12
+ zIndex: '2147483647',
13
+ pointerEvents: 'none'
14
+ });
15
+ document.body.appendChild(el);
16
+ }
17
+ overlayRootEl = el;
18
+ injectBaseStyles();
19
+ return overlayRootEl;
20
+ }
21
+ let stylesInjected = false;
22
+ export function injectBaseStyles() {
23
+ if (stylesInjected)
24
+ return;
25
+ const css = `
26
+ :root {
27
+ --syntro-surface: #111;
28
+ --syntro-fg: #fff;
29
+ --syntro-accent: #4f46e5;
30
+ --syntro-radius: 8px;
31
+ --syntro-shadow: 0 8px 24px rgba(0,0,0,.25);
32
+ --syntro-ring: #5b8cff;
33
+ --syntro-tooltip-bg: var(--syntro-surface, #0f172a);
34
+ --syntro-tooltip-fg: var(--syntro-fg, #fff);
35
+ --syntro-tooltip-radius: var(--syntro-radius, 12px);
36
+ --syntro-tooltip-padding: 12px 16px;
37
+ --syntro-tooltip-shadow: var(--syntro-shadow, 0 12px 32px rgba(15,23,42,.45));
38
+ --syntro-spotlight-backdrop: rgba(2,6,23,.55);
39
+ }
40
+
41
+ /* Tooltip container */
42
+ .syntro-tooltip {
43
+ position: fixed;
44
+ background: var(--syntro-tooltip-bg);
45
+ color: var(--syntro-tooltip-fg);
46
+ border-radius: var(--syntro-tooltip-radius);
47
+ padding: var(--syntro-tooltip-padding);
48
+ box-shadow: var(--syntro-tooltip-shadow);
49
+ pointer-events: auto;
50
+ max-width: min(320px, 90vw);
51
+ font-family: inherit;
52
+ font-size: 14px;
53
+ line-height: 1.5;
54
+ z-index: 2147483647;
55
+ opacity: 1;
56
+ visibility: visible;
57
+ transition: opacity 200ms cubic-bezier(0.16, 1, 0.3, 1),
58
+ transform 200ms cubic-bezier(0.16, 1, 0.3, 1);
59
+ }
60
+
61
+ /* Tooltip arrow */
62
+ .syntro-tooltip-arrow {
63
+ position: absolute;
64
+ width: 8px;
65
+ height: 8px;
66
+ background: inherit;
67
+ transform: rotate(45deg);
68
+ z-index: -1;
69
+ }
70
+
71
+ /* Tooltip content */
72
+ .syntro-tt-title {
73
+ font-weight: 600;
74
+ font-size: 15px;
75
+ margin-bottom: 6px;
76
+ }
77
+
78
+ .syntro-tt-body {
79
+ font-size: 14px;
80
+ opacity: 0.9;
81
+ }
82
+
83
+ .syntro-tt-close {
84
+ position: absolute;
85
+ top: 8px;
86
+ right: 8px;
87
+ background: transparent;
88
+ border: none;
89
+ color: inherit;
90
+ font-size: 20px;
91
+ line-height: 1;
92
+ cursor: pointer;
93
+ opacity: 0.6;
94
+ transition: opacity 150ms;
95
+ padding: 4px;
96
+ }
97
+
98
+ .syntro-tt-close:hover {
99
+ opacity: 1;
100
+ }
101
+
102
+ /* Buttons inside tooltips inherit font */
103
+ .syntro-tooltip button {
104
+ font-family: inherit;
105
+ cursor: pointer;
106
+ }
107
+
108
+ /* Spotlight scrim with fade animation */
109
+ .syntro-spotlight-scrim {
110
+ position: fixed;
111
+ inset: 0;
112
+ background: var(--syntro-spotlight-backdrop, rgba(2,6,23,.55));
113
+ backdrop-filter: blur(2px);
114
+ transition: opacity 220ms cubic-bezier(0.16, 1, 0.3, 1);
115
+ }
116
+
117
+ /* Spotlight ring with pulse animation */
118
+ .syntro-spotlight-ring {
119
+ position: fixed;
120
+ border: 2px solid var(--syntro-ring, #5b8cff);
121
+ box-shadow: 0 0 0 4px rgba(91, 140, 255, 0.25),
122
+ 0 4px 12px rgba(0, 0, 0, 0.3);
123
+ pointer-events: none;
124
+ animation: syntro-ring-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
125
+ transition: all 220ms cubic-bezier(0.16, 1, 0.3, 1);
126
+ }
127
+
128
+ @keyframes syntro-ring-pulse {
129
+ 0%, 100% {
130
+ box-shadow: 0 0 0 4px rgba(91, 140, 255, 0.25),
131
+ 0 4px 12px rgba(0, 0, 0, 0.3);
132
+ }
133
+ 50% {
134
+ box-shadow: 0 0 0 8px rgba(91, 140, 255, 0.15),
135
+ 0 4px 16px rgba(0, 0, 0, 0.4);
136
+ }
137
+ }
138
+
139
+ /* Fade in animation for tooltip */
140
+ @keyframes syntro-fade-in {
141
+ from {
142
+ opacity: 0;
143
+ transform: scale(0.96) translateY(-4px);
144
+ }
145
+ to {
146
+ opacity: 1;
147
+ transform: scale(1) translateY(0);
148
+ }
149
+ }
150
+ `;
151
+ const style = document.createElement('style');
152
+ style.setAttribute('data-syntro', 'base-overlay');
153
+ style.textContent = css;
154
+ document.head.appendChild(style);
155
+ stylesInjected = true;
156
+ }
157
+ // Inert helpers (polyfill loaded by caller if needed)
158
+ export function setDocumentInertExcept(keepEl) {
159
+ const siblings = Array.from(document.body.children).filter((n) => n !== keepEl);
160
+ siblings.forEach((el) => el.setAttribute('inert', ''));
161
+ }
162
+ export function clearDocumentInert() {
163
+ Array.from(document.body.children).forEach((el) => el.removeAttribute('inert'));
164
+ }
165
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../../../src/overlays/runtime/overlay/root.ts"],"names":[],"mappings":"AAAA,IAAI,aAAa,GAAuB,IAAI,CAAC;AAE7C,MAAM,UAAU,iBAAiB;IAC/B,IAAI,aAAa,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,aAAa,CAAC;IACjF,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAuB,CAAC;IAC1E,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,EAAE,CAAC,EAAE,GAAG,iBAAiB,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;YACtB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,YAAY;YACpB,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,aAAa,GAAG,EAAE,CAAC;IACnB,gBAAgB,EAAE,CAAC;IACnB,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,IAAI,cAAc,GAAG,KAAK,CAAC;AAC3B,MAAM,UAAU,gBAAgB;IAC9B,IAAI,cAAc;QAAE,OAAO;IAC3B,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Hb,CAAC;IACA,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAClD,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAChF,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AACD,MAAM,UAAU,kBAAkB;IAChC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CanvasRecipe, OverlayContext } from '../../types';
2
+ export declare function runOverlays(recipe: CanvasRecipe, ctx: OverlayContext): Promise<() => void>;
@@ -0,0 +1,101 @@
1
+ import { showTooltip } from './tooltip';
2
+ import { showHighlight } from './highlight';
3
+ export async function runOverlays(recipe, ctx) {
4
+ var _a;
5
+ if (recipe.routes && !routeMatches(recipe.routes, location.pathname))
6
+ return () => { };
7
+ const cleanups = [];
8
+ for (const step of recipe.steps) {
9
+ const el = await ctx.resolve(step.anchor);
10
+ if (!el) {
11
+ (_a = ctx.onEvent) === null || _a === void 0 ? void 0 : _a.call(ctx, 'syntro_anchor_missing', { stepId: step.id, anchor: step.anchor });
12
+ continue;
13
+ }
14
+ if (step.kind === 'tooltip') {
15
+ cleanups.push(runTooltip(step, el, ctx));
16
+ }
17
+ else if (step.kind === 'highlight') {
18
+ cleanups.push(runHighlight(step, el, ctx));
19
+ }
20
+ }
21
+ return () => {
22
+ cleanups.forEach((fn) => {
23
+ try {
24
+ fn();
25
+ }
26
+ catch { }
27
+ });
28
+ };
29
+ }
30
+ function routeMatches(routes, path) {
31
+ // simple contains/prefix; replace with real matcher as needed
32
+ return routes.some(r => r === path || path.startsWith(r));
33
+ }
34
+ function runTooltip(step, anchorEl, ctx) {
35
+ var _a, _b, _c, _d;
36
+ const html = tooltipHtml(step);
37
+ const handle = showTooltip(anchorEl, ctx.overlayRoot, {
38
+ html,
39
+ placement: (_a = step.placement) !== null && _a !== void 0 ? _a : 'top',
40
+ offsetPx: (_b = step.offsetPx) !== null && _b !== void 0 ? _b : 8,
41
+ blocking: !!step.blocking,
42
+ trigger: step.trigger,
43
+ });
44
+ (_c = ctx.onEvent) === null || _c === void 0 ? void 0 : _c.call(ctx, 'syntro_overlay_exposed', { kind: 'tooltip', stepId: step.id, recipeId: ctx.recipeId });
45
+ const timers = [];
46
+ if ((_d = step.dismiss) === null || _d === void 0 ? void 0 : _d.timeoutMs) {
47
+ const id = window.setTimeout(() => {
48
+ var _a;
49
+ handle.destroy();
50
+ (_a = ctx.onEvent) === null || _a === void 0 ? void 0 : _a.call(ctx, 'syntro_overlay_dismissed', { stepId: step.id, reason: 'timeout' });
51
+ }, step.dismiss.timeoutMs);
52
+ timers.push(id);
53
+ }
54
+ const closeBtn = handle.el.querySelector('[data-syntro-role="close"]');
55
+ const onClose = () => {
56
+ var _a;
57
+ handle.destroy();
58
+ (_a = ctx.onEvent) === null || _a === void 0 ? void 0 : _a.call(ctx, 'syntro_overlay_dismissed', { stepId: step.id, reason: 'close' });
59
+ };
60
+ closeBtn === null || closeBtn === void 0 ? void 0 : closeBtn.addEventListener('click', onClose);
61
+ return () => {
62
+ timers.forEach((id) => clearTimeout(id));
63
+ closeBtn === null || closeBtn === void 0 ? void 0 : closeBtn.removeEventListener('click', onClose);
64
+ handle.destroy();
65
+ };
66
+ }
67
+ function runHighlight(step, anchorEl, ctx) {
68
+ var _a, _b, _c, _d, _e;
69
+ const handle = showHighlight(anchorEl, ctx.overlayRoot, {
70
+ paddingPx: (_a = step.ring) === null || _a === void 0 ? void 0 : _a.paddingPx,
71
+ radiusPx: (_b = step.ring) === null || _b === void 0 ? void 0 : _b.radiusPx,
72
+ scrimOpacity: (_c = step.scrim) === null || _c === void 0 ? void 0 : _c.opacity,
73
+ ringColor: step.ringColor,
74
+ blocking: step.blocking,
75
+ });
76
+ (_d = ctx.onEvent) === null || _d === void 0 ? void 0 : _d.call(ctx, 'syntro_overlay_exposed', { kind: 'highlight', stepId: step.id, recipeId: ctx.recipeId });
77
+ const timers = [];
78
+ if ((_e = step.dismiss) === null || _e === void 0 ? void 0 : _e.timeoutMs) {
79
+ const id = window.setTimeout(() => {
80
+ var _a;
81
+ handle.destroy();
82
+ (_a = ctx.onEvent) === null || _a === void 0 ? void 0 : _a.call(ctx, 'syntro_overlay_dismissed', { stepId: step.id, reason: 'timeout' });
83
+ }, step.dismiss.timeoutMs);
84
+ timers.push(id);
85
+ }
86
+ return () => {
87
+ timers.forEach((id) => clearTimeout(id));
88
+ handle.destroy();
89
+ };
90
+ }
91
+ function tooltipHtml(step) {
92
+ var _a, _b;
93
+ const title = step.content.title ? `<div class="syntro-tt-title">${escapeHtml(step.content.title)}</div>` : '';
94
+ const body = `<div class="syntro-tt-body">${escapeHtml(step.content.body)}</div>`;
95
+ const close = ((_b = (_a = step.dismiss) === null || _a === void 0 ? void 0 : _a.closeButton) !== null && _b !== void 0 ? _b : true) ? `<button data-syntro-role="close" class="syntro-tt-close" aria-label="Close">×</button>` : '';
96
+ return `<div class="syntro-tt">${title}${body}${close}</div>`;
97
+ }
98
+ function escapeHtml(s) {
99
+ return s.replace(/[&<>"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]));
100
+ }
101
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/overlays/runtime/overlay/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Placement } from '@floating-ui/dom';
2
+ export type TooltipHandle = {
3
+ destroy(): void;
4
+ el: HTMLElement;
5
+ };
6
+ type PlacementOption = Placement | "auto";
7
+ export declare function showTooltip(anchorEl: HTMLElement, overlayRoot: HTMLElement, opts: {
8
+ html: string;
9
+ placement?: PlacementOption;
10
+ offsetPx?: number;
11
+ blocking?: boolean;
12
+ trigger?: 'immediate' | 'hover' | 'click';
13
+ }): TooltipHandle;
14
+ export {};
@@ -0,0 +1,174 @@
1
+ import { computePosition, autoUpdate, offset, flip, shift, hide, arrow as arrowMiddleware } from '@floating-ui/dom';
2
+ import { sanitizeWithFallback } from '../../../hostPatcher/core/sanitizer';
3
+ export function showTooltip(anchorEl, overlayRoot, opts) {
4
+ var _a;
5
+ const div = document.createElement('div');
6
+ div.className = 'syntro-tooltip';
7
+ div.setAttribute('role', 'tooltip');
8
+ // Sanitize HTML to prevent XSS
9
+ div.innerHTML = sanitizeWithFallback(opts.html);
10
+ // Create arrow element
11
+ const arrowEl = document.createElement('div');
12
+ arrowEl.className = 'syntro-tooltip-arrow';
13
+ div.appendChild(arrowEl);
14
+ overlayRoot.appendChild(div);
15
+ const middleware = [
16
+ offset((_a = opts.offsetPx) !== null && _a !== void 0 ? _a : 8),
17
+ flip(),
18
+ shift({ padding: 8 }),
19
+ hide(),
20
+ arrowMiddleware({ element: arrowEl })
21
+ ];
22
+ const placement = opts.placement && opts.placement !== 'auto' ? opts.placement : 'top';
23
+ const cleanup = autoUpdate(anchorEl, div, async () => {
24
+ const result = await computePosition(anchorEl, div, {
25
+ placement,
26
+ middleware
27
+ });
28
+ const { x, y, strategy, middlewareData, placement: finalPlacement } = result;
29
+ Object.assign(div.style, {
30
+ left: `${x}px`,
31
+ top: `${y}px`,
32
+ position: strategy
33
+ });
34
+ // Position arrow
35
+ if (middlewareData.arrow) {
36
+ const { x: arrowX, y: arrowY } = middlewareData.arrow;
37
+ const side = finalPlacement.split('-')[0];
38
+ const staticSide = {
39
+ top: 'bottom',
40
+ right: 'left',
41
+ bottom: 'top',
42
+ left: 'right',
43
+ }[side];
44
+ Object.assign(arrowEl.style, {
45
+ left: arrowX != null ? `${arrowX}px` : '',
46
+ top: arrowY != null ? `${arrowY}px` : '',
47
+ right: '',
48
+ bottom: '',
49
+ [staticSide]: '-4px',
50
+ });
51
+ // Set arrow rotation based on placement
52
+ const rotation = {
53
+ top: '0deg',
54
+ right: '90deg',
55
+ bottom: '180deg',
56
+ left: '270deg',
57
+ }[side] || '0deg';
58
+ arrowEl.style.transform = `rotate(${rotation})`;
59
+ }
60
+ });
61
+ const onKey = (e) => {
62
+ if (e.key === 'Escape')
63
+ handle.destroy();
64
+ };
65
+ window.addEventListener('keydown', onKey);
66
+ // Handle blocking mode (focus trap + inert)
67
+ let originalInert = [];
68
+ let focusableEls = [];
69
+ if (opts.blocking) {
70
+ // Make all siblings inert
71
+ Array.from(document.body.children).forEach((el) => {
72
+ if (el !== overlayRoot && el.getAttribute('inert') === null) {
73
+ el.setAttribute('inert', '');
74
+ originalInert.push(el.id || el.tagName);
75
+ }
76
+ });
77
+ // Setup focus trap
78
+ focusableEls = Array.from(div.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));
79
+ if (focusableEls.length > 0) {
80
+ const firstFocusable = focusableEls[0];
81
+ const lastFocusable = focusableEls[focusableEls.length - 1];
82
+ const trapFocus = (e) => {
83
+ if (e.key !== 'Tab')
84
+ return;
85
+ if (e.shiftKey) {
86
+ if (document.activeElement === firstFocusable) {
87
+ lastFocusable.focus();
88
+ e.preventDefault();
89
+ }
90
+ }
91
+ else {
92
+ if (document.activeElement === lastFocusable) {
93
+ firstFocusable.focus();
94
+ e.preventDefault();
95
+ }
96
+ }
97
+ };
98
+ div.addEventListener('keydown', trapFocus);
99
+ requestAnimationFrame(() => firstFocusable.focus());
100
+ }
101
+ }
102
+ const attachTrigger = () => {
103
+ if (opts.trigger === 'hover') {
104
+ const enter = () => {
105
+ div.style.visibility = 'visible';
106
+ div.style.opacity = '1';
107
+ };
108
+ const leave = () => {
109
+ div.style.visibility = 'hidden';
110
+ div.style.opacity = '0';
111
+ };
112
+ // Start hidden for hover
113
+ div.style.visibility = 'hidden';
114
+ div.style.opacity = '0';
115
+ div.style.transition = 'opacity 200ms ease, visibility 200ms';
116
+ anchorEl.addEventListener('mouseenter', enter);
117
+ anchorEl.addEventListener('mouseleave', leave);
118
+ anchorEl.addEventListener('focus', enter);
119
+ anchorEl.addEventListener('blur', leave);
120
+ return () => {
121
+ anchorEl.removeEventListener('mouseenter', enter);
122
+ anchorEl.removeEventListener('mouseleave', leave);
123
+ anchorEl.removeEventListener('focus', enter);
124
+ anchorEl.removeEventListener('blur', leave);
125
+ };
126
+ }
127
+ if (opts.trigger === 'click') {
128
+ const toggle = () => {
129
+ const isVisible = div.style.visibility === 'visible';
130
+ if (isVisible) {
131
+ handle.destroy();
132
+ }
133
+ else {
134
+ div.style.visibility = 'visible';
135
+ div.style.opacity = '1';
136
+ }
137
+ };
138
+ div.style.visibility = 'hidden';
139
+ div.style.opacity = '0';
140
+ div.style.transition = 'opacity 200ms ease, visibility 200ms';
141
+ anchorEl.addEventListener('click', toggle);
142
+ return () => anchorEl.removeEventListener('click', toggle);
143
+ }
144
+ // Immediate - fade in on mount
145
+ div.style.opacity = '0';
146
+ div.style.transition = 'opacity 200ms ease';
147
+ requestAnimationFrame(() => {
148
+ div.style.opacity = '1';
149
+ });
150
+ return () => { };
151
+ };
152
+ const removeTrigger = attachTrigger();
153
+ const handle = {
154
+ el: div,
155
+ destroy() {
156
+ cleanup();
157
+ removeTrigger();
158
+ window.removeEventListener('keydown', onKey);
159
+ // Restore inert state
160
+ if (opts.blocking) {
161
+ Array.from(document.body.children).forEach((el) => {
162
+ if (el !== overlayRoot) {
163
+ el.removeAttribute('inert');
164
+ }
165
+ });
166
+ }
167
+ // Fade out then remove
168
+ div.style.opacity = '0';
169
+ setTimeout(() => div.remove(), 200);
170
+ }
171
+ };
172
+ return handle;
173
+ }
174
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../../../../src/overlays/runtime/overlay/tooltip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function isVisible(el: HTMLElement): boolean;
2
+ export declare function scrollIntoViewIfNeeded(el: HTMLElement): void;
@@ -0,0 +1,9 @@
1
+ export function isVisible(el) {
2
+ const rect = el.getBoundingClientRect();
3
+ return rect.width > 0 && rect.height > 0 && rect.bottom >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight);
4
+ }
5
+ export function scrollIntoViewIfNeeded(el) {
6
+ if (!isVisible(el))
7
+ el.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
8
+ }
9
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
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,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;AAC5I,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"}