@bendyline/docblocks-react 1.1.1 → 2.0.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.
- package/README.md +50 -15
- package/dist/AppMenu/AppMenu.d.ts +29 -2
- package/dist/AppMenu/AppMenu.d.ts.map +1 -1
- package/dist/AppMenu/AppMenu.js +41 -2
- package/dist/AppMenu/AppMenu.js.map +1 -1
- package/dist/AppMenu/index.d.ts +1 -1
- package/dist/AppMenu/index.d.ts.map +1 -1
- package/dist/DocBlocksShell/DocBlocksShell.d.ts +17 -4
- package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +1 -1
- package/dist/DocBlocksShell/DocBlocksShell.js +1710 -299
- package/dist/DocBlocksShell/DocBlocksShell.js.map +1 -1
- package/dist/DocBlocksShell/LazyEditorShell.d.ts +3 -0
- package/dist/DocBlocksShell/LazyEditorShell.d.ts.map +1 -0
- package/dist/DocBlocksShell/LazyEditorShell.js +3 -0
- package/dist/DocBlocksShell/LazyEditorShell.js.map +1 -0
- package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts +13 -0
- package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts.map +1 -0
- package/dist/DocBlocksShell/UpdateAvailableNotice.js +16 -0
- package/dist/DocBlocksShell/UpdateAvailableNotice.js.map +1 -0
- package/dist/DocBlocksShell/document-title.d.ts +3 -0
- package/dist/DocBlocksShell/document-title.d.ts.map +1 -0
- package/dist/DocBlocksShell/document-title.js +17 -0
- package/dist/DocBlocksShell/document-title.js.map +1 -0
- package/dist/DocBlocksShell/workspace-authority-barrier.d.ts +14 -0
- package/dist/DocBlocksShell/workspace-authority-barrier.d.ts.map +1 -0
- package/dist/DocBlocksShell/workspace-authority-barrier.js +23 -0
- package/dist/DocBlocksShell/workspace-authority-barrier.js.map +1 -0
- package/dist/Export/DeferredExportToolbarControls.d.ts +5 -0
- package/dist/Export/DeferredExportToolbarControls.d.ts.map +1 -0
- package/dist/Export/DeferredExportToolbarControls.js +10 -0
- package/dist/Export/DeferredExportToolbarControls.js.map +1 -0
- package/dist/Export/ExportDialog.d.ts +10 -1
- package/dist/Export/ExportDialog.d.ts.map +1 -1
- package/dist/Export/ExportDialog.js +39 -20
- package/dist/Export/ExportDialog.js.map +1 -1
- package/dist/Export/ExportToolbarControls.d.ts +21 -1
- package/dist/Export/ExportToolbarControls.d.ts.map +1 -1
- package/dist/Export/ExportToolbarControls.js +161 -26
- package/dist/Export/ExportToolbarControls.js.map +1 -1
- package/dist/Export/export-destination.d.ts +3 -0
- package/dist/Export/export-destination.d.ts.map +1 -0
- package/dist/Export/export-destination.js +32 -0
- package/dist/Export/export-destination.js.map +1 -0
- package/dist/Export/index.d.ts +8 -4
- package/dist/Export/index.d.ts.map +1 -1
- package/dist/Export/index.js +4 -1
- package/dist/Export/index.js.map +1 -1
- package/dist/Export/public-api.d.ts +12 -0
- package/dist/Export/public-api.d.ts.map +1 -0
- package/dist/Export/public-api.js +9 -0
- package/dist/Export/public-api.js.map +1 -0
- package/dist/Export/run-export.d.ts +3 -1
- package/dist/Export/run-export.d.ts.map +1 -1
- package/dist/Export/run-export.js +58 -25
- package/dist/Export/run-export.js.map +1 -1
- package/dist/Export/transform-summaries.d.ts +7 -0
- package/dist/Export/transform-summaries.d.ts.map +1 -0
- package/dist/Export/transform-summaries.js +6 -0
- package/dist/Export/transform-summaries.js.map +1 -0
- package/dist/ExportDialog-MEUISWZX.js +9 -0
- package/dist/ExportDialog-MEUISWZX.js.map +1 -0
- package/dist/ExportToolbarControls-D2YDWOXW.js +373 -0
- package/dist/ExportToolbarControls-D2YDWOXW.js.map +1 -0
- package/dist/FileExplorer/FileExplorer.d.ts +26 -4
- package/dist/FileExplorer/FileExplorer.d.ts.map +1 -1
- package/dist/FileExplorer/FileExplorer.js +204 -29
- package/dist/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/FileExplorer/FileTreeNode.d.ts +24 -3
- package/dist/FileExplorer/FileTreeNode.d.ts.map +1 -1
- package/dist/FileExplorer/FileTreeNode.js +27 -8
- package/dist/FileExplorer/FileTreeNode.js.map +1 -1
- package/dist/FileExplorer/index.d.ts +1 -1
- package/dist/FileExplorer/index.d.ts.map +1 -1
- package/dist/FileExplorer/useFileTree.d.ts +5 -3
- package/dist/FileExplorer/useFileTree.d.ts.map +1 -1
- package/dist/FileExplorer/useFileTree.js +173 -13
- package/dist/FileExplorer/useFileTree.js.map +1 -1
- package/dist/Git/GitAuthGuidanceDialog.d.ts +18 -0
- package/dist/Git/GitAuthGuidanceDialog.d.ts.map +1 -0
- package/dist/Git/GitAuthGuidanceDialog.js +27 -0
- package/dist/Git/GitAuthGuidanceDialog.js.map +1 -0
- package/dist/Git/GitBranchesDialog.d.ts +13 -0
- package/dist/Git/GitBranchesDialog.d.ts.map +1 -0
- package/dist/Git/GitBranchesDialog.js +59 -0
- package/dist/Git/GitBranchesDialog.js.map +1 -0
- package/dist/Git/GitCloneDialog.d.ts +14 -0
- package/dist/Git/GitCloneDialog.d.ts.map +1 -0
- package/dist/Git/GitCloneDialog.js +79 -0
- package/dist/Git/GitCloneDialog.js.map +1 -0
- package/dist/Git/GitCommitDialog.d.ts +12 -0
- package/dist/Git/GitCommitDialog.d.ts.map +1 -0
- package/dist/Git/GitCommitDialog.js +38 -0
- package/dist/Git/GitCommitDialog.js.map +1 -0
- package/dist/Git/GitConflictsDialog.d.ts +12 -0
- package/dist/Git/GitConflictsDialog.d.ts.map +1 -0
- package/dist/Git/GitConflictsDialog.js +17 -0
- package/dist/Git/GitConflictsDialog.js.map +1 -0
- package/dist/Git/GitContext.d.ts +89 -0
- package/dist/Git/GitContext.d.ts.map +1 -0
- package/dist/Git/GitContext.js +15 -0
- package/dist/Git/GitContext.js.map +1 -0
- package/dist/Git/GitDiffDialog.d.ts +20 -0
- package/dist/Git/GitDiffDialog.d.ts.map +1 -0
- package/dist/Git/GitDiffDialog.js +100 -0
- package/dist/Git/GitDiffDialog.js.map +1 -0
- package/dist/Git/GitDiffView.d.ts +23 -0
- package/dist/Git/GitDiffView.d.ts.map +1 -0
- package/dist/Git/GitDiffView.js +77 -0
- package/dist/Git/GitDiffView.js.map +1 -0
- package/dist/Git/GitHistoryDialog.d.ts +15 -0
- package/dist/Git/GitHistoryDialog.d.ts.map +1 -0
- package/dist/Git/GitHistoryDialog.js +107 -0
- package/dist/Git/GitHistoryDialog.js.map +1 -0
- package/dist/Git/GitStatusBar.d.ts +8 -0
- package/dist/Git/GitStatusBar.d.ts.map +1 -0
- package/dist/Git/GitStatusBar.js +49 -0
- package/dist/Git/GitStatusBar.js.map +1 -0
- package/dist/Git/GitToolbarControl.d.ts +15 -0
- package/dist/Git/GitToolbarControl.d.ts.map +1 -0
- package/dist/Git/GitToolbarControl.js +51 -0
- package/dist/Git/GitToolbarControl.js.map +1 -0
- package/dist/Git/GitUI.d.ts +14 -0
- package/dist/Git/GitUI.d.ts.map +1 -0
- package/dist/Git/GitUI.js +21 -0
- package/dist/Git/GitUI.js.map +1 -0
- package/dist/Git/commit-selection.d.ts +22 -0
- package/dist/Git/commit-selection.d.ts.map +1 -0
- package/dist/Git/commit-selection.js +47 -0
- package/dist/Git/commit-selection.js.map +1 -0
- package/dist/Git/git-clone-utils.d.ts +8 -0
- package/dist/Git/git-clone-utils.d.ts.map +1 -0
- package/dist/Git/git-clone-utils.js +26 -0
- package/dist/Git/git-clone-utils.js.map +1 -0
- package/dist/Git/git-status.d.ts +24 -0
- package/dist/Git/git-status.d.ts.map +1 -0
- package/dist/Git/git-status.js +105 -0
- package/dist/Git/git-status.js.map +1 -0
- package/dist/Git/useGit.d.ts +15 -0
- package/dist/Git/useGit.d.ts.map +1 -0
- package/dist/Git/useGit.js +206 -0
- package/dist/Git/useGit.js.map +1 -0
- package/dist/Git/useGitStatus.d.ts +17 -0
- package/dist/Git/useGitStatus.d.ts.map +1 -0
- package/dist/Git/useGitStatus.js +63 -0
- package/dist/Git/useGitStatus.js.map +1 -0
- package/dist/GitToolbarControl-LMIR4R7I.js +117 -0
- package/dist/GitToolbarControl-LMIR4R7I.js.map +1 -0
- package/dist/GitUI-KGF5MSNV.js +1048 -0
- package/dist/GitUI-KGF5MSNV.js.map +1 -0
- package/dist/LazyEditorShell-EF2BWRXU.js +6 -0
- package/dist/LazyEditorShell-EF2BWRXU.js.map +1 -0
- package/dist/Settings/Settings.d.ts +23 -0
- package/dist/Settings/Settings.d.ts.map +1 -0
- package/dist/Settings/Settings.js +22 -0
- package/dist/Settings/Settings.js.map +1 -0
- package/dist/Settings/public-api.d.ts +3 -0
- package/dist/Settings/public-api.d.ts.map +1 -0
- package/dist/Settings/public-api.js +2 -0
- package/dist/Settings/public-api.js.map +1 -0
- package/dist/WorkspacePicker/WorkspacePicker.d.ts +6 -1
- package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +1 -1
- package/dist/WorkspacePicker/WorkspacePicker.js +16 -5
- package/dist/WorkspacePicker/WorkspacePicker.js.map +1 -1
- package/dist/chunk-3SAXDU2U.js +157 -0
- package/dist/chunk-3SAXDU2U.js.map +1 -0
- package/dist/chunk-4XXSWN3T.js +13 -0
- package/dist/chunk-4XXSWN3T.js.map +1 -0
- package/dist/chunk-5A4KEWKT.js +97 -0
- package/dist/chunk-5A4KEWKT.js.map +1 -0
- package/dist/chunk-AOVTHZU7.js +321 -0
- package/dist/chunk-AOVTHZU7.js.map +1 -0
- package/dist/chunk-DD4VFJQI.js +51 -0
- package/dist/chunk-DD4VFJQI.js.map +1 -0
- package/dist/chunk-GSNZSCIK.js +55 -0
- package/dist/chunk-GSNZSCIK.js.map +1 -0
- package/dist/chunk-VHDP4IPL.js +70 -0
- package/dist/chunk-VHDP4IPL.js.map +1 -0
- package/dist/chunk-ZI56BNB7.js +270 -0
- package/dist/chunk-ZI56BNB7.js.map +1 -0
- package/dist/components/Dialog.d.ts +22 -0
- package/dist/components/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog.js +33 -0
- package/dist/components/Dialog.js.map +1 -0
- package/dist/editor.d.ts +10 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +70 -0
- package/dist/editor.js.map +1 -0
- package/dist/export/index.d.ts +87 -0
- package/dist/export/index.js +26 -0
- package/dist/export/index.js.map +1 -0
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useDocumentSession.d.ts +16 -0
- package/dist/hooks/useDocumentSession.d.ts.map +1 -0
- package/dist/hooks/useDocumentSession.js +18 -0
- package/dist/hooks/useDocumentSession.js.map +1 -0
- package/dist/icons.d.ts +11 -6
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +21 -20
- package/dist/icons.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/preferences/theme.d.ts +18 -0
- package/dist/preferences/theme.d.ts.map +1 -0
- package/dist/preferences/theme.js +63 -0
- package/dist/preferences/theme.js.map +1 -0
- package/dist/provider-lease.d.ts +10 -0
- package/dist/provider-lease.d.ts.map +1 -0
- package/dist/provider-lease.js +42 -0
- package/dist/provider-lease.js.map +1 -0
- package/dist/run-export-ICTZITXC.js +10 -0
- package/dist/run-export-ICTZITXC.js.map +1 -0
- package/dist/settings/index.d.ts +28 -0
- package/dist/settings/index.js +12 -0
- package/dist/settings/index.js.map +1 -0
- package/package.json +27 -10
- package/src/AppMenu/AppMenu.tsx +169 -99
- package/src/AppMenu/index.ts +1 -1
- package/src/DocBlocksShell/DocBlocksShell.tsx +2183 -516
- package/src/DocBlocksShell/LazyEditorShell.ts +2 -0
- package/src/DocBlocksShell/UpdateAvailableNotice.tsx +60 -0
- package/src/DocBlocksShell/document-title.ts +19 -0
- package/src/DocBlocksShell/workspace-authority-barrier.ts +26 -0
- package/src/Export/DeferredExportToolbarControls.tsx +23 -0
- package/src/Export/ExportDialog.tsx +102 -27
- package/src/Export/ExportToolbarControls.tsx +343 -57
- package/src/Export/export-destination.ts +30 -0
- package/src/Export/index.ts +18 -4
- package/src/Export/public-api.ts +17 -0
- package/src/Export/run-export.ts +66 -29
- package/src/Export/transform-summaries.ts +14 -0
- package/src/FileExplorer/FileExplorer.tsx +284 -38
- package/src/FileExplorer/FileTreeNode.tsx +100 -8
- package/src/FileExplorer/index.ts +1 -1
- package/src/FileExplorer/useFileTree.ts +190 -16
- package/src/Git/GitAuthGuidanceDialog.tsx +84 -0
- package/src/Git/GitBranchesDialog.tsx +144 -0
- package/src/Git/GitCloneDialog.tsx +200 -0
- package/src/Git/GitCommitDialog.tsx +119 -0
- package/src/Git/GitConflictsDialog.tsx +62 -0
- package/src/Git/GitContext.tsx +88 -0
- package/src/Git/GitDiffDialog.tsx +147 -0
- package/src/Git/GitDiffView.tsx +105 -0
- package/src/Git/GitHistoryDialog.tsx +195 -0
- package/src/Git/GitStatusBar.tsx +157 -0
- package/src/Git/GitToolbarControl.tsx +123 -0
- package/src/Git/GitUI.tsx +68 -0
- package/src/Git/commit-selection.ts +63 -0
- package/src/Git/git-clone-utils.ts +23 -0
- package/src/Git/git-status.ts +113 -0
- package/src/Git/useGit.ts +279 -0
- package/src/Git/useGitStatus.ts +78 -0
- package/src/Settings/Settings.tsx +118 -0
- package/src/Settings/public-api.ts +8 -0
- package/src/WorkspacePicker/WorkspacePicker.tsx +62 -8
- package/src/components/Dialog.tsx +81 -0
- package/src/editor.ts +72 -0
- package/src/hooks/index.ts +2 -1
- package/src/hooks/useDocumentSession.ts +37 -0
- package/src/icons.tsx +33 -55
- package/src/index.ts +35 -5
- package/src/preferences/theme.ts +67 -0
- package/src/provider-lease.ts +52 -0
- package/src/styles/docblocks.css +2247 -77
- package/src/types/pwa-dom.d.ts +31 -0
- package/dist/hooks/useAutoSave.d.ts +0 -15
- package/dist/hooks/useAutoSave.d.ts.map +0 -1
- package/dist/hooks/useAutoSave.js +0 -83
- package/dist/hooks/useAutoSave.js.map +0 -1
- package/src/fonts/fonts.css +0 -362
- package/src/fonts/licenses/LICENSE-cormorant-garamond.txt +0 -93
- package/src/fonts/licenses/LICENSE-crimson-text.txt +0 -93
- package/src/fonts/licenses/LICENSE-dm-sans.txt +0 -93
- package/src/fonts/licenses/LICENSE-dm-serif-display.txt +0 -93
- package/src/fonts/licenses/LICENSE-hanken-grotesk.txt +0 -94
- package/src/fonts/licenses/LICENSE-ibm-plex-sans.txt +0 -93
- package/src/fonts/licenses/LICENSE-inter.txt +0 -93
- package/src/fonts/licenses/LICENSE-jetbrains-mono.txt +0 -93
- package/src/fonts/licenses/LICENSE-lora.txt +0 -93
- package/src/fonts/licenses/LICENSE-merriweather.txt +0 -93
- package/src/fonts/licenses/LICENSE-oswald.txt +0 -93
- package/src/fonts/licenses/LICENSE-playfair-display.txt +0 -93
- package/src/fonts/licenses/LICENSE-pt-serif.txt +0 -93
- package/src/fonts/licenses/LICENSE-roboto.txt +0 -93
- package/src/fonts/licenses/LICENSE-source-serif-4.txt +0 -93
- package/src/fonts/woff2/cormorant-garamond-400.woff2 +0 -0
- package/src/fonts/woff2/cormorant-garamond-700.woff2 +0 -0
- package/src/fonts/woff2/crimson-text-400.woff2 +0 -0
- package/src/fonts/woff2/crimson-text-400i.woff2 +0 -0
- package/src/fonts/woff2/crimson-text-700.woff2 +0 -0
- package/src/fonts/woff2/dm-sans-400.woff2 +0 -0
- package/src/fonts/woff2/dm-sans-400i.woff2 +0 -0
- package/src/fonts/woff2/dm-sans-500.woff2 +0 -0
- package/src/fonts/woff2/dm-sans-700.woff2 +0 -0
- package/src/fonts/woff2/dm-serif-display-400.woff2 +0 -0
- package/src/fonts/woff2/hanken-grotesk-400.woff2 +0 -0
- package/src/fonts/woff2/hanken-grotesk-400i.woff2 +0 -0
- package/src/fonts/woff2/hanken-grotesk-500.woff2 +0 -0
- package/src/fonts/woff2/hanken-grotesk-600.woff2 +0 -0
- package/src/fonts/woff2/hanken-grotesk-700.woff2 +0 -0
- package/src/fonts/woff2/ibm-plex-sans-400.woff2 +0 -0
- package/src/fonts/woff2/ibm-plex-sans-400i.woff2 +0 -0
- package/src/fonts/woff2/ibm-plex-sans-500.woff2 +0 -0
- package/src/fonts/woff2/ibm-plex-sans-600.woff2 +0 -0
- package/src/fonts/woff2/ibm-plex-sans-700.woff2 +0 -0
- package/src/fonts/woff2/inter-400.woff2 +0 -0
- package/src/fonts/woff2/inter-400i.woff2 +0 -0
- package/src/fonts/woff2/inter-500.woff2 +0 -0
- package/src/fonts/woff2/inter-600.woff2 +0 -0
- package/src/fonts/woff2/inter-700.woff2 +0 -0
- package/src/fonts/woff2/jetbrains-mono-400.woff2 +0 -0
- package/src/fonts/woff2/jetbrains-mono-400i.woff2 +0 -0
- package/src/fonts/woff2/jetbrains-mono-700.woff2 +0 -0
- package/src/fonts/woff2/lora-400.woff2 +0 -0
- package/src/fonts/woff2/lora-400i.woff2 +0 -0
- package/src/fonts/woff2/lora-700.woff2 +0 -0
- package/src/fonts/woff2/merriweather-400.woff2 +0 -0
- package/src/fonts/woff2/merriweather-700.woff2 +0 -0
- package/src/fonts/woff2/oswald-400.woff2 +0 -0
- package/src/fonts/woff2/oswald-700.woff2 +0 -0
- package/src/fonts/woff2/playfair-display-400.woff2 +0 -0
- package/src/fonts/woff2/playfair-display-700.woff2 +0 -0
- package/src/fonts/woff2/pt-serif-400.woff2 +0 -0
- package/src/fonts/woff2/pt-serif-700.woff2 +0 -0
- package/src/fonts/woff2/roboto-400.woff2 +0 -0
- package/src/fonts/woff2/roboto-400i.woff2 +0 -0
- package/src/fonts/woff2/roboto-700.woff2 +0 -0
- package/src/fonts/woff2/source-serif-4-400.woff2 +0 -0
- package/src/fonts/woff2/source-serif-4-400i.woff2 +0 -0
- package/src/fonts/woff2/source-serif-4-700.woff2 +0 -0
- package/src/hooks/useAutoSave.ts +0 -116
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
|
|
3
|
+
const UPDATE_PROMPT_ID = 'db-update-available-prompt';
|
|
4
|
+
|
|
5
|
+
export interface UpdateAvailableNoticeProps {
|
|
6
|
+
available: boolean;
|
|
7
|
+
onApplyUpdate?: () => void;
|
|
8
|
+
blocked?: boolean;
|
|
9
|
+
statusBarVisible: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Keeps PWA updates unobtrusive until the user asks to review one. The
|
|
14
|
+
* notice is positioned over the editor status bar by DocBlocksShell CSS;
|
|
15
|
+
* the existing Reload/Later prompt remains a fixed shell-level card.
|
|
16
|
+
*/
|
|
17
|
+
export function UpdateAvailableNotice({
|
|
18
|
+
available,
|
|
19
|
+
onApplyUpdate,
|
|
20
|
+
blocked = false,
|
|
21
|
+
statusBarVisible,
|
|
22
|
+
}: UpdateAvailableNoticeProps) {
|
|
23
|
+
const [promptOpen, setPromptOpen] = useState(false);
|
|
24
|
+
|
|
25
|
+
if (!available || !onApplyUpdate) return null;
|
|
26
|
+
|
|
27
|
+
const promptVisible = promptOpen && !blocked;
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<>
|
|
31
|
+
<button
|
|
32
|
+
type="button"
|
|
33
|
+
className={`db-update-status-notice${
|
|
34
|
+
statusBarVisible ? '' : ' db-update-status-notice--floating'
|
|
35
|
+
}`}
|
|
36
|
+
onClick={() => setPromptOpen(true)}
|
|
37
|
+
disabled={blocked}
|
|
38
|
+
aria-controls={UPDATE_PROMPT_ID}
|
|
39
|
+
aria-expanded={promptVisible}
|
|
40
|
+
aria-label="A new version of DocBlocks is available. Show update options."
|
|
41
|
+
title="A new version of DocBlocks is available"
|
|
42
|
+
>
|
|
43
|
+
Update available
|
|
44
|
+
</button>
|
|
45
|
+
{promptVisible && (
|
|
46
|
+
<div id={UPDATE_PROMPT_ID} className="db-update-banner" role="alert">
|
|
47
|
+
<span>A new version of DocBlocks is available.</span>
|
|
48
|
+
<div className="db-update-banner-actions">
|
|
49
|
+
<button type="button" onClick={onApplyUpdate}>
|
|
50
|
+
Reload
|
|
51
|
+
</button>
|
|
52
|
+
<button type="button" onClick={() => setPromptOpen(false)}>
|
|
53
|
+
Later
|
|
54
|
+
</button>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
)}
|
|
58
|
+
</>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const APP_TITLE = 'DocBlocks';
|
|
4
|
+
|
|
5
|
+
export function titleForSelectedFile(selectedFile: string | null): string {
|
|
6
|
+
if (!selectedFile) return APP_TITLE;
|
|
7
|
+
|
|
8
|
+
const filename = selectedFile.replace(/^\/+/, '').split('/').pop();
|
|
9
|
+
const name = filename?.replace(/\.[^.]+$/, '');
|
|
10
|
+
return name ? `${name} - ${APP_TITLE}` : APP_TITLE;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function useDocumentTitle(selectedFile: string | null): void {
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (typeof document !== 'undefined') {
|
|
16
|
+
document.title = titleForSelectedFile(selectedFile);
|
|
17
|
+
}
|
|
18
|
+
}, [selectedFile]);
|
|
19
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer-side barrier for main-authoritative Electron workspace identity.
|
|
3
|
+
* OS requests may arrive before IndexedDB descriptors have been reconciled;
|
|
4
|
+
* they must retain navigation priority while waiting for that reconciliation.
|
|
5
|
+
*/
|
|
6
|
+
export class WorkspaceAuthorityBarrier {
|
|
7
|
+
private ready = false;
|
|
8
|
+
private readonly readyPromise: Promise<void>;
|
|
9
|
+
private resolveReady!: () => void;
|
|
10
|
+
|
|
11
|
+
public constructor() {
|
|
12
|
+
this.readyPromise = new Promise<void>((resolve) => {
|
|
13
|
+
this.resolveReady = resolve;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public markReady(): void {
|
|
18
|
+
if (this.ready) return;
|
|
19
|
+
this.ready = true;
|
|
20
|
+
this.resolveReady();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public wait(): Promise<void> {
|
|
24
|
+
return this.readyPromise;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { lazy, Suspense } from 'react';
|
|
2
|
+
import type {
|
|
3
|
+
ExportDestinationAdapter,
|
|
4
|
+
ExportDestinationTarget,
|
|
5
|
+
ExportToolbarControlsProps,
|
|
6
|
+
} from './ExportToolbarControls.js';
|
|
7
|
+
|
|
8
|
+
const ExportToolbarControlsImplementation = lazy(() =>
|
|
9
|
+
import('./ExportToolbarControls.js').then((module) => ({
|
|
10
|
+
default: module.ExportToolbarControls,
|
|
11
|
+
})),
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
/** Public toolbar control with its editor-coupled implementation deferred. */
|
|
15
|
+
export function ExportToolbarControls(props: ExportToolbarControlsProps) {
|
|
16
|
+
return (
|
|
17
|
+
<Suspense fallback={null}>
|
|
18
|
+
<ExportToolbarControlsImplementation {...props} />
|
|
19
|
+
</Suspense>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type { ExportDestinationAdapter, ExportDestinationTarget, ExportToolbarControlsProps };
|
|
@@ -2,23 +2,33 @@
|
|
|
2
2
|
* ExportDialog — modal for choosing export format and options.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
5
|
+
import { useState, useCallback, useEffect, useMemo, useRef } from 'react';
|
|
6
6
|
import { getThemeSummaries } from '@bendyline/squisq/schemas';
|
|
7
|
-
import { getTransformStyleSummaries } from '@bendyline/squisq/transform';
|
|
8
7
|
import type { ExportFormat, ExportOptions, HtmlBundle, HtmlStyle } from './export-options.js';
|
|
9
8
|
import { FORMAT_LABELS, saveExportOptions } from './export-options.js';
|
|
9
|
+
import { loadTransformStyleSummaries, type ExportSummaryOption } from './transform-summaries.js';
|
|
10
10
|
|
|
11
11
|
export interface ExportDialogProps {
|
|
12
12
|
/** Initial options (pre-populated from last export). */
|
|
13
13
|
initial: ExportOptions;
|
|
14
14
|
/** Whether the export is currently running. */
|
|
15
15
|
exporting: boolean;
|
|
16
|
+
/** Optional host-provided destination path control. */
|
|
17
|
+
destination?: ExportDestinationControl;
|
|
16
18
|
/** Called when the user confirms the export. */
|
|
17
19
|
onExport: (options: ExportOptions) => void;
|
|
20
|
+
/** Called whenever the currently selected options change. */
|
|
21
|
+
onOptionsChange?: (options: ExportOptions) => void;
|
|
18
22
|
/** Called when the dialog is dismissed. */
|
|
19
23
|
onClose: () => void;
|
|
20
24
|
}
|
|
21
25
|
|
|
26
|
+
export interface ExportDestinationControl {
|
|
27
|
+
value: string;
|
|
28
|
+
onPick: (options: ExportOptions) => void | Promise<void>;
|
|
29
|
+
hint?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
22
32
|
const FORMATS: ExportFormat[] = ['pdf', 'docx', 'pptx', 'html', 'md'];
|
|
23
33
|
|
|
24
34
|
/** Short labels for the Format chip row. The fuller `FORMAT_LABELS` list
|
|
@@ -96,7 +106,14 @@ function ChipRadioGroup<T extends string>({
|
|
|
96
106
|
);
|
|
97
107
|
}
|
|
98
108
|
|
|
99
|
-
export function ExportDialog({
|
|
109
|
+
export function ExportDialog({
|
|
110
|
+
initial,
|
|
111
|
+
exporting,
|
|
112
|
+
destination,
|
|
113
|
+
onExport,
|
|
114
|
+
onOptionsChange,
|
|
115
|
+
onClose,
|
|
116
|
+
}: ExportDialogProps) {
|
|
100
117
|
const [format, setFormat] = useState<ExportFormat>(initial.format);
|
|
101
118
|
const [themeId, setThemeId] = useState(initial.themeId);
|
|
102
119
|
const [transformStyle, setTransformStyle] = useState(initial.transformStyle);
|
|
@@ -105,10 +122,10 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
|
|
|
105
122
|
const [htmlBundle, setHtmlBundle] = useState<HtmlBundle>(initial.htmlBundle);
|
|
106
123
|
const [includeLinkedDocs, setIncludeLinkedDocs] = useState<boolean>(initial.includeLinkedDocs);
|
|
107
124
|
const [entryAsIndex, setEntryAsIndex] = useState<boolean>(initial.entryAsIndex);
|
|
125
|
+
const [transforms, setTransforms] = useState<ExportSummaryOption[]>([]);
|
|
108
126
|
const dialogRef = useRef<HTMLDivElement>(null);
|
|
109
127
|
|
|
110
128
|
const themes = getThemeSummaries();
|
|
111
|
-
const transforms = getTransformStyleSummaries();
|
|
112
129
|
|
|
113
130
|
// Both HTML styles honor themes now: rendered HTML through the
|
|
114
131
|
// SquisqPlayer's theme system, plain HTML through squisq's
|
|
@@ -139,8 +156,25 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
|
|
|
139
156
|
// inert control.
|
|
140
157
|
const showEntryAsIndex = showHtmlOptions && (htmlBundle === 'single' || includeLinkedDocs);
|
|
141
158
|
|
|
142
|
-
|
|
143
|
-
|
|
159
|
+
useEffect(() => {
|
|
160
|
+
if (!showTransform) return;
|
|
161
|
+
let cancelled = false;
|
|
162
|
+
|
|
163
|
+
loadTransformStyleSummaries()
|
|
164
|
+
.then((nextTransforms) => {
|
|
165
|
+
if (!cancelled) setTransforms(nextTransforms);
|
|
166
|
+
})
|
|
167
|
+
.catch(() => {
|
|
168
|
+
if (!cancelled) setTransforms([]);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
return () => {
|
|
172
|
+
cancelled = true;
|
|
173
|
+
};
|
|
174
|
+
}, [showTransform]);
|
|
175
|
+
|
|
176
|
+
const currentOptions = useMemo<ExportOptions>(
|
|
177
|
+
() => ({
|
|
144
178
|
format,
|
|
145
179
|
themeId,
|
|
146
180
|
transformStyle,
|
|
@@ -149,22 +183,29 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
|
|
|
149
183
|
htmlBundle,
|
|
150
184
|
includeLinkedDocs: showIncludeLinked && includeLinkedDocs,
|
|
151
185
|
entryAsIndex: showEntryAsIndex && entryAsIndex,
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
186
|
+
}),
|
|
187
|
+
[
|
|
188
|
+
format,
|
|
189
|
+
themeId,
|
|
190
|
+
transformStyle,
|
|
191
|
+
pageSize,
|
|
192
|
+
htmlStyle,
|
|
193
|
+
htmlBundle,
|
|
194
|
+
includeLinkedDocs,
|
|
195
|
+
entryAsIndex,
|
|
196
|
+
showIncludeLinked,
|
|
197
|
+
showEntryAsIndex,
|
|
198
|
+
],
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
useEffect(() => {
|
|
202
|
+
onOptionsChange?.(currentOptions);
|
|
203
|
+
}, [currentOptions, onOptionsChange]);
|
|
204
|
+
|
|
205
|
+
const handleExport = useCallback(() => {
|
|
206
|
+
saveExportOptions(currentOptions);
|
|
207
|
+
onExport(currentOptions);
|
|
208
|
+
}, [currentOptions, onExport]);
|
|
168
209
|
|
|
169
210
|
// Close on Escape
|
|
170
211
|
useEffect(() => {
|
|
@@ -209,6 +250,36 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
|
|
|
209
250
|
/>
|
|
210
251
|
</div>
|
|
211
252
|
|
|
253
|
+
{destination && (
|
|
254
|
+
<div className="db-export-field">
|
|
255
|
+
<label className="db-export-label" htmlFor="db-export-path">
|
|
256
|
+
Export to
|
|
257
|
+
</label>
|
|
258
|
+
<div className="db-export-path-row">
|
|
259
|
+
<input
|
|
260
|
+
id="db-export-path"
|
|
261
|
+
className="db-export-path-input"
|
|
262
|
+
value={destination.value}
|
|
263
|
+
readOnly
|
|
264
|
+
disabled={exporting}
|
|
265
|
+
spellCheck={false}
|
|
266
|
+
autoComplete="off"
|
|
267
|
+
/>
|
|
268
|
+
<button
|
|
269
|
+
type="button"
|
|
270
|
+
className="db-export-path-pick"
|
|
271
|
+
onClick={() => void destination.onPick(currentOptions)}
|
|
272
|
+
disabled={exporting}
|
|
273
|
+
aria-label="Choose export location"
|
|
274
|
+
title="Choose export location"
|
|
275
|
+
>
|
|
276
|
+
...
|
|
277
|
+
</button>
|
|
278
|
+
</div>
|
|
279
|
+
{destination.hint && <span className="db-export-hint">{destination.hint}</span>}
|
|
280
|
+
</div>
|
|
281
|
+
)}
|
|
282
|
+
|
|
212
283
|
{/* HTML style + bundle (HTML only) — also chip rows */}
|
|
213
284
|
{showHtmlOptions && (
|
|
214
285
|
<>
|
|
@@ -313,11 +384,15 @@ export function ExportDialog({ initial, exporting, onExport, onClose }: ExportDi
|
|
|
313
384
|
value={transformStyle}
|
|
314
385
|
onChange={(e) => setTransformStyle(e.target.value)}
|
|
315
386
|
>
|
|
316
|
-
{transforms.
|
|
317
|
-
<option
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
387
|
+
{transforms.length === 0 ? (
|
|
388
|
+
<option value={transformStyle}>Loading...</option>
|
|
389
|
+
) : (
|
|
390
|
+
transforms.map((t) => (
|
|
391
|
+
<option key={t.id} value={t.id}>
|
|
392
|
+
{t.name}
|
|
393
|
+
</option>
|
|
394
|
+
))
|
|
395
|
+
)}
|
|
321
396
|
</select>
|
|
322
397
|
<span className="db-export-hint">
|
|
323
398
|
{transforms.find((t) => t.id === transformStyle)?.description}
|