@embeddables/cli 0.15.0 → 0.15.1-beta.1
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/.prompts/custom/build-funnel.md +3 -1
- package/.prompts/custom/carousel.md +159 -0
- package/.prompts/embeddables-cli.md +37 -3
- package/.prompts/short-rule-body.md +2 -2
- package/README.md +52 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +1 -1
- 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 +117 -0
- package/dist/commands/build-workbench.js.map +1 -0
- package/dist/commands/dangerously-publish.d.ts +53 -0
- package/dist/commands/dangerously-publish.d.ts.map +1 -0
- package/dist/commands/dangerously-publish.js +731 -0
- package/dist/commands/dangerously-publish.js.map +1 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +3 -0
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +24 -16
- package/dist/commands/inspect.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +20 -59
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/save.js +8 -1
- package/dist/commands/save.js.map +1 -1
- package/dist/commands/update-project-files.d.ts.map +1 -1
- package/dist/commands/update-project-files.js +47 -19
- package/dist/commands/update-project-files.js.map +1 -1
- package/dist/compiler/errors.d.ts +13 -0
- package/dist/compiler/errors.d.ts.map +1 -1
- package/dist/compiler/errors.js +16 -0
- package/dist/compiler/errors.js.map +1 -1
- package/dist/compiler/flatten.js +1 -0
- package/dist/compiler/reverse.d.ts.map +1 -1
- package/dist/compiler/reverse.js +9 -7
- package/dist/compiler/reverse.js.map +1 -1
- package/dist/components/primitives/OptionSelector.d.ts +1 -0
- package/dist/components/primitives/OptionSelector.d.ts.map +1 -1
- package/dist/components/primitives/OptionSelector.js.map +1 -1
- package/dist/constants.d.ts +8 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -3
- package/dist/constants.js.map +1 -1
- package/dist/helpers/TEMP helpers file.d.ts +1 -0
- package/dist/helpers/TEMP helpers file.d.ts.map +1 -0
- package/dist/helpers/TEMP helpers file.js +1 -0
- package/dist/helpers/reverseCompileWithRetry.d.ts +60 -0
- package/dist/helpers/reverseCompileWithRetry.d.ts.map +1 -0
- package/dist/helpers/reverseCompileWithRetry.js +96 -0
- package/dist/helpers/reverseCompileWithRetry.js.map +1 -0
- package/dist/proxy/injectWorkbench.d.ts +4 -0
- package/dist/proxy/injectWorkbench.d.ts.map +1 -1
- package/dist/proxy/injectWorkbench.js +5 -1
- package/dist/proxy/injectWorkbench.js.map +1 -1
- package/dist/proxy/server.d.ts +1 -0
- package/dist/proxy/server.d.ts.map +1 -1
- package/dist/proxy/server.js +12 -0
- package/dist/proxy/server.js.map +1 -1
- package/dist/types-builder.d.ts +1 -0
- package/dist/types-builder.d.ts.map +1 -1
- package/dist/workbench/FeedbackPanel.d.ts +43 -0
- package/dist/workbench/FeedbackPanel.d.ts.map +1 -0
- package/dist/workbench/FeedbackPanel.js +1146 -0
- package/dist/workbench/FeedbackPanel.js.map +1 -0
- package/dist/workbench/FieldEditorPanel.d.ts.map +1 -1
- package/dist/workbench/FieldEditorPanel.js +3 -2
- package/dist/workbench/FieldEditorPanel.js.map +1 -1
- package/dist/workbench/InspectorPanel.d.ts.map +1 -1
- package/dist/workbench/InspectorPanel.js +3 -172
- package/dist/workbench/InspectorPanel.js.map +1 -1
- package/dist/workbench/MediaLightbox.d.ts +20 -0
- package/dist/workbench/MediaLightbox.d.ts.map +1 -0
- package/dist/workbench/MediaLightbox.js +76 -0
- package/dist/workbench/MediaLightbox.js.map +1 -0
- package/dist/workbench/PageThumbnailStrip.d.ts +19 -0
- package/dist/workbench/PageThumbnailStrip.d.ts.map +1 -0
- package/dist/workbench/PageThumbnailStrip.js +304 -0
- package/dist/workbench/PageThumbnailStrip.js.map +1 -0
- package/dist/workbench/Toast.d.ts +18 -0
- package/dist/workbench/Toast.d.ts.map +1 -0
- package/dist/workbench/Toast.js +46 -0
- package/dist/workbench/Toast.js.map +1 -0
- package/dist/workbench/UserDataPanel.d.ts +2 -1
- package/dist/workbench/UserDataPanel.d.ts.map +1 -1
- package/dist/workbench/UserDataPanel.js +2 -1
- package/dist/workbench/UserDataPanel.js.map +1 -1
- package/dist/workbench/WorkbenchApp.d.ts +8 -1
- package/dist/workbench/WorkbenchApp.d.ts.map +1 -1
- package/dist/workbench/WorkbenchApp.js +32 -7
- package/dist/workbench/WorkbenchApp.js.map +1 -1
- package/dist/workbench/WorkbenchModalOverlay.d.ts +20 -0
- package/dist/workbench/WorkbenchModalOverlay.d.ts.map +1 -0
- package/dist/workbench/WorkbenchModalOverlay.js +45 -0
- package/dist/workbench/WorkbenchModalOverlay.js.map +1 -0
- package/dist/workbench/cloudflare/public/_headers +4 -0
- package/dist/workbench/cloudflare/public/workbench.css +2148 -0
- package/dist/workbench/cloudflare/public/workbench.js +709 -0
- package/dist/workbench/cloudflare/wrangler.jsonc +9 -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/conditionEvaluator.d.ts +6 -0
- package/dist/workbench/conditionEvaluator.d.ts.map +1 -0
- package/dist/workbench/conditionEvaluator.js +111 -0
- package/dist/workbench/conditionEvaluator.js.map +1 -0
- package/dist/workbench/feedbackSessionsStorage.d.ts +24 -0
- package/dist/workbench/feedbackSessionsStorage.d.ts.map +1 -0
- package/dist/workbench/feedbackSessionsStorage.js +80 -0
- package/dist/workbench/feedbackSessionsStorage.js.map +1 -0
- package/dist/workbench/index.d.ts +4 -0
- package/dist/workbench/index.d.ts.map +1 -1
- package/dist/workbench/index.js +42 -2
- package/dist/workbench/index.js.map +1 -1
- package/dist/workbench/pageKeyDisplay.d.ts +9 -0
- package/dist/workbench/pageKeyDisplay.d.ts.map +1 -0
- package/dist/workbench/pageKeyDisplay.js +18 -0
- package/dist/workbench/pageKeyDisplay.js.map +1 -0
- package/dist/workbench/stringUtils.d.ts +6 -0
- package/dist/workbench/stringUtils.d.ts.map +1 -0
- package/dist/workbench/stringUtils.js +24 -0
- package/dist/workbench/stringUtils.js.map +1 -0
- package/dist/workbench/supabase-browser.d.ts +11 -0
- package/dist/workbench/supabase-browser.d.ts.map +1 -0
- package/dist/workbench/supabase-browser.js +18 -0
- package/dist/workbench/supabase-browser.js.map +1 -0
- package/dist/workbench/types.d.ts +29 -0
- package/dist/workbench/types.d.ts.map +1 -0
- package/dist/workbench/types.js +2 -0
- package/dist/workbench/types.js.map +1 -0
- package/dist/workbench/useComponentSelection.d.ts +27 -0
- package/dist/workbench/useComponentSelection.d.ts.map +1 -0
- package/dist/workbench/useComponentSelection.js +203 -0
- package/dist/workbench/useComponentSelection.js.map +1 -0
- package/dist/workbench/workbench.css +2148 -0
- package/dist/workbench/workbench.js +709 -0
- package/dist/workbench/workbenchShadowPortal.d.ts +4 -0
- package/dist/workbench/workbenchShadowPortal.d.ts.map +1 -0
- package/dist/workbench/workbenchShadowPortal.js +18 -0
- package/dist/workbench/workbenchShadowPortal.js.map +1 -0
- package/package.json +6 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaLightbox.d.ts","sourceRoot":"","sources":["../../src/workbench/MediaLightbox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAA;AAM/D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,EAAE,iBAAiB,EAAE,CAAA;IAC1B,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAOD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAgB,EAAE,EAAE,kBAAkB,4BAkI3F"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
3
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
4
|
+
import { faChevronLeft, faChevronRight, faXmark } from '@fortawesome/free-solid-svg-icons';
|
|
5
|
+
import { createPortal } from 'react-dom';
|
|
6
|
+
import { getWorkbenchShadowPortal } from './workbenchShadowPortal.js';
|
|
7
|
+
function clampIndex(i, len) {
|
|
8
|
+
if (len <= 0)
|
|
9
|
+
return 0;
|
|
10
|
+
return Math.min(Math.max(0, i), len - 1);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Full-screen image lightbox: backdrop dismiss, Escape, optional prev/next when multiple items.
|
|
14
|
+
* Renders via portal into the workbench shadow root so Tailwind utilities (scoped under `:host`) apply.
|
|
15
|
+
*/
|
|
16
|
+
export function MediaLightbox({ open, onClose, items, initialIndex = 0 }) {
|
|
17
|
+
const [index, setIndex] = useState(() => clampIndex(initialIndex, items.length));
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (open)
|
|
20
|
+
setIndex(clampIndex(initialIndex, items.length));
|
|
21
|
+
}, [open, initialIndex, items]);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!open)
|
|
24
|
+
return;
|
|
25
|
+
const prevOverflow = document.body.style.overflow;
|
|
26
|
+
document.body.style.overflow = 'hidden';
|
|
27
|
+
return () => {
|
|
28
|
+
document.body.style.overflow = prevOverflow;
|
|
29
|
+
};
|
|
30
|
+
}, [open]);
|
|
31
|
+
const onKeyDown = useCallback((e) => {
|
|
32
|
+
if (!open)
|
|
33
|
+
return;
|
|
34
|
+
if (e.key === 'Escape') {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
onClose();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (items.length <= 1)
|
|
40
|
+
return;
|
|
41
|
+
if (e.key === 'ArrowLeft') {
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
setIndex((i) => (i - 1 + items.length) % items.length);
|
|
44
|
+
}
|
|
45
|
+
if (e.key === 'ArrowRight') {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
setIndex((i) => (i + 1) % items.length);
|
|
48
|
+
}
|
|
49
|
+
}, [open, onClose, items.length]);
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
window.addEventListener('keydown', onKeyDown);
|
|
52
|
+
return () => window.removeEventListener('keydown', onKeyDown);
|
|
53
|
+
}, [onKeyDown]);
|
|
54
|
+
if (!open || typeof document === 'undefined' || items.length === 0)
|
|
55
|
+
return null;
|
|
56
|
+
const portalTarget = getWorkbenchShadowPortal();
|
|
57
|
+
if (!portalTarget)
|
|
58
|
+
return null;
|
|
59
|
+
const safeLen = items.length;
|
|
60
|
+
const safeIndex = clampIndex(index, safeLen);
|
|
61
|
+
const item = items[safeIndex];
|
|
62
|
+
const goPrev = () => setIndex((i) => (i - 1 + safeLen) % safeLen);
|
|
63
|
+
const goNext = () => setIndex((i) => (i + 1) % safeLen);
|
|
64
|
+
const modal = (_jsx("div", { className: "fixed inset-0 z-2147483647 flex items-center justify-center bg-black/80 p-3 sm:p-6 backdrop-blur-sm", role: "dialog", "aria-modal": "true", "aria-label": "Image preview", onClick: onClose, children: _jsxs("div", { className: "relative flex max-h-full w-full max-w-[min(96vw,1200px)] flex-row items-center gap-2 sm:gap-4", children: [_jsx("button", { type: "button", onClick: (e) => {
|
|
65
|
+
e.stopPropagation();
|
|
66
|
+
onClose();
|
|
67
|
+
}, className: "absolute -right-1 -top-1 z-20 flex h-9 w-9 cursor-pointer items-center justify-center rounded-full bg-white/10 text-white ring-1 ring-inset ring-white/20 transition-colors hover:bg-white/20 sm:-right-2 sm:-top-2", "aria-label": "Close preview", children: _jsx(FontAwesomeIcon, { icon: faXmark, className: "h-4 w-4" }) }), safeLen > 1 ? (_jsx("button", { type: "button", onClick: (e) => {
|
|
68
|
+
e.stopPropagation();
|
|
69
|
+
goPrev();
|
|
70
|
+
}, className: "z-20 flex h-10 w-10 shrink-0 cursor-pointer items-center justify-center self-center rounded-full bg-white/10 text-white ring-1 ring-inset ring-white/20 transition-colors hover:bg-white/20", "aria-label": "Previous image", children: _jsx(FontAwesomeIcon, { icon: faChevronLeft, className: "h-4 w-4" }) })) : null, _jsx("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col items-center justify-center", children: _jsxs("div", { className: "flex w-fit max-w-full flex-col items-center gap-3", onClick: (e) => e.stopPropagation(), children: [_jsx("img", { src: item.src, alt: item.alt ?? 'Attachment preview', className: "max-h-[min(85vh,900px)] w-auto max-w-full rounded-lg object-contain shadow-2xl ring-1 ring-black/40" }), safeLen > 1 ? (_jsxs("div", { className: "text-[11px] font-medium text-white/65", children: [safeIndex + 1, " / ", safeLen] })) : null, item.caption ? (_jsx("div", { className: "max-w-full truncate text-center text-xs text-white/80", children: item.caption })) : null] }) }), safeLen > 1 ? (_jsx("button", { type: "button", onClick: (e) => {
|
|
71
|
+
e.stopPropagation();
|
|
72
|
+
goNext();
|
|
73
|
+
}, className: "z-20 flex h-10 w-10 shrink-0 cursor-pointer items-center justify-center self-center rounded-full bg-white/10 text-white ring-1 ring-inset ring-white/20 transition-colors hover:bg-white/20", "aria-label": "Next image", children: _jsx(FontAwesomeIcon, { icon: faChevronRight, className: "h-4 w-4" }) })) : null] }) }));
|
|
74
|
+
return createPortal(modal, portalTarget);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=MediaLightbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaLightbox.js","sourceRoot":"","sources":["../../src/workbench/MediaLightbox.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type PageThumbnailStripProps = {
|
|
2
|
+
embeddableId: string;
|
|
3
|
+
/** Total height of the strip (px), including resize handle and labels. */
|
|
4
|
+
stripHeight: number;
|
|
5
|
+
/** Live height while dragging the resize handle. */
|
|
6
|
+
onStripHeightChange: (height: number) => void;
|
|
7
|
+
/** Persist final height after pointer release. */
|
|
8
|
+
onStripResizeEnd: (height: number) => void;
|
|
9
|
+
/** When the main Workbench panel is collapsed, emphasize the top border. */
|
|
10
|
+
workbenchCollapsed: boolean;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Minimum total strip height (handle + padding + preview + label).
|
|
14
|
+
* Keeps scrollRowInnerHeight ≥ LABEL_ROW_PX + MIN_PREVIEW_HEIGHT_PX.
|
|
15
|
+
*/
|
|
16
|
+
export declare const MIN_THUMBNAIL_STRIP_HEIGHT_PX: number;
|
|
17
|
+
export declare function PageThumbnailStrip({ embeddableId, stripHeight, onStripHeightChange, onStripResizeEnd, workbenchCollapsed, }: PageThumbnailStripProps): import("react/jsx-runtime").JSX.Element | null;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=PageThumbnailStrip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageThumbnailStrip.d.ts","sourceRoot":"","sources":["../../src/workbench/PageThumbnailStrip.tsx"],"names":[],"mappings":"AAcA,KAAK,uBAAuB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAA;IACnB,oDAAoD;IACpD,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,kDAAkD;IAClD,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,4EAA4E;IAC5E,kBAAkB,EAAE,OAAO,CAAA;CAC5B,CAAA;AAyBD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,QAKnB,CAAA;AA0EvB,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,EAAE,uBAAuB,kDA2WzB"}
|
|
@@ -0,0 +1,304 @@
|
|
|
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
|
+
* Uses horizontal virtualization for long funnels (only visible thumbnails mount).
|
|
8
|
+
*/
|
|
9
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
10
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
11
|
+
import { formatPageKeyMiddleEllipsis } from './pageKeyDisplay.js';
|
|
12
|
+
import { doesElementPassConditions } from './conditionEvaluator.js';
|
|
13
|
+
const USERDATA_UPDATED_EVENT = 'embeddables:userdata_updated';
|
|
14
|
+
/** Default viewport width when flow has no breakpoints. Matches common embeddable config. */
|
|
15
|
+
const DEFAULT_VIEWPORT_WIDTH = 800;
|
|
16
|
+
/** Reference aspect ratio for thumbnail preview (matches prior fixed 120×80 cards). */
|
|
17
|
+
const THUMB_ASPECT_W = 120;
|
|
18
|
+
const THUMB_ASPECT_H = 80;
|
|
19
|
+
/** Horizontal gap between cards (Tailwind `gap-2`). */
|
|
20
|
+
const THUMB_GAP_PX = 8;
|
|
21
|
+
/** Horizontal padding of the scroll row (Tailwind `px-3`). */
|
|
22
|
+
const SCROLL_PADDING_X_PX = 12;
|
|
23
|
+
/** Resize handle + scroll row padding (px). */
|
|
24
|
+
const STRIP_HANDLE_ROW_PX = 12;
|
|
25
|
+
/** Must match label row: `h-8` (32px border-box, includes border-t). */
|
|
26
|
+
const LABEL_ROW_PX = 32;
|
|
27
|
+
const SCROLL_PADDING_TOP_PX = 4;
|
|
28
|
+
const SCROLL_PADDING_BOTTOM_PX = 8;
|
|
29
|
+
/** Minimum iframe preview area so cards are not clipped. */
|
|
30
|
+
const MIN_PREVIEW_HEIGHT_PX = 32;
|
|
31
|
+
/**
|
|
32
|
+
* Minimum total strip height (handle + padding + preview + label).
|
|
33
|
+
* Keeps scrollRowInnerHeight ≥ LABEL_ROW_PX + MIN_PREVIEW_HEIGHT_PX.
|
|
34
|
+
*/
|
|
35
|
+
export const MIN_THUMBNAIL_STRIP_HEIGHT_PX = STRIP_HANDLE_ROW_PX +
|
|
36
|
+
SCROLL_PADDING_TOP_PX +
|
|
37
|
+
SCROLL_PADDING_BOTTOM_PX +
|
|
38
|
+
LABEL_ROW_PX +
|
|
39
|
+
MIN_PREVIEW_HEIGHT_PX;
|
|
40
|
+
/** Max characters for the page key in the label (middle ellipsis; index is separate). */
|
|
41
|
+
const PAGE_KEY_LABEL_MAX_CHARS = 16;
|
|
42
|
+
/** Virtualizer overscan (cards each side beyond viewport). */
|
|
43
|
+
const VIRTUAL_OVERSCAN = 6;
|
|
44
|
+
function shouldShowPageDimmed(page) {
|
|
45
|
+
if (page.hide)
|
|
46
|
+
return true;
|
|
47
|
+
if (page.hasConditions && !page.passesConditions)
|
|
48
|
+
return true;
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
function getExperimentKeys(flowJson) {
|
|
52
|
+
if (!flowJson)
|
|
53
|
+
return [];
|
|
54
|
+
const experiments = flowJson.experiments ?? [];
|
|
55
|
+
const connectedExperiments = flowJson.connected_experiments ?? [];
|
|
56
|
+
return [
|
|
57
|
+
...experiments.map((exp) => exp.key),
|
|
58
|
+
...connectedExperiments.map((exp) => exp.experiment_key),
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
function hasExperimentCondition({ conditions, experimentKeys, }) {
|
|
62
|
+
if (!conditions?.length || !experimentKeys.length)
|
|
63
|
+
return false;
|
|
64
|
+
return conditions.some((c) => experimentKeys.includes(c.key));
|
|
65
|
+
}
|
|
66
|
+
function HiddenBadge() {
|
|
67
|
+
return (_jsxs("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94" }), _jsx("path", { d: "M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19" }), _jsx("line", { x1: "1", y1: "1", x2: "23", y2: "23" })] }));
|
|
68
|
+
}
|
|
69
|
+
function ConditionBadge() {
|
|
70
|
+
return (_jsxs("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("polyline", { points: "16 3 21 3 21 8" }), _jsx("line", { x1: "4", y1: "20", x2: "21", y2: "3" }), _jsx("polyline", { points: "21 16 21 21 16 21" }), _jsx("line", { x1: "15", y1: "15", x2: "21", y2: "21" }), _jsx("line", { x1: "4", y1: "4", x2: "9", y2: "9" })] }));
|
|
71
|
+
}
|
|
72
|
+
function ExperimentBadge() {
|
|
73
|
+
return (_jsxs("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M9 3h6v7l4 9H5l4-9V3z" }), _jsx("line", { x1: "9", y1: "3", x2: "15", y2: "3" })] }));
|
|
74
|
+
}
|
|
75
|
+
/** Derive viewport width from flow breakpoints (largest max_width) or default. */
|
|
76
|
+
function getViewportWidth(flow) {
|
|
77
|
+
const breakpoints = flow?.breakpoints;
|
|
78
|
+
if (!breakpoints?.length)
|
|
79
|
+
return DEFAULT_VIEWPORT_WIDTH;
|
|
80
|
+
const max = Math.max(...breakpoints.map((b) => b.max_width));
|
|
81
|
+
return max > 0 ? max : DEFAULT_VIEWPORT_WIDTH;
|
|
82
|
+
}
|
|
83
|
+
export function PageThumbnailStrip({ embeddableId, stripHeight, onStripHeightChange, onStripResizeEnd, workbenchCollapsed, }) {
|
|
84
|
+
const [pages, setPages] = useState([]);
|
|
85
|
+
const [currentPageId, setCurrentPageId] = useState('');
|
|
86
|
+
const [viewportWidth, setViewportWidth] = useState(DEFAULT_VIEWPORT_WIDTH);
|
|
87
|
+
const scrollParentRef = useRef(null);
|
|
88
|
+
const htmlCacheRef = useRef(new Map());
|
|
89
|
+
const [, setCacheVersion] = useState(0);
|
|
90
|
+
const stripDragRef = useRef(null);
|
|
91
|
+
const liveStripHeightRef = useRef(stripHeight);
|
|
92
|
+
const savvy = window.Savvy;
|
|
93
|
+
liveStripHeightRef.current = stripHeight;
|
|
94
|
+
const scrollRowInnerHeight = useMemo(() => Math.max(LABEL_ROW_PX + MIN_PREVIEW_HEIGHT_PX, stripHeight -
|
|
95
|
+
STRIP_HANDLE_ROW_PX -
|
|
96
|
+
SCROLL_PADDING_TOP_PX -
|
|
97
|
+
SCROLL_PADDING_BOTTOM_PX), [stripHeight]);
|
|
98
|
+
const previewHeight = useMemo(() => Math.max(MIN_PREVIEW_HEIGHT_PX, scrollRowInnerHeight - LABEL_ROW_PX), [scrollRowInnerHeight]);
|
|
99
|
+
const thumbDisplayWidth = useMemo(() => (previewHeight * THUMB_ASPECT_W) / THUMB_ASPECT_H, [previewHeight]);
|
|
100
|
+
const virtualizer = useVirtualizer({
|
|
101
|
+
count: pages.length,
|
|
102
|
+
getScrollElement: () => scrollParentRef.current,
|
|
103
|
+
estimateSize: () => thumbDisplayWidth,
|
|
104
|
+
gap: THUMB_GAP_PX,
|
|
105
|
+
horizontal: true,
|
|
106
|
+
overscan: VIRTUAL_OVERSCAN,
|
|
107
|
+
paddingStart: SCROLL_PADDING_X_PX,
|
|
108
|
+
paddingEnd: SCROLL_PADDING_X_PX,
|
|
109
|
+
getItemKey: (index) => pages[index]?.id ?? index,
|
|
110
|
+
});
|
|
111
|
+
const refresh = useCallback(() => {
|
|
112
|
+
if (!savvy?.getFlowJson || !savvy?.getUserData)
|
|
113
|
+
return;
|
|
114
|
+
try {
|
|
115
|
+
const flowJson = savvy.getFlowJson(embeddableId);
|
|
116
|
+
const userData = savvy.getUserData(embeddableId);
|
|
117
|
+
const experimentKeys = getExperimentKeys(flowJson);
|
|
118
|
+
if (flowJson?.pages) {
|
|
119
|
+
setPages(flowJson.pages.map((p) => ({
|
|
120
|
+
id: p.id,
|
|
121
|
+
key: p.key,
|
|
122
|
+
hide: p.hide,
|
|
123
|
+
hasConditions: Boolean(p.conditions?.length),
|
|
124
|
+
hasExperimentConditions: hasExperimentCondition({
|
|
125
|
+
conditions: p.conditions,
|
|
126
|
+
experimentKeys,
|
|
127
|
+
}),
|
|
128
|
+
passesConditions: doesElementPassConditions({
|
|
129
|
+
conditions: p.conditions,
|
|
130
|
+
userData: userData,
|
|
131
|
+
}),
|
|
132
|
+
})));
|
|
133
|
+
}
|
|
134
|
+
setViewportWidth(getViewportWidth(flowJson));
|
|
135
|
+
if (userData?.current_page_id) {
|
|
136
|
+
setCurrentPageId(userData.current_page_id);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// ignore errors
|
|
141
|
+
}
|
|
142
|
+
}, [embeddableId, savvy]);
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
const timer = setTimeout(refresh, 100);
|
|
145
|
+
return () => clearTimeout(timer);
|
|
146
|
+
}, [refresh]);
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
const handler = (event) => {
|
|
149
|
+
const detail = event?.detail;
|
|
150
|
+
const eventEmbeddableId = detail?.embeddableId;
|
|
151
|
+
if (typeof eventEmbeddableId === 'string' &&
|
|
152
|
+
eventEmbeddableId.length > 0 &&
|
|
153
|
+
eventEmbeddableId !== embeddableId) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
refresh();
|
|
157
|
+
};
|
|
158
|
+
window.addEventListener(USERDATA_UPDATED_EVENT, handler);
|
|
159
|
+
return () => window.removeEventListener(USERDATA_UPDATED_EVENT, handler);
|
|
160
|
+
}, [embeddableId, refresh]);
|
|
161
|
+
const virtualItems = virtualizer.getVirtualItems();
|
|
162
|
+
const virtualLoadSignature = virtualItems.map((v) => v.index).join(',');
|
|
163
|
+
// Lazy-load static HTML only for visible (and overscanned) thumbnails.
|
|
164
|
+
useEffect(() => {
|
|
165
|
+
if (!savvy?.getStaticHtml || pages.length === 0)
|
|
166
|
+
return;
|
|
167
|
+
const loadIndices = () => {
|
|
168
|
+
const fromVirtual = virtualizer.getVirtualItems().map((v) => v.index);
|
|
169
|
+
if (fromVirtual.length > 0)
|
|
170
|
+
return fromVirtual;
|
|
171
|
+
return Array.from({ length: Math.min(pages.length, VIRTUAL_OVERSCAN * 2 + 1) }, (_, i) => i);
|
|
172
|
+
};
|
|
173
|
+
let changed = false;
|
|
174
|
+
for (const index of loadIndices()) {
|
|
175
|
+
const page = pages[index];
|
|
176
|
+
if (!page || htmlCacheRef.current.has(page.id))
|
|
177
|
+
continue;
|
|
178
|
+
const html = savvy.getStaticHtml?.(embeddableId, page.id);
|
|
179
|
+
if (html != null && html !== '') {
|
|
180
|
+
htmlCacheRef.current.set(page.id, html);
|
|
181
|
+
changed = true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (changed) {
|
|
185
|
+
setCacheVersion((v) => v + 1);
|
|
186
|
+
}
|
|
187
|
+
}, [embeddableId, pages, savvy, virtualLoadSignature]);
|
|
188
|
+
useEffect(() => {
|
|
189
|
+
const onPointerMove = (event) => {
|
|
190
|
+
const drag = stripDragRef.current;
|
|
191
|
+
if (!drag || event.pointerId !== drag.pointerId)
|
|
192
|
+
return;
|
|
193
|
+
const delta = drag.startY - event.clientY;
|
|
194
|
+
const maxStrip = Math.min(420, Math.floor(window.innerHeight * 0.55));
|
|
195
|
+
const nextHeight = Math.max(MIN_THUMBNAIL_STRIP_HEIGHT_PX, Math.min(maxStrip, drag.startHeight + delta));
|
|
196
|
+
liveStripHeightRef.current = nextHeight;
|
|
197
|
+
onStripHeightChange(nextHeight);
|
|
198
|
+
};
|
|
199
|
+
const endStripDrag = (event) => {
|
|
200
|
+
const drag = stripDragRef.current;
|
|
201
|
+
if (!drag || event.pointerId !== drag.pointerId)
|
|
202
|
+
return;
|
|
203
|
+
stripDragRef.current = null;
|
|
204
|
+
try {
|
|
205
|
+
document.body.style.userSelect = '';
|
|
206
|
+
document.body.style.cursor = '';
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// ignore
|
|
210
|
+
}
|
|
211
|
+
onStripResizeEnd(liveStripHeightRef.current);
|
|
212
|
+
};
|
|
213
|
+
window.addEventListener('pointermove', onPointerMove);
|
|
214
|
+
window.addEventListener('pointerup', endStripDrag);
|
|
215
|
+
window.addEventListener('pointercancel', endStripDrag);
|
|
216
|
+
return () => {
|
|
217
|
+
if (stripDragRef.current !== null) {
|
|
218
|
+
stripDragRef.current = null;
|
|
219
|
+
onStripResizeEnd(liveStripHeightRef.current);
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
document.body.style.userSelect = '';
|
|
223
|
+
document.body.style.cursor = '';
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// ignore
|
|
227
|
+
}
|
|
228
|
+
window.removeEventListener('pointermove', onPointerMove);
|
|
229
|
+
window.removeEventListener('pointerup', endStripDrag);
|
|
230
|
+
window.removeEventListener('pointercancel', endStripDrag);
|
|
231
|
+
};
|
|
232
|
+
}, [onStripHeightChange, onStripResizeEnd]);
|
|
233
|
+
useEffect(() => {
|
|
234
|
+
if (pages.length === 0)
|
|
235
|
+
return;
|
|
236
|
+
const idx = pages.findIndex((p) => p.id === currentPageId);
|
|
237
|
+
if (idx < 0)
|
|
238
|
+
return;
|
|
239
|
+
virtualizer.scrollToIndex(idx, { align: 'center', behavior: 'smooth' });
|
|
240
|
+
}, [currentPageId, pages, virtualizer]);
|
|
241
|
+
const handleClick = (pageId) => {
|
|
242
|
+
if (savvy?.goToPage) {
|
|
243
|
+
savvy.goToPage(embeddableId, pageId);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
if (pages.length === 0)
|
|
247
|
+
return null;
|
|
248
|
+
const topBorderClass = workbenchCollapsed
|
|
249
|
+
? 'border-t-2 border-white/25'
|
|
250
|
+
: 'border-t border-white/10';
|
|
251
|
+
return (_jsxs("div", { className: `flex shrink-0 flex-col ${topBorderClass} bg-slate-950/70`, style: { height: stripHeight }, children: [_jsx("div", { role: "separator", "aria-orientation": "horizontal", title: "Drag to resize page thumbnail strip", onPointerDown: (event) => {
|
|
252
|
+
event.preventDefault();
|
|
253
|
+
event.stopPropagation();
|
|
254
|
+
stripDragRef.current = {
|
|
255
|
+
pointerId: event.pointerId,
|
|
256
|
+
startY: event.clientY,
|
|
257
|
+
startHeight: stripHeight,
|
|
258
|
+
};
|
|
259
|
+
try {
|
|
260
|
+
;
|
|
261
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
262
|
+
document.body.style.userSelect = 'none';
|
|
263
|
+
document.body.style.cursor = 'ns-resize';
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
// ignore
|
|
267
|
+
}
|
|
268
|
+
}, onClick: (event) => {
|
|
269
|
+
event.preventDefault();
|
|
270
|
+
event.stopPropagation();
|
|
271
|
+
}, className: workbenchCollapsed
|
|
272
|
+
? 'relative z-20 flex h-3 shrink-0 cursor-ns-resize touch-none items-center justify-center border-b border-white/10 bg-slate-950/80'
|
|
273
|
+
: 'flex h-3 shrink-0 cursor-ns-resize touch-none items-center justify-center border-b border-white/5', children: _jsx("div", { className: workbenchCollapsed
|
|
274
|
+
? 'pointer-events-none h-3 w-16 rounded-full border border-slate-500 bg-slate-400 shadow-md'
|
|
275
|
+
: 'pointer-events-none h-1.5 w-14 rounded-full border border-slate-500/80 bg-slate-500/90 shadow-sm' }) }), _jsx("div", { ref: scrollParentRef, className: "min-h-0 flex-1 overflow-x-auto overflow-y-hidden pb-2 pt-1", role: "tablist", "aria-label": "Page thumbnails", children: _jsx("div", { className: "relative h-full", style: {
|
|
276
|
+
width: virtualizer.getTotalSize(),
|
|
277
|
+
minWidth: '100%',
|
|
278
|
+
}, children: virtualItems.map((virtualItem) => {
|
|
279
|
+
const index = virtualItem.index;
|
|
280
|
+
const page = pages[index];
|
|
281
|
+
if (!page)
|
|
282
|
+
return null;
|
|
283
|
+
const isCurrent = page.id === currentPageId;
|
|
284
|
+
const isDimmed = shouldShowPageDimmed(page);
|
|
285
|
+
const html = htmlCacheRef.current.get(page.id);
|
|
286
|
+
const hasGetStaticHtml = typeof savvy?.getStaticHtml === 'function';
|
|
287
|
+
const keyDisplay = formatPageKeyMiddleEllipsis({
|
|
288
|
+
key: page.key,
|
|
289
|
+
maxChars: PAGE_KEY_LABEL_MAX_CHARS,
|
|
290
|
+
});
|
|
291
|
+
return (_jsx("div", { className: "absolute top-0 left-0 flex h-full", style: {
|
|
292
|
+
width: virtualItem.size,
|
|
293
|
+
transform: `translateX(${virtualItem.start}px)`,
|
|
294
|
+
}, children: _jsxs("button", { type: "button", onClick: () => handleClick(page.id), role: "tab", "aria-selected": isCurrent, "aria-label": `Page ${index + 1}: ${page.key}${page.hide ? ' (hidden)' : page.hasConditions && !page.passesConditions ? ' (conditions not met)' : ''}`, className: `relative flex h-full min-h-0 max-h-full w-full 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
|
|
295
|
+
? 'ring-2 ring-blue-500 ring-offset-2 ring-offset-slate-950'
|
|
296
|
+
: 'ring-white/10'}`, style: { width: thumbDisplayWidth }, children: [isDimmed && (_jsx("div", { className: "absolute inset-0 z-20 bg-black/60 pointer-events-none rounded-lg" })), (page.hide || page.hasConditions || page.hasExperimentConditions) && (_jsxs("div", { className: "absolute top-1 right-1 z-30 flex items-center gap-0.5 pointer-events-none", children: [page.hide && (_jsx("span", { className: "flex items-center justify-center rounded bg-black/70 p-0.5 text-white", title: "Hidden", children: _jsx(HiddenBadge, {}) })), page.hasConditions && !page.hasExperimentConditions && (_jsx("span", { className: "flex items-center justify-center rounded bg-black/70 p-0.5 text-amber-400", title: "Has conditions", children: _jsx(ConditionBadge, {}) })), page.hasExperimentConditions && (_jsx("span", { className: "flex items-center justify-center rounded bg-black/70 p-0.5 text-purple-400", title: "Has experiment", children: _jsx(ExperimentBadge, {}) }))] })), _jsx("div", { className: "relative shrink-0 overflow-hidden rounded-t-lg", style: { width: thumbDisplayWidth, height: previewHeight }, children: hasGetStaticHtml && html ? (_jsx("iframe", { srcDoc: html, title: `Preview: ${page.key}`, sandbox: "", className: "pointer-events-none", style: {
|
|
297
|
+
width: viewportWidth,
|
|
298
|
+
height: Math.round((viewportWidth * previewHeight) / thumbDisplayWidth),
|
|
299
|
+
transform: `scale(${thumbDisplayWidth / viewportWidth})`,
|
|
300
|
+
transformOrigin: 'top left',
|
|
301
|
+
} })) : (_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: "box-border flex h-8 min-w-0 shrink-0 items-center gap-1 rounded-b-lg border-t border-white/10 bg-slate-700/95 px-1.5 text-left text-[10px] leading-normal text-slate-100", title: page.key, children: [_jsxs("span", { className: "shrink-0 tabular-nums", children: [index + 1, "."] }), _jsx("span", { className: "min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap", children: keyDisplay })] })] }) }, virtualItem.key));
|
|
302
|
+
}) }) })] }));
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=PageThumbnailStrip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageThumbnailStrip.js","sourceRoot":"","sources":["../../src/workbench/PageThumbnailStrip.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type ToastMessage = {
|
|
2
|
+
id: number;
|
|
3
|
+
text: string;
|
|
4
|
+
type: 'success' | 'error';
|
|
5
|
+
};
|
|
6
|
+
type ToastProps = {
|
|
7
|
+
message: ToastMessage;
|
|
8
|
+
onDismiss: (id: number) => void;
|
|
9
|
+
};
|
|
10
|
+
/** Single toast notification that auto-dismisses after a timeout. */
|
|
11
|
+
export declare function Toast({ message, onDismiss }: ToastProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
/** Container that renders a stack of toast messages anchored above the workbench bar. */
|
|
13
|
+
export declare function ToastContainer({ messages, onDismiss, }: {
|
|
14
|
+
messages: ToastMessage[];
|
|
15
|
+
onDismiss: (id: number) => void;
|
|
16
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=Toast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../src/workbench/Toast.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,GAAG,OAAO,CAAA;CAC1B,CAAA;AAED,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,YAAY,CAAA;IACrB,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC,CAAA;AASD,qEAAqE;AACrE,wBAAgB,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,2CA8CvD;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC,kDAUA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
const AUTO_DISMISS_MS = 3000;
|
|
4
|
+
const FADE_OUT_MS = 200;
|
|
5
|
+
/** Shared with WorkbenchApp / panels: slate surface, sky for positive, rose for errors. */
|
|
6
|
+
const workbenchToastSurfaceClass = 'rounded-lg bg-slate-800 px-3 py-2 text-xs font-medium shadow-2xl shadow-black/40 ring-1 ring-inset ring-slate-600';
|
|
7
|
+
/** Single toast notification that auto-dismisses after a timeout. */
|
|
8
|
+
export function Toast({ message, onDismiss }) {
|
|
9
|
+
const [visible, setVisible] = useState(false);
|
|
10
|
+
const dismissTimerRef = useRef(null);
|
|
11
|
+
// Animate in on mount
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const frame = requestAnimationFrame(() => setVisible(true));
|
|
14
|
+
return () => cancelAnimationFrame(frame);
|
|
15
|
+
}, []);
|
|
16
|
+
// Clear the inner dismiss timer on unmount to prevent leaks
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
return () => {
|
|
19
|
+
if (dismissTimerRef.current)
|
|
20
|
+
clearTimeout(dismissTimerRef.current);
|
|
21
|
+
};
|
|
22
|
+
}, []);
|
|
23
|
+
// Auto-dismiss after timeout
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const timer = setTimeout(() => {
|
|
26
|
+
setVisible(false);
|
|
27
|
+
dismissTimerRef.current = setTimeout(() => onDismiss(message.id), FADE_OUT_MS);
|
|
28
|
+
}, AUTO_DISMISS_MS);
|
|
29
|
+
return () => clearTimeout(timer);
|
|
30
|
+
}, [message.id, onDismiss]);
|
|
31
|
+
const handleDismiss = useCallback(() => {
|
|
32
|
+
setVisible(false);
|
|
33
|
+
if (dismissTimerRef.current)
|
|
34
|
+
clearTimeout(dismissTimerRef.current);
|
|
35
|
+
dismissTimerRef.current = setTimeout(() => onDismiss(message.id), FADE_OUT_MS);
|
|
36
|
+
}, [message.id, onDismiss]);
|
|
37
|
+
const isSuccess = message.type === 'success';
|
|
38
|
+
return (_jsx("div", { role: "status", "aria-live": "polite", onClick: handleDismiss, className: `pointer-events-auto cursor-pointer transition-all duration-200 ${workbenchToastSurfaceClass} ${visible ? 'translate-y-0 opacity-100' : 'translate-y-2 opacity-0'} ${isSuccess ? 'text-sky-200' : 'text-rose-300'}`, children: message.text }));
|
|
39
|
+
}
|
|
40
|
+
/** Container that renders a stack of toast messages anchored above the workbench bar. */
|
|
41
|
+
export function ToastContainer({ messages, onDismiss, }) {
|
|
42
|
+
if (messages.length === 0)
|
|
43
|
+
return null;
|
|
44
|
+
return (_jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-full mb-2 flex flex-col items-end gap-2 px-4", children: messages.map((msg) => (_jsx(Toast, { message: msg, onDismiss: onDismiss }, msg.id))) }));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=Toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../src/workbench/Toast.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
type UserDataPanelProps = {
|
|
2
2
|
embeddableId: string;
|
|
3
|
+
showToast: (text: string, type?: 'success' | 'error') => void;
|
|
3
4
|
};
|
|
4
|
-
export declare function UserDataPanel({ embeddableId }: UserDataPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare function UserDataPanel({ embeddableId, showToast }: UserDataPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
5
6
|
export {};
|
|
6
7
|
//# sourceMappingURL=UserDataPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserDataPanel.d.ts","sourceRoot":"","sources":["../../src/workbench/UserDataPanel.tsx"],"names":[],"mappings":"AAIA,KAAK,kBAAkB,GAAG;IACxB,YAAY,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"UserDataPanel.d.ts","sourceRoot":"","sources":["../../src/workbench/UserDataPanel.tsx"],"names":[],"mappings":"AAIA,KAAK,kBAAkB,GAAG;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,KAAK,IAAI,CAAA;CAC9D,CAAA;AA0LD,wBAAgB,aAAa,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CA6nB5E"}
|
|
@@ -143,7 +143,7 @@ function detectLanguagesFromFlow(flowJson) {
|
|
|
143
143
|
}
|
|
144
144
|
return Array.from(langCodes).sort();
|
|
145
145
|
}
|
|
146
|
-
export function UserDataPanel({ embeddableId }) {
|
|
146
|
+
export function UserDataPanel({ embeddableId, showToast }) {
|
|
147
147
|
const [rawJson, setRawJson] = useState('');
|
|
148
148
|
const [error, setError] = useState(null);
|
|
149
149
|
const [isSaving, setIsSaving] = useState(false);
|
|
@@ -319,6 +319,7 @@ export function UserDataPanel({ embeddableId }) {
|
|
|
319
319
|
setError(null);
|
|
320
320
|
try {
|
|
321
321
|
savvy.resetUserData(embeddableId);
|
|
322
|
+
showToast('User data reset — all values returned to defaults.');
|
|
322
323
|
// Hack - find all inputs inside the main page and set them to empty string
|
|
323
324
|
setTimeout(() => {
|
|
324
325
|
const inputs = document.querySelectorAll('savvy input');
|