@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.
- package/dist/DropZoneOverlay.d.ts +24 -0
- package/dist/DropZoneOverlay.d.ts.map +1 -0
- package/dist/DropZoneOverlay.js +53 -0
- package/dist/DropZoneOverlay.js.map +1 -0
- package/dist/EditorContext.d.ts +10 -2
- package/dist/EditorContext.d.ts.map +1 -1
- package/dist/EditorContext.js +49 -1
- package/dist/EditorContext.js.map +1 -1
- package/dist/EditorShell.d.ts +16 -1
- package/dist/EditorShell.d.ts.map +1 -1
- package/dist/EditorShell.js +55 -8
- package/dist/EditorShell.js.map +1 -1
- package/dist/ImageNodeView.d.ts +15 -0
- package/dist/ImageNodeView.d.ts.map +1 -0
- package/dist/ImageNodeView.js +52 -0
- package/dist/ImageNodeView.js.map +1 -0
- package/dist/MediaBin.d.ts +18 -0
- package/dist/MediaBin.d.ts.map +1 -0
- package/dist/MediaBin.js +141 -0
- package/dist/MediaBin.js.map +1 -0
- package/dist/PreviewControls.d.ts +41 -0
- package/dist/PreviewControls.d.ts.map +1 -0
- package/dist/PreviewControls.js +201 -0
- package/dist/PreviewControls.js.map +1 -0
- package/dist/PreviewPanel.d.ts +7 -7
- package/dist/PreviewPanel.d.ts.map +1 -1
- package/dist/PreviewPanel.js +183 -199
- package/dist/PreviewPanel.js.map +1 -1
- package/dist/Toolbar.d.ts +12 -1
- package/dist/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar.js +4 -12
- package/dist/Toolbar.js.map +1 -1
- package/dist/WysiwygEditor.d.ts.map +1 -1
- package/dist/WysiwygEditor.js +3 -1
- package/dist/WysiwygEditor.js.map +1 -1
- package/dist/hooks/useFileDrop.d.ts +41 -0
- package/dist/hooks/useFileDrop.d.ts.map +1 -0
- package/dist/hooks/useFileDrop.js +167 -0
- package/dist/hooks/useFileDrop.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/tiptapBridge.d.ts.map +1 -1
- package/dist/tiptapBridge.js +4 -5
- package/dist/tiptapBridge.js.map +1 -1
- package/dist/utils/dropUtils.d.ts +36 -0
- package/dist/utils/dropUtils.d.ts.map +1 -0
- package/dist/utils/dropUtils.js +71 -0
- package/dist/utils/dropUtils.js.map +1 -0
- package/package.json +5 -3
- package/src/DropZoneOverlay.tsx +137 -0
- package/src/EditorContext.tsx +64 -1
- package/src/EditorShell.tsx +153 -20
- package/src/ImageNodeView.tsx +70 -0
- package/src/MediaBin.tsx +223 -0
- package/src/PreviewControls.tsx +340 -0
- package/src/PreviewPanel.tsx +216 -287
- package/src/Toolbar.tsx +40 -3
- package/src/WysiwygEditor.tsx +3 -1
- package/src/hooks/useFileDrop.ts +226 -0
- package/src/index.ts +29 -0
- package/src/styles/editor.css +349 -8
- package/src/tiptapBridge.ts +5 -6
- package/src/utils/dropUtils.ts +88 -0
package/dist/MediaBin.js
ADDED
|
@@ -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":";AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAgBjE,+CAA+C;AAC/C,UAAU;AACV,+CAA+C;AAE/C,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,WAAW,CAAC;IACtD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,WAAW,CAAC;IACtD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,WAAW,CAAC;IACtD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,mBAAmB,CAAC;IACtF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,+CAA+C;AAC/C,YAAY;AACZ,+CAA+C;AAE/C,MAAM,UAAU,QAAQ,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAiB;IAC3E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAe,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAEpD,uEAAuE;IACvE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,UAAU,CAAC,EAAE,CAAC,CAAC;YACf,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,KAAK,UAAU,IAAI;YACjB,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,aAAc,CAAC,SAAS,EAAE,CAAC;gBAC9C,IAAI,SAAS;oBAAE,OAAO;gBAEtB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACjB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7C,IAAI,IAAI,KAAK,IAAI;wBAAE,OAAO,IAAI,GAAG,IAAI,CAAC;oBACtC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,CAAC;gBAEjB,MAAM,IAAI,GAA2B,EAAE,CAAC;gBACxC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;oBACzB,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAChC,IAAI,CAAC;4BACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,aAAc,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACjE,CAAC;wBAAC,MAAM,CAAC;4BACP,sBAAsB;wBACxB,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,SAAS;oBAAE,YAAY,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,SAAS;oBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC;QACP,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;IAEhC,mBAAmB;IAEnB,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,EAAE,CAAsC,EAAE,EAAE;QAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa;YAAE,OAAO;QAErC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,0BAA0B,CAAC;gBACzD,MAAM,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC;YACD,UAAU;YACV,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,IAAI,IAAI,KAAK,IAAI;oBAAE,OAAO,IAAI,GAAG,IAAI,CAAC;gBACtC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;YAEjB,MAAM,IAAI,GAA2B,EAAE,CAAC;YACxC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;gBACzB,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC;wBACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChE,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,IAAI,YAAY,CAAC,OAAO;gBAAE,YAAY,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;QAC5D,CAAC;IACH,CAAC,EACD,CAAC,aAAa,CAAC,CAChB,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,mBAAmB,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,aAE1E,eAAK,SAAS,EAAC,yBAAyB,aACtC,gBAAM,SAAS,EAAC,wBAAwB,uBAC/B,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAC7C,EAEP,iBACE,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,CAAC,aAAa,IAAI,OAAO,EACnC,KAAK,EACH,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,mDAAmD,yBAI/E,IACL,EAGN,eAAK,SAAS,EAAC,uBAAuB,aACnC,CAAC,aAAa,IAAI,CACjB,eAAK,SAAS,EAAC,wBAAwB,kCAErC,cAAM,oDAEF,CACP,EAEA,aAAa,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CACpD,cAAK,SAAS,EAAC,wBAAwB,8BAAoB,CAC5D,EAEA,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACrB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;wBAEtF,OAAO,CACL,eAEE,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,aAGnE,KAAK,CAAC,CAAC,CAAC,CACP,cAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAC,wBAAwB,GAAG,CACtE,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,uBAAuB,YAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAQ,CAC7E,EAGD,eAAK,SAAS,EAAC,uBAAuB,aACpC,cAAK,SAAS,EAAC,uBAAuB,YAAE,QAAQ,GAAO,EACvD,cAAK,SAAS,EAAC,uBAAuB,YAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAO,IACjE,KAfD,KAAK,CAAC,IAAI,CAgBX,CACP,CAAC;oBACJ,CAAC,CAAC,IACE,EAGN,gBACE,GAAG,EAAE,YAAY,EACjB,IAAI,EAAC,MAAM,EACX,QAAQ,QACR,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAC1B,QAAQ,EAAE,gBAAgB,GAC1B,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -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":";AAAA,yDAAyD;AACzD;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIhF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9F,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAoBzE,MAAM,sBAAsB,GAAG,aAAa,CAAyB,IAAI,CAAC,CAAC;AAE3E,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oEAAoE;AAEpE,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAmC;QAC9C,SAAS,EAAE,WAAW;QACtB,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,UAAU;KAClB,CAAC;IACF,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC;IAC/E,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IACxE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEtE,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,0BAA0B,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnF,SAAS,2BAA2B,CAAC,KAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAc;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC;AASD,MAAM,UAAU,uBAAuB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAgC;IACrF,MAAM,WAAW,GAAG,GAAG,EAAE,WAAW,CAAC;IAErC,WAAW;IACX,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,oBAAoB,CAAC,CAAC,EAC1D,CAAC,WAAW,CAAC,CACd,CAAC;IACF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAClF,SAAS,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,cAAc,IAAI,QAAQ,IAAI,WAAW,CAAC;IAC/D,MAAM,cAAc,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAEtD,eAAe;IACf,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/F,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IACzF,SAAS,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,mBAAmB,IAAI,MAAM,IAAI,OAAO,CAAC;IAEnE,QAAQ;IACR,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9F,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC5E,SAAS,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,eAAe,IAAI,OAAO,IAAI,UAAU,CAAC;IAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEhF,YAAY;IACZ,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,2BAA2B,CAAC,WAAW,EAAE,CAAC,iBAAiB,CAAC,CAAC,EACnE,CAAC,WAAW,CAAC,CACd,CAAC;IACF,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1F,SAAS,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAChE,MAAM,oBAAoB,GAAG,sBAAsB,IAAI,WAAW,IAAI,EAAE,CAAC;IAEzE,gBAAgB;IAChB,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,8BAA8B,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,CAAC,EACpE,CAAC,WAAW,CAAC,CACd,CAAC;IACF,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC,CAAC;IAC5F,SAAS,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GAAG,oBAAoB,IAAI,SAAS,IAAI,UAAU,CAAC;IAE3E,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,YAAY;QACZ,iBAAiB;QACjB,cAAc;QACd,iBAAiB;QACjB,sBAAsB;QACtB,aAAa;QACb,kBAAkB;QAClB,WAAW;QACX,oBAAoB;QACpB,yBAAyB;QACzB,kBAAkB;QAClB,uBAAuB;KACxB,CAAC,EACF;QACE,YAAY;QACZ,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,WAAW;QACX,oBAAoB;QACpB,kBAAkB;KACnB,CACF,CAAC;IAEF,OAAO,CACL,KAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAmC,CAC5F,CAAC;AACJ,CAAC;AAED,oEAAoE;AAEpE,MAAM,gBAAgB,GAA6C;IACjE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;IACnC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IAClC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE;IAC/B,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;CAClC,CAAC;AAEF,MAAM,oBAAoB,GAA0C;IAClE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAChC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;IACxC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE;CACrC,CAAC;AAEF,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAErF,MAAM,uBAAuB,GAAG;IAC9B,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;IAC1B,GAAG,0BAA0B,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;CAC3E,CAAC;AAEF,MAAM,qBAAqB,GAA2C;IACpE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACtC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;CACnC,CAAC;AAEF,oEAAoE;AAEpE,MAAM,UAAU,GAAwB;IACtC,KAAK,EAAE,mCAAmC;IAC1C,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,QAAQ;CACrB,CAAC;AAEF,MAAM,WAAW,GAAwB;IACvC,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,KAAK;IACnB,MAAM,EAAE,yCAAyC;IACjD,UAAU,EAAE,8BAA8B;IAC1C,KAAK,EAAE,6BAA6B;IACpC,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,oEAAoE;AAEpE;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;IAE/B,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,KAAK;YACV,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,OAAO;SACjB,aAED,gBAAO,KAAK,EAAE,UAAU,wBAAiB,EACzC,iBACE,KAAK,EAAE,CAAC,CAAC,YAAY,EACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAuB,CAAC,EACtE,KAAK,EAAE,WAAW,YAEjB,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC3B,iBAAoB,KAAK,EAAE,CAAC,CAAC,GAAG,YAC7B,CAAC,CAAC,KAAK,IADG,CAAC,CAAC,GAAG,CAET,CACV,CAAC,GACK,EAET,KAAC,OAAO,KAAG,EAEX,gBAAO,KAAK,EAAE,UAAU,sBAAe,EACvC,iBACE,KAAK,EAAE,CAAC,CAAC,iBAAiB,EAC1B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAoB,CAAC,EACxE,KAAK,EAAE,WAAW,YAEjB,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC/B,iBAAoB,KAAK,EAAE,CAAC,CAAC,GAAG,YAC7B,CAAC,CAAC,KAAK,IADG,CAAC,CAAC,GAAG,CAET,CACV,CAAC,GACK,EAET,KAAC,OAAO,KAAG,EAEX,gBAAO,KAAK,EAAE,UAAU,uBAAgB,EACxC,iBACE,KAAK,EAAE,CAAC,CAAC,aAAa,EACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACrD,KAAK,EAAE,WAAW,YAEjB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACxB,iBAAoB,KAAK,EAAE,CAAC,CAAC,GAAG,YAC7B,CAAC,CAAC,KAAK,IADG,CAAC,CAAC,GAAG,CAET,CACV,CAAC,GACK,EAET,KAAC,OAAO,KAAG,EAEX,gBAAO,KAAK,EAAE,UAAU,2BAAoB,EAC5C,iBACE,KAAK,EAAE,CAAC,CAAC,oBAAoB,EAC7B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5D,KAAK,EAAE,WAAW,YAEjB,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClC,iBAAoB,KAAK,EAAE,CAAC,CAAC,GAAG,YAC7B,CAAC,CAAC,KAAK,IADG,CAAC,CAAC,GAAG,CAET,CACV,CAAC,GACK,EAET,KAAC,OAAO,KAAG,EAEX,gBAAO,KAAK,EAAE,UAAU,0BAAmB,EAC3C,iBACE,KAAK,EAAE,CAAC,CAAC,kBAAkB,EAC3B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAqB,CAAC,EAC1E,KAAK,EAAE,WAAW,YAEjB,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChC,iBAAoB,KAAK,EAAE,CAAC,CAAC,GAAG,YAC7B,CAAC,CAAC,KAAK,IADG,CAAC,CAAC,GAAG,CAET,CACV,CAAC,GACK,IACL,CACP,CAAC;AACJ,CAAC;AAED,SAAS,OAAO;IACd,OAAO,CACL,eACE,KAAK,EAAE;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,+BAA+B;YAC3C,MAAM,EAAE,OAAO;SAChB,GACD,CACH,CAAC;AACJ,CAAC"}
|
package/dist/PreviewPanel.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
27
|
-
*
|
|
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;
|
|
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"}
|