@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/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";
|