@bendyline/docblocks-react 2.0.0 → 2.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.
- package/README.md +6 -0
- package/dist/{ExportDialog-MEUISWZX.js → ExportDialog-7LDIXJZ3.js} +3 -2
- package/dist/{ExportToolbarControls-D2YDWOXW.js → ExportToolbarControls-GHAOJMH6.js} +147 -12
- package/dist/ExportToolbarControls-GHAOJMH6.js.map +1 -0
- package/dist/{GitToolbarControl-LMIR4R7I.js → GitToolbarControl-GNMRVKWQ.js} +62 -43
- package/dist/GitToolbarControl-GNMRVKWQ.js.map +1 -0
- package/dist/{GitUI-KGF5MSNV.js → GitUI-VHOBQY43.js} +225 -140
- package/dist/GitUI-VHOBQY43.js.map +1 -0
- package/dist/ShareDialog-63ENBEDZ.js +213 -0
- package/dist/ShareDialog-63ENBEDZ.js.map +1 -0
- package/dist/chunk-57ZJJOC5.js +89 -0
- package/dist/chunk-57ZJJOC5.js.map +1 -0
- package/dist/chunk-FEWQUQML.js +256 -0
- package/dist/chunk-FEWQUQML.js.map +1 -0
- package/dist/chunk-FMGTHSTX.js +110 -0
- package/dist/chunk-FMGTHSTX.js.map +1 -0
- package/dist/chunk-UNYZQXWR.js +324 -0
- package/dist/chunk-UNYZQXWR.js.map +1 -0
- package/dist/editor.d.ts +5 -4
- package/dist/editor.js +8 -69
- package/dist/editor.js.map +1 -1
- package/dist/export/index.d.ts +7 -1
- package/dist/export/index.js +2 -1
- package/dist/index.d.ts +346 -21
- package/dist/index.js +6169 -20
- package/dist/index.js.map +1 -1
- package/dist/settings/index.d.ts +9 -1
- package/dist/settings/index.js +6 -4
- package/package.json +18 -13
- package/src/styles/docblocks.css +537 -26
- package/dist/AppMenu/AppMenu.d.ts +0 -53
- package/dist/AppMenu/AppMenu.d.ts.map +0 -1
- package/dist/AppMenu/AppMenu.js +0 -67
- package/dist/AppMenu/AppMenu.js.map +0 -1
- package/dist/AppMenu/index.d.ts +0 -3
- package/dist/AppMenu/index.d.ts.map +0 -1
- package/dist/AppMenu/index.js +0 -2
- package/dist/AppMenu/index.js.map +0 -1
- package/dist/DocBlocksShell/DocBlocksShell.d.ts +0 -49
- package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +0 -1
- package/dist/DocBlocksShell/DocBlocksShell.js +0 -2730
- package/dist/DocBlocksShell/DocBlocksShell.js.map +0 -1
- package/dist/DocBlocksShell/LazyEditorShell.d.ts +0 -3
- package/dist/DocBlocksShell/LazyEditorShell.d.ts.map +0 -1
- package/dist/DocBlocksShell/LazyEditorShell.js +0 -3
- package/dist/DocBlocksShell/LazyEditorShell.js.map +0 -1
- package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts +0 -13
- package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts.map +0 -1
- package/dist/DocBlocksShell/UpdateAvailableNotice.js +0 -16
- package/dist/DocBlocksShell/UpdateAvailableNotice.js.map +0 -1
- package/dist/DocBlocksShell/document-title.d.ts +0 -3
- package/dist/DocBlocksShell/document-title.d.ts.map +0 -1
- package/dist/DocBlocksShell/document-title.js +0 -17
- package/dist/DocBlocksShell/document-title.js.map +0 -1
- package/dist/DocBlocksShell/index.d.ts +0 -3
- package/dist/DocBlocksShell/index.d.ts.map +0 -1
- package/dist/DocBlocksShell/index.js +0 -2
- package/dist/DocBlocksShell/index.js.map +0 -1
- package/dist/DocBlocksShell/workspace-authority-barrier.d.ts +0 -14
- package/dist/DocBlocksShell/workspace-authority-barrier.d.ts.map +0 -1
- package/dist/DocBlocksShell/workspace-authority-barrier.js +0 -23
- package/dist/DocBlocksShell/workspace-authority-barrier.js.map +0 -1
- package/dist/Export/DeferredExportToolbarControls.d.ts +0 -5
- package/dist/Export/DeferredExportToolbarControls.d.ts.map +0 -1
- package/dist/Export/DeferredExportToolbarControls.js +0 -10
- package/dist/Export/DeferredExportToolbarControls.js.map +0 -1
- package/dist/Export/ExportDialog.d.ts +0 -25
- package/dist/Export/ExportDialog.d.ts.map +0 -1
- package/dist/Export/ExportDialog.js +0 -160
- package/dist/Export/ExportDialog.js.map +0 -1
- package/dist/Export/ExportToolbarControls.d.ts +0 -37
- package/dist/Export/ExportToolbarControls.d.ts.map +0 -1
- package/dist/Export/ExportToolbarControls.js +0 -285
- package/dist/Export/ExportToolbarControls.js.map +0 -1
- package/dist/Export/export-destination.d.ts +0 -3
- package/dist/Export/export-destination.d.ts.map +0 -1
- package/dist/Export/export-destination.js +0 -32
- package/dist/Export/export-destination.js.map +0 -1
- package/dist/Export/export-options.d.ts +0 -53
- package/dist/Export/export-options.d.ts.map +0 -1
- package/dist/Export/export-options.js +0 -49
- package/dist/Export/export-options.js.map +0 -1
- package/dist/Export/index.d.ts +0 -10
- package/dist/Export/index.d.ts.map +0 -1
- package/dist/Export/index.js +0 -6
- package/dist/Export/index.js.map +0 -1
- package/dist/Export/public-api.d.ts +0 -12
- package/dist/Export/public-api.d.ts.map +0 -1
- package/dist/Export/public-api.js +0 -9
- package/dist/Export/public-api.js.map +0 -1
- package/dist/Export/run-export.d.ts +0 -10
- package/dist/Export/run-export.d.ts.map +0 -1
- package/dist/Export/run-export.js +0 -313
- package/dist/Export/run-export.js.map +0 -1
- package/dist/Export/transform-summaries.d.ts +0 -7
- package/dist/Export/transform-summaries.d.ts.map +0 -1
- package/dist/Export/transform-summaries.js +0 -6
- package/dist/Export/transform-summaries.js.map +0 -1
- package/dist/ExportToolbarControls-D2YDWOXW.js.map +0 -1
- package/dist/FileExplorer/FileExplorer.d.ts +0 -43
- package/dist/FileExplorer/FileExplorer.d.ts.map +0 -1
- package/dist/FileExplorer/FileExplorer.js +0 -315
- package/dist/FileExplorer/FileExplorer.js.map +0 -1
- package/dist/FileExplorer/FileTreeNode.d.ts +0 -39
- package/dist/FileExplorer/FileTreeNode.d.ts.map +0 -1
- package/dist/FileExplorer/FileTreeNode.js +0 -131
- package/dist/FileExplorer/FileTreeNode.js.map +0 -1
- package/dist/FileExplorer/index.d.ts +0 -6
- package/dist/FileExplorer/index.d.ts.map +0 -1
- package/dist/FileExplorer/index.js +0 -4
- package/dist/FileExplorer/index.js.map +0 -1
- package/dist/FileExplorer/useFileTree.d.ts +0 -37
- package/dist/FileExplorer/useFileTree.d.ts.map +0 -1
- package/dist/FileExplorer/useFileTree.js +0 -284
- package/dist/FileExplorer/useFileTree.js.map +0 -1
- package/dist/Git/GitAuthGuidanceDialog.d.ts +0 -18
- package/dist/Git/GitAuthGuidanceDialog.d.ts.map +0 -1
- package/dist/Git/GitAuthGuidanceDialog.js +0 -27
- package/dist/Git/GitAuthGuidanceDialog.js.map +0 -1
- package/dist/Git/GitBranchesDialog.d.ts +0 -13
- package/dist/Git/GitBranchesDialog.d.ts.map +0 -1
- package/dist/Git/GitBranchesDialog.js +0 -59
- package/dist/Git/GitBranchesDialog.js.map +0 -1
- package/dist/Git/GitCloneDialog.d.ts +0 -14
- package/dist/Git/GitCloneDialog.d.ts.map +0 -1
- package/dist/Git/GitCloneDialog.js +0 -79
- package/dist/Git/GitCloneDialog.js.map +0 -1
- package/dist/Git/GitCommitDialog.d.ts +0 -12
- package/dist/Git/GitCommitDialog.d.ts.map +0 -1
- package/dist/Git/GitCommitDialog.js +0 -38
- package/dist/Git/GitCommitDialog.js.map +0 -1
- package/dist/Git/GitConflictsDialog.d.ts +0 -12
- package/dist/Git/GitConflictsDialog.d.ts.map +0 -1
- package/dist/Git/GitConflictsDialog.js +0 -17
- package/dist/Git/GitConflictsDialog.js.map +0 -1
- package/dist/Git/GitContext.d.ts +0 -89
- package/dist/Git/GitContext.d.ts.map +0 -1
- package/dist/Git/GitContext.js +0 -15
- package/dist/Git/GitContext.js.map +0 -1
- package/dist/Git/GitDiffDialog.d.ts +0 -20
- package/dist/Git/GitDiffDialog.d.ts.map +0 -1
- package/dist/Git/GitDiffDialog.js +0 -100
- package/dist/Git/GitDiffDialog.js.map +0 -1
- package/dist/Git/GitDiffView.d.ts +0 -23
- package/dist/Git/GitDiffView.d.ts.map +0 -1
- package/dist/Git/GitDiffView.js +0 -77
- package/dist/Git/GitDiffView.js.map +0 -1
- package/dist/Git/GitHistoryDialog.d.ts +0 -15
- package/dist/Git/GitHistoryDialog.d.ts.map +0 -1
- package/dist/Git/GitHistoryDialog.js +0 -107
- package/dist/Git/GitHistoryDialog.js.map +0 -1
- package/dist/Git/GitStatusBar.d.ts +0 -8
- package/dist/Git/GitStatusBar.d.ts.map +0 -1
- package/dist/Git/GitStatusBar.js +0 -49
- package/dist/Git/GitStatusBar.js.map +0 -1
- package/dist/Git/GitToolbarControl.d.ts +0 -15
- package/dist/Git/GitToolbarControl.d.ts.map +0 -1
- package/dist/Git/GitToolbarControl.js +0 -51
- package/dist/Git/GitToolbarControl.js.map +0 -1
- package/dist/Git/GitUI.d.ts +0 -14
- package/dist/Git/GitUI.d.ts.map +0 -1
- package/dist/Git/GitUI.js +0 -21
- package/dist/Git/GitUI.js.map +0 -1
- package/dist/Git/commit-selection.d.ts +0 -22
- package/dist/Git/commit-selection.d.ts.map +0 -1
- package/dist/Git/commit-selection.js +0 -47
- package/dist/Git/commit-selection.js.map +0 -1
- package/dist/Git/git-clone-utils.d.ts +0 -8
- package/dist/Git/git-clone-utils.d.ts.map +0 -1
- package/dist/Git/git-clone-utils.js +0 -26
- package/dist/Git/git-clone-utils.js.map +0 -1
- package/dist/Git/git-status.d.ts +0 -24
- package/dist/Git/git-status.d.ts.map +0 -1
- package/dist/Git/git-status.js +0 -105
- package/dist/Git/git-status.js.map +0 -1
- package/dist/Git/useGit.d.ts +0 -15
- package/dist/Git/useGit.d.ts.map +0 -1
- package/dist/Git/useGit.js +0 -206
- package/dist/Git/useGit.js.map +0 -1
- package/dist/Git/useGitStatus.d.ts +0 -17
- package/dist/Git/useGitStatus.d.ts.map +0 -1
- package/dist/Git/useGitStatus.js +0 -63
- package/dist/Git/useGitStatus.js.map +0 -1
- package/dist/GitToolbarControl-LMIR4R7I.js.map +0 -1
- package/dist/GitUI-KGF5MSNV.js.map +0 -1
- package/dist/Settings/Settings.d.ts +0 -23
- package/dist/Settings/Settings.d.ts.map +0 -1
- package/dist/Settings/Settings.js +0 -22
- package/dist/Settings/Settings.js.map +0 -1
- package/dist/Settings/public-api.d.ts +0 -3
- package/dist/Settings/public-api.d.ts.map +0 -1
- package/dist/Settings/public-api.js +0 -2
- package/dist/Settings/public-api.js.map +0 -1
- package/dist/WorkspacePicker/WorkspacePicker.d.ts +0 -22
- package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +0 -1
- package/dist/WorkspacePicker/WorkspacePicker.js +0 -74
- package/dist/WorkspacePicker/WorkspacePicker.js.map +0 -1
- package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts +0 -11
- package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts.map +0 -1
- package/dist/WorkspacePicker/WorkspaceSettingsButton.js +0 -27
- package/dist/WorkspacePicker/WorkspaceSettingsButton.js.map +0 -1
- package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts +0 -20
- package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts.map +0 -1
- package/dist/WorkspacePicker/WorkspaceSettingsDialog.js +0 -36
- package/dist/WorkspacePicker/WorkspaceSettingsDialog.js.map +0 -1
- package/dist/WorkspacePicker/index.d.ts +0 -3
- package/dist/WorkspacePicker/index.d.ts.map +0 -1
- package/dist/WorkspacePicker/index.js +0 -2
- package/dist/WorkspacePicker/index.js.map +0 -1
- package/dist/chunk-3SAXDU2U.js +0 -157
- package/dist/chunk-3SAXDU2U.js.map +0 -1
- package/dist/chunk-AOVTHZU7.js +0 -321
- package/dist/chunk-AOVTHZU7.js.map +0 -1
- package/dist/chunk-GSNZSCIK.js +0 -55
- package/dist/chunk-GSNZSCIK.js.map +0 -1
- package/dist/components/Dialog.d.ts +0 -22
- package/dist/components/Dialog.d.ts.map +0 -1
- package/dist/components/Dialog.js +0 -33
- package/dist/components/Dialog.js.map +0 -1
- package/dist/editor.d.ts.map +0 -1
- package/dist/hooks/index.d.ts +0 -3
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -2
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/useDocumentSession.d.ts +0 -16
- package/dist/hooks/useDocumentSession.d.ts.map +0 -1
- package/dist/hooks/useDocumentSession.js +0 -18
- package/dist/hooks/useDocumentSession.js.map +0 -1
- package/dist/icons.d.ts +0 -12
- package/dist/icons.d.ts.map +0 -1
- package/dist/icons.js +0 -28
- package/dist/icons.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/preferences/theme.d.ts +0 -18
- package/dist/preferences/theme.d.ts.map +0 -1
- package/dist/preferences/theme.js +0 -63
- package/dist/preferences/theme.js.map +0 -1
- package/dist/preferences/versioning.d.ts +0 -27
- package/dist/preferences/versioning.d.ts.map +0 -1
- package/dist/preferences/versioning.js +0 -62
- package/dist/preferences/versioning.js.map +0 -1
- package/dist/provider-lease.d.ts +0 -10
- package/dist/provider-lease.d.ts.map +0 -1
- package/dist/provider-lease.js +0 -42
- package/dist/provider-lease.js.map +0 -1
- package/src/AppMenu/AppMenu.tsx +0 -334
- package/src/AppMenu/index.ts +0 -2
- package/src/DocBlocksShell/DocBlocksShell.tsx +0 -3398
- package/src/DocBlocksShell/LazyEditorShell.ts +0 -2
- package/src/DocBlocksShell/UpdateAvailableNotice.tsx +0 -60
- package/src/DocBlocksShell/document-title.ts +0 -19
- package/src/DocBlocksShell/index.ts +0 -2
- package/src/DocBlocksShell/workspace-authority-barrier.ts +0 -26
- package/src/Export/DeferredExportToolbarControls.tsx +0 -23
- package/src/Export/ExportDialog.tsx +0 -437
- package/src/Export/ExportToolbarControls.tsx +0 -511
- package/src/Export/export-destination.ts +0 -30
- package/src/Export/export-options.ts +0 -99
- package/src/Export/index.ts +0 -19
- package/src/Export/public-api.ts +0 -17
- package/src/Export/run-export.ts +0 -374
- package/src/Export/transform-summaries.ts +0 -14
- package/src/FileExplorer/FileExplorer.tsx +0 -528
- package/src/FileExplorer/FileTreeNode.tsx +0 -306
- package/src/FileExplorer/index.ts +0 -5
- package/src/FileExplorer/useFileTree.ts +0 -352
- package/src/Git/GitAuthGuidanceDialog.tsx +0 -84
- package/src/Git/GitBranchesDialog.tsx +0 -144
- package/src/Git/GitCloneDialog.tsx +0 -200
- package/src/Git/GitCommitDialog.tsx +0 -119
- package/src/Git/GitConflictsDialog.tsx +0 -62
- package/src/Git/GitContext.tsx +0 -88
- package/src/Git/GitDiffDialog.tsx +0 -147
- package/src/Git/GitDiffView.tsx +0 -105
- package/src/Git/GitHistoryDialog.tsx +0 -195
- package/src/Git/GitStatusBar.tsx +0 -157
- package/src/Git/GitToolbarControl.tsx +0 -123
- package/src/Git/GitUI.tsx +0 -68
- package/src/Git/commit-selection.ts +0 -63
- package/src/Git/git-clone-utils.ts +0 -23
- package/src/Git/git-status.ts +0 -113
- package/src/Git/useGit.ts +0 -279
- package/src/Git/useGitStatus.ts +0 -78
- package/src/Settings/Settings.tsx +0 -118
- package/src/Settings/public-api.ts +0 -8
- package/src/WorkspacePicker/WorkspacePicker.tsx +0 -191
- package/src/WorkspacePicker/WorkspaceSettingsButton.tsx +0 -88
- package/src/WorkspacePicker/WorkspaceSettingsDialog.tsx +0 -121
- package/src/WorkspacePicker/index.ts +0 -2
- package/src/components/Dialog.tsx +0 -81
- package/src/editor.ts +0 -72
- package/src/hooks/index.ts +0 -2
- package/src/hooks/useDocumentSession.ts +0 -37
- package/src/icons.tsx +0 -48
- package/src/index.ts +0 -61
- package/src/preferences/theme.ts +0 -67
- package/src/preferences/versioning.ts +0 -69
- package/src/provider-lease.ts +0 -52
- package/src/types/pwa-dom.d.ts +0 -31
- /package/dist/{ExportDialog-MEUISWZX.js.map → ExportDialog-7LDIXJZ3.js.map} +0 -0
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* WorkspaceSettingsDialog — per-workspace settings modal.
|
|
4
|
-
*
|
|
5
|
-
* Lets the user override the global versioning preference for a single
|
|
6
|
-
* workspace (or fall back to inheriting it). The override is stored on
|
|
7
|
-
* the WorkspaceDescriptor and persisted via `saveWorkspace`.
|
|
8
|
-
*/
|
|
9
|
-
import { useCallback, useEffect } from 'react';
|
|
10
|
-
import { isLocalWorkspaceType, resolveVersioningEnabled, } from '../preferences/versioning.js';
|
|
11
|
-
const VERSIONING_LABELS = {
|
|
12
|
-
on: 'on',
|
|
13
|
-
'browser-only': 'on for browser workspaces, off for local folders',
|
|
14
|
-
off: 'off',
|
|
15
|
-
};
|
|
16
|
-
export function WorkspaceSettingsDialog({ workspace, globalVersioningPreference, onChange, onClose, }) {
|
|
17
|
-
// Treat absent/undefined as 'inherit' for the radio state.
|
|
18
|
-
const current = workspace.versioningOverride ?? 'inherit';
|
|
19
|
-
useEffect(() => {
|
|
20
|
-
const onKey = (e) => {
|
|
21
|
-
if (e.key === 'Escape')
|
|
22
|
-
onClose();
|
|
23
|
-
};
|
|
24
|
-
window.addEventListener('keydown', onKey);
|
|
25
|
-
return () => window.removeEventListener('keydown', onKey);
|
|
26
|
-
}, [onClose]);
|
|
27
|
-
const handleBackdropClick = useCallback((e) => {
|
|
28
|
-
if (e.target === e.currentTarget)
|
|
29
|
-
onClose();
|
|
30
|
-
}, [onClose]);
|
|
31
|
-
const isLocal = isLocalWorkspaceType(workspace.type);
|
|
32
|
-
const inheritedEnabled = resolveVersioningEnabled({ ...workspace, versioningOverride: 'inherit' }, globalVersioningPreference);
|
|
33
|
-
const inheritLabel = `Inherit default — currently ${VERSIONING_LABELS[globalVersioningPreference]} (${inheritedEnabled ? 'on' : 'off'} for this workspace)`;
|
|
34
|
-
return (_jsx("div", { className: "db-dialog-overlay", onClick: handleBackdropClick, children: _jsxs("div", { className: "db-dialog", role: "dialog", "aria-label": "Workspace settings", children: [_jsxs("div", { className: "db-dialog-header", children: [_jsx("h2", { className: "db-dialog-title", children: "Workspace settings" }), _jsx("button", { type: "button", className: "db-dialog-close", onClick: onClose, "aria-label": "Close", children: "\u00D7" })] }), _jsxs("div", { className: "db-dialog-body", children: [_jsxs("p", { className: "db-settings-hint", children: [_jsx("strong", { children: workspace.name }), " \u00B7", ' ', isLocal ? 'Local folder workspace' : 'Browser workspace'] }), _jsxs("fieldset", { className: "db-settings-fieldset", children: [_jsx("legend", { className: "db-settings-legend", children: "Version history" }), _jsxs("p", { className: "db-settings-hint", children: ["Controls whether DocBlocks keeps prior revisions in", ' ', _jsx("code", { children: "<name>_files/.versions/" }), " for documents in this workspace."] }), _jsxs("label", { className: "db-settings-radio", children: [_jsx("input", { type: "radio", name: "ws-versioning", value: "inherit", checked: current === 'inherit', onChange: () => onChange('inherit') }), inheritLabel] }), _jsxs("label", { className: "db-settings-radio", children: [_jsx("input", { type: "radio", name: "ws-versioning", value: "on", checked: current === 'on', onChange: () => onChange('on') }), "On for this workspace"] }), _jsxs("label", { className: "db-settings-radio", children: [_jsx("input", { type: "radio", name: "ws-versioning", value: "off", checked: current === 'off', onChange: () => onChange('off') }), "Off for this workspace"] })] })] })] }) }));
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=WorkspaceSettingsDialog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspaceSettingsDialog.js","sourceRoot":"","sources":["../../src/WorkspacePicker/WorkspaceSettingsDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/WorkspacePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/WorkspacePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/chunk-3SAXDU2U.js
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Dialog
|
|
3
|
-
} from "./chunk-GSNZSCIK.js";
|
|
4
|
-
|
|
5
|
-
// src/preferences/theme.ts
|
|
6
|
-
var ACCENT_COLORS = [
|
|
7
|
-
"brown",
|
|
8
|
-
"green",
|
|
9
|
-
"blue",
|
|
10
|
-
"purple",
|
|
11
|
-
"maroon",
|
|
12
|
-
"orange",
|
|
13
|
-
"gray"
|
|
14
|
-
];
|
|
15
|
-
var DB_CHROME_COLORS = {
|
|
16
|
-
light: "#f3eede",
|
|
17
|
-
dark: "#262219"
|
|
18
|
-
};
|
|
19
|
-
var THEME_STORAGE_KEY = "docblocks:themePreference";
|
|
20
|
-
var ACCENT_STORAGE_KEY = "docblocks:accentColor";
|
|
21
|
-
function loadThemePreference() {
|
|
22
|
-
try {
|
|
23
|
-
const raw = localStorage.getItem(THEME_STORAGE_KEY);
|
|
24
|
-
if (raw === "light" || raw === "dark" || raw === "auto") return raw;
|
|
25
|
-
} catch {
|
|
26
|
-
}
|
|
27
|
-
return "auto";
|
|
28
|
-
}
|
|
29
|
-
function saveThemePreference(value) {
|
|
30
|
-
try {
|
|
31
|
-
localStorage.setItem(THEME_STORAGE_KEY, value);
|
|
32
|
-
} catch {
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function loadAccentColor() {
|
|
36
|
-
try {
|
|
37
|
-
const raw = localStorage.getItem(ACCENT_STORAGE_KEY);
|
|
38
|
-
if (ACCENT_COLORS.some((color) => color === raw)) return raw;
|
|
39
|
-
} catch {
|
|
40
|
-
}
|
|
41
|
-
return "brown";
|
|
42
|
-
}
|
|
43
|
-
function saveAccentColor(value) {
|
|
44
|
-
try {
|
|
45
|
-
localStorage.setItem(ACCENT_STORAGE_KEY, value);
|
|
46
|
-
} catch {
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// src/Settings/Settings.tsx
|
|
51
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
52
|
-
var ACCENT_LABELS = {
|
|
53
|
-
brown: "Brown",
|
|
54
|
-
green: "Green",
|
|
55
|
-
blue: "Blue",
|
|
56
|
-
purple: "Purple",
|
|
57
|
-
maroon: "Maroon",
|
|
58
|
-
orange: "Orange",
|
|
59
|
-
gray: "Gray"
|
|
60
|
-
};
|
|
61
|
-
function SettingsDialog({ title = "Settings", onClose, children }) {
|
|
62
|
-
return /* @__PURE__ */ jsx(Dialog, { title, onClose, children });
|
|
63
|
-
}
|
|
64
|
-
function ThemeSettings({ value, onChange, name = "theme" }) {
|
|
65
|
-
return /* @__PURE__ */ jsxs("fieldset", { className: "db-settings-fieldset", children: [
|
|
66
|
-
/* @__PURE__ */ jsx("legend", { className: "db-settings-legend", children: "Theme" }),
|
|
67
|
-
/* @__PURE__ */ jsxs("label", { className: "db-settings-radio", children: [
|
|
68
|
-
/* @__PURE__ */ jsx(
|
|
69
|
-
"input",
|
|
70
|
-
{
|
|
71
|
-
type: "radio",
|
|
72
|
-
name,
|
|
73
|
-
value: "auto",
|
|
74
|
-
checked: value === "auto",
|
|
75
|
-
onChange: () => onChange("auto")
|
|
76
|
-
}
|
|
77
|
-
),
|
|
78
|
-
"System default"
|
|
79
|
-
] }),
|
|
80
|
-
/* @__PURE__ */ jsxs("label", { className: "db-settings-radio", children: [
|
|
81
|
-
/* @__PURE__ */ jsx(
|
|
82
|
-
"input",
|
|
83
|
-
{
|
|
84
|
-
type: "radio",
|
|
85
|
-
name,
|
|
86
|
-
value: "light",
|
|
87
|
-
checked: value === "light",
|
|
88
|
-
onChange: () => onChange("light")
|
|
89
|
-
}
|
|
90
|
-
),
|
|
91
|
-
"Light"
|
|
92
|
-
] }),
|
|
93
|
-
/* @__PURE__ */ jsxs("label", { className: "db-settings-radio", children: [
|
|
94
|
-
/* @__PURE__ */ jsx(
|
|
95
|
-
"input",
|
|
96
|
-
{
|
|
97
|
-
type: "radio",
|
|
98
|
-
name,
|
|
99
|
-
value: "dark",
|
|
100
|
-
checked: value === "dark",
|
|
101
|
-
onChange: () => onChange("dark")
|
|
102
|
-
}
|
|
103
|
-
),
|
|
104
|
-
"Dark"
|
|
105
|
-
] })
|
|
106
|
-
] });
|
|
107
|
-
}
|
|
108
|
-
function AccentColorSettings({
|
|
109
|
-
value,
|
|
110
|
-
onChange,
|
|
111
|
-
name = "accent-color"
|
|
112
|
-
}) {
|
|
113
|
-
return /* @__PURE__ */ jsxs("fieldset", { className: "db-settings-fieldset", children: [
|
|
114
|
-
/* @__PURE__ */ jsx("legend", { className: "db-settings-legend", children: "Accent color" }),
|
|
115
|
-
/* @__PURE__ */ jsx("p", { className: "db-settings-hint", children: "Used in both light and dark appearances." }),
|
|
116
|
-
/* @__PURE__ */ jsx("div", { className: "db-settings-accent-grid", children: ACCENT_COLORS.map((color) => /* @__PURE__ */ jsxs(
|
|
117
|
-
"label",
|
|
118
|
-
{
|
|
119
|
-
className: `db-settings-accent${value === color ? " db-settings-accent--selected" : ""}`,
|
|
120
|
-
children: [
|
|
121
|
-
/* @__PURE__ */ jsx(
|
|
122
|
-
"input",
|
|
123
|
-
{
|
|
124
|
-
className: "db-settings-accent-input",
|
|
125
|
-
type: "radio",
|
|
126
|
-
name,
|
|
127
|
-
value: color,
|
|
128
|
-
checked: value === color,
|
|
129
|
-
onChange: () => onChange(color)
|
|
130
|
-
}
|
|
131
|
-
),
|
|
132
|
-
/* @__PURE__ */ jsx(
|
|
133
|
-
"span",
|
|
134
|
-
{
|
|
135
|
-
className: `db-settings-accent-swatch db-settings-accent-swatch--${color}`,
|
|
136
|
-
"aria-hidden": "true"
|
|
137
|
-
}
|
|
138
|
-
),
|
|
139
|
-
/* @__PURE__ */ jsx("span", { children: ACCENT_LABELS[color] })
|
|
140
|
-
]
|
|
141
|
-
},
|
|
142
|
-
color
|
|
143
|
-
)) })
|
|
144
|
-
] });
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export {
|
|
148
|
-
DB_CHROME_COLORS,
|
|
149
|
-
loadThemePreference,
|
|
150
|
-
saveThemePreference,
|
|
151
|
-
loadAccentColor,
|
|
152
|
-
saveAccentColor,
|
|
153
|
-
SettingsDialog,
|
|
154
|
-
ThemeSettings,
|
|
155
|
-
AccentColorSettings
|
|
156
|
-
};
|
|
157
|
-
//# sourceMappingURL=chunk-3SAXDU2U.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/preferences/theme.ts","../src/Settings/Settings.tsx"],"sourcesContent":["/** Appearance preferences shared by the shell and settings UI. */\n\nexport type ThemePreference = 'auto' | 'light' | 'dark';\n\nexport const ACCENT_COLORS = [\n 'brown',\n 'green',\n 'blue',\n 'purple',\n 'maroon',\n 'orange',\n 'gray',\n] as const;\n\nexport type AccentColor = (typeof ACCENT_COLORS)[number];\n\n/**\n * Chrome (titlebar) background per resolved theme. Keep in sync with\n * `--db-bg-subtle` for the default accent in styles/docblocks.css and with\n * the static `<meta name=\"theme-color\">` values in the site's index.html.\n * The shell writes these into the theme-color metas so the installed web\n * app's titlebar (Window Controls Overlay caption area, Android status bar)\n * follows the resolved theme.\n */\nexport const DB_CHROME_COLORS: Record<'light' | 'dark', string> = {\n light: '#f3eede',\n dark: '#262219',\n};\n\nconst THEME_STORAGE_KEY = 'docblocks:themePreference';\nconst ACCENT_STORAGE_KEY = 'docblocks:accentColor';\n\nexport function loadThemePreference(): ThemePreference {\n try {\n const raw = localStorage.getItem(THEME_STORAGE_KEY);\n if (raw === 'light' || raw === 'dark' || raw === 'auto') return raw;\n } catch {\n // ignore unavailable storage\n }\n return 'auto';\n}\n\nexport function saveThemePreference(value: ThemePreference): void {\n try {\n localStorage.setItem(THEME_STORAGE_KEY, value);\n } catch {\n // ignore quota errors\n }\n}\n\nexport function loadAccentColor(): AccentColor {\n try {\n const raw = localStorage.getItem(ACCENT_STORAGE_KEY);\n if (ACCENT_COLORS.some((color) => color === raw)) return raw as AccentColor;\n } catch {\n // ignore unavailable storage\n }\n return 'brown';\n}\n\nexport function saveAccentColor(value: AccentColor): void {\n try {\n localStorage.setItem(ACCENT_STORAGE_KEY, value);\n } catch {\n // ignore quota errors\n }\n}\n","/** Shared controls used by the app and host-specific DocBlocks settings dialogs. */\n\nimport type { ReactNode } from 'react';\nimport { Dialog } from '../components/Dialog.js';\nimport { ACCENT_COLORS, type AccentColor, type ThemePreference } from '../preferences/theme.js';\n\nexport type { AccentColor, ThemePreference } from '../preferences/theme.js';\n\nconst ACCENT_LABELS: Record<AccentColor, string> = {\n brown: 'Brown',\n green: 'Green',\n blue: 'Blue',\n purple: 'Purple',\n maroon: 'Maroon',\n orange: 'Orange',\n gray: 'Gray',\n};\n\nexport interface SettingsDialogProps {\n title?: string;\n onClose: () => void;\n children: ReactNode;\n}\n\nexport function SettingsDialog({ title = 'Settings', onClose, children }: SettingsDialogProps) {\n return (\n <Dialog title={title} onClose={onClose}>\n {children}\n </Dialog>\n );\n}\n\nexport interface ThemeSettingsProps {\n value: ThemePreference;\n onChange: (theme: ThemePreference) => void;\n name?: string;\n}\n\nexport function ThemeSettings({ value, onChange, name = 'theme' }: ThemeSettingsProps) {\n return (\n <fieldset className=\"db-settings-fieldset\">\n <legend className=\"db-settings-legend\">Theme</legend>\n <label className=\"db-settings-radio\">\n <input\n type=\"radio\"\n name={name}\n value=\"auto\"\n checked={value === 'auto'}\n onChange={() => onChange('auto')}\n />\n System default\n </label>\n <label className=\"db-settings-radio\">\n <input\n type=\"radio\"\n name={name}\n value=\"light\"\n checked={value === 'light'}\n onChange={() => onChange('light')}\n />\n Light\n </label>\n <label className=\"db-settings-radio\">\n <input\n type=\"radio\"\n name={name}\n value=\"dark\"\n checked={value === 'dark'}\n onChange={() => onChange('dark')}\n />\n Dark\n </label>\n </fieldset>\n );\n}\n\nexport interface AccentColorSettingsProps {\n value: AccentColor;\n onChange: (color: AccentColor) => void;\n name?: string;\n}\n\nexport function AccentColorSettings({\n value,\n onChange,\n name = 'accent-color',\n}: AccentColorSettingsProps) {\n return (\n <fieldset className=\"db-settings-fieldset\">\n <legend className=\"db-settings-legend\">Accent color</legend>\n <p className=\"db-settings-hint\">Used in both light and dark appearances.</p>\n <div className=\"db-settings-accent-grid\">\n {ACCENT_COLORS.map((color) => (\n <label\n className={`db-settings-accent${\n value === color ? ' db-settings-accent--selected' : ''\n }`}\n key={color}\n >\n <input\n className=\"db-settings-accent-input\"\n type=\"radio\"\n name={name}\n value={color}\n checked={value === color}\n onChange={() => onChange(color)}\n />\n <span\n className={`db-settings-accent-swatch db-settings-accent-swatch--${color}`}\n aria-hidden=\"true\"\n />\n <span>{ACCENT_LABELS[color]}</span>\n </label>\n ))}\n </div>\n </fieldset>\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-AOVTHZU7.js
DELETED
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
loadTransformStyleSummaries
|
|
3
|
-
} from "./chunk-4XXSWN3T.js";
|
|
4
|
-
import {
|
|
5
|
-
FORMAT_LABELS,
|
|
6
|
-
saveExportOptions
|
|
7
|
-
} from "./chunk-DD4VFJQI.js";
|
|
8
|
-
|
|
9
|
-
// src/Export/ExportDialog.tsx
|
|
10
|
-
import { useState, useCallback, useEffect, useMemo, useRef } from "react";
|
|
11
|
-
import { getThemeSummaries } from "@bendyline/squisq/schemas";
|
|
12
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
-
var FORMATS = ["pdf", "docx", "pptx", "html", "md"];
|
|
14
|
-
var FORMAT_CHIP_LABELS = {
|
|
15
|
-
pdf: "PDF",
|
|
16
|
-
docx: "Word",
|
|
17
|
-
pptx: "PowerPoint",
|
|
18
|
-
html: "HTML",
|
|
19
|
-
md: "Markdown"
|
|
20
|
-
};
|
|
21
|
-
var HTML_STYLE_CHIPS = [
|
|
22
|
-
{
|
|
23
|
-
key: "plain",
|
|
24
|
-
label: "Plain",
|
|
25
|
-
hint: "A lightweight static HTML document."
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
key: "rendered",
|
|
29
|
-
label: "Rendered",
|
|
30
|
-
hint: "Renders via SquisqPlayer with themes and playback support."
|
|
31
|
-
}
|
|
32
|
-
];
|
|
33
|
-
var HTML_BUNDLE_CHIPS = [
|
|
34
|
-
{
|
|
35
|
-
key: "single",
|
|
36
|
-
label: "Single file",
|
|
37
|
-
hint: "One .html file with images embedded as base64 data URIs."
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
key: "zip",
|
|
41
|
-
label: "ZIP archive",
|
|
42
|
-
hint: "A .zip with index.html plus separate image (and JS) files."
|
|
43
|
-
}
|
|
44
|
-
];
|
|
45
|
-
function ChipRadioGroup({
|
|
46
|
-
name,
|
|
47
|
-
value,
|
|
48
|
-
options,
|
|
49
|
-
onChange
|
|
50
|
-
}) {
|
|
51
|
-
return /* @__PURE__ */ jsx("div", { className: "db-export-chips", role: "radiogroup", "aria-label": name, children: options.map((opt) => {
|
|
52
|
-
const active = opt.key === value;
|
|
53
|
-
return /* @__PURE__ */ jsx(
|
|
54
|
-
"button",
|
|
55
|
-
{
|
|
56
|
-
type: "button",
|
|
57
|
-
role: "radio",
|
|
58
|
-
"aria-checked": active,
|
|
59
|
-
className: `db-export-chip${active ? " db-export-chip--active" : ""}`,
|
|
60
|
-
onClick: () => onChange(opt.key),
|
|
61
|
-
title: opt.title,
|
|
62
|
-
children: opt.label
|
|
63
|
-
},
|
|
64
|
-
opt.key
|
|
65
|
-
);
|
|
66
|
-
}) });
|
|
67
|
-
}
|
|
68
|
-
function ExportDialog({
|
|
69
|
-
initial,
|
|
70
|
-
exporting,
|
|
71
|
-
destination,
|
|
72
|
-
onExport,
|
|
73
|
-
onOptionsChange,
|
|
74
|
-
onClose
|
|
75
|
-
}) {
|
|
76
|
-
const [format, setFormat] = useState(initial.format);
|
|
77
|
-
const [themeId, setThemeId] = useState(initial.themeId);
|
|
78
|
-
const [transformStyle, setTransformStyle] = useState(initial.transformStyle);
|
|
79
|
-
const [pageSize, setPageSize] = useState(initial.pageSize);
|
|
80
|
-
const [htmlStyle, setHtmlStyle] = useState(initial.htmlStyle);
|
|
81
|
-
const [htmlBundle, setHtmlBundle] = useState(initial.htmlBundle);
|
|
82
|
-
const [includeLinkedDocs, setIncludeLinkedDocs] = useState(initial.includeLinkedDocs);
|
|
83
|
-
const [entryAsIndex, setEntryAsIndex] = useState(initial.entryAsIndex);
|
|
84
|
-
const [transforms, setTransforms] = useState([]);
|
|
85
|
-
const dialogRef = useRef(null);
|
|
86
|
-
const themes = getThemeSummaries();
|
|
87
|
-
const showTheme = format === "docx" || format === "pdf" || format === "pptx" || format === "html";
|
|
88
|
-
const showTransform = format === "pptx";
|
|
89
|
-
const showPageSize = format === "pdf";
|
|
90
|
-
const showHtmlOptions = format === "html";
|
|
91
|
-
const showIncludeLinked = format === "html";
|
|
92
|
-
const showHtmlBundle = showHtmlOptions && !includeLinkedDocs;
|
|
93
|
-
const showEntryAsIndex = showHtmlOptions && (htmlBundle === "single" || includeLinkedDocs);
|
|
94
|
-
useEffect(() => {
|
|
95
|
-
if (!showTransform) return;
|
|
96
|
-
let cancelled = false;
|
|
97
|
-
loadTransformStyleSummaries().then((nextTransforms) => {
|
|
98
|
-
if (!cancelled) setTransforms(nextTransforms);
|
|
99
|
-
}).catch(() => {
|
|
100
|
-
if (!cancelled) setTransforms([]);
|
|
101
|
-
});
|
|
102
|
-
return () => {
|
|
103
|
-
cancelled = true;
|
|
104
|
-
};
|
|
105
|
-
}, [showTransform]);
|
|
106
|
-
const currentOptions = useMemo(
|
|
107
|
-
() => ({
|
|
108
|
-
format,
|
|
109
|
-
themeId,
|
|
110
|
-
transformStyle,
|
|
111
|
-
pageSize,
|
|
112
|
-
htmlStyle,
|
|
113
|
-
htmlBundle,
|
|
114
|
-
includeLinkedDocs: showIncludeLinked && includeLinkedDocs,
|
|
115
|
-
entryAsIndex: showEntryAsIndex && entryAsIndex
|
|
116
|
-
}),
|
|
117
|
-
[
|
|
118
|
-
format,
|
|
119
|
-
themeId,
|
|
120
|
-
transformStyle,
|
|
121
|
-
pageSize,
|
|
122
|
-
htmlStyle,
|
|
123
|
-
htmlBundle,
|
|
124
|
-
includeLinkedDocs,
|
|
125
|
-
entryAsIndex,
|
|
126
|
-
showIncludeLinked,
|
|
127
|
-
showEntryAsIndex
|
|
128
|
-
]
|
|
129
|
-
);
|
|
130
|
-
useEffect(() => {
|
|
131
|
-
onOptionsChange?.(currentOptions);
|
|
132
|
-
}, [currentOptions, onOptionsChange]);
|
|
133
|
-
const handleExport = useCallback(() => {
|
|
134
|
-
saveExportOptions(currentOptions);
|
|
135
|
-
onExport(currentOptions);
|
|
136
|
-
}, [currentOptions, onExport]);
|
|
137
|
-
useEffect(() => {
|
|
138
|
-
const onKey = (e) => {
|
|
139
|
-
if (e.key === "Escape") onClose();
|
|
140
|
-
};
|
|
141
|
-
window.addEventListener("keydown", onKey);
|
|
142
|
-
return () => window.removeEventListener("keydown", onKey);
|
|
143
|
-
}, [onClose]);
|
|
144
|
-
const handleBackdropClick = useCallback(
|
|
145
|
-
(e) => {
|
|
146
|
-
if (e.target === e.currentTarget) onClose();
|
|
147
|
-
},
|
|
148
|
-
[onClose]
|
|
149
|
-
);
|
|
150
|
-
return /* @__PURE__ */ jsx("div", { className: "db-dialog-overlay", onClick: handleBackdropClick, children: /* @__PURE__ */ jsxs("div", { className: "db-dialog db-export-dialog", ref: dialogRef, children: [
|
|
151
|
-
/* @__PURE__ */ jsxs("div", { className: "db-dialog-header", children: [
|
|
152
|
-
/* @__PURE__ */ jsx("h2", { className: "db-dialog-title", children: "Export Document" }),
|
|
153
|
-
/* @__PURE__ */ jsx("button", { className: "db-dialog-close", onClick: onClose, "aria-label": "Close", children: "\xD7" })
|
|
154
|
-
] }),
|
|
155
|
-
/* @__PURE__ */ jsxs("div", { className: "db-dialog-body", children: [
|
|
156
|
-
/* @__PURE__ */ jsxs("div", { className: "db-export-field", children: [
|
|
157
|
-
/* @__PURE__ */ jsx("span", { className: "db-export-label", children: "Format" }),
|
|
158
|
-
/* @__PURE__ */ jsx(
|
|
159
|
-
ChipRadioGroup,
|
|
160
|
-
{
|
|
161
|
-
name: "Format",
|
|
162
|
-
value: format,
|
|
163
|
-
options: FORMATS.map((f) => ({
|
|
164
|
-
key: f,
|
|
165
|
-
label: FORMAT_CHIP_LABELS[f],
|
|
166
|
-
title: FORMAT_LABELS[f]
|
|
167
|
-
})),
|
|
168
|
-
onChange: setFormat
|
|
169
|
-
}
|
|
170
|
-
)
|
|
171
|
-
] }),
|
|
172
|
-
destination && /* @__PURE__ */ jsxs("div", { className: "db-export-field", children: [
|
|
173
|
-
/* @__PURE__ */ jsx("label", { className: "db-export-label", htmlFor: "db-export-path", children: "Export to" }),
|
|
174
|
-
/* @__PURE__ */ jsxs("div", { className: "db-export-path-row", children: [
|
|
175
|
-
/* @__PURE__ */ jsx(
|
|
176
|
-
"input",
|
|
177
|
-
{
|
|
178
|
-
id: "db-export-path",
|
|
179
|
-
className: "db-export-path-input",
|
|
180
|
-
value: destination.value,
|
|
181
|
-
readOnly: true,
|
|
182
|
-
disabled: exporting,
|
|
183
|
-
spellCheck: false,
|
|
184
|
-
autoComplete: "off"
|
|
185
|
-
}
|
|
186
|
-
),
|
|
187
|
-
/* @__PURE__ */ jsx(
|
|
188
|
-
"button",
|
|
189
|
-
{
|
|
190
|
-
type: "button",
|
|
191
|
-
className: "db-export-path-pick",
|
|
192
|
-
onClick: () => void destination.onPick(currentOptions),
|
|
193
|
-
disabled: exporting,
|
|
194
|
-
"aria-label": "Choose export location",
|
|
195
|
-
title: "Choose export location",
|
|
196
|
-
children: "..."
|
|
197
|
-
}
|
|
198
|
-
)
|
|
199
|
-
] }),
|
|
200
|
-
destination.hint && /* @__PURE__ */ jsx("span", { className: "db-export-hint", children: destination.hint })
|
|
201
|
-
] }),
|
|
202
|
-
showHtmlOptions && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
203
|
-
/* @__PURE__ */ jsxs("div", { className: "db-export-field", children: [
|
|
204
|
-
/* @__PURE__ */ jsx("span", { className: "db-export-label", children: "Style" }),
|
|
205
|
-
/* @__PURE__ */ jsx(
|
|
206
|
-
ChipRadioGroup,
|
|
207
|
-
{
|
|
208
|
-
name: "Style",
|
|
209
|
-
value: htmlStyle,
|
|
210
|
-
options: HTML_STYLE_CHIPS,
|
|
211
|
-
onChange: setHtmlStyle
|
|
212
|
-
}
|
|
213
|
-
),
|
|
214
|
-
/* @__PURE__ */ jsx("span", { className: "db-export-hint", children: HTML_STYLE_CHIPS.find((c) => c.key === htmlStyle)?.hint })
|
|
215
|
-
] }),
|
|
216
|
-
showHtmlBundle && /* @__PURE__ */ jsxs("div", { className: "db-export-field", children: [
|
|
217
|
-
/* @__PURE__ */ jsx("span", { className: "db-export-label", children: "Bundle" }),
|
|
218
|
-
/* @__PURE__ */ jsx(
|
|
219
|
-
ChipRadioGroup,
|
|
220
|
-
{
|
|
221
|
-
name: "Bundle",
|
|
222
|
-
value: htmlBundle,
|
|
223
|
-
options: HTML_BUNDLE_CHIPS,
|
|
224
|
-
onChange: setHtmlBundle
|
|
225
|
-
}
|
|
226
|
-
),
|
|
227
|
-
/* @__PURE__ */ jsx("span", { className: "db-export-hint", children: HTML_BUNDLE_CHIPS.find((c) => c.key === htmlBundle)?.hint })
|
|
228
|
-
] }),
|
|
229
|
-
showIncludeLinked && /* @__PURE__ */ jsxs("div", { className: "db-export-field", children: [
|
|
230
|
-
/* @__PURE__ */ jsxs("label", { className: "db-export-checkbox", children: [
|
|
231
|
-
/* @__PURE__ */ jsx(
|
|
232
|
-
"input",
|
|
233
|
-
{
|
|
234
|
-
type: "checkbox",
|
|
235
|
-
checked: includeLinkedDocs,
|
|
236
|
-
onChange: (e) => setIncludeLinkedDocs(e.target.checked)
|
|
237
|
-
}
|
|
238
|
-
),
|
|
239
|
-
/* @__PURE__ */ jsx("span", { children: "Include linked-to documents" })
|
|
240
|
-
] }),
|
|
241
|
-
/* @__PURE__ */ jsx("span", { className: "db-export-hint", children: includeLinkedDocs ? "Follows relative .md links from this page and bundles every reachable document as its own .html in a ZIP. Cross-doc links rewrite from .md to .html." : "Only this document is exported." })
|
|
242
|
-
] }),
|
|
243
|
-
showEntryAsIndex && /* @__PURE__ */ jsxs("div", { className: "db-export-field", children: [
|
|
244
|
-
/* @__PURE__ */ jsxs("label", { className: "db-export-checkbox", children: [
|
|
245
|
-
/* @__PURE__ */ jsx(
|
|
246
|
-
"input",
|
|
247
|
-
{
|
|
248
|
-
type: "checkbox",
|
|
249
|
-
checked: entryAsIndex,
|
|
250
|
-
onChange: (e) => setEntryAsIndex(e.target.checked)
|
|
251
|
-
}
|
|
252
|
-
),
|
|
253
|
-
/* @__PURE__ */ jsx("span", { children: "Name entry page index.html" })
|
|
254
|
-
] }),
|
|
255
|
-
/* @__PURE__ */ jsx("span", { className: "db-export-hint", children: entryAsIndex ? includeLinkedDocs ? "Renames this page to index.html in the ZIP and rewrites any cross-doc links pointing back at it. Drops straight into a static-site host." : "Downloads as index.html instead of the document name. Drops straight into a static-site host." : "Exports under the document name." })
|
|
256
|
-
] })
|
|
257
|
-
] }),
|
|
258
|
-
showTheme && /* @__PURE__ */ jsxs("div", { className: "db-export-field", children: [
|
|
259
|
-
/* @__PURE__ */ jsx("label", { className: "db-export-label", htmlFor: "db-export-theme", children: "Theme" }),
|
|
260
|
-
/* @__PURE__ */ jsx(
|
|
261
|
-
"select",
|
|
262
|
-
{
|
|
263
|
-
id: "db-export-theme",
|
|
264
|
-
className: "db-export-select",
|
|
265
|
-
value: themeId,
|
|
266
|
-
onChange: (e) => setThemeId(e.target.value),
|
|
267
|
-
children: themes.map((t) => /* @__PURE__ */ jsx("option", { value: t.id, children: t.name }, t.id))
|
|
268
|
-
}
|
|
269
|
-
),
|
|
270
|
-
/* @__PURE__ */ jsx("span", { className: "db-export-hint", children: themes.find((t) => t.id === themeId)?.description })
|
|
271
|
-
] }),
|
|
272
|
-
showTransform && /* @__PURE__ */ jsxs("div", { className: "db-export-field", children: [
|
|
273
|
-
/* @__PURE__ */ jsx("label", { className: "db-export-label", htmlFor: "db-export-transform", children: "Transform" }),
|
|
274
|
-
/* @__PURE__ */ jsx(
|
|
275
|
-
"select",
|
|
276
|
-
{
|
|
277
|
-
id: "db-export-transform",
|
|
278
|
-
className: "db-export-select",
|
|
279
|
-
value: transformStyle,
|
|
280
|
-
onChange: (e) => setTransformStyle(e.target.value),
|
|
281
|
-
children: transforms.length === 0 ? /* @__PURE__ */ jsx("option", { value: transformStyle, children: "Loading..." }) : transforms.map((t) => /* @__PURE__ */ jsx("option", { value: t.id, children: t.name }, t.id))
|
|
282
|
-
}
|
|
283
|
-
),
|
|
284
|
-
/* @__PURE__ */ jsx("span", { className: "db-export-hint", children: transforms.find((t) => t.id === transformStyle)?.description })
|
|
285
|
-
] }),
|
|
286
|
-
showPageSize && /* @__PURE__ */ jsxs("div", { className: "db-export-field", children: [
|
|
287
|
-
/* @__PURE__ */ jsx("label", { className: "db-export-label", htmlFor: "db-export-pagesize", children: "Page Size" }),
|
|
288
|
-
/* @__PURE__ */ jsxs(
|
|
289
|
-
"select",
|
|
290
|
-
{
|
|
291
|
-
id: "db-export-pagesize",
|
|
292
|
-
className: "db-export-select",
|
|
293
|
-
value: pageSize,
|
|
294
|
-
onChange: (e) => setPageSize(e.target.value),
|
|
295
|
-
children: [
|
|
296
|
-
/* @__PURE__ */ jsx("option", { value: "letter", children: "US Letter" }),
|
|
297
|
-
/* @__PURE__ */ jsx("option", { value: "a4", children: "A4" })
|
|
298
|
-
]
|
|
299
|
-
}
|
|
300
|
-
)
|
|
301
|
-
] })
|
|
302
|
-
] }),
|
|
303
|
-
/* @__PURE__ */ jsxs("div", { className: "db-export-footer", children: [
|
|
304
|
-
/* @__PURE__ */ jsx("button", { className: "db-export-btn db-export-btn--secondary", onClick: onClose, children: "Cancel" }),
|
|
305
|
-
/* @__PURE__ */ jsx(
|
|
306
|
-
"button",
|
|
307
|
-
{
|
|
308
|
-
className: "db-export-btn db-export-btn--primary",
|
|
309
|
-
onClick: handleExport,
|
|
310
|
-
disabled: exporting,
|
|
311
|
-
children: exporting ? "Exporting..." : "Export"
|
|
312
|
-
}
|
|
313
|
-
)
|
|
314
|
-
] })
|
|
315
|
-
] }) });
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
export {
|
|
319
|
-
ExportDialog
|
|
320
|
-
};
|
|
321
|
-
//# sourceMappingURL=chunk-AOVTHZU7.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Export/ExportDialog.tsx"],"sourcesContent":["/**\n * ExportDialog — modal for choosing export format and options.\n */\n\nimport { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { getThemeSummaries } from '@bendyline/squisq/schemas';\nimport type { ExportFormat, ExportOptions, HtmlBundle, HtmlStyle } from './export-options.js';\nimport { FORMAT_LABELS, saveExportOptions } from './export-options.js';\nimport { loadTransformStyleSummaries, type ExportSummaryOption } from './transform-summaries.js';\n\nexport interface ExportDialogProps {\n /** Initial options (pre-populated from last export). */\n initial: ExportOptions;\n /** Whether the export is currently running. */\n exporting: boolean;\n /** Optional host-provided destination path control. */\n destination?: ExportDestinationControl;\n /** Called when the user confirms the export. */\n onExport: (options: ExportOptions) => void;\n /** Called whenever the currently selected options change. */\n onOptionsChange?: (options: ExportOptions) => void;\n /** Called when the dialog is dismissed. */\n onClose: () => void;\n}\n\nexport interface ExportDestinationControl {\n value: string;\n onPick: (options: ExportOptions) => void | Promise<void>;\n hint?: string;\n}\n\nconst FORMATS: ExportFormat[] = ['pdf', 'docx', 'pptx', 'html', 'md'];\n\n/** Short labels for the Format chip row. The fuller `FORMAT_LABELS` list\n * is still used as a tooltip so users can confirm the file extension. */\nconst FORMAT_CHIP_LABELS: Record<ExportFormat, string> = {\n pdf: 'PDF',\n docx: 'Word',\n pptx: 'PowerPoint',\n html: 'HTML',\n md: 'Markdown',\n};\n\nconst HTML_STYLE_CHIPS: { key: HtmlStyle; label: string; hint: string }[] = [\n {\n key: 'plain',\n label: 'Plain',\n hint: 'A lightweight static HTML document.',\n },\n {\n key: 'rendered',\n label: 'Rendered',\n hint: 'Renders via SquisqPlayer with themes and playback support.',\n },\n];\n\nconst HTML_BUNDLE_CHIPS: { key: HtmlBundle; label: string; hint: string }[] = [\n {\n key: 'single',\n label: 'Single file',\n hint: 'One .html file with images embedded as base64 data URIs.',\n },\n {\n key: 'zip',\n label: 'ZIP archive',\n hint: 'A .zip with index.html plus separate image (and JS) files.',\n },\n];\n\ninterface ChipOption<T extends string> {\n key: T;\n label: string;\n title?: string;\n}\n\nfunction ChipRadioGroup<T extends string>({\n name,\n value,\n options,\n onChange,\n}: {\n name: string;\n value: T;\n options: ChipOption<T>[];\n onChange: (next: T) => void;\n}) {\n return (\n <div className=\"db-export-chips\" role=\"radiogroup\" aria-label={name}>\n {options.map((opt) => {\n const active = opt.key === value;\n return (\n <button\n key={opt.key}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n className={`db-export-chip${active ? ' db-export-chip--active' : ''}`}\n onClick={() => onChange(opt.key)}\n title={opt.title}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function ExportDialog({\n initial,\n exporting,\n destination,\n onExport,\n onOptionsChange,\n onClose,\n}: ExportDialogProps) {\n const [format, setFormat] = useState<ExportFormat>(initial.format);\n const [themeId, setThemeId] = useState(initial.themeId);\n const [transformStyle, setTransformStyle] = useState(initial.transformStyle);\n const [pageSize, setPageSize] = useState(initial.pageSize);\n const [htmlStyle, setHtmlStyle] = useState<HtmlStyle>(initial.htmlStyle);\n const [htmlBundle, setHtmlBundle] = useState<HtmlBundle>(initial.htmlBundle);\n const [includeLinkedDocs, setIncludeLinkedDocs] = useState<boolean>(initial.includeLinkedDocs);\n const [entryAsIndex, setEntryAsIndex] = useState<boolean>(initial.entryAsIndex);\n const [transforms, setTransforms] = useState<ExportSummaryOption[]>([]);\n const dialogRef = useRef<HTMLDivElement>(null);\n\n const themes = getThemeSummaries();\n\n // Both HTML styles honor themes now: rendered HTML through the\n // SquisqPlayer's theme system, plain HTML through squisq's\n // `markdownDocToPlainHtml` which emits theme-driven CSS variables\n // and Google Fonts links. Show the dropdown for any export format\n // whose pipeline actually applies the picked theme.\n const showTheme = format === 'docx' || format === 'pdf' || format === 'pptx' || format === 'html';\n const showTransform = format === 'pptx';\n const showPageSize = format === 'pdf';\n const showHtmlOptions = format === 'html';\n // Both HTML styles now have a recursive bundle: plain via\n // `markdownDocsToPlainHtmlBundle`, rendered via\n // `markdownDocsToHtmlBundle` (which rewrites Doc-tree links to\n // `.html` before SquisqPlayer serialization). So the option applies\n // to any HTML export.\n const showIncludeLinked = format === 'html';\n // Multi-doc output is inherently a directory tree, so when recursion\n // is on the Bundle row would only confuse — ZIP is the only valid\n // packaging. Hide the chip row and surface the implication in a hint.\n const showHtmlBundle = showHtmlOptions && !includeLinkedDocs;\n // `entryAsIndex` is only honored in pipelines where we control the\n // output filename ourselves:\n // • single-file HTML downloads → renames `<doc>.html` → `index.html`\n // • recursive bundles → passed through to squisq's bundle helpers\n // In the single-doc ZIP path, squisq's `docToHtmlZip` and our plain-\n // HTML zip writer always emit `index.html` inside the archive, so the\n // checkbox has no observable effect — hide it to avoid surfacing an\n // inert control.\n const showEntryAsIndex = showHtmlOptions && (htmlBundle === 'single' || includeLinkedDocs);\n\n useEffect(() => {\n if (!showTransform) return;\n let cancelled = false;\n\n loadTransformStyleSummaries()\n .then((nextTransforms) => {\n if (!cancelled) setTransforms(nextTransforms);\n })\n .catch(() => {\n if (!cancelled) setTransforms([]);\n });\n\n return () => {\n cancelled = true;\n };\n }, [showTransform]);\n\n const currentOptions = useMemo<ExportOptions>(\n () => ({\n format,\n themeId,\n transformStyle,\n pageSize,\n htmlStyle,\n htmlBundle,\n includeLinkedDocs: showIncludeLinked && includeLinkedDocs,\n entryAsIndex: showEntryAsIndex && entryAsIndex,\n }),\n [\n format,\n themeId,\n transformStyle,\n pageSize,\n htmlStyle,\n htmlBundle,\n includeLinkedDocs,\n entryAsIndex,\n showIncludeLinked,\n showEntryAsIndex,\n ],\n );\n\n useEffect(() => {\n onOptionsChange?.(currentOptions);\n }, [currentOptions, onOptionsChange]);\n\n const handleExport = useCallback(() => {\n saveExportOptions(currentOptions);\n onExport(currentOptions);\n }, [currentOptions, onExport]);\n\n // Close on Escape\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n // Close on backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) onClose();\n },\n [onClose],\n );\n\n return (\n <div className=\"db-dialog-overlay\" onClick={handleBackdropClick}>\n <div className=\"db-dialog db-export-dialog\" ref={dialogRef}>\n <div className=\"db-dialog-header\">\n <h2 className=\"db-dialog-title\">Export Document</h2>\n <button className=\"db-dialog-close\" onClick={onClose} aria-label=\"Close\">\n ×\n </button>\n </div>\n\n <div className=\"db-dialog-body\">\n {/* Format — chip radio row for fast switching */}\n <div className=\"db-export-field\">\n <span className=\"db-export-label\">Format</span>\n <ChipRadioGroup\n name=\"Format\"\n value={format}\n options={FORMATS.map((f) => ({\n key: f,\n label: FORMAT_CHIP_LABELS[f],\n title: FORMAT_LABELS[f],\n }))}\n onChange={setFormat}\n />\n </div>\n\n {destination && (\n <div className=\"db-export-field\">\n <label className=\"db-export-label\" htmlFor=\"db-export-path\">\n Export to\n </label>\n <div className=\"db-export-path-row\">\n <input\n id=\"db-export-path\"\n className=\"db-export-path-input\"\n value={destination.value}\n readOnly\n disabled={exporting}\n spellCheck={false}\n autoComplete=\"off\"\n />\n <button\n type=\"button\"\n className=\"db-export-path-pick\"\n onClick={() => void destination.onPick(currentOptions)}\n disabled={exporting}\n aria-label=\"Choose export location\"\n title=\"Choose export location\"\n >\n ...\n </button>\n </div>\n {destination.hint && <span className=\"db-export-hint\">{destination.hint}</span>}\n </div>\n )}\n\n {/* HTML style + bundle (HTML only) — also chip rows */}\n {showHtmlOptions && (\n <>\n <div className=\"db-export-field\">\n <span className=\"db-export-label\">Style</span>\n <ChipRadioGroup\n name=\"Style\"\n value={htmlStyle}\n options={HTML_STYLE_CHIPS}\n onChange={setHtmlStyle}\n />\n <span className=\"db-export-hint\">\n {HTML_STYLE_CHIPS.find((c) => c.key === htmlStyle)?.hint}\n </span>\n </div>\n {showHtmlBundle && (\n <div className=\"db-export-field\">\n <span className=\"db-export-label\">Bundle</span>\n <ChipRadioGroup\n name=\"Bundle\"\n value={htmlBundle}\n options={HTML_BUNDLE_CHIPS}\n onChange={setHtmlBundle}\n />\n <span className=\"db-export-hint\">\n {HTML_BUNDLE_CHIPS.find((c) => c.key === htmlBundle)?.hint}\n </span>\n </div>\n )}\n {showIncludeLinked && (\n <div className=\"db-export-field\">\n <label className=\"db-export-checkbox\">\n <input\n type=\"checkbox\"\n checked={includeLinkedDocs}\n onChange={(e) => setIncludeLinkedDocs(e.target.checked)}\n />\n <span>Include linked-to documents</span>\n </label>\n <span className=\"db-export-hint\">\n {includeLinkedDocs\n ? 'Follows relative .md links from this page and bundles every reachable document as its own .html in a ZIP. Cross-doc links rewrite from .md to .html.'\n : 'Only this document is exported.'}\n </span>\n </div>\n )}\n {showEntryAsIndex && (\n <div className=\"db-export-field\">\n <label className=\"db-export-checkbox\">\n <input\n type=\"checkbox\"\n checked={entryAsIndex}\n onChange={(e) => setEntryAsIndex(e.target.checked)}\n />\n <span>Name entry page index.html</span>\n </label>\n <span className=\"db-export-hint\">\n {entryAsIndex\n ? includeLinkedDocs\n ? 'Renames this page to index.html in the ZIP and rewrites any cross-doc links pointing back at it. Drops straight into a static-site host.'\n : 'Downloads as index.html instead of the document name. Drops straight into a static-site host.'\n : 'Exports under the document name.'}\n </span>\n </div>\n )}\n </>\n )}\n\n {/* Theme */}\n {showTheme && (\n <div className=\"db-export-field\">\n <label className=\"db-export-label\" htmlFor=\"db-export-theme\">\n Theme\n </label>\n <select\n id=\"db-export-theme\"\n className=\"db-export-select\"\n value={themeId}\n onChange={(e) => setThemeId(e.target.value)}\n >\n {themes.map((t) => (\n <option key={t.id} value={t.id}>\n {t.name}\n </option>\n ))}\n </select>\n <span className=\"db-export-hint\">\n {themes.find((t) => t.id === themeId)?.description}\n </span>\n </div>\n )}\n\n {/* Transform (PPTX only) */}\n {showTransform && (\n <div className=\"db-export-field\">\n <label className=\"db-export-label\" htmlFor=\"db-export-transform\">\n Transform\n </label>\n <select\n id=\"db-export-transform\"\n className=\"db-export-select\"\n value={transformStyle}\n onChange={(e) => setTransformStyle(e.target.value)}\n >\n {transforms.length === 0 ? (\n <option value={transformStyle}>Loading...</option>\n ) : (\n transforms.map((t) => (\n <option key={t.id} value={t.id}>\n {t.name}\n </option>\n ))\n )}\n </select>\n <span className=\"db-export-hint\">\n {transforms.find((t) => t.id === transformStyle)?.description}\n </span>\n </div>\n )}\n\n {/* Page size (PDF only) */}\n {showPageSize && (\n <div className=\"db-export-field\">\n <label className=\"db-export-label\" htmlFor=\"db-export-pagesize\">\n Page Size\n </label>\n <select\n id=\"db-export-pagesize\"\n className=\"db-export-select\"\n value={pageSize}\n onChange={(e) => setPageSize(e.target.value as 'letter' | 'a4')}\n >\n <option value=\"letter\">US Letter</option>\n <option value=\"a4\">A4</option>\n </select>\n </div>\n )}\n </div>\n\n <div className=\"db-export-footer\">\n <button className=\"db-export-btn db-export-btn--secondary\" onClick={onClose}>\n Cancel\n </button>\n <button\n className=\"db-export-btn db-export-btn--primary\"\n onClick={handleExport}\n disabled={exporting}\n >\n {exporting ? 'Exporting...' : 'Export'}\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|