Skip to content

Commit 189dab5

Browse files
committed
feat: add animation components, expand widget configuration schema, and implement embed and dashboard pages
1 parent 343fd21 commit 189dab5

8 files changed

Lines changed: 1580 additions & 295 deletions

File tree

public/widget.js

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
return;
99
}
1010

11+
const initialTheme = script.getAttribute("data-theme") || "light";
12+
1113
// Known widget domain determined from script source or current origin
1214
const scriptUrl = new URL(script.src);
1315
const widgetHost = scriptUrl.origin;
@@ -18,7 +20,12 @@
1820
container.style.overflow = "hidden";
1921

2022
const iframe = document.createElement("iframe");
21-
iframe.src = `${widgetHost}/embed/${encodeURIComponent(widgetSlug)}`;
23+
const embedUrl = new URL(`${widgetHost}/embed/${encodeURIComponent(widgetSlug)}`);
24+
if (initialTheme) {
25+
embedUrl.searchParams.set("theme", initialTheme);
26+
}
27+
iframe.src = embedUrl.toString();
28+
2229
// Strict sandboxing: allow-scripts, allow-same-origin, and allow-popups for verification page links
2330
iframe.setAttribute("sandbox", "allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox");
2431
iframe.style.width = "100%";
@@ -30,13 +37,22 @@
3037
container.appendChild(iframe);
3138
script.parentNode.insertBefore(container, script.nextSibling);
3239

33-
// Listen strictly for auto-resize postMessage from widget domain
40+
// Listen for auto-resize postMessage from widget domain & host-page live theme updates
3441
window.addEventListener("message", function (event) {
35-
// Validate event.origin against the expected widget serving domain!
36-
if (event.origin !== widgetHost) return;
37-
38-
if (event.data && event.data.type === "clientecho-resize" && typeof event.data.height === "number") {
42+
// Resize message sent from iframe
43+
if (event.origin === widgetHost && event.data && event.data.type === "clientecho-resize" && typeof event.data.height === "number") {
3944
iframe.style.height = `${Math.max(150, event.data.height)}px`;
4045
}
46+
47+
// Host page theme change notification (relay to iframe)
48+
if (event.data && event.data.type === "clientecho-set-theme" && typeof event.data.theme === "string") {
49+
if (iframe.contentWindow) {
50+
iframe.contentWindow.postMessage(
51+
{ type: "clientecho-set-theme", theme: event.data.theme },
52+
"*"
53+
);
54+
}
55+
}
4156
});
4257
})();
58+

src/app/(dashboard)/widgets/page.tsx

Lines changed: 510 additions & 138 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)