@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/dist/api.js ADDED
@@ -0,0 +1,159 @@
1
+ import { registerSmartCanvasElement } from "./SmartCanvasElement";
2
+ import { createCanvasConfigFetcher } from "./configFetcher";
3
+ import { initAntiFlicker } from "./antiFlicker";
4
+ import { applyPatchesEarly, extractPatchesFromConfig, revertAllPatches } from "./earlyPatcher";
5
+ import { loadEditorSdk, shouldLoadEditor } from "./editorLoader";
6
+ export const createSmartCanvas = async (config = {}) => {
7
+ var _a, _b, _c, _d;
8
+ if (typeof window === "undefined" || typeof document === "undefined") {
9
+ throw new Error("SmartCanvas can only be created in a browser-like environment");
10
+ }
11
+ // Initialize anti-flicker if enabled
12
+ let removeAntiFlicker = null;
13
+ if (config.antiFlicker) {
14
+ const antiFlickerConfig = typeof config.antiFlicker === 'object' ? config.antiFlicker : {};
15
+ removeAntiFlicker = initAntiFlicker(antiFlickerConfig);
16
+ }
17
+ // Store current config and fetcher to expose to editor
18
+ let currentConfig = null;
19
+ let currentFetcher = null;
20
+ // Apply patches early if enabled and we have a fetcher
21
+ if (config.earlyPatching !== false && config.fetcher) {
22
+ try {
23
+ currentFetcher = config.fetcher;
24
+ const canvasConfig = await config.fetcher();
25
+ currentConfig = canvasConfig; // Save for editor
26
+ const patches = extractPatchesFromConfig(canvasConfig);
27
+ if (patches.length > 0) {
28
+ applyPatchesEarly({
29
+ patches,
30
+ onComplete: () => {
31
+ // Remove anti-flicker after patches are applied
32
+ if (removeAntiFlicker) {
33
+ removeAntiFlicker();
34
+ removeAntiFlicker = null;
35
+ }
36
+ }
37
+ });
38
+ }
39
+ }
40
+ catch (error) {
41
+ console.error('[SmartCanvas] Error applying early patches:', error);
42
+ }
43
+ }
44
+ // Remove anti-flicker if not already removed
45
+ if (removeAntiFlicker) {
46
+ removeAntiFlicker();
47
+ }
48
+ // Check if we should load the editor
49
+ if (shouldLoadEditor()) {
50
+ // We don't await this so the runtime SDK can continue initializing
51
+ loadEditorSdk(config.editorUrl).catch(console.error);
52
+ }
53
+ registerSmartCanvasElement();
54
+ const host = document.createElement("smart-canvas");
55
+ if (config.tokens) {
56
+ for (const [key, value] of Object.entries(config.tokens)) {
57
+ host.style.setProperty(key, value);
58
+ }
59
+ }
60
+ const target = (_a = config.target) !== null && _a !== void 0 ? _a : document.body;
61
+ target.appendChild(host);
62
+ const experiments = (_b = config.integrations) === null || _b === void 0 ? void 0 : _b.experiments;
63
+ const telemetry = (_c = config.integrations) === null || _c === void 0 ? void 0 : _c.telemetry;
64
+ const fetcher = (_d = config.fetcher) !== null && _d !== void 0 ? _d : createCanvasConfigFetcher({
65
+ configUri: config.configUri,
66
+ experiments,
67
+ featureKey: config.configUriFeatureKey,
68
+ credentials: config.fetchCredentials,
69
+ });
70
+ // Store the initial fetcher if not already set
71
+ if (!currentFetcher) {
72
+ currentFetcher = fetcher;
73
+ }
74
+ const appProps = {
75
+ fetcher,
76
+ pollIntervalMs: config.pollIntervalMs,
77
+ experiments,
78
+ telemetry,
79
+ overlayFetcher: config.overlayFetcher,
80
+ overlayConfigUri: config.overlayConfigUri,
81
+ overlayConfigFeatureKey: config.overlayConfigFeatureKey,
82
+ overlayFetchCredentials: config.overlayFetchCredentials,
83
+ configUri: config.configUri,
84
+ configUriFeatureKey: config.configUriFeatureKey,
85
+ fetchCredentials: config.fetchCredentials,
86
+ theme: config.theme,
87
+ };
88
+ host.mountReactApp(appProps);
89
+ if (config.defaultOpen) {
90
+ host.open();
91
+ }
92
+ const handle = {
93
+ el: host,
94
+ open: () => host.open(),
95
+ close: () => host.close(),
96
+ destroy: () => host.remove(),
97
+ setTokens: (tokens) => {
98
+ for (const [key, value] of Object.entries(tokens)) {
99
+ host.style.setProperty(key, value);
100
+ }
101
+ },
102
+ getConfig: async () => {
103
+ // Use current fetcher to get fresh config
104
+ if (currentFetcher) {
105
+ try {
106
+ const freshConfig = await currentFetcher();
107
+ currentConfig = freshConfig;
108
+ return freshConfig;
109
+ }
110
+ catch (error) {
111
+ console.error('[SmartCanvas] Error fetching config:', error);
112
+ }
113
+ }
114
+ return currentConfig;
115
+ },
116
+ updateConfig: (newConfig) => {
117
+ currentConfig = newConfig;
118
+ // Re-apply patches
119
+ const patches = extractPatchesFromConfig(newConfig);
120
+ if (patches.length > 0) {
121
+ applyPatchesEarly({ patches });
122
+ }
123
+ },
124
+ setEnabled: (enabled) => {
125
+ if (enabled) {
126
+ if (currentConfig) {
127
+ const patches = extractPatchesFromConfig(currentConfig);
128
+ if (patches.length > 0) {
129
+ applyPatchesEarly({ patches });
130
+ }
131
+ }
132
+ }
133
+ else {
134
+ revertAllPatches();
135
+ }
136
+ },
137
+ registerComponent: (key, Component) => host.registerComponent(key, Component),
138
+ setOverrideFetcher: (newFetcher) => {
139
+ currentFetcher = newFetcher;
140
+ host.setOverrideFetcher(newFetcher);
141
+ }
142
+ };
143
+ // Only expose debug handle in development mode
144
+ // This prevents malicious scripts from manipulating SDK state in production
145
+ if (typeof window !== "undefined" && process.env.NODE_ENV === 'development') {
146
+ window.__smartCanvasHandle = handle;
147
+ }
148
+ return handle;
149
+ };
150
+ // Export anti-flicker snippet for inline usage
151
+ export { getAntiFlickerSnippet } from "./antiFlicker";
152
+ if (typeof window !== "undefined") {
153
+ window.SmartCanvas = {
154
+ async create(config) {
155
+ return createSmartCanvas(config);
156
+ },
157
+ };
158
+ }
159
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Bootstrap module for single-token SDK initialization.
3
+ *
4
+ * Usage:
5
+ * ```typescript
6
+ * import { Syntro } from '@syntrologie/runtime-sdk';
7
+ *
8
+ * const { canvas, experiments, telemetry } = await Syntro.init({
9
+ * token: "syn_eyJ2IjoxLCJleHAiOnsiayI6InNkay14eHgiLCJwIjoiZ3Jvd3RoYm9vayJ9fQ"
10
+ * });
11
+ * ```
12
+ */
13
+ import { decodeToken, encodeToken } from "./token";
14
+ import { SmartCanvasConfig, SmartCanvasHandle } from "./api";
15
+ import type { ExperimentClient } from "./experiments/types";
16
+ import type { TelemetryClient } from "./telemetry/types";
17
+ export interface SyntroInitOptions {
18
+ /**
19
+ * The Syntro token containing all credentials.
20
+ * Generated from your admin dashboard.
21
+ */
22
+ token: string;
23
+ /**
24
+ * Optional canvas configuration overrides.
25
+ */
26
+ canvas?: Partial<Omit<SmartCanvasConfig, "integrations" | "fetcher">>;
27
+ }
28
+ export interface SyntroInitResult {
29
+ /**
30
+ * The SmartCanvas handle for controlling the canvas.
31
+ */
32
+ canvas: SmartCanvasHandle;
33
+ /**
34
+ * The experiment client, if experiments are configured in the token.
35
+ */
36
+ experiments?: ExperimentClient;
37
+ /**
38
+ * The telemetry client, if telemetry is configured in the token.
39
+ */
40
+ telemetry?: TelemetryClient;
41
+ }
42
+ /**
43
+ * Initialize the Syntro SDK with a single token.
44
+ *
45
+ * @param options - Initialization options
46
+ * @returns The initialized SDK components
47
+ */
48
+ declare function init(options: SyntroInitOptions): Promise<SyntroInitResult>;
49
+ /**
50
+ * The Syntro namespace for single-token initialization.
51
+ */
52
+ export declare const Syntro: {
53
+ init: typeof init;
54
+ encodeToken: typeof encodeToken;
55
+ decodeToken: typeof decodeToken;
56
+ };
57
+ declare global {
58
+ interface Window {
59
+ Syntro?: typeof Syntro;
60
+ }
61
+ }
62
+ export {};
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Bootstrap module for single-token SDK initialization.
3
+ *
4
+ * Usage:
5
+ * ```typescript
6
+ * import { Syntro } from '@syntrologie/runtime-sdk';
7
+ *
8
+ * const { canvas, experiments, telemetry } = await Syntro.init({
9
+ * token: "syn_eyJ2IjoxLCJleHAiOnsiayI6InNkay14eHgiLCJwIjoiZ3Jvd3RoYm9vayJ9fQ"
10
+ * });
11
+ * ```
12
+ */
13
+ import { decodeToken, encodeToken } from "./token";
14
+ import { createExperimentClient } from "./experiments/registry";
15
+ import { createTelemetryClient } from "./telemetry/registry";
16
+ import { createConfigFetcher } from "./fetchers/registry";
17
+ import { createCanvasConfigFetcher } from "./configFetcher";
18
+ import { createSmartCanvas } from "./api";
19
+ /**
20
+ * Initialize the Syntro SDK with a single token.
21
+ *
22
+ * @param options - Initialization options
23
+ * @returns The initialized SDK components
24
+ */
25
+ async function init(options) {
26
+ var _a;
27
+ const payload = decodeToken(options.token);
28
+ // Initialize experiment client if configured (defaults to growthbook)
29
+ let experiments;
30
+ if (payload.e) {
31
+ experiments = createExperimentClient("growthbook", {
32
+ clientKey: payload.e,
33
+ });
34
+ }
35
+ // Initialize telemetry client if configured (defaults to posthog)
36
+ let telemetry;
37
+ if (payload.t) {
38
+ telemetry = createTelemetryClient("posthog", {
39
+ apiKey: payload.t,
40
+ });
41
+ }
42
+ // Create config fetcher
43
+ // Default: use experiments-based fetcher (checks for config object, then URI)
44
+ // This uses the existing createCanvasConfigFetcher which:
45
+ // 1. Checks "smart-canvas-config" feature for direct config object
46
+ // 2. Falls back to "smart-canvas-config-uri" feature for config URI
47
+ let fetcher;
48
+ if (payload.f) {
49
+ // Explicit fetcher type specified
50
+ const configFetcher = createConfigFetcher(payload.f, (_a = payload.o) !== null && _a !== void 0 ? _a : {});
51
+ fetcher = async () => {
52
+ var _a;
53
+ const result = await configFetcher.fetch();
54
+ return {
55
+ ...result.config,
56
+ tiles: (_a = result.config.tiles) !== null && _a !== void 0 ? _a : [],
57
+ };
58
+ };
59
+ }
60
+ else if (experiments) {
61
+ // Default: use experiments-based fetcher (GrowthBook config or URI)
62
+ fetcher = createCanvasConfigFetcher({ experiments });
63
+ }
64
+ // Create canvas with integrations
65
+ const canvas = await createSmartCanvas({
66
+ ...options.canvas,
67
+ fetcher,
68
+ integrations: { experiments, telemetry },
69
+ });
70
+ return { canvas, experiments, telemetry };
71
+ }
72
+ /**
73
+ * The Syntro namespace for single-token initialization.
74
+ */
75
+ export const Syntro = {
76
+ init,
77
+ encodeToken,
78
+ decodeToken,
79
+ };
80
+ if (typeof window !== "undefined") {
81
+ window.Syntro = Syntro;
82
+ }
83
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAsB,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAwC,MAAM,OAAO,CAAC;AAmChF;;;;;GAKG;AACH,KAAK,UAAU,IAAI,CAAC,OAA0B;;IAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAE3C,sEAAsE;IACtE,IAAI,WAAyC,CAAC;IAC9C,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;QACd,WAAW,GAAG,sBAAsB,CAAC,YAAY,EAAE;YACjD,SAAS,EAAE,OAAO,CAAC,CAAC;SACrB,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,IAAI,SAAsC,CAAC;IAC3C,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;QACd,SAAS,GAAG,qBAAqB,CAAC,SAAS,EAAE;YAC3C,MAAM,EAAE,OAAO,CAAC,CAAC;SAClB,CAAC,CAAC;IACL,CAAC;IAED,wBAAwB;IACxB,8EAA8E;IAC9E,0DAA0D;IAC1D,qEAAqE;IACrE,sEAAsE;IACtE,IAAI,OAAwC,CAAC;IAC7C,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;QACd,kCAAkC;QAClC,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,EAAE,MAAA,OAAO,CAAC,CAAC,mCAAI,EAAE,CAAC,CAAC;QACtE,OAAO,GAAG,KAAK,IAAI,EAAE;;YACnB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC;YAC3C,OAAO;gBACL,GAAG,MAAM,CAAC,MAAM;gBAChB,KAAK,EAAE,MAAA,MAAM,CAAC,MAAM,CAAC,KAAK,mCAAI,EAAE;aACjC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,oEAAoE;QACpE,OAAO,GAAG,yBAAyB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,kCAAkC;IAClC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;QACrC,GAAG,OAAO,CAAC,MAAM;QACjB,OAAO;QACP,YAAY,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE;KACzC,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI;IACJ,WAAW;IACX,WAAW;CACZ,CAAC;AASF,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IAClC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Bundle entry point - exports public SDK API
3
+ */
4
+ export { createSmartCanvas } from './api';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Bundle entry point - exports public SDK API
3
+ */
4
+ // Export the main SDK creation function
5
+ export { createSmartCanvas } from './api';
6
+ // Ready to export additional functionality in the future:
7
+ // export { applyPatchesEarly, extractPatchesFromConfig } from './earlyPatcher';
8
+ // export type { Patch } from './hostPatcher/core/types';
9
+ //# sourceMappingURL=bundle-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-entry.js","sourceRoot":"","sources":["../src/bundle-entry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wCAAwC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,0DAA0D;AAC1D,gFAAgF;AAChF,yDAAyD"}
@@ -0,0 +1,15 @@
1
+ import { CSSProperties } from "react";
2
+ import type { RectangleConfig } from "../types";
3
+ import type { TelemetryClient } from "../telemetry/types";
4
+ import { MountableComponent } from "../api";
5
+ interface RectangleCardProps {
6
+ config: RectangleConfig;
7
+ surface: "overlay" | "wheel";
8
+ telemetry?: TelemetryClient;
9
+ style?: CSSProperties;
10
+ customRenderers?: Record<string, MountableComponent>;
11
+ isExpanded?: boolean;
12
+ onToggleExpand?: () => void;
13
+ }
14
+ export declare function RectangleCard({ config, surface, telemetry, style, customRenderers, isExpanded, onToggleExpand, }: RectangleCardProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,226 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect, useRef } from "react";
3
+ function ChatbotBlock({ config, telemetry, surface, }) {
4
+ const [messages, setMessages] = useState([
5
+ { author: "Lumi", text: "Hi! Need clarity on a deduction?" },
6
+ ]);
7
+ const [input, setInput] = useState("");
8
+ const handleSubmit = (event) => {
9
+ event.preventDefault();
10
+ if (!input.trim())
11
+ return;
12
+ setMessages((prev) => [...prev, { author: "You", text: input.trim() }]);
13
+ setTimeout(() => {
14
+ setMessages((prev) => [
15
+ ...prev,
16
+ {
17
+ author: "Lumi",
18
+ text: "I will route that to the experimentation server stub for now.",
19
+ },
20
+ ]);
21
+ }, 600);
22
+ telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction("chatbot_message", config.id, surface);
23
+ setInput("");
24
+ };
25
+ return (_jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "0.75rem", height: "100%" }, children: [_jsx("div", { style: {
26
+ flex: 1,
27
+ overflowY: "auto",
28
+ padding: "0.75rem",
29
+ background: "rgba(0, 0, 0, 0.2)",
30
+ borderRadius: "8px",
31
+ fontSize: "0.85rem",
32
+ }, children: messages.map((message, idx) => (_jsxs("p", { style: { margin: "0 0 0.5rem" }, children: [_jsxs("span", { style: { fontWeight: 600, color: "#94a3b8" }, children: [message.author, ":"] }), " ", _jsx("span", { style: { color: "#e2e8f0" }, children: message.text })] }, `${message.author}-${idx}`))) }), _jsxs("form", { onSubmit: handleSubmit, style: { display: "flex", gap: "0.5rem" }, children: [_jsx("input", { style: {
33
+ flex: 1,
34
+ padding: "0.5rem 0.75rem",
35
+ borderRadius: "6px",
36
+ border: "1px solid rgba(255, 255, 255, 0.1)",
37
+ background: "rgba(0, 0, 0, 0.3)",
38
+ color: "#f1f5f9",
39
+ fontSize: "0.85rem",
40
+ outline: "none",
41
+ }, value: input, onChange: (event) => setInput(event.target.value), placeholder: "Ask anything..." }), _jsx("button", { style: {
42
+ padding: "0.5rem 0.75rem",
43
+ borderRadius: "6px",
44
+ border: "none",
45
+ background: "#6366f1",
46
+ color: "white",
47
+ fontWeight: 600,
48
+ fontSize: "0.8rem",
49
+ cursor: "pointer",
50
+ }, type: "submit", children: "Send" })] })] }));
51
+ }
52
+ function CustomRendererWrapper({ renderer, config, surface, telemetry, isExpanded, }) {
53
+ const containerRef = useRef(null);
54
+ useEffect(() => {
55
+ if (!containerRef.current)
56
+ return;
57
+ // Pass isExpanded to tile components so they can adjust their rendering
58
+ const cleanup = renderer.mount(containerRef.current, { config, surface, telemetry, isExpanded });
59
+ return () => {
60
+ if (cleanup)
61
+ cleanup();
62
+ };
63
+ }, [renderer, config, surface, telemetry, isExpanded]);
64
+ return _jsx("div", { ref: containerRef, style: { width: "100%", height: "100%" } });
65
+ }
66
+ export function RectangleCard({ config, surface, telemetry, style, customRenderers, isExpanded = false, onToggleExpand, }) {
67
+ var _a, _b, _c;
68
+ const { title, subtitle, content, style: configStyle } = config;
69
+ const accentColor = (_a = configStyle === null || configStyle === void 0 ? void 0 : configStyle.accentColor) !== null && _a !== void 0 ? _a : "#6366f1";
70
+ // Collapsed height - consistent like macOS notification center
71
+ const collapsedHeight = "72px";
72
+ const cardStyle = {
73
+ display: "flex",
74
+ flexDirection: "column",
75
+ borderRadius: "14px",
76
+ background: (_b = configStyle === null || configStyle === void 0 ? void 0 : configStyle.background) !== null && _b !== void 0 ? _b : "rgba(28, 28, 30, 0.95)",
77
+ border: "1px solid rgba(255, 255, 255, 0.08)",
78
+ boxShadow: "0 2px 12px rgba(0, 0, 0, 0.3)",
79
+ color: (_c = configStyle === null || configStyle === void 0 ? void 0 : configStyle.textColor) !== null && _c !== void 0 ? _c : "#f5f5f7",
80
+ fontFamily: "-apple-system, BlinkMacSystemFont, 'SF Pro Display', sans-serif",
81
+ overflow: "hidden",
82
+ cursor: onToggleExpand ? "pointer" : "default",
83
+ transition: "all 0.25s ease",
84
+ ...style,
85
+ };
86
+ const headerStyle = {
87
+ display: "flex",
88
+ alignItems: "center",
89
+ gap: "0.75rem",
90
+ padding: "0.875rem 1rem",
91
+ minHeight: collapsedHeight,
92
+ };
93
+ const iconStyle = {
94
+ width: "40px",
95
+ height: "40px",
96
+ borderRadius: "10px",
97
+ background: `linear-gradient(135deg, ${accentColor} 0%, ${accentColor}cc 100%)`,
98
+ display: "flex",
99
+ alignItems: "center",
100
+ justifyContent: "center",
101
+ fontSize: "1.25rem",
102
+ flexShrink: 0,
103
+ boxShadow: `0 2px 8px ${accentColor}40`,
104
+ };
105
+ const getIcon = () => {
106
+ switch (content.type) {
107
+ case "chatbot": return "💬";
108
+ case "metric": return "📊";
109
+ case "embed": return "🔗";
110
+ case "custom": return "⚙️";
111
+ default: return "📄";
112
+ }
113
+ };
114
+ const getPreview = () => {
115
+ var _a;
116
+ switch (content.type) {
117
+ case "metric":
118
+ return `${content.metricValue}${content.metricUnit ? ` ${content.metricUnit}` : ""}`;
119
+ case "text":
120
+ return content.headline || ((_a = content.body) === null || _a === void 0 ? void 0 : _a.slice(0, 50)) || "";
121
+ case "chatbot":
122
+ return "Tap to chat";
123
+ case "embed":
124
+ return "Tap to view";
125
+ case "custom":
126
+ return "Tap to expand";
127
+ default:
128
+ return "";
129
+ }
130
+ };
131
+ const renderExpandedContent = () => {
132
+ var _a;
133
+ switch (content.type) {
134
+ case "chatbot":
135
+ return (_jsx("div", { style: { height: "200px" }, children: _jsx(ChatbotBlock, { config: config, surface: surface, telemetry: telemetry }) }));
136
+ case "metric":
137
+ return (_jsxs("div", { style: { textAlign: "center", padding: "0.5rem 0" }, children: [_jsxs("p", { style: {
138
+ fontSize: "3rem",
139
+ fontWeight: 700,
140
+ color: accentColor,
141
+ margin: 0,
142
+ letterSpacing: "-0.02em",
143
+ }, children: [content.metricValue, content.metricUnit && (_jsx("span", { style: { fontSize: "1.25rem", fontWeight: 400, color: "#8e8e93", marginLeft: "0.5rem" }, children: content.metricUnit }))] }), content.headline && (_jsx("p", { style: { fontSize: "0.85rem", color: "#8e8e93", margin: "0.5rem 0 0" }, children: content.headline }))] }));
144
+ case "embed":
145
+ return content.embedUrl ? (_jsx("iframe", { src: content.embedUrl, sandbox: "allow-scripts allow-same-origin", referrerPolicy: "no-referrer", style: {
146
+ width: "100%",
147
+ height: "200px",
148
+ borderRadius: "8px",
149
+ border: "1px solid rgba(255, 255, 255, 0.1)",
150
+ background: "rgba(0, 0, 0, 0.2)",
151
+ }, title: (_a = content.headline) !== null && _a !== void 0 ? _a : config.title })) : null;
152
+ case "custom": {
153
+ // Support both legacy `customRendererKey` and new `component` field
154
+ const key = content.component || content.customRendererKey;
155
+ if (!key || !customRenderers || !customRenderers[key]) {
156
+ return _jsxs("div", { style: { color: "#ff6b6b", fontSize: "0.85rem", padding: "0.5rem 0" }, children: ["Unknown component: ", key] });
157
+ }
158
+ return (_jsx(CustomRendererWrapper, { renderer: customRenderers[key], config: config, surface: surface, telemetry: telemetry, isExpanded: isExpanded }));
159
+ }
160
+ case "text":
161
+ default:
162
+ return (_jsxs("div", { style: { padding: "0.25rem 0" }, children: [content.headline && (_jsx("p", { style: { fontSize: "1rem", fontWeight: 600, color: "#f5f5f7", margin: "0 0 0.5rem" }, children: content.headline })), content.body && (_jsx("p", { style: { fontSize: "0.9rem", color: "#8e8e93", margin: 0, lineHeight: 1.5 }, children: content.body }))] }));
163
+ }
164
+ };
165
+ return (_jsxs("article", { "data-shadow-canvas-id": `rectangle-${config.id}`, style: cardStyle, onClick: (e) => {
166
+ // Don't collapse if clicking inside expanded content
167
+ if (isExpanded && e.target.closest('[data-expanded-content]'))
168
+ return;
169
+ onToggleExpand === null || onToggleExpand === void 0 ? void 0 : onToggleExpand();
170
+ }, children: [_jsxs("div", { style: headerStyle, children: [_jsx("div", { style: iconStyle, children: getIcon() }), _jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [subtitle && (_jsx("p", { style: {
171
+ fontSize: "0.7rem",
172
+ textTransform: "uppercase",
173
+ letterSpacing: "0.05em",
174
+ color: "#8e8e93",
175
+ margin: 0,
176
+ }, children: subtitle })), _jsx("h3", { style: {
177
+ fontSize: "0.95rem",
178
+ fontWeight: 600,
179
+ color: "#f5f5f7",
180
+ margin: "0.125rem 0 0",
181
+ whiteSpace: "nowrap",
182
+ overflow: "hidden",
183
+ textOverflow: "ellipsis",
184
+ }, children: title }), !isExpanded && (_jsx("p", { style: {
185
+ fontSize: "0.8rem",
186
+ color: "#8e8e93",
187
+ margin: "0.125rem 0 0",
188
+ whiteSpace: "nowrap",
189
+ overflow: "hidden",
190
+ textOverflow: "ellipsis",
191
+ }, children: getPreview() }))] }), _jsx("div", { style: {
192
+ color: "#8e8e93",
193
+ fontSize: "0.85rem",
194
+ transform: isExpanded ? "rotate(180deg)" : "rotate(0deg)",
195
+ transition: "transform 0.2s ease",
196
+ }, children: "\u25BC" })] }), isExpanded && (_jsxs("div", { "data-expanded-content": true, style: {
197
+ padding: "0 1rem 1rem",
198
+ borderTop: "1px solid rgba(255, 255, 255, 0.06)",
199
+ }, onClick: (e) => e.stopPropagation(), children: [_jsx("div", { style: { paddingTop: "0.875rem" }, children: renderExpandedContent() }), content.actions && content.actions.length > 0 && (_jsx("div", { style: {
200
+ marginTop: "1rem",
201
+ paddingTop: "0.75rem",
202
+ borderTop: "1px solid rgba(255, 255, 255, 0.06)",
203
+ display: "flex",
204
+ gap: "0.5rem",
205
+ }, children: content.actions.map((action, idx) => (_jsx("button", { onClick: (e) => {
206
+ e.stopPropagation();
207
+ if (action.href && typeof window !== "undefined") {
208
+ window.open(action.href, "_blank", "noreferrer");
209
+ }
210
+ if (action.onClickId) {
211
+ telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction(action.onClickId, config.id, surface);
212
+ }
213
+ }, style: {
214
+ flex: 1,
215
+ padding: "0.625rem 1rem",
216
+ borderRadius: "8px",
217
+ fontSize: "0.85rem",
218
+ fontWeight: 600,
219
+ cursor: "pointer",
220
+ border: "none",
221
+ background: idx === 0 ? accentColor : "rgba(255, 255, 255, 0.1)",
222
+ color: "#fff",
223
+ transition: "opacity 0.15s ease",
224
+ }, onMouseEnter: (e) => { e.currentTarget.style.opacity = "0.85"; }, onMouseLeave: (e) => { e.currentTarget.style.opacity = "1"; }, children: action.label }, action.label))) }))] }))] }));
225
+ }
226
+ //# sourceMappingURL=RectangleCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RectangleCard.js","sourceRoot":"","sources":["../../src/components/RectangleCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { RectangleConfig } from "../types";
2
+ import type { TelemetryClient } from "../telemetry/types";
3
+ export interface RectangleWheelProps {
4
+ rectangles: RectangleConfig[];
5
+ intervalMs?: number;
6
+ telemetry?: TelemetryClient;
7
+ }
8
+ export declare function RectangleWheel({ rectangles, intervalMs, telemetry, }: RectangleWheelProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from "react";
3
+ import { RectangleCard } from "./RectangleCard";
4
+ export function RectangleWheel({ rectangles, intervalMs = 7000, telemetry, }) {
5
+ const [index, setIndex] = useState(0);
6
+ const ordered = useMemo(() => [...rectangles]
7
+ .filter((rect) => rect.size !== "quarter")
8
+ .sort((a, b) => { var _a, _b; return ((_a = a.order) !== null && _a !== void 0 ? _a : 0) - ((_b = b.order) !== null && _b !== void 0 ? _b : 0); }), [rectangles]);
9
+ useEffect(() => {
10
+ telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackCanvasOpened("wheel");
11
+ }, [telemetry]);
12
+ useEffect(() => {
13
+ if (ordered.length <= 1)
14
+ return;
15
+ const id = setInterval(() => {
16
+ setIndex((prev) => (prev + 1) % ordered.length);
17
+ }, intervalMs);
18
+ return () => clearInterval(id);
19
+ }, [ordered, intervalMs]);
20
+ useEffect(() => {
21
+ const current = ordered[index];
22
+ if (current) {
23
+ telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackRectangleViewed(current.id, "wheel");
24
+ }
25
+ }, [index, ordered, telemetry]);
26
+ if (!ordered.length)
27
+ return null;
28
+ return (_jsxs("div", { className: "relative overflow-hidden rounded-3xl border border-slate-200 bg-gradient-to-br from-white to-slate-50 p-6 shadow-2xl", "data-shadow-canvas-id": "wheel", children: [_jsx("div", { className: "flex transition-transform duration-700 ease-out", style: { transform: `translateX(-${index * 100}%)`, width: `${ordered.length * 100}%` }, children: ordered.map((rectangle) => (_jsx("div", { className: "w-full shrink-0 px-4", children: _jsx(RectangleCard, { config: { ...rectangle, size: "half" }, surface: "wheel", telemetry: telemetry }) }, rectangle.id))) }), _jsx("div", { className: "mt-4 flex justify-center gap-2", children: ordered.map((rectangle, idx) => (_jsx("button", { className: `h-2 w-6 rounded-full ${idx === index ? "bg-slate-800" : "bg-slate-300"}`, onClick: () => setIndex(idx) }, rectangle.id))) })] }));
29
+ }
30
+ //# sourceMappingURL=RectangleWheel.js.map