@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.
- package/README.md +185 -0
- package/dist/SmartCanvasApp.d.ts +29 -0
- package/dist/SmartCanvasApp.js +68 -0
- package/dist/SmartCanvasApp.js.map +1 -0
- package/dist/SmartCanvasElement.d.ts +29 -0
- package/dist/SmartCanvasElement.js +133 -0
- package/dist/SmartCanvasElement.js.map +1 -0
- package/dist/SmartCanvasPortal.d.ts +7 -0
- package/dist/SmartCanvasPortal.js +17 -0
- package/dist/SmartCanvasPortal.js.map +1 -0
- package/dist/antiFlicker.d.ts +10 -0
- package/dist/antiFlicker.js +39 -0
- package/dist/antiFlicker.js.map +1 -0
- package/dist/api.d.ts +60 -0
- package/dist/api.js +159 -0
- package/dist/api.js.map +1 -0
- package/dist/bootstrap.d.ts +62 -0
- package/dist/bootstrap.js +83 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/bundle-entry.d.ts +4 -0
- package/dist/bundle-entry.js +9 -0
- package/dist/bundle-entry.js.map +1 -0
- package/dist/components/RectangleCard.d.ts +15 -0
- package/dist/components/RectangleCard.js +226 -0
- package/dist/components/RectangleCard.js.map +1 -0
- package/dist/components/RectangleWheel.d.ts +8 -0
- package/dist/components/RectangleWheel.js +30 -0
- package/dist/components/RectangleWheel.js.map +1 -0
- package/dist/components/ShadowCanvasOverlay.d.ts +26 -0
- package/dist/components/ShadowCanvasOverlay.js +163 -0
- package/dist/components/ShadowCanvasOverlay.js.map +1 -0
- package/dist/configFetcher.d.ts +15 -0
- package/dist/configFetcher.js +90 -0
- package/dist/configFetcher.js.map +1 -0
- package/dist/controller.d.ts +15 -0
- package/dist/controller.js +34 -0
- package/dist/controller.js.map +1 -0
- package/dist/earlyPatcher.d.ts +23 -0
- package/dist/earlyPatcher.js +70 -0
- package/dist/earlyPatcher.js.map +1 -0
- package/dist/editorLoader.d.ts +17 -0
- package/dist/editorLoader.js +95 -0
- package/dist/editorLoader.js.map +1 -0
- package/dist/experiments/adapters/growthbook.d.ts +45 -0
- package/dist/experiments/adapters/growthbook.js +79 -0
- package/dist/experiments/adapters/growthbook.js.map +1 -0
- package/dist/experiments/index.d.ts +3 -0
- package/dist/experiments/index.js +4 -0
- package/dist/experiments/index.js.map +1 -0
- package/dist/experiments/registry.d.ts +13 -0
- package/dist/experiments/registry.js +30 -0
- package/dist/experiments/registry.js.map +1 -0
- package/dist/experiments/types.d.ts +25 -0
- package/dist/experiments/types.js +2 -0
- package/dist/experiments/types.js.map +1 -0
- package/dist/fetchers/cdnFetcher.d.ts +35 -0
- package/dist/fetchers/cdnFetcher.js +100 -0
- package/dist/fetchers/cdnFetcher.js.map +1 -0
- package/dist/fetchers/experimentsFetcher.d.ts +33 -0
- package/dist/fetchers/experimentsFetcher.js +42 -0
- package/dist/fetchers/experimentsFetcher.js.map +1 -0
- package/dist/fetchers/index.d.ts +3 -0
- package/dist/fetchers/index.js +5 -0
- package/dist/fetchers/index.js.map +1 -0
- package/dist/fetchers/registry.d.ts +14 -0
- package/dist/fetchers/registry.js +58 -0
- package/dist/fetchers/registry.js.map +1 -0
- package/dist/fetchers/types.d.ts +26 -0
- package/dist/fetchers/types.js +2 -0
- package/dist/fetchers/types.js.map +1 -0
- package/dist/hooks/useCanvasOverlays.d.ts +13 -0
- package/dist/hooks/useCanvasOverlays.js +59 -0
- package/dist/hooks/useCanvasOverlays.js.map +1 -0
- package/dist/hooks/useHostPatches.d.ts +9 -0
- package/dist/hooks/useHostPatches.js +40 -0
- package/dist/hooks/useHostPatches.js.map +1 -0
- package/dist/hooks/useShadowCanvasConfig.d.ts +20 -0
- package/dist/hooks/useShadowCanvasConfig.js +46 -0
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -0
- package/dist/hostPatcher/core/patcher.d.ts +3 -0
- package/dist/hostPatcher/core/patcher.js +173 -0
- package/dist/hostPatcher/core/patcher.js.map +1 -0
- package/dist/hostPatcher/core/sanitizer.d.ts +1 -0
- package/dist/hostPatcher/core/sanitizer.js +45 -0
- package/dist/hostPatcher/core/sanitizer.js.map +1 -0
- package/dist/hostPatcher/core/types.d.ts +94 -0
- package/dist/hostPatcher/core/types.js +2 -0
- package/dist/hostPatcher/core/types.js.map +1 -0
- package/dist/hostPatcher/index.d.ts +6 -0
- package/dist/hostPatcher/index.js +7 -0
- package/dist/hostPatcher/index.js.map +1 -0
- package/dist/hostPatcher/policy/defaultPolicy.d.ts +2 -0
- package/dist/hostPatcher/policy/defaultPolicy.js +41 -0
- package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -0
- package/dist/hostPatcher/utils/anchors.d.ts +13 -0
- package/dist/hostPatcher/utils/anchors.js +107 -0
- package/dist/hostPatcher/utils/anchors.js.map +1 -0
- package/dist/hostPatcher/utils/observer.d.ts +3 -0
- package/dist/hostPatcher/utils/observer.js +11 -0
- package/dist/hostPatcher/utils/observer.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/overlays/fetcher.d.ts +4 -0
- package/dist/overlays/fetcher.js +17 -0
- package/dist/overlays/fetcher.js.map +1 -0
- package/dist/overlays/runtime/anchor/resolve.d.ts +4 -0
- package/dist/overlays/runtime/anchor/resolve.js +87 -0
- package/dist/overlays/runtime/anchor/resolve.js.map +1 -0
- package/dist/overlays/runtime/index.d.ts +6 -0
- package/dist/overlays/runtime/index.js +7 -0
- package/dist/overlays/runtime/index.js.map +1 -0
- package/dist/overlays/runtime/overlay/highlight.d.ts +10 -0
- package/dist/overlays/runtime/overlay/highlight.js +152 -0
- package/dist/overlays/runtime/overlay/highlight.js.map +1 -0
- package/dist/overlays/runtime/overlay/root.d.ts +4 -0
- package/dist/overlays/runtime/overlay/root.js +165 -0
- package/dist/overlays/runtime/overlay/root.js.map +1 -0
- package/dist/overlays/runtime/overlay/runner.d.ts +2 -0
- package/dist/overlays/runtime/overlay/runner.js +101 -0
- package/dist/overlays/runtime/overlay/runner.js.map +1 -0
- package/dist/overlays/runtime/overlay/tooltip.d.ts +14 -0
- package/dist/overlays/runtime/overlay/tooltip.js +174 -0
- package/dist/overlays/runtime/overlay/tooltip.js.map +1 -0
- package/dist/overlays/runtime/utils/dom.d.ts +2 -0
- package/dist/overlays/runtime/utils/dom.js +9 -0
- package/dist/overlays/runtime/utils/dom.js.map +1 -0
- package/dist/overlays/schema.d.ts +907 -0
- package/dist/overlays/schema.js +48 -0
- package/dist/overlays/schema.js.map +1 -0
- package/dist/overlays/types.d.ts +68 -0
- package/dist/overlays/types.js +2 -0
- package/dist/overlays/types.js.map +1 -0
- package/dist/react.d.ts +99 -0
- package/dist/react.js +119 -0
- package/dist/react.js.map +1 -0
- package/dist/smart-canvas.esm.js +202 -0
- package/dist/smart-canvas.esm.js.map +7 -0
- package/dist/smart-canvas.js +40406 -0
- package/dist/smart-canvas.js.map +7 -0
- package/dist/smart-canvas.min.js +202 -0
- package/dist/smart-canvas.min.js.map +7 -0
- package/dist/telemetry/adapters/posthog.d.ts +67 -0
- package/dist/telemetry/adapters/posthog.js +61 -0
- package/dist/telemetry/adapters/posthog.js.map +1 -0
- package/dist/telemetry/index.d.ts +3 -0
- package/dist/telemetry/index.js +3 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/registry.d.ts +13 -0
- package/dist/telemetry/registry.js +27 -0
- package/dist/telemetry/registry.js.map +1 -0
- package/dist/telemetry/types.d.ts +28 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/token.d.ts +36 -0
- package/dist/token.js +47 -0
- package/dist/token.js.map +1 -0
- package/dist/types.d.ts +147 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
- package/schema/canvas-config.schema.json +329 -0
- 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
|
package/dist/api.js.map
ADDED
|
@@ -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,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
|