@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.
Files changed (173) hide show
  1. package/README.md +116 -0
  2. package/bin/embeddables.mjs +2 -0
  3. package/dist/auth/index.d.ts +43 -0
  4. package/dist/auth/index.d.ts.map +1 -0
  5. package/dist/auth/index.js +100 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +75 -0
  9. package/dist/commands/build-workbench.d.ts +5 -0
  10. package/dist/commands/build-workbench.d.ts.map +1 -0
  11. package/dist/commands/build-workbench.js +122 -0
  12. package/dist/commands/build.d.ts +7 -0
  13. package/dist/commands/build.d.ts.map +1 -0
  14. package/dist/commands/build.js +22 -0
  15. package/dist/commands/dev.d.ts +11 -0
  16. package/dist/commands/dev.d.ts.map +1 -0
  17. package/dist/commands/dev.js +153 -0
  18. package/dist/commands/login.d.ts +2 -0
  19. package/dist/commands/login.d.ts.map +1 -0
  20. package/dist/commands/login.js +112 -0
  21. package/dist/commands/logout.d.ts +2 -0
  22. package/dist/commands/logout.d.ts.map +1 -0
  23. package/dist/commands/logout.js +18 -0
  24. package/dist/commands/pull.d.ts +7 -0
  25. package/dist/commands/pull.d.ts.map +1 -0
  26. package/dist/commands/pull.js +97 -0
  27. package/dist/compiler/errors.d.ts +20 -0
  28. package/dist/compiler/errors.d.ts.map +1 -0
  29. package/dist/compiler/errors.js +35 -0
  30. package/dist/compiler/evalStatic.d.ts +3 -0
  31. package/dist/compiler/evalStatic.d.ts.map +1 -0
  32. package/dist/compiler/evalStatic.js +57 -0
  33. package/dist/compiler/flatten.js +1 -0
  34. package/dist/compiler/helpers/duplicateIds.d.ts +9 -0
  35. package/dist/compiler/helpers/duplicateIds.d.ts.map +1 -0
  36. package/dist/compiler/helpers/duplicateIds.js +71 -0
  37. package/dist/compiler/index.d.ts +16 -0
  38. package/dist/compiler/index.d.ts.map +1 -0
  39. package/dist/compiler/index.js +934 -0
  40. package/dist/compiler/parsePage.d.ts +15 -0
  41. package/dist/compiler/parsePage.d.ts.map +1 -0
  42. package/dist/compiler/parsePage.js +562 -0
  43. package/dist/compiler/registry.d.ts +4 -0
  44. package/dist/compiler/registry.d.ts.map +1 -0
  45. package/dist/compiler/registry.js +44 -0
  46. package/dist/compiler/reverse.d.ts +17 -0
  47. package/dist/compiler/reverse.d.ts.map +1 -0
  48. package/dist/compiler/reverse.js +1632 -0
  49. package/dist/compiler/types.d.ts +21 -0
  50. package/dist/compiler/types.d.ts.map +1 -0
  51. package/dist/compiler/types.js +1 -0
  52. package/dist/components/index.d.ts +21 -0
  53. package/dist/components/index.d.ts.map +1 -0
  54. package/dist/components/index.js +21 -0
  55. package/dist/components/primitives/BaseComponent.d.ts +32 -0
  56. package/dist/components/primitives/BaseComponent.d.ts.map +1 -0
  57. package/dist/components/primitives/BaseComponent.js +26 -0
  58. package/dist/components/primitives/BookMeeting.d.ts +18 -0
  59. package/dist/components/primitives/BookMeeting.d.ts.map +1 -0
  60. package/dist/components/primitives/BookMeeting.js +5 -0
  61. package/dist/components/primitives/Chart.d.ts +41 -0
  62. package/dist/components/primitives/Chart.d.ts.map +1 -0
  63. package/dist/components/primitives/Chart.js +5 -0
  64. package/dist/components/primitives/Container.d.ts +8 -0
  65. package/dist/components/primitives/Container.d.ts.map +1 -0
  66. package/dist/components/primitives/Container.js +5 -0
  67. package/dist/components/primitives/CustomButton.d.ts +37 -0
  68. package/dist/components/primitives/CustomButton.d.ts.map +1 -0
  69. package/dist/components/primitives/CustomButton.js +10 -0
  70. package/dist/components/primitives/CustomHTML.d.ts +8 -0
  71. package/dist/components/primitives/CustomHTML.d.ts.map +1 -0
  72. package/dist/components/primitives/CustomHTML.js +5 -0
  73. package/dist/components/primitives/FileUpload.d.ts +18 -0
  74. package/dist/components/primitives/FileUpload.d.ts.map +1 -0
  75. package/dist/components/primitives/FileUpload.js +16 -0
  76. package/dist/components/primitives/InputBox.d.ts +34 -0
  77. package/dist/components/primitives/InputBox.d.ts.map +1 -0
  78. package/dist/components/primitives/InputBox.js +25 -0
  79. package/dist/components/primitives/Lottie.d.ts +11 -0
  80. package/dist/components/primitives/Lottie.d.ts.map +1 -0
  81. package/dist/components/primitives/Lottie.js +5 -0
  82. package/dist/components/primitives/MediaEmbed.d.ts +13 -0
  83. package/dist/components/primitives/MediaEmbed.d.ts.map +1 -0
  84. package/dist/components/primitives/MediaEmbed.js +6 -0
  85. package/dist/components/primitives/MediaImage.d.ts +8 -0
  86. package/dist/components/primitives/MediaImage.d.ts.map +1 -0
  87. package/dist/components/primitives/MediaImage.js +5 -0
  88. package/dist/components/primitives/OptionSelector.d.ts +35 -0
  89. package/dist/components/primitives/OptionSelector.d.ts.map +1 -0
  90. package/dist/components/primitives/OptionSelector.js +8 -0
  91. package/dist/components/primitives/PaypalCheckout.d.ts +25 -0
  92. package/dist/components/primitives/PaypalCheckout.d.ts.map +1 -0
  93. package/dist/components/primitives/PaypalCheckout.js +5 -0
  94. package/dist/components/primitives/PlainText.d.ts +6 -0
  95. package/dist/components/primitives/PlainText.d.ts.map +1 -0
  96. package/dist/components/primitives/PlainText.js +5 -0
  97. package/dist/components/primitives/ProgressBar.d.ts +15 -0
  98. package/dist/components/primitives/ProgressBar.d.ts.map +1 -0
  99. package/dist/components/primitives/ProgressBar.js +5 -0
  100. package/dist/components/primitives/RichText.d.ts +6 -0
  101. package/dist/components/primitives/RichText.d.ts.map +1 -0
  102. package/dist/components/primitives/RichText.js +5 -0
  103. package/dist/components/primitives/RichTextMarkdown.d.ts +6 -0
  104. package/dist/components/primitives/RichTextMarkdown.d.ts.map +1 -0
  105. package/dist/components/primitives/RichTextMarkdown.js +5 -0
  106. package/dist/components/primitives/Rive.d.ts +16 -0
  107. package/dist/components/primitives/Rive.d.ts.map +1 -0
  108. package/dist/components/primitives/Rive.js +8 -0
  109. package/dist/components/primitives/StripeCheckout.d.ts +52 -0
  110. package/dist/components/primitives/StripeCheckout.d.ts.map +1 -0
  111. package/dist/components/primitives/StripeCheckout.js +5 -0
  112. package/dist/components/primitives/StripeCheckout2.d.ts +30 -0
  113. package/dist/components/primitives/StripeCheckout2.d.ts.map +1 -0
  114. package/dist/components/primitives/StripeCheckout2.js +7 -0
  115. package/dist/proxy/injectApiInterceptor.d.ts +6 -0
  116. package/dist/proxy/injectApiInterceptor.d.ts.map +1 -0
  117. package/dist/proxy/injectApiInterceptor.js +66 -0
  118. package/dist/proxy/injectReload.d.ts +2 -0
  119. package/dist/proxy/injectReload.d.ts.map +1 -0
  120. package/dist/proxy/injectReload.js +14 -0
  121. package/dist/proxy/injectWorkbench.d.ts +4 -0
  122. package/dist/proxy/injectWorkbench.d.ts.map +1 -0
  123. package/dist/proxy/injectWorkbench.js +16 -0
  124. package/dist/proxy/server.d.ts +11 -0
  125. package/dist/proxy/server.d.ts.map +1 -0
  126. package/dist/proxy/server.js +246 -0
  127. package/dist/proxy/sse.d.ts +5 -0
  128. package/dist/proxy/sse.d.ts.map +1 -0
  129. package/dist/proxy/sse.js +17 -0
  130. package/dist/types-builder.d.ts +800 -0
  131. package/dist/types-builder.d.ts.map +1 -0
  132. package/dist/types-builder.js +20 -0
  133. package/dist/workbench/ActionsPanel.d.ts +6 -0
  134. package/dist/workbench/ActionsPanel.d.ts.map +1 -0
  135. package/dist/workbench/ActionsPanel.js +47 -0
  136. package/dist/workbench/AutofillPanel.d.ts +6 -0
  137. package/dist/workbench/AutofillPanel.d.ts.map +1 -0
  138. package/dist/workbench/AutofillPanel.js +543 -0
  139. package/dist/workbench/ComputedFieldsPanel.d.ts +6 -0
  140. package/dist/workbench/ComputedFieldsPanel.d.ts.map +1 -0
  141. package/dist/workbench/ComputedFieldsPanel.js +31 -0
  142. package/dist/workbench/ExperimentsPanel.d.ts +6 -0
  143. package/dist/workbench/ExperimentsPanel.d.ts.map +1 -0
  144. package/dist/workbench/ExperimentsPanel.js +182 -0
  145. package/dist/workbench/FieldEditorPanel.d.ts +9 -0
  146. package/dist/workbench/FieldEditorPanel.d.ts.map +1 -0
  147. package/dist/workbench/FieldEditorPanel.js +650 -0
  148. package/dist/workbench/InspectorPanel.d.ts +6 -0
  149. package/dist/workbench/InspectorPanel.d.ts.map +1 -0
  150. package/dist/workbench/InspectorPanel.js +341 -0
  151. package/dist/workbench/PageNavigator.d.ts +6 -0
  152. package/dist/workbench/PageNavigator.d.ts.map +1 -0
  153. package/dist/workbench/PageNavigator.js +123 -0
  154. package/dist/workbench/SchemaPanel.d.ts +6 -0
  155. package/dist/workbench/SchemaPanel.d.ts.map +1 -0
  156. package/dist/workbench/SchemaPanel.js +222 -0
  157. package/dist/workbench/UserDataPanel.d.ts +6 -0
  158. package/dist/workbench/UserDataPanel.d.ts.map +1 -0
  159. package/dist/workbench/UserDataPanel.js +350 -0
  160. package/dist/workbench/WorkbenchApp.d.ts +6 -0
  161. package/dist/workbench/WorkbenchApp.d.ts.map +1 -0
  162. package/dist/workbench/WorkbenchApp.js +193 -0
  163. package/dist/workbench/cloudflare-worker/README.md +31 -0
  164. package/dist/workbench/cloudflare-worker/public/workbench.css +1614 -0
  165. package/dist/workbench/cloudflare-worker/public/workbench.js +77 -0
  166. package/dist/workbench/cloudflare-worker/worker.js +40 -0
  167. package/dist/workbench/cloudflare-worker/wrangler.toml +10 -0
  168. package/dist/workbench/index.d.ts +9 -0
  169. package/dist/workbench/index.d.ts.map +1 -0
  170. package/dist/workbench/index.js +44 -0
  171. package/dist/workbench/workbench.css +1614 -0
  172. package/dist/workbench/workbench.js +77 -0
  173. 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
+ ```