@bendyline/squisq-editor-react 1.0.1 → 1.1.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.
Files changed (65) hide show
  1. package/dist/DropZoneOverlay.d.ts +24 -0
  2. package/dist/DropZoneOverlay.d.ts.map +1 -0
  3. package/dist/DropZoneOverlay.js +53 -0
  4. package/dist/DropZoneOverlay.js.map +1 -0
  5. package/dist/EditorContext.d.ts +10 -2
  6. package/dist/EditorContext.d.ts.map +1 -1
  7. package/dist/EditorContext.js +49 -1
  8. package/dist/EditorContext.js.map +1 -1
  9. package/dist/EditorShell.d.ts +16 -1
  10. package/dist/EditorShell.d.ts.map +1 -1
  11. package/dist/EditorShell.js +55 -8
  12. package/dist/EditorShell.js.map +1 -1
  13. package/dist/ImageNodeView.d.ts +15 -0
  14. package/dist/ImageNodeView.d.ts.map +1 -0
  15. package/dist/ImageNodeView.js +52 -0
  16. package/dist/ImageNodeView.js.map +1 -0
  17. package/dist/MediaBin.d.ts +18 -0
  18. package/dist/MediaBin.d.ts.map +1 -0
  19. package/dist/MediaBin.js +141 -0
  20. package/dist/MediaBin.js.map +1 -0
  21. package/dist/PreviewControls.d.ts +41 -0
  22. package/dist/PreviewControls.d.ts.map +1 -0
  23. package/dist/PreviewControls.js +201 -0
  24. package/dist/PreviewControls.js.map +1 -0
  25. package/dist/PreviewPanel.d.ts +7 -7
  26. package/dist/PreviewPanel.d.ts.map +1 -1
  27. package/dist/PreviewPanel.js +183 -199
  28. package/dist/PreviewPanel.js.map +1 -1
  29. package/dist/Toolbar.d.ts +12 -1
  30. package/dist/Toolbar.d.ts.map +1 -1
  31. package/dist/Toolbar.js +4 -12
  32. package/dist/Toolbar.js.map +1 -1
  33. package/dist/WysiwygEditor.d.ts.map +1 -1
  34. package/dist/WysiwygEditor.js +3 -1
  35. package/dist/WysiwygEditor.js.map +1 -1
  36. package/dist/hooks/useFileDrop.d.ts +41 -0
  37. package/dist/hooks/useFileDrop.d.ts.map +1 -0
  38. package/dist/hooks/useFileDrop.js +167 -0
  39. package/dist/hooks/useFileDrop.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +6 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/tiptapBridge.d.ts.map +1 -1
  45. package/dist/tiptapBridge.js +4 -5
  46. package/dist/tiptapBridge.js.map +1 -1
  47. package/dist/utils/dropUtils.d.ts +36 -0
  48. package/dist/utils/dropUtils.d.ts.map +1 -0
  49. package/dist/utils/dropUtils.js +71 -0
  50. package/dist/utils/dropUtils.js.map +1 -0
  51. package/package.json +5 -3
  52. package/src/DropZoneOverlay.tsx +137 -0
  53. package/src/EditorContext.tsx +64 -1
  54. package/src/EditorShell.tsx +153 -20
  55. package/src/ImageNodeView.tsx +70 -0
  56. package/src/MediaBin.tsx +223 -0
  57. package/src/PreviewControls.tsx +340 -0
  58. package/src/PreviewPanel.tsx +216 -287
  59. package/src/Toolbar.tsx +40 -3
  60. package/src/WysiwygEditor.tsx +3 -1
  61. package/src/hooks/useFileDrop.ts +226 -0
  62. package/src/index.ts +29 -0
  63. package/src/styles/editor.css +349 -8
  64. package/src/tiptapBridge.ts +5 -6
  65. package/src/utils/dropUtils.ts +88 -0
@@ -0,0 +1,141 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * MediaBin
4
+ *
5
+ * Toggleable side panel that displays files associated with the current
6
+ * content. Shows image thumbnails, icons for other types, file sizes,
7
+ * and provides an upload button to add new media.
8
+ */
9
+ import { useState, useEffect, useRef, useCallback } from 'react';
10
+ // ============================================
11
+ // Helpers
12
+ // ============================================
13
+ function formatSize(bytes) {
14
+ if (bytes < 1024)
15
+ return `${bytes} B`;
16
+ if (bytes < 1024 * 1024)
17
+ return `${(bytes / 1024).toFixed(1)} KB`;
18
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
19
+ }
20
+ function iconForMime(mimeType) {
21
+ if (mimeType.startsWith('image/'))
22
+ return '\u{1F5BC}';
23
+ if (mimeType.startsWith('audio/'))
24
+ return '\u{1F50A}';
25
+ if (mimeType.startsWith('video/'))
26
+ return '\u{1F3AC}';
27
+ if (mimeType.includes('json'))
28
+ return '{ }';
29
+ if (mimeType.includes('xml') || mimeType.includes('ssml'))
30
+ return '\u{2329}/\u{232A}';
31
+ return '\u{1F4C4}';
32
+ }
33
+ function isImageMime(mimeType) {
34
+ return mimeType.startsWith('image/');
35
+ }
36
+ // ============================================
37
+ // Component
38
+ // ============================================
39
+ export function MediaBin({ mediaProvider, isDark, refreshKey }) {
40
+ const [entries, setEntries] = useState([]);
41
+ const [thumbUrls, setThumbUrls] = useState({});
42
+ const [loading, setLoading] = useState(false);
43
+ const fileInputRef = useRef(null);
44
+ // Scan media entries whenever the provider changes or refreshKey bumps
45
+ useEffect(() => {
46
+ if (!mediaProvider) {
47
+ setEntries([]);
48
+ setThumbUrls({});
49
+ return;
50
+ }
51
+ let cancelled = false;
52
+ async function scan() {
53
+ setLoading(true);
54
+ try {
55
+ const list = await mediaProvider.listMedia();
56
+ if (cancelled)
57
+ return;
58
+ list.sort((a, b) => {
59
+ const aImg = isImageMime(a.mimeType) ? 0 : 1;
60
+ const bImg = isImageMime(b.mimeType) ? 0 : 1;
61
+ if (aImg !== bImg)
62
+ return aImg - bImg;
63
+ return a.name.localeCompare(b.name);
64
+ });
65
+ setEntries(list);
66
+ const urls = {};
67
+ for (const entry of list) {
68
+ if (isImageMime(entry.mimeType)) {
69
+ try {
70
+ urls[entry.name] = await mediaProvider.resolveUrl(entry.name);
71
+ }
72
+ catch {
73
+ // skip failed resolve
74
+ }
75
+ }
76
+ }
77
+ if (!cancelled)
78
+ setThumbUrls(urls);
79
+ }
80
+ finally {
81
+ if (!cancelled)
82
+ setLoading(false);
83
+ }
84
+ }
85
+ scan();
86
+ return () => {
87
+ cancelled = true;
88
+ };
89
+ }, [mediaProvider, refreshKey]);
90
+ // ---- Upload ----
91
+ const handleUploadClick = useCallback(() => {
92
+ fileInputRef.current?.click();
93
+ }, []);
94
+ const handleFileChange = useCallback(async (e) => {
95
+ const files = e.target.files;
96
+ if (!files || !mediaProvider)
97
+ return;
98
+ setLoading(true);
99
+ try {
100
+ for (let i = 0; i < files.length; i++) {
101
+ const file = files[i];
102
+ const buffer = await file.arrayBuffer();
103
+ const mimeType = file.type || 'application/octet-stream';
104
+ await mediaProvider.addMedia(file.name, buffer, mimeType);
105
+ }
106
+ // Re-scan
107
+ const list = await mediaProvider.listMedia();
108
+ list.sort((a, b) => {
109
+ const aImg = isImageMime(a.mimeType) ? 0 : 1;
110
+ const bImg = isImageMime(b.mimeType) ? 0 : 1;
111
+ if (aImg !== bImg)
112
+ return aImg - bImg;
113
+ return a.name.localeCompare(b.name);
114
+ });
115
+ setEntries(list);
116
+ const urls = {};
117
+ for (const entry of list) {
118
+ if (isImageMime(entry.mimeType)) {
119
+ try {
120
+ urls[entry.name] = await mediaProvider.resolveUrl(entry.name);
121
+ }
122
+ catch {
123
+ // skip
124
+ }
125
+ }
126
+ }
127
+ setThumbUrls(urls);
128
+ }
129
+ finally {
130
+ setLoading(false);
131
+ if (fileInputRef.current)
132
+ fileInputRef.current.value = '';
133
+ }
134
+ }, [mediaProvider]);
135
+ return (_jsxs("div", { className: `squisq-media-bin${isDark ? ' squisq-media-bin--dark' : ''}`, children: [_jsxs("div", { className: "squisq-media-bin-header", children: [_jsxs("span", { className: "squisq-media-bin-title", children: ["Files ", entries.length > 0 && `(${entries.length})`] }), _jsx("button", { className: "squisq-media-bin-upload", onClick: handleUploadClick, disabled: !mediaProvider || loading, title: mediaProvider ? 'Upload files' : 'Load a content zip or select a storage slot first', children: "+ Upload" })] }), _jsxs("div", { className: "squisq-media-bin-list", children: [!mediaProvider && (_jsxs("div", { className: "squisq-media-bin-empty", children: ["No media context.", _jsx("br", {}), "Load a content zip or select a storage slot."] })), mediaProvider && entries.length === 0 && !loading && (_jsx("div", { className: "squisq-media-bin-empty", children: "No files yet." })), entries.map((entry) => {
136
+ const thumb = thumbUrls[entry.name];
137
+ const basename = entry.name.includes('/') ? entry.name.split('/').pop() : entry.name;
138
+ return (_jsxs("div", { className: "squisq-media-bin-item", title: `${entry.name}\n${entry.mimeType}\n${formatSize(entry.size)}`, children: [thumb ? (_jsx("img", { src: thumb, alt: basename, className: "squisq-media-bin-thumb" })) : (_jsx("span", { className: "squisq-media-bin-icon", children: iconForMime(entry.mimeType) })), _jsxs("div", { className: "squisq-media-bin-meta", children: [_jsx("div", { className: "squisq-media-bin-name", children: basename }), _jsx("div", { className: "squisq-media-bin-size", children: formatSize(entry.size) })] })] }, entry.name));
139
+ })] }), _jsx("input", { ref: fileInputRef, type: "file", multiple: true, style: { display: 'none' }, onChange: handleFileChange })] }));
140
+ }
141
+ //# sourceMappingURL=MediaBin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaBin.js","sourceRoot":"","sources":["../src/MediaBin.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * PreviewControls
3
+ *
4
+ * Shared context and inline toolbar component for preview settings
5
+ * (viewport format, display mode, theme, transform, caption style).
6
+ *
7
+ * The context is provided by EditorShell and consumed by both:
8
+ * - PreviewControls (toolbar dropdowns, rendered in the main toolbar)
9
+ * - PreviewPanel (the actual player, which reads the selected values)
10
+ */
11
+ import type { ReactNode } from 'react';
12
+ import type { DisplayMode, CaptionStyle } from '@bendyline/squisq-react';
13
+ import type { ViewportPreset, ViewportConfig } from '@bendyline/squisq/schemas';
14
+ import type { Theme } from '@bendyline/squisq/schemas';
15
+ import type { Doc } from '@bendyline/squisq/schemas';
16
+ export interface PreviewSettings {
17
+ activePreset: ViewportPreset;
18
+ setSelectedPreset: (preset: ViewportPreset | null) => void;
19
+ activeViewport: ViewportConfig;
20
+ activeDisplayMode: DisplayMode;
21
+ setSelectedDisplayMode: (mode: DisplayMode | null) => void;
22
+ activeThemeId: string;
23
+ setSelectedThemeId: (id: string | null) => void;
24
+ activeTheme: Theme;
25
+ activeTransformStyle: string;
26
+ setSelectedTransformStyle: (id: string | null) => void;
27
+ activeCaptionStyle: CaptionStyle;
28
+ setSelectedCaptionStyle: (style: CaptionStyle | null) => void;
29
+ }
30
+ export declare function usePreviewSettings(): PreviewSettings;
31
+ export interface PreviewSettingsProviderProps {
32
+ doc: Doc | null;
33
+ children: ReactNode;
34
+ }
35
+ export declare function PreviewSettingsProvider({ doc, children }: PreviewSettingsProviderProps): import("react/jsx-runtime").JSX.Element;
36
+ /**
37
+ * Inline preview controls rendered in the main toolbar row.
38
+ * Reads from PreviewSettingsContext.
39
+ */
40
+ export declare function PreviewToolbarControls(): import("react/jsx-runtime").JSX.Element;
41
+ //# sourceMappingURL=PreviewControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewControls.d.ts","sourceRoot":"","sources":["../src/PreviewControls.tsx"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAIrD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,cAAc,CAAC;IAC7B,iBAAiB,EAAE,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,WAAW,CAAC;IAC/B,sBAAsB,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,WAAW,EAAE,KAAK,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,yBAAyB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,kBAAkB,EAAE,YAAY,CAAC;IACjC,uBAAuB,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/D;AAID,wBAAgB,kBAAkB,IAAI,eAAe,CAIpD;AAgED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,4BAA4B,2CAyEtF;AAiDD;;;GAGG;AACH,wBAAgB,sBAAsB,4CAuFrC"}
@@ -0,0 +1,201 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* eslint-disable react-refresh/only-export-components */
3
+ /**
4
+ * PreviewControls
5
+ *
6
+ * Shared context and inline toolbar component for preview settings
7
+ * (viewport format, display mode, theme, transform, caption style).
8
+ *
9
+ * The context is provided by EditorShell and consumed by both:
10
+ * - PreviewControls (toolbar dropdowns, rendered in the main toolbar)
11
+ * - PreviewPanel (the actual player, which reads the selected values)
12
+ */
13
+ import { createContext, useContext, useState, useMemo, useEffect } from 'react';
14
+ import { VIEWPORT_PRESETS, getThemeSummaries, resolveTheme } from '@bendyline/squisq/schemas';
15
+ import { getTransformStyleSummaries } from '@bendyline/squisq/transform';
16
+ const PreviewSettingsContext = createContext(null);
17
+ export function usePreviewSettings() {
18
+ const ctx = useContext(PreviewSettingsContext);
19
+ if (!ctx)
20
+ throw new Error('usePreviewSettings must be used within PreviewSettingsProvider');
21
+ return ctx;
22
+ }
23
+ // ── Frontmatter resolvers ────────────────────────────────────────
24
+ function resolveRenderAs(value) {
25
+ if (typeof value !== 'string')
26
+ return null;
27
+ const v = value.trim().toLowerCase();
28
+ const mapping = {
29
+ landscape: 'landscape',
30
+ '16:9': 'landscape',
31
+ widescreen: 'landscape',
32
+ portrait: 'portrait',
33
+ '9:16': 'portrait',
34
+ vertical: 'portrait',
35
+ stories: 'portrait',
36
+ square: 'square',
37
+ '1:1': 'square',
38
+ standard: 'standard',
39
+ '4:3': 'standard',
40
+ };
41
+ return mapping[v] ?? null;
42
+ }
43
+ function resolveDisplayMode(value) {
44
+ if (typeof value !== 'string')
45
+ return null;
46
+ const v = value.trim().toLowerCase();
47
+ if (v === 'video' || v === 'slideshow' || v === 'linear')
48
+ return v;
49
+ if (v === 'slides' || v === 'presentation' || v === 'deck')
50
+ return 'slideshow';
51
+ if (v === 'document' || v === 'scroll' || v === 'page')
52
+ return 'linear';
53
+ return null;
54
+ }
55
+ const VALID_THEME_IDS = new Set(getThemeSummaries().map((s) => s.id));
56
+ function resolveFrontmatterTheme(value) {
57
+ if (typeof value !== 'string')
58
+ return null;
59
+ const v = value.trim().toLowerCase();
60
+ if (VALID_THEME_IDS.has(v))
61
+ return v;
62
+ const normalized = v.replace(/\s+/g, '-');
63
+ if (VALID_THEME_IDS.has(normalized))
64
+ return normalized;
65
+ return null;
66
+ }
67
+ const VALID_TRANSFORM_IDS = new Set(getTransformStyleSummaries().map((s) => s.id));
68
+ function resolveFrontmatterTransform(value) {
69
+ if (typeof value !== 'string')
70
+ return null;
71
+ const v = value.trim().toLowerCase();
72
+ if (VALID_TRANSFORM_IDS.has(v))
73
+ return v;
74
+ const normalized = v.replace(/\s+/g, '-');
75
+ if (VALID_TRANSFORM_IDS.has(normalized))
76
+ return normalized;
77
+ return null;
78
+ }
79
+ function resolveFrontmatterCaptionStyle(value) {
80
+ if (typeof value !== 'string')
81
+ return null;
82
+ const v = value.trim().toLowerCase();
83
+ if (v === 'standard' || v === 'social')
84
+ return v;
85
+ if (v === 'instagram' || v === 'tiktok' || v === 'reels')
86
+ return 'social';
87
+ return null;
88
+ }
89
+ export function PreviewSettingsProvider({ doc, children }) {
90
+ const frontmatter = doc?.frontmatter;
91
+ // Viewport
92
+ const fmPreset = useMemo(() => resolveRenderAs(frontmatter?.['document-render-as']), [frontmatter]);
93
+ const [selectedPreset, setSelectedPreset] = useState(null);
94
+ useEffect(() => setSelectedPreset(null), [fmPreset]);
95
+ const activePreset = selectedPreset ?? fmPreset ?? 'landscape';
96
+ const activeViewport = VIEWPORT_PRESETS[activePreset];
97
+ // Display mode
98
+ const fmMode = useMemo(() => resolveDisplayMode(frontmatter?.['display-mode']), [frontmatter]);
99
+ const [selectedDisplayMode, setSelectedDisplayMode] = useState(null);
100
+ useEffect(() => setSelectedDisplayMode(null), [fmMode]);
101
+ const activeDisplayMode = selectedDisplayMode ?? fmMode ?? 'video';
102
+ // Theme
103
+ const fmTheme = useMemo(() => resolveFrontmatterTheme(frontmatter?.['theme']), [frontmatter]);
104
+ const [selectedThemeId, setSelectedThemeId] = useState(null);
105
+ useEffect(() => setSelectedThemeId(null), [fmTheme]);
106
+ const activeThemeId = selectedThemeId ?? fmTheme ?? 'standard';
107
+ const activeTheme = useMemo(() => resolveTheme(activeThemeId), [activeThemeId]);
108
+ // Transform
109
+ const fmTransform = useMemo(() => resolveFrontmatterTransform(frontmatter?.['transform-style']), [frontmatter]);
110
+ const [selectedTransformStyle, setSelectedTransformStyle] = useState(null);
111
+ useEffect(() => setSelectedTransformStyle(null), [fmTransform]);
112
+ const activeTransformStyle = selectedTransformStyle ?? fmTransform ?? '';
113
+ // Caption style
114
+ const fmCaption = useMemo(() => resolveFrontmatterCaptionStyle(frontmatter?.['caption-style']), [frontmatter]);
115
+ const [selectedCaptionStyle, setSelectedCaptionStyle] = useState(null);
116
+ useEffect(() => setSelectedCaptionStyle(null), [fmCaption]);
117
+ const activeCaptionStyle = selectedCaptionStyle ?? fmCaption ?? 'standard';
118
+ const value = useMemo(() => ({
119
+ activePreset,
120
+ setSelectedPreset,
121
+ activeViewport,
122
+ activeDisplayMode,
123
+ setSelectedDisplayMode,
124
+ activeThemeId,
125
+ setSelectedThemeId,
126
+ activeTheme,
127
+ activeTransformStyle,
128
+ setSelectedTransformStyle,
129
+ activeCaptionStyle,
130
+ setSelectedCaptionStyle,
131
+ }), [
132
+ activePreset,
133
+ activeViewport,
134
+ activeDisplayMode,
135
+ activeThemeId,
136
+ activeTheme,
137
+ activeTransformStyle,
138
+ activeCaptionStyle,
139
+ ]);
140
+ return (_jsx(PreviewSettingsContext.Provider, { value: value, children: children }));
141
+ }
142
+ // ── Dropdown options ─────────────────────────────────────────────
143
+ const VIEWPORT_OPTIONS = [
144
+ { key: 'landscape', label: '16:9' },
145
+ { key: 'portrait', label: '9:16' },
146
+ { key: 'square', label: '1:1' },
147
+ { key: 'standard', label: '4:3' },
148
+ ];
149
+ const DISPLAY_MODE_OPTIONS = [
150
+ { key: 'video', label: 'Video' },
151
+ { key: 'slideshow', label: 'Slideshow' },
152
+ { key: 'linear', label: 'Document' },
153
+ ];
154
+ const THEME_OPTIONS = getThemeSummaries().map((s) => ({ key: s.id, label: s.name }));
155
+ const TRANSFORM_STYLE_OPTIONS = [
156
+ { key: '', label: 'None' },
157
+ ...getTransformStyleSummaries().map((s) => ({ key: s.id, label: s.name })),
158
+ ];
159
+ const CAPTION_STYLE_OPTIONS = [
160
+ { key: 'standard', label: 'Standard' },
161
+ { key: 'social', label: 'Social' },
162
+ ];
163
+ // ── Shared styles ────────────────────────────────────────────────
164
+ const labelStyle = {
165
+ color: 'var(--squisq-text-muted, #6b7280)',
166
+ fontSize: '12px',
167
+ whiteSpace: 'nowrap',
168
+ };
169
+ const selectStyle = {
170
+ padding: '2px 6px',
171
+ borderRadius: '4px',
172
+ border: '1px solid var(--squisq-border, #d1d5db)',
173
+ background: 'var(--squisq-input-bg, #fff)',
174
+ color: 'var(--squisq-text, #1f2937)',
175
+ fontSize: '12px',
176
+ cursor: 'pointer',
177
+ };
178
+ // ── Toolbar Controls Component ───────────────────────────────────
179
+ /**
180
+ * Inline preview controls rendered in the main toolbar row.
181
+ * Reads from PreviewSettingsContext.
182
+ */
183
+ export function PreviewToolbarControls() {
184
+ const s = usePreviewSettings();
185
+ return (_jsxs("div", { style: {
186
+ display: 'flex',
187
+ alignItems: 'center',
188
+ gap: '6px',
189
+ flexWrap: 'wrap',
190
+ padding: '2px 0',
191
+ }, children: [_jsx("label", { style: labelStyle, children: "Format:" }), _jsx("select", { value: s.activePreset, onChange: (e) => s.setSelectedPreset(e.target.value), style: selectStyle, children: VIEWPORT_OPTIONS.map((o) => (_jsx("option", { value: o.key, children: o.label }, o.key))) }), _jsx(Divider, {}), _jsx("label", { style: labelStyle, children: "Mode:" }), _jsx("select", { value: s.activeDisplayMode, onChange: (e) => s.setSelectedDisplayMode(e.target.value), style: selectStyle, children: DISPLAY_MODE_OPTIONS.map((o) => (_jsx("option", { value: o.key, children: o.label }, o.key))) }), _jsx(Divider, {}), _jsx("label", { style: labelStyle, children: "Theme:" }), _jsx("select", { value: s.activeThemeId, onChange: (e) => s.setSelectedThemeId(e.target.value), style: selectStyle, children: THEME_OPTIONS.map((o) => (_jsx("option", { value: o.key, children: o.label }, o.key))) }), _jsx(Divider, {}), _jsx("label", { style: labelStyle, children: "Transform:" }), _jsx("select", { value: s.activeTransformStyle, onChange: (e) => s.setSelectedTransformStyle(e.target.value), style: selectStyle, children: TRANSFORM_STYLE_OPTIONS.map((o) => (_jsx("option", { value: o.key, children: o.label }, o.key))) }), _jsx(Divider, {}), _jsx("label", { style: labelStyle, children: "Captions:" }), _jsx("select", { value: s.activeCaptionStyle, onChange: (e) => s.setSelectedCaptionStyle(e.target.value), style: selectStyle, children: CAPTION_STYLE_OPTIONS.map((o) => (_jsx("option", { value: o.key, children: o.label }, o.key))) })] }));
192
+ }
193
+ function Divider() {
194
+ return (_jsx("span", { style: {
195
+ width: '1px',
196
+ height: '16px',
197
+ background: 'var(--squisq-border, #d1d5db)',
198
+ margin: '0 2px',
199
+ } }));
200
+ }
201
+ //# sourceMappingURL=PreviewControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewControls.js","sourceRoot":"","sources":["../src/PreviewControls.tsx"],"names":[],"mappings":"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"}
@@ -15,19 +15,19 @@
15
15
  * (the player enters fallback-timer mode when audio can't load)
16
16
  * 4. Passing the prepared Doc to DocPlayer for SVG-based rendering
17
17
  */
18
+ import type { ContentContainer } from '@bendyline/squisq/storage';
18
19
  export interface PreviewPanelProps {
19
20
  /** Base path for resolving media URLs in DocPlayer */
20
21
  basePath?: string;
21
22
  /** Additional class name for the container */
22
23
  className?: string;
24
+ /** Optional ContentContainer for audio mapping (MP3 discovery + timing.json) */
25
+ container?: ContentContainer | null;
23
26
  }
24
27
  /**
25
- * Live preview panel that renders the current document as a slideshow.
26
- * Uses DocPlayer from @bendyline/squisq-react for SVG block rendering
27
- * with template expansion, transitions, and playback controls.
28
- *
29
- * Includes a viewport format dropdown above the player. The default
30
- * format can be hinted via YAML frontmatter `document-render-as:`.
28
+ * Live preview panel that renders the current document as a slideshow
29
+ * or document view. Controls (viewport, mode, theme, transform, captions)
30
+ * are rendered in the main toolbar via PreviewToolbarControls.
31
31
  */
32
- export declare function PreviewPanel({ basePath, className }: PreviewPanelProps): import("react/jsx-runtime").JSX.Element;
32
+ export declare function PreviewPanel({ basePath, className, container }: PreviewPanelProps): import("react/jsx-runtime").JSX.Element;
33
33
  //# sourceMappingURL=PreviewPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewPanel.d.ts","sourceRoot":"","sources":["../src/PreviewPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+OD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAc,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAuR5E"}
1
+ {"version":3,"file":"PreviewPanel.d.ts","sourceRoot":"","sources":["../src/PreviewPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAYH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAIlE,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,SAAS,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACrC;AAmUD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAc,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CA2HvF"}