@embeddables/cli 0.15.0-beta.0 → 0.15.1-beta.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 (102) hide show
  1. package/.prompts/custom/build-funnel.md +1 -1
  2. package/.prompts/embeddables-cli.md +1 -1
  3. package/.prompts/short-rule-body.md +2 -2
  4. package/dist/commands/dev.d.ts.map +1 -1
  5. package/dist/commands/dev.js +3 -0
  6. package/dist/commands/dev.js.map +1 -1
  7. package/dist/commands/inspect.d.ts.map +1 -1
  8. package/dist/commands/inspect.js +24 -16
  9. package/dist/commands/inspect.js.map +1 -1
  10. package/dist/commands/pull.d.ts.map +1 -1
  11. package/dist/commands/pull.js +20 -59
  12. package/dist/commands/pull.js.map +1 -1
  13. package/dist/commands/save.js +8 -1
  14. package/dist/commands/save.js.map +1 -1
  15. package/dist/commands/update-project-files.d.ts.map +1 -1
  16. package/dist/commands/update-project-files.js +45 -26
  17. package/dist/commands/update-project-files.js.map +1 -1
  18. package/dist/compiler/errors.d.ts +13 -0
  19. package/dist/compiler/errors.d.ts.map +1 -1
  20. package/dist/compiler/errors.js +16 -0
  21. package/dist/compiler/errors.js.map +1 -1
  22. package/dist/compiler/reverse.d.ts.map +1 -1
  23. package/dist/compiler/reverse.js +8 -7
  24. package/dist/compiler/reverse.js.map +1 -1
  25. package/dist/constants.d.ts +8 -1
  26. package/dist/constants.d.ts.map +1 -1
  27. package/dist/constants.js +9 -1
  28. package/dist/constants.js.map +1 -1
  29. package/dist/helpers/reverseCompileWithRetry.d.ts +60 -0
  30. package/dist/helpers/reverseCompileWithRetry.d.ts.map +1 -0
  31. package/dist/helpers/reverseCompileWithRetry.js +96 -0
  32. package/dist/helpers/reverseCompileWithRetry.js.map +1 -0
  33. package/dist/proxy/injectWorkbench.d.ts +4 -0
  34. package/dist/proxy/injectWorkbench.d.ts.map +1 -1
  35. package/dist/proxy/injectWorkbench.js +5 -1
  36. package/dist/proxy/injectWorkbench.js.map +1 -1
  37. package/dist/proxy/server.d.ts +1 -0
  38. package/dist/proxy/server.d.ts.map +1 -1
  39. package/dist/proxy/server.js +12 -0
  40. package/dist/proxy/server.js.map +1 -1
  41. package/dist/workbench/FeedbackPanel.d.ts +4 -0
  42. package/dist/workbench/FeedbackPanel.d.ts.map +1 -1
  43. package/dist/workbench/FeedbackPanel.js +924 -57
  44. package/dist/workbench/FeedbackPanel.js.map +1 -1
  45. package/dist/workbench/FieldEditorPanel.d.ts.map +1 -1
  46. package/dist/workbench/FieldEditorPanel.js +3 -2
  47. package/dist/workbench/FieldEditorPanel.js.map +1 -1
  48. package/dist/workbench/InspectorPanel.d.ts.map +1 -1
  49. package/dist/workbench/InspectorPanel.js +3 -172
  50. package/dist/workbench/InspectorPanel.js.map +1 -1
  51. package/dist/workbench/MediaLightbox.d.ts +20 -0
  52. package/dist/workbench/MediaLightbox.d.ts.map +1 -0
  53. package/dist/workbench/MediaLightbox.js +76 -0
  54. package/dist/workbench/MediaLightbox.js.map +1 -0
  55. package/dist/workbench/WorkbenchApp.d.ts +8 -1
  56. package/dist/workbench/WorkbenchApp.d.ts.map +1 -1
  57. package/dist/workbench/WorkbenchApp.js +14 -5
  58. package/dist/workbench/WorkbenchApp.js.map +1 -1
  59. package/dist/workbench/WorkbenchModalOverlay.d.ts +20 -0
  60. package/dist/workbench/WorkbenchModalOverlay.d.ts.map +1 -0
  61. package/dist/workbench/WorkbenchModalOverlay.js +45 -0
  62. package/dist/workbench/WorkbenchModalOverlay.js.map +1 -0
  63. package/dist/workbench/feedbackSessionsStorage.d.ts +24 -0
  64. package/dist/workbench/feedbackSessionsStorage.d.ts.map +1 -0
  65. package/dist/workbench/feedbackSessionsStorage.js +80 -0
  66. package/dist/workbench/feedbackSessionsStorage.js.map +1 -0
  67. package/dist/workbench/index.d.ts +4 -0
  68. package/dist/workbench/index.d.ts.map +1 -1
  69. package/dist/workbench/index.js +42 -2
  70. package/dist/workbench/index.js.map +1 -1
  71. package/dist/workbench/stringUtils.d.ts +6 -0
  72. package/dist/workbench/stringUtils.d.ts.map +1 -0
  73. package/dist/workbench/stringUtils.js +24 -0
  74. package/dist/workbench/stringUtils.js.map +1 -0
  75. package/dist/workbench/workbenchShadowPortal.d.ts +4 -0
  76. package/dist/workbench/workbenchShadowPortal.d.ts.map +1 -0
  77. package/dist/workbench/workbenchShadowPortal.js +18 -0
  78. package/dist/workbench/workbenchShadowPortal.js.map +1 -0
  79. package/package.json +6 -1
  80. package/dist/commands/build-workbench.d.ts +0 -5
  81. package/dist/commands/build-workbench.d.ts.map +0 -1
  82. package/dist/commands/build-workbench.js +0 -117
  83. package/dist/commands/build-workbench.js.map +0 -1
  84. package/dist/compiler/flatten.js +0 -1
  85. package/dist/helpers/TEMP helpers file.d.ts +0 -1
  86. package/dist/helpers/TEMP helpers file.d.ts.map +0 -1
  87. package/dist/helpers/TEMP helpers file.js +0 -1
  88. package/dist/workbench/PageThumbnailStrip.d.ts +0 -6
  89. package/dist/workbench/PageThumbnailStrip.d.ts.map +0 -1
  90. package/dist/workbench/PageThumbnailStrip.js +0 -124
  91. package/dist/workbench/PageThumbnailStrip.js.map +0 -1
  92. package/dist/workbench/cloudflare-worker/README.md +0 -31
  93. package/dist/workbench/cloudflare-worker/public/workbench.css +0 -1614
  94. package/dist/workbench/cloudflare-worker/public/workbench.js +0 -77
  95. package/dist/workbench/cloudflare-worker/worker.js +0 -40
  96. package/dist/workbench/cloudflare-worker/wrangler.toml +0 -10
  97. package/dist/workbench/types.d.ts +0 -25
  98. package/dist/workbench/types.d.ts.map +0 -1
  99. package/dist/workbench/types.js +0 -2
  100. package/dist/workbench/types.js.map +0 -1
  101. package/dist/workbench/workbench.css +0 -1614
  102. package/dist/workbench/workbench.js +0 -77
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Format a component type for display: PascalCase → Title Case.
3
+ * Spaced phrases (e.g. "Multiple Types") are normalized to title case per word.
4
+ */
5
+ export function pascalCaseToTitleCase(raw) {
6
+ const s = raw.trim();
7
+ if (!s)
8
+ return s;
9
+ if (/\s/.test(s)) {
10
+ return s
11
+ .split(/\s+/)
12
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
13
+ .join(' ');
14
+ }
15
+ const spaced = s
16
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
17
+ .replace(/([a-z\d])([A-Z])/g, '$1 $2');
18
+ return spaced
19
+ .split(/\s+/)
20
+ .filter(Boolean)
21
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
22
+ .join(' ');
23
+ }
24
+ //# sourceMappingURL=stringUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringUtils.js","sourceRoot":"","sources":["../../src/workbench/stringUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACpB,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAChB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC;aACL,KAAK,CAAC,KAAK,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAChE,IAAI,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IACD,MAAM,MAAM,GAAG,CAAC;SACb,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;IACxC,OAAO,MAAM;SACV,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAChE,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Target for portaled UI that must use Tailwind utilities (scoped under `:host` in shadow CSS). */
2
+ export declare const WORKBENCH_SHADOW_PORTAL_ID = "__embeddables_workbench_portal";
3
+ export declare function getWorkbenchShadowPortal(): HTMLElement | null;
4
+ //# sourceMappingURL=workbenchShadowPortal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbenchShadowPortal.d.ts","sourceRoot":"","sources":["../../src/workbench/workbenchShadowPortal.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,eAAO,MAAM,0BAA0B,mCAAmC,CAAA;AAE1E,wBAAgB,wBAAwB,IAAI,WAAW,GAAG,IAAI,CAY7D"}
@@ -0,0 +1,18 @@
1
+ /** Target for portaled UI that must use Tailwind utilities (scoped under `:host` in shadow CSS). */
2
+ export const WORKBENCH_SHADOW_PORTAL_ID = '__embeddables_workbench_portal';
3
+ export function getWorkbenchShadowPortal() {
4
+ if (typeof document === 'undefined')
5
+ return null;
6
+ const host = document.getElementById('__embeddables_workbench_root');
7
+ const sr = host?.shadowRoot;
8
+ if (!sr)
9
+ return null;
10
+ let el = sr.getElementById(WORKBENCH_SHADOW_PORTAL_ID);
11
+ if (!el) {
12
+ el = document.createElement('div');
13
+ el.id = WORKBENCH_SHADOW_PORTAL_ID;
14
+ sr.appendChild(el);
15
+ }
16
+ return el;
17
+ }
18
+ //# sourceMappingURL=workbenchShadowPortal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbenchShadowPortal.js","sourceRoot":"","sources":["../../src/workbench/workbenchShadowPortal.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,MAAM,CAAC,MAAM,0BAA0B,GAAG,gCAAgC,CAAA;AAE1E,MAAM,UAAU,wBAAwB;IACtC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAA;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAA;IACpE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,CAAA;IAC3B,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAA;IACpB,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAA;IACtD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAClC,EAAE,CAAC,EAAE,GAAG,0BAA0B,CAAA;QAClC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embeddables/cli",
3
- "version": "0.15.0-beta.0",
3
+ "version": "0.15.1-beta.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "embeddables": "./bin/embeddables.mjs"
@@ -52,6 +52,9 @@
52
52
  "@babel/generator": "^7.28.6",
53
53
  "@babel/parser": "^7.26.0",
54
54
  "@babel/traverse": "^7.26.0",
55
+ "@fortawesome/fontawesome-svg-core": "^7.2.0",
56
+ "@fortawesome/free-solid-svg-icons": "^7.2.0",
57
+ "@fortawesome/react-fontawesome": "^3.3.0",
55
58
  "@sentry/node": "^10.39.0",
56
59
  "@supabase/supabase-js": "^2.39.0",
57
60
  "@tailwindcss/postcss": "^4.1.18",
@@ -63,6 +66,7 @@
63
66
  "esbuild": "^0.25.0",
64
67
  "express": "^4.19.2",
65
68
  "fast-glob": "^3.3.2",
69
+ "html2canvas": "^1.4.1",
66
70
  "http-proxy-middleware": "^3.0.3",
67
71
  "log-symbols": "^7.0.1",
68
72
  "ora": "^9.3.0",
@@ -79,6 +83,7 @@
79
83
  "@types/node": "^22.10.0",
80
84
  "@types/prompts": "^2.4.9",
81
85
  "@types/react": "^19.2.8",
86
+ "@types/react-dom": "^19.2.3",
82
87
  "@vitest/coverage-v8": "^2.1.8",
83
88
  "prettier": "^3.8.1",
84
89
  "tailwindcss": "^4.1.18",
@@ -1,5 +0,0 @@
1
- export declare function runBuildWorkbench(opts: {
2
- out?: string;
3
- minify?: boolean;
4
- }): Promise<void>;
5
- //# sourceMappingURL=build-workbench.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-workbench.d.ts","sourceRoot":"","sources":["../../src/commands/build-workbench.ts"],"names":[],"mappings":"AASA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,iBA4H/E"}
@@ -1,117 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import * as esbuild from 'esbuild';
4
- import postcss from 'postcss';
5
- import tailwindcss from '@tailwindcss/postcss';
6
- import autoprefixer from 'autoprefixer';
7
- import { createLogger, exit } from '../logger.js';
8
- import * as stdout from '../stdout.js';
9
- export async function runBuildWorkbench(opts) {
10
- const logger = createLogger('runBuildWorkbench');
11
- const outDir = opts.out || 'dist/workbench';
12
- const shouldMinify = opts.minify ?? true;
13
- // Check if wrangler config exists in outDir (native Cloudflare Git integration mode)
14
- const hasWranglerConfig = fs.existsSync(path.join(outDir, 'wrangler.jsonc')) ||
15
- fs.existsSync(path.join(outDir, 'wrangler.toml'));
16
- stdout.step('Building Workbench for CDN deployment…');
17
- stdout.gap();
18
- // Ensure output directory exists
19
- fs.mkdirSync(outDir, { recursive: true });
20
- const workbenchEntry = path.join(process.cwd(), 'src', 'workbench', 'index.tsx');
21
- const workbenchCssEntry = path.join(process.cwd(), 'src', 'workbench', 'workbench.css');
22
- // Check that source files exist
23
- if (!fs.existsSync(workbenchEntry)) {
24
- stdout.error(`Workbench entry not found: ${workbenchEntry}`);
25
- logger.error('workbench entry not found', { path: workbenchEntry });
26
- await exit(1);
27
- }
28
- if (!fs.existsSync(workbenchCssEntry)) {
29
- stdout.error(`Workbench CSS not found: ${workbenchCssEntry}`);
30
- logger.error('workbench css not found', { path: workbenchCssEntry });
31
- await exit(1);
32
- }
33
- // Build JavaScript bundle
34
- const jsResult = await stdout.withSpinner('Building JavaScript bundle…', async () => {
35
- return esbuild.build({
36
- entryPoints: [workbenchEntry],
37
- bundle: true,
38
- format: 'iife',
39
- globalName: '__EmbeddablesWorkbenchBundle',
40
- platform: 'browser',
41
- minify: shouldMinify,
42
- sourcemap: shouldMinify ? false : 'inline',
43
- write: false,
44
- target: ['es2020', 'chrome80', 'firefox78', 'safari14'],
45
- });
46
- }, { successText: 'JavaScript bundle built' });
47
- const jsOutput = jsResult.outputFiles?.[0];
48
- if (!jsOutput) {
49
- stdout.error('Failed to build JavaScript bundle');
50
- logger.error('workbench js bundle build failed');
51
- await exit(1);
52
- }
53
- // Build CSS
54
- const cssResult = await stdout.withSpinner('Building CSS…', async () => {
55
- const rawCss = fs.readFileSync(workbenchCssEntry, 'utf8');
56
- return postcss([tailwindcss(), autoprefixer]).process(rawCss, {
57
- from: workbenchCssEntry,
58
- });
59
- }, { successText: 'CSS built' });
60
- // CORS headers file for Cloudflare static assets
61
- const headersContent = `/*
62
- Access-Control-Allow-Origin: *
63
- Access-Control-Allow-Methods: GET, OPTIONS
64
- Access-Control-Allow-Headers: Content-Type
65
- `;
66
- if (hasWranglerConfig) {
67
- // Native Cloudflare Git integration mode:
68
- // Output directly to outDir/public
69
- const publicDir = path.join(outDir, 'public');
70
- fs.mkdirSync(publicDir, { recursive: true });
71
- fs.writeFileSync(path.join(publicDir, 'workbench.js'), jsOutput.contents);
72
- const jsSize = (jsOutput.contents.length / 1024).toFixed(1);
73
- fs.writeFileSync(path.join(publicDir, 'workbench.css'), cssResult.css);
74
- const cssSize = (cssResult.css.length / 1024).toFixed(1);
75
- fs.writeFileSync(path.join(publicDir, '_headers'), headersContent);
76
- stdout.success(`Build complete (JS: ${jsSize} KB, CSS: ${cssSize} KB)`);
77
- stdout.dim('Using existing wrangler.toml for Cloudflare Git integration');
78
- }
79
- else {
80
- // Standalone mode: output to outDir with nested cloudflare-worker folder
81
- const jsPath = path.join(outDir, 'workbench.js');
82
- fs.writeFileSync(jsPath, jsOutput.contents);
83
- const jsSize = (jsOutput.contents.length / 1024).toFixed(1);
84
- const cssPath = path.join(outDir, 'workbench.css');
85
- fs.writeFileSync(cssPath, cssResult.css);
86
- const cssSize = (cssResult.css.length / 1024).toFixed(1);
87
- // Generate Cloudflare static site files
88
- const workerDir = path.join(outDir, 'cloudflare');
89
- fs.mkdirSync(workerDir, { recursive: true });
90
- const wranglerConfig = generateWranglerConfig();
91
- fs.writeFileSync(path.join(workerDir, 'wrangler.jsonc'), wranglerConfig);
92
- const publicDir = path.join(workerDir, 'public');
93
- fs.mkdirSync(publicDir, { recursive: true });
94
- fs.copyFileSync(jsPath, path.join(publicDir, 'workbench.js'));
95
- fs.copyFileSync(cssPath, path.join(publicDir, 'workbench.css'));
96
- fs.writeFileSync(path.join(publicDir, '_headers'), headersContent);
97
- stdout.success(`Build complete (JS: ${jsSize} KB, CSS: ${cssSize} KB)`);
98
- stdout.gap();
99
- stdout.dim(`Deploy: cd ${workerDir} && npx wrangler deploy`);
100
- }
101
- stdout.gap();
102
- stdout.dim('Usage: Add ?workbench=true to any engine preview URL');
103
- stdout.gap();
104
- }
105
- function generateWranglerConfig() {
106
- return `{
107
- // Embeddables Workbench - Static Assets
108
- // Deploy: npx wrangler deploy
109
- "name": "embeddables-workbench",
110
- "compatibility_date": "2024-01-01",
111
- "assets": {
112
- "directory": "./public"
113
- }
114
- }
115
- `;
116
- }
117
- //# sourceMappingURL=build-workbench.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-workbench.js","sourceRoot":"","sources":["../../src/commands/build-workbench.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- "use strict";
@@ -1 +0,0 @@
1
- //# sourceMappingURL=TEMP%20helpers%20file.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TEMP helpers file.d.ts","sourceRoot":"","sources":["../../src/helpers/TEMP helpers file.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- "use strict";
@@ -1,6 +0,0 @@
1
- type PageThumbnailStripProps = {
2
- embeddableId: string;
3
- };
4
- export declare function PageThumbnailStrip({ embeddableId }: PageThumbnailStripProps): import("react/jsx-runtime").JSX.Element | null;
5
- export {};
6
- //# sourceMappingURL=PageThumbnailStrip.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PageThumbnailStrip.d.ts","sourceRoot":"","sources":["../../src/workbench/PageThumbnailStrip.tsx"],"names":[],"mappings":"AAUA,KAAK,uBAAuB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAmBD,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,EAAE,uBAAuB,kDA+J3E"}
@@ -1,124 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * PageThumbnailStrip — horizontal row of page thumbnails below the Workbench.
4
- * Renders each page as a sandboxed iframe preview when Savvy.getStaticHtml is available,
5
- * otherwise shows a fallback card with page key and index.
6
- * Clicking a thumbnail navigates to that page via Savvy.goToPage.
7
- */
8
- import { useCallback, useEffect, useRef, useState } from 'react';
9
- const USERDATA_UPDATED_EVENT = 'embeddables:userdata_updated';
10
- /** Default viewport width when flow has no breakpoints. Matches common embeddable config. */
11
- const DEFAULT_VIEWPORT_WIDTH = 800;
12
- /** Thumbnail card display size (px). */
13
- const THUMB_WIDTH = 120;
14
- const THUMB_HEIGHT = 80;
15
- /** Derive viewport width from flow breakpoints (largest max_width) or default. */
16
- function getViewportWidth(flow) {
17
- const breakpoints = flow?.breakpoints;
18
- if (!breakpoints?.length)
19
- return DEFAULT_VIEWPORT_WIDTH;
20
- const max = Math.max(...breakpoints.map((b) => b.max_width));
21
- return max > 0 ? max : DEFAULT_VIEWPORT_WIDTH;
22
- }
23
- export function PageThumbnailStrip({ embeddableId }) {
24
- const [pages, setPages] = useState([]);
25
- const [currentPageId, setCurrentPageId] = useState('');
26
- const [viewportWidth, setViewportWidth] = useState(DEFAULT_VIEWPORT_WIDTH);
27
- const stripRef = useRef(null);
28
- const currentCardRef = useRef(null);
29
- const htmlCacheRef = useRef(new Map());
30
- const [, setCacheVersion] = useState(0);
31
- const savvy = window.Savvy;
32
- const refresh = useCallback(() => {
33
- if (!savvy?.getFlowJson || !savvy?.getUserData)
34
- return;
35
- try {
36
- const flowJson = savvy.getFlowJson(embeddableId);
37
- if (flowJson?.pages) {
38
- setPages(flowJson.pages.map((p) => ({ id: p.id, key: p.key })));
39
- }
40
- setViewportWidth(getViewportWidth(flowJson));
41
- const userData = savvy.getUserData(embeddableId);
42
- if (userData?.current_page_id) {
43
- setCurrentPageId(userData.current_page_id);
44
- }
45
- }
46
- catch {
47
- // ignore errors
48
- }
49
- }, [embeddableId, savvy]);
50
- useEffect(() => {
51
- const timer = setTimeout(refresh, 100);
52
- return () => clearTimeout(timer);
53
- }, [refresh]);
54
- useEffect(() => {
55
- const handler = (event) => {
56
- const detail = event?.detail;
57
- const eventEmbeddableId = detail?.embeddableId;
58
- if (typeof eventEmbeddableId === 'string' &&
59
- eventEmbeddableId.length > 0 &&
60
- eventEmbeddableId !== embeddableId) {
61
- return;
62
- }
63
- refresh();
64
- };
65
- window.addEventListener(USERDATA_UPDATED_EVENT, handler);
66
- return () => window.removeEventListener(USERDATA_UPDATED_EVENT, handler);
67
- }, [embeddableId, refresh]);
68
- // Load HTML for each page when getStaticHtml is available; cache in ref
69
- useEffect(() => {
70
- if (!savvy?.getStaticHtml || pages.length === 0)
71
- return;
72
- const cache = htmlCacheRef.current;
73
- cache.clear();
74
- let cancelled = false;
75
- const load = () => {
76
- for (const page of pages) {
77
- if (cancelled)
78
- return;
79
- const html = savvy.getStaticHtml?.(embeddableId, page.id);
80
- if (html != null && html !== '') {
81
- cache.set(page.id, html);
82
- }
83
- }
84
- if (!cancelled) {
85
- setCacheVersion((v) => v + 1);
86
- }
87
- };
88
- load();
89
- return () => {
90
- cancelled = true;
91
- };
92
- }, [embeddableId, pages, savvy]);
93
- // Auto-scroll strip to keep the current page thumbnail visible
94
- useEffect(() => {
95
- const strip = stripRef.current;
96
- const card = currentCardRef.current;
97
- if (!strip || !card)
98
- return;
99
- const cardRect = card.getBoundingClientRect();
100
- const stripRect = strip.getBoundingClientRect();
101
- if (cardRect.left < stripRect.left || cardRect.right > stripRect.right) {
102
- card.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });
103
- }
104
- }, [currentPageId, pages]);
105
- const handleClick = (pageId) => {
106
- if (savvy?.goToPage) {
107
- savvy.goToPage(embeddableId, pageId);
108
- }
109
- };
110
- if (pages.length === 0)
111
- return null;
112
- return (_jsx("div", { ref: stripRef, className: "flex h-[90px] shrink-0 gap-2 overflow-x-auto border-t border-white/10 bg-slate-950/70 px-3 py-2", role: "tablist", "aria-label": "Page thumbnails", children: pages.map((page, index) => {
113
- const isCurrent = page.id === currentPageId;
114
- const html = htmlCacheRef.current.get(page.id);
115
- const hasGetStaticHtml = typeof savvy?.getStaticHtml === 'function';
116
- return (_jsxs("button", { ref: isCurrent ? currentCardRef : undefined, type: "button", onClick: () => handleClick(page.id), role: "tab", "aria-selected": isCurrent, "aria-label": `Page ${index + 1}: ${page.key}`, className: `flex shrink-0 flex-col items-stretch overflow-hidden rounded-lg bg-white/5 ring-1 ring-inset transition-all hover:bg-white/10 hover:ring-white/20 ${isCurrent ? 'ring-2 ring-blue-500 ring-offset-2 ring-offset-slate-950' : 'ring-white/10'}`, children: [_jsx("div", { className: "relative overflow-hidden", style: { width: THUMB_WIDTH, height: THUMB_HEIGHT }, children: hasGetStaticHtml && html ? (_jsx("iframe", { srcDoc: html, title: `Preview: ${page.key}`, sandbox: "", className: "pointer-events-none", style: {
117
- width: viewportWidth,
118
- height: Math.round((viewportWidth * THUMB_HEIGHT) / THUMB_WIDTH),
119
- transform: `scale(${THUMB_WIDTH / viewportWidth})`,
120
- transformOrigin: 'top left',
121
- } })) : (_jsx("div", { className: "flex h-full w-full items-center justify-center bg-slate-800/50 text-[10px] text-slate-500", children: index + 1 })) }), _jsxs("div", { className: "flex items-center gap-1 px-1.5 py-1 text-[10px] text-slate-400", children: [_jsx("span", { className: "truncate", children: page.key }), _jsx("span", { className: "shrink-0", children: index + 1 })] })] }, page.id));
122
- }) }));
123
- }
124
- //# sourceMappingURL=PageThumbnailStrip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PageThumbnailStrip.js","sourceRoot":"","sources":["../../src/workbench/PageThumbnailStrip.tsx"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
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
- ```