@bendyline/docblocks-react 1.1.2 → 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 +31 -5
- 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 +15 -2
- package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +1 -1
- package/dist/DocBlocksShell/DocBlocksShell.js +1677 -298
- 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 +20 -18
- 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 +96 -11
- 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 +30 -13
- package/dist/Export/run-export.js.map +1 -1
- 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 +24 -9
- package/src/AppMenu/AppMenu.tsx +169 -99
- package/src/AppMenu/index.ts +1 -1
- package/src/DocBlocksShell/DocBlocksShell.tsx +2157 -537
- 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 +74 -20
- package/src/Export/ExportToolbarControls.tsx +238 -40
- 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 +36 -11
- 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 +2174 -79
- 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/dist/monaco-slim.d.ts +0 -19
- package/dist/monaco-slim.d.ts.map +0 -1
- package/dist/monaco-slim.js +0 -19
- package/dist/monaco-slim.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
- package/src/monaco-slim.ts +0 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Git/GitStatusBar.tsx","../src/Git/GitCommitDialog.tsx","../src/Git/commit-selection.ts","../src/Git/GitBranchesDialog.tsx","../src/Git/GitHistoryDialog.tsx","../src/Git/GitDiffDialog.tsx","../src/Git/GitDiffView.tsx","../src/Git/GitCloneDialog.tsx","../src/Git/git-clone-utils.ts","../src/Git/GitAuthGuidanceDialog.tsx","../src/Git/GitConflictsDialog.tsx","../src/Git/GitUI.tsx"],"sourcesContent":["/**\n * GitStatusBar — slim sidebar row showing branch, ahead/behind, and dirty\n * count, with the repo actions menu (commit, sync, branches, history,\n * remote conveniences). Renders nothing unless the active workspace is a\n * git repository.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useGitContext } from './GitContext.js';\nimport { formatAheadBehind, summarizeDirty } from './git-status.js';\n\nexport function GitStatusBar() {\n const git = useGitContext();\n const [menuOpen, setMenuOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!menuOpen) return;\n const onPointerDown = (e: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n setMenuOpen(false);\n }\n };\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [menuOpen]);\n\n const runItem = useCallback((action: () => void) => {\n setMenuOpen(false);\n action();\n }, []);\n\n if (!git || !git.repo || !git.status) return null;\n\n const { status } = git;\n const branchLabel = status.detached ? 'detached HEAD' : (status.branch ?? 'no branch');\n const aheadBehind = formatAheadBehind(status);\n const dirty = summarizeDirty(status);\n const merging = status.operation === 'merge';\n const chipLabelParts = [`Git: branch ${branchLabel}`];\n if (status.ahead > 0) chipLabelParts.push(`${status.ahead} ahead`);\n if (status.behind > 0) chipLabelParts.push(`${status.behind} behind`);\n if (dirty) chipLabelParts.push(dirty);\n if (merging) chipLabelParts.push('merge in progress');\n\n const canCreatePr =\n git.capabilities?.ghAvailable === true && git.remoteWeb?.host === 'github.com';\n\n return (\n <div ref={rootRef} className=\"db-git-statusbar\">\n <button\n type=\"button\"\n className=\"db-git-statusbar-chip\"\n onClick={() => setMenuOpen((open) => !open)}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n aria-label={chipLabelParts.join(', ')}\n title={chipLabelParts.join(', ')}\n >\n <span className=\"db-git-branch-glyph\" aria-hidden=\"true\">\n {'⎇'}\n </span>\n <span className=\"db-git-statusbar-branch\">{branchLabel}</span>\n {aheadBehind && <span className=\"db-git-statusbar-counts\">{aheadBehind}</span>}\n {dirty && <span className=\"db-git-statusbar-dirty\">{dirty}</span>}\n {merging && <span className=\"db-git-statusbar-merge\">merging</span>}\n {git.busy && (\n <span className=\"db-git-statusbar-busy\" aria-hidden=\"true\">\n {'…'}\n </span>\n )}\n </button>\n\n {menuOpen && (\n <div className=\"db-git-menu\" role=\"menu\" aria-label=\"Git actions\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-git-menu-item\"\n disabled={status.changes.length === 0 && !merging}\n onClick={() => runItem(() => git.openDialog({ kind: 'commit' }))}\n >\n {merging ? 'Commit merge…' : 'Commit…'}\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-git-menu-item\"\n disabled={git.busy !== null}\n onClick={() => runItem(() => void git.push())}\n >\n {status.upstream === null && !status.unborn ? 'Publish branch' : 'Push'}\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-git-menu-item\"\n disabled={git.busy !== null}\n onClick={() => runItem(() => void git.pull())}\n >\n Pull\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-git-menu-item\"\n disabled={git.busy !== null}\n onClick={() => runItem(() => void git.fetchRemote())}\n >\n Fetch\n </button>\n <div className=\"db-git-menu-divider\" role=\"separator\" />\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-git-menu-item\"\n onClick={() => runItem(() => git.openDialog({ kind: 'branches' }))}\n >\n Branches…\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-git-menu-item\"\n onClick={() => runItem(() => git.openDialog({ kind: 'history' }))}\n >\n Commit history…\n </button>\n {(git.remoteWeb || canCreatePr) && (\n <div className=\"db-git-menu-divider\" role=\"separator\" />\n )}\n {git.remoteWeb && (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-git-menu-item\"\n onClick={() => runItem(() => git.openOnRemote())}\n >\n Open on {git.remoteWeb.host}\n </button>\n )}\n {canCreatePr && (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-git-menu-item\"\n disabled={git.busy !== null}\n onClick={() => runItem(() => void git.createPullRequest())}\n >\n Create pull request\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * GitCommitDialog — message + per-file selection for committing changes.\n *\n * All changed files are included by default; while a merge is being\n * concluded, conflicted files are force-included (locked) because a commit\n * that omits them would not resolve the merge. Selection logic lives in\n * commit-selection.ts so it stays unit-testable.\n */\n\nimport { useRef, useState } from 'react';\nimport { Dialog } from '../components/Dialog.js';\nimport { useGitContext } from './GitContext.js';\nimport { BADGE_LABELS, badgeKindFor } from './git-status.js';\nimport {\n canCommit,\n initSelection,\n isMergeCommit,\n selectedPaths,\n setAllSelected,\n toggleSelection,\n type CommitSelection,\n} from './commit-selection.js';\n\nexport function GitCommitDialog({ onClose }: { onClose: () => void }) {\n const git = useGitContext();\n const status = git?.status ?? null;\n const merging = isMergeCommit(status);\n\n const [message, setMessage] = useState('');\n const [selection, setSelection] = useState<CommitSelection>(() =>\n initSelection(status?.changes ?? [], merging),\n );\n const messageRef = useRef<HTMLTextAreaElement>(null);\n\n if (!git || !status) return null;\n\n const allOn = [...selection.included.values()].every(Boolean);\n const commitDisabled = !canCommit(message, selection) || git.busy !== null;\n\n const handleCommit = async () => {\n const ok = await git.commit(message, selectedPaths(selection));\n if (ok) onClose();\n };\n\n return (\n <Dialog\n title={merging ? 'Commit merge' : 'Commit changes'}\n onClose={onClose}\n size=\"wide\"\n closeOnBackdrop={false}\n initialFocusRef={messageRef}\n footer={\n <>\n <button type=\"button\" className=\"db-git-secondary-btn\" onClick={onClose}>\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"db-git-primary-btn\"\n disabled={commitDisabled}\n onClick={() => void handleCommit()}\n >\n Commit\n </button>\n </>\n }\n >\n {merging && (\n <p className=\"db-settings-hint\">\n You’re completing a merge. Committing will conclude it.\n </p>\n )}\n <textarea\n ref={messageRef}\n className=\"db-git-commit-message\"\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n placeholder=\"Commit message\"\n aria-label=\"Commit message\"\n rows={3}\n />\n <div className=\"db-git-form-row\">\n <button\n type=\"button\"\n className=\"db-git-secondary-btn\"\n onClick={() => setSelection((s) => setAllSelected(s, !allOn))}\n >\n {allOn ? 'Select none' : 'Select all'}\n </button>\n </div>\n <ul className=\"db-git-file-list\">\n {status.changes.map((change) => {\n const kind = badgeKindFor(change);\n const locked = selection.locked.has(change.path);\n const checked = locked || (selection.included.get(change.path) ?? true);\n return (\n <li key={change.path} className=\"db-git-file-row\">\n <label>\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={locked}\n onChange={() => setSelection((s) => toggleSelection(s, change.path))}\n />\n <span>{change.path.replace(/^\\/+/, '')}</span>\n </label>\n <span className=\"db-git-file-kind\">{BADGE_LABELS[kind]}</span>\n </li>\n );\n })}\n </ul>\n {git.lastResult?.tone === 'error' && (\n <p className=\"db-git-form-error\" role=\"alert\">\n {git.lastResult.message}\n </p>\n )}\n </Dialog>\n );\n}\n","/**\n * Commit-dialog selection state — pure helpers, unit-testable.\n *\n * All changed files are included by default. While a merge is being\n * concluded, conflicted files are force-included: committing a subset that\n * omits them would not resolve the merge.\n */\n\nimport type { GitFileChange, GitStatus } from '@bendyline/docblocks/host';\n\nexport interface CommitSelection {\n /** Slash-prefixed path → include in the commit. */\n included: Map<string, boolean>;\n /** Paths the user cannot exclude (conflicted files during a merge). */\n locked: Set<string>;\n}\n\nfunction normalise(path: string): string {\n return path.startsWith('/') ? path : `/${path}`;\n}\n\nexport function initSelection(\n changes: readonly GitFileChange[],\n merging: boolean,\n): CommitSelection {\n const included = new Map<string, boolean>();\n const locked = new Set<string>();\n for (const change of changes) {\n const path = normalise(change.path);\n included.set(path, true);\n if (merging && change.conflicted) locked.add(path);\n }\n return { included, locked };\n}\n\nexport function toggleSelection(selection: CommitSelection, path: string): CommitSelection {\n const key = normalise(path);\n if (selection.locked.has(key)) return selection;\n const included = new Map(selection.included);\n included.set(key, !included.get(key));\n return { included, locked: selection.locked };\n}\n\nexport function setAllSelected(selection: CommitSelection, value: boolean): CommitSelection {\n const included = new Map<string, boolean>();\n for (const key of selection.included.keys()) {\n included.set(key, selection.locked.has(key) ? true : value);\n }\n return { included, locked: selection.locked };\n}\n\nexport function selectedPaths(selection: CommitSelection): string[] {\n return [...selection.included.entries()].filter(([, on]) => on).map(([path]) => path);\n}\n\nexport function canCommit(message: string, selection: CommitSelection): boolean {\n return message.trim().length > 0 && selectedPaths(selection).length > 0;\n}\n\n/** True when committing concludes an in-progress merge. */\nexport function isMergeCommit(status: GitStatus | null): boolean {\n return status?.operation === 'merge';\n}\n","/**\n * GitBranchesDialog — switch between local branches or create a new one.\n *\n * Loads the branch list once from the host git API on mount. Remote\n * branches are display-only in v1 (a collapsed disclosure); switching and\n * creating go through the GitValue actions so errors (e.g. uncommitted\n * changes blocking a checkout) surface inline via lastResult.\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { GitBranchInfo } from '@bendyline/docblocks/host';\nimport { Dialog } from '../components/Dialog.js';\nimport { useGitContext } from './GitContext.js';\n\nexport function GitBranchesDialog({\n createFocus,\n onClose,\n}: {\n createFocus?: boolean;\n onClose: () => void;\n}) {\n const git = useGitContext();\n const gitApi = git?.gitApi ?? null;\n const repositoryId = git?.repositoryId ?? null;\n\n const [branches, setBranches] = useState<GitBranchInfo[] | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [newName, setNewName] = useState('');\n const createInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!gitApi || !repositoryId) return;\n let cancelled = false;\n void gitApi.listBranches(repositoryId).then((result) => {\n if (cancelled) return;\n if (result.ok) setBranches(result.value);\n else setLoadError(result.error.message || 'Could not list branches');\n });\n return () => {\n cancelled = true;\n };\n }, [gitApi, repositoryId]);\n\n if (!git) return null;\n\n const locals = branches?.filter((b) => b.kind === 'local') ?? [];\n const remotes = branches?.filter((b) => b.kind === 'remote') ?? [];\n const canCreate = newName.trim().length > 0 && git.busy === null;\n\n const handleSwitch = async (name: string) => {\n const ok = await git.switchBranch(name);\n if (ok) onClose();\n };\n\n const handleCreate = async () => {\n if (!canCreate) return;\n const ok = await git.createBranch(newName.trim());\n if (ok) onClose();\n };\n\n return (\n <Dialog\n title=\"Branches\"\n onClose={onClose}\n initialFocusRef={createFocus ? createInputRef : undefined}\n >\n {branches === null && loadError === null && <p className=\"db-git-hint\">Loading branches…</p>}\n {loadError !== null && (\n <p className=\"db-git-form-error\" role=\"alert\">\n {loadError}\n </p>\n )}\n {branches !== null && (\n <div className=\"db-git-branch-list\">\n {locals.map((branch) =>\n branch.current ? (\n <span\n key={branch.name}\n className=\"db-git-branch-row db-git-branch-row--current\"\n aria-current=\"true\"\n >\n {branch.name}\n </span>\n ) : (\n <button\n key={branch.name}\n type=\"button\"\n className=\"db-git-branch-row\"\n disabled={git.busy !== null}\n onClick={() => void handleSwitch(branch.name)}\n >\n {branch.name}\n </button>\n ),\n )}\n </div>\n )}\n {git.lastResult?.tone === 'error' && (\n <p className=\"db-git-form-error\" role=\"alert\">\n {git.lastResult.message}\n </p>\n )}\n <hr />\n <div className=\"db-git-form-row\">\n <label className=\"db-git-form-label\" htmlFor=\"db-git-new-branch-name\">\n New branch\n </label>\n <input\n id=\"db-git-new-branch-name\"\n ref={createInputRef}\n className=\"db-git-form-input\"\n type=\"text\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') void handleCreate();\n }}\n placeholder=\"feature/my-branch\"\n spellCheck={false}\n />\n <button\n type=\"button\"\n className=\"db-git-primary-btn\"\n disabled={!canCreate}\n onClick={() => void handleCreate()}\n >\n Create\n </button>\n </div>\n {remotes.length > 0 && (\n <details>\n <summary>Remote branches ({remotes.length})</summary>\n <div className=\"db-git-branch-list\">\n {remotes.map((branch) => (\n <span key={branch.name} className=\"db-git-branch-row\">\n {branch.name}\n </span>\n ))}\n </div>\n </details>\n )}\n </Dialog>\n );\n}\n","/**\n * GitHistoryDialog — paged commit log for the repository or a single file.\n *\n * Pages `git log` 50 commits at a time; a row expands (one at a time) to\n * show the full message body and the files changed in that commit — each\n * file opens the commit-vs-parent diff dialog (which replaces this one;\n * acceptable for v1).\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport type { GitFileChange, GitLogEntry } from '@bendyline/docblocks/host';\nimport { Dialog } from '../components/Dialog.js';\nimport { useGitContext } from './GitContext.js';\nimport { BADGE_GLYPHS, BADGE_LABELS, badgeKindFor } from './git-status.js';\n\nexport interface GitHistoryDialogProps {\n /** Slash-prefixed workspace-relative path; absent → whole-repo history. */\n path?: string;\n onClose: () => void;\n}\n\nconst PAGE_SIZE = 50;\n\ntype CommitDetail = { body: string; files: GitFileChange[] } | { error: string };\n\n/** Message body beyond the subject line, or '' when it adds nothing. */\nfunction extraBody(body: string, subject: string): string {\n const trimmedBody = body.trim();\n const trimmedSubject = subject.trim();\n if (!trimmedBody || trimmedBody === trimmedSubject) return '';\n if (trimmedBody.startsWith(trimmedSubject)) {\n return trimmedBody.slice(trimmedSubject.length).trim();\n }\n return trimmedBody;\n}\n\nfunction formatDate(iso: string): string {\n const date = new Date(iso);\n return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;\n}\n\nexport function GitHistoryDialog({ path, onClose }: GitHistoryDialogProps) {\n const git = useGitContext();\n const gitApi = git?.gitApi ?? null;\n const repositoryId = git?.repositoryId ?? null;\n\n const [entries, setEntries] = useState<GitLogEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [expandedSha, setExpandedSha] = useState<string | null>(null);\n const [details, setDetails] = useState<ReadonlyMap<string, CommitDetail>>(new Map());\n\n const loadPage = useCallback(\n async (skip: number) => {\n if (!gitApi || !repositoryId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await gitApi.log(repositoryId, { path, maxCount: PAGE_SIZE, skip });\n if (!result.ok) {\n setError(result.error.message);\n return;\n }\n setEntries((prev) => (skip === 0 ? result.value : [...prev, ...result.value]));\n setHasMore(result.value.length === PAGE_SIZE);\n } finally {\n setLoading(false);\n }\n },\n [gitApi, repositoryId, path],\n );\n\n useEffect(() => {\n setEntries([]);\n setExpandedSha(null);\n setDetails(new Map());\n setHasMore(false);\n void loadPage(0);\n }, [loadPage]);\n\n const handleRowClick = (sha: string) => {\n if (expandedSha === sha) {\n setExpandedSha(null);\n return;\n }\n setExpandedSha(sha);\n if (!gitApi || !repositoryId || details.has(sha)) return;\n void gitApi.commitFiles(repositoryId, sha).then((result) => {\n setDetails((prev) => {\n const next = new Map(prev);\n next.set(sha, result.ok ? result.value : { error: result.error.message });\n return next;\n });\n });\n };\n\n if (!git) return null;\n\n const baseName = path ? path.replace(/^\\/+/, '').split('/').pop() : null;\n const title = baseName ? `History — ${baseName}` : 'Commit history';\n\n return (\n <Dialog title={title} size=\"wide\" onClose={onClose}>\n {error && (\n <p className=\"db-git-form-error\" role=\"alert\">\n {error}\n </p>\n )}\n {!error && entries.length === 0 && loading && <p className=\"db-git-hint\">Loading history…</p>}\n {!error && entries.length === 0 && !loading && <p className=\"db-git-hint\">No commits yet.</p>}\n {entries.length > 0 && (\n <ul className=\"db-git-history-list\">\n {entries.map((entry) => {\n const expanded = expandedSha === entry.sha;\n const detail = details.get(entry.sha);\n const meta = [\n entry.authorName,\n entry.sha.slice(0, 7),\n formatDate(entry.authorDate),\n entry.refs.join(', '),\n ]\n .filter(Boolean)\n .join(' · ');\n const body =\n detail && !('error' in detail) ? extraBody(detail.body, entry.subject) : '';\n return (\n <li key={entry.sha} className=\"db-git-history-item\">\n <button\n type=\"button\"\n className=\"db-git-history-toggle\"\n aria-expanded={expanded}\n onClick={() => handleRowClick(entry.sha)}\n >\n <span className=\"db-git-history-subject\">{entry.subject}</span>\n <span className=\"db-git-history-meta\">{meta}</span>\n </button>\n {expanded && !detail && <p className=\"db-git-hint\">Loading…</p>}\n {expanded && detail && 'error' in detail && (\n <p className=\"db-git-form-error\" role=\"alert\">\n {detail.error}\n </p>\n )}\n {expanded && detail && !('error' in detail) && (\n <>\n {body && <pre className=\"db-git-history-body\">{body}</pre>}\n <ul className=\"db-git-history-files\">\n {detail.files.map((file) => {\n const kind = badgeKindFor(file);\n return (\n <li key={file.path}>\n <button\n type=\"button\"\n className=\"db-git-history-file\"\n onClick={() =>\n git.openDialog({\n kind: 'diff',\n path: file.path,\n revision: { sha: entry.sha },\n })\n }\n >\n <span\n className=\"db-git-file-kind\"\n aria-label={BADGE_LABELS[kind]}\n title={BADGE_LABELS[kind]}\n >\n {BADGE_GLYPHS[kind]}\n </span>\n {file.path.replace(/^\\/+/, '')}\n </button>\n </li>\n );\n })}\n </ul>\n </>\n )}\n </li>\n );\n })}\n </ul>\n )}\n {hasMore && (\n <button\n type=\"button\"\n className=\"db-git-secondary-btn\"\n disabled={loading}\n onClick={() => void loadPage(entries.length)}\n >\n Show older commits\n </button>\n )}\n </Dialog>\n );\n}\n","/**\n * GitDiffDialog — full-size modal showing a file diff.\n *\n * Without a revision: working tree vs HEAD (HEAD side via the git host API,\n * working side via the workspace FileSystemProvider). With a revision: that\n * commit vs its parent, both sides via readFileAtRevision. Absent sides\n * render as empty text with an \"(absent)\" label; binary files short-circuit\n * to a hint since there is no text diff to show.\n */\n\nimport { useEffect, useState } from 'react';\nimport { getFileSystemProviderV2, parseWorkspacePath } from '@bendyline/docblocks/filesystem';\nimport { Dialog } from '../components/Dialog.js';\nimport { useGitContext } from './GitContext.js';\nimport { GitDiffView } from './GitDiffView.js';\n\nexport interface GitDiffDialogProps {\n /** Slash-prefixed workspace-relative path. */\n path: string;\n /** Absent → working tree vs HEAD; present → that commit vs its parent. */\n revision?: { sha: string };\n onClose: () => void;\n}\n\ntype DiffLoadState =\n | { phase: 'loading' }\n | { phase: 'error'; message: string }\n | { phase: 'binary' }\n | {\n phase: 'ready';\n original: string;\n modified: string;\n labels: { original: string; modified: string };\n };\n\nexport function GitDiffDialog({ path, revision, onClose }: GitDiffDialogProps) {\n const git = useGitContext();\n const gitApi = git?.gitApi ?? null;\n const provider = git?.provider ?? null;\n const repositoryId = git?.repositoryId ?? null;\n const sha = revision?.sha ?? null;\n\n const [state, setState] = useState<DiffLoadState>({ phase: 'loading' });\n\n useEffect(() => {\n if (!gitApi || !repositoryId) {\n setState({ phase: 'error', message: 'Git is not available for this workspace.' });\n return;\n }\n let cancelled = false;\n setState({ phase: 'loading' });\n\n const load = async (): Promise<DiffLoadState> => {\n if (sha) {\n const short = sha.slice(0, 7);\n const [parent, at] = await Promise.all([\n gitApi.readFileAtRevision(repositoryId, path, { kind: 'parent-of', sha }),\n gitApi.readFileAtRevision(repositoryId, path, { kind: 'commit', sha }),\n ]);\n if (!parent.ok) return { phase: 'error', message: parent.error.message };\n if (!at.ok) return { phase: 'error', message: at.error.message };\n if (\n (parent.value.content === null && parent.value.binary) ||\n (at.value.content === null && at.value.binary)\n ) {\n return { phase: 'binary' };\n }\n return {\n phase: 'ready',\n original: parent.value.content ?? '',\n modified: at.value.content ?? '',\n labels: {\n original: parent.value.content === null ? `${short}^ (absent)` : `${short}^`,\n modified: at.value.content === null ? `${short} (absent)` : short,\n },\n };\n }\n\n if (!provider) {\n return { phase: 'error', message: 'Workspace files are not available.' };\n }\n const providerV2 = getFileSystemProviderV2(provider);\n const [head, working] = await Promise.all([\n gitApi.readFileAtRevision(repositoryId, path, { kind: 'head' }),\n providerV2\n ? providerV2\n .readFile(parseWorkspacePath(path))\n .then((file) => (file ? new TextDecoder().decode(file.data) : null))\n : provider.readFile(path),\n ]);\n if (!head.ok) return { phase: 'error', message: head.error.message };\n if (head.value.content === null && head.value.binary) return { phase: 'binary' };\n return {\n phase: 'ready',\n original: head.value.content ?? '',\n modified: working ?? '',\n labels: {\n original: head.value.content === null ? 'HEAD (absent)' : 'HEAD',\n modified: working === null ? 'Working tree (absent)' : 'Working tree',\n },\n };\n };\n\n load()\n .catch(\n (err: unknown): DiffLoadState => ({\n phase: 'error',\n message: err instanceof Error ? err.message : 'Failed to load the diff',\n }),\n )\n .then((next) => {\n if (!cancelled) setState(next);\n });\n return () => {\n cancelled = true;\n };\n }, [gitApi, provider, repositoryId, path, sha]);\n\n if (!git) return null;\n\n const fullPath = path.replace(/^\\/+/, '');\n const baseName = fullPath.split('/').pop() || fullPath;\n\n return (\n <Dialog title={baseName} size=\"full\" onClose={onClose}>\n <p className=\"db-settings-hint\">{fullPath}</p>\n {state.phase === 'loading' && <p className=\"db-git-hint\">Loading changes…</p>}\n {state.phase === 'error' && (\n <p className=\"db-git-form-error\" role=\"alert\">\n {state.message}\n </p>\n )}\n {state.phase === 'binary' && (\n <p className=\"db-git-hint\">Binary file — no text diff available.</p>\n )}\n {state.phase === 'ready' && (\n <GitDiffView\n original={state.original}\n modified={state.modified}\n fileName={baseName}\n theme={git.theme}\n labels={state.labels}\n />\n )}\n </Dialog>\n );\n}\n","/**\n * GitDiffView — read-only Monaco side-by-side diff.\n *\n * Monaco is never statically imported: squisq's useMonacoLoader() lazily\n * imports the editor bundle once per page and hands back the namespace.\n * The diff editor and both text models are created imperatively into a\n * host div and disposed on unmount (the classic Monaco leak). Content and\n * theme changes update the existing editor without recreating it.\n */\n\nimport { useEffect, useRef } from 'react';\nimport {\n detectLanguageFromFileName,\n useMonacoLoader,\n type UseMonacoLoaderResult,\n} from '@bendyline/squisq-editor-react';\n\ntype MonacoModule = NonNullable<UseMonacoLoaderResult['monaco']>;\ntype DiffEditorInstance = ReturnType<MonacoModule['editor']['createDiffEditor']>;\ntype TextModel = ReturnType<MonacoModule['editor']['createModel']>;\n\nexport interface GitDiffViewProps {\n original: string;\n modified: string;\n /** Used for language detection (markdown for .md, plain text otherwise). */\n fileName: string;\n theme: 'light' | 'dark';\n /** Optional column headers rendered above the two panes. */\n labels?: { original: string; modified: string };\n}\n\nfunction languageFor(fileName: string): string {\n const detected = detectLanguageFromFileName(fileName);\n if (detected) return detected;\n return fileName.toLowerCase().endsWith('.md') ? 'markdown' : 'plaintext';\n}\n\nexport function GitDiffView({ original, modified, fileName, theme, labels }: GitDiffViewProps) {\n const { monaco, ready } = useMonacoLoader();\n const hostRef = useRef<HTMLDivElement | null>(null);\n const editorRef = useRef<DiffEditorInstance | null>(null);\n const modelsRef = useRef<{ original: TextModel; modified: TextModel } | null>(null);\n\n const language = languageFor(fileName);\n\n // Create the editor once monaco settles; dispose editor AND models on unmount.\n useEffect(() => {\n const host = hostRef.current;\n if (!monaco || !host) return;\n const originalModel = monaco.editor.createModel('', 'plaintext');\n const modifiedModel = monaco.editor.createModel('', 'plaintext');\n const editor = monaco.editor.createDiffEditor(host, {\n readOnly: true,\n renderSideBySide: true,\n automaticLayout: true,\n minimap: { enabled: false },\n wordWrap: 'on',\n scrollBeyondLastLine: false,\n renderOverviewRuler: false,\n });\n editor.setModel({ original: originalModel, modified: modifiedModel });\n editorRef.current = editor;\n modelsRef.current = { original: originalModel, modified: modifiedModel };\n return () => {\n editorRef.current = null;\n modelsRef.current = null;\n editor.dispose();\n originalModel.dispose();\n modifiedModel.dispose();\n };\n }, [monaco]);\n\n // Sync content + language into the existing models — never recreate the editor.\n useEffect(() => {\n if (!monaco) return;\n const models = modelsRef.current;\n if (!models) return;\n if (models.original.getValue() !== original) models.original.setValue(original);\n if (models.modified.getValue() !== modified) models.modified.setValue(modified);\n monaco.editor.setModelLanguage(models.original, language);\n monaco.editor.setModelLanguage(models.modified, language);\n }, [monaco, original, modified, language]);\n\n // React to theme prop changes.\n useEffect(() => {\n if (!monaco) return;\n monaco.editor.setTheme(theme === 'dark' ? 'vs-dark' : 'vs');\n }, [monaco, theme]);\n\n if (!ready) {\n return <div className=\"db-git-diff-loading\">Loading diff…</div>;\n }\n\n return (\n <>\n {labels && (\n <div className=\"db-git-diff-labels\">\n <span>{labels.original}</span>\n <span>{labels.modified}</span>\n </div>\n )}\n <div ref={hostRef} className=\"db-git-diff-host\" />\n </>\n );\n}\n","/**\n * GitCloneDialog — clone a remote repository into a new local workspace.\n *\n * The renderer only collects the URL; the main process shows the native\n * destination picker, streams progress back, and registers the clone as a\n * workspace. An auth failure swaps the body to the shared credential\n * guidance copy (no credentials are ever collected here).\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport type {\n ElectronWorkspaceInfo,\n GitCloneHandle,\n GitCloneProgress,\n} from '@bendyline/docblocks/host';\nimport { Dialog } from '../components/Dialog.js';\nimport { useGitContext } from './GitContext.js';\nimport { deriveCloneFolderName, isLikelyGitUrl } from './git-clone-utils.js';\nimport { GitCredentialGuidance } from './GitAuthGuidanceDialog.js';\n\nexport function GitCloneDialog({\n onClose,\n onCloned,\n}: {\n onClose: () => void;\n onCloned: (info: ElectronWorkspaceInfo) => void;\n}) {\n const git = useGitContext();\n const gitApi = git?.gitApi ?? null;\n\n const [url, setUrl] = useState('');\n const [cloning, setCloning] = useState(false);\n const [progress, setProgress] = useState<GitCloneProgress | null>(null);\n const [error, setError] = useState<string | null>(null);\n /** Non-null → show embedded credential guidance instead of the form. */\n const [authDetail, setAuthDetail] = useState<{ detail?: string } | null>(null);\n const handleRef = useRef<GitCloneHandle | null>(null);\n const urlInputRef = useRef<HTMLInputElement>(null);\n\n // Closing the dialog mid-clone abandons it — kill git and clean up.\n useEffect(\n () => () => {\n handleRef.current?.cancel();\n },\n [],\n );\n\n if (!gitApi || typeof gitApi.clone !== 'function') return null;\n\n const canClone = isLikelyGitUrl(url) && !cloning;\n\n const handleClone = async () => {\n if (!canClone) return;\n setCloning(true);\n setError(null);\n setProgress(null);\n const handle = gitApi.clone(url.trim(), (p) => setProgress(p));\n handleRef.current = handle;\n const result = await handle.result;\n handleRef.current = null;\n setCloning(false);\n setProgress(null);\n if (!result.ok) {\n switch (result.error.code) {\n case 'invalid-url':\n setError('That doesn’t look like a valid repository URL.');\n break;\n case 'destination-exists':\n setError('A folder with that name already exists there. Pick a different location.');\n break;\n case 'auth-failed':\n setAuthDetail({ detail: result.error.message });\n break;\n case 'cancelled':\n break; // user cancelled — just return to the form\n default:\n setError(result.error.message);\n }\n return;\n }\n if (result.value === null) return; // user cancelled the destination picker\n onCloned(result.value);\n };\n\n const progressPercent = progress?.percent ?? null;\n const progressText =\n progress !== null\n ? `${progress.phase}…${progressPercent !== null ? ` ${Math.round(progressPercent)}%` : ''}`\n : 'Starting clone…';\n\n if (authDetail !== null) {\n return (\n <Dialog\n title=\"Clone repository\"\n onClose={onClose}\n footer={\n <>\n <button\n type=\"button\"\n className=\"db-git-secondary-btn\"\n onClick={() => setAuthDetail(null)}\n >\n Back\n </button>\n <button type=\"button\" className=\"db-git-primary-btn\" onClick={onClose}>\n Close\n </button>\n </>\n }\n >\n <p className=\"db-settings-hint\">Git could not authenticate with that remote.</p>\n <GitCredentialGuidance detail={authDetail.detail} />\n </Dialog>\n );\n }\n\n return (\n <Dialog\n title=\"Clone repository\"\n onClose={onClose}\n closeOnBackdrop={!cloning}\n initialFocusRef={urlInputRef}\n footer={\n <>\n <button\n type=\"button\"\n className=\"db-git-secondary-btn\"\n onClick={onClose}\n disabled={cloning}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"db-git-primary-btn\"\n disabled={!canClone}\n onClick={() => void handleClone()}\n >\n Clone\n </button>\n </>\n }\n >\n <div className=\"db-git-form-row\">\n <label className=\"db-git-form-label\" htmlFor=\"db-git-clone-url\">\n Repository URL\n </label>\n <input\n id=\"db-git-clone-url\"\n ref={urlInputRef}\n className=\"db-git-form-input\"\n type=\"text\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') void handleClone();\n }}\n placeholder=\"https://github.com/owner/repo.git\"\n disabled={cloning}\n spellCheck={false}\n />\n </div>\n {isLikelyGitUrl(url) && (\n <p className=\"db-git-hint\">\n Will clone into: <b>{deriveCloneFolderName(url)}</b> — you’ll pick where next\n </p>\n )}\n <p className=\"db-git-hint\">\n HTTPS and SSH URLs both work. You’ll choose the destination folder in the next step.\n </p>\n {error !== null && (\n <p className=\"db-git-form-error\" role=\"alert\">\n {error}\n </p>\n )}\n {cloning && (\n <div className=\"db-git-progress\">\n {progressPercent !== null && (\n <div\n className=\"db-git-progress-bar\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(progressPercent)}\n style={{ width: `${progressPercent}%` }}\n />\n )}\n <p className=\"db-git-progress-text\">{progressText}</p>\n <button\n type=\"button\"\n className=\"db-git-secondary-btn\"\n onClick={() => handleRef.current?.cancel()}\n >\n Cancel\n </button>\n </div>\n )}\n </Dialog>\n );\n}\n","/**\n * Clone-dialog helpers — pure URL utilities, unit-testable.\n */\n\n/** Folder name a clone of this URL will produce (mirrors the host's rule). */\nexport function deriveCloneFolderName(url: string): string {\n const trimmed = url.trim().replace(/\\/+$/, '');\n const lastSegment = trimmed.split(/[/:\\\\]/).pop() ?? '';\n const withoutGit = lastSegment.replace(/\\.git$/i, '');\n const sanitized = withoutGit.replace(/[^A-Za-z0-9._-]/g, '-');\n return sanitized.length > 0 ? sanitized : 'repository';\n}\n\n/** Loose shape check for enabling the Clone button — the host re-validates. */\nexport function isLikelyGitUrl(url: string): boolean {\n const trimmed = url.trim();\n if (trimmed.length === 0 || /\\s/.test(trimmed)) return false;\n if (trimmed.startsWith('-') || trimmed.toLowerCase().startsWith('file:')) return false;\n if (/^(https?|ssh|git):\\/\\/\\S+\\/\\S+/i.test(trimmed)) return true;\n // scp-like: user@host:owner/repo\n if (/^[\\w.-]+@[\\w.-]+:\\S+/.test(trimmed)) return true;\n return false;\n}\n","/**\n * GitAuthGuidanceDialog — shown when a git operation fails to authenticate.\n *\n * DocBlocks deliberately never collects or stores credentials, so this\n * dialog only explains the three supported sign-in routes (credential\n * helper, GitHub CLI, SSH key). The copy is exported as a standalone\n * component so the clone dialog can embed it after an auth failure.\n */\n\nimport { maybeGetDocBlocksHost } from '@bendyline/docblocks/host';\nimport { Dialog } from '../components/Dialog.js';\n\nconst LEARN_MORE_URL =\n 'https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git';\n\nconst OPERATION_LABELS: Record<'push' | 'pull' | 'fetch' | 'clone' | 'pr', string> = {\n push: 'push',\n pull: 'pull',\n fetch: 'fetch',\n clone: 'clone',\n pr: 'create the pull request',\n};\n\n/** The credential guidance copy, reusable outside this dialog (clone flow). */\nexport function GitCredentialGuidance({ detail }: { detail?: string }) {\n return (\n <>\n <p className=\"db-settings-hint\">\n DocBlocks never stores Git credentials. Sign in with one of these, then try again:\n </p>\n <ul className=\"db-git-hint\">\n <li>\n A git credential helper (<code>git config credential.helper</code>)\n </li>\n <li>\n The GitHub CLI (<code>gh auth login</code>)\n </li>\n <li>An SSH key registered with your remote</li>\n </ul>\n {detail && (\n <details>\n <summary>Details</summary>\n <p className=\"db-git-hint\">{detail}</p>\n </details>\n )}\n </>\n );\n}\n\nexport function GitAuthGuidanceDialog({\n operation,\n detail,\n onClose,\n}: {\n operation: 'push' | 'pull' | 'fetch' | 'clone' | 'pr';\n detail?: string;\n onClose: () => void;\n}) {\n return (\n <Dialog\n title=\"Git needs credentials\"\n onClose={onClose}\n footer={\n <>\n <button\n type=\"button\"\n className=\"db-git-secondary-btn\"\n onClick={() => void maybeGetDocBlocksHost()?.shell.openExternal(LEARN_MORE_URL)}\n >\n Learn more\n </button>\n <button type=\"button\" className=\"db-git-primary-btn\" onClick={onClose}>\n Close\n </button>\n </>\n }\n >\n <p className=\"db-settings-hint\">\n Git could not authenticate with the remote while trying to {OPERATION_LABELS[operation]}.\n </p>\n <GitCredentialGuidance detail={detail} />\n </Dialog>\n );\n}\n","/**\n * GitConflictsDialog — lists conflicted files after a pull hits a merge\n * conflict. Each row opens the file in the editor so the user can resolve\n * the markers; the primary action hands off to the commit dialog, which\n * concludes the merge.\n */\n\nimport { Dialog } from '../components/Dialog.js';\nimport { useGitContext } from './GitContext.js';\n\nexport function GitConflictsDialog({\n paths,\n onOpenFile,\n onClose,\n}: {\n paths: string[];\n onOpenFile: (path: string) => void;\n onClose: () => void;\n}) {\n const git = useGitContext();\n\n return (\n <Dialog\n title=\"Merge conflicts\"\n onClose={onClose}\n footer={\n <>\n <button type=\"button\" className=\"db-git-secondary-btn\" onClick={onClose}>\n Close\n </button>\n <button\n type=\"button\"\n className=\"db-git-primary-btn\"\n onClick={() => git?.openDialog({ kind: 'commit' })}\n >\n Open commit dialog\n </button>\n </>\n }\n >\n <p className=\"db-settings-hint\">\n These files contain conflict markers. Edit each one to resolve the conflicts, then commit to\n complete the merge.\n </p>\n <ul className=\"db-git-file-list\">\n {paths.map((path) => (\n <li key={path} className=\"db-git-file-row\">\n <button\n type=\"button\"\n onClick={() => {\n onOpenFile(path);\n onClose();\n }}\n >\n {path.replace(/^\\/+/, '')}\n </button>\n </li>\n ))}\n </ul>\n </Dialog>\n );\n}\n","/**\n * GitUI — single mount point for the git status bar, the aria-live\n * operation result line, and every git dialog. Dialog visibility lives in\n * GitContext so the file tree, toolbar, and native menu can all open them.\n */\n\nimport type { ElectronWorkspaceInfo } from '@bendyline/docblocks/host';\nimport { useGitContext } from './GitContext.js';\nimport { GitStatusBar } from './GitStatusBar.js';\nimport { GitCommitDialog } from './GitCommitDialog.js';\nimport { GitBranchesDialog } from './GitBranchesDialog.js';\nimport { GitHistoryDialog } from './GitHistoryDialog.js';\nimport { GitDiffDialog } from './GitDiffDialog.js';\nimport { GitCloneDialog } from './GitCloneDialog.js';\nimport { GitAuthGuidanceDialog } from './GitAuthGuidanceDialog.js';\nimport { GitConflictsDialog } from './GitConflictsDialog.js';\n\nexport interface GitUIProps {\n /** Open a workspace file in the editor (from conflicts/history dialogs). */\n onOpenFile: (path: string) => void;\n /** A clone finished and its folder is registered — open the workspace. */\n onWorkspaceCloned?: (info: ElectronWorkspaceInfo) => void;\n}\n\nexport function GitUI({ onOpenFile, onWorkspaceCloned }: GitUIProps) {\n const git = useGitContext();\n if (!git || !git.available) return null;\n\n const { dialog, closeDialog } = git;\n\n return (\n <>\n <GitStatusBar />\n {git.repo && (\n <span className=\"db-git-inline-status\" role=\"status\" aria-live=\"polite\">\n {git.lastResult?.message ?? ''}\n </span>\n )}\n {dialog.kind === 'commit' && <GitCommitDialog onClose={closeDialog} />}\n {dialog.kind === 'branches' && (\n <GitBranchesDialog createFocus={dialog.createFocus} onClose={closeDialog} />\n )}\n {dialog.kind === 'history' && <GitHistoryDialog path={dialog.path} onClose={closeDialog} />}\n {dialog.kind === 'diff' && (\n <GitDiffDialog path={dialog.path} revision={dialog.revision} onClose={closeDialog} />\n )}\n {dialog.kind === 'clone' && (\n <GitCloneDialog\n onClose={closeDialog}\n onCloned={(info) => {\n closeDialog();\n onWorkspaceCloned?.(info);\n }}\n />\n )}\n {dialog.kind === 'auth-guidance' && (\n <GitAuthGuidanceDialog\n operation={dialog.operation}\n detail={dialog.detail}\n onClose={closeDialog}\n />\n )}\n {dialog.kind === 'conflicts' && (\n <GitConflictsDialog paths={dialog.paths} onOpenFile={onOpenFile} onClose={closeDialog} />\n )}\n </>\n );\n}\n"],"mappings":"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","names":["useRef","useState","jsx","jsxs","useState","useRef","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useCallback","useEffect","useState","Fragment","jsx","jsxs","useState","useCallback","useEffect","useEffect","useState","useEffect","useRef","Fragment","jsx","jsxs","jsx","jsxs","useState","useEffect","useEffect","useRef","useState","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","Fragment","jsx","jsxs","Fragment","jsx","jsxs"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/DocBlocksShell/LazyEditorShell.ts"],"sourcesContent":["/** Deferred boundary for the large Squisq editor implementation. */\nexport { EditorShell as default } from '@bendyline/squisq-editor-react';\n"],"mappings":";AACA,SAAwB,mBAAe;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Shared controls used by the app and host-specific DocBlocks settings dialogs. */
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import { type AccentColor, type ThemePreference } from '../preferences/theme.js';
|
|
4
|
+
export type { AccentColor, ThemePreference } from '../preferences/theme.js';
|
|
5
|
+
export interface SettingsDialogProps {
|
|
6
|
+
title?: string;
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export declare function SettingsDialog({ title, onClose, children }: SettingsDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export interface ThemeSettingsProps {
|
|
12
|
+
value: ThemePreference;
|
|
13
|
+
onChange: (theme: ThemePreference) => void;
|
|
14
|
+
name?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function ThemeSettings({ value, onChange, name }: ThemeSettingsProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export interface AccentColorSettingsProps {
|
|
18
|
+
value: AccentColor;
|
|
19
|
+
onChange: (color: AccentColor) => void;
|
|
20
|
+
name?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function AccentColorSettings({ value, onChange, name, }: AccentColorSettingsProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=Settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Settings.d.ts","sourceRoot":"","sources":["../../src/Settings/Settings.tsx"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAiB,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEhG,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAY5E,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAM5F;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAc,EAAE,EAAE,kBAAkB,2CAoCpF;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,EACR,IAAqB,GACtB,EAAE,wBAAwB,2CA+B1B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Dialog } from '../components/Dialog.js';
|
|
3
|
+
import { ACCENT_COLORS } from '../preferences/theme.js';
|
|
4
|
+
const ACCENT_LABELS = {
|
|
5
|
+
brown: 'Brown',
|
|
6
|
+
green: 'Green',
|
|
7
|
+
blue: 'Blue',
|
|
8
|
+
purple: 'Purple',
|
|
9
|
+
maroon: 'Maroon',
|
|
10
|
+
orange: 'Orange',
|
|
11
|
+
gray: 'Gray',
|
|
12
|
+
};
|
|
13
|
+
export function SettingsDialog({ title = 'Settings', onClose, children }) {
|
|
14
|
+
return (_jsx(Dialog, { title: title, onClose: onClose, children: children }));
|
|
15
|
+
}
|
|
16
|
+
export function ThemeSettings({ value, onChange, name = 'theme' }) {
|
|
17
|
+
return (_jsxs("fieldset", { className: "db-settings-fieldset", children: [_jsx("legend", { className: "db-settings-legend", children: "Theme" }), _jsxs("label", { className: "db-settings-radio", children: [_jsx("input", { type: "radio", name: name, value: "auto", checked: value === 'auto', onChange: () => onChange('auto') }), "System default"] }), _jsxs("label", { className: "db-settings-radio", children: [_jsx("input", { type: "radio", name: name, value: "light", checked: value === 'light', onChange: () => onChange('light') }), "Light"] }), _jsxs("label", { className: "db-settings-radio", children: [_jsx("input", { type: "radio", name: name, value: "dark", checked: value === 'dark', onChange: () => onChange('dark') }), "Dark"] })] }));
|
|
18
|
+
}
|
|
19
|
+
export function AccentColorSettings({ value, onChange, name = 'accent-color', }) {
|
|
20
|
+
return (_jsxs("fieldset", { className: "db-settings-fieldset", children: [_jsx("legend", { className: "db-settings-legend", children: "Accent color" }), _jsx("p", { className: "db-settings-hint", children: "Used in both light and dark appearances." }), _jsx("div", { className: "db-settings-accent-grid", children: ACCENT_COLORS.map((color) => (_jsxs("label", { className: `db-settings-accent${value === color ? ' db-settings-accent--selected' : ''}`, children: [_jsx("input", { className: "db-settings-accent-input", type: "radio", name: name, value: color, checked: value === color, onChange: () => onChange(color) }), _jsx("span", { className: `db-settings-accent-swatch db-settings-accent-swatch--${color}`, "aria-hidden": "true" }), _jsx("span", { children: ACCENT_LABELS[color] })] }, color))) })] }));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=Settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/Settings/Settings.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,aAAa,EAA0C,MAAM,yBAAyB,CAAC;AAIhG,MAAM,aAAa,GAAgC;IACjD,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;CACb,CAAC;AAQF,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAuB;IAC3F,OAAO,CACL,KAAC,MAAM,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,YACnC,QAAQ,GACF,CACV,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,OAAO,EAAsB;IACnF,OAAO,CACL,oBAAU,SAAS,EAAC,sBAAsB,aACxC,iBAAQ,SAAS,EAAC,oBAAoB,sBAAe,EACrD,iBAAO,SAAS,EAAC,mBAAmB,aAClC,gBACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAC,MAAM,EACZ,OAAO,EAAE,KAAK,KAAK,MAAM,EACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAChC,sBAEI,EACR,iBAAO,SAAS,EAAC,mBAAmB,aAClC,gBACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAC,OAAO,EACb,OAAO,EAAE,KAAK,KAAK,OAAO,EAC1B,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GACjC,aAEI,EACR,iBAAO,SAAS,EAAC,mBAAmB,aAClC,gBACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAC,MAAM,EACZ,OAAO,EAAE,KAAK,KAAK,MAAM,EACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAChC,YAEI,IACC,CACZ,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,EACR,IAAI,GAAG,cAAc,GACI;IACzB,OAAO,CACL,oBAAU,SAAS,EAAC,sBAAsB,aACxC,iBAAQ,SAAS,EAAC,oBAAoB,6BAAsB,EAC5D,YAAG,SAAS,EAAC,kBAAkB,yDAA6C,EAC5E,cAAK,SAAS,EAAC,yBAAyB,YACrC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC5B,iBACE,SAAS,EAAE,qBACT,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EACtD,EAAE,aAGF,gBACE,SAAS,EAAC,0BAA0B,EACpC,IAAI,EAAC,OAAO,EACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,KAAK,KAAK,KAAK,EACxB,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAC/B,EACF,eACE,SAAS,EAAE,wDAAwD,KAAK,EAAE,iBAC9D,MAAM,GAClB,EACF,yBAAO,aAAa,CAAC,KAAK,CAAC,GAAQ,KAd9B,KAAK,CAeJ,CACT,CAAC,GACE,IACG,CACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../../src/Settings/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnF,YAAY,EACV,WAAW,EACX,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,GACnB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/Settings/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -10,8 +10,13 @@ export interface WorkspacePickerProps {
|
|
|
10
10
|
onSelect: (descriptor: WorkspaceDescriptor) => void;
|
|
11
11
|
/** Called when the user chooses "Open Folder" (native FS). */
|
|
12
12
|
onOpenFolder: () => void;
|
|
13
|
+
/**
|
|
14
|
+
* Called when the user chooses "Clone Git repository". Only provided on
|
|
15
|
+
* the desktop when git is available — omitted, the item is hidden.
|
|
16
|
+
*/
|
|
17
|
+
onCloneRepository?: () => void;
|
|
13
18
|
/** Optional className. */
|
|
14
19
|
className?: string;
|
|
15
20
|
}
|
|
16
|
-
export declare function WorkspacePicker({ activeWorkspaceId, onSelect, onOpenFolder, className, }: WorkspacePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export declare function WorkspacePicker({ activeWorkspaceId, onSelect, onOpenFolder, onCloneRepository, className, }: WorkspacePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
17
22
|
//# sourceMappingURL=WorkspacePicker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspacePicker.d.ts","sourceRoot":"","sources":["../../src/WorkspacePicker/WorkspacePicker.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkspacePicker.d.ts","sourceRoot":"","sources":["../../src/WorkspacePicker/WorkspacePicker.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAY1E,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,wDAAwD;IACxD,QAAQ,EAAE,CAAC,UAAU,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpD,8DAA8D;IAC9D,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAgB,eAAe,CAAC,EAC9B,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,SAAS,GACV,EAAE,oBAAoB,2CA6ItB"}
|
|
@@ -3,11 +3,18 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
* WorkspacePicker — dropdown for switching between workspaces
|
|
4
4
|
* (IndexedDB-based or native folder via File System Access API).
|
|
5
5
|
*/
|
|
6
|
-
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
6
|
+
import { Fragment, useState, useEffect, useCallback, useRef } from 'react';
|
|
7
7
|
import { listWorkspaces, saveWorkspace, touchWorkspace } from '@bendyline/docblocks/workspace';
|
|
8
|
-
import { isNativeFileSystemSupported } from '@bendyline/docblocks/filesystem';
|
|
9
8
|
import { isElectronHost } from '@bendyline/docblocks/host';
|
|
10
|
-
|
|
9
|
+
import { FolderIcon, NewFolderIcon } from '../icons.js';
|
|
10
|
+
function isNativeFileSystemSupported() {
|
|
11
|
+
return (typeof globalThis !== 'undefined' &&
|
|
12
|
+
typeof globalThis.showDirectoryPicker === 'function');
|
|
13
|
+
}
|
|
14
|
+
function WorkspacePath({ path }) {
|
|
15
|
+
return path.split(/([\\/])/).map((segment, index) => (_jsxs(Fragment, { children: [segment, (segment === '\\' || segment === '/') && _jsx("wbr", {})] }, index)));
|
|
16
|
+
}
|
|
17
|
+
export function WorkspacePicker({ activeWorkspaceId, onSelect, onOpenFolder, onCloneRepository, className, }) {
|
|
11
18
|
const [workspaces, setWorkspaces] = useState([]);
|
|
12
19
|
const [isOpen, setIsOpen] = useState(false);
|
|
13
20
|
const pickerRef = useRef(null);
|
|
@@ -55,9 +62,13 @@ export function WorkspacePicker({ activeWorkspaceId, onSelect, onOpenFolder, cla
|
|
|
55
62
|
setIsOpen(false);
|
|
56
63
|
}, [workspaces.length, onSelect, refresh]);
|
|
57
64
|
const activeWs = workspaces.find((w) => w.id === activeWorkspaceId);
|
|
58
|
-
|
|
65
|
+
const activeWorkspaceName = activeWs?.name ?? 'No workspace';
|
|
66
|
+
return (_jsxs("div", { ref: pickerRef, className: `db-workspace-picker ${className ?? ''}`, children: [_jsxs("button", { className: "db-workspace-picker-btn", onClick: () => setIsOpen(!isOpen), title: "Switch workspace", "aria-label": `Switch workspace, current: ${activeWorkspaceName}`, children: [_jsx("span", { className: "db-workspace-picker-label", children: activeWorkspaceName }), _jsx("span", { className: "db-workspace-picker-compact-icon", children: _jsx(FolderIcon, {}) }), _jsx("span", { className: `db-workspace-picker-caret${isOpen ? ' db-workspace-picker-caret--open' : ''}`, "aria-hidden": "true" })] }), isOpen && (_jsxs("div", { className: "db-workspace-dropdown", children: [workspaces.map((ws) => (_jsx("button", { className: `db-workspace-dropdown-item ${ws.id === activeWorkspaceId ? 'db-workspace-dropdown-item--active' : ''}`, onClick: () => handleSelect(ws), children: _jsxs("span", { className: "db-workspace-details", children: [_jsxs("span", { className: "db-workspace-heading", children: [_jsx("span", { children: ws.name }), (ws.type === 'native' || ws.type === 'electron-native') && (_jsx("span", { className: "db-workspace-type", children: "(folder)" }))] }), ws.rootPath && (_jsx("span", { className: "db-workspace-path", title: ws.rootPath, children: _jsx(WorkspacePath, { path: ws.rootPath }) }))] }) }, ws.id))), _jsx("div", { className: "db-workspace-dropdown-divider" }), !electron && (_jsx("button", { className: "db-workspace-dropdown-item", onClick: handleCreateNew, children: _jsxs("span", { className: "db-workspace-dropdown-action-label", children: [_jsx(NewFolderIcon, {}), _jsx("span", { children: "New Workspace" })] }) })), (electron || isNativeFileSystemSupported()) && (_jsx("button", { className: "db-workspace-dropdown-item", onClick: () => {
|
|
59
67
|
setIsOpen(false);
|
|
60
68
|
onOpenFolder();
|
|
61
|
-
}, children: "Open Folder..." }))
|
|
69
|
+
}, children: "Open Folder..." })), onCloneRepository && (_jsx("button", { className: "db-workspace-dropdown-item", onClick: () => {
|
|
70
|
+
setIsOpen(false);
|
|
71
|
+
onCloneRepository();
|
|
72
|
+
}, children: "Clone Git Repository..." }))] }))] }));
|
|
62
73
|
}
|
|
63
74
|
//# sourceMappingURL=WorkspacePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspacePicker.js","sourceRoot":"","sources":["../../src/WorkspacePicker/WorkspacePicker.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkspacePicker.js","sourceRoot":"","sources":["../../src/WorkspacePicker/WorkspacePicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/Export/transform-summaries.ts
|
|
2
|
+
var transformStyleSummariesPromise = null;
|
|
3
|
+
function loadTransformStyleSummaries() {
|
|
4
|
+
transformStyleSummariesPromise ?? (transformStyleSummariesPromise = import("@bendyline/squisq/transform").then(
|
|
5
|
+
({ getTransformStyleSummaries }) => getTransformStyleSummaries()
|
|
6
|
+
));
|
|
7
|
+
return transformStyleSummariesPromise;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
loadTransformStyleSummaries
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=chunk-4XXSWN3T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Export/transform-summaries.ts"],"sourcesContent":["export interface ExportSummaryOption {\n id: string;\n name: string;\n description?: string;\n}\n\nlet transformStyleSummariesPromise: Promise<ExportSummaryOption[]> | null = null;\n\nexport function loadTransformStyleSummaries(): Promise<ExportSummaryOption[]> {\n transformStyleSummariesPromise ??= import('@bendyline/squisq/transform').then(\n ({ getTransformStyleSummaries }) => getTransformStyleSummaries(),\n );\n return transformStyleSummariesPromise;\n}\n"],"mappings":";AAMA,IAAI,iCAAwE;AAErE,SAAS,8BAA8D;AAC5E,sEAAmC,OAAO,6BAA6B,EAAE;AAAA,IACvE,CAAC,EAAE,2BAA2B,MAAM,2BAA2B;AAAA,EACjE;AACA,SAAO;AACT;","names":[]}
|