@embeddables/cli 0.1.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 +116 -0
- package/bin/embeddables.mjs +2 -0
- package/dist/auth/index.d.ts +43 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +100 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +75 -0
- package/dist/commands/build-workbench.d.ts +5 -0
- package/dist/commands/build-workbench.d.ts.map +1 -0
- package/dist/commands/build-workbench.js +122 -0
- package/dist/commands/build.d.ts +7 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +22 -0
- package/dist/commands/dev.d.ts +11 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +153 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +112 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +18 -0
- package/dist/commands/pull.d.ts +7 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +97 -0
- package/dist/compiler/errors.d.ts +20 -0
- package/dist/compiler/errors.d.ts.map +1 -0
- package/dist/compiler/errors.js +35 -0
- package/dist/compiler/evalStatic.d.ts +3 -0
- package/dist/compiler/evalStatic.d.ts.map +1 -0
- package/dist/compiler/evalStatic.js +57 -0
- package/dist/compiler/flatten.js +1 -0
- package/dist/compiler/helpers/duplicateIds.d.ts +9 -0
- package/dist/compiler/helpers/duplicateIds.d.ts.map +1 -0
- package/dist/compiler/helpers/duplicateIds.js +71 -0
- package/dist/compiler/index.d.ts +16 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +934 -0
- package/dist/compiler/parsePage.d.ts +15 -0
- package/dist/compiler/parsePage.d.ts.map +1 -0
- package/dist/compiler/parsePage.js +562 -0
- package/dist/compiler/registry.d.ts +4 -0
- package/dist/compiler/registry.d.ts.map +1 -0
- package/dist/compiler/registry.js +44 -0
- package/dist/compiler/reverse.d.ts +17 -0
- package/dist/compiler/reverse.d.ts.map +1 -0
- package/dist/compiler/reverse.js +1632 -0
- package/dist/compiler/types.d.ts +21 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/compiler/types.js +1 -0
- package/dist/components/index.d.ts +21 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +21 -0
- package/dist/components/primitives/BaseComponent.d.ts +32 -0
- package/dist/components/primitives/BaseComponent.d.ts.map +1 -0
- package/dist/components/primitives/BaseComponent.js +26 -0
- package/dist/components/primitives/BookMeeting.d.ts +18 -0
- package/dist/components/primitives/BookMeeting.d.ts.map +1 -0
- package/dist/components/primitives/BookMeeting.js +5 -0
- package/dist/components/primitives/Chart.d.ts +41 -0
- package/dist/components/primitives/Chart.d.ts.map +1 -0
- package/dist/components/primitives/Chart.js +5 -0
- package/dist/components/primitives/Container.d.ts +8 -0
- package/dist/components/primitives/Container.d.ts.map +1 -0
- package/dist/components/primitives/Container.js +5 -0
- package/dist/components/primitives/CustomButton.d.ts +37 -0
- package/dist/components/primitives/CustomButton.d.ts.map +1 -0
- package/dist/components/primitives/CustomButton.js +10 -0
- package/dist/components/primitives/CustomHTML.d.ts +8 -0
- package/dist/components/primitives/CustomHTML.d.ts.map +1 -0
- package/dist/components/primitives/CustomHTML.js +5 -0
- package/dist/components/primitives/FileUpload.d.ts +18 -0
- package/dist/components/primitives/FileUpload.d.ts.map +1 -0
- package/dist/components/primitives/FileUpload.js +16 -0
- package/dist/components/primitives/InputBox.d.ts +34 -0
- package/dist/components/primitives/InputBox.d.ts.map +1 -0
- package/dist/components/primitives/InputBox.js +25 -0
- package/dist/components/primitives/Lottie.d.ts +11 -0
- package/dist/components/primitives/Lottie.d.ts.map +1 -0
- package/dist/components/primitives/Lottie.js +5 -0
- package/dist/components/primitives/MediaEmbed.d.ts +13 -0
- package/dist/components/primitives/MediaEmbed.d.ts.map +1 -0
- package/dist/components/primitives/MediaEmbed.js +6 -0
- package/dist/components/primitives/MediaImage.d.ts +8 -0
- package/dist/components/primitives/MediaImage.d.ts.map +1 -0
- package/dist/components/primitives/MediaImage.js +5 -0
- package/dist/components/primitives/OptionSelector.d.ts +35 -0
- package/dist/components/primitives/OptionSelector.d.ts.map +1 -0
- package/dist/components/primitives/OptionSelector.js +8 -0
- package/dist/components/primitives/PaypalCheckout.d.ts +25 -0
- package/dist/components/primitives/PaypalCheckout.d.ts.map +1 -0
- package/dist/components/primitives/PaypalCheckout.js +5 -0
- package/dist/components/primitives/PlainText.d.ts +6 -0
- package/dist/components/primitives/PlainText.d.ts.map +1 -0
- package/dist/components/primitives/PlainText.js +5 -0
- package/dist/components/primitives/ProgressBar.d.ts +15 -0
- package/dist/components/primitives/ProgressBar.d.ts.map +1 -0
- package/dist/components/primitives/ProgressBar.js +5 -0
- package/dist/components/primitives/RichText.d.ts +6 -0
- package/dist/components/primitives/RichText.d.ts.map +1 -0
- package/dist/components/primitives/RichText.js +5 -0
- package/dist/components/primitives/RichTextMarkdown.d.ts +6 -0
- package/dist/components/primitives/RichTextMarkdown.d.ts.map +1 -0
- package/dist/components/primitives/RichTextMarkdown.js +5 -0
- package/dist/components/primitives/Rive.d.ts +16 -0
- package/dist/components/primitives/Rive.d.ts.map +1 -0
- package/dist/components/primitives/Rive.js +8 -0
- package/dist/components/primitives/StripeCheckout.d.ts +52 -0
- package/dist/components/primitives/StripeCheckout.d.ts.map +1 -0
- package/dist/components/primitives/StripeCheckout.js +5 -0
- package/dist/components/primitives/StripeCheckout2.d.ts +30 -0
- package/dist/components/primitives/StripeCheckout2.d.ts.map +1 -0
- package/dist/components/primitives/StripeCheckout2.js +7 -0
- package/dist/proxy/injectApiInterceptor.d.ts +6 -0
- package/dist/proxy/injectApiInterceptor.d.ts.map +1 -0
- package/dist/proxy/injectApiInterceptor.js +66 -0
- package/dist/proxy/injectReload.d.ts +2 -0
- package/dist/proxy/injectReload.d.ts.map +1 -0
- package/dist/proxy/injectReload.js +14 -0
- package/dist/proxy/injectWorkbench.d.ts +4 -0
- package/dist/proxy/injectWorkbench.d.ts.map +1 -0
- package/dist/proxy/injectWorkbench.js +16 -0
- package/dist/proxy/server.d.ts +11 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +246 -0
- package/dist/proxy/sse.d.ts +5 -0
- package/dist/proxy/sse.d.ts.map +1 -0
- package/dist/proxy/sse.js +17 -0
- package/dist/types-builder.d.ts +800 -0
- package/dist/types-builder.d.ts.map +1 -0
- package/dist/types-builder.js +20 -0
- package/dist/workbench/ActionsPanel.d.ts +6 -0
- package/dist/workbench/ActionsPanel.d.ts.map +1 -0
- package/dist/workbench/ActionsPanel.js +47 -0
- package/dist/workbench/AutofillPanel.d.ts +6 -0
- package/dist/workbench/AutofillPanel.d.ts.map +1 -0
- package/dist/workbench/AutofillPanel.js +543 -0
- package/dist/workbench/ComputedFieldsPanel.d.ts +6 -0
- package/dist/workbench/ComputedFieldsPanel.d.ts.map +1 -0
- package/dist/workbench/ComputedFieldsPanel.js +31 -0
- package/dist/workbench/ExperimentsPanel.d.ts +6 -0
- package/dist/workbench/ExperimentsPanel.d.ts.map +1 -0
- package/dist/workbench/ExperimentsPanel.js +182 -0
- package/dist/workbench/FieldEditorPanel.d.ts +9 -0
- package/dist/workbench/FieldEditorPanel.d.ts.map +1 -0
- package/dist/workbench/FieldEditorPanel.js +650 -0
- package/dist/workbench/InspectorPanel.d.ts +6 -0
- package/dist/workbench/InspectorPanel.d.ts.map +1 -0
- package/dist/workbench/InspectorPanel.js +341 -0
- package/dist/workbench/PageNavigator.d.ts +6 -0
- package/dist/workbench/PageNavigator.d.ts.map +1 -0
- package/dist/workbench/PageNavigator.js +123 -0
- package/dist/workbench/SchemaPanel.d.ts +6 -0
- package/dist/workbench/SchemaPanel.d.ts.map +1 -0
- package/dist/workbench/SchemaPanel.js +222 -0
- package/dist/workbench/UserDataPanel.d.ts +6 -0
- package/dist/workbench/UserDataPanel.d.ts.map +1 -0
- package/dist/workbench/UserDataPanel.js +350 -0
- package/dist/workbench/WorkbenchApp.d.ts +6 -0
- package/dist/workbench/WorkbenchApp.d.ts.map +1 -0
- package/dist/workbench/WorkbenchApp.js +193 -0
- package/dist/workbench/cloudflare-worker/README.md +31 -0
- package/dist/workbench/cloudflare-worker/public/workbench.css +1614 -0
- package/dist/workbench/cloudflare-worker/public/workbench.js +77 -0
- package/dist/workbench/cloudflare-worker/worker.js +40 -0
- package/dist/workbench/cloudflare-worker/wrangler.toml +10 -0
- package/dist/workbench/index.d.ts +9 -0
- package/dist/workbench/index.d.ts.map +1 -0
- package/dist/workbench/index.js +44 -0
- package/dist/workbench/workbench.css +1614 -0
- package/dist/workbench/workbench.js +77 -0
- package/package.json +79 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { ActionsPanel } from './ActionsPanel.js';
|
|
4
|
+
import { AutofillPanel } from './AutofillPanel.js';
|
|
5
|
+
import { ComputedFieldsPanel } from './ComputedFieldsPanel.js';
|
|
6
|
+
import { ExperimentsPanel } from './ExperimentsPanel.js';
|
|
7
|
+
import { InspectorPanel } from './InspectorPanel.js';
|
|
8
|
+
import { PageNavigator } from './PageNavigator.js';
|
|
9
|
+
import { UserDataPanel } from './UserDataPanel.js';
|
|
10
|
+
const PREFS_STORAGE_KEY_PREFIX = 'embeddables:workbench:prefs:';
|
|
11
|
+
const MIN_WORKBENCH_HEIGHT = 140;
|
|
12
|
+
function loadPrefs(embeddableId) {
|
|
13
|
+
try {
|
|
14
|
+
const raw = window.localStorage.getItem(`${PREFS_STORAGE_KEY_PREFIX}${embeddableId}`);
|
|
15
|
+
if (!raw) {
|
|
16
|
+
return { collapsed: true, height: 260, activeTab: 'user-data' };
|
|
17
|
+
}
|
|
18
|
+
const parsed = JSON.parse(raw);
|
|
19
|
+
return {
|
|
20
|
+
collapsed: parsed.collapsed ?? true,
|
|
21
|
+
height: Math.max(MIN_WORKBENCH_HEIGHT, parsed.height ?? 260),
|
|
22
|
+
activeTab: parsed.activeTab ?? 'user-data',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { collapsed: true, height: 260, activeTab: 'user-data' };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function savePrefs(embeddableId, prefs) {
|
|
30
|
+
try {
|
|
31
|
+
window.localStorage.setItem(`${PREFS_STORAGE_KEY_PREFIX}${embeddableId}`, JSON.stringify(prefs));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// ignore
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function WorkbenchApp({ embeddableId }) {
|
|
38
|
+
const [collapsed, setCollapsed] = useState(true);
|
|
39
|
+
const [height, setHeight] = useState(260);
|
|
40
|
+
const [activeTab, setActiveTab] = useState('user-data');
|
|
41
|
+
const [isSavvyReady, setIsSavvyReady] = useState(false);
|
|
42
|
+
const dragRef = useRef(null);
|
|
43
|
+
const containerRef = useRef(null);
|
|
44
|
+
// Wait for window.Savvy to be available before rendering panels
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
const checkSavvyReady = () => {
|
|
47
|
+
const savvy = window.Savvy;
|
|
48
|
+
return !!savvy?.getUserData;
|
|
49
|
+
};
|
|
50
|
+
if (checkSavvyReady()) {
|
|
51
|
+
setIsSavvyReady(true);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Poll for Savvy availability with exponential backoff
|
|
55
|
+
let attempt = 0;
|
|
56
|
+
const maxAttempts = 20;
|
|
57
|
+
const baseDelay = 50;
|
|
58
|
+
const poll = () => {
|
|
59
|
+
if (checkSavvyReady()) {
|
|
60
|
+
setIsSavvyReady(true);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
attempt++;
|
|
64
|
+
if (attempt < maxAttempts) {
|
|
65
|
+
const delay = Math.min(baseDelay * Math.pow(1.5, attempt), 1000);
|
|
66
|
+
setTimeout(poll, delay);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const timer = setTimeout(poll, baseDelay);
|
|
70
|
+
return () => clearTimeout(timer);
|
|
71
|
+
}, []);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
const prefs = loadPrefs(embeddableId);
|
|
74
|
+
setCollapsed(prefs.collapsed);
|
|
75
|
+
setHeight(prefs.height);
|
|
76
|
+
setActiveTab(prefs.activeTab);
|
|
77
|
+
}, [embeddableId]);
|
|
78
|
+
// Update body margin to match workbench height
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
const container = containerRef.current;
|
|
81
|
+
if (!container)
|
|
82
|
+
return;
|
|
83
|
+
const updateBodyMargin = () => {
|
|
84
|
+
const workbenchHeight = container.getBoundingClientRect().height;
|
|
85
|
+
document.body.style.marginBottom = `${workbenchHeight}px`;
|
|
86
|
+
};
|
|
87
|
+
// Initial update
|
|
88
|
+
updateBodyMargin();
|
|
89
|
+
// Observe size changes
|
|
90
|
+
const resizeObserver = new ResizeObserver(updateBodyMargin);
|
|
91
|
+
resizeObserver.observe(container);
|
|
92
|
+
return () => {
|
|
93
|
+
resizeObserver.disconnect();
|
|
94
|
+
document.body.style.marginBottom = '';
|
|
95
|
+
};
|
|
96
|
+
}, []);
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
const handler = (event) => {
|
|
99
|
+
const isMac = navigator.platform.toLowerCase().includes('mac');
|
|
100
|
+
const isToggleShortcut = (isMac ? event.metaKey : event.ctrlKey) && (event.key === 'J' || event.key === 'j');
|
|
101
|
+
if (isToggleShortcut) {
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
setCollapsed((prev) => {
|
|
104
|
+
const next = !prev;
|
|
105
|
+
savePrefs(embeddableId, { collapsed: next, height, activeTab });
|
|
106
|
+
return next;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
window.addEventListener('keydown', handler);
|
|
111
|
+
return () => window.removeEventListener('keydown', handler);
|
|
112
|
+
}, [embeddableId, height, activeTab]);
|
|
113
|
+
const toggleCollapsed = () => {
|
|
114
|
+
setCollapsed((prev) => {
|
|
115
|
+
const next = !prev;
|
|
116
|
+
savePrefs(embeddableId, { collapsed: next, height, activeTab });
|
|
117
|
+
return next;
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
const switchTab = (tab) => {
|
|
121
|
+
setActiveTab(tab);
|
|
122
|
+
savePrefs(embeddableId, { collapsed, height, activeTab: tab });
|
|
123
|
+
};
|
|
124
|
+
useEffect(() => {
|
|
125
|
+
const onPointerMove = (event) => {
|
|
126
|
+
const drag = dragRef.current;
|
|
127
|
+
if (!drag || event.pointerId !== drag.pointerId)
|
|
128
|
+
return;
|
|
129
|
+
// Workbench is anchored to the bottom; dragging upward increases height.
|
|
130
|
+
const delta = drag.startY - event.clientY;
|
|
131
|
+
const max = Math.max(MIN_WORKBENCH_HEIGHT, window.innerHeight - 60);
|
|
132
|
+
const nextHeight = Math.max(MIN_WORKBENCH_HEIGHT, Math.min(max, drag.startHeight + delta));
|
|
133
|
+
setHeight(nextHeight);
|
|
134
|
+
};
|
|
135
|
+
const endDrag = (event) => {
|
|
136
|
+
const drag = dragRef.current;
|
|
137
|
+
if (!drag || event.pointerId !== drag.pointerId)
|
|
138
|
+
return;
|
|
139
|
+
dragRef.current = null;
|
|
140
|
+
try {
|
|
141
|
+
document.body.style.userSelect = '';
|
|
142
|
+
document.body.style.cursor = '';
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// ignore
|
|
146
|
+
}
|
|
147
|
+
// Persist the final height.
|
|
148
|
+
savePrefs(embeddableId, { collapsed, height, activeTab });
|
|
149
|
+
};
|
|
150
|
+
window.addEventListener('pointermove', onPointerMove);
|
|
151
|
+
window.addEventListener('pointerup', endDrag);
|
|
152
|
+
window.addEventListener('pointercancel', endDrag);
|
|
153
|
+
return () => {
|
|
154
|
+
window.removeEventListener('pointermove', onPointerMove);
|
|
155
|
+
window.removeEventListener('pointerup', endDrag);
|
|
156
|
+
window.removeEventListener('pointercancel', endDrag);
|
|
157
|
+
};
|
|
158
|
+
}, [activeTab, collapsed, embeddableId, height]);
|
|
159
|
+
return (_jsxs("div", { ref: containerRef, className: "fixed inset-x-0 bottom-0 z-2147483647 font-sans", children: [!collapsed && (_jsx("div", { role: "separator", "aria-orientation": "horizontal", title: "Drag to resize", onPointerDown: (event) => {
|
|
160
|
+
event.preventDefault();
|
|
161
|
+
event.stopPropagation();
|
|
162
|
+
dragRef.current = {
|
|
163
|
+
pointerId: event.pointerId,
|
|
164
|
+
startY: event.clientY,
|
|
165
|
+
startHeight: height,
|
|
166
|
+
};
|
|
167
|
+
try {
|
|
168
|
+
;
|
|
169
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
170
|
+
document.body.style.userSelect = 'none';
|
|
171
|
+
document.body.style.cursor = 'ns-resize';
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// ignore
|
|
175
|
+
}
|
|
176
|
+
}, onClick: (event) => {
|
|
177
|
+
// Avoid toggling collapse when clicking the drag handle.
|
|
178
|
+
event.preventDefault();
|
|
179
|
+
event.stopPropagation();
|
|
180
|
+
}, className: "absolute left-1/2 z-10 -translate-x-1/2 -top-1.5 h-3 w-16 cursor-ns-resize touch-none rounded-full border border-slate-500 bg-slate-400 shadow-md hover:bg-slate-300 transition-colors duration-200" })), _jsxs("div", { className: "relative flex items-center justify-between gap-3 border-t border-white/10 bg-slate-950/80 px-3 py-1.5 text-slate-200 shadow-2xl shadow-black/40 backdrop-blur supports-backdrop-filter:bg-slate-950/70", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("div", { className: "flex cursor-pointer items-center gap-2", onClick: toggleCollapsed, children: [_jsx("div", { className: "text-xs font-semibold tracking-wide text-slate-100", children: "Embeddables Workbench" }), _jsx("div", { className: "rounded-full bg-white/10 px-2 py-0.5 text-[10px] font-medium text-slate-200 ring-1 ring-inset ring-white/10", children: "Beta" })] }), !collapsed && (_jsxs("div", { className: "ml-8 flex items-center gap-1", children: [_jsx("button", { type: "button", onClick: () => switchTab('user-data'), className: `cursor-pointer rounded-lg px-2.5 py-1 text-[11px] font-medium transition-colors ${activeTab === 'user-data'
|
|
181
|
+
? 'bg-white/15 text-white ring-1 ring-inset ring-white/20'
|
|
182
|
+
: 'text-slate-400 hover:bg-white/5 hover:text-slate-200'}`, children: "User Data" }), _jsx("button", { type: "button", onClick: () => switchTab('experiments'), className: `cursor-pointer rounded-lg px-2.5 py-1 text-[11px] font-medium transition-colors ${activeTab === 'experiments'
|
|
183
|
+
? 'bg-white/15 text-white ring-1 ring-inset ring-white/20'
|
|
184
|
+
: 'text-slate-400 hover:bg-white/5 hover:text-slate-200'}`, children: "Experiments" }), _jsx("button", { type: "button", onClick: () => switchTab('inspector'), className: `cursor-pointer rounded-lg px-2.5 py-1 text-[11px] font-medium transition-colors ${activeTab === 'inspector'
|
|
185
|
+
? 'bg-white/15 text-white ring-1 ring-inset ring-white/20'
|
|
186
|
+
: 'text-slate-400 hover:bg-white/5 hover:text-slate-200'}`, children: "Inspect" }), _jsx("button", { type: "button", onClick: () => switchTab('autofill'), className: `cursor-pointer rounded-lg px-2.5 py-1 text-[11px] font-medium transition-colors ${activeTab === 'autofill'
|
|
187
|
+
? 'bg-white/15 text-white ring-1 ring-inset ring-white/20'
|
|
188
|
+
: 'text-slate-400 hover:bg-white/5 hover:text-slate-200'}`, children: "Autofill" }), _jsx("button", { type: "button", onClick: () => switchTab('actions'), className: `cursor-pointer rounded-lg px-2.5 py-1 text-[11px] font-medium transition-colors ${activeTab === 'actions'
|
|
189
|
+
? 'bg-white/15 text-white ring-1 ring-inset ring-white/20'
|
|
190
|
+
: 'text-slate-400 hover:bg-white/5 hover:text-slate-200'}`, children: "Actions" }), _jsx("button", { type: "button", onClick: () => switchTab('computed-fields'), className: `cursor-pointer rounded-lg px-2.5 py-1 text-[11px] font-medium transition-colors ${activeTab === 'computed-fields'
|
|
191
|
+
? 'bg-white/15 text-white ring-1 ring-inset ring-white/20'
|
|
192
|
+
: 'text-slate-400 hover:bg-white/5 hover:text-slate-200'}`, children: "Computed Fields" })] }))] }), _jsxs("div", { className: "flex items-center gap-6", children: [isSavvyReady && _jsx(PageNavigator, { embeddableId: embeddableId }), _jsxs("div", { className: "flex cursor-pointer items-center gap-2 text-slate-300", onClick: toggleCollapsed, children: [_jsxs("div", { className: "hidden text-[11px] text-slate-400 sm:block", children: [collapsed ? 'Show' : 'Hide', " \u2022", ' ', navigator.platform.toLowerCase().includes('mac') ? '⌘J' : 'Ctrl+J'] }), _jsx("div", { className: "grid h-7 w-7 place-items-center rounded-lg bg-white/5 ring-1 ring-inset ring-white/10", children: _jsx("span", { className: "text-sm leading-none", children: collapsed ? '▲' : '▼' }) })] })] })] }), !collapsed && (_jsx("div", { className: "flex flex-col border-t border-white/10 bg-slate-950/70 px-3 py-3 text-slate-200 shadow-2xl shadow-black/40 backdrop-blur supports-backdrop-filter:bg-slate-950/60", style: { height }, children: !isSavvyReady ? (_jsx("div", { className: "flex h-full items-center justify-center", children: _jsx("div", { className: "text-sm text-slate-400", children: "Waiting for embeddable to initialize..." }) })) : (_jsxs(_Fragment, { children: [activeTab === 'user-data' && _jsx(UserDataPanel, { embeddableId: embeddableId }), activeTab === 'experiments' && _jsx(ExperimentsPanel, { embeddableId: embeddableId }), activeTab === 'inspector' && _jsx(InspectorPanel, { embeddableId: embeddableId }), activeTab === 'autofill' && _jsx(AutofillPanel, { embeddableId: embeddableId }), activeTab === 'actions' && _jsx(ActionsPanel, { embeddableId: embeddableId }), activeTab === 'computed-fields' && (_jsx(ComputedFieldsPanel, { embeddableId: embeddableId }))] })) }))] }));
|
|
193
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Embeddables Workbench - Cloudflare Worker
|
|
2
|
+
|
|
3
|
+
## Deploy
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx wrangler login # One-time
|
|
7
|
+
npx wrangler deploy
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Assets
|
|
11
|
+
|
|
12
|
+
- `public/workbench.js` - Main bundle
|
|
13
|
+
- `public/workbench.css` - Styles
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
Add `?workbench=true` to any engine preview URL:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
https://engine.embeddables.com/preview/<id>?workbench=true
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The engine will inject the workbench from this CDN.
|
|
24
|
+
|
|
25
|
+
## Update
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx embeddables build-workbench
|
|
29
|
+
cd dist/workbench/cloudflare-worker
|
|
30
|
+
npx wrangler deploy
|
|
31
|
+
```
|