@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.
Files changed (300) hide show
  1. package/README.md +6 -0
  2. package/dist/{ExportDialog-MEUISWZX.js → ExportDialog-7LDIXJZ3.js} +3 -2
  3. package/dist/{ExportToolbarControls-D2YDWOXW.js → ExportToolbarControls-GHAOJMH6.js} +147 -12
  4. package/dist/ExportToolbarControls-GHAOJMH6.js.map +1 -0
  5. package/dist/{GitToolbarControl-LMIR4R7I.js → GitToolbarControl-GNMRVKWQ.js} +62 -43
  6. package/dist/GitToolbarControl-GNMRVKWQ.js.map +1 -0
  7. package/dist/{GitUI-KGF5MSNV.js → GitUI-VHOBQY43.js} +225 -140
  8. package/dist/GitUI-VHOBQY43.js.map +1 -0
  9. package/dist/ShareDialog-63ENBEDZ.js +213 -0
  10. package/dist/ShareDialog-63ENBEDZ.js.map +1 -0
  11. package/dist/chunk-57ZJJOC5.js +89 -0
  12. package/dist/chunk-57ZJJOC5.js.map +1 -0
  13. package/dist/chunk-FEWQUQML.js +256 -0
  14. package/dist/chunk-FEWQUQML.js.map +1 -0
  15. package/dist/chunk-FMGTHSTX.js +110 -0
  16. package/dist/chunk-FMGTHSTX.js.map +1 -0
  17. package/dist/chunk-UNYZQXWR.js +324 -0
  18. package/dist/chunk-UNYZQXWR.js.map +1 -0
  19. package/dist/editor.d.ts +5 -4
  20. package/dist/editor.js +8 -69
  21. package/dist/editor.js.map +1 -1
  22. package/dist/export/index.d.ts +7 -1
  23. package/dist/export/index.js +2 -1
  24. package/dist/index.d.ts +346 -21
  25. package/dist/index.js +6169 -20
  26. package/dist/index.js.map +1 -1
  27. package/dist/settings/index.d.ts +9 -1
  28. package/dist/settings/index.js +6 -4
  29. package/package.json +18 -13
  30. package/src/styles/docblocks.css +537 -26
  31. package/dist/AppMenu/AppMenu.d.ts +0 -53
  32. package/dist/AppMenu/AppMenu.d.ts.map +0 -1
  33. package/dist/AppMenu/AppMenu.js +0 -67
  34. package/dist/AppMenu/AppMenu.js.map +0 -1
  35. package/dist/AppMenu/index.d.ts +0 -3
  36. package/dist/AppMenu/index.d.ts.map +0 -1
  37. package/dist/AppMenu/index.js +0 -2
  38. package/dist/AppMenu/index.js.map +0 -1
  39. package/dist/DocBlocksShell/DocBlocksShell.d.ts +0 -49
  40. package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +0 -1
  41. package/dist/DocBlocksShell/DocBlocksShell.js +0 -2730
  42. package/dist/DocBlocksShell/DocBlocksShell.js.map +0 -1
  43. package/dist/DocBlocksShell/LazyEditorShell.d.ts +0 -3
  44. package/dist/DocBlocksShell/LazyEditorShell.d.ts.map +0 -1
  45. package/dist/DocBlocksShell/LazyEditorShell.js +0 -3
  46. package/dist/DocBlocksShell/LazyEditorShell.js.map +0 -1
  47. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts +0 -13
  48. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts.map +0 -1
  49. package/dist/DocBlocksShell/UpdateAvailableNotice.js +0 -16
  50. package/dist/DocBlocksShell/UpdateAvailableNotice.js.map +0 -1
  51. package/dist/DocBlocksShell/document-title.d.ts +0 -3
  52. package/dist/DocBlocksShell/document-title.d.ts.map +0 -1
  53. package/dist/DocBlocksShell/document-title.js +0 -17
  54. package/dist/DocBlocksShell/document-title.js.map +0 -1
  55. package/dist/DocBlocksShell/index.d.ts +0 -3
  56. package/dist/DocBlocksShell/index.d.ts.map +0 -1
  57. package/dist/DocBlocksShell/index.js +0 -2
  58. package/dist/DocBlocksShell/index.js.map +0 -1
  59. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts +0 -14
  60. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts.map +0 -1
  61. package/dist/DocBlocksShell/workspace-authority-barrier.js +0 -23
  62. package/dist/DocBlocksShell/workspace-authority-barrier.js.map +0 -1
  63. package/dist/Export/DeferredExportToolbarControls.d.ts +0 -5
  64. package/dist/Export/DeferredExportToolbarControls.d.ts.map +0 -1
  65. package/dist/Export/DeferredExportToolbarControls.js +0 -10
  66. package/dist/Export/DeferredExportToolbarControls.js.map +0 -1
  67. package/dist/Export/ExportDialog.d.ts +0 -25
  68. package/dist/Export/ExportDialog.d.ts.map +0 -1
  69. package/dist/Export/ExportDialog.js +0 -160
  70. package/dist/Export/ExportDialog.js.map +0 -1
  71. package/dist/Export/ExportToolbarControls.d.ts +0 -37
  72. package/dist/Export/ExportToolbarControls.d.ts.map +0 -1
  73. package/dist/Export/ExportToolbarControls.js +0 -285
  74. package/dist/Export/ExportToolbarControls.js.map +0 -1
  75. package/dist/Export/export-destination.d.ts +0 -3
  76. package/dist/Export/export-destination.d.ts.map +0 -1
  77. package/dist/Export/export-destination.js +0 -32
  78. package/dist/Export/export-destination.js.map +0 -1
  79. package/dist/Export/export-options.d.ts +0 -53
  80. package/dist/Export/export-options.d.ts.map +0 -1
  81. package/dist/Export/export-options.js +0 -49
  82. package/dist/Export/export-options.js.map +0 -1
  83. package/dist/Export/index.d.ts +0 -10
  84. package/dist/Export/index.d.ts.map +0 -1
  85. package/dist/Export/index.js +0 -6
  86. package/dist/Export/index.js.map +0 -1
  87. package/dist/Export/public-api.d.ts +0 -12
  88. package/dist/Export/public-api.d.ts.map +0 -1
  89. package/dist/Export/public-api.js +0 -9
  90. package/dist/Export/public-api.js.map +0 -1
  91. package/dist/Export/run-export.d.ts +0 -10
  92. package/dist/Export/run-export.d.ts.map +0 -1
  93. package/dist/Export/run-export.js +0 -313
  94. package/dist/Export/run-export.js.map +0 -1
  95. package/dist/Export/transform-summaries.d.ts +0 -7
  96. package/dist/Export/transform-summaries.d.ts.map +0 -1
  97. package/dist/Export/transform-summaries.js +0 -6
  98. package/dist/Export/transform-summaries.js.map +0 -1
  99. package/dist/ExportToolbarControls-D2YDWOXW.js.map +0 -1
  100. package/dist/FileExplorer/FileExplorer.d.ts +0 -43
  101. package/dist/FileExplorer/FileExplorer.d.ts.map +0 -1
  102. package/dist/FileExplorer/FileExplorer.js +0 -315
  103. package/dist/FileExplorer/FileExplorer.js.map +0 -1
  104. package/dist/FileExplorer/FileTreeNode.d.ts +0 -39
  105. package/dist/FileExplorer/FileTreeNode.d.ts.map +0 -1
  106. package/dist/FileExplorer/FileTreeNode.js +0 -131
  107. package/dist/FileExplorer/FileTreeNode.js.map +0 -1
  108. package/dist/FileExplorer/index.d.ts +0 -6
  109. package/dist/FileExplorer/index.d.ts.map +0 -1
  110. package/dist/FileExplorer/index.js +0 -4
  111. package/dist/FileExplorer/index.js.map +0 -1
  112. package/dist/FileExplorer/useFileTree.d.ts +0 -37
  113. package/dist/FileExplorer/useFileTree.d.ts.map +0 -1
  114. package/dist/FileExplorer/useFileTree.js +0 -284
  115. package/dist/FileExplorer/useFileTree.js.map +0 -1
  116. package/dist/Git/GitAuthGuidanceDialog.d.ts +0 -18
  117. package/dist/Git/GitAuthGuidanceDialog.d.ts.map +0 -1
  118. package/dist/Git/GitAuthGuidanceDialog.js +0 -27
  119. package/dist/Git/GitAuthGuidanceDialog.js.map +0 -1
  120. package/dist/Git/GitBranchesDialog.d.ts +0 -13
  121. package/dist/Git/GitBranchesDialog.d.ts.map +0 -1
  122. package/dist/Git/GitBranchesDialog.js +0 -59
  123. package/dist/Git/GitBranchesDialog.js.map +0 -1
  124. package/dist/Git/GitCloneDialog.d.ts +0 -14
  125. package/dist/Git/GitCloneDialog.d.ts.map +0 -1
  126. package/dist/Git/GitCloneDialog.js +0 -79
  127. package/dist/Git/GitCloneDialog.js.map +0 -1
  128. package/dist/Git/GitCommitDialog.d.ts +0 -12
  129. package/dist/Git/GitCommitDialog.d.ts.map +0 -1
  130. package/dist/Git/GitCommitDialog.js +0 -38
  131. package/dist/Git/GitCommitDialog.js.map +0 -1
  132. package/dist/Git/GitConflictsDialog.d.ts +0 -12
  133. package/dist/Git/GitConflictsDialog.d.ts.map +0 -1
  134. package/dist/Git/GitConflictsDialog.js +0 -17
  135. package/dist/Git/GitConflictsDialog.js.map +0 -1
  136. package/dist/Git/GitContext.d.ts +0 -89
  137. package/dist/Git/GitContext.d.ts.map +0 -1
  138. package/dist/Git/GitContext.js +0 -15
  139. package/dist/Git/GitContext.js.map +0 -1
  140. package/dist/Git/GitDiffDialog.d.ts +0 -20
  141. package/dist/Git/GitDiffDialog.d.ts.map +0 -1
  142. package/dist/Git/GitDiffDialog.js +0 -100
  143. package/dist/Git/GitDiffDialog.js.map +0 -1
  144. package/dist/Git/GitDiffView.d.ts +0 -23
  145. package/dist/Git/GitDiffView.d.ts.map +0 -1
  146. package/dist/Git/GitDiffView.js +0 -77
  147. package/dist/Git/GitDiffView.js.map +0 -1
  148. package/dist/Git/GitHistoryDialog.d.ts +0 -15
  149. package/dist/Git/GitHistoryDialog.d.ts.map +0 -1
  150. package/dist/Git/GitHistoryDialog.js +0 -107
  151. package/dist/Git/GitHistoryDialog.js.map +0 -1
  152. package/dist/Git/GitStatusBar.d.ts +0 -8
  153. package/dist/Git/GitStatusBar.d.ts.map +0 -1
  154. package/dist/Git/GitStatusBar.js +0 -49
  155. package/dist/Git/GitStatusBar.js.map +0 -1
  156. package/dist/Git/GitToolbarControl.d.ts +0 -15
  157. package/dist/Git/GitToolbarControl.d.ts.map +0 -1
  158. package/dist/Git/GitToolbarControl.js +0 -51
  159. package/dist/Git/GitToolbarControl.js.map +0 -1
  160. package/dist/Git/GitUI.d.ts +0 -14
  161. package/dist/Git/GitUI.d.ts.map +0 -1
  162. package/dist/Git/GitUI.js +0 -21
  163. package/dist/Git/GitUI.js.map +0 -1
  164. package/dist/Git/commit-selection.d.ts +0 -22
  165. package/dist/Git/commit-selection.d.ts.map +0 -1
  166. package/dist/Git/commit-selection.js +0 -47
  167. package/dist/Git/commit-selection.js.map +0 -1
  168. package/dist/Git/git-clone-utils.d.ts +0 -8
  169. package/dist/Git/git-clone-utils.d.ts.map +0 -1
  170. package/dist/Git/git-clone-utils.js +0 -26
  171. package/dist/Git/git-clone-utils.js.map +0 -1
  172. package/dist/Git/git-status.d.ts +0 -24
  173. package/dist/Git/git-status.d.ts.map +0 -1
  174. package/dist/Git/git-status.js +0 -105
  175. package/dist/Git/git-status.js.map +0 -1
  176. package/dist/Git/useGit.d.ts +0 -15
  177. package/dist/Git/useGit.d.ts.map +0 -1
  178. package/dist/Git/useGit.js +0 -206
  179. package/dist/Git/useGit.js.map +0 -1
  180. package/dist/Git/useGitStatus.d.ts +0 -17
  181. package/dist/Git/useGitStatus.d.ts.map +0 -1
  182. package/dist/Git/useGitStatus.js +0 -63
  183. package/dist/Git/useGitStatus.js.map +0 -1
  184. package/dist/GitToolbarControl-LMIR4R7I.js.map +0 -1
  185. package/dist/GitUI-KGF5MSNV.js.map +0 -1
  186. package/dist/Settings/Settings.d.ts +0 -23
  187. package/dist/Settings/Settings.d.ts.map +0 -1
  188. package/dist/Settings/Settings.js +0 -22
  189. package/dist/Settings/Settings.js.map +0 -1
  190. package/dist/Settings/public-api.d.ts +0 -3
  191. package/dist/Settings/public-api.d.ts.map +0 -1
  192. package/dist/Settings/public-api.js +0 -2
  193. package/dist/Settings/public-api.js.map +0 -1
  194. package/dist/WorkspacePicker/WorkspacePicker.d.ts +0 -22
  195. package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +0 -1
  196. package/dist/WorkspacePicker/WorkspacePicker.js +0 -74
  197. package/dist/WorkspacePicker/WorkspacePicker.js.map +0 -1
  198. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts +0 -11
  199. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts.map +0 -1
  200. package/dist/WorkspacePicker/WorkspaceSettingsButton.js +0 -27
  201. package/dist/WorkspacePicker/WorkspaceSettingsButton.js.map +0 -1
  202. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts +0 -20
  203. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts.map +0 -1
  204. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js +0 -36
  205. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js.map +0 -1
  206. package/dist/WorkspacePicker/index.d.ts +0 -3
  207. package/dist/WorkspacePicker/index.d.ts.map +0 -1
  208. package/dist/WorkspacePicker/index.js +0 -2
  209. package/dist/WorkspacePicker/index.js.map +0 -1
  210. package/dist/chunk-3SAXDU2U.js +0 -157
  211. package/dist/chunk-3SAXDU2U.js.map +0 -1
  212. package/dist/chunk-AOVTHZU7.js +0 -321
  213. package/dist/chunk-AOVTHZU7.js.map +0 -1
  214. package/dist/chunk-GSNZSCIK.js +0 -55
  215. package/dist/chunk-GSNZSCIK.js.map +0 -1
  216. package/dist/components/Dialog.d.ts +0 -22
  217. package/dist/components/Dialog.d.ts.map +0 -1
  218. package/dist/components/Dialog.js +0 -33
  219. package/dist/components/Dialog.js.map +0 -1
  220. package/dist/editor.d.ts.map +0 -1
  221. package/dist/hooks/index.d.ts +0 -3
  222. package/dist/hooks/index.d.ts.map +0 -1
  223. package/dist/hooks/index.js +0 -2
  224. package/dist/hooks/index.js.map +0 -1
  225. package/dist/hooks/useDocumentSession.d.ts +0 -16
  226. package/dist/hooks/useDocumentSession.d.ts.map +0 -1
  227. package/dist/hooks/useDocumentSession.js +0 -18
  228. package/dist/hooks/useDocumentSession.js.map +0 -1
  229. package/dist/icons.d.ts +0 -12
  230. package/dist/icons.d.ts.map +0 -1
  231. package/dist/icons.js +0 -28
  232. package/dist/icons.js.map +0 -1
  233. package/dist/index.d.ts.map +0 -1
  234. package/dist/preferences/theme.d.ts +0 -18
  235. package/dist/preferences/theme.d.ts.map +0 -1
  236. package/dist/preferences/theme.js +0 -63
  237. package/dist/preferences/theme.js.map +0 -1
  238. package/dist/preferences/versioning.d.ts +0 -27
  239. package/dist/preferences/versioning.d.ts.map +0 -1
  240. package/dist/preferences/versioning.js +0 -62
  241. package/dist/preferences/versioning.js.map +0 -1
  242. package/dist/provider-lease.d.ts +0 -10
  243. package/dist/provider-lease.d.ts.map +0 -1
  244. package/dist/provider-lease.js +0 -42
  245. package/dist/provider-lease.js.map +0 -1
  246. package/src/AppMenu/AppMenu.tsx +0 -334
  247. package/src/AppMenu/index.ts +0 -2
  248. package/src/DocBlocksShell/DocBlocksShell.tsx +0 -3398
  249. package/src/DocBlocksShell/LazyEditorShell.ts +0 -2
  250. package/src/DocBlocksShell/UpdateAvailableNotice.tsx +0 -60
  251. package/src/DocBlocksShell/document-title.ts +0 -19
  252. package/src/DocBlocksShell/index.ts +0 -2
  253. package/src/DocBlocksShell/workspace-authority-barrier.ts +0 -26
  254. package/src/Export/DeferredExportToolbarControls.tsx +0 -23
  255. package/src/Export/ExportDialog.tsx +0 -437
  256. package/src/Export/ExportToolbarControls.tsx +0 -511
  257. package/src/Export/export-destination.ts +0 -30
  258. package/src/Export/export-options.ts +0 -99
  259. package/src/Export/index.ts +0 -19
  260. package/src/Export/public-api.ts +0 -17
  261. package/src/Export/run-export.ts +0 -374
  262. package/src/Export/transform-summaries.ts +0 -14
  263. package/src/FileExplorer/FileExplorer.tsx +0 -528
  264. package/src/FileExplorer/FileTreeNode.tsx +0 -306
  265. package/src/FileExplorer/index.ts +0 -5
  266. package/src/FileExplorer/useFileTree.ts +0 -352
  267. package/src/Git/GitAuthGuidanceDialog.tsx +0 -84
  268. package/src/Git/GitBranchesDialog.tsx +0 -144
  269. package/src/Git/GitCloneDialog.tsx +0 -200
  270. package/src/Git/GitCommitDialog.tsx +0 -119
  271. package/src/Git/GitConflictsDialog.tsx +0 -62
  272. package/src/Git/GitContext.tsx +0 -88
  273. package/src/Git/GitDiffDialog.tsx +0 -147
  274. package/src/Git/GitDiffView.tsx +0 -105
  275. package/src/Git/GitHistoryDialog.tsx +0 -195
  276. package/src/Git/GitStatusBar.tsx +0 -157
  277. package/src/Git/GitToolbarControl.tsx +0 -123
  278. package/src/Git/GitUI.tsx +0 -68
  279. package/src/Git/commit-selection.ts +0 -63
  280. package/src/Git/git-clone-utils.ts +0 -23
  281. package/src/Git/git-status.ts +0 -113
  282. package/src/Git/useGit.ts +0 -279
  283. package/src/Git/useGitStatus.ts +0 -78
  284. package/src/Settings/Settings.tsx +0 -118
  285. package/src/Settings/public-api.ts +0 -8
  286. package/src/WorkspacePicker/WorkspacePicker.tsx +0 -191
  287. package/src/WorkspacePicker/WorkspaceSettingsButton.tsx +0 -88
  288. package/src/WorkspacePicker/WorkspaceSettingsDialog.tsx +0 -121
  289. package/src/WorkspacePicker/index.ts +0 -2
  290. package/src/components/Dialog.tsx +0 -81
  291. package/src/editor.ts +0 -72
  292. package/src/hooks/index.ts +0 -2
  293. package/src/hooks/useDocumentSession.ts +0 -37
  294. package/src/icons.tsx +0 -48
  295. package/src/index.ts +0 -61
  296. package/src/preferences/theme.ts +0 -67
  297. package/src/preferences/versioning.ts +0 -69
  298. package/src/provider-lease.ts +0 -52
  299. package/src/types/pwa-dom.d.ts +0 -31
  300. /package/dist/{ExportDialog-MEUISWZX.js.map → ExportDialog-7LDIXJZ3.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"useGit.js","sourceRoot":"","sources":["../../src/Git/useGit.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * useGitStatus — subscribes to the host's owner-scoped repository stream.
3
- *
4
- * Dedupes identical payloads so a permanently-dirty working tree (normal
5
- * under the manual-commit model) doesn't repaint the tree on every push
6
- * from the main process.
7
- */
8
- import type { DocBlocksHostGitAPI, GitStatus } from '@bendyline/docblocks/host';
9
- export interface UseGitStatusResult {
10
- status: GitStatus | null;
11
- /** Fetch a fresh status immediately (after a renderer-initiated git op). */
12
- refresh: () => void;
13
- /** Trailing-debounced refresh (after autosave writes). */
14
- scheduleRefresh: () => void;
15
- }
16
- export declare function useGitStatus(gitApi: DocBlocksHostGitAPI | null, repositoryId: string | null, enabled: boolean): UseGitStatusResult;
17
- //# sourceMappingURL=useGitStatus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useGitStatus.d.ts","sourceRoot":"","sources":["../../src/Git/useGitStatus.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAQhF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,0DAA0D;IAC1D,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,mBAAmB,GAAG,IAAI,EAClC,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,OAAO,EAAE,OAAO,GACf,kBAAkB,CAgDpB"}
@@ -1,63 +0,0 @@
1
- /**
2
- * useGitStatus — subscribes to the host's owner-scoped repository stream.
3
- *
4
- * Dedupes identical payloads so a permanently-dirty working tree (normal
5
- * under the manual-commit model) doesn't repaint the tree on every push
6
- * from the main process.
7
- */
8
- import { useCallback, useEffect, useRef, useState } from 'react';
9
- const SCHEDULE_REFRESH_MS = 1500;
10
- function statusKey(status) {
11
- return JSON.stringify(status);
12
- }
13
- export function useGitStatus(gitApi, repositoryId, enabled) {
14
- const [status, setStatus] = useState(null);
15
- const lastKeyRef = useRef(null);
16
- const timerRef = useRef(null);
17
- const apply = useCallback((next) => {
18
- const key = statusKey(next);
19
- if (key === lastKeyRef.current)
20
- return;
21
- lastKeyRef.current = key;
22
- setStatus(next);
23
- }, []);
24
- useEffect(() => {
25
- lastKeyRef.current = null;
26
- setStatus(null);
27
- if (!gitApi || !repositoryId || !enabled)
28
- return;
29
- let cancelled = false;
30
- const unsubscribe = gitApi.onStatusChanged(repositoryId, (next) => {
31
- if (!cancelled)
32
- apply(next);
33
- });
34
- return () => {
35
- cancelled = true;
36
- unsubscribe();
37
- };
38
- }, [gitApi, repositoryId, enabled, apply]);
39
- const refresh = useCallback(() => {
40
- if (!gitApi || !repositoryId || !enabled)
41
- return;
42
- void gitApi.status(repositoryId).then((result) => {
43
- if (result.ok)
44
- apply(result.value);
45
- });
46
- }, [gitApi, repositoryId, enabled, apply]);
47
- const scheduleRefresh = useCallback(() => {
48
- if (timerRef.current)
49
- clearTimeout(timerRef.current);
50
- timerRef.current = setTimeout(() => {
51
- timerRef.current = null;
52
- refresh();
53
- }, SCHEDULE_REFRESH_MS);
54
- }, [refresh]);
55
- useEffect(() => {
56
- return () => {
57
- if (timerRef.current)
58
- clearTimeout(timerRef.current);
59
- };
60
- }, []);
61
- return { status, refresh, scheduleRefresh };
62
- }
63
- //# sourceMappingURL=useGitStatus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useGitStatus.js","sourceRoot":"","sources":["../../src/Git/useGitStatus.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjE,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,SAAS,SAAS,CAAC,MAAiB;IAClC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAUD,MAAM,UAAU,YAAY,CAC1B,MAAkC,EAClC,YAA2B,EAC3B,OAAgB;IAEhB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAC;IAEpE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,IAAe,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,GAAG,KAAK,UAAU,CAAC,OAAO;YAAE,OAAO;QACvC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;QACzB,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO;YAAE,OAAO;QACjD,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YAChE,IAAI,CAAC,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YACjB,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO;YAAE,OAAO;QACjD,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/C,IAAI,MAAM,CAAC,EAAE;gBAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3C,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,IAAI,QAAQ,CAAC,OAAO;YAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrD,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC1B,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ,CAAC,OAAO;gBAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AAC9C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/Git/GitToolbarControl.tsx"],"sourcesContent":["/**\n * GitToolbarControl — per-file git actions in the editor toolbar.\n *\n * A single branch-glyph button (styled like the export trigger) opening a\n * small dropdown: view working-tree changes, per-file history, and \"Open\n * on <host>\" when a web remote is known. A dot overlay marks the selected\n * file as modified. Null-renders without a git context, a repository, or a\n * selected file. Deliberately has no editor dependency.\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport { useGitContext } from './GitContext.js';\nimport { isFileDirty } from './git-status.js';\n\nexport interface GitToolbarControlProps {\n /** Currently selected file path (slash-prefixed), or null. */\n selectedFile: string | null;\n}\n\nexport function GitToolbarControl({ selectedFile }: GitToolbarControlProps) {\n const git = useGitContext();\n const [menuOpen, setMenuOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click (same pointerdown pattern as ExportToolbarControls).\n useEffect(() => {\n if (!menuOpen) return;\n const onPointerDown = (e: PointerEvent) => {\n if (menuRef.current && !menuRef.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 if (!git || !git.repo || !selectedFile) return null;\n\n const dirty = isFileDirty(git.status, selectedFile);\n const label = dirty ? 'Git actions (file modified)' : 'Git actions';\n\n const openDiff = () => {\n setMenuOpen(false);\n git.openDialog({ kind: 'diff', path: selectedFile });\n };\n const openHistory = () => {\n setMenuOpen(false);\n git.openDialog({ kind: 'history', path: selectedFile });\n };\n const openOnRemote = () => {\n setMenuOpen(false);\n git.openOnRemote(selectedFile);\n };\n\n return (\n <div className=\"db-toolbar-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className=\"squisq-toolbar-button db-git-toolbar-trigger\"\n onClick={() => setMenuOpen((prev) => !prev)}\n aria-label={label}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n data-tooltip={label}\n >\n <BranchGlyph />\n {dirty && <span className=\"db-git-toolbar-dot\" aria-hidden=\"true\" />}\n </button>\n\n {menuOpen && (\n <div className=\"db-toolbar-menu-dropdown\" role=\"menu\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-toolbar-menu-item\"\n disabled={!dirty}\n onClick={openDiff}\n >\n View changes\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-toolbar-menu-item\"\n onClick={openHistory}\n >\n File history…\n </button>\n {git.remoteWeb && (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"db-toolbar-menu-item\"\n onClick={openOnRemote}\n >\n Open on {git.remoteWeb.host}\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction BranchGlyph() {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"4.5\" cy=\"12\" r=\"2\" />\n <circle cx=\"11.5\" cy=\"4\" r=\"2\" />\n <path d=\"M4.5 10V7.5A2.5 2.5 0 0 1 7 5h2.5\" />\n </svg>\n );\n}\n"],"mappings":";;;;;;AAUA,SAAS,WAAW,QAAQ,gBAAgB;AA8CtC,SASE,KATF;AArCC,SAAS,kBAAkB,EAAE,aAAa,GAA2B;AAC1E,QAAM,MAAM,cAAc;AAC1B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,UAAU,OAAuB,IAAI;AAG3C,YAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,UAAM,gBAAgB,CAAC,MAAoB;AACzC,UAAI,QAAQ,WAAW,CAAC,QAAQ,QAAQ,SAAS,EAAE,MAAc,GAAG;AAClE,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,WAAO,MAAM,SAAS,oBAAoB,eAAe,aAAa;AAAA,EACxE,GAAG,CAAC,QAAQ,CAAC;AAEb,MAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,aAAc,QAAO;AAE/C,QAAM,QAAQ,YAAY,IAAI,QAAQ,YAAY;AAClD,QAAM,QAAQ,QAAQ,gCAAgC;AAEtD,QAAM,WAAW,MAAM;AACrB,gBAAY,KAAK;AACjB,QAAI,WAAW,EAAE,MAAM,QAAQ,MAAM,aAAa,CAAC;AAAA,EACrD;AACA,QAAM,cAAc,MAAM;AACxB,gBAAY,KAAK;AACjB,QAAI,WAAW,EAAE,MAAM,WAAW,MAAM,aAAa,CAAC;AAAA,EACxD;AACA,QAAM,eAAe,MAAM;AACzB,gBAAY,KAAK;AACjB,QAAI,aAAa,YAAY;AAAA,EAC/B;AAEA,SACE,qBAAC,SAAI,WAAU,mBAAkB,KAAK,SACpC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI;AAAA,QAC1C,cAAY;AAAA,QACZ,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,gBAAc;AAAA,QAEd;AAAA,8BAAC,eAAY;AAAA,UACZ,SAAS,oBAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO;AAAA;AAAA;AAAA,IACpE;AAAA,IAEC,YACC,qBAAC,SAAI,WAAU,4BAA2B,MAAK,QAC7C;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,CAAC;AAAA,UACX,SAAS;AAAA,UACV;AAAA;AAAA,MAED;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS;AAAA,UACV;AAAA;AAAA,MAED;AAAA,MACC,IAAI,aACH;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS;AAAA,UACV;AAAA;AAAA,YACU,IAAI,UAAU;AAAA;AAAA;AAAA,MACzB;AAAA,OAEJ;AAAA,KAEJ;AAEJ;AAEA,SAAS,cAAc;AACrB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ;AAAA,4BAAC,YAAO,IAAG,OAAM,IAAG,MAAK,GAAE,KAAI;AAAA,QAC/B,oBAAC,YAAO,IAAG,QAAO,IAAG,KAAI,GAAE,KAAI;AAAA,QAC/B,oBAAC,UAAK,GAAE,qCAAoC;AAAA;AAAA;AAAA,EAC9C;AAEJ;","names":[]}
@@ -1 +0,0 @@
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&rsquo;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&rsquo;ll pick where next\n </p>\n )}\n <p className=\"db-git-hint\">\n HTTPS and SSH URLs both work. You&rsquo;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"]}
@@ -1,23 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,22 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,3 +0,0 @@
1
- export { AccentColorSettings, SettingsDialog, ThemeSettings } from './Settings.js';
2
- export type { AccentColor, AccentColorSettingsProps, SettingsDialogProps, ThemePreference, ThemeSettingsProps, } from './Settings.js';
3
- //# sourceMappingURL=public-api.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
1
- export { AccentColorSettings, SettingsDialog, ThemeSettings } from './Settings.js';
2
- //# sourceMappingURL=public-api.js.map
@@ -1 +0,0 @@
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"}
@@ -1,22 +0,0 @@
1
- /**
2
- * WorkspacePicker — dropdown for switching between workspaces
3
- * (IndexedDB-based or native folder via File System Access API).
4
- */
5
- import type { WorkspaceDescriptor } from '@bendyline/docblocks/workspace';
6
- export interface WorkspacePickerProps {
7
- /** Currently active workspace id. */
8
- activeWorkspaceId: string | null;
9
- /** Called when the user picks a different workspace. */
10
- onSelect: (descriptor: WorkspaceDescriptor) => void;
11
- /** Called when the user chooses "Open Folder" (native FS). */
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;
18
- /** Optional className. */
19
- className?: string;
20
- }
21
- export declare function WorkspacePicker({ activeWorkspaceId, onSelect, onOpenFolder, onCloneRepository, className, }: WorkspacePickerProps): import("react/jsx-runtime").JSX.Element;
22
- //# sourceMappingURL=WorkspacePicker.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,74 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * WorkspacePicker — dropdown for switching between workspaces
4
- * (IndexedDB-based or native folder via File System Access API).
5
- */
6
- import { Fragment, useState, useEffect, useCallback, useRef } from 'react';
7
- import { listWorkspaces, saveWorkspace, touchWorkspace } from '@bendyline/docblocks/workspace';
8
- import { isElectronHost } from '@bendyline/docblocks/host';
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, }) {
18
- const [workspaces, setWorkspaces] = useState([]);
19
- const [isOpen, setIsOpen] = useState(false);
20
- const pickerRef = useRef(null);
21
- // Close dropdown on outside click
22
- useEffect(() => {
23
- if (!isOpen)
24
- return;
25
- function handleOutsideClick(e) {
26
- if (pickerRef.current && !pickerRef.current.contains(e.target)) {
27
- setIsOpen(false);
28
- }
29
- }
30
- document.addEventListener('mousedown', handleOutsideClick);
31
- return () => document.removeEventListener('mousedown', handleOutsideClick);
32
- }, [isOpen]);
33
- const electron = isElectronHost();
34
- const refresh = useCallback(async () => {
35
- const list = await listWorkspaces();
36
- // On desktop, hide web-only workspaces (indexeddb/native).
37
- const filtered = electron
38
- ? list.filter((w) => w.type === 'electron-native')
39
- : list.filter((w) => w.type !== 'electron-native');
40
- setWorkspaces(filtered);
41
- }, [electron]);
42
- useEffect(() => {
43
- refresh();
44
- }, [refresh, activeWorkspaceId]);
45
- const handleSelect = useCallback(async (ws) => {
46
- await touchWorkspace(ws.id);
47
- onSelect(ws);
48
- setIsOpen(false);
49
- }, [onSelect]);
50
- const handleCreateNew = useCallback(async () => {
51
- const name = `Workspace ${workspaces.length + 1}`;
52
- const id = `ws-${Date.now()}`;
53
- const descriptor = {
54
- id,
55
- name,
56
- type: 'indexeddb',
57
- lastOpened: new Date().toISOString(),
58
- };
59
- await saveWorkspace(descriptor);
60
- await refresh();
61
- onSelect(descriptor);
62
- setIsOpen(false);
63
- }, [workspaces.length, onSelect, refresh]);
64
- const activeWs = workspaces.find((w) => w.id === activeWorkspaceId);
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: () => {
67
- setIsOpen(false);
68
- onOpenFolder();
69
- }, children: "Open Folder..." })), onCloneRepository && (_jsx("button", { className: "db-workspace-dropdown-item", onClick: () => {
70
- setIsOpen(false);
71
- onCloneRepository();
72
- }, children: "Clone Git Repository..." }))] }))] }));
73
- }
74
- //# sourceMappingURL=WorkspacePicker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkspacePicker.js","sourceRoot":"","sources":["../../src/WorkspacePicker/WorkspacePicker.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * WorkspaceSettingsButton — gear icon dropdown for workspace actions.
3
- */
4
- export interface WorkspaceSettingsButtonProps {
5
- onSettings: () => void;
6
- onRename: () => void;
7
- onDownload: () => void;
8
- onRemove: () => void;
9
- }
10
- export declare function WorkspaceSettingsButton({ onSettings, onRename, onDownload, onRemove, }: WorkspaceSettingsButtonProps): import("react/jsx-runtime").JSX.Element;
11
- //# sourceMappingURL=WorkspaceSettingsButton.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkspaceSettingsButton.d.ts","sourceRoot":"","sources":["../../src/WorkspacePicker/WorkspaceSettingsButton.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,uBAAuB,CAAC,EACtC,UAAU,EACV,QAAQ,EACR,UAAU,EACV,QAAQ,GACT,EAAE,4BAA4B,2CAoE9B"}
@@ -1,27 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * WorkspaceSettingsButton — gear icon dropdown for workspace actions.
4
- */
5
- import { useState, useCallback, useRef, useEffect } from 'react';
6
- import { WorkspaceIcon } from '../icons.js';
7
- export function WorkspaceSettingsButton({ onSettings, onRename, onDownload, onRemove, }) {
8
- const [isOpen, setIsOpen] = useState(false);
9
- const ref = useRef(null);
10
- useEffect(() => {
11
- if (!isOpen)
12
- return;
13
- function handleOutsideClick(e) {
14
- if (ref.current && !ref.current.contains(e.target)) {
15
- setIsOpen(false);
16
- }
17
- }
18
- document.addEventListener('mousedown', handleOutsideClick);
19
- return () => document.removeEventListener('mousedown', handleOutsideClick);
20
- }, [isOpen]);
21
- const handleAction = useCallback((action) => {
22
- setIsOpen(false);
23
- action();
24
- }, []);
25
- return (_jsxs("div", { ref: ref, className: "db-ws-settings", children: [_jsx("button", { className: "db-ws-settings-btn", onClick: () => setIsOpen(!isOpen), "aria-expanded": isOpen, "aria-haspopup": "true", "aria-label": "Workspace settings", title: "Workspace settings", children: _jsx(WorkspaceIcon, {}) }), isOpen && (_jsxs("div", { className: "db-ws-settings-dropdown", role: "menu", children: [_jsx("button", { className: "db-ws-settings-item", role: "menuitem", onClick: () => handleAction(onSettings), children: "Workspace settings\u2026" }), _jsx("button", { className: "db-ws-settings-item", role: "menuitem", onClick: () => handleAction(onRename), children: "Rename workspace" }), _jsx("button", { className: "db-ws-settings-item", role: "menuitem", onClick: () => handleAction(onDownload), children: "Download workspace" }), _jsx("div", { className: "db-ws-settings-divider" }), _jsx("button", { className: "db-ws-settings-item db-ws-settings-item--danger", role: "menuitem", onClick: () => handleAction(onRemove), children: "Remove workspace" })] }))] }));
26
- }
27
- //# sourceMappingURL=WorkspaceSettingsButton.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkspaceSettingsButton.js","sourceRoot":"","sources":["../../src/WorkspacePicker/WorkspaceSettingsButton.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAS5C,MAAM,UAAU,uBAAuB,CAAC,EACtC,UAAU,EACV,QAAQ,EACR,UAAU,EACV,QAAQ,GACqB;IAC7B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,SAAS,kBAAkB,CAAC,CAAa;YACvC,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,EAAE,CAAC;gBAC3D,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC7E,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,MAAkB,EAAE,EAAE;QACtD,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,MAAM,EAAE,CAAC;IACX,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,eAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAC,gBAAgB,aACvC,iBACE,SAAS,EAAC,oBAAoB,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,mBAClB,MAAM,mBACP,MAAM,gBACT,oBAAoB,EAC/B,KAAK,EAAC,oBAAoB,YAE1B,KAAC,aAAa,KAAG,GACV,EAER,MAAM,IAAI,CACT,eAAK,SAAS,EAAC,yBAAyB,EAAC,IAAI,EAAC,MAAM,aAClD,iBACE,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,yCAGhC,EACT,iBACE,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,iCAG9B,EACT,iBACE,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,mCAGhC,EACT,cAAK,SAAS,EAAC,wBAAwB,GAAG,EAC1C,iBACE,SAAS,EAAC,iDAAiD,EAC3D,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,iCAG9B,IACL,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -1,20 +0,0 @@
1
- /**
2
- * WorkspaceSettingsDialog — per-workspace settings modal.
3
- *
4
- * Lets the user override the global versioning preference for a single
5
- * workspace (or fall back to inheriting it). The override is stored on
6
- * the WorkspaceDescriptor and persisted via `saveWorkspace`.
7
- */
8
- import type { WorkspaceDescriptor } from '@bendyline/docblocks/workspace';
9
- import { type VersioningPreference } from '../preferences/versioning.js';
10
- export type WorkspaceVersioningOverride = NonNullable<WorkspaceDescriptor['versioningOverride']>;
11
- export interface WorkspaceSettingsDialogProps {
12
- workspace: WorkspaceDescriptor;
13
- /** Current global versioning preference — used to label "Inherit". */
14
- globalVersioningPreference: VersioningPreference;
15
- /** Apply a new override and close the dialog. */
16
- onChange: (override: WorkspaceVersioningOverride) => void;
17
- onClose: () => void;
18
- }
19
- export declare function WorkspaceSettingsDialog({ workspace, globalVersioningPreference, onChange, onClose, }: WorkspaceSettingsDialogProps): import("react/jsx-runtime").JSX.Element;
20
- //# sourceMappingURL=WorkspaceSettingsDialog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkspaceSettingsDialog.d.ts","sourceRoot":"","sources":["../../src/WorkspacePicker/WorkspaceSettingsDialog.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,2BAA2B,GAAG,WAAW,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAEjG,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,mBAAmB,CAAC;IAC/B,sEAAsE;IACtE,0BAA0B,EAAE,oBAAoB,CAAC;IACjD,iDAAiD;IACjD,QAAQ,EAAE,CAAC,QAAQ,EAAE,2BAA2B,KAAK,IAAI,CAAC;IAC1D,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAQD,wBAAgB,uBAAuB,CAAC,EACtC,SAAS,EACT,0BAA0B,EAC1B,QAAQ,EACR,OAAO,GACR,EAAE,4BAA4B,2CAkF9B"}