@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,334 +0,0 @@
1
- /**
2
- * AppMenu — top-left dropdown with workspace actions and app links.
3
- */
4
-
5
- import { useState, useCallback, useRef, useEffect } from 'react';
6
- import type { VersioningPreference } from '../preferences/versioning.js';
7
- import type { AccentColor, ThemePreference } from '../preferences/theme.js';
8
- import { AccentColorSettings, SettingsDialog, ThemeSettings } from '../Settings/Settings.js';
9
-
10
- export type { AccentColor, ThemePreference } from '../preferences/theme.js';
11
-
12
- export interface AppMenuProps {
13
- /** URL for the about page. */
14
- aboutUrl?: string;
15
- /** Optional logo image URL to display instead of the text label. */
16
- logoUrl?: string;
17
- /** Current theme preference. */
18
- themePreference?: ThemePreference;
19
- /** Called when the user changes the theme preference. */
20
- onThemeChange?: (theme: ThemePreference) => void;
21
- /** Current accent color. */
22
- accentColor?: AccentColor;
23
- /** Called when the user changes the accent color. */
24
- onAccentColorChange?: (color: AccentColor) => void;
25
- /** Current global versioning preference. */
26
- versioningPreference?: VersioningPreference;
27
- /** Called when the user changes the global versioning preference. */
28
- onVersioningPreferenceChange?: (pref: VersioningPreference) => void;
29
- /**
30
- * Called when the user clicks "Download all workspaces". When omitted,
31
- * the menu item is hidden.
32
- */
33
- onDownloadAllWorkspaces?: () => void | Promise<void>;
34
- /**
35
- * Called when the user asks the browser to keep origin storage persistent.
36
- * When omitted, the menu item is hidden.
37
- */
38
- onKeepBrowserData?: () => void | Promise<void>;
39
- /**
40
- * Called when the user clicks "Install DocBlocks…" (browser PWA install).
41
- * When omitted — Electron, unsupported browsers, or already installed —
42
- * the menu item is hidden.
43
- */
44
- onInstallApp?: () => void | Promise<void>;
45
- /**
46
- * Async origin storage usage/quota for the Settings "Storage" section
47
- * (fetched when the dialog opens). When omitted — Electron, or browsers
48
- * without `navigator.storage.estimate` — the section is hidden.
49
- */
50
- getStorageEstimate?: () => Promise<{ usage: number; quota: number } | null>;
51
- /** Whether the browser has marked origin storage persistent (Settings display). */
52
- storagePersistent?: boolean;
53
- }
54
-
55
- function formatBytes(bytes: number): string {
56
- if (!Number.isFinite(bytes) || bytes < 0) return '—';
57
- let value = bytes;
58
- let unit = 'B';
59
- for (const next of ['KB', 'MB', 'GB', 'TB']) {
60
- if (value < 1024) break;
61
- value /= 1024;
62
- unit = next;
63
- }
64
- return `${value >= 100 || unit === 'B' ? Math.round(value) : value.toFixed(1)} ${unit}`;
65
- }
66
-
67
- export function AppMenu({
68
- aboutUrl: _aboutUrl = '#about',
69
- logoUrl,
70
- themePreference = 'auto',
71
- onThemeChange,
72
- accentColor = 'brown',
73
- onAccentColorChange,
74
- versioningPreference = 'browser-only',
75
- onVersioningPreferenceChange,
76
- onDownloadAllWorkspaces,
77
- onKeepBrowserData,
78
- onInstallApp,
79
- getStorageEstimate,
80
- storagePersistent,
81
- }: AppMenuProps) {
82
- const [isOpen, setIsOpen] = useState(false);
83
- const [showAbout, setShowAbout] = useState(false);
84
- const [showSettings, setShowSettings] = useState(false);
85
- const menuRef = useRef<HTMLDivElement>(null);
86
- const [storageEstimate, setStorageEstimate] = useState<{
87
- usage: number;
88
- quota: number;
89
- } | null>(null);
90
-
91
- // Refresh the Settings "Storage" figures each time the dialog opens.
92
- useEffect(() => {
93
- if (!showSettings || !getStorageEstimate) return;
94
- let cancelled = false;
95
- getStorageEstimate()
96
- .then((estimate) => {
97
- if (!cancelled) setStorageEstimate(estimate);
98
- })
99
- .catch(() => {
100
- if (!cancelled) setStorageEstimate(null);
101
- });
102
- return () => {
103
- cancelled = true;
104
- };
105
- }, [showSettings, getStorageEstimate]);
106
-
107
- useEffect(() => {
108
- if (!isOpen) return;
109
- function handleOutsideClick(e: MouseEvent) {
110
- if (menuRef.current && !menuRef.current.contains(e.target as Node)) {
111
- setIsOpen(false);
112
- }
113
- }
114
- document.addEventListener('mousedown', handleOutsideClick);
115
- return () => document.removeEventListener('mousedown', handleOutsideClick);
116
- }, [isOpen]);
117
-
118
- const handleAction = useCallback((action: () => void) => {
119
- setIsOpen(false);
120
- action();
121
- }, []);
122
-
123
- return (
124
- <>
125
- <div ref={menuRef} className="db-app-menu">
126
- <button
127
- className="db-app-menu-btn"
128
- onClick={() => setIsOpen(!isOpen)}
129
- aria-expanded={isOpen}
130
- aria-haspopup="true"
131
- >
132
- {logoUrl ? (
133
- <img src={logoUrl} alt="docblocks" className="db-app-menu-logo" />
134
- ) : (
135
- <span className="db-app-menu-label">docblocks</span>
136
- )}
137
- <span
138
- className={`db-app-menu-caret${isOpen ? ' db-app-menu-caret--open' : ''}`}
139
- aria-hidden="true"
140
- />
141
- </button>
142
-
143
- {isOpen && (
144
- <div className="db-app-menu-dropdown" role="menu">
145
- <button
146
- className="db-app-menu-item"
147
- role="menuitem"
148
- onClick={() => handleAction(() => setShowSettings(true))}
149
- >
150
- Settings
151
- </button>
152
- {onInstallApp && (
153
- <button
154
- className="db-app-menu-item"
155
- role="menuitem"
156
- onClick={() => handleAction(() => void onInstallApp())}
157
- >
158
- Install DocBlocks&hellip;
159
- </button>
160
- )}
161
- {onKeepBrowserData && (
162
- <button
163
- className="db-app-menu-item"
164
- role="menuitem"
165
- onClick={() => handleAction(() => void onKeepBrowserData())}
166
- >
167
- Keep data in browser for longer
168
- </button>
169
- )}
170
- {onDownloadAllWorkspaces && (
171
- <button
172
- className="db-app-menu-item"
173
- role="menuitem"
174
- onClick={() => handleAction(() => void onDownloadAllWorkspaces())}
175
- >
176
- Download all workspaces
177
- </button>
178
- )}
179
- <div className="db-app-menu-divider" />
180
- <button
181
- className="db-app-menu-item"
182
- role="menuitem"
183
- onClick={() => handleAction(() => setShowAbout(true))}
184
- >
185
- About
186
- </button>
187
- </div>
188
- )}
189
- </div>
190
-
191
- {showSettings && (
192
- <SettingsDialog onClose={() => setShowSettings(false)}>
193
- <ThemeSettings
194
- value={themePreference}
195
- onChange={(preference) => onThemeChange?.(preference)}
196
- />
197
- <AccentColorSettings
198
- value={accentColor}
199
- onChange={(color) => onAccentColorChange?.(color)}
200
- />
201
-
202
- {getStorageEstimate && (
203
- <fieldset className="db-settings-fieldset">
204
- <legend className="db-settings-legend">Storage</legend>
205
- <p className="db-settings-hint">
206
- {storageEstimate
207
- ? `DocBlocks documents and app data are using ${formatBytes(
208
- storageEstimate.usage,
209
- )} of the ${formatBytes(
210
- storageEstimate.quota,
211
- )} this browser allows for the site.`
212
- : 'Storage usage is not available in this browser.'}{' '}
213
- {storagePersistent === undefined
214
- ? ''
215
- : storagePersistent
216
- ? 'Data is marked persistent, so the browser will avoid evicting it.'
217
- : 'Data is not yet marked persistent — use “Keep data in browser for longer” in the app menu.'}
218
- </p>
219
- </fieldset>
220
- )}
221
-
222
- {onVersioningPreferenceChange && (
223
- <fieldset className="db-settings-fieldset">
224
- <legend className="db-settings-legend">Version history</legend>
225
- <p className="db-settings-hint">
226
- When on, DocBlocks keeps prior revisions of each document inside a sibling{' '}
227
- <code>&lt;name&gt;_files/.versions/</code> folder. Individual workspaces can
228
- override this default in their own settings.
229
- </p>
230
- <label className="db-settings-radio">
231
- <input
232
- type="radio"
233
- name="versioning"
234
- value="on"
235
- checked={versioningPreference === 'on'}
236
- onChange={() => onVersioningPreferenceChange('on')}
237
- />
238
- On for all workspaces
239
- </label>
240
- <label className="db-settings-radio">
241
- <input
242
- type="radio"
243
- name="versioning"
244
- value="browser-only"
245
- checked={versioningPreference === 'browser-only'}
246
- onChange={() => onVersioningPreferenceChange('browser-only')}
247
- />
248
- On in browser workspaces, off for local folders
249
- </label>
250
- <label className="db-settings-radio">
251
- <input
252
- type="radio"
253
- name="versioning"
254
- value="off"
255
- checked={versioningPreference === 'off'}
256
- onChange={() => onVersioningPreferenceChange('off')}
257
- />
258
- Off for all workspaces
259
- </label>
260
- </fieldset>
261
- )}
262
- </SettingsDialog>
263
- )}
264
-
265
- {showAbout && (
266
- <div className="db-dialog-overlay" onClick={() => setShowAbout(false)}>
267
- <div
268
- className="db-dialog"
269
- role="dialog"
270
- aria-label="About DocBlocks"
271
- onClick={(e) => e.stopPropagation()}
272
- >
273
- <div className="db-dialog-header">
274
- <h2 className="db-dialog-title">About DocBlocks</h2>
275
- <button
276
- className="db-dialog-close"
277
- onClick={() => setShowAbout(false)}
278
- aria-label="Close"
279
- >
280
- &times;
281
- </button>
282
- </div>
283
- <div className="db-dialog-body">
284
- <p>
285
- <strong>DocBlocks</strong> is a markdown document editor that runs entirely in your
286
- browser. Your files stay on your device.
287
- </p>
288
- <p>
289
- Built on{' '}
290
- <a
291
- href="https://github.com/bendyline/squisq"
292
- target="_blank"
293
- rel="noopener noreferrer"
294
- >
295
- squisq
296
- </a>{' '}
297
- by{' '}
298
- <a href="https://bendyline.com" target="_blank" rel="noopener noreferrer">
299
- Bendyline
300
- </a>
301
- .
302
- </p>
303
- <p className="db-dialog-links">
304
- <a
305
- href="https://github.com/bendyline/docblocks"
306
- target="_blank"
307
- rel="noopener noreferrer"
308
- >
309
- GitHub
310
- </a>
311
- <span className="db-dialog-sep">&middot;</span>
312
- <a
313
- href="https://github.com/bendyline/docblocks/blob/main/LICENSE"
314
- target="_blank"
315
- rel="noopener noreferrer"
316
- >
317
- License (MIT)
318
- </a>
319
- <span className="db-dialog-sep">&middot;</span>
320
- <a
321
- href="https://github.com/bendyline/docblocks/blob/main/NOTICE.md"
322
- target="_blank"
323
- rel="noopener noreferrer"
324
- >
325
- &hearts; built on open source
326
- </a>
327
- </p>
328
- </div>
329
- </div>
330
- </div>
331
- )}
332
- </>
333
- );
334
- }
@@ -1,2 +0,0 @@
1
- export { AppMenu } from './AppMenu.js';
2
- export type { AccentColor, AppMenuProps, ThemePreference } from './AppMenu.js';