@bendyline/docblocks-react 2.0.0 → 2.1.1

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 (310) hide show
  1. package/README.md +18 -3
  2. package/dist/ExportDialog-VYATD5UC.js +9 -0
  3. package/dist/{ExportToolbarControls-D2YDWOXW.js → ExportToolbarControls-5HUE3LSX.js} +206 -42
  4. package/dist/{GitToolbarControl-LMIR4R7I.js → GitToolbarControl-FW3BZFXV.js} +62 -44
  5. package/dist/{GitUI-KGF5MSNV.js → GitUI-GMH3PAYL.js} +225 -141
  6. package/dist/{LazyEditorShell-EF2BWRXU.js → LazyEditorShell-RF54B5UD.js} +0 -1
  7. package/dist/ShareDialog-PAMOQQFB.js +212 -0
  8. package/dist/chunk-3CZ27FOA.js +359 -0
  9. package/dist/chunk-3QSZY74C.js +255 -0
  10. package/{src/Export/export-destination.ts → dist/chunk-BI7NVU6T.js} +16 -15
  11. package/dist/{chunk-VHDP4IPL.js → chunk-BPGEBGAN.js} +0 -1
  12. package/dist/{chunk-DD4VFJQI.js → chunk-EBWYGTN7.js} +2 -1
  13. package/dist/{chunk-ZI56BNB7.js → chunk-GHQ4X7KM.js} +27 -7
  14. package/dist/{chunk-5A4KEWKT.js → chunk-HFYPTTCH.js} +0 -1
  15. package/dist/chunk-LG6HAWCK.js +109 -0
  16. package/dist/chunk-TFMO7EVO.js +88 -0
  17. package/dist/{chunk-4XXSWN3T.js → chunk-YBEYTVU2.js} +0 -1
  18. package/dist/editor.d.ts +5 -4
  19. package/dist/editor.js +8 -70
  20. package/dist/export/index.d.ts +24 -8
  21. package/dist/export/index.js +10 -6
  22. package/dist/index.d.ts +355 -21
  23. package/dist/index.js +6419 -21
  24. package/dist/run-export-Z5BVFLIR.js +9 -0
  25. package/dist/settings/index.d.ts +9 -1
  26. package/dist/settings/index.js +6 -5
  27. package/package.json +18 -13
  28. package/src/styles/docblocks.css +985 -35
  29. package/dist/AppMenu/AppMenu.d.ts +0 -53
  30. package/dist/AppMenu/AppMenu.d.ts.map +0 -1
  31. package/dist/AppMenu/AppMenu.js +0 -67
  32. package/dist/AppMenu/AppMenu.js.map +0 -1
  33. package/dist/AppMenu/index.d.ts +0 -3
  34. package/dist/AppMenu/index.d.ts.map +0 -1
  35. package/dist/AppMenu/index.js +0 -2
  36. package/dist/AppMenu/index.js.map +0 -1
  37. package/dist/DocBlocksShell/DocBlocksShell.d.ts +0 -49
  38. package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +0 -1
  39. package/dist/DocBlocksShell/DocBlocksShell.js +0 -2730
  40. package/dist/DocBlocksShell/DocBlocksShell.js.map +0 -1
  41. package/dist/DocBlocksShell/LazyEditorShell.d.ts +0 -3
  42. package/dist/DocBlocksShell/LazyEditorShell.d.ts.map +0 -1
  43. package/dist/DocBlocksShell/LazyEditorShell.js +0 -3
  44. package/dist/DocBlocksShell/LazyEditorShell.js.map +0 -1
  45. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts +0 -13
  46. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts.map +0 -1
  47. package/dist/DocBlocksShell/UpdateAvailableNotice.js +0 -16
  48. package/dist/DocBlocksShell/UpdateAvailableNotice.js.map +0 -1
  49. package/dist/DocBlocksShell/document-title.d.ts +0 -3
  50. package/dist/DocBlocksShell/document-title.d.ts.map +0 -1
  51. package/dist/DocBlocksShell/document-title.js +0 -17
  52. package/dist/DocBlocksShell/document-title.js.map +0 -1
  53. package/dist/DocBlocksShell/index.d.ts +0 -3
  54. package/dist/DocBlocksShell/index.d.ts.map +0 -1
  55. package/dist/DocBlocksShell/index.js +0 -2
  56. package/dist/DocBlocksShell/index.js.map +0 -1
  57. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts +0 -14
  58. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts.map +0 -1
  59. package/dist/DocBlocksShell/workspace-authority-barrier.js +0 -23
  60. package/dist/DocBlocksShell/workspace-authority-barrier.js.map +0 -1
  61. package/dist/Export/DeferredExportToolbarControls.d.ts +0 -5
  62. package/dist/Export/DeferredExportToolbarControls.d.ts.map +0 -1
  63. package/dist/Export/DeferredExportToolbarControls.js +0 -10
  64. package/dist/Export/DeferredExportToolbarControls.js.map +0 -1
  65. package/dist/Export/ExportDialog.d.ts +0 -25
  66. package/dist/Export/ExportDialog.d.ts.map +0 -1
  67. package/dist/Export/ExportDialog.js +0 -160
  68. package/dist/Export/ExportDialog.js.map +0 -1
  69. package/dist/Export/ExportToolbarControls.d.ts +0 -37
  70. package/dist/Export/ExportToolbarControls.d.ts.map +0 -1
  71. package/dist/Export/ExportToolbarControls.js +0 -285
  72. package/dist/Export/ExportToolbarControls.js.map +0 -1
  73. package/dist/Export/export-destination.d.ts +0 -3
  74. package/dist/Export/export-destination.d.ts.map +0 -1
  75. package/dist/Export/export-destination.js +0 -32
  76. package/dist/Export/export-destination.js.map +0 -1
  77. package/dist/Export/export-options.d.ts +0 -53
  78. package/dist/Export/export-options.d.ts.map +0 -1
  79. package/dist/Export/export-options.js +0 -49
  80. package/dist/Export/export-options.js.map +0 -1
  81. package/dist/Export/index.d.ts +0 -10
  82. package/dist/Export/index.d.ts.map +0 -1
  83. package/dist/Export/index.js +0 -6
  84. package/dist/Export/index.js.map +0 -1
  85. package/dist/Export/public-api.d.ts +0 -12
  86. package/dist/Export/public-api.d.ts.map +0 -1
  87. package/dist/Export/public-api.js +0 -9
  88. package/dist/Export/public-api.js.map +0 -1
  89. package/dist/Export/run-export.d.ts +0 -10
  90. package/dist/Export/run-export.d.ts.map +0 -1
  91. package/dist/Export/run-export.js +0 -313
  92. package/dist/Export/run-export.js.map +0 -1
  93. package/dist/Export/transform-summaries.d.ts +0 -7
  94. package/dist/Export/transform-summaries.d.ts.map +0 -1
  95. package/dist/Export/transform-summaries.js +0 -6
  96. package/dist/Export/transform-summaries.js.map +0 -1
  97. package/dist/ExportDialog-MEUISWZX.js +0 -9
  98. package/dist/ExportDialog-MEUISWZX.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/LazyEditorShell-EF2BWRXU.js.map +0 -1
  187. package/dist/Settings/Settings.d.ts +0 -23
  188. package/dist/Settings/Settings.d.ts.map +0 -1
  189. package/dist/Settings/Settings.js +0 -22
  190. package/dist/Settings/Settings.js.map +0 -1
  191. package/dist/Settings/public-api.d.ts +0 -3
  192. package/dist/Settings/public-api.d.ts.map +0 -1
  193. package/dist/Settings/public-api.js +0 -2
  194. package/dist/Settings/public-api.js.map +0 -1
  195. package/dist/WorkspacePicker/WorkspacePicker.d.ts +0 -22
  196. package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +0 -1
  197. package/dist/WorkspacePicker/WorkspacePicker.js +0 -74
  198. package/dist/WorkspacePicker/WorkspacePicker.js.map +0 -1
  199. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts +0 -11
  200. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts.map +0 -1
  201. package/dist/WorkspacePicker/WorkspaceSettingsButton.js +0 -27
  202. package/dist/WorkspacePicker/WorkspaceSettingsButton.js.map +0 -1
  203. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts +0 -20
  204. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts.map +0 -1
  205. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js +0 -36
  206. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js.map +0 -1
  207. package/dist/WorkspacePicker/index.d.ts +0 -3
  208. package/dist/WorkspacePicker/index.d.ts.map +0 -1
  209. package/dist/WorkspacePicker/index.js +0 -2
  210. package/dist/WorkspacePicker/index.js.map +0 -1
  211. package/dist/chunk-3SAXDU2U.js +0 -157
  212. package/dist/chunk-3SAXDU2U.js.map +0 -1
  213. package/dist/chunk-4XXSWN3T.js.map +0 -1
  214. package/dist/chunk-5A4KEWKT.js.map +0 -1
  215. package/dist/chunk-AOVTHZU7.js +0 -321
  216. package/dist/chunk-AOVTHZU7.js.map +0 -1
  217. package/dist/chunk-DD4VFJQI.js.map +0 -1
  218. package/dist/chunk-GSNZSCIK.js +0 -55
  219. package/dist/chunk-GSNZSCIK.js.map +0 -1
  220. package/dist/chunk-VHDP4IPL.js.map +0 -1
  221. package/dist/chunk-ZI56BNB7.js.map +0 -1
  222. package/dist/components/Dialog.d.ts +0 -22
  223. package/dist/components/Dialog.d.ts.map +0 -1
  224. package/dist/components/Dialog.js +0 -33
  225. package/dist/components/Dialog.js.map +0 -1
  226. package/dist/editor.d.ts.map +0 -1
  227. package/dist/editor.js.map +0 -1
  228. package/dist/export/index.js.map +0 -1
  229. package/dist/hooks/index.d.ts +0 -3
  230. package/dist/hooks/index.d.ts.map +0 -1
  231. package/dist/hooks/index.js +0 -2
  232. package/dist/hooks/index.js.map +0 -1
  233. package/dist/hooks/useDocumentSession.d.ts +0 -16
  234. package/dist/hooks/useDocumentSession.d.ts.map +0 -1
  235. package/dist/hooks/useDocumentSession.js +0 -18
  236. package/dist/hooks/useDocumentSession.js.map +0 -1
  237. package/dist/icons.d.ts +0 -12
  238. package/dist/icons.d.ts.map +0 -1
  239. package/dist/icons.js +0 -28
  240. package/dist/icons.js.map +0 -1
  241. package/dist/index.d.ts.map +0 -1
  242. package/dist/index.js.map +0 -1
  243. package/dist/preferences/theme.d.ts +0 -18
  244. package/dist/preferences/theme.d.ts.map +0 -1
  245. package/dist/preferences/theme.js +0 -63
  246. package/dist/preferences/theme.js.map +0 -1
  247. package/dist/preferences/versioning.d.ts +0 -27
  248. package/dist/preferences/versioning.d.ts.map +0 -1
  249. package/dist/preferences/versioning.js +0 -62
  250. package/dist/preferences/versioning.js.map +0 -1
  251. package/dist/provider-lease.d.ts +0 -10
  252. package/dist/provider-lease.d.ts.map +0 -1
  253. package/dist/provider-lease.js +0 -42
  254. package/dist/provider-lease.js.map +0 -1
  255. package/dist/run-export-ICTZITXC.js +0 -10
  256. package/dist/run-export-ICTZITXC.js.map +0 -1
  257. package/dist/settings/index.js.map +0 -1
  258. package/src/AppMenu/AppMenu.tsx +0 -334
  259. package/src/AppMenu/index.ts +0 -2
  260. package/src/DocBlocksShell/DocBlocksShell.tsx +0 -3398
  261. package/src/DocBlocksShell/LazyEditorShell.ts +0 -2
  262. package/src/DocBlocksShell/UpdateAvailableNotice.tsx +0 -60
  263. package/src/DocBlocksShell/document-title.ts +0 -19
  264. package/src/DocBlocksShell/index.ts +0 -2
  265. package/src/DocBlocksShell/workspace-authority-barrier.ts +0 -26
  266. package/src/Export/DeferredExportToolbarControls.tsx +0 -23
  267. package/src/Export/ExportDialog.tsx +0 -437
  268. package/src/Export/ExportToolbarControls.tsx +0 -511
  269. package/src/Export/export-options.ts +0 -99
  270. package/src/Export/index.ts +0 -19
  271. package/src/Export/public-api.ts +0 -17
  272. package/src/Export/run-export.ts +0 -374
  273. package/src/Export/transform-summaries.ts +0 -14
  274. package/src/FileExplorer/FileExplorer.tsx +0 -528
  275. package/src/FileExplorer/FileTreeNode.tsx +0 -306
  276. package/src/FileExplorer/index.ts +0 -5
  277. package/src/FileExplorer/useFileTree.ts +0 -352
  278. package/src/Git/GitAuthGuidanceDialog.tsx +0 -84
  279. package/src/Git/GitBranchesDialog.tsx +0 -144
  280. package/src/Git/GitCloneDialog.tsx +0 -200
  281. package/src/Git/GitCommitDialog.tsx +0 -119
  282. package/src/Git/GitConflictsDialog.tsx +0 -62
  283. package/src/Git/GitContext.tsx +0 -88
  284. package/src/Git/GitDiffDialog.tsx +0 -147
  285. package/src/Git/GitDiffView.tsx +0 -105
  286. package/src/Git/GitHistoryDialog.tsx +0 -195
  287. package/src/Git/GitStatusBar.tsx +0 -157
  288. package/src/Git/GitToolbarControl.tsx +0 -123
  289. package/src/Git/GitUI.tsx +0 -68
  290. package/src/Git/commit-selection.ts +0 -63
  291. package/src/Git/git-clone-utils.ts +0 -23
  292. package/src/Git/git-status.ts +0 -113
  293. package/src/Git/useGit.ts +0 -279
  294. package/src/Git/useGitStatus.ts +0 -78
  295. package/src/Settings/Settings.tsx +0 -118
  296. package/src/Settings/public-api.ts +0 -8
  297. package/src/WorkspacePicker/WorkspacePicker.tsx +0 -191
  298. package/src/WorkspacePicker/WorkspaceSettingsButton.tsx +0 -88
  299. package/src/WorkspacePicker/WorkspaceSettingsDialog.tsx +0 -121
  300. package/src/WorkspacePicker/index.ts +0 -2
  301. package/src/components/Dialog.tsx +0 -81
  302. package/src/editor.ts +0 -72
  303. package/src/hooks/index.ts +0 -2
  304. package/src/hooks/useDocumentSession.ts +0 -37
  305. package/src/icons.tsx +0 -48
  306. package/src/index.ts +0 -61
  307. package/src/preferences/theme.ts +0 -67
  308. package/src/preferences/versioning.ts +0 -69
  309. package/src/provider-lease.ts +0 -52
  310. package/src/types/pwa-dom.d.ts +0 -31
@@ -1,3 +1,5 @@
1
+ @import '@bendyline/squisq-editor-react/styles';
2
+
1
3
  /* ── DocBlocks Styles ─────────────────────────────────────────── */
2
4
 
3
5
  /* ── Theme Tokens ────────────────────────────────────────────── */
@@ -27,6 +29,11 @@
27
29
  --db-accent-hover: #5e4f37;
28
30
  --db-text-on-accent: #ffffff;
29
31
  --db-text-on-selected: #ffffff;
32
+ /* Keyboard focus ring. Deliberately darker than --db-accent: the accent
33
+ is also the *selected row* fill, so an accent ring vanished against
34
+ it. Any surface that paints itself --db-bg-selected re-points this
35
+ token at a contrasting value (see .db-tree-row--selected). */
36
+ --db-focus: #3d3220;
30
37
  --db-accent-soft-08: rgba(125, 105, 72, 0.08);
31
38
  --db-accent-soft-10: rgba(125, 105, 72, 0.1);
32
39
  --db-accent-soft-12: rgba(125, 105, 72, 0.12);
@@ -45,6 +52,7 @@
45
52
  --db-input-border: #c4b693;
46
53
  --db-danger: #b22b1b;
47
54
  --db-danger-bg: #fdf0ee;
55
+ --db-text-on-danger: #ffffff;
48
56
  --db-shadow: rgba(40, 30, 15, 0.12);
49
57
  /* Git status colors — file badges, sync chips. Deleted/conflicted reuse
50
58
  the danger hue on purpose; renamed gets the one cool accent. */
@@ -72,6 +80,7 @@
72
80
  --db-accent-hover: #dec79d;
73
81
  --db-text-on-accent: #1a1812;
74
82
  --db-text-on-selected: #e8e2d0;
83
+ --db-focus: #e8e2d0;
75
84
  --db-accent-soft-08: rgba(200, 180, 143, 0.08);
76
85
  --db-accent-soft-10: rgba(200, 180, 143, 0.1);
77
86
  --db-accent-soft-12: rgba(200, 180, 143, 0.12);
@@ -86,6 +95,7 @@
86
95
  --db-input-border: #c8b48f;
87
96
  --db-danger: #f87171;
88
97
  --db-danger-bg: #1c1917;
98
+ --db-text-on-danger: #1c1917;
89
99
  --db-shadow: rgba(0, 0, 0, 0.4);
90
100
  /* In dark mode, "lighter than the toolbar" means brighter — so this
91
101
  sits a step above `--db-accent-tint-strong` instead of between it
@@ -116,6 +126,7 @@
116
126
  --db-accent-hover: #dec79d;
117
127
  --db-text-on-accent: #1a1812;
118
128
  --db-text-on-selected: #e8e2d0;
129
+ --db-focus: #e8e2d0;
119
130
  --db-accent-soft-08: rgba(200, 180, 143, 0.08);
120
131
  --db-accent-soft-12: rgba(200, 180, 143, 0.12);
121
132
  --db-accent-soft-15: rgba(200, 180, 143, 0.18);
@@ -125,6 +136,7 @@
125
136
  --db-input-border: #c8b48f;
126
137
  --db-danger: #f87171;
127
138
  --db-danger-bg: #1c1917;
139
+ --db-text-on-danger: #1c1917;
128
140
  --db-shadow: rgba(0, 0, 0, 0.4);
129
141
  --db-gutter-bg: #4a4538;
130
142
  --db-git-modified: #e5b567;
@@ -202,12 +214,125 @@
202
214
  justify-content: center;
203
215
  }
204
216
 
205
- .db-explorer-btn:hover {
217
+ .db-explorer-btn:hover:not(:disabled) {
206
218
  background: var(--db-bg-hover);
207
219
  border-color: var(--db-border);
208
220
  color: var(--db-text-secondary);
209
221
  }
210
222
 
223
+ .db-explorer-btn:disabled {
224
+ cursor: default;
225
+ opacity: 0.55;
226
+ }
227
+
228
+ /* ── Transient workspace move ────────────────────────────────── */
229
+
230
+ .db-transient-move {
231
+ flex-shrink: 0;
232
+ padding: 8px;
233
+ border-bottom: 1px solid var(--db-border);
234
+ background: var(--db-accent-soft-08);
235
+ }
236
+
237
+ .db-transient-move-trigger {
238
+ width: 100%;
239
+ padding: 7px 9px;
240
+ border: 1px solid var(--db-accent);
241
+ border-radius: 5px;
242
+ background: var(--db-bg);
243
+ color: var(--db-accent-deep);
244
+ font: inherit;
245
+ font-weight: 600;
246
+ text-align: left;
247
+ cursor: pointer;
248
+ }
249
+
250
+ .db-transient-move-trigger:hover {
251
+ background: var(--db-bg-hover);
252
+ }
253
+
254
+ .db-transient-move-trigger:focus-visible,
255
+ .db-transient-move-select:focus-visible,
256
+ .db-transient-move-actions button:focus-visible {
257
+ outline: 2px solid var(--db-focus, var(--db-accent));
258
+ outline-offset: 2px;
259
+ }
260
+
261
+ .db-transient-move-form {
262
+ display: flex;
263
+ flex-direction: column;
264
+ gap: 7px;
265
+ }
266
+
267
+ .db-transient-move-label {
268
+ color: var(--db-text);
269
+ font-size: 12px;
270
+ font-weight: 600;
271
+ }
272
+
273
+ .db-transient-move-select {
274
+ box-sizing: border-box;
275
+ width: 100%;
276
+ min-width: 0;
277
+ padding: 6px 28px 6px 8px;
278
+ border: 1px solid var(--db-input-border);
279
+ border-radius: 4px;
280
+ background: var(--db-bg);
281
+ color: var(--db-text);
282
+ font: inherit;
283
+ }
284
+
285
+ .db-transient-move-hint,
286
+ .db-transient-move-error {
287
+ margin: 0;
288
+ font-size: 11px;
289
+ line-height: 1.4;
290
+ }
291
+
292
+ .db-transient-move-hint {
293
+ color: var(--db-text-muted);
294
+ }
295
+
296
+ .db-transient-move-error {
297
+ color: var(--db-danger);
298
+ }
299
+
300
+ .db-transient-move-actions {
301
+ display: flex;
302
+ justify-content: flex-end;
303
+ gap: 6px;
304
+ }
305
+
306
+ .db-transient-move-actions button {
307
+ padding: 5px 10px;
308
+ border-radius: 4px;
309
+ font: inherit;
310
+ font-weight: 600;
311
+ cursor: pointer;
312
+ }
313
+
314
+ .db-transient-move-actions button:disabled {
315
+ opacity: 0.55;
316
+ cursor: default;
317
+ }
318
+
319
+ .db-transient-move-cancel {
320
+ border: 1px solid var(--db-border-strong);
321
+ background: var(--db-bg);
322
+ color: var(--db-text-secondary);
323
+ }
324
+
325
+ .db-transient-move-submit {
326
+ border: 1px solid var(--db-accent);
327
+ background: var(--db-accent);
328
+ color: var(--db-text-on-accent);
329
+ }
330
+
331
+ .db-transient-move-submit:hover:not(:disabled) {
332
+ border-color: var(--db-accent-hover);
333
+ background: var(--db-accent-hover);
334
+ }
335
+
211
336
  /* ── New Item Input ──────────────────────────────────────────── */
212
337
 
213
338
  .db-new-item {
@@ -234,6 +359,25 @@
234
359
  outline: none;
235
360
  }
236
361
 
362
+ /* The UA outline is suppressed above, so this is the *only* focus
363
+ indicator on an input a keyboard user has to type into (WCAG 2.4.7).
364
+ :focus-visible rather than :focus so a pointer user placing a caret
365
+ doesn't get a ring. */
366
+ .db-new-item-input:focus-visible {
367
+ outline: 2px solid var(--db-focus);
368
+ outline-offset: 1px;
369
+ border-color: var(--db-accent);
370
+ }
371
+
372
+ .db-new-item-input[aria-invalid='true'] {
373
+ border-color: var(--db-danger);
374
+ }
375
+
376
+ .db-new-item-add:focus-visible {
377
+ outline: 2px solid var(--db-focus);
378
+ outline-offset: 1px;
379
+ }
380
+
237
381
  .db-new-item-suffix {
238
382
  font-size: 12px;
239
383
  color: var(--db-text-muted);
@@ -251,10 +395,16 @@
251
395
  cursor: pointer;
252
396
  }
253
397
 
254
- .db-new-item-add:hover {
398
+ .db-new-item-add:hover:not(:disabled) {
255
399
  background: var(--db-accent-hover);
256
400
  }
257
401
 
402
+ .db-new-item-input:disabled,
403
+ .db-new-item-add:disabled {
404
+ cursor: default;
405
+ opacity: 0.65;
406
+ }
407
+
258
408
  /* ── Tree ────────────────────────────────────────────────────── */
259
409
 
260
410
  .db-tree {
@@ -279,6 +429,17 @@
279
429
  font-size: 12px;
280
430
  }
281
431
 
432
+ .db-tree-error-retry {
433
+ border: 0;
434
+ padding: 0;
435
+ color: inherit;
436
+ background: transparent;
437
+ font: inherit;
438
+ font-weight: 600;
439
+ text-decoration: underline;
440
+ cursor: pointer;
441
+ }
442
+
282
443
  .db-tree--drop-target {
283
444
  box-shadow: inset 0 0 0 2px var(--db-accent);
284
445
  background: var(--db-accent-soft-08);
@@ -298,6 +459,22 @@
298
459
  background: var(--db-bg-hover);
299
460
  }
300
461
 
462
+ /* The roving-tabindex row is the tree's single tab stop, so its focus ring
463
+ is the only thing telling a keyboard user where they are. Inset offset
464
+ keeps the ring inside the scroll container instead of being clipped. */
465
+ .db-tree-row:focus-visible {
466
+ outline: 2px solid var(--db-focus);
467
+ outline-offset: -2px;
468
+ }
469
+
470
+ /* A selected/drop-target row is filled with --db-bg-selected, which in
471
+ light mode *is* the accent brown — the default ring would disappear
472
+ into it. Re-point the token rather than duplicating the rule. */
473
+ .db-tree-row--selected,
474
+ .db-tree-row--drop-target {
475
+ --db-focus: #ffffff;
476
+ }
477
+
301
478
  .db-tree-row--dragging {
302
479
  opacity: 0.45;
303
480
  }
@@ -348,6 +525,15 @@
348
525
  outline: none;
349
526
  }
350
527
 
528
+ /* Same WCAG 2.4.7 gap as .db-new-item-input: the rename input is focused
529
+ programmatically the moment it appears, so with `outline: none` and no
530
+ replacement a keyboard user had no idea where they were typing. */
531
+ .db-tree-rename-input:focus-visible {
532
+ outline: 2px solid var(--db-focus);
533
+ outline-offset: 1px;
534
+ border-color: var(--db-accent);
535
+ }
536
+
351
537
  .db-tree-more {
352
538
  flex-shrink: 0;
353
539
  display: inline-flex;
@@ -379,6 +565,11 @@
379
565
  color: var(--db-text);
380
566
  }
381
567
 
568
+ .db-tree-more:focus-visible {
569
+ outline: 2px solid var(--db-focus);
570
+ outline-offset: -2px;
571
+ }
572
+
382
573
  .db-tree-more--active {
383
574
  background: var(--db-bg-selected);
384
575
  color: var(--db-text-on-selected);
@@ -413,10 +604,18 @@
413
604
  color: var(--db-text-secondary);
414
605
  }
415
606
 
416
- .db-tree-context-item:hover {
607
+ .db-tree-context-item:hover,
608
+ .db-tree-context-item:focus-visible {
417
609
  background: var(--db-bg-hover);
418
610
  }
419
611
 
612
+ /* Menu items are reached with Arrow keys (they are not tab stops), so the
613
+ ring is the only cue to which item Enter will fire. */
614
+ .db-tree-context-item:focus-visible {
615
+ outline: 2px solid var(--db-focus);
616
+ outline-offset: -2px;
617
+ }
618
+
420
619
  .db-tree-context-item--danger {
421
620
  color: var(--db-danger);
422
621
  }
@@ -566,6 +765,83 @@
566
765
  margin: 4px 0;
567
766
  }
568
767
 
768
+ .db-workspace-create {
769
+ box-sizing: border-box;
770
+ width: min(300px, calc(100vw - 24px));
771
+ padding: 10px;
772
+ }
773
+
774
+ .db-workspace-create-label {
775
+ display: block;
776
+ margin-bottom: 5px;
777
+ color: var(--db-text-secondary);
778
+ font-size: 12px;
779
+ font-weight: 600;
780
+ }
781
+
782
+ .db-workspace-create-input {
783
+ box-sizing: border-box;
784
+ width: 100%;
785
+ padding: 6px 8px;
786
+ border: 1px solid var(--db-input-border);
787
+ border-radius: 4px;
788
+ outline: none;
789
+ background: var(--db-bg);
790
+ color: var(--db-text);
791
+ font: inherit;
792
+ }
793
+
794
+ .db-workspace-create-input:focus-visible {
795
+ border-color: var(--db-accent);
796
+ outline: 2px solid var(--db-focus);
797
+ outline-offset: 1px;
798
+ }
799
+
800
+ .db-workspace-create-input[aria-invalid='true'] {
801
+ border-color: var(--db-danger);
802
+ }
803
+
804
+ .db-workspace-create-error {
805
+ margin: 6px 0 0;
806
+ color: var(--db-danger);
807
+ font-size: 11px;
808
+ line-height: 1.35;
809
+ }
810
+
811
+ .db-workspace-create-actions {
812
+ display: flex;
813
+ justify-content: flex-end;
814
+ gap: 6px;
815
+ margin-top: 9px;
816
+ }
817
+
818
+ .db-workspace-create-actions button {
819
+ padding: 5px 10px;
820
+ border: 1px solid var(--db-accent);
821
+ border-radius: 4px;
822
+ background: var(--db-accent);
823
+ color: var(--db-text-on-accent);
824
+ font: inherit;
825
+ font-weight: 600;
826
+ cursor: pointer;
827
+ }
828
+
829
+ .db-workspace-create-actions button:focus-visible {
830
+ outline: 2px solid var(--db-focus);
831
+ outline-offset: 1px;
832
+ }
833
+
834
+ .db-workspace-create-actions button:disabled {
835
+ cursor: default;
836
+ opacity: 0.6;
837
+ }
838
+
839
+ .db-workspace-create-actions .db-workspace-create-cancel {
840
+ border-color: var(--db-border-strong);
841
+ background: var(--db-bg);
842
+ color: var(--db-text-secondary);
843
+ }
844
+
569
845
  /* ── App Menu ────────────────────────────────────────────────── */
570
846
 
571
847
  .db-app-menu {
@@ -929,6 +1205,142 @@ body.db-resizing-sidebar * {
929
1205
  border-right: none;
930
1206
  }
931
1207
 
1208
+ .db-shell--mobile:has(.db-mobile-first-run) .db-file-explorer {
1209
+ flex: 0 0 170px;
1210
+ height: 170px;
1211
+ min-height: 170px;
1212
+ }
1213
+
1214
+ .db-mobile-first-run {
1215
+ flex: 0 0 auto;
1216
+ margin: 12px 12px auto;
1217
+ padding: 20px;
1218
+ border: 1px solid var(--db-border-strong);
1219
+ border-radius: 14px;
1220
+ background:
1221
+ radial-gradient(circle at 92% 4%, var(--db-accent-soft-15), transparent 42%),
1222
+ var(--db-bg-subtle);
1223
+ box-shadow: 0 12px 30px var(--db-shadow);
1224
+ }
1225
+
1226
+ .db-mobile-first-run-eyebrow {
1227
+ margin: 0 0 7px;
1228
+ color: var(--db-accent);
1229
+ font-size: 10px;
1230
+ font-weight: 700;
1231
+ letter-spacing: 0.1em;
1232
+ text-transform: uppercase;
1233
+ }
1234
+
1235
+ .db-mobile-first-run h1 {
1236
+ margin: 0;
1237
+ color: var(--db-text);
1238
+ font-size: 23px;
1239
+ line-height: 1.2;
1240
+ }
1241
+
1242
+ .db-mobile-first-run > p:not(.db-mobile-first-run-eyebrow) {
1243
+ margin: 10px 0 0;
1244
+ color: var(--db-text-secondary);
1245
+ font-size: 13px;
1246
+ line-height: 1.5;
1247
+ }
1248
+
1249
+ .db-mobile-first-run-actions {
1250
+ display: flex;
1251
+ flex-direction: column;
1252
+ gap: 8px;
1253
+ margin-top: 17px;
1254
+ }
1255
+
1256
+ .db-mobile-first-run-actions button {
1257
+ min-height: 42px;
1258
+ padding: 8px 12px;
1259
+ border: 1px solid var(--db-accent);
1260
+ border-radius: 7px;
1261
+ background: var(--db-accent);
1262
+ color: var(--db-text-on-accent);
1263
+ font: inherit;
1264
+ font-weight: 600;
1265
+ cursor: pointer;
1266
+ }
1267
+
1268
+ .db-mobile-first-run-actions button:hover {
1269
+ border-color: var(--db-accent-hover);
1270
+ background: var(--db-accent-hover);
1271
+ }
1272
+
1273
+ .db-mobile-first-run-actions .db-mobile-first-run-secondary {
1274
+ border-color: var(--db-border-strong);
1275
+ background: var(--db-bg);
1276
+ color: var(--db-text-secondary);
1277
+ }
1278
+
1279
+ .db-mobile-first-run-actions .db-mobile-first-run-secondary:hover {
1280
+ border-color: var(--db-accent);
1281
+ background: var(--db-bg-hover);
1282
+ }
1283
+
1284
+ .db-mobile-first-run-actions button:focus-visible {
1285
+ outline: 2px solid var(--db-focus);
1286
+ outline-offset: 2px;
1287
+ }
1288
+
1289
+ /* The compact editor uses two deliberate toolbar rows: navigation/views on
1290
+ top and actions below. Squisq's formatting actions remain available through
1291
+ its measured More menu; hiding their inline copies removes clipped,
1292
+ keyboard-focusable controls while leaving room for versioning, document
1293
+ settings, Files, and DocBlocks' Export and share control. */
1294
+ .db-shell--mobile .squisq-toolbar {
1295
+ min-height: 88px;
1296
+ flex-wrap: wrap;
1297
+ align-content: stretch;
1298
+ padding-right: 0;
1299
+ }
1300
+
1301
+ .db-shell--mobile .squisq-toolbar > .db-mobile-back {
1302
+ box-sizing: border-box;
1303
+ flex: 0 0 44px;
1304
+ height: 44px;
1305
+ justify-content: center;
1306
+ padding: 6px 10px;
1307
+ }
1308
+
1309
+ .db-shell--mobile .squisq-toolbar-view-tabs {
1310
+ box-sizing: border-box;
1311
+ flex: 1 0 calc(100% - 45px);
1312
+ width: calc(100% - 45px);
1313
+ min-width: 0;
1314
+ height: 44px;
1315
+ }
1316
+
1317
+ .db-shell--mobile .squisq-toolbar-actions {
1318
+ flex: 0 1 0;
1319
+ width: 0;
1320
+ height: 44px;
1321
+ }
1322
+
1323
+ .db-shell--mobile .squisq-toolbar-actions > * {
1324
+ visibility: hidden;
1325
+ }
1326
+
1327
+ .db-shell--mobile .squisq-toolbar-overflow,
1328
+ .db-shell--mobile .squisq-toolbar > .squisq-toolbar-button,
1329
+ .db-shell--mobile .squisq-toolbar > .db-toolbar-menu {
1330
+ flex: 0 0 auto;
1331
+ }
1332
+
1333
+ /* The compact layout moves Squisq's overflow trigger to the left edge of
1334
+ the second row. Its desktop right-aligned placement can consequently put
1335
+ the menu off-canvas, so anchor the mobile popover to the viewport instead. */
1336
+ .db-shell--mobile .squisq-editor-shell .squisq-toolbar-overflow-menu {
1337
+ right: auto !important;
1338
+ left: max(4px, env(safe-area-inset-left)) !important;
1339
+ max-width: calc(100vw - 8px);
1340
+ max-height: calc(100dvh - 96px);
1341
+ overflow-y: auto;
1342
+ }
1343
+
932
1344
  .db-mobile-back {
933
1345
  display: flex;
934
1346
  align-items: center;
@@ -947,9 +1359,122 @@ body.db-resizing-sidebar * {
947
1359
  background: var(--db-bg-hover);
948
1360
  }
949
1361
 
950
- .db-mobile-back-arrow {
951
- font-size: 18px;
952
- line-height: 1;
1362
+ .db-mobile-files-icon {
1363
+ display: inline-flex;
1364
+ align-items: center;
1365
+ justify-content: center;
1366
+ flex-shrink: 0;
1367
+ }
1368
+
1369
+ .db-mobile-files-icon svg {
1370
+ width: 24px;
1371
+ height: 24px;
1372
+ }
1373
+
1374
+ .db-shell-empty--workspace {
1375
+ position: relative;
1376
+ box-sizing: border-box;
1377
+ flex-direction: column;
1378
+ padding: 32px;
1379
+ background:
1380
+ radial-gradient(circle at 50% 38%, var(--db-accent-soft-08), transparent 44%), var(--db-bg);
1381
+ }
1382
+
1383
+ .db-shell-empty--workspace > .db-mobile-back {
1384
+ position: absolute;
1385
+ top: 0;
1386
+ left: 0;
1387
+ right: 0;
1388
+ justify-content: flex-start;
1389
+ padding: 10px 12px;
1390
+ border-bottom: 1px solid var(--db-border);
1391
+ border-radius: 0;
1392
+ background: var(--db-bg-subtle);
1393
+ }
1394
+
1395
+ .db-workspace-empty-content {
1396
+ display: flex;
1397
+ width: min(460px, 100%);
1398
+ flex-direction: column;
1399
+ align-items: center;
1400
+ text-align: center;
1401
+ }
1402
+
1403
+ .db-workspace-empty-icon {
1404
+ display: inline-flex;
1405
+ align-items: center;
1406
+ justify-content: center;
1407
+ width: 52px;
1408
+ height: 52px;
1409
+ margin-bottom: 14px;
1410
+ border: 1px solid var(--db-border-strong);
1411
+ border-radius: 14px;
1412
+ background: var(--db-bg-subtle);
1413
+ color: var(--db-accent-deep);
1414
+ }
1415
+
1416
+ .db-workspace-empty-icon svg {
1417
+ width: 26px;
1418
+ height: 26px;
1419
+ }
1420
+
1421
+ .db-workspace-empty-content h1 {
1422
+ margin: 0;
1423
+ color: var(--db-text);
1424
+ font-size: 21px;
1425
+ line-height: 1.25;
1426
+ }
1427
+
1428
+ .db-workspace-empty-content > p {
1429
+ max-width: 390px;
1430
+ margin: 9px 0 0;
1431
+ color: var(--db-text-muted);
1432
+ line-height: 1.5;
1433
+ }
1434
+
1435
+ .db-workspace-empty-actions {
1436
+ display: flex;
1437
+ flex-wrap: wrap;
1438
+ justify-content: center;
1439
+ gap: 8px;
1440
+ margin-top: 20px;
1441
+ }
1442
+
1443
+ .db-workspace-empty-actions button {
1444
+ padding: 8px 13px;
1445
+ border: 1px solid var(--db-accent);
1446
+ border-radius: 5px;
1447
+ background: var(--db-accent);
1448
+ color: var(--db-text-on-accent);
1449
+ font: inherit;
1450
+ font-weight: 600;
1451
+ cursor: pointer;
1452
+ }
1453
+
1454
+ .db-workspace-empty-actions button:hover {
1455
+ border-color: var(--db-accent-hover);
1456
+ background: var(--db-accent-hover);
1457
+ }
1458
+
1459
+ .db-workspace-empty-actions button:focus-visible {
1460
+ outline: 2px solid var(--db-focus);
1461
+ outline-offset: 2px;
1462
+ }
1463
+
1464
+ .db-workspace-empty-actions .db-workspace-empty-secondary {
1465
+ border-color: var(--db-border-strong);
1466
+ background: var(--db-bg);
1467
+ color: var(--db-text-secondary);
1468
+ }
1469
+
1470
+ .db-workspace-empty-actions .db-workspace-empty-secondary:hover {
1471
+ border-color: var(--db-accent);
1472
+ background: var(--db-bg-hover);
1473
+ }
1474
+
1475
+ .db-workspace-empty-content .db-workspace-empty-hint {
1476
+ margin-top: 18px;
1477
+ font-size: 12px;
953
1478
  }
954
1479
 
955
1480
  /* In folder/empty views, the back button sits as a standalone bar */
@@ -991,16 +1516,23 @@ body.db-resizing-sidebar * {
991
1516
  display: flex;
992
1517
  align-items: center;
993
1518
  justify-content: center;
1519
+ box-sizing: border-box;
1520
+ padding: 16px;
994
1521
  background: rgba(0, 0, 0, 0.4);
995
1522
  }
996
1523
 
997
1524
  .db-dialog {
1525
+ box-sizing: border-box;
998
1526
  background: var(--db-bg);
999
1527
  border: 1px solid var(--db-border);
1000
1528
  border-radius: 8px;
1001
1529
  box-shadow: 0 8px 32px var(--db-shadow);
1002
1530
  width: 380px;
1003
- max-width: 90vw;
1531
+ max-width: 100%;
1532
+ max-height: calc(100vh - 32px);
1533
+ max-height: calc(100dvh - 32px);
1534
+ display: flex;
1535
+ flex-direction: column;
1004
1536
  }
1005
1537
 
1006
1538
  .db-dialog-header {
@@ -1035,6 +1567,8 @@ body.db-resizing-sidebar * {
1035
1567
  }
1036
1568
 
1037
1569
  .db-dialog-body {
1570
+ min-height: 0;
1571
+ overflow-y: auto;
1038
1572
  padding: 16px 20px 20px;
1039
1573
  font-size: 13px;
1040
1574
  line-height: 1.6;
@@ -1058,10 +1592,35 @@ body.db-resizing-sidebar * {
1058
1592
  text-decoration: underline;
1059
1593
  }
1060
1594
 
1061
- .db-dialog-links {
1595
+ .db-dialog-links {
1596
+ display: flex;
1597
+ flex-wrap: wrap;
1598
+ align-items: center;
1599
+ gap: 6px;
1600
+ }
1601
+
1602
+ .db-about-version {
1062
1603
  display: flex;
1063
1604
  align-items: center;
1064
- gap: 6px;
1605
+ gap: 8px;
1606
+ padding: 8px 10px;
1607
+ border: 1px solid var(--db-border);
1608
+ border-radius: 5px;
1609
+ background: var(--db-bg-subtle);
1610
+ }
1611
+
1612
+ .db-about-version span {
1613
+ color: var(--db-text-muted);
1614
+ font-size: 11px;
1615
+ font-weight: 600;
1616
+ letter-spacing: 0.04em;
1617
+ text-transform: uppercase;
1618
+ }
1619
+
1620
+ .db-about-version code {
1621
+ color: var(--db-text);
1622
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1623
+ user-select: all;
1065
1624
  }
1066
1625
 
1067
1626
  .db-dialog-sep {
@@ -1135,12 +1694,70 @@ body.db-resizing-sidebar * {
1135
1694
  accent-color: var(--db-accent);
1136
1695
  }
1137
1696
 
1697
+ .db-settings-slider {
1698
+ display: flex;
1699
+ flex-direction: column;
1700
+ gap: 6px;
1701
+ color: var(--db-text);
1702
+ font-size: 13px;
1703
+ }
1704
+
1705
+ .db-settings-slider + .db-settings-slider {
1706
+ margin-top: 14px;
1707
+ }
1708
+
1709
+ .db-settings-slider-header {
1710
+ display: flex;
1711
+ align-items: baseline;
1712
+ justify-content: space-between;
1713
+ gap: 16px;
1714
+ }
1715
+
1716
+ .db-settings-slider-value {
1717
+ color: var(--db-text-muted);
1718
+ font-variant-numeric: tabular-nums;
1719
+ }
1720
+
1721
+ .db-settings-slider input[type='range'] {
1722
+ width: 100%;
1723
+ margin: 0;
1724
+ accent-color: var(--db-accent);
1725
+ cursor: pointer;
1726
+ }
1727
+
1138
1728
  .db-settings-accent-grid {
1139
1729
  display: grid;
1140
- grid-template-columns: repeat(2, minmax(0, 1fr));
1730
+ grid-template-columns: repeat(auto-fit, minmax(104px, 1fr));
1141
1731
  gap: 6px;
1142
1732
  }
1143
1733
 
1734
+ .db-settings-action {
1735
+ margin-top: 4px;
1736
+ padding: 7px 12px;
1737
+ border: 1px solid var(--db-accent);
1738
+ border-radius: 5px;
1739
+ background: var(--db-accent);
1740
+ color: var(--db-text-on-accent);
1741
+ font: inherit;
1742
+ font-weight: 600;
1743
+ cursor: pointer;
1744
+ }
1745
+
1746
+ .db-settings-action:hover:not(:disabled) {
1747
+ border-color: var(--db-accent-hover);
1748
+ background: var(--db-accent-hover);
1749
+ }
1750
+
1751
+ .db-settings-action:focus-visible {
1752
+ outline: 2px solid var(--db-focus, var(--db-accent));
1753
+ outline-offset: 2px;
1754
+ }
1755
+
1756
+ .db-settings-action:disabled {
1757
+ opacity: 0.6;
1758
+ cursor: default;
1759
+ }
1760
+
1144
1761
  .db-settings-accent {
1145
1762
  position: relative;
1146
1763
  display: flex;
@@ -1340,18 +1957,20 @@ body.db-resizing-sidebar * {
1340
1957
 
1341
1958
  .db-toolbar-menu {
1342
1959
  position: relative;
1960
+ margin-left: 6px;
1961
+ padding-left: 7px;
1962
+ border-left: 1px solid var(--db-border);
1343
1963
  }
1344
1964
 
1345
1965
  .db-toolbar-menu-trigger {
1346
1966
  display: flex;
1347
1967
  align-items: center;
1348
1968
  justify-content: center;
1349
- width: 28px;
1969
+ gap: 5px;
1970
+ width: auto;
1971
+ min-width: 28px;
1350
1972
  height: 28px;
1351
- padding: 0;
1352
- font-size: 16px;
1353
- font-weight: 700;
1354
- letter-spacing: 1px;
1973
+ padding: 0 8px;
1355
1974
  line-height: 1;
1356
1975
  border: 1px solid transparent;
1357
1976
  border-radius: 4px;
@@ -1360,6 +1979,31 @@ body.db-resizing-sidebar * {
1360
1979
  color: var(--db-text-muted);
1361
1980
  }
1362
1981
 
1982
+ .db-toolbar-menu-trigger svg {
1983
+ flex: 0 0 auto;
1984
+ width: 18px;
1985
+ height: 18px;
1986
+ }
1987
+
1988
+ .db-toolbar-menu-trigger-label {
1989
+ font-size: 12px;
1990
+ font-weight: 600;
1991
+ }
1992
+
1993
+ .db-shell--mobile .db-toolbar-menu {
1994
+ margin-left: 2px;
1995
+ padding-left: 3px;
1996
+ }
1997
+
1998
+ .db-shell--mobile .db-toolbar-menu-trigger {
1999
+ width: 28px;
2000
+ padding: 0;
2001
+ }
2002
+
2003
+ .db-shell--mobile .db-toolbar-menu-trigger-label {
2004
+ display: none;
2005
+ }
2006
+
1363
2007
  .db-toolbar-menu-trigger:hover {
1364
2008
  background: var(--db-bg-hover);
1365
2009
  border-color: var(--db-border);
@@ -1411,10 +2055,17 @@ body.db-resizing-sidebar * {
1411
2055
  white-space: nowrap;
1412
2056
  }
1413
2057
 
1414
- .db-toolbar-menu-item:hover {
2058
+ .db-toolbar-menu-item:hover,
2059
+ .db-toolbar-menu-item:focus-visible {
1415
2060
  background: var(--db-bg-hover);
1416
2061
  }
1417
2062
 
2063
+ /* Arrow-reachable, not a tab stop — see .db-git-menu-item:focus-visible. */
2064
+ .db-toolbar-menu-item:focus-visible {
2065
+ outline: 2px solid var(--db-focus);
2066
+ outline-offset: -2px;
2067
+ }
2068
+
1418
2069
  .db-toolbar-menu-item:disabled {
1419
2070
  opacity: 0.5;
1420
2071
  cursor: default;
@@ -1491,6 +2142,10 @@ body.db-resizing-sidebar * {
1491
2142
  border-color: var(--db-accent);
1492
2143
  }
1493
2144
 
2145
+ .db-export-path-input[aria-invalid='true'] {
2146
+ border-color: var(--db-danger);
2147
+ }
2148
+
1494
2149
  .db-export-path-pick {
1495
2150
  flex: 0 0 auto;
1496
2151
  height: 30px;
@@ -1522,6 +2177,10 @@ body.db-resizing-sidebar * {
1522
2177
  color: var(--db-text-placeholder);
1523
2178
  }
1524
2179
 
2180
+ .db-export-hint--error {
2181
+ color: var(--db-danger);
2182
+ }
2183
+
1525
2184
  .db-export-checkbox {
1526
2185
  display: inline-flex;
1527
2186
  align-items: center;
@@ -1591,6 +2250,20 @@ body.db-resizing-sidebar * {
1591
2250
  border-top: 1px solid var(--db-border);
1592
2251
  }
1593
2252
 
2253
+ .db-export-more-formats {
2254
+ margin: 4px 0 0;
2255
+ padding-top: 12px;
2256
+ border-top: 1px solid var(--db-border);
2257
+ color: var(--db-text-muted);
2258
+ font-size: 12px;
2259
+ line-height: 1.5;
2260
+ }
2261
+
2262
+ .db-export-more-formats a {
2263
+ color: var(--db-accent);
2264
+ font-weight: 600;
2265
+ }
2266
+
1594
2267
  .db-export-btn {
1595
2268
  padding: 6px 16px;
1596
2269
  font-size: 13px;
@@ -1627,6 +2300,53 @@ body.db-resizing-sidebar * {
1627
2300
  color: var(--db-text-on-accent);
1628
2301
  }
1629
2302
 
2303
+ /* Shared-document links intentionally resemble export because they package a
2304
+ bounded Markdown-only DBK; the warning is the critical distinction. */
2305
+ .db-share-dialog {
2306
+ width: 480px;
2307
+ }
2308
+
2309
+ .db-share-warning {
2310
+ margin-bottom: 16px;
2311
+ padding: 10px 12px;
2312
+ color: var(--db-text);
2313
+ background: color-mix(in srgb, var(--db-accent) 12%, var(--db-bg-subtle));
2314
+ border: 1px solid var(--db-accent);
2315
+ border-radius: 5px;
2316
+ }
2317
+
2318
+ .db-share-link {
2319
+ display: block;
2320
+ width: 100%;
2321
+ min-height: 72px;
2322
+ box-sizing: border-box;
2323
+ resize: vertical;
2324
+ padding: 8px;
2325
+ font:
2326
+ 11px/1.45 ui-monospace,
2327
+ SFMono-Regular,
2328
+ Consolas,
2329
+ monospace;
2330
+ color: var(--db-text);
2331
+ background: var(--db-bg-subtle);
2332
+ border: 1px solid var(--db-border);
2333
+ border-radius: 4px;
2334
+ outline: none;
2335
+ overflow-wrap: anywhere;
2336
+ }
2337
+
2338
+ .db-share-link:focus {
2339
+ border-color: var(--db-accent);
2340
+ }
2341
+
2342
+ .db-share-length-warning {
2343
+ color: var(--db-danger, #a33a35);
2344
+ }
2345
+
2346
+ .db-share-temporary-note {
2347
+ color: var(--db-text-muted);
2348
+ }
2349
+
1630
2350
  /* ── Squisq editor chrome separators ─────────────────────────── */
1631
2351
  /* Strengthen the dividers so the toolbar, tabs, and editor body
1632
2352
  read as three distinct zones instead of near-identical whites. */
@@ -1656,6 +2376,25 @@ body.db-resizing-sidebar * {
1656
2376
  background: var(--db-editor-canvas);
1657
2377
  }
1658
2378
 
2379
+ /* Bind Squisq's host-facing accent to the active DocBlocks appearance. */
2380
+ .db-shell .squisq-editor-shell {
2381
+ --squisq-accent: var(--db-accent);
2382
+ --squisq-accent-hover: var(--db-accent-hover);
2383
+ --squisq-text-on-accent: var(--db-text-on-accent);
2384
+ }
2385
+
2386
+ /* Simple diagrams, drawings, and layout canvases share Squisq's Scene
2387
+ engine. Keep canvas and raised-control surfaces on the same DocBlocks
2388
+ palette instead of falling back to slate. */
2389
+ .db-shell .squisq-editor-shell .squisq-scene-shell {
2390
+ --squisq-surface: var(--db-editor-canvas);
2391
+ --squisq-surface-raised: var(--db-bg-subtle);
2392
+ --squisq-surface-hover: var(--db-bg-hover);
2393
+ --squisq-border: var(--db-border-strong);
2394
+ --squisq-text: var(--db-text);
2395
+ --squisq-text-muted: var(--db-text-muted);
2396
+ }
2397
+
1659
2398
  /* ── Inline preview gutter: thematic green ──────────────────── */
1660
2399
  /* Rebind squisq's `--squisq-preview-*` custom properties so the
1661
2400
  gutter chrome (vertical bracket, diagonal connector + dots,
@@ -1792,6 +2531,102 @@ body.db-resizing-sidebar * {
1792
2531
  background: var(--db-bg);
1793
2532
  }
1794
2533
 
2534
+ /* Squisq's media bin ships with a fixed blue-slate palette. Bind the full
2535
+ pane to DocBlocks' appearance tokens so its surface and controls follow
2536
+ the selected accent in both light and dark themes. */
2537
+ .db-shell .squisq-editor-shell .squisq-media-bin {
2538
+ background: var(--db-bg-subtle);
2539
+ border-left-color: var(--db-border);
2540
+ color: var(--db-text);
2541
+ scrollbar-color: var(--db-border-strong) var(--db-bg-subtle);
2542
+ }
2543
+
2544
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-header {
2545
+ border-bottom-color: var(--db-border);
2546
+ }
2547
+
2548
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-title {
2549
+ color: var(--db-text-secondary);
2550
+ }
2551
+
2552
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-upload {
2553
+ background: var(--db-accent-tint-strong);
2554
+ border-color: var(--db-border);
2555
+ color: var(--db-text-secondary);
2556
+ }
2557
+
2558
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-upload:hover {
2559
+ background: var(--db-bg-hover);
2560
+ border-color: var(--db-border-strong);
2561
+ }
2562
+
2563
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-empty,
2564
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-size {
2565
+ color: var(--db-text-muted);
2566
+ }
2567
+
2568
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-item {
2569
+ border-bottom-color: var(--db-border);
2570
+ color: var(--db-text-secondary);
2571
+ }
2572
+
2573
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-item:hover,
2574
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-item:focus-visible {
2575
+ background: var(--db-bg-hover);
2576
+ }
2577
+
2578
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-item:focus-visible {
2579
+ outline-color: var(--db-accent);
2580
+ }
2581
+
2582
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-thumb,
2583
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-icon {
2584
+ background: var(--db-accent-tint-strong);
2585
+ }
2586
+
2587
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-drop-target {
2588
+ background: color-mix(in srgb, var(--db-bg-subtle) 92%, var(--db-accent));
2589
+ border-color: var(--db-accent);
2590
+ color: var(--db-accent-deep);
2591
+ }
2592
+
2593
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-drop-target-icon {
2594
+ background: var(--db-accent);
2595
+ color: var(--db-text-on-accent);
2596
+ }
2597
+
2598
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-drop-target span:last-child {
2599
+ color: var(--db-text-muted);
2600
+ }
2601
+
2602
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu {
2603
+ background: var(--db-bg);
2604
+ border-color: var(--db-border);
2605
+ box-shadow: 0 12px 28px var(--db-shadow);
2606
+ }
2607
+
2608
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item {
2609
+ color: var(--db-text-secondary);
2610
+ }
2611
+
2612
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item:hover,
2613
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item:focus-visible {
2614
+ background: var(--db-bg-hover);
2615
+ }
2616
+
2617
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item--danger {
2618
+ color: var(--db-danger);
2619
+ }
2620
+
2621
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item--danger:hover,
2622
+ .db-shell
2623
+ .squisq-editor-shell
2624
+ .squisq-media-bin
2625
+ .squisq-media-bin-context-menu-item--danger:focus-visible {
2626
+ background: var(--db-danger-bg);
2627
+ color: var(--db-danger);
2628
+ }
2629
+
1795
2630
  /* ── Squisq accent override (blue → thematic green) ──────────── */
1796
2631
 
1797
2632
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-view-tab--active {
@@ -1943,8 +2778,9 @@ html:has(.db-shell[data-theme='dark']) .squisq-tooltip {
1943
2778
  /* The gallery popover renders into document.body via createPortal, so
1944
2779
  neither .db-shell nor .squisq-editor-shell are ancestors. We use
1945
2780
  `html:has(.db-shell[data-theme='dark'])` to detect docblocks' dark
1946
- theme from outside the shell, then style the portaled gallery (its
1947
- root has id="squisq-template-gallery-portal"). */
2781
+ theme from outside the shell, then bind the portaled dialog through
2782
+ Squisq's stable `data-squisq-template-gallery-portal` marker. Dialog
2783
+ and gallery ids are intentionally instance-specific. */
1948
2784
 
1949
2785
  .db-shell[data-theme='dark']
1950
2786
  .squisq-editor-shell[data-theme='dark']
@@ -1968,6 +2804,7 @@ html:has(.db-shell[data-theme='dark']) {
1968
2804
  --db-text-muted: #a89a7c;
1969
2805
  --db-danger: #f87171;
1970
2806
  --db-danger-bg: #1c1917;
2807
+ --db-text-on-danger: #1c1917;
1971
2808
  --db-shadow: rgba(0, 0, 0, 0.4);
1972
2809
  --db-accent: #c8b48f;
1973
2810
  --db-accent-hover: #dec79d;
@@ -1988,6 +2825,7 @@ html:has(.db-shell[data-theme='light']) {
1988
2825
  --db-text-muted: #6b614a;
1989
2826
  --db-danger: #b22b1b;
1990
2827
  --db-danger-bg: #fdf0ee;
2828
+ --db-text-on-danger: #ffffff;
1991
2829
  --db-shadow: rgba(40, 30, 15, 0.12);
1992
2830
  --db-accent: #7d6948;
1993
2831
  --db-accent-hover: #5e4f37;
@@ -2325,6 +3163,35 @@ html:has(.db-shell[data-theme='dark'][data-accent='gray']) {
2325
3163
  --db-badge-text-hover: #ffffff;
2326
3164
  }
2327
3165
 
3166
+ /* Convert/Insert is portaled to document.body, so the editor shell's Squisq
3167
+ overrides cannot reach it. The active DocBlocks palette is already hoisted
3168
+ to html above; consume it here so every accent and appearance produces the
3169
+ same menu surfaces as the rest of the shell. The selector also covers the
3170
+ nested Mermaid and code-snippet menus, which share this portal class. */
3171
+ html:has(.db-shell) .squisq-insert-menu {
3172
+ background: var(--db-bg);
3173
+ border-color: var(--db-border);
3174
+ color: var(--db-text-secondary);
3175
+ box-shadow: 0 4px 12px var(--db-shadow);
3176
+ }
3177
+
3178
+ html:has(.db-shell) .squisq-insert-menu .squisq-toolbar-overflow-item {
3179
+ color: var(--db-text-secondary);
3180
+ }
3181
+
3182
+ html:has(.db-shell) .squisq-insert-menu .squisq-toolbar-overflow-item:hover,
3183
+ html:has(.db-shell) .squisq-insert-menu .squisq-toolbar-overflow-item:focus-visible {
3184
+ background: var(--db-bg-hover);
3185
+ }
3186
+
3187
+ html:has(.db-shell) .squisq-insert-menu .squisq-insert-menu-header {
3188
+ color: var(--db-text-muted);
3189
+ }
3190
+
3191
+ html:has(.db-shell) .squisq-insert-menu .squisq-insert-menu-header--separated {
3192
+ border-top-color: var(--db-border);
3193
+ }
3194
+
2328
3195
  html:has(.db-shell[data-theme='light']:not([data-accent='brown'])) .squisq-tooltip {
2329
3196
  background: var(--db-accent-deep);
2330
3197
  color: var(--db-bg-subtle);
@@ -2336,7 +3203,7 @@ html:has(.db-shell[data-theme='dark']:not([data-accent='brown'])) .squisq-toolti
2336
3203
  }
2337
3204
 
2338
3205
  html:has(.db-shell[data-theme='dark'])
2339
- #squisq-template-gallery-dialog.squisq-template-gallery-dialog[data-theme='dark'] {
3206
+ .squisq-template-gallery-dialog[data-theme='dark']:has([data-squisq-template-gallery-portal]) {
2340
3207
  --squisq-template-gallery-backdrop: var(--db-gallery-backdrop, rgba(18, 14, 9, 0.58));
2341
3208
  --squisq-template-gallery-panel-bg: var(--db-gallery-panel-bg, var(--db-bg));
2342
3209
  --squisq-template-gallery-panel-border: var(--db-border);
@@ -2390,7 +3257,7 @@ html:has(.db-shell[data-theme='dark'])
2390
3257
  }
2391
3258
 
2392
3259
  html:has(.db-shell[data-theme='light'])
2393
- #squisq-template-gallery-dialog.squisq-template-gallery-dialog[data-theme='light'] {
3260
+ .squisq-template-gallery-dialog[data-theme='light']:has([data-squisq-template-gallery-portal]) {
2394
3261
  --squisq-template-gallery-backdrop: var(--db-gallery-backdrop, rgba(42, 36, 25, 0.24));
2395
3262
  --squisq-template-gallery-panel-bg: var(--db-gallery-panel-bg, #fffdf7);
2396
3263
  --squisq-template-gallery-panel-border: var(--db-border);
@@ -2769,7 +3636,7 @@ html:has(.db-shell[data-theme='dark'])
2769
3636
  }
2770
3637
 
2771
3638
  .db-shell .squisq-props-badge {
2772
- transform: translateY(1px);
3639
+ transform: none;
2773
3640
  }
2774
3641
 
2775
3642
  .db-shell .squisq-template-badge-core::after {
@@ -2965,7 +3832,7 @@ html:has(.db-shell[data-theme='dark'])
2965
3832
 
2966
3833
  /* Status bar "✓ OK" indicator — squisq paints this in saturated emerald
2967
3834
  (#059669 light, #34d399 dark). Re-tone to the sage accent so the
2968
- parse-status indicator harmonizes with the rest of the chrome. */
3835
+ status indicator harmonizes with the rest of the chrome. */
2969
3836
  .db-shell .squisq-status-ok {
2970
3837
  color: var(--db-accent);
2971
3838
  }
@@ -2974,6 +3841,10 @@ html:has(.db-shell[data-theme='dark'])
2974
3841
  color: var(--db-accent-hover);
2975
3842
  }
2976
3843
 
3844
+ .db-autosave-pending {
3845
+ opacity: 0.62;
3846
+ }
3847
+
2977
3848
  /* Outline pane (left of the editor) — squisq paints a warm beige
2978
3849
  (#dcd8d0 light / dark slate in dark mode). Re-tone to `--db-gutter-bg`
2979
3850
  so it matches the inline-preview gutter on the right and reads as
@@ -3232,7 +4103,7 @@ html:has(.db-shell[data-theme='dark'])
3232
4103
  font-size: 13px;
3233
4104
  font-weight: 600;
3234
4105
  background: var(--db-accent);
3235
- color: var(--db-bg);
4106
+ color: var(--db-text-on-accent);
3236
4107
  border: none;
3237
4108
  border-radius: 6px;
3238
4109
  cursor: pointer;
@@ -3266,11 +4137,9 @@ html:has(.db-shell[data-theme='dark'])
3266
4137
 
3267
4138
  @keyframes db-welcome-gateway-in {
3268
4139
  from {
3269
- opacity: 0;
3270
4140
  transform: translate(-50%, 8px);
3271
4141
  }
3272
4142
  to {
3273
- opacity: 1;
3274
4143
  transform: translate(-50%, 0);
3275
4144
  }
3276
4145
  }
@@ -3336,7 +4205,7 @@ html:has(.db-shell[data-theme='dark'])
3336
4205
  }
3337
4206
 
3338
4207
  /* Browser PWA update notice. It is docked over the right side of Squisq's
3339
- status bar, while extra status-bar padding keeps the parse result visible.
4208
+ status bar, while extra status-bar padding keeps its contents visible.
3340
4209
  If the status bar is hidden, it becomes a compact floating badge so the
3341
4210
  waiting update remains reachable. */
3342
4211
  .db-shell-editor-area--has-update .squisq-status-bar {
@@ -3489,7 +4358,7 @@ html:has(.db-shell[data-theme='dark'])
3489
4358
  /* Dialog size modifiers (shared Dialog component) */
3490
4359
  .db-dialog--wide {
3491
4360
  width: 560px;
3492
- max-width: 94vw;
4361
+ max-width: 100%;
3493
4362
  }
3494
4363
 
3495
4364
  .db-dialog--full {
@@ -3536,6 +4405,19 @@ html:has(.db-shell[data-theme='dark'])
3536
4405
  cursor: default;
3537
4406
  }
3538
4407
 
4408
+ /* Destructive confirmation (delete, remove workspace). The foreground comes
4409
+ from a token rather than a literal because the two themes need opposite ink:
4410
+ light's danger is deep red and carries white at ~6.5:1, while dark's is a
4411
+ light red where white would fall to ~2.8:1 and fail WCAG AA. */
4412
+ .db-git-primary-btn--danger {
4413
+ background: var(--db-danger);
4414
+ color: var(--db-text-on-danger);
4415
+ }
4416
+
4417
+ .db-git-primary-btn--danger:hover:not(:disabled) {
4418
+ background: color-mix(in srgb, var(--db-danger) 85%, black);
4419
+ }
4420
+
3539
4421
  .db-git-secondary-btn {
3540
4422
  padding: 6px 14px;
3541
4423
  border: 1px solid var(--db-border-strong);
@@ -3642,10 +4524,18 @@ html:has(.db-shell[data-theme='dark'])
3642
4524
  cursor: pointer;
3643
4525
  }
3644
4526
 
3645
- .db-git-menu-item:hover:not(:disabled) {
4527
+ .db-git-menu-item:hover:not(:disabled),
4528
+ .db-git-menu-item:focus-visible {
3646
4529
  background: var(--db-bg-hover);
3647
4530
  }
3648
4531
 
4532
+ /* Items are arrow-reachable rather than tab stops, so the ring is the only
4533
+ cue to which one Enter will fire. */
4534
+ .db-git-menu-item:focus-visible {
4535
+ outline: 2px solid var(--db-focus);
4536
+ outline-offset: -2px;
4537
+ }
4538
+
3649
4539
  .db-git-menu-item:disabled {
3650
4540
  color: var(--db-text-placeholder);
3651
4541
  cursor: default;
@@ -3814,7 +4704,8 @@ button.db-git-file-row:hover {
3814
4704
  box-sizing: border-box;
3815
4705
  }
3816
4706
 
3817
- .db-git-form-error {
4707
+ .db-git-form-error,
4708
+ .db-export-error {
3818
4709
  margin: 8px 0 0;
3819
4710
  color: var(--db-danger);
3820
4711
  font-size: 12.5px;
@@ -3964,6 +4855,22 @@ button.db-git-file-row:hover {
3964
4855
  color: var(--db-text-muted);
3965
4856
  }
3966
4857
 
4858
+ @media (prefers-reduced-motion: reduce) {
4859
+ .db-workspace-picker-caret,
4860
+ .db-app-menu-caret,
4861
+ .db-ws-settings-btn,
4862
+ .db-shell-sidebar-resizer,
4863
+ .db-export-chip,
4864
+ .db-git-progress-bar > span {
4865
+ transition: none;
4866
+ }
4867
+
4868
+ .db-welcome-gateway,
4869
+ .db-save-toast {
4870
+ animation: none;
4871
+ }
4872
+ }
4873
+
3967
4874
  /* History dialog internals added by the expanded-row layout */
3968
4875
  .db-git-history-toggle {
3969
4876
  display: block;
@@ -4002,14 +4909,16 @@ button.db-git-file-row:hover {
4002
4909
  block turns that row into the titlebar: draggable empty space, insets for
4003
4910
  the caption buttons, and every interactive descendant opted back out.
4004
4911
 
4005
- Ported 1:1 from the Electron build — keep in sync with
4006
- packages/desktop/renderer/titlebar.css (which is scoped under
4007
- `.db-desktop-root`; Electron windows report `display-mode: browser`, so
4008
- this media query can never double-apply there). The media query is live:
4009
- toggling the overlay chevron flips it with no JS. */
4912
+ Shares its drag/inset structure with the Electron build in
4913
+ packages/desktop/renderer/titlebar.css. Its compact vertical metrics are
4914
+ intentionally PWA-specific because Electron uses a 42px overlay while this
4915
+ mode follows the OS-provided caption height (32px on Windows). Electron is
4916
+ scoped under `.db-desktop-root` and reports `display-mode: browser`, so this
4917
+ media query can never double-apply there. The media query is live: toggling
4918
+ the overlay chevron flips it with no JS. */
4010
4919
  @media (display-mode: window-controls-overlay) {
4011
4920
  .db-shell {
4012
- --db-wco-titlebar-height: 48px;
4921
+ --db-wco-titlebar-height: env(titlebar-area-height, 32px);
4013
4922
  }
4014
4923
 
4015
4924
  /* The first shell row replaces the native titlebar. Empty space can drag
@@ -4025,10 +4934,51 @@ button.db-git-file-row:hover {
4025
4934
  }
4026
4935
 
4027
4936
  .db-shell .db-shell-sidebar-header {
4937
+ padding-block: 0;
4028
4938
  padding-left: max(4px, calc(env(titlebar-area-x, 0px) + 4px));
4029
4939
  cursor: grab;
4030
4940
  }
4031
4941
 
4942
+ /* Keep the shell controls inside the compact native caption band. These
4943
+ overrides apply only to an installed app using Window Controls Overlay;
4944
+ the regular browser toolbar keeps its roomier metrics. */
4945
+ .db-shell .db-app-menu-btn,
4946
+ .db-shell .db-workspace-picker-btn {
4947
+ padding-block: 3px;
4948
+ }
4949
+
4950
+ .db-shell .squisq-toolbar-view-tab {
4951
+ padding-top: 4px;
4952
+ padding-bottom: 2px;
4953
+ }
4954
+
4955
+ .db-shell .squisq-use-mode-trigger {
4956
+ padding-bottom: 7px;
4957
+ }
4958
+
4959
+ /* The 32px caption row leaves little room around Squisq's 28px action
4960
+ buttons. Keep the selected background clear of the header's 1px bottom
4961
+ divider without moving the glyphs off their shared center line. */
4962
+ .db-shell .squisq-toolbar-actions .squisq-toolbar-button {
4963
+ box-sizing: border-box;
4964
+ height: 26px;
4965
+ }
4966
+
4967
+ /* Squisq's overflow measurement deliberately tolerates a 2px overhang.
4968
+ Reserve one pixel beyond that tolerance so the final Insert control
4969
+ moves into More actions instead of being clipped by the caption inset. */
4970
+ .db-shell .squisq-toolbar-actions {
4971
+ margin-right: 3px;
4972
+ }
4973
+
4974
+ .db-shell .squisq-toolbar-button[aria-label='Insert image'] {
4975
+ height: 28px;
4976
+ }
4977
+
4978
+ .db-shell .squisq-editor-header--image {
4979
+ padding-block: 0;
4980
+ }
4981
+
4032
4982
  /* Make the draggable header space beside the workspace gear discoverable,
4033
4983
  matching the Electron titlebar without introducing another control. */
4034
4984
  .db-shell .db-shell-sidebar-header::after {