@bendyline/docblocks-react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/AppMenu/AppMenu.d.ts +11 -0
  4. package/dist/AppMenu/AppMenu.d.ts.map +1 -0
  5. package/dist/AppMenu/AppMenu.js +27 -0
  6. package/dist/AppMenu/AppMenu.js.map +1 -0
  7. package/dist/AppMenu/index.d.ts +3 -0
  8. package/dist/AppMenu/index.d.ts.map +1 -0
  9. package/dist/AppMenu/index.js +2 -0
  10. package/dist/AppMenu/index.js.map +1 -0
  11. package/dist/DocBlocksShell/DocBlocksShell.d.ts +16 -0
  12. package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +1 -0
  13. package/dist/DocBlocksShell/DocBlocksShell.js +487 -0
  14. package/dist/DocBlocksShell/DocBlocksShell.js.map +1 -0
  15. package/dist/DocBlocksShell/index.d.ts +3 -0
  16. package/dist/DocBlocksShell/index.d.ts.map +1 -0
  17. package/dist/DocBlocksShell/index.js +2 -0
  18. package/dist/DocBlocksShell/index.js.map +1 -0
  19. package/dist/Export/ExportDialog.d.ts +16 -0
  20. package/dist/Export/ExportDialog.d.ts.map +1 -0
  21. package/dist/Export/ExportDialog.js +42 -0
  22. package/dist/Export/ExportDialog.js.map +1 -0
  23. package/dist/Export/ExportToolbarControls.d.ts +17 -0
  24. package/dist/Export/ExportToolbarControls.d.ts.map +1 -0
  25. package/dist/Export/ExportToolbarControls.js +109 -0
  26. package/dist/Export/ExportToolbarControls.js.map +1 -0
  27. package/dist/Export/export-options.d.ts +18 -0
  28. package/dist/Export/export-options.d.ts.map +1 -0
  29. package/dist/Export/export-options.js +44 -0
  30. package/dist/Export/export-options.js.map +1 -0
  31. package/dist/Export/index.d.ts +6 -0
  32. package/dist/Export/index.d.ts.map +1 -0
  33. package/dist/Export/index.js +3 -0
  34. package/dist/Export/index.js.map +1 -0
  35. package/dist/Export/run-export.d.ts +8 -0
  36. package/dist/Export/run-export.d.ts.map +1 -0
  37. package/dist/Export/run-export.js +208 -0
  38. package/dist/Export/run-export.js.map +1 -0
  39. package/dist/FileExplorer/FileExplorer.d.ts +21 -0
  40. package/dist/FileExplorer/FileExplorer.d.ts.map +1 -0
  41. package/dist/FileExplorer/FileExplorer.js +125 -0
  42. package/dist/FileExplorer/FileExplorer.js.map +1 -0
  43. package/dist/FileExplorer/FileTreeNode.d.ts +18 -0
  44. package/dist/FileExplorer/FileTreeNode.d.ts.map +1 -0
  45. package/dist/FileExplorer/FileTreeNode.js +86 -0
  46. package/dist/FileExplorer/FileTreeNode.js.map +1 -0
  47. package/dist/FileExplorer/index.d.ts +6 -0
  48. package/dist/FileExplorer/index.d.ts.map +1 -0
  49. package/dist/FileExplorer/index.js +4 -0
  50. package/dist/FileExplorer/index.js.map +1 -0
  51. package/dist/FileExplorer/useFileTree.d.ts +35 -0
  52. package/dist/FileExplorer/useFileTree.d.ts.map +1 -0
  53. package/dist/FileExplorer/useFileTree.js +124 -0
  54. package/dist/FileExplorer/useFileTree.js.map +1 -0
  55. package/dist/WorkspacePicker/WorkspacePicker.d.ts +17 -0
  56. package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +1 -0
  57. package/dist/WorkspacePicker/WorkspacePicker.js +57 -0
  58. package/dist/WorkspacePicker/WorkspacePicker.js.map +1 -0
  59. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts +10 -0
  60. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts.map +1 -0
  61. package/dist/WorkspacePicker/WorkspaceSettingsButton.js +27 -0
  62. package/dist/WorkspacePicker/WorkspaceSettingsButton.js.map +1 -0
  63. package/dist/WorkspacePicker/index.d.ts +3 -0
  64. package/dist/WorkspacePicker/index.d.ts.map +1 -0
  65. package/dist/WorkspacePicker/index.js +2 -0
  66. package/dist/WorkspacePicker/index.js.map +1 -0
  67. package/dist/hooks/index.d.ts +2 -0
  68. package/dist/hooks/index.d.ts.map +1 -0
  69. package/dist/hooks/index.js +2 -0
  70. package/dist/hooks/index.js.map +1 -0
  71. package/dist/hooks/useAutoSave.d.ts +9 -0
  72. package/dist/hooks/useAutoSave.d.ts.map +1 -0
  73. package/dist/hooks/useAutoSave.js +48 -0
  74. package/dist/hooks/useAutoSave.js.map +1 -0
  75. package/dist/icons.d.ts +6 -0
  76. package/dist/icons.d.ts.map +1 -0
  77. package/dist/icons.js +24 -0
  78. package/dist/icons.js.map +1 -0
  79. package/dist/index.d.ts +20 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +19 -0
  82. package/dist/index.js.map +1 -0
  83. package/package.json +65 -0
  84. package/src/AppMenu/AppMenu.tsx +124 -0
  85. package/src/AppMenu/index.ts +2 -0
  86. package/src/DocBlocksShell/DocBlocksShell.tsx +662 -0
  87. package/src/DocBlocksShell/index.ts +2 -0
  88. package/src/Export/ExportDialog.tsx +173 -0
  89. package/src/Export/ExportToolbarControls.tsx +183 -0
  90. package/src/Export/export-options.ts +57 -0
  91. package/src/Export/index.ts +5 -0
  92. package/src/Export/run-export.ts +238 -0
  93. package/src/FileExplorer/FileExplorer.tsx +260 -0
  94. package/src/FileExplorer/FileTreeNode.tsx +172 -0
  95. package/src/FileExplorer/index.ts +5 -0
  96. package/src/FileExplorer/useFileTree.ts +178 -0
  97. package/src/WorkspacePicker/WorkspacePicker.tsx +126 -0
  98. package/src/WorkspacePicker/WorkspaceSettingsButton.tsx +79 -0
  99. package/src/WorkspacePicker/index.ts +2 -0
  100. package/src/hooks/index.ts +1 -0
  101. package/src/hooks/useAutoSave.ts +58 -0
  102. package/src/icons.tsx +60 -0
  103. package/src/index.ts +31 -0
  104. package/src/styles/docblocks.css +961 -0
@@ -0,0 +1,487 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * DocBlocksShell — top-level layout component.
4
+ *
5
+ * Composes the left sidebar (WorkspacePicker + FileExplorer) with
6
+ * the center editor area (squisq EditorShell).
7
+ */
8
+ import { useState, useCallback, useEffect, useRef } from 'react';
9
+ import { EditorShell } from '@bendyline/squisq-editor-react';
10
+ import '@bendyline/squisq-editor-react/styles';
11
+ import { MediaContext } from '@bendyline/squisq-react';
12
+ import { createMediaProviderFromContainer } from '@bendyline/squisq/storage';
13
+ import { IndexedDBFileSystemProvider, IndexedDBContentContainer, openNativeFolder, restoreNativeFolder, removeDirectoryHandle, } from '@bendyline/docblocks/filesystem';
14
+ import { ensureDefaultWorkspace, getWorkspace, listWorkspaces, removeWorkspace, saveWorkspace, touchWorkspace, } from '@bendyline/docblocks/workspace';
15
+ import { AppMenu } from '../AppMenu/AppMenu.js';
16
+ import { FileExplorer } from '../FileExplorer/FileExplorer.js';
17
+ import { WorkspacePicker } from '../WorkspacePicker/WorkspacePicker.js';
18
+ import { WorkspaceSettingsButton } from '../WorkspacePicker/WorkspaceSettingsButton.js';
19
+ import { useAutoSave } from '../hooks/useAutoSave.js';
20
+ import { ExportToolbarControls } from '../Export/ExportToolbarControls.js';
21
+ function useOsTheme() {
22
+ const [dark, setDark] = useState(() => typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches);
23
+ useEffect(() => {
24
+ const mq = window.matchMedia('(prefers-color-scheme: dark)');
25
+ const handler = (e) => setDark(e.matches);
26
+ mq.addEventListener('change', handler);
27
+ return () => mq.removeEventListener('change', handler);
28
+ }, []);
29
+ return dark ? 'dark' : 'light';
30
+ }
31
+ /** Encode workspace + optional file path into a URL hash. */
32
+ function buildHash(workspaceId, filePath) {
33
+ const ws = encodeURIComponent(workspaceId);
34
+ if (!filePath)
35
+ return `#${ws}`;
36
+ const fp = filePath.replace(/^\//, '');
37
+ return `#${ws}/${encodeURIComponent(fp)}`;
38
+ }
39
+ /** Decode the current URL hash into workspace id + file path. */
40
+ function parseHash() {
41
+ const raw = window.location.hash.slice(1);
42
+ if (!raw)
43
+ return null;
44
+ const slashIdx = raw.indexOf('/');
45
+ if (slashIdx === -1) {
46
+ return { workspaceId: decodeURIComponent(raw), filePath: null };
47
+ }
48
+ return {
49
+ workspaceId: decodeURIComponent(raw.slice(0, slashIdx)),
50
+ filePath: '/' + decodeURIComponent(raw.slice(slashIdx + 1)),
51
+ };
52
+ }
53
+ function useIsMobile(breakpoint = 768) {
54
+ const [isMobile, setIsMobile] = useState(() => typeof window !== 'undefined' && window.matchMedia(`(max-width: ${breakpoint}px)`).matches);
55
+ useEffect(() => {
56
+ const mq = window.matchMedia(`(max-width: ${breakpoint}px)`);
57
+ const handler = (e) => setIsMobile(e.matches);
58
+ mq.addEventListener('change', handler);
59
+ return () => mq.removeEventListener('change', handler);
60
+ }, [breakpoint]);
61
+ return isMobile;
62
+ }
63
+ export function DocBlocksShell({ theme = 'auto', logoUrl }) {
64
+ const osTheme = useOsTheme();
65
+ const resolvedTheme = theme === 'auto' ? osTheme : theme;
66
+ const isMobile = useIsMobile();
67
+ const [mobileShowEditor, setMobileShowEditor] = useState(false);
68
+ const [provider, setProvider] = useState(null);
69
+ const [activeWorkspaceId, setActiveWorkspaceId] = useState(null);
70
+ const [selectedFile, setSelectedFile] = useState(null);
71
+ const [selectedFolder, setSelectedFolder] = useState(null);
72
+ const [folderEntries, setFolderEntries] = useState([]);
73
+ const [editorContent, setEditorContent] = useState('');
74
+ const [editorKey, setEditorKey] = useState(0);
75
+ const [explorerKey, setExplorerKey] = useState(0);
76
+ const [initialView, setInitialView] = useState('wysiwyg');
77
+ /** Suppress popstate handling during programmatic navigation. */
78
+ const skipPopState = useRef(false);
79
+ /** Persistent media container backed by IndexedDB (survives page refresh). */
80
+ const mediaContainerRef = useRef(null);
81
+ const [mediaProvider, setMediaProvider] = useState(null);
82
+ /** Set up persistent media container for a workspace. */
83
+ const setupMediaContainer = useCallback((workspaceId) => {
84
+ const mc = new IndexedDBContentContainer(workspaceId);
85
+ mediaContainerRef.current = mc;
86
+ setMediaProvider(createMediaProviderFromContainer(mc));
87
+ }, []);
88
+ /** Push a new history entry with the given hash. */
89
+ const pushHash = useCallback((wsId, filePath) => {
90
+ const hash = buildHash(wsId, filePath);
91
+ if (window.location.hash !== hash) {
92
+ skipPopState.current = true;
93
+ window.history.pushState(null, '', hash);
94
+ }
95
+ }, []);
96
+ /** Open a workspace (and optionally a file) from identifiers. */
97
+ const openFromIds = useCallback(async (wsId, filePath, push) => {
98
+ const workspaces = await listWorkspaces();
99
+ const ws = workspaces.find((w) => w.id === wsId);
100
+ if (!ws)
101
+ return false;
102
+ let fsProvider = null;
103
+ if (ws.type === 'native') {
104
+ const restored = await restoreNativeFolder(ws.id);
105
+ if (!restored)
106
+ return false;
107
+ fsProvider = restored;
108
+ }
109
+ else {
110
+ fsProvider = new IndexedDBFileSystemProvider(ws.id, ws.name);
111
+ }
112
+ await touchWorkspace(ws.id);
113
+ setProvider(fsProvider);
114
+ setActiveWorkspaceId(ws.id);
115
+ setupMediaContainer(ws.id);
116
+ if (filePath) {
117
+ const content = await fsProvider.readFile(filePath);
118
+ if (content !== null) {
119
+ setSelectedFile(filePath);
120
+ setSelectedFolder(null);
121
+ setFolderEntries([]);
122
+ setEditorContent(content);
123
+ setInitialView('wysiwyg');
124
+ setEditorKey((k) => k + 1);
125
+ }
126
+ else {
127
+ setSelectedFile(null);
128
+ setSelectedFolder(null);
129
+ setFolderEntries([]);
130
+ setEditorContent('');
131
+ setEditorKey((k) => k + 1);
132
+ }
133
+ }
134
+ else {
135
+ setSelectedFile(null);
136
+ setSelectedFolder(null);
137
+ setFolderEntries([]);
138
+ setEditorContent('');
139
+ setEditorKey((k) => k + 1);
140
+ }
141
+ if (push) {
142
+ pushHash(ws.id, filePath);
143
+ }
144
+ return true;
145
+ }, [pushHash, setupMediaContainer]);
146
+ const seedWelcomeFile = useCallback(async (fs) => {
147
+ const entries = await fs.readDirectory('/');
148
+ // If the only file is the welcome doc, auto-select it
149
+ if (entries.length === 1 &&
150
+ entries[0].kind === 'file' &&
151
+ entries[0].path === '/aboutDocblocks.md') {
152
+ const content = await fs.readFile('/aboutDocblocks.md');
153
+ if (content !== null) {
154
+ setSelectedFile('/aboutDocblocks.md');
155
+ setEditorContent(content);
156
+ setInitialView('preview');
157
+ setEditorKey((k) => k + 1);
158
+ setExplorerKey((k) => k + 1);
159
+ pushHash(fs.id, '/aboutDocblocks.md');
160
+ }
161
+ return;
162
+ }
163
+ if (entries.length > 0)
164
+ return;
165
+ const welcomePath = '/aboutDocblocks.md';
166
+ const welcomeContent = [
167
+ '# Welcome to DocBlocks',
168
+ '',
169
+ 'DocBlocks is a browser-based markdown document editor that lets you create, organize, and manage your documents right in the browser.',
170
+ '',
171
+ '## Features',
172
+ '',
173
+ '- **Rich Markdown Editing** — Write in a visual editor or switch to raw markdown anytime',
174
+ '- **Workspaces** — Organize your documents into separate workspaces',
175
+ '- **Playback & Video** — Preview your documents as rich visual presentations and export them as MP4 video',
176
+ '- **Export Anywhere** — Export documents to PDF, Word, PowerPoint, HTML, or Markdown with theme options',
177
+ '- **Local Storage** — Your documents are stored in your browser using temporary browser storage (backup often!)',
178
+ '- **Device Folders** — Create workspaces based on folders on your computer',
179
+ '- **No BS** — Free, no ads, no accounts, no tracking - everything runs locally in your browser',
180
+ '',
181
+ '## Getting Started',
182
+ '',
183
+ '1. Create a new file using the **New File** button in the sidebar',
184
+ '2. Start writing in markdown — the editor supports headings, lists, links, images, and more',
185
+ '3. Your work is saved automatically',
186
+ '',
187
+ 'Built with [Squiggly Square](https://github.com/nicoth-in/squisq) by [Bendyline](https://bendyline.com).',
188
+ ].join('\n');
189
+ await fs.writeFile(welcomePath, welcomeContent);
190
+ setSelectedFile(welcomePath);
191
+ setEditorContent(welcomeContent);
192
+ setInitialView('preview');
193
+ setEditorKey((k) => k + 1);
194
+ setExplorerKey((k) => k + 1);
195
+ pushHash(fs.id, welcomePath);
196
+ }, [pushHash]);
197
+ // Initialise workspace on mount — restore from hash or last-used
198
+ useEffect(() => {
199
+ (async () => {
200
+ // Try restoring from URL hash first
201
+ const hashState = parseHash();
202
+ if (hashState) {
203
+ const ok = await openFromIds(hashState.workspaceId, hashState.filePath, false);
204
+ if (ok)
205
+ return;
206
+ }
207
+ let fsProvider = null;
208
+ const workspaces = await listWorkspaces();
209
+ // Pick the most recently opened workspace
210
+ const sorted = [...workspaces].sort((a, b) => (b.lastOpened ?? '').localeCompare(a.lastOpened ?? ''));
211
+ for (const ws of sorted) {
212
+ if (ws.type === 'native') {
213
+ const restored = await restoreNativeFolder(ws.id);
214
+ if (restored) {
215
+ await touchWorkspace(ws.id);
216
+ fsProvider = restored;
217
+ setProvider(restored);
218
+ setActiveWorkspaceId(ws.id);
219
+ setupMediaContainer(ws.id);
220
+ break;
221
+ }
222
+ }
223
+ else {
224
+ const p = new IndexedDBFileSystemProvider(ws.id, ws.name);
225
+ await touchWorkspace(ws.id);
226
+ fsProvider = p;
227
+ setProvider(p);
228
+ setActiveWorkspaceId(ws.id);
229
+ setupMediaContainer(ws.id);
230
+ break;
231
+ }
232
+ }
233
+ if (!fsProvider) {
234
+ // No workspaces yet — create default
235
+ const defaultWs = await ensureDefaultWorkspace();
236
+ const p = new IndexedDBFileSystemProvider(defaultWs.id, defaultWs.name);
237
+ fsProvider = p;
238
+ setProvider(p);
239
+ setActiveWorkspaceId(defaultWs.id);
240
+ setupMediaContainer(defaultWs.id);
241
+ }
242
+ // Set initial hash
243
+ pushHash(fsProvider.id, null);
244
+ // Seed welcome file if workspace is empty
245
+ await seedWelcomeFile(fsProvider);
246
+ })();
247
+ }, [openFromIds, pushHash, seedWelcomeFile, setupMediaContainer]);
248
+ // Handle browser back/forward
249
+ useEffect(() => {
250
+ const onPopState = () => {
251
+ if (skipPopState.current) {
252
+ skipPopState.current = false;
253
+ return;
254
+ }
255
+ const hashState = parseHash();
256
+ if (hashState) {
257
+ openFromIds(hashState.workspaceId, hashState.filePath, false);
258
+ }
259
+ };
260
+ window.addEventListener('popstate', onPopState);
261
+ return () => window.removeEventListener('popstate', onPopState);
262
+ }, [openFromIds]);
263
+ // Auto-save current file
264
+ useAutoSave(provider, selectedFile, editorContent);
265
+ const handleWorkspaceSelect = useCallback(async (ws) => {
266
+ await touchWorkspace(ws.id);
267
+ if (ws.type === 'native') {
268
+ const restored = await restoreNativeFolder(ws.id);
269
+ if (restored) {
270
+ setProvider(restored);
271
+ }
272
+ else {
273
+ // Permission denied or handle lost — fall through without changing provider
274
+ return;
275
+ }
276
+ }
277
+ else {
278
+ setProvider(new IndexedDBFileSystemProvider(ws.id, ws.name));
279
+ }
280
+ setActiveWorkspaceId(ws.id);
281
+ setSelectedFile(null);
282
+ setSelectedFolder(null);
283
+ setFolderEntries([]);
284
+ setEditorContent('');
285
+ setEditorKey((k) => k + 1);
286
+ pushHash(ws.id, null);
287
+ setupMediaContainer(ws.id);
288
+ }, [pushHash, setupMediaContainer]);
289
+ const handleOpenFolder = useCallback(async () => {
290
+ try {
291
+ const nativeProvider = await openNativeFolder();
292
+ const descriptor = {
293
+ id: nativeProvider.id,
294
+ name: nativeProvider.label,
295
+ type: 'native',
296
+ lastOpened: new Date().toISOString(),
297
+ };
298
+ await saveWorkspace(descriptor);
299
+ setProvider(nativeProvider);
300
+ setActiveWorkspaceId(descriptor.id);
301
+ setSelectedFile(null);
302
+ setSelectedFolder(null);
303
+ setFolderEntries([]);
304
+ setEditorContent('');
305
+ setEditorKey((k) => k + 1);
306
+ pushHash(descriptor.id, null);
307
+ setupMediaContainer(descriptor.id);
308
+ }
309
+ catch {
310
+ // User cancelled or API not supported
311
+ }
312
+ }, [pushHash, setupMediaContainer]);
313
+ const handleSelect = useCallback(async (path, kind) => {
314
+ if (!provider || !activeWorkspaceId)
315
+ return;
316
+ if (kind === 'directory') {
317
+ setSelectedFile(null);
318
+ setSelectedFolder(path);
319
+ const entries = await provider.readDirectory(path);
320
+ setFolderEntries(entries);
321
+ setEditorContent('');
322
+ setEditorKey((k) => k + 1);
323
+ pushHash(activeWorkspaceId, null);
324
+ }
325
+ else {
326
+ const content = await provider.readFile(path);
327
+ setSelectedFile(path);
328
+ setSelectedFolder(null);
329
+ setFolderEntries([]);
330
+ setEditorContent(content ?? '');
331
+ setInitialView('wysiwyg');
332
+ setEditorKey((k) => k + 1);
333
+ pushHash(activeWorkspaceId, path);
334
+ if (isMobile)
335
+ setMobileShowEditor(true);
336
+ }
337
+ }, [provider, activeWorkspaceId, pushHash, isMobile]);
338
+ const handleTreeChange = useCallback(async () => {
339
+ if (!provider)
340
+ return;
341
+ // If the open file was deleted, clear the editor
342
+ if (selectedFile) {
343
+ const exists = await provider.exists(selectedFile);
344
+ if (!exists) {
345
+ setSelectedFile(null);
346
+ setEditorContent('');
347
+ setEditorKey((k) => k + 1);
348
+ if (activeWorkspaceId)
349
+ pushHash(activeWorkspaceId, null);
350
+ }
351
+ }
352
+ if (selectedFolder) {
353
+ const entries = await provider.readDirectory(selectedFolder);
354
+ setFolderEntries(entries);
355
+ }
356
+ }, [provider, selectedFile, selectedFolder, activeWorkspaceId, pushHash]);
357
+ /** Copy non-markdown files from an imported container into persistent media storage. */
358
+ const persistContainerMedia = useCallback(async (source) => {
359
+ const mc = mediaContainerRef.current;
360
+ if (!mc)
361
+ return;
362
+ const entries = await source.listFiles();
363
+ for (const entry of entries) {
364
+ if (entry.path.endsWith('.md'))
365
+ continue;
366
+ const data = await source.readFile(entry.path);
367
+ if (data) {
368
+ await mc.writeFile(entry.path, new Uint8Array(data), entry.mimeType);
369
+ }
370
+ }
371
+ }, []);
372
+ const handleImportFiles = useCallback(async (files) => {
373
+ if (!provider)
374
+ return;
375
+ for (const file of files) {
376
+ const ext = file.name.slice(file.name.lastIndexOf('.')).toLowerCase();
377
+ const baseName = file.name.replace(/\.[^.]+$/, '');
378
+ const destPath = `${baseName}.md`;
379
+ try {
380
+ let markdown;
381
+ if (ext === '.md' || ext === '.txt') {
382
+ markdown = await file.text();
383
+ }
384
+ else if (ext === '.docx') {
385
+ const { docxToContainer } = await import('@bendyline/squisq-formats/docx');
386
+ const container = await docxToContainer(await file.arrayBuffer());
387
+ markdown = (await container.readDocument()) ?? '';
388
+ await persistContainerMedia(container);
389
+ }
390
+ else if (ext === '.pdf') {
391
+ const { pdfToContainer } = await import('@bendyline/squisq-formats/pdf');
392
+ const container = await pdfToContainer(await file.arrayBuffer());
393
+ markdown = (await container.readDocument()) ?? '';
394
+ await persistContainerMedia(container);
395
+ }
396
+ else if (ext === '.dbk' || ext === '.zip') {
397
+ const { zipToContainer } = await import('@bendyline/squisq-formats/container');
398
+ const container = await zipToContainer(await file.arrayBuffer());
399
+ markdown = (await container.readDocument()) ?? '';
400
+ await persistContainerMedia(container);
401
+ }
402
+ else {
403
+ continue;
404
+ }
405
+ await provider.writeFile(destPath, markdown);
406
+ }
407
+ catch (err) {
408
+ console.error(`Failed to import ${file.name}:`, err);
409
+ }
410
+ }
411
+ // Refresh media provider once after all imports (not per-file)
412
+ const mc = mediaContainerRef.current;
413
+ if (mc) {
414
+ setMediaProvider(createMediaProviderFromContainer(mc));
415
+ }
416
+ // Refresh file tree
417
+ setExplorerKey((k) => k + 1);
418
+ }, [provider, persistContainerMedia]);
419
+ const handleEditorChange = useCallback((source) => {
420
+ setEditorContent(source);
421
+ }, []);
422
+ const handleRenameWorkspace = useCallback(async () => {
423
+ if (!activeWorkspaceId)
424
+ return;
425
+ const ws = await getWorkspace(activeWorkspaceId);
426
+ if (!ws)
427
+ return;
428
+ const newName = prompt('Rename workspace:', ws.name);
429
+ if (!newName || newName === ws.name)
430
+ return;
431
+ await saveWorkspace({ ...ws, name: newName });
432
+ // Bump key to trigger re-render — workspace name is read from the descriptor, not the provider
433
+ setEditorKey((k) => k + 1);
434
+ }, [activeWorkspaceId, provider]);
435
+ const handleDownloadWorkspace = useCallback(async () => {
436
+ if (!provider)
437
+ return;
438
+ try {
439
+ const entries = await provider.readDirectory('/');
440
+ const lines = [];
441
+ for (const entry of entries) {
442
+ if (entry.kind === 'file') {
443
+ const content = await provider.readFile(entry.path);
444
+ lines.push(`--- ${entry.path} ---\n${content ?? ''}\n`);
445
+ }
446
+ }
447
+ const blob = new Blob([lines.join('\n')], { type: 'text/plain' });
448
+ const url = URL.createObjectURL(blob);
449
+ const a = document.createElement('a');
450
+ a.href = url;
451
+ a.download = 'workspace.txt';
452
+ a.click();
453
+ URL.revokeObjectURL(url);
454
+ }
455
+ catch {
456
+ // ignore
457
+ }
458
+ }, [provider]);
459
+ const handleRemoveWorkspace = useCallback(async () => {
460
+ if (!activeWorkspaceId)
461
+ return;
462
+ if (!confirm('Remove this workspace? This cannot be undone.'))
463
+ return;
464
+ await removeDirectoryHandle(activeWorkspaceId);
465
+ await removeWorkspace(activeWorkspaceId);
466
+ // Switch to most recent remaining workspace or create default
467
+ const remaining = await listWorkspaces();
468
+ if (remaining.length > 0) {
469
+ const next = remaining[0];
470
+ await handleWorkspaceSelect(next);
471
+ }
472
+ else {
473
+ const defaultWs = await ensureDefaultWorkspace();
474
+ const fsProvider = new IndexedDBFileSystemProvider(defaultWs.id, defaultWs.name);
475
+ setProvider(fsProvider);
476
+ setActiveWorkspaceId(defaultWs.id);
477
+ setSelectedFile(null);
478
+ setSelectedFolder(null);
479
+ setFolderEntries([]);
480
+ setEditorContent('');
481
+ setEditorKey((k) => k + 1);
482
+ setupMediaContainer(defaultWs.id);
483
+ }
484
+ }, [activeWorkspaceId, handleWorkspaceSelect, setupMediaContainer]);
485
+ return (_jsx("div", { className: `db-shell${isMobile ? ' db-shell--mobile' : ''}`, "data-theme": resolvedTheme, children: _jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [(!isMobile || !mobileShowEditor) && (_jsxs("div", { className: "db-shell-sidebar", children: [_jsxs("div", { className: "db-shell-sidebar-header", children: [_jsx(AppMenu, { logoUrl: logoUrl }), _jsx(WorkspacePicker, { activeWorkspaceId: activeWorkspaceId, onSelect: handleWorkspaceSelect, onOpenFolder: handleOpenFolder }), _jsx(WorkspaceSettingsButton, { onRename: handleRenameWorkspace, onDownload: handleDownloadWorkspace, onRemove: handleRemoveWorkspace })] }), _jsx(FileExplorer, { provider: provider, onSelect: handleSelect, onTreeChange: handleTreeChange, onImportFiles: handleImportFiles }, explorerKey), _jsx("div", { className: "db-shell-sidebar-footer", children: _jsx("a", { href: "https://github.com/bendyline/docblocks/blob/main/LICENSE", target: "_blank", rel: "noopener noreferrer", children: "Terms of Use" }) })] })), (!isMobile || mobileShowEditor) && (_jsx("div", { style: { flex: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }, children: selectedFile && mediaProvider ? (_jsx(MediaContext.Provider, { value: mediaProvider, children: _jsx(EditorShell, { initialMarkdown: editorContent, initialView: initialView, articleId: selectedFile, onChange: handleEditorChange, theme: resolvedTheme, height: "100%", mediaProvider: mediaProvider, container: mediaContainerRef.current ?? undefined, toolbarSlotLeft: isMobile ? (_jsx("button", { className: "db-mobile-back", onClick: () => setMobileShowEditor(false), children: _jsx("span", { className: "db-mobile-back-arrow", children: "\u2190" }) })) : undefined, toolbarSlotRight: _jsx(ExportToolbarControls, { selectedFile: selectedFile, mediaContainer: mediaContainerRef.current }) }, `${selectedFile}-${editorKey}`) })) : selectedFolder ? (_jsxs("div", { className: "db-folder-view", children: [isMobile && (_jsxs("button", { className: "db-mobile-back", onClick: () => setMobileShowEditor(false), children: [_jsx("span", { className: "db-mobile-back-arrow", children: "\u2190" }), "Back to files"] })), _jsxs("div", { className: "db-folder-view-header", children: [_jsx("span", { className: "db-folder-view-icon", children: "\uD83D\uDCC1" }), _jsx("span", { className: "db-folder-view-path", children: selectedFolder })] }), folderEntries.length === 0 ? (_jsx("p", { className: "db-folder-view-empty", children: "This folder is empty." })) : (_jsx("ul", { className: "db-folder-view-list", children: folderEntries.map((entry) => (_jsxs("li", { className: "db-folder-view-item", onClick: () => handleSelect(entry.path, entry.kind), children: [_jsx("span", { className: "db-folder-view-item-icon", children: entry.kind === 'directory' ? '📁' : '📄' }), entry.name] }, entry.path))) }))] })) : (_jsx("div", { className: "db-shell-empty", children: _jsx("p", { children: "Select a file to start editing, or create a new one." }) })) }))] }) }));
486
+ }
487
+ //# sourceMappingURL=DocBlocksShell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocBlocksShell.js","sourceRoot":"","sources":["../../src/DocBlocksShell/DocBlocksShell.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAE7E,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAS3E,SAAS,UAAU;IACjB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAC9B,GAAG,EAAE,CACH,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAC7F,CAAC;IACF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,CAAC,CAAsB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/D,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AACjC,CAAC;AAED,6DAA6D;AAC7D,SAAS,SAAS,CAAC,WAAmB,EAAE,QAAwB;IAC9D,MAAM,EAAE,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,EAAE,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,IAAI,EAAE,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,iEAAiE;AACjE,SAAS,SAAS;IAChB,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,WAAW,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IACD,OAAO;QACL,WAAW,EAAE,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvD,QAAQ,EAAE,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,UAAU,GAAG,GAAG;IACnC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CACtC,GAAG,EAAE,CACH,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,UAAU,KAAK,CAAC,CAAC,OAAO,CAC7F,CAAC;IACF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,UAAU,KAAK,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,CAAC,CAAsB,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACnE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IACjB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,OAAO,EAAuB;IAC7E,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,aAAa,GAAqB,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3E,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA4B,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAa,SAAS,CAAC,CAAC;IACtE,iEAAiE;IACjE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnC,8EAA8E;IAC9E,MAAM,iBAAiB,GAAG,MAAM,CAAmC,IAAI,CAAC,CAAC;IACzE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAC;IAE/E,yDAAyD;IACzD,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,WAAmB,EAAE,EAAE;QAC9D,MAAM,EAAE,GAAG,IAAI,yBAAyB,CAAC,WAAW,CAAC,CAAC;QACtD,iBAAiB,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/B,gBAAgB,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,oDAAoD;IACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,QAAwB,EAAE,EAAE;QACtE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAClC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;YAC5B,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,iEAAiE;IACjE,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EAAE,IAAY,EAAE,QAAuB,EAAE,IAAa,EAAE,EAAE;QAC7D,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAEtB,IAAI,UAAU,GAA8B,IAAI,CAAC;QACjD,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5B,UAAU,GAAG,QAAQ,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,IAAI,2BAA2B,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5B,WAAW,CAAC,UAAU,CAAC,CAAC;QACxB,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAE5B,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAE3B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC1B,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACrB,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC1B,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC1B,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC,IAAI,CAAC,CAAC;gBACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACrB,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACrB,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrB,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrB,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EACD,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAChC,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CACjC,KAAK,EAAE,EAAsB,EAAE,EAAE;QAC/B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAE5C,sDAAsD;QACtD,IACE,OAAO,CAAC,MAAM,KAAK,CAAC;YACpB,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;YAC1B,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,EACxC,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;YACxD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,eAAe,CAAC,oBAAoB,CAAC,CAAC;gBACtC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC1B,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC1B,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;YACxC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAE/B,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACzC,MAAM,cAAc,GAAG;YACrB,wBAAwB;YACxB,EAAE;YACF,uIAAuI;YACvI,EAAE;YACF,aAAa;YACb,EAAE;YACF,0FAA0F;YAC1F,qEAAqE;YACrE,2GAA2G;YAC3G,yGAAyG;YACzG,iHAAiH;YACjH,4EAA4E;YAC5E,gGAAgG;YAChG,EAAE;YACF,oBAAoB;YACpB,EAAE;YACF,mEAAmE;YACnE,6FAA6F;YAC7F,qCAAqC;YACrC,EAAE;YACF,0GAA0G;SAC3G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAChD,eAAe,CAAC,WAAW,CAAC,CAAC;QAC7B,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACjC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC1B,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC/B,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,iEAAiE;IACjE,SAAS,CAAC,GAAG,EAAE;QACb,CAAC,KAAK,IAAI,EAAE;YACV,oCAAoC;YACpC,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;YAC9B,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC/E,IAAI,EAAE;oBAAE,OAAO;YACjB,CAAC;YAED,IAAI,UAAU,GAA8B,IAAI,CAAC;YAEjD,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;YAC1C,0CAA0C;YAC1C,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC3C,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CACvD,CAAC;YACF,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;gBACxB,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAClD,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBAC5B,UAAU,GAAG,QAAQ,CAAC;wBACtB,WAAW,CAAC,QAAQ,CAAC,CAAC;wBACtB,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBAE5B,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBAC3B,MAAM;oBACR,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,IAAI,2BAA2B,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;oBAC1D,MAAM,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC5B,UAAU,GAAG,CAAC,CAAC;oBACf,WAAW,CAAC,CAAC,CAAC,CAAC;oBACf,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAE5B,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC3B,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,qCAAqC;gBACrC,MAAM,SAAS,GAAG,MAAM,sBAAsB,EAAE,CAAC;gBACjD,MAAM,CAAC,GAAG,IAAI,2BAA2B,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBACxE,UAAU,GAAG,CAAC,CAAC;gBACf,WAAW,CAAC,CAAC,CAAC,CAAC;gBACf,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAEnC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;YAED,mBAAmB;YACnB,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAE9B,0CAA0C;YAC1C,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAElE,8BAA8B;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;YAC9B,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAClE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,yBAAyB;IACzB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAEnD,MAAM,qBAAqB,GAAG,WAAW,CACvC,KAAK,EAAE,EAAuB,EAAE,EAAE;QAChC,MAAM,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAClD,IAAI,QAAQ,EAAE,CAAC;gBACb,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,4EAA4E;gBAC5E,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,2BAA2B,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5B,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACrB,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACrB,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAEtB,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,EACD,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAChC,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC9C,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,gBAAgB,EAAE,CAAC;YAChD,MAAM,UAAU,GAAwB;gBACtC,EAAE,EAAE,cAAc,CAAC,EAAE;gBACrB,IAAI,EAAE,cAAc,CAAC,KAAK;gBAC1B,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC,CAAC;YACF,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;YAChC,WAAW,CAAC,cAAc,CAAC,CAAC;YAC5B,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACpC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrB,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrB,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAE9B,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAEpC,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,IAAY,EAAE,IAA0B,EAAE,EAAE;QACjD,IAAI,CAAC,QAAQ,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAE5C,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACnD,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC1B,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrB,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9C,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrB,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAChC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC1B,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;YAClC,IAAI,QAAQ;gBAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAClD,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC9C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,iDAAiD;QACjD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,eAAe,CAAC,IAAI,CAAC,CAAC;gBACtB,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACrB,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,IAAI,iBAAiB;oBAAE,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YAC7D,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1E,wFAAwF;IACxF,MAAM,qBAAqB,GAAG,WAAW,CACvC,KAAK,EAAE,MAGN,EAAE,EAAE;QACH,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC;QACrC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACzC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,iBAAiB,GAAG,WAAW,CACnC,KAAK,EAAE,KAAa,EAAE,EAAE;QACtB,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,GAAG,QAAQ,KAAK,CAAC;YAElC,IAAI,CAAC;gBACH,IAAI,QAAgB,CAAC;gBACrB,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACpC,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,CAAC;qBAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;oBAC3B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;oBAC3E,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;oBAClE,QAAQ,GAAG,CAAC,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC;oBAClD,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBACzC,CAAC;qBAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBAC1B,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;oBACzE,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;oBACjE,QAAQ,GAAG,CAAC,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC;oBAClD,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBACzC,CAAC;qBAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBAC5C,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;oBAC/E,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;oBACjE,QAAQ,GAAG,CAAC,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC;oBAClD,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,SAAS;gBACX,CAAC;gBAED,MAAM,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QACD,+DAA+D;QAC/D,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC;QACrC,IAAI,EAAE,EAAE,CAAC;YACP,gBAAgB,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,oBAAoB;QACpB,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC,EACD,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAClC,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CAAC,CAAC,MAAc,EAAE,EAAE;QACxD,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,qBAAqB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnD,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAC/B,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,EAAE,CAAC,IAAI;YAAE,OAAO;QAC5C,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,+FAA+F;QAC/F,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAElC,MAAM,uBAAuB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC1B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACpD,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,SAAS,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;YACb,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC;YAC7B,CAAC,CAAC,KAAK,EAAE,CAAC;YACV,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,qBAAqB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnD,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAC/B,IAAI,CAAC,OAAO,CAAC,+CAA+C,CAAC;YAAE,OAAO;QACtE,MAAM,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,eAAe,CAAC,iBAAiB,CAAC,CAAC;QACzC,8DAA8D;QAC9D,MAAM,SAAS,GAAG,MAAM,cAAc,EAAE,CAAC;QACzC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,MAAM,sBAAsB,EAAE,CAAC;YACjD,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACjF,WAAW,CAAC,UAAU,CAAC,CAAC;YACxB,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACnC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrB,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrB,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAE3B,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAEpE,OAAO,CACL,cAAK,SAAS,EAAE,WAAW,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE,gBAAc,aAAa,YAEzF,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAEzD,CAAC,CAAC,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACnC,eAAK,SAAS,EAAC,kBAAkB,aAC/B,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,OAAO,IAAC,OAAO,EAAE,OAAO,GAAI,EAC7B,KAAC,eAAe,IACd,iBAAiB,EAAE,iBAAiB,EACpC,QAAQ,EAAE,qBAAqB,EAC/B,YAAY,EAAE,gBAAgB,GAC9B,EACF,KAAC,uBAAuB,IACtB,QAAQ,EAAE,qBAAqB,EAC/B,UAAU,EAAE,uBAAuB,EACnC,QAAQ,EAAE,qBAAqB,GAC/B,IACE,EACN,KAAC,YAAY,IAEX,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,iBAAiB,IAJ3B,WAAW,CAKhB,EACF,cAAK,SAAS,EAAC,yBAAyB,YACtC,YACE,IAAI,EAAC,0DAA0D,EAC/D,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,6BAGvB,GACA,IACF,CACP,EAGA,CAAC,CAAC,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAClC,cAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,YAClF,YAAY,IAAI,aAAa,CAAC,CAAC,CAAC,CAC/B,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,aAAa,YACzC,KAAC,WAAW,IAEV,eAAe,EAAE,aAAa,EAC9B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,YAAY,EACvB,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,aAAa,EACpB,MAAM,EAAC,MAAM,EACb,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,iBAAiB,CAAC,OAAO,IAAI,SAAS,EACjD,eAAe,EACb,QAAQ,CAAC,CAAC,CAAC,CACT,iBAAQ,SAAS,EAAC,gBAAgB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,YAC1E,eAAM,SAAS,EAAC,sBAAsB,uBAAc,GAC7C,CACV,CAAC,CAAC,CAAC,SAAS,EAEf,gBAAgB,EACd,KAAC,qBAAqB,IACpB,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,iBAAiB,CAAC,OAAO,GACzC,IApBC,GAAG,YAAY,IAAI,SAAS,EAAE,CAsBnC,GACoB,CACzB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CACnB,eAAK,SAAS,EAAC,gBAAgB,aAC5B,QAAQ,IAAI,CACX,kBAAQ,SAAS,EAAC,gBAAgB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,aAC1E,eAAM,SAAS,EAAC,sBAAsB,uBAAc,qBAE7C,CACV,EACD,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAM,SAAS,EAAC,qBAAqB,6BAAU,EAC/C,eAAM,SAAS,EAAC,qBAAqB,YAAE,cAAc,GAAQ,IACzD,EACL,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC5B,YAAG,SAAS,EAAC,sBAAsB,sCAA0B,CAC9D,CAAC,CAAC,CAAC,CACF,aAAI,SAAS,EAAC,qBAAqB,YAChC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC5B,cAEE,SAAS,EAAC,qBAAqB,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,aAEnD,eAAM,SAAS,EAAC,0BAA0B,YACvC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GACpC,EACN,KAAK,CAAC,IAAI,KAPN,KAAK,CAAC,IAAI,CAQZ,CACN,CAAC,GACC,CACN,IACG,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,gBAAgB,YAC7B,+EAA2D,GACvD,CACP,GACG,CACP,IACG,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { DocBlocksShell } from './DocBlocksShell.js';
2
+ export type { DocBlocksShellProps } from './DocBlocksShell.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/DocBlocksShell/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { DocBlocksShell } from './DocBlocksShell.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/DocBlocksShell/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ExportDialog — modal for choosing export format and options.
3
+ */
4
+ import type { ExportOptions } from './export-options.js';
5
+ export interface ExportDialogProps {
6
+ /** Initial options (pre-populated from last export). */
7
+ initial: ExportOptions;
8
+ /** Whether the export is currently running. */
9
+ exporting: boolean;
10
+ /** Called when the user confirms the export. */
11
+ onExport: (options: ExportOptions) => void;
12
+ /** Called when the dialog is dismissed. */
13
+ onClose: () => void;
14
+ }
15
+ export declare function ExportDialog({ initial, exporting, onExport, onClose }: ExportDialogProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=ExportDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportDialog.d.ts","sourceRoot":"","sources":["../../src/Export/ExportDialog.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGvE,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,OAAO,EAAE,aAAa,CAAC;IACvB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3C,2CAA2C;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,iBAAiB,2CAqJxF"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ExportDialog — modal for choosing export format and options.
4
+ */
5
+ import { useState, useCallback, useEffect, useRef } from 'react';
6
+ import { getThemeSummaries } from '@bendyline/squisq/schemas';
7
+ import { getTransformStyleSummaries } from '@bendyline/squisq/transform';
8
+ import { FORMAT_LABELS, saveExportOptions } from './export-options.js';
9
+ const FORMATS = ['pdf', 'docx', 'pptx', 'html', 'md'];
10
+ export function ExportDialog({ initial, exporting, onExport, onClose }) {
11
+ const [format, setFormat] = useState(initial.format);
12
+ const [themeId, setThemeId] = useState(initial.themeId);
13
+ const [transformStyle, setTransformStyle] = useState(initial.transformStyle);
14
+ const [pageSize, setPageSize] = useState(initial.pageSize);
15
+ const dialogRef = useRef(null);
16
+ const themes = getThemeSummaries();
17
+ const transforms = getTransformStyleSummaries();
18
+ const showTheme = format === 'docx' || format === 'pdf' || format === 'pptx';
19
+ const showTransform = format === 'pptx';
20
+ const showPageSize = format === 'pdf';
21
+ const handleExport = useCallback(() => {
22
+ const opts = { format, themeId, transformStyle, pageSize };
23
+ saveExportOptions(opts);
24
+ onExport(opts);
25
+ }, [format, themeId, transformStyle, pageSize, onExport]);
26
+ // Close on Escape
27
+ useEffect(() => {
28
+ const onKey = (e) => {
29
+ if (e.key === 'Escape')
30
+ onClose();
31
+ };
32
+ window.addEventListener('keydown', onKey);
33
+ return () => window.removeEventListener('keydown', onKey);
34
+ }, [onClose]);
35
+ // Close on backdrop click
36
+ const handleBackdropClick = useCallback((e) => {
37
+ if (e.target === e.currentTarget)
38
+ onClose();
39
+ }, [onClose]);
40
+ return (_jsx("div", { className: "db-dialog-overlay", onClick: handleBackdropClick, children: _jsxs("div", { className: "db-dialog db-export-dialog", ref: dialogRef, children: [_jsxs("div", { className: "db-dialog-header", children: [_jsx("h2", { className: "db-dialog-title", children: "Export Document" }), _jsx("button", { className: "db-dialog-close", onClick: onClose, "aria-label": "Close", children: "\u00D7" })] }), _jsxs("div", { className: "db-dialog-body", children: [_jsxs("div", { className: "db-export-field", children: [_jsx("label", { className: "db-export-label", htmlFor: "db-export-format", children: "Format" }), _jsx("select", { id: "db-export-format", className: "db-export-select", value: format, onChange: (e) => setFormat(e.target.value), children: FORMATS.map((f) => (_jsx("option", { value: f, children: FORMAT_LABELS[f] }, f))) })] }), showTheme && (_jsxs("div", { className: "db-export-field", children: [_jsx("label", { className: "db-export-label", htmlFor: "db-export-theme", children: "Theme" }), _jsx("select", { id: "db-export-theme", className: "db-export-select", value: themeId, onChange: (e) => setThemeId(e.target.value), children: themes.map((t) => (_jsx("option", { value: t.id, children: t.name }, t.id))) }), _jsx("span", { className: "db-export-hint", children: themes.find((t) => t.id === themeId)?.description })] })), showTransform && (_jsxs("div", { className: "db-export-field", children: [_jsx("label", { className: "db-export-label", htmlFor: "db-export-transform", children: "Transform" }), _jsx("select", { id: "db-export-transform", className: "db-export-select", value: transformStyle, onChange: (e) => setTransformStyle(e.target.value), children: transforms.map((t) => (_jsx("option", { value: t.id, children: t.name }, t.id))) }), _jsx("span", { className: "db-export-hint", children: transforms.find((t) => t.id === transformStyle)?.description })] })), showPageSize && (_jsxs("div", { className: "db-export-field", children: [_jsx("label", { className: "db-export-label", htmlFor: "db-export-pagesize", children: "Page Size" }), _jsxs("select", { id: "db-export-pagesize", className: "db-export-select", value: pageSize, onChange: (e) => setPageSize(e.target.value), children: [_jsx("option", { value: "letter", children: "US Letter" }), _jsx("option", { value: "a4", children: "A4" })] })] }))] }), _jsxs("div", { className: "db-export-footer", children: [_jsx("button", { className: "db-export-btn db-export-btn--secondary", onClick: onClose, children: "Cancel" }), _jsx("button", { className: "db-export-btn db-export-btn--primary", onClick: handleExport, disabled: exporting, children: exporting ? 'Exporting...' : 'Export' })] })] }) }));
41
+ }
42
+ //# sourceMappingURL=ExportDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportDialog.js","sourceRoot":"","sources":["../../src/Export/ExportDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ExportToolbarControls — toolbar-right slot content.
3
+ *
4
+ * Renders a "..." overflow menu on the right side of the toolbar
5
+ * containing export actions (document export + video export).
6
+ *
7
+ * Must be rendered inside <EditorProvider> so useEditorContext() works.
8
+ */
9
+ import type { ContentContainer } from '@bendyline/squisq/storage';
10
+ export interface ExportToolbarControlsProps {
11
+ /** Currently selected file path — used to derive the download filename. */
12
+ selectedFile: string | null;
13
+ /** Media container for resolving images during export. */
14
+ mediaContainer?: ContentContainer | null;
15
+ }
16
+ export declare function ExportToolbarControls({ selectedFile, mediaContainer, }: ExportToolbarControlsProps): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=ExportToolbarControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportToolbarControls.d.ts","sourceRoot":"","sources":["../../src/Export/ExportToolbarControls.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAWlE,MAAM,WAAW,0BAA0B;IACzC,2EAA2E;IAC3E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1C;AAsBD,wBAAgB,qBAAqB,CAAC,EACpC,YAAY,EACZ,cAAc,GACf,EAAE,0BAA0B,2CA4H5B"}