@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
package/README.md ADDED
@@ -0,0 +1,185 @@
1
+ # Syntrologie Smart Canvas SDK
2
+
3
+ ## Smart Canvas SDK (React + Shadow DOM)
4
+
5
+ The SDK now ships a framework-agnostic `<smart-canvas>` custom element with an **open shadow root**. We still render everything with React, but the canvas is encapsulated so host Tailwind configs, resets, or stacking contexts can’t break the UI.
6
+
7
+ ### What’s Included
8
+
9
+ - `SmartCanvasElement` – the custom element that owns the shadow DOM, overlay root, and controller.
10
+ - `SmartCanvasApp` – the React tree (overlay, rectangles, toggle) you portal into the shadow.
11
+ - `SmartCanvasPortal` – helper for React hosts to portal their tree (and context) into the element mount.
12
+ - `createSmartCanvas` – imperative API (`window.SmartCanvas.create`) for non-React hosts.
13
+ - GrowthBook/PostHog wrappers, hooks, rectangle components, and wheel remain available.
14
+
15
+ ### Installation
16
+
17
+ #### NPM/Yarn
18
+
19
+ ```bash
20
+ npm install @syntrologie/smart-canvas-sdk
21
+ # or
22
+ yarn add @syntrologie/smart-canvas-sdk
23
+ ```
24
+
25
+ #### CDN
26
+
27
+ For quick setup without a build process:
28
+
29
+ ```html
30
+ <!-- Minified production build -->
31
+ <script src="https://unpkg.com/@syntrologie/smart-canvas-sdk@latest/dist/smart-canvas.min.js"></script>
32
+
33
+ <!-- Non-minified development build -->
34
+ <script src="https://unpkg.com/@syntrologie/smart-canvas-sdk@latest/dist/smart-canvas.js"></script>
35
+
36
+ <!-- ES Modules -->
37
+ <script type="module">
38
+ import { createSmartCanvas } from 'https://unpkg.com/@syntrologie/smart-canvas-sdk@latest/dist/smart-canvas.esm.js';
39
+ </script>
40
+ ```
41
+
42
+ #### Local Development
43
+
44
+ ```bash
45
+ cd tech-core/sdks/shadow-canvas
46
+ npm run build
47
+ cd ../../tax_landing_page
48
+ npm install @syntrologie/smart-canvas-sdk@file:../tech-core/sdks/shadow-canvas
49
+ ```
50
+
51
+ Rebuild and reinstall whenever the SDK changes.
52
+
53
+ ### Using the Custom Element (React Host)
54
+
55
+ ```tsx
56
+ import {
57
+ createSyntroExperiment,
58
+ createSyntroTelemetry,
59
+ SmartCanvasApp,
60
+ SmartCanvasPortal,
61
+ registerSmartCanvasElement,
62
+ type SmartCanvasElement,
63
+ } from "@syntrologie/smart-canvas-sdk";
64
+
65
+ const canvasFetcher = async () => {/* return ShadowCanvasConfigResponse */};
66
+
67
+ function SmartCanvasBridge() {
68
+ const [element, setElement] = useState<SmartCanvasElement | null>(null);
69
+
70
+ useEffect(() => {
71
+ registerSmartCanvasElement();
72
+ }, []);
73
+
74
+ const controller = element?.getController();
75
+
76
+ return (
77
+ <>
78
+ <smart-canvas ref={setElement as any} />
79
+ {element && controller ? (
80
+ <SmartCanvasPortal element={element}>
81
+ <SmartCanvasApp
82
+ controller={controller}
83
+ fetcher={canvasFetcher}
84
+ overlayConfigUri={import.meta.env.VITE_SHADOW_CANVAS_OVERLAY_URI}
85
+ />
86
+ </SmartCanvasPortal>
87
+ ) : null}
88
+ </>
89
+ );
90
+ }
91
+ ```
92
+
93
+ ### Using the Imperative API (Plain JS Host)
94
+
95
+ When using via CDN, the SDK is available as `window.SyntrologieSDK`:
96
+
97
+ ```ts
98
+ // Via npm/ES modules
99
+ await window.SmartCanvas?.create({
100
+ defaultOpen: true,
101
+ tokens: {
102
+ "--sc-surface": "#050814",
103
+ "--sc-fg": "#f8fafc",
104
+ },
105
+ integrations: {
106
+ posthog, // existing PostHog client
107
+ growthbook, // existing GrowthBook client
108
+ },
109
+ });
110
+ ```
111
+
112
+ ### Styling & Overlays
113
+
114
+ - Fonts, colors, and CSS variables (`--sc-surface`, `--sc-fg`, etc.) are inherited from the host. Tokens can be overridden via `setTokens` or standard CSS:
115
+ - `--syntro-tooltip-bg`, `--syntro-tooltip-fg`, `--syntro-tooltip-radius`, `--syntro-tooltip-shadow`
116
+ - `--syntro-ring`, `--syntro-spotlight-backdrop` for highlights
117
+ - A scoped reset is injected via `adoptedStyleSheets` (fallbacks to `<style>`).
118
+ - Tooltips/popovers should use the Popover API or Floating UI with the exposed overlay root (`element.getOverlayRoot()`).
119
+
120
+ ### Analytics Events
121
+
122
+ The `createSyntroTelemetry` client emits:
123
+
124
+ | Event | Description |
125
+ | --- | --- |
126
+ | `shadow_canvas_opened` / `shadow_canvas_closed` | Toggle button interactions. |
127
+ | `shadow_canvas_rectangle_viewed` | A rectangle becomes visible (overlay grid & wheel). |
128
+ | `shadow_canvas_action` | CTA click, chatbot send, overlay events (tooltips, dismiss, anchor missing). |
129
+
130
+ ### Rectangle Config (unchanged)
131
+
132
+ The experimentation service still returns the same payload (`rectangles`, `style`, `content`, optional `experiment` metadata). Top-level fields now include optional `canvasTitle` so host teams can rename the overlay without code changes. See `src/types.ts` for the exact contract.
133
+
134
+ ### Schema & Validation Tool
135
+
136
+ - JSON schema lives at `schema/canvas-config.schema.json` (published with the package).
137
+ - Validate a config file locally:
138
+
139
+ ```bash
140
+ cd tech-core/sdks/shadow-canvas
141
+ npm run validate-config -- ../../tax_landing_page/public/smart-canvas-demo.json
142
+ ```
143
+
144
+ The script evaluates structure/required fields without third-party dependencies so CI and content authors can catch issues early.
145
+
146
+ ### Overlays (Tooltips & Highlights)
147
+
148
+ - Recipes use the schema in `src/overlays/schema.ts` (roughly `{ id, version, steps[] }`).
149
+ - Provide a recipe URI via `overlayConfigUri` or let GrowthBook supply `smart-canvas-overlay-uri`.
150
+ - Overlays render in `#syntro-overlays` (fixed, pointer-events: none) and use Floating UI for tethering.
151
+ - The Canvas runtime dynamically imports the overlay chunk only when a recipe resolves.
152
+ - Exposed helpers:
153
+ - `createOverlayRecipeFetcher`, `resolveConfigUri`
154
+ - `runOverlays`, `showTooltip`, `showHighlight`
155
+ - `createAnchorResolver` (works for main DOM + shadow DOM)
156
+
157
+ Telemetry for overlays uses `telemetry.trackAction("syntro_overlay_*", stepId, "overlay")`.
158
+
159
+ ### Testing
160
+
161
+ - Shadow root is **open**, so Playwright/Cypress can traverse via `.shadow()`.
162
+ - Data hooks: `[data-shadow-canvas-id="overlay-launcher"]`, `[data-shadow-canvas-id="rectangle-${id}"]`, etc.
163
+ - `SmartCanvasController` exposes `open/close` for deterministic tests.
164
+
165
+ ### Directory Overview
166
+
167
+ ```
168
+ tech-core/sdks/shadow-canvas
169
+ ├─ src
170
+ │ ├─ SmartCanvasElement.tsx // custom element + controller glue
171
+ │ ├─ SmartCanvasApp.tsx // React UI
172
+ │ ├─ SmartCanvasPortal.tsx // portal helper
173
+ │ ├─ api.tsx // window.SmartCanvas + imperative API
174
+ │ ├─ analytics/, experiments/, hooks/, components/
175
+ │ └─ controller.ts
176
+ └─ README.md
177
+ ```
178
+
179
+ ### Quick Checklist
180
+
181
+ 1. Call `registerSmartCanvasElement()` once per app.
182
+ 2. Render `<smart-canvas>` (custom element).
183
+ 3. Portal your React tree into the element’s shadow via `SmartCanvasPortal`.
184
+ 4. Configure the SDK with your API credentials.
185
+ 5. For non-React pages, call `window.SmartCanvas.create()` with configuration.
@@ -0,0 +1,29 @@
1
+ import { ReactNode } from "react";
2
+ import { SmartCanvasController } from "./controller";
3
+ import type { CanvasConfigFetcher } from "./types";
4
+ import type { ExperimentClient } from "./experiments/types";
5
+ import type { TelemetryClient } from "./telemetry/types";
6
+ import type { OverlayRecipeFetcher } from "./overlays/fetcher";
7
+ import { MountableComponent } from "./api";
8
+ import { CanvasTheme } from "./components/ShadowCanvasOverlay";
9
+ export interface SmartCanvasAppProps {
10
+ controller: SmartCanvasController;
11
+ fetcher?: CanvasConfigFetcher;
12
+ configUri?: string;
13
+ configUriFeatureKey?: string;
14
+ configFeatureKey?: string;
15
+ fetchCredentials?: RequestCredentials;
16
+ pollIntervalMs?: number;
17
+ experiments?: ExperimentClient;
18
+ telemetry?: TelemetryClient;
19
+ overlayFetcher?: OverlayRecipeFetcher;
20
+ overlayConfigUri?: string;
21
+ overlayConfigFeatureKey?: string;
22
+ overlayFetchCredentials?: RequestCredentials;
23
+ footerSlot?: ReactNode;
24
+ launcherLabel?: string;
25
+ canvasHost?: HTMLElement | null;
26
+ customRenderers?: Record<string, MountableComponent>;
27
+ theme?: Partial<CanvasTheme>;
28
+ }
29
+ export declare function SmartCanvasApp({ controller, fetcher, configUri, configUriFeatureKey, configFeatureKey, fetchCredentials, pollIntervalMs, experiments, telemetry, overlayFetcher, overlayConfigUri, overlayConfigFeatureKey, overlayFetchCredentials, footerSlot, launcherLabel, canvasHost, customRenderers, theme, }: SmartCanvasAppProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from "react";
3
+ import { ShadowCanvasOverlay } from "./components/ShadowCanvasOverlay";
4
+ import { useShadowCanvasConfig } from "./hooks/useShadowCanvasConfig";
5
+ import { createCanvasConfigFetcher } from "./configFetcher";
6
+ import { useCanvasOverlays } from "./hooks/useCanvasOverlays";
7
+ import { useHostPatches } from "./hooks/useHostPatches";
8
+ export function SmartCanvasApp({ controller, fetcher, configUri, configUriFeatureKey = "smart-canvas-config-uri", configFeatureKey = "smart-canvas-config", fetchCredentials = "include", pollIntervalMs, experiments, telemetry, overlayFetcher, overlayConfigUri, overlayConfigFeatureKey = "smart-canvas-overlay-uri", overlayFetchCredentials = "include", footerSlot, launcherLabel, canvasHost, customRenderers, theme, }) {
9
+ const [open, setOpen] = useState(controller.getState().open);
10
+ const derivedFetcher = useMemo(() => {
11
+ if (fetcher)
12
+ return fetcher;
13
+ return createCanvasConfigFetcher({
14
+ configUri,
15
+ experiments,
16
+ featureKey: configUriFeatureKey,
17
+ configFeatureKey,
18
+ credentials: fetchCredentials,
19
+ });
20
+ }, [fetcher, configUri, experiments, configUriFeatureKey, configFeatureKey, fetchCredentials]);
21
+ const configState = useShadowCanvasConfig({
22
+ fetcher: derivedFetcher,
23
+ pollIntervalMs,
24
+ experiments,
25
+ });
26
+ const hasContent = configState.rectangles.length > 0 && !configState.error;
27
+ useEffect(() => controller.subscribe((state) => setOpen(state.open)), [controller]);
28
+ useEffect(() => {
29
+ if (!hasContent && controller.getState().open) {
30
+ controller.setOpen(false);
31
+ }
32
+ }, [controller, hasContent]);
33
+ // Use inline overlay recipe from main config if present, otherwise use separate fetcher/URI
34
+ const derivedOverlayFetcher = useMemo(() => {
35
+ if (overlayFetcher)
36
+ return overlayFetcher;
37
+ if (configState.overlayRecipe) {
38
+ return async () => configState.overlayRecipe;
39
+ }
40
+ // Don't create a fetcher if there's no URI and we're still loading config
41
+ if (!overlayConfigUri && configState.isLoading) {
42
+ return undefined;
43
+ }
44
+ return undefined;
45
+ }, [overlayFetcher, configState.overlayRecipe, configState.isLoading, overlayConfigUri]);
46
+ useCanvasOverlays({
47
+ fetcher: derivedOverlayFetcher,
48
+ configUri: !derivedOverlayFetcher && !configState.isLoading ? overlayConfigUri : undefined,
49
+ featureKey: overlayConfigFeatureKey,
50
+ credentials: overlayFetchCredentials,
51
+ experiments,
52
+ telemetry,
53
+ canvasHost,
54
+ });
55
+ useHostPatches({
56
+ patches: configState.patches,
57
+ telemetry,
58
+ canvasHost,
59
+ });
60
+ if (!configState.isLoading && !hasContent) {
61
+ return null;
62
+ }
63
+ if (!hasContent) {
64
+ return null;
65
+ }
66
+ return (_jsx(ShadowCanvasOverlay, { rectangles: configState.rectangles, isLoading: configState.isLoading, error: configState.error, canvasTitle: configState.canvasTitle, telemetry: telemetry, launcherLabel: launcherLabel, footerSlot: footerSlot, isOpen: open, onToggle: () => controller.toggle(), customRenderers: customRenderers, displayMode: configState.displayMode, theme: theme }));
67
+ }
68
+ //# sourceMappingURL=SmartCanvasApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartCanvasApp.js","sourceRoot":"","sources":["../src/SmartCanvasApp.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type SmartCanvasAppProps } from "./SmartCanvasApp";
2
+ import { SmartCanvasController } from "./controller";
3
+ import { MountableComponent } from "./api";
4
+ export declare class SmartCanvasElement extends HTMLElement {
5
+ #private;
6
+ constructor();
7
+ connectedCallback(): void;
8
+ disconnectedCallback(): void;
9
+ getMountNode(): HTMLDivElement;
10
+ getController(): SmartCanvasController;
11
+ getOverlayRoot(): HTMLElement;
12
+ open(): void;
13
+ close(): void;
14
+ toggle(): void;
15
+ registerComponent(key: string, component: MountableComponent): void;
16
+ setOverrideFetcher(fetcher: any): void;
17
+ /**
18
+ * Used by standalone create() helper to bootstrap React into the shadow.
19
+ */
20
+ mountReactApp(appProps: Omit<SmartCanvasAppProps, "controller">): void;
21
+ private render;
22
+ private applyBaseStyles;
23
+ }
24
+ export declare const registerSmartCanvasElement: () => void;
25
+ declare global {
26
+ interface HTMLElementTagNameMap {
27
+ "smart-canvas": SmartCanvasElement;
28
+ }
29
+ }
@@ -0,0 +1,133 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _SmartCanvasElement_shadow, _SmartCanvasElement_mount, _SmartCanvasElement_overlayRoot, _SmartCanvasElement_controller, _SmartCanvasElement_root, _SmartCanvasElement_lastAppProps, _SmartCanvasElement_customRenderers;
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+ import { createRoot } from "react-dom/client";
15
+ import { SmartCanvasApp } from "./SmartCanvasApp";
16
+ import { createSmartCanvasController } from "./controller";
17
+ const TAG_NAME = "smart-canvas";
18
+ const BASE_CSS = `
19
+ :host {
20
+ font: inherit;
21
+ color: inherit;
22
+ position: relative;
23
+ contain: layout style;
24
+ }
25
+ :host([hidden]) {
26
+ display: none;
27
+ }
28
+ *, *::before, *::after {
29
+ box-sizing: border-box;
30
+ }
31
+ `;
32
+ const ensureOverlayRoot = () => {
33
+ const id = "smartcanvas-overlays";
34
+ let root = document.getElementById(id);
35
+ if (!root) {
36
+ root = document.createElement("div");
37
+ root.id = id;
38
+ root.setAttribute("data-smart-canvas-overlay", "true");
39
+ document.body.appendChild(root);
40
+ }
41
+ return root;
42
+ };
43
+ export class SmartCanvasElement extends HTMLElement {
44
+ constructor() {
45
+ super();
46
+ _SmartCanvasElement_shadow.set(this, void 0);
47
+ _SmartCanvasElement_mount.set(this, void 0);
48
+ _SmartCanvasElement_overlayRoot.set(this, void 0);
49
+ _SmartCanvasElement_controller.set(this, void 0);
50
+ _SmartCanvasElement_root.set(this, null);
51
+ _SmartCanvasElement_lastAppProps.set(this, null);
52
+ _SmartCanvasElement_customRenderers.set(this, {});
53
+ __classPrivateFieldSet(this, _SmartCanvasElement_shadow, this.attachShadow({ mode: "open", delegatesFocus: true }), "f");
54
+ __classPrivateFieldSet(this, _SmartCanvasElement_mount, document.createElement("div"), "f");
55
+ __classPrivateFieldGet(this, _SmartCanvasElement_mount, "f").setAttribute("part", "mount");
56
+ __classPrivateFieldGet(this, _SmartCanvasElement_shadow, "f").appendChild(__classPrivateFieldGet(this, _SmartCanvasElement_mount, "f"));
57
+ __classPrivateFieldSet(this, _SmartCanvasElement_overlayRoot, ensureOverlayRoot(), "f");
58
+ __classPrivateFieldSet(this, _SmartCanvasElement_controller, createSmartCanvasController(), "f");
59
+ this.applyBaseStyles();
60
+ }
61
+ connectedCallback() {
62
+ this.style.setProperty("font-family", "inherit");
63
+ }
64
+ disconnectedCallback() {
65
+ var _a;
66
+ (_a = __classPrivateFieldGet(this, _SmartCanvasElement_root, "f")) === null || _a === void 0 ? void 0 : _a.unmount();
67
+ __classPrivateFieldSet(this, _SmartCanvasElement_root, null, "f");
68
+ }
69
+ getMountNode() {
70
+ return __classPrivateFieldGet(this, _SmartCanvasElement_mount, "f");
71
+ }
72
+ getController() {
73
+ return __classPrivateFieldGet(this, _SmartCanvasElement_controller, "f");
74
+ }
75
+ getOverlayRoot() {
76
+ return __classPrivateFieldGet(this, _SmartCanvasElement_overlayRoot, "f");
77
+ }
78
+ open() {
79
+ __classPrivateFieldGet(this, _SmartCanvasElement_controller, "f").setOpen(true);
80
+ }
81
+ close() {
82
+ __classPrivateFieldGet(this, _SmartCanvasElement_controller, "f").setOpen(false);
83
+ }
84
+ toggle() {
85
+ __classPrivateFieldGet(this, _SmartCanvasElement_controller, "f").toggle();
86
+ }
87
+ registerComponent(key, component) {
88
+ __classPrivateFieldSet(this, _SmartCanvasElement_customRenderers, { ...__classPrivateFieldGet(this, _SmartCanvasElement_customRenderers, "f"), [key]: component }, "f");
89
+ this.render();
90
+ }
91
+ setOverrideFetcher(fetcher) {
92
+ if (__classPrivateFieldGet(this, _SmartCanvasElement_lastAppProps, "f")) {
93
+ __classPrivateFieldSet(this, _SmartCanvasElement_lastAppProps, { ...__classPrivateFieldGet(this, _SmartCanvasElement_lastAppProps, "f"), fetcher }, "f");
94
+ this.render();
95
+ }
96
+ }
97
+ /**
98
+ * Used by standalone create() helper to bootstrap React into the shadow.
99
+ */
100
+ mountReactApp(appProps) {
101
+ __classPrivateFieldSet(this, _SmartCanvasElement_lastAppProps, appProps, "f");
102
+ this.render();
103
+ }
104
+ render() {
105
+ if (!this.isConnected || !__classPrivateFieldGet(this, _SmartCanvasElement_lastAppProps, "f"))
106
+ return;
107
+ if (!__classPrivateFieldGet(this, _SmartCanvasElement_root, "f")) {
108
+ __classPrivateFieldSet(this, _SmartCanvasElement_root, createRoot(__classPrivateFieldGet(this, _SmartCanvasElement_mount, "f")), "f");
109
+ }
110
+ __classPrivateFieldGet(this, _SmartCanvasElement_root, "f").render(_jsx(SmartCanvasApp, { ...__classPrivateFieldGet(this, _SmartCanvasElement_lastAppProps, "f"), controller: __classPrivateFieldGet(this, _SmartCanvasElement_controller, "f"), canvasHost: this, customRenderers: __classPrivateFieldGet(this, _SmartCanvasElement_customRenderers, "f") }));
111
+ }
112
+ applyBaseStyles() {
113
+ if (__classPrivateFieldGet(this, _SmartCanvasElement_shadow, "f").adoptedStyleSheets !== undefined) {
114
+ const sheet = new CSSStyleSheet();
115
+ sheet.replaceSync(BASE_CSS);
116
+ __classPrivateFieldGet(this, _SmartCanvasElement_shadow, "f").adoptedStyleSheets = [sheet];
117
+ }
118
+ else {
119
+ const style = document.createElement("style");
120
+ style.textContent = BASE_CSS;
121
+ __classPrivateFieldGet(this, _SmartCanvasElement_shadow, "f").appendChild(style);
122
+ }
123
+ }
124
+ }
125
+ _SmartCanvasElement_shadow = new WeakMap(), _SmartCanvasElement_mount = new WeakMap(), _SmartCanvasElement_overlayRoot = new WeakMap(), _SmartCanvasElement_controller = new WeakMap(), _SmartCanvasElement_root = new WeakMap(), _SmartCanvasElement_lastAppProps = new WeakMap(), _SmartCanvasElement_customRenderers = new WeakMap();
126
+ export const registerSmartCanvasElement = () => {
127
+ if (typeof window === "undefined")
128
+ return;
129
+ if (!customElements.get(TAG_NAME)) {
130
+ customElements.define(TAG_NAME, SmartCanvasElement);
131
+ }
132
+ };
133
+ //# sourceMappingURL=SmartCanvasElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartCanvasElement.js","sourceRoot":"","sources":["../src/SmartCanvasElement.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ReactNode } from "react";
2
+ import type { SmartCanvasElement } from "./SmartCanvasElement";
3
+ export interface SmartCanvasPortalProps {
4
+ element: SmartCanvasElement | null;
5
+ children: ReactNode;
6
+ }
7
+ export declare function SmartCanvasPortal({ element, children }: SmartCanvasPortalProps): import("react").ReactPortal | null;
@@ -0,0 +1,17 @@
1
+ import { useLayoutEffect, useState } from "react";
2
+ import { createPortal } from "react-dom";
3
+ export function SmartCanvasPortal({ element, children }) {
4
+ const [mountNode, setMountNode] = useState(null);
5
+ useLayoutEffect(() => {
6
+ if (!element) {
7
+ setMountNode(null);
8
+ return;
9
+ }
10
+ setMountNode(element.getMountNode());
11
+ return () => setMountNode(null);
12
+ }, [element]);
13
+ if (!mountNode)
14
+ return null;
15
+ return createPortal(children, mountNode);
16
+ }
17
+ //# sourceMappingURL=SmartCanvasPortal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartCanvasPortal.js","sourceRoot":"","sources":["../src/SmartCanvasPortal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,eAAe,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAQzC,MAAM,UAAU,iBAAiB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAA0B;IAC7E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAErE,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Anti-flicker functionality to prevent content flash during patch application
3
+ */
4
+ export interface AntiFlickerConfig {
5
+ timeout?: number;
6
+ className?: string;
7
+ style?: string;
8
+ }
9
+ export declare function initAntiFlicker(config?: AntiFlickerConfig): () => void;
10
+ export declare function getAntiFlickerSnippet(config?: AntiFlickerConfig): string;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Anti-flicker functionality to prevent content flash during patch application
3
+ */
4
+ const DEFAULT_CONFIG = {
5
+ timeout: 300,
6
+ className: 'sc-anti-flicker',
7
+ style: 'opacity: 0 !important'
8
+ };
9
+ export function initAntiFlicker(config = {}) {
10
+ const { timeout, className, style } = { ...DEFAULT_CONFIG, ...config };
11
+ // Inject style
12
+ const styleEl = document.createElement('style');
13
+ styleEl.textContent = `.${className} { ${style} }`;
14
+ document.head.appendChild(styleEl);
15
+ // Add class to hide content
16
+ document.documentElement.classList.add(className);
17
+ // Set timeout to remove class (failsafe)
18
+ const timeoutId = setTimeout(() => {
19
+ document.documentElement.classList.remove(className);
20
+ }, timeout);
21
+ // Return function to remove anti-flicker
22
+ return () => {
23
+ clearTimeout(timeoutId);
24
+ document.documentElement.classList.remove(className);
25
+ styleEl.remove();
26
+ };
27
+ }
28
+ // For inline script usage
29
+ export function getAntiFlickerSnippet(config = {}) {
30
+ const { className, style } = { ...DEFAULT_CONFIG, ...config };
31
+ return `
32
+ (function() {
33
+ var s = document.createElement('style');
34
+ s.textContent = '.${className} { ${style} }';
35
+ document.head.appendChild(s);
36
+ document.documentElement.className += ' ${className}';
37
+ })();`;
38
+ }
39
+ //# sourceMappingURL=antiFlicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antiFlicker.js","sourceRoot":"","sources":["../src/antiFlicker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,cAAc,GAAgC;IAClD,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,iBAAiB;IAC5B,KAAK,EAAE,uBAAuB;CAC/B,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,SAA4B,EAAE;IAC5D,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAEvE,eAAe;IACf,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,WAAW,GAAG,IAAI,SAAS,MAAM,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAEnC,4BAA4B;IAC5B,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAElD,yCAAyC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;QAChC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,EAAE,OAAO,CAAC,CAAC;IAEZ,yCAAyC;IACzC,OAAO,GAAG,EAAE;QACV,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrD,OAAO,CAAC,MAAM,EAAE,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,qBAAqB,CAAC,SAA4B,EAAE;IAClE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC9D,OAAO;;;sBAGa,SAAS,MAAM,KAAK;;4CAEE,SAAS;MAC/C,CAAC;AACP,CAAC"}
package/dist/api.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ import { SmartCanvasElement } from "./SmartCanvasElement";
2
+ import type { ExperimentClient } from "./experiments/types";
3
+ import type { TelemetryClient } from "./telemetry/types";
4
+ import type { CanvasConfigFetcher } from "./types";
5
+ import type { OverlayRecipeFetcher } from "./overlays/fetcher";
6
+ import type { CanvasTheme } from "./components/ShadowCanvasOverlay";
7
+ export interface SmartCanvasIntegrations {
8
+ experiments?: ExperimentClient;
9
+ telemetry?: TelemetryClient;
10
+ }
11
+ export interface SmartCanvasConfig {
12
+ target?: HTMLElement;
13
+ defaultOpen?: boolean;
14
+ tokens?: Record<string, string>;
15
+ fetcher?: CanvasConfigFetcher;
16
+ configUri?: string;
17
+ configUriFeatureKey?: string;
18
+ fetchCredentials?: RequestCredentials;
19
+ overlayFetcher?: OverlayRecipeFetcher;
20
+ overlayConfigUri?: string;
21
+ overlayConfigFeatureKey?: string;
22
+ overlayFetchCredentials?: RequestCredentials;
23
+ pollIntervalMs?: number;
24
+ integrations?: SmartCanvasIntegrations;
25
+ antiFlicker?: boolean | {
26
+ timeout?: number;
27
+ className?: string;
28
+ };
29
+ earlyPatching?: boolean;
30
+ editorUrl?: string;
31
+ theme?: Partial<CanvasTheme>;
32
+ }
33
+ /**
34
+ * @deprecated Use TileComponent from types.ts
35
+ */
36
+ export interface MountableComponent {
37
+ mount(container: HTMLElement, props: any): void | (() => void);
38
+ }
39
+ export type { TileComponent, TileComponentProps } from "./types";
40
+ export interface SmartCanvasHandle {
41
+ el: SmartCanvasElement;
42
+ open(): void;
43
+ close(): void;
44
+ destroy(): void;
45
+ setTokens(tokens: Record<string, string>): void;
46
+ getConfig(): Promise<any>;
47
+ updateConfig(newConfig: any): void;
48
+ setEnabled(enabled: boolean): void;
49
+ registerComponent(key: string, component: MountableComponent): void;
50
+ setOverrideFetcher(fetcher: any): void;
51
+ }
52
+ export declare const createSmartCanvas: (config?: SmartCanvasConfig) => Promise<SmartCanvasHandle>;
53
+ declare global {
54
+ interface Window {
55
+ SmartCanvas?: {
56
+ create(config?: SmartCanvasConfig): Promise<SmartCanvasHandle>;
57
+ };
58
+ }
59
+ }
60
+ export { getAntiFlickerSnippet } from "./antiFlicker";