@syntrologie/runtime-sdk 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +185 -0
  2. package/dist/SmartCanvasApp.d.ts +29 -0
  3. package/dist/SmartCanvasApp.js +68 -0
  4. package/dist/SmartCanvasApp.js.map +1 -0
  5. package/dist/SmartCanvasElement.d.ts +29 -0
  6. package/dist/SmartCanvasElement.js +133 -0
  7. package/dist/SmartCanvasElement.js.map +1 -0
  8. package/dist/SmartCanvasPortal.d.ts +7 -0
  9. package/dist/SmartCanvasPortal.js +17 -0
  10. package/dist/SmartCanvasPortal.js.map +1 -0
  11. package/dist/antiFlicker.d.ts +10 -0
  12. package/dist/antiFlicker.js +39 -0
  13. package/dist/antiFlicker.js.map +1 -0
  14. package/dist/api.d.ts +60 -0
  15. package/dist/api.js +159 -0
  16. package/dist/api.js.map +1 -0
  17. package/dist/bootstrap.d.ts +62 -0
  18. package/dist/bootstrap.js +83 -0
  19. package/dist/bootstrap.js.map +1 -0
  20. package/dist/bundle-entry.d.ts +4 -0
  21. package/dist/bundle-entry.js +9 -0
  22. package/dist/bundle-entry.js.map +1 -0
  23. package/dist/components/RectangleCard.d.ts +15 -0
  24. package/dist/components/RectangleCard.js +226 -0
  25. package/dist/components/RectangleCard.js.map +1 -0
  26. package/dist/components/RectangleWheel.d.ts +8 -0
  27. package/dist/components/RectangleWheel.js +30 -0
  28. package/dist/components/RectangleWheel.js.map +1 -0
  29. package/dist/components/ShadowCanvasOverlay.d.ts +26 -0
  30. package/dist/components/ShadowCanvasOverlay.js +163 -0
  31. package/dist/components/ShadowCanvasOverlay.js.map +1 -0
  32. package/dist/configFetcher.d.ts +15 -0
  33. package/dist/configFetcher.js +90 -0
  34. package/dist/configFetcher.js.map +1 -0
  35. package/dist/controller.d.ts +15 -0
  36. package/dist/controller.js +34 -0
  37. package/dist/controller.js.map +1 -0
  38. package/dist/earlyPatcher.d.ts +23 -0
  39. package/dist/earlyPatcher.js +70 -0
  40. package/dist/earlyPatcher.js.map +1 -0
  41. package/dist/editorLoader.d.ts +17 -0
  42. package/dist/editorLoader.js +95 -0
  43. package/dist/editorLoader.js.map +1 -0
  44. package/dist/experiments/adapters/growthbook.d.ts +45 -0
  45. package/dist/experiments/adapters/growthbook.js +79 -0
  46. package/dist/experiments/adapters/growthbook.js.map +1 -0
  47. package/dist/experiments/index.d.ts +3 -0
  48. package/dist/experiments/index.js +4 -0
  49. package/dist/experiments/index.js.map +1 -0
  50. package/dist/experiments/registry.d.ts +13 -0
  51. package/dist/experiments/registry.js +30 -0
  52. package/dist/experiments/registry.js.map +1 -0
  53. package/dist/experiments/types.d.ts +25 -0
  54. package/dist/experiments/types.js +2 -0
  55. package/dist/experiments/types.js.map +1 -0
  56. package/dist/fetchers/cdnFetcher.d.ts +35 -0
  57. package/dist/fetchers/cdnFetcher.js +100 -0
  58. package/dist/fetchers/cdnFetcher.js.map +1 -0
  59. package/dist/fetchers/experimentsFetcher.d.ts +33 -0
  60. package/dist/fetchers/experimentsFetcher.js +42 -0
  61. package/dist/fetchers/experimentsFetcher.js.map +1 -0
  62. package/dist/fetchers/index.d.ts +3 -0
  63. package/dist/fetchers/index.js +5 -0
  64. package/dist/fetchers/index.js.map +1 -0
  65. package/dist/fetchers/registry.d.ts +14 -0
  66. package/dist/fetchers/registry.js +58 -0
  67. package/dist/fetchers/registry.js.map +1 -0
  68. package/dist/fetchers/types.d.ts +26 -0
  69. package/dist/fetchers/types.js +2 -0
  70. package/dist/fetchers/types.js.map +1 -0
  71. package/dist/hooks/useCanvasOverlays.d.ts +13 -0
  72. package/dist/hooks/useCanvasOverlays.js +59 -0
  73. package/dist/hooks/useCanvasOverlays.js.map +1 -0
  74. package/dist/hooks/useHostPatches.d.ts +9 -0
  75. package/dist/hooks/useHostPatches.js +40 -0
  76. package/dist/hooks/useHostPatches.js.map +1 -0
  77. package/dist/hooks/useShadowCanvasConfig.d.ts +20 -0
  78. package/dist/hooks/useShadowCanvasConfig.js +46 -0
  79. package/dist/hooks/useShadowCanvasConfig.js.map +1 -0
  80. package/dist/hostPatcher/core/patcher.d.ts +3 -0
  81. package/dist/hostPatcher/core/patcher.js +173 -0
  82. package/dist/hostPatcher/core/patcher.js.map +1 -0
  83. package/dist/hostPatcher/core/sanitizer.d.ts +1 -0
  84. package/dist/hostPatcher/core/sanitizer.js +45 -0
  85. package/dist/hostPatcher/core/sanitizer.js.map +1 -0
  86. package/dist/hostPatcher/core/types.d.ts +94 -0
  87. package/dist/hostPatcher/core/types.js +2 -0
  88. package/dist/hostPatcher/core/types.js.map +1 -0
  89. package/dist/hostPatcher/index.d.ts +6 -0
  90. package/dist/hostPatcher/index.js +7 -0
  91. package/dist/hostPatcher/index.js.map +1 -0
  92. package/dist/hostPatcher/policy/defaultPolicy.d.ts +2 -0
  93. package/dist/hostPatcher/policy/defaultPolicy.js +41 -0
  94. package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -0
  95. package/dist/hostPatcher/utils/anchors.d.ts +13 -0
  96. package/dist/hostPatcher/utils/anchors.js +107 -0
  97. package/dist/hostPatcher/utils/anchors.js.map +1 -0
  98. package/dist/hostPatcher/utils/observer.d.ts +3 -0
  99. package/dist/hostPatcher/utils/observer.js +11 -0
  100. package/dist/hostPatcher/utils/observer.js.map +1 -0
  101. package/dist/index.d.ts +20 -0
  102. package/dist/index.js +20 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/overlays/fetcher.d.ts +4 -0
  105. package/dist/overlays/fetcher.js +17 -0
  106. package/dist/overlays/fetcher.js.map +1 -0
  107. package/dist/overlays/runtime/anchor/resolve.d.ts +4 -0
  108. package/dist/overlays/runtime/anchor/resolve.js +87 -0
  109. package/dist/overlays/runtime/anchor/resolve.js.map +1 -0
  110. package/dist/overlays/runtime/index.d.ts +6 -0
  111. package/dist/overlays/runtime/index.js +7 -0
  112. package/dist/overlays/runtime/index.js.map +1 -0
  113. package/dist/overlays/runtime/overlay/highlight.d.ts +10 -0
  114. package/dist/overlays/runtime/overlay/highlight.js +152 -0
  115. package/dist/overlays/runtime/overlay/highlight.js.map +1 -0
  116. package/dist/overlays/runtime/overlay/root.d.ts +4 -0
  117. package/dist/overlays/runtime/overlay/root.js +165 -0
  118. package/dist/overlays/runtime/overlay/root.js.map +1 -0
  119. package/dist/overlays/runtime/overlay/runner.d.ts +2 -0
  120. package/dist/overlays/runtime/overlay/runner.js +101 -0
  121. package/dist/overlays/runtime/overlay/runner.js.map +1 -0
  122. package/dist/overlays/runtime/overlay/tooltip.d.ts +14 -0
  123. package/dist/overlays/runtime/overlay/tooltip.js +174 -0
  124. package/dist/overlays/runtime/overlay/tooltip.js.map +1 -0
  125. package/dist/overlays/runtime/utils/dom.d.ts +2 -0
  126. package/dist/overlays/runtime/utils/dom.js +9 -0
  127. package/dist/overlays/runtime/utils/dom.js.map +1 -0
  128. package/dist/overlays/schema.d.ts +907 -0
  129. package/dist/overlays/schema.js +48 -0
  130. package/dist/overlays/schema.js.map +1 -0
  131. package/dist/overlays/types.d.ts +68 -0
  132. package/dist/overlays/types.js +2 -0
  133. package/dist/overlays/types.js.map +1 -0
  134. package/dist/react.d.ts +99 -0
  135. package/dist/react.js +119 -0
  136. package/dist/react.js.map +1 -0
  137. package/dist/smart-canvas.esm.js +202 -0
  138. package/dist/smart-canvas.esm.js.map +7 -0
  139. package/dist/smart-canvas.js +40406 -0
  140. package/dist/smart-canvas.js.map +7 -0
  141. package/dist/smart-canvas.min.js +202 -0
  142. package/dist/smart-canvas.min.js.map +7 -0
  143. package/dist/telemetry/adapters/posthog.d.ts +67 -0
  144. package/dist/telemetry/adapters/posthog.js +61 -0
  145. package/dist/telemetry/adapters/posthog.js.map +1 -0
  146. package/dist/telemetry/index.d.ts +3 -0
  147. package/dist/telemetry/index.js +3 -0
  148. package/dist/telemetry/index.js.map +1 -0
  149. package/dist/telemetry/registry.d.ts +13 -0
  150. package/dist/telemetry/registry.js +27 -0
  151. package/dist/telemetry/registry.js.map +1 -0
  152. package/dist/telemetry/types.d.ts +28 -0
  153. package/dist/telemetry/types.js +2 -0
  154. package/dist/telemetry/types.js.map +1 -0
  155. package/dist/token.d.ts +36 -0
  156. package/dist/token.js +47 -0
  157. package/dist/token.js.map +1 -0
  158. package/dist/types.d.ts +147 -0
  159. package/dist/types.js +5 -0
  160. package/dist/types.js.map +1 -0
  161. package/package.json +64 -0
  162. package/schema/canvas-config.schema.json +329 -0
  163. package/scripts/validate-config.mjs +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RectangleWheel.js","sourceRoot":"","sources":["../../src/components/RectangleWheel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { ReactNode } from "react";
2
+ import type { RectangleConfig } from "../types";
3
+ import type { TelemetryClient } from "../telemetry/types";
4
+ import { MountableComponent } from "../api";
5
+ export interface CanvasTheme {
6
+ position: 'left' | 'right';
7
+ baseWidth: string;
8
+ expandedWidth: string;
9
+ zIndex: number;
10
+ backdropBlur: string;
11
+ }
12
+ export interface ShadowCanvasOverlayProps {
13
+ isOpen: boolean;
14
+ onToggle: () => void;
15
+ telemetry?: TelemetryClient;
16
+ launcherLabel?: string;
17
+ footerSlot?: ReactNode;
18
+ rectangles: RectangleConfig[];
19
+ isLoading: boolean;
20
+ error?: string;
21
+ canvasTitle?: string;
22
+ displayMode?: 'standard' | 'focused';
23
+ theme?: Partial<CanvasTheme>;
24
+ customRenderers?: Record<string, MountableComponent>;
25
+ }
26
+ export declare function ShadowCanvasOverlay({ isOpen, onToggle, telemetry, launcherLabel, footerSlot, rectangles, isLoading, error, canvasTitle, displayMode, theme: themeOverride, customRenderers, }: ShadowCanvasOverlayProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,163 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { RectangleCard } from "./RectangleCard";
5
+ const DEFAULT_THEME = {
6
+ position: 'right',
7
+ baseWidth: 'clamp(320px, 16.666vw, 420px)',
8
+ expandedWidth: '40vw',
9
+ zIndex: 2147483600,
10
+ backdropBlur: '18px'
11
+ };
12
+ export function ShadowCanvasOverlay({ isOpen, onToggle, telemetry, launcherLabel = "Canvas", footerSlot, rectangles, isLoading, error, canvasTitle, displayMode = 'standard', theme: themeOverride, customRenderers, }) {
13
+ const [mounted, setMounted] = useState(false);
14
+ const [expandedId, setExpandedId] = useState(null);
15
+ const theme = { ...DEFAULT_THEME, ...themeOverride };
16
+ const handleTileClick = (id) => {
17
+ setExpandedId(expandedId === id ? null : id);
18
+ };
19
+ useEffect(() => {
20
+ if (!isOpen || !telemetry)
21
+ return;
22
+ rectangles.forEach((rectangle) => {
23
+ telemetry.trackRectangleViewed(rectangle.id, "overlay");
24
+ });
25
+ }, [telemetry, isOpen, rectangles]);
26
+ useEffect(() => {
27
+ setMounted(true);
28
+ }, []);
29
+ const toggle = () => {
30
+ const next = !isOpen;
31
+ if (next) {
32
+ telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackCanvasOpened("overlay");
33
+ }
34
+ else {
35
+ telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackCanvasClosed("overlay");
36
+ }
37
+ onToggle();
38
+ };
39
+ const isFocused = displayMode === 'focused';
40
+ const isRight = theme.position === 'right';
41
+ const containerStyle = {
42
+ display: "flex",
43
+ flexDirection: "column",
44
+ width: isFocused ? theme.expandedWidth : theme.baseWidth,
45
+ minWidth: "320px",
46
+ height: "100%",
47
+ maxHeight: "100%",
48
+ background: isFocused
49
+ ? "linear-gradient(to top right, rgba(80, 10, 20, 0.5) 0%, rgba(12, 12, 12, 0.98) 50%, rgba(8, 8, 8, 0.99) 100%)"
50
+ : "linear-gradient(to top right, rgba(60, 8, 15, 0.6) 0%, rgba(12, 12, 12, 0.95) 45%, rgba(8, 8, 8, 0.97) 100%)",
51
+ backdropFilter: `blur(${theme.backdropBlur})`,
52
+ WebkitBackdropFilter: `blur(${theme.backdropBlur})`,
53
+ pointerEvents: "auto",
54
+ opacity: isOpen ? 1 : 0.8,
55
+ transition: "all 340ms cubic-bezier(0.16, 1, 0.3, 1)",
56
+ // Borders
57
+ border: isFocused
58
+ ? (isRight ? undefined : "1px solid rgba(255, 255, 255, 0.06)")
59
+ : "1px solid rgba(80, 20, 30, 0.4)",
60
+ borderLeft: (isFocused && isRight) ? "1px solid rgba(255, 255, 255, 0.08)" : undefined,
61
+ borderRight: (isFocused && !isRight) ? "1px solid rgba(255, 255, 255, 0.08)" : undefined,
62
+ // Rounded corners
63
+ borderRadius: isFocused ? "0" : "24px",
64
+ // Shadow
65
+ boxShadow: isFocused
66
+ ? "none"
67
+ : "0 25px 80px rgba(0, 0, 0, 0.7), inset 0 0 80px rgba(60, 8, 15, 0.15)",
68
+ // Transform logic
69
+ transform: isOpen
70
+ ? "translateX(0)"
71
+ : (isRight ? "translateX(120%)" : "translateX(-120%)")
72
+ };
73
+ const wrapperStyle = {
74
+ position: "absolute",
75
+ inset: 0,
76
+ display: "flex",
77
+ flexDirection: isRight ? "row-reverse" : "row",
78
+ alignItems: "stretch",
79
+ pointerEvents: "none",
80
+ padding: isFocused ? "0" : "1rem",
81
+ };
82
+ const content = (_jsx("div", { "data-shadow-canvas-id": "overlay-root", style: {
83
+ position: "fixed",
84
+ inset: 0,
85
+ pointerEvents: isOpen ? "auto" : "none",
86
+ zIndex: theme.zIndex,
87
+ }, children: _jsxs("div", { style: wrapperStyle, children: [_jsxs("div", { style: containerStyle, children: [!isFocused && (_jsx("header", { style: { color: "white", padding: "1.5rem 1.5rem 0" }, children: _jsx("p", { style: { margin: 0, fontSize: "0.7rem", textTransform: "uppercase", letterSpacing: "0.5em", color: "rgba(255, 255, 255, 0.6)" }, children: canvasTitle !== null && canvasTitle !== void 0 ? canvasTitle : "Smart Canvas" }) })), _jsx("div", { style: { flex: 1, overflowY: "auto", padding: isFocused ? "0" : "1.5rem" }, children: isLoading ? (_jsx("div", { style: { color: "rgba(255, 255, 255, 0.85)", padding: isFocused ? "1rem" : "0" }, children: "Loading..." })) : error ? (_jsxs("div", { style: { color: "#fecdd3", padding: isFocused ? "1rem" : "0" }, children: ["Failed to load: ", error] })) : isFocused ? (
88
+ /* Focused Mode: Render first rectangle full size */
89
+ rectangles.length > 0 ? (_jsx(RectangleCard, { config: rectangles[0], surface: "overlay", telemetry: telemetry, customRenderers: customRenderers, isExpanded: true, onToggleExpand: () => { }, style: { width: "100%", height: "100%" } })) : null) : (
90
+ /* Standard Mode: Notification Center Style Grid */
91
+ _jsx("div", { style: {
92
+ display: "grid",
93
+ gridTemplateColumns: "repeat(2, minmax(0, 1fr))",
94
+ gap: "0.625rem",
95
+ width: "100%",
96
+ }, children: rectangles.map((rectangle) => {
97
+ var _a;
98
+ const isHalf = ((_a = rectangle.size) !== null && _a !== void 0 ? _a : "half") === "quarter" || rectangle.size === "half";
99
+ const isExpanded = expandedId === rectangle.id;
100
+ return (_jsx("div", { style: {
101
+ gridColumn: isHalf && !isExpanded ? "span 1" : "span 2",
102
+ transition: "all 0.25s ease",
103
+ }, children: _jsx(RectangleCard, { config: rectangle, surface: "overlay", telemetry: telemetry, customRenderers: customRenderers, isExpanded: isExpanded, onToggleExpand: () => handleTileClick(rectangle.id), style: { width: "100%" } }) }, rectangle.id));
104
+ }) })) }), footerSlot] }), _jsx("div", { onClick: toggle, style: {
105
+ flex: "1 1 auto",
106
+ pointerEvents: isOpen ? "auto" : "none",
107
+ cursor: "default",
108
+ } })] }) }));
109
+ if (!mounted)
110
+ return null;
111
+ return (_jsxs(_Fragment, { children: [createPortal(_jsx("div", { "data-shadow-canvas-id": "overlay-launcher", style: {
112
+ position: "fixed",
113
+ inset: 0,
114
+ pointerEvents: "none",
115
+ zIndex: theme.zIndex + 47,
116
+ }, children: _jsxs("button", { onClick: toggle, "aria-label": "Toggle shadow canvas", style: {
117
+ position: "fixed",
118
+ bottom: "2.5rem",
119
+ right: isRight ? "2.5rem" : undefined,
120
+ left: !isRight ? "2.5rem" : undefined,
121
+ pointerEvents: "auto",
122
+ display: "flex",
123
+ alignItems: "center",
124
+ gap: "0.75rem",
125
+ borderRadius: "18px",
126
+ color: "white",
127
+ boxShadow: "0 20px 45px rgba(15, 23, 42, 0.35)",
128
+ transition: "transform 0.2s ease",
129
+ outline: "none",
130
+ padding: "0.65rem 1.25rem",
131
+ border: "2px solid rgba(255, 255, 255, 0.25)",
132
+ backgroundColor: "rgba(2, 6, 23, 0.8)",
133
+ backdropFilter: "blur(12px)",
134
+ cursor: "pointer",
135
+ }, onMouseEnter: (e) => (e.currentTarget.style.transform = "translateY(-2px)"), onMouseLeave: (e) => (e.currentTarget.style.transform = "translateY(0)"), children: [_jsx("div", { style: {
136
+ width: "36px",
137
+ height: "36px",
138
+ borderRadius: "12px",
139
+ background: isOpen
140
+ ? "linear-gradient(135deg, #f472b6, #ec4899)"
141
+ : "linear-gradient(135deg, #94a3b8, #0f172a)",
142
+ display: "flex",
143
+ alignItems: "center",
144
+ justifyContent: "center",
145
+ }, children: _jsx("span", { style: {
146
+ width: "14px",
147
+ height: "2px",
148
+ backgroundColor: "#fff",
149
+ display: "block",
150
+ transform: isOpen ? "rotate(45deg)" : "rotate(0)",
151
+ position: "relative",
152
+ transition: "transform 200ms ease",
153
+ }, children: !isOpen ? (_jsx("span", { style: {
154
+ position: "absolute",
155
+ top: 0,
156
+ left: 0,
157
+ width: "14px",
158
+ height: "2px",
159
+ backgroundColor: "#fff",
160
+ transform: "rotate(90deg)",
161
+ } })) : null }) }), _jsxs("div", { style: { display: "flex", flexDirection: "column", textAlign: "left" }, children: [_jsx("span", { style: { fontSize: "0.55rem", letterSpacing: "0.35em", color: "rgba(255,255,255,0.7)" }, children: isOpen ? "Hide" : "Open" }), _jsx("span", { style: { fontSize: "0.85rem", letterSpacing: "0.25em" }, children: launcherLabel })] })] }) }), document.body), isOpen ? createPortal(content, document.body) : null] }));
162
+ }
163
+ //# sourceMappingURL=ShadowCanvasOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShadowCanvasOverlay.js","sourceRoot":"","sources":["../../src/components/ShadowCanvasOverlay.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CanvasConfigFetcher } from "./types";
2
+ import type { ExperimentClient } from "./experiments/types";
3
+ export interface CanvasFetcherOptions {
4
+ configUri?: string;
5
+ experiments?: ExperimentClient;
6
+ featureKey?: string;
7
+ credentials?: RequestCredentials;
8
+ configFeatureKey?: string;
9
+ }
10
+ export declare const resolveConfigUri: ({ configUri, experiments, featureKey, }: {
11
+ configUri?: string;
12
+ experiments?: ExperimentClient;
13
+ featureKey?: string;
14
+ }) => string | undefined;
15
+ export declare const createCanvasConfigFetcher: ({ configUri, experiments, featureKey, credentials, configFeatureKey, }: CanvasFetcherOptions) => CanvasConfigFetcher;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Allowed hosts for fetching config.
3
+ * Only config from these hosts will be fetched.
4
+ */
5
+ const ALLOWED_CONFIG_HOSTS = [
6
+ 'api.syntrologie.com',
7
+ 'cdn.syntrologie.com',
8
+ 'localhost',
9
+ '127.0.0.1'
10
+ ];
11
+ /**
12
+ * Validates that a config URI is from an allowed host.
13
+ * Requires HTTPS for non-localhost URLs.
14
+ */
15
+ function validateConfigUri(uri) {
16
+ try {
17
+ const parsed = new URL(uri);
18
+ const isLocalhost = /^(localhost|127\.0\.0\.1)$/.test(parsed.hostname);
19
+ // Require HTTPS for non-localhost
20
+ if (parsed.protocol !== 'https:' && !isLocalhost) {
21
+ console.warn('[SmartCanvas] Config URI must use HTTPS:', uri);
22
+ return false;
23
+ }
24
+ // Check against allowlist
25
+ const isAllowed = ALLOWED_CONFIG_HOSTS.some(host => parsed.hostname === host);
26
+ if (!isAllowed) {
27
+ console.warn('[SmartCanvas] Config URI host not in allowlist:', parsed.hostname);
28
+ return false;
29
+ }
30
+ return true;
31
+ }
32
+ catch {
33
+ console.warn('[SmartCanvas] Invalid config URI:', uri);
34
+ return false;
35
+ }
36
+ }
37
+ /**
38
+ * Checks if a URI is same-origin with the current page.
39
+ */
40
+ function isSameOrigin(uri) {
41
+ if (typeof window === 'undefined')
42
+ return false;
43
+ try {
44
+ const parsed = new URL(uri);
45
+ return parsed.origin === window.location.origin;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ export const resolveConfigUri = ({ configUri, experiments, featureKey = "smart-canvas-config-uri", }) => {
52
+ var _a;
53
+ if (configUri)
54
+ return configUri;
55
+ const fromFeature = (_a = experiments === null || experiments === void 0 ? void 0 : experiments.getFeatureValue) === null || _a === void 0 ? void 0 : _a.call(experiments, featureKey, null);
56
+ if (fromFeature)
57
+ return fromFeature;
58
+ return undefined;
59
+ };
60
+ export const createCanvasConfigFetcher = ({ configUri, experiments, featureKey, credentials, configFeatureKey = "smart-canvas-config", }) => {
61
+ return async () => {
62
+ var _a;
63
+ // First check if we have a direct config object from experiment platform
64
+ if (experiments && configFeatureKey) {
65
+ const directConfig = (_a = experiments.getFeatureValue) === null || _a === void 0 ? void 0 : _a.call(experiments, configFeatureKey, null);
66
+ if (directConfig && typeof directConfig === 'object') {
67
+ // Return the config directly - no fetch needed
68
+ return directConfig;
69
+ }
70
+ }
71
+ // Fall back to URI-based fetching
72
+ const uri = resolveConfigUri({ configUri, experiments, featureKey });
73
+ if (!uri) {
74
+ throw new Error("SmartCanvas: config URI missing (env + feature flag unset).");
75
+ }
76
+ // Security: Validate URI against allowlist
77
+ if (!validateConfigUri(uri)) {
78
+ throw new Error(`SmartCanvas: config URI not allowed: ${uri}`);
79
+ }
80
+ // Security: Only send credentials to same-origin requests
81
+ // This prevents leaking cookies to third-party servers
82
+ const effectiveCredentials = credentials !== null && credentials !== void 0 ? credentials : (isSameOrigin(uri) ? 'include' : 'omit');
83
+ const response = await fetch(uri, { credentials: effectiveCredentials });
84
+ if (!response.ok) {
85
+ throw new Error(`SmartCanvas: failed to fetch config (${response.status})`);
86
+ }
87
+ return await response.json();
88
+ };
89
+ };
90
+ //# sourceMappingURL=configFetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configFetcher.js","sourceRoot":"","sources":["../src/configFetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface SmartCanvasState {
2
+ open: boolean;
3
+ }
4
+ export type SmartCanvasListener = (state: SmartCanvasState) => void;
5
+ export declare class SmartCanvasController {
6
+ private state;
7
+ private listeners;
8
+ constructor(initial?: Partial<SmartCanvasState>);
9
+ getState(): SmartCanvasState;
10
+ subscribe(listener: SmartCanvasListener): () => void;
11
+ setOpen(open: boolean): void;
12
+ toggle(): void;
13
+ private emit;
14
+ }
15
+ export declare const createSmartCanvasController: (initial?: Partial<SmartCanvasState>) => SmartCanvasController;
@@ -0,0 +1,34 @@
1
+ export class SmartCanvasController {
2
+ constructor(initial) {
3
+ var _a;
4
+ this.listeners = new Set();
5
+ this.state = {
6
+ open: (_a = initial === null || initial === void 0 ? void 0 : initial.open) !== null && _a !== void 0 ? _a : false,
7
+ };
8
+ }
9
+ getState() {
10
+ return this.state;
11
+ }
12
+ subscribe(listener) {
13
+ this.listeners.add(listener);
14
+ return () => {
15
+ this.listeners.delete(listener);
16
+ };
17
+ }
18
+ setOpen(open) {
19
+ if (this.state.open === open)
20
+ return;
21
+ this.state = { ...this.state, open };
22
+ this.emit();
23
+ }
24
+ toggle() {
25
+ this.setOpen(!this.state.open);
26
+ }
27
+ emit() {
28
+ for (const listener of this.listeners) {
29
+ listener(this.state);
30
+ }
31
+ }
32
+ }
33
+ export const createSmartCanvasController = (initial) => new SmartCanvasController(initial);
34
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,qBAAqB;IAIhC,YAAY,OAAmC;;QAFvC,cAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;QAGjD,IAAI,CAAC,KAAK,GAAG;YACX,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,QAA6B;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAa;QACnB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QACrC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAEO,IAAI;QACV,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAmC,EAAE,EAAE,CACjF,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Early patch application - runs before React to prevent flashing
3
+ */
4
+ import type { Patch } from './hostPatcher/core/types';
5
+ interface EarlyPatchConfig {
6
+ patches?: Patch[];
7
+ antiFlicker?: boolean;
8
+ onComplete?: () => void;
9
+ }
10
+ /**
11
+ * Revert all currently active patches
12
+ */
13
+ export declare function revertAllPatches(): void;
14
+ /**
15
+ * Apply patches immediately (synchronously) to prevent content flash
16
+ * This runs before React components are mounted
17
+ */
18
+ export declare function applyPatchesEarly(config: EarlyPatchConfig): void;
19
+ /**
20
+ * Extract patches from SDK config
21
+ */
22
+ export declare function extractPatchesFromConfig(config: any): Patch[];
23
+ export {};
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Early patch application - runs before React to prevent flashing
3
+ */
4
+ import { applyPatch, revertPatch } from './hostPatcher/core/patcher';
5
+ import { defaultPolicy } from './hostPatcher/policy/defaultPolicy';
6
+ // Track active patches so we can revert them
7
+ let activePatchIds = new Set();
8
+ /**
9
+ * Revert all currently active patches
10
+ */
11
+ export function revertAllPatches() {
12
+ activePatchIds.forEach(id => {
13
+ try {
14
+ revertPatch(id);
15
+ }
16
+ catch (e) {
17
+ console.warn(`[SmartCanvas] Failed to revert patch ${id}`, e);
18
+ }
19
+ });
20
+ activePatchIds.clear();
21
+ console.log('[SmartCanvas] Reverted all patches');
22
+ }
23
+ /**
24
+ * Apply patches immediately (synchronously) to prevent content flash
25
+ * This runs before React components are mounted
26
+ */
27
+ export function applyPatchesEarly(config) {
28
+ const { patches = [], onComplete } = config;
29
+ // Apply each patch synchronously
30
+ let appliedCount = 0;
31
+ patches.forEach(patch => {
32
+ try {
33
+ const result = applyPatch(patch, {
34
+ policy: defaultPolicy,
35
+ shadowHost: null // No shadow DOM yet, apply to main document
36
+ });
37
+ if (result.ok) {
38
+ appliedCount++;
39
+ activePatchIds.add(patch.id);
40
+ console.log(`[SmartCanvas] Early patch applied: ${patch.id}`);
41
+ }
42
+ else {
43
+ console.warn(`[SmartCanvas] Early patch failed: ${patch.id}`, result.reason);
44
+ }
45
+ }
46
+ catch (error) {
47
+ console.error(`[SmartCanvas] Error applying early patch: ${patch.id}`, error);
48
+ }
49
+ });
50
+ console.log(`[SmartCanvas] Applied ${appliedCount}/${patches.length} patches early`);
51
+ // Callback when done
52
+ if (onComplete) {
53
+ onComplete();
54
+ }
55
+ }
56
+ /**
57
+ * Extract patches from SDK config
58
+ */
59
+ export function extractPatchesFromConfig(config) {
60
+ if (!config || !config.patches)
61
+ return [];
62
+ return config.patches.map((patch, index) => ({
63
+ id: patch.id || `patch_${index}`,
64
+ anchor: patch.anchor,
65
+ operations: patch.operations || [],
66
+ invariants: patch.invariants,
67
+ tier: patch.tier || 'additive'
68
+ }));
69
+ }
70
+ //# sourceMappingURL=earlyPatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"earlyPatcher.js","sourceRoot":"","sources":["../src/earlyPatcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAQnE,6CAA6C;AAC7C,IAAI,cAAc,GAAgB,IAAI,GAAG,EAAE,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;QAC1B,IAAI,CAAC;YACH,WAAW,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,KAAK,EAAE,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAwB;IACxD,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAE5C,iCAAiC;IACjC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE;gBAC/B,MAAM,EAAE,aAAa;gBACrB,UAAU,EAAE,IAAI,CAAC,4CAA4C;aAC9D,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,YAAY,EAAE,CAAC;gBACf,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,sCAAsC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,qCAAqC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,YAAY,IAAI,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAErF,qBAAqB;IACrB,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAW;IAClD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAE1C,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;QACxD,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,SAAS,KAAK,EAAE;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QAClC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,UAAU;KAC/B,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const DEFAULT_EDITOR_URL = "https://cdn.syntrologie.com/editor-sdk/latest/editor-sdk.js";
2
+ /**
3
+ * Checks if the editor should be loaded based on URL query parameters.
4
+ * Requires editor_token parameter for security (not just syntro_editor flag).
5
+ */
6
+ export declare const shouldLoadEditor: () => boolean;
7
+ export interface EditorLoadOptions {
8
+ /** URL to load editor SDK from */
9
+ editorUrl?: string;
10
+ /** SRI hash for integrity verification (e.g., "sha384-...") */
11
+ integrity?: string;
12
+ }
13
+ /**
14
+ * Dynamically loads the Editor SDK script.
15
+ * Validates URL against allowlist and supports SRI integrity checking.
16
+ */
17
+ export declare const loadEditorSdk: (editorUrlOrOptions?: string | EditorLoadOptions) => Promise<void>;
@@ -0,0 +1,95 @@
1
+ export const DEFAULT_EDITOR_URL = "https://cdn.syntrologie.com/editor-sdk/latest/editor-sdk.js";
2
+ /**
3
+ * Allowed hosts for loading the editor SDK.
4
+ * Only scripts from these hosts will be loaded.
5
+ */
6
+ const ALLOWED_EDITOR_HOSTS = [
7
+ 'cdn.syntrologie.com',
8
+ 'localhost',
9
+ '127.0.0.1'
10
+ ];
11
+ /**
12
+ * Validates that an editor URL is from an allowed host.
13
+ * Requires HTTPS for non-localhost URLs.
14
+ */
15
+ function validateEditorUrl(url) {
16
+ try {
17
+ const parsed = new URL(url);
18
+ const isLocalhost = /^(localhost|127\.0\.0\.1)$/.test(parsed.hostname);
19
+ // Require HTTPS for non-localhost
20
+ if (parsed.protocol !== 'https:' && !isLocalhost) {
21
+ console.warn('[Syntro Runtime] Editor URL must use HTTPS:', url);
22
+ return false;
23
+ }
24
+ // Check against allowlist
25
+ const isAllowed = ALLOWED_EDITOR_HOSTS.some(host => parsed.hostname === host);
26
+ if (!isAllowed) {
27
+ console.warn('[Syntro Runtime] Editor URL host not in allowlist:', parsed.hostname);
28
+ return false;
29
+ }
30
+ return true;
31
+ }
32
+ catch {
33
+ console.warn('[Syntro Runtime] Invalid editor URL:', url);
34
+ return false;
35
+ }
36
+ }
37
+ /**
38
+ * Checks if the editor should be loaded based on URL query parameters.
39
+ * Requires editor_token parameter for security (not just syntro_editor flag).
40
+ */
41
+ export const shouldLoadEditor = () => {
42
+ if (typeof window === "undefined")
43
+ return false;
44
+ const params = new URLSearchParams(window.location.search);
45
+ // Require editor_token for security - prevents arbitrary editor activation
46
+ const hasEditorFlag = params.has("syntro_editor") || params.has("syntro-editor");
47
+ const hasEditorToken = params.has("editor_token");
48
+ if (hasEditorFlag && !hasEditorToken) {
49
+ console.warn('[Syntro Runtime] Editor activation requires editor_token parameter');
50
+ return false;
51
+ }
52
+ return hasEditorFlag && hasEditorToken;
53
+ };
54
+ /**
55
+ * Dynamically loads the Editor SDK script.
56
+ * Validates URL against allowlist and supports SRI integrity checking.
57
+ */
58
+ export const loadEditorSdk = async (editorUrlOrOptions) => {
59
+ var _a;
60
+ if (typeof window === "undefined")
61
+ return;
62
+ if (window.SyntroEditor)
63
+ return; // Already loaded
64
+ // Handle both legacy string arg and new options object
65
+ const options = typeof editorUrlOrOptions === 'string'
66
+ ? { editorUrl: editorUrlOrOptions }
67
+ : editorUrlOrOptions !== null && editorUrlOrOptions !== void 0 ? editorUrlOrOptions : {};
68
+ const editorUrl = (_a = options.editorUrl) !== null && _a !== void 0 ? _a : DEFAULT_EDITOR_URL;
69
+ // Security: Validate URL against allowlist
70
+ if (!validateEditorUrl(editorUrl)) {
71
+ console.error('[Syntro Runtime] Blocked loading editor from untrusted URL:', editorUrl);
72
+ return;
73
+ }
74
+ console.log("[Syntro Runtime] Loading Editor SDK from:", editorUrl);
75
+ return new Promise((resolve, reject) => {
76
+ const script = document.createElement("script");
77
+ script.src = editorUrl;
78
+ script.async = true;
79
+ // Add SRI integrity check if provided
80
+ if (options.integrity) {
81
+ script.integrity = options.integrity;
82
+ script.crossOrigin = "anonymous";
83
+ }
84
+ script.onload = () => {
85
+ console.log("[Syntro Runtime] Editor SDK loaded.");
86
+ resolve();
87
+ };
88
+ script.onerror = (err) => {
89
+ console.error("[Syntro Runtime] Failed to load Editor SDK:", err);
90
+ reject(err);
91
+ };
92
+ document.head.appendChild(script);
93
+ });
94
+ };
95
+ //# sourceMappingURL=editorLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorLoader.js","sourceRoot":"","sources":["../src/editorLoader.ts"],"names":[],"mappings":"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"}