@bendyline/docblocks-react 1.1.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/README.md +50 -15
  2. package/dist/AppMenu/AppMenu.d.ts +29 -2
  3. package/dist/AppMenu/AppMenu.d.ts.map +1 -1
  4. package/dist/AppMenu/AppMenu.js +41 -2
  5. package/dist/AppMenu/AppMenu.js.map +1 -1
  6. package/dist/AppMenu/index.d.ts +1 -1
  7. package/dist/AppMenu/index.d.ts.map +1 -1
  8. package/dist/DocBlocksShell/DocBlocksShell.d.ts +17 -4
  9. package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +1 -1
  10. package/dist/DocBlocksShell/DocBlocksShell.js +1710 -299
  11. package/dist/DocBlocksShell/DocBlocksShell.js.map +1 -1
  12. package/dist/DocBlocksShell/LazyEditorShell.d.ts +3 -0
  13. package/dist/DocBlocksShell/LazyEditorShell.d.ts.map +1 -0
  14. package/dist/DocBlocksShell/LazyEditorShell.js +3 -0
  15. package/dist/DocBlocksShell/LazyEditorShell.js.map +1 -0
  16. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts +13 -0
  17. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts.map +1 -0
  18. package/dist/DocBlocksShell/UpdateAvailableNotice.js +16 -0
  19. package/dist/DocBlocksShell/UpdateAvailableNotice.js.map +1 -0
  20. package/dist/DocBlocksShell/document-title.d.ts +3 -0
  21. package/dist/DocBlocksShell/document-title.d.ts.map +1 -0
  22. package/dist/DocBlocksShell/document-title.js +17 -0
  23. package/dist/DocBlocksShell/document-title.js.map +1 -0
  24. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts +14 -0
  25. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts.map +1 -0
  26. package/dist/DocBlocksShell/workspace-authority-barrier.js +23 -0
  27. package/dist/DocBlocksShell/workspace-authority-barrier.js.map +1 -0
  28. package/dist/Export/DeferredExportToolbarControls.d.ts +5 -0
  29. package/dist/Export/DeferredExportToolbarControls.d.ts.map +1 -0
  30. package/dist/Export/DeferredExportToolbarControls.js +10 -0
  31. package/dist/Export/DeferredExportToolbarControls.js.map +1 -0
  32. package/dist/Export/ExportDialog.d.ts +10 -1
  33. package/dist/Export/ExportDialog.d.ts.map +1 -1
  34. package/dist/Export/ExportDialog.js +39 -20
  35. package/dist/Export/ExportDialog.js.map +1 -1
  36. package/dist/Export/ExportToolbarControls.d.ts +21 -1
  37. package/dist/Export/ExportToolbarControls.d.ts.map +1 -1
  38. package/dist/Export/ExportToolbarControls.js +161 -26
  39. package/dist/Export/ExportToolbarControls.js.map +1 -1
  40. package/dist/Export/export-destination.d.ts +3 -0
  41. package/dist/Export/export-destination.d.ts.map +1 -0
  42. package/dist/Export/export-destination.js +32 -0
  43. package/dist/Export/export-destination.js.map +1 -0
  44. package/dist/Export/index.d.ts +8 -4
  45. package/dist/Export/index.d.ts.map +1 -1
  46. package/dist/Export/index.js +4 -1
  47. package/dist/Export/index.js.map +1 -1
  48. package/dist/Export/public-api.d.ts +12 -0
  49. package/dist/Export/public-api.d.ts.map +1 -0
  50. package/dist/Export/public-api.js +9 -0
  51. package/dist/Export/public-api.js.map +1 -0
  52. package/dist/Export/run-export.d.ts +3 -1
  53. package/dist/Export/run-export.d.ts.map +1 -1
  54. package/dist/Export/run-export.js +58 -25
  55. package/dist/Export/run-export.js.map +1 -1
  56. package/dist/Export/transform-summaries.d.ts +7 -0
  57. package/dist/Export/transform-summaries.d.ts.map +1 -0
  58. package/dist/Export/transform-summaries.js +6 -0
  59. package/dist/Export/transform-summaries.js.map +1 -0
  60. package/dist/ExportDialog-MEUISWZX.js +9 -0
  61. package/dist/ExportDialog-MEUISWZX.js.map +1 -0
  62. package/dist/ExportToolbarControls-D2YDWOXW.js +373 -0
  63. package/dist/ExportToolbarControls-D2YDWOXW.js.map +1 -0
  64. package/dist/FileExplorer/FileExplorer.d.ts +26 -4
  65. package/dist/FileExplorer/FileExplorer.d.ts.map +1 -1
  66. package/dist/FileExplorer/FileExplorer.js +204 -29
  67. package/dist/FileExplorer/FileExplorer.js.map +1 -1
  68. package/dist/FileExplorer/FileTreeNode.d.ts +24 -3
  69. package/dist/FileExplorer/FileTreeNode.d.ts.map +1 -1
  70. package/dist/FileExplorer/FileTreeNode.js +27 -8
  71. package/dist/FileExplorer/FileTreeNode.js.map +1 -1
  72. package/dist/FileExplorer/index.d.ts +1 -1
  73. package/dist/FileExplorer/index.d.ts.map +1 -1
  74. package/dist/FileExplorer/useFileTree.d.ts +5 -3
  75. package/dist/FileExplorer/useFileTree.d.ts.map +1 -1
  76. package/dist/FileExplorer/useFileTree.js +173 -13
  77. package/dist/FileExplorer/useFileTree.js.map +1 -1
  78. package/dist/Git/GitAuthGuidanceDialog.d.ts +18 -0
  79. package/dist/Git/GitAuthGuidanceDialog.d.ts.map +1 -0
  80. package/dist/Git/GitAuthGuidanceDialog.js +27 -0
  81. package/dist/Git/GitAuthGuidanceDialog.js.map +1 -0
  82. package/dist/Git/GitBranchesDialog.d.ts +13 -0
  83. package/dist/Git/GitBranchesDialog.d.ts.map +1 -0
  84. package/dist/Git/GitBranchesDialog.js +59 -0
  85. package/dist/Git/GitBranchesDialog.js.map +1 -0
  86. package/dist/Git/GitCloneDialog.d.ts +14 -0
  87. package/dist/Git/GitCloneDialog.d.ts.map +1 -0
  88. package/dist/Git/GitCloneDialog.js +79 -0
  89. package/dist/Git/GitCloneDialog.js.map +1 -0
  90. package/dist/Git/GitCommitDialog.d.ts +12 -0
  91. package/dist/Git/GitCommitDialog.d.ts.map +1 -0
  92. package/dist/Git/GitCommitDialog.js +38 -0
  93. package/dist/Git/GitCommitDialog.js.map +1 -0
  94. package/dist/Git/GitConflictsDialog.d.ts +12 -0
  95. package/dist/Git/GitConflictsDialog.d.ts.map +1 -0
  96. package/dist/Git/GitConflictsDialog.js +17 -0
  97. package/dist/Git/GitConflictsDialog.js.map +1 -0
  98. package/dist/Git/GitContext.d.ts +89 -0
  99. package/dist/Git/GitContext.d.ts.map +1 -0
  100. package/dist/Git/GitContext.js +15 -0
  101. package/dist/Git/GitContext.js.map +1 -0
  102. package/dist/Git/GitDiffDialog.d.ts +20 -0
  103. package/dist/Git/GitDiffDialog.d.ts.map +1 -0
  104. package/dist/Git/GitDiffDialog.js +100 -0
  105. package/dist/Git/GitDiffDialog.js.map +1 -0
  106. package/dist/Git/GitDiffView.d.ts +23 -0
  107. package/dist/Git/GitDiffView.d.ts.map +1 -0
  108. package/dist/Git/GitDiffView.js +77 -0
  109. package/dist/Git/GitDiffView.js.map +1 -0
  110. package/dist/Git/GitHistoryDialog.d.ts +15 -0
  111. package/dist/Git/GitHistoryDialog.d.ts.map +1 -0
  112. package/dist/Git/GitHistoryDialog.js +107 -0
  113. package/dist/Git/GitHistoryDialog.js.map +1 -0
  114. package/dist/Git/GitStatusBar.d.ts +8 -0
  115. package/dist/Git/GitStatusBar.d.ts.map +1 -0
  116. package/dist/Git/GitStatusBar.js +49 -0
  117. package/dist/Git/GitStatusBar.js.map +1 -0
  118. package/dist/Git/GitToolbarControl.d.ts +15 -0
  119. package/dist/Git/GitToolbarControl.d.ts.map +1 -0
  120. package/dist/Git/GitToolbarControl.js +51 -0
  121. package/dist/Git/GitToolbarControl.js.map +1 -0
  122. package/dist/Git/GitUI.d.ts +14 -0
  123. package/dist/Git/GitUI.d.ts.map +1 -0
  124. package/dist/Git/GitUI.js +21 -0
  125. package/dist/Git/GitUI.js.map +1 -0
  126. package/dist/Git/commit-selection.d.ts +22 -0
  127. package/dist/Git/commit-selection.d.ts.map +1 -0
  128. package/dist/Git/commit-selection.js +47 -0
  129. package/dist/Git/commit-selection.js.map +1 -0
  130. package/dist/Git/git-clone-utils.d.ts +8 -0
  131. package/dist/Git/git-clone-utils.d.ts.map +1 -0
  132. package/dist/Git/git-clone-utils.js +26 -0
  133. package/dist/Git/git-clone-utils.js.map +1 -0
  134. package/dist/Git/git-status.d.ts +24 -0
  135. package/dist/Git/git-status.d.ts.map +1 -0
  136. package/dist/Git/git-status.js +105 -0
  137. package/dist/Git/git-status.js.map +1 -0
  138. package/dist/Git/useGit.d.ts +15 -0
  139. package/dist/Git/useGit.d.ts.map +1 -0
  140. package/dist/Git/useGit.js +206 -0
  141. package/dist/Git/useGit.js.map +1 -0
  142. package/dist/Git/useGitStatus.d.ts +17 -0
  143. package/dist/Git/useGitStatus.d.ts.map +1 -0
  144. package/dist/Git/useGitStatus.js +63 -0
  145. package/dist/Git/useGitStatus.js.map +1 -0
  146. package/dist/GitToolbarControl-LMIR4R7I.js +117 -0
  147. package/dist/GitToolbarControl-LMIR4R7I.js.map +1 -0
  148. package/dist/GitUI-KGF5MSNV.js +1048 -0
  149. package/dist/GitUI-KGF5MSNV.js.map +1 -0
  150. package/dist/LazyEditorShell-EF2BWRXU.js +6 -0
  151. package/dist/LazyEditorShell-EF2BWRXU.js.map +1 -0
  152. package/dist/Settings/Settings.d.ts +23 -0
  153. package/dist/Settings/Settings.d.ts.map +1 -0
  154. package/dist/Settings/Settings.js +22 -0
  155. package/dist/Settings/Settings.js.map +1 -0
  156. package/dist/Settings/public-api.d.ts +3 -0
  157. package/dist/Settings/public-api.d.ts.map +1 -0
  158. package/dist/Settings/public-api.js +2 -0
  159. package/dist/Settings/public-api.js.map +1 -0
  160. package/dist/WorkspacePicker/WorkspacePicker.d.ts +6 -1
  161. package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +1 -1
  162. package/dist/WorkspacePicker/WorkspacePicker.js +16 -5
  163. package/dist/WorkspacePicker/WorkspacePicker.js.map +1 -1
  164. package/dist/chunk-3SAXDU2U.js +157 -0
  165. package/dist/chunk-3SAXDU2U.js.map +1 -0
  166. package/dist/chunk-4XXSWN3T.js +13 -0
  167. package/dist/chunk-4XXSWN3T.js.map +1 -0
  168. package/dist/chunk-5A4KEWKT.js +97 -0
  169. package/dist/chunk-5A4KEWKT.js.map +1 -0
  170. package/dist/chunk-AOVTHZU7.js +321 -0
  171. package/dist/chunk-AOVTHZU7.js.map +1 -0
  172. package/dist/chunk-DD4VFJQI.js +51 -0
  173. package/dist/chunk-DD4VFJQI.js.map +1 -0
  174. package/dist/chunk-GSNZSCIK.js +55 -0
  175. package/dist/chunk-GSNZSCIK.js.map +1 -0
  176. package/dist/chunk-VHDP4IPL.js +70 -0
  177. package/dist/chunk-VHDP4IPL.js.map +1 -0
  178. package/dist/chunk-ZI56BNB7.js +270 -0
  179. package/dist/chunk-ZI56BNB7.js.map +1 -0
  180. package/dist/components/Dialog.d.ts +22 -0
  181. package/dist/components/Dialog.d.ts.map +1 -0
  182. package/dist/components/Dialog.js +33 -0
  183. package/dist/components/Dialog.js.map +1 -0
  184. package/dist/editor.d.ts +10 -0
  185. package/dist/editor.d.ts.map +1 -0
  186. package/dist/editor.js +70 -0
  187. package/dist/editor.js.map +1 -0
  188. package/dist/export/index.d.ts +87 -0
  189. package/dist/export/index.js +26 -0
  190. package/dist/export/index.js.map +1 -0
  191. package/dist/hooks/index.d.ts +2 -1
  192. package/dist/hooks/index.d.ts.map +1 -1
  193. package/dist/hooks/index.js +1 -1
  194. package/dist/hooks/index.js.map +1 -1
  195. package/dist/hooks/useDocumentSession.d.ts +16 -0
  196. package/dist/hooks/useDocumentSession.d.ts.map +1 -0
  197. package/dist/hooks/useDocumentSession.js +18 -0
  198. package/dist/hooks/useDocumentSession.js.map +1 -0
  199. package/dist/icons.d.ts +11 -6
  200. package/dist/icons.d.ts.map +1 -1
  201. package/dist/icons.js +21 -20
  202. package/dist/icons.js.map +1 -1
  203. package/dist/index.d.ts +8 -5
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.js +4 -2
  206. package/dist/index.js.map +1 -1
  207. package/dist/preferences/theme.d.ts +18 -0
  208. package/dist/preferences/theme.d.ts.map +1 -0
  209. package/dist/preferences/theme.js +63 -0
  210. package/dist/preferences/theme.js.map +1 -0
  211. package/dist/provider-lease.d.ts +10 -0
  212. package/dist/provider-lease.d.ts.map +1 -0
  213. package/dist/provider-lease.js +42 -0
  214. package/dist/provider-lease.js.map +1 -0
  215. package/dist/run-export-ICTZITXC.js +10 -0
  216. package/dist/run-export-ICTZITXC.js.map +1 -0
  217. package/dist/settings/index.d.ts +28 -0
  218. package/dist/settings/index.js +12 -0
  219. package/dist/settings/index.js.map +1 -0
  220. package/package.json +27 -10
  221. package/src/AppMenu/AppMenu.tsx +169 -99
  222. package/src/AppMenu/index.ts +1 -1
  223. package/src/DocBlocksShell/DocBlocksShell.tsx +2183 -516
  224. package/src/DocBlocksShell/LazyEditorShell.ts +2 -0
  225. package/src/DocBlocksShell/UpdateAvailableNotice.tsx +60 -0
  226. package/src/DocBlocksShell/document-title.ts +19 -0
  227. package/src/DocBlocksShell/workspace-authority-barrier.ts +26 -0
  228. package/src/Export/DeferredExportToolbarControls.tsx +23 -0
  229. package/src/Export/ExportDialog.tsx +102 -27
  230. package/src/Export/ExportToolbarControls.tsx +343 -57
  231. package/src/Export/export-destination.ts +30 -0
  232. package/src/Export/index.ts +18 -4
  233. package/src/Export/public-api.ts +17 -0
  234. package/src/Export/run-export.ts +66 -29
  235. package/src/Export/transform-summaries.ts +14 -0
  236. package/src/FileExplorer/FileExplorer.tsx +284 -38
  237. package/src/FileExplorer/FileTreeNode.tsx +100 -8
  238. package/src/FileExplorer/index.ts +1 -1
  239. package/src/FileExplorer/useFileTree.ts +190 -16
  240. package/src/Git/GitAuthGuidanceDialog.tsx +84 -0
  241. package/src/Git/GitBranchesDialog.tsx +144 -0
  242. package/src/Git/GitCloneDialog.tsx +200 -0
  243. package/src/Git/GitCommitDialog.tsx +119 -0
  244. package/src/Git/GitConflictsDialog.tsx +62 -0
  245. package/src/Git/GitContext.tsx +88 -0
  246. package/src/Git/GitDiffDialog.tsx +147 -0
  247. package/src/Git/GitDiffView.tsx +105 -0
  248. package/src/Git/GitHistoryDialog.tsx +195 -0
  249. package/src/Git/GitStatusBar.tsx +157 -0
  250. package/src/Git/GitToolbarControl.tsx +123 -0
  251. package/src/Git/GitUI.tsx +68 -0
  252. package/src/Git/commit-selection.ts +63 -0
  253. package/src/Git/git-clone-utils.ts +23 -0
  254. package/src/Git/git-status.ts +113 -0
  255. package/src/Git/useGit.ts +279 -0
  256. package/src/Git/useGitStatus.ts +78 -0
  257. package/src/Settings/Settings.tsx +118 -0
  258. package/src/Settings/public-api.ts +8 -0
  259. package/src/WorkspacePicker/WorkspacePicker.tsx +62 -8
  260. package/src/components/Dialog.tsx +81 -0
  261. package/src/editor.ts +72 -0
  262. package/src/hooks/index.ts +2 -1
  263. package/src/hooks/useDocumentSession.ts +37 -0
  264. package/src/icons.tsx +33 -55
  265. package/src/index.ts +35 -5
  266. package/src/preferences/theme.ts +67 -0
  267. package/src/provider-lease.ts +52 -0
  268. package/src/styles/docblocks.css +2247 -77
  269. package/src/types/pwa-dom.d.ts +31 -0
  270. package/dist/hooks/useAutoSave.d.ts +0 -15
  271. package/dist/hooks/useAutoSave.d.ts.map +0 -1
  272. package/dist/hooks/useAutoSave.js +0 -83
  273. package/dist/hooks/useAutoSave.js.map +0 -1
  274. package/src/fonts/fonts.css +0 -362
  275. package/src/fonts/licenses/LICENSE-cormorant-garamond.txt +0 -93
  276. package/src/fonts/licenses/LICENSE-crimson-text.txt +0 -93
  277. package/src/fonts/licenses/LICENSE-dm-sans.txt +0 -93
  278. package/src/fonts/licenses/LICENSE-dm-serif-display.txt +0 -93
  279. package/src/fonts/licenses/LICENSE-hanken-grotesk.txt +0 -94
  280. package/src/fonts/licenses/LICENSE-ibm-plex-sans.txt +0 -93
  281. package/src/fonts/licenses/LICENSE-inter.txt +0 -93
  282. package/src/fonts/licenses/LICENSE-jetbrains-mono.txt +0 -93
  283. package/src/fonts/licenses/LICENSE-lora.txt +0 -93
  284. package/src/fonts/licenses/LICENSE-merriweather.txt +0 -93
  285. package/src/fonts/licenses/LICENSE-oswald.txt +0 -93
  286. package/src/fonts/licenses/LICENSE-playfair-display.txt +0 -93
  287. package/src/fonts/licenses/LICENSE-pt-serif.txt +0 -93
  288. package/src/fonts/licenses/LICENSE-roboto.txt +0 -93
  289. package/src/fonts/licenses/LICENSE-source-serif-4.txt +0 -93
  290. package/src/fonts/woff2/cormorant-garamond-400.woff2 +0 -0
  291. package/src/fonts/woff2/cormorant-garamond-700.woff2 +0 -0
  292. package/src/fonts/woff2/crimson-text-400.woff2 +0 -0
  293. package/src/fonts/woff2/crimson-text-400i.woff2 +0 -0
  294. package/src/fonts/woff2/crimson-text-700.woff2 +0 -0
  295. package/src/fonts/woff2/dm-sans-400.woff2 +0 -0
  296. package/src/fonts/woff2/dm-sans-400i.woff2 +0 -0
  297. package/src/fonts/woff2/dm-sans-500.woff2 +0 -0
  298. package/src/fonts/woff2/dm-sans-700.woff2 +0 -0
  299. package/src/fonts/woff2/dm-serif-display-400.woff2 +0 -0
  300. package/src/fonts/woff2/hanken-grotesk-400.woff2 +0 -0
  301. package/src/fonts/woff2/hanken-grotesk-400i.woff2 +0 -0
  302. package/src/fonts/woff2/hanken-grotesk-500.woff2 +0 -0
  303. package/src/fonts/woff2/hanken-grotesk-600.woff2 +0 -0
  304. package/src/fonts/woff2/hanken-grotesk-700.woff2 +0 -0
  305. package/src/fonts/woff2/ibm-plex-sans-400.woff2 +0 -0
  306. package/src/fonts/woff2/ibm-plex-sans-400i.woff2 +0 -0
  307. package/src/fonts/woff2/ibm-plex-sans-500.woff2 +0 -0
  308. package/src/fonts/woff2/ibm-plex-sans-600.woff2 +0 -0
  309. package/src/fonts/woff2/ibm-plex-sans-700.woff2 +0 -0
  310. package/src/fonts/woff2/inter-400.woff2 +0 -0
  311. package/src/fonts/woff2/inter-400i.woff2 +0 -0
  312. package/src/fonts/woff2/inter-500.woff2 +0 -0
  313. package/src/fonts/woff2/inter-600.woff2 +0 -0
  314. package/src/fonts/woff2/inter-700.woff2 +0 -0
  315. package/src/fonts/woff2/jetbrains-mono-400.woff2 +0 -0
  316. package/src/fonts/woff2/jetbrains-mono-400i.woff2 +0 -0
  317. package/src/fonts/woff2/jetbrains-mono-700.woff2 +0 -0
  318. package/src/fonts/woff2/lora-400.woff2 +0 -0
  319. package/src/fonts/woff2/lora-400i.woff2 +0 -0
  320. package/src/fonts/woff2/lora-700.woff2 +0 -0
  321. package/src/fonts/woff2/merriweather-400.woff2 +0 -0
  322. package/src/fonts/woff2/merriweather-700.woff2 +0 -0
  323. package/src/fonts/woff2/oswald-400.woff2 +0 -0
  324. package/src/fonts/woff2/oswald-700.woff2 +0 -0
  325. package/src/fonts/woff2/playfair-display-400.woff2 +0 -0
  326. package/src/fonts/woff2/playfair-display-700.woff2 +0 -0
  327. package/src/fonts/woff2/pt-serif-400.woff2 +0 -0
  328. package/src/fonts/woff2/pt-serif-700.woff2 +0 -0
  329. package/src/fonts/woff2/roboto-400.woff2 +0 -0
  330. package/src/fonts/woff2/roboto-400i.woff2 +0 -0
  331. package/src/fonts/woff2/roboto-700.woff2 +0 -0
  332. package/src/fonts/woff2/source-serif-4-400.woff2 +0 -0
  333. package/src/fonts/woff2/source-serif-4-400i.woff2 +0 -0
  334. package/src/fonts/woff2/source-serif-4-700.woff2 +0 -0
  335. package/src/hooks/useAutoSave.ts +0 -116
@@ -7,8 +7,8 @@
7
7
  the chrome around it (sidebar, gutters, panes) reads as cream
8
8
  canvas, and the accent picks up a saturated dark brown for CTAs.
9
9
  Dark mode inverts the metaphor into espresso wood with light tan
10
- highlights. Derived shades (`--db-accent-soft-*`, `--db-accent-tint`,
11
- `--db-accent-deep`) are defined alongside so every place that needs
10
+ highlights. Derived shades (`--db-accent-soft-*`,
11
+ `--db-accent-tint-strong`, `--db-accent-deep`) are defined alongside so every place that needs
12
12
  a tinted background or a readable-on-tint text color pulls from the
13
13
  same source of truth. */
14
14
  .db-shell {
@@ -25,13 +25,19 @@
25
25
  --db-text-placeholder: #766c54;
26
26
  --db-accent: #7d6948;
27
27
  --db-accent-hover: #5e4f37;
28
+ --db-text-on-accent: #ffffff;
29
+ --db-text-on-selected: #ffffff;
28
30
  --db-accent-soft-08: rgba(125, 105, 72, 0.08);
31
+ --db-accent-soft-10: rgba(125, 105, 72, 0.1);
29
32
  --db-accent-soft-12: rgba(125, 105, 72, 0.12);
30
33
  --db-accent-soft-15: rgba(125, 105, 72, 0.15);
31
34
  --db-accent-soft-25: rgba(125, 105, 72, 0.25);
32
- --db-accent-tint: #f3eede;
33
35
  --db-accent-tint-strong: #d8d0b5;
34
36
  --db-accent-deep: #3d3220;
37
+ --db-editor-canvas: #ffffff;
38
+ --db-badge-bg: #f3eede;
39
+ --db-badge-text: #3d3220;
40
+ --db-badge-text-hover: #2a2419;
35
41
  /* Outline pane + inline-preview gutter background. Sits one step
36
42
  lighter than the toolbar (`--db-accent-tint-strong`) so the chrome
37
43
  panes read as distinct from the action bar above the canvas. */
@@ -40,6 +46,14 @@
40
46
  --db-danger: #b22b1b;
41
47
  --db-danger-bg: #fdf0ee;
42
48
  --db-shadow: rgba(40, 30, 15, 0.12);
49
+ /* Git status colors — file badges, sync chips. Deleted/conflicted reuse
50
+ the danger hue on purpose; renamed gets the one cool accent. */
51
+ --db-git-modified: #9a6b00;
52
+ --db-git-added: #2e7d32;
53
+ --db-git-untracked: #2e7d32;
54
+ --db-git-renamed: #1565c0;
55
+ --db-git-deleted: #b22b1b;
56
+ --db-git-conflicted: #b22b1b;
43
57
  }
44
58
 
45
59
  .db-shell[data-theme='dark'] {
@@ -56,13 +70,19 @@
56
70
  --db-text-placeholder: #6b614a;
57
71
  --db-accent: #c8b48f;
58
72
  --db-accent-hover: #dec79d;
73
+ --db-text-on-accent: #1a1812;
74
+ --db-text-on-selected: #e8e2d0;
59
75
  --db-accent-soft-08: rgba(200, 180, 143, 0.08);
76
+ --db-accent-soft-10: rgba(200, 180, 143, 0.1);
60
77
  --db-accent-soft-12: rgba(200, 180, 143, 0.12);
61
78
  --db-accent-soft-15: rgba(200, 180, 143, 0.18);
62
79
  --db-accent-soft-25: rgba(200, 180, 143, 0.28);
63
- --db-accent-tint: #262219;
64
80
  --db-accent-tint-strong: #3a382e;
65
81
  --db-accent-deep: #e6dcc0;
82
+ --db-editor-canvas: #16110b;
83
+ --db-badge-bg: #3a2f1f;
84
+ --db-badge-text: #fff4d6;
85
+ --db-badge-text-hover: #fff8e6;
66
86
  --db-input-border: #c8b48f;
67
87
  --db-danger: #f87171;
68
88
  --db-danger-bg: #1c1917;
@@ -71,6 +91,12 @@
71
91
  sits a step above `--db-accent-tint-strong` instead of between it
72
92
  and tint. */
73
93
  --db-gutter-bg: #4a4538;
94
+ --db-git-modified: #e5b567;
95
+ --db-git-added: #81c784;
96
+ --db-git-untracked: #81c784;
97
+ --db-git-renamed: #64b5f6;
98
+ --db-git-deleted: #f87171;
99
+ --db-git-conflicted: #f87171;
74
100
  }
75
101
 
76
102
  @media (prefers-color-scheme: dark) {
@@ -88,11 +114,12 @@
88
114
  --db-text-placeholder: #6b614a;
89
115
  --db-accent: #c8b48f;
90
116
  --db-accent-hover: #dec79d;
117
+ --db-text-on-accent: #1a1812;
118
+ --db-text-on-selected: #e8e2d0;
91
119
  --db-accent-soft-08: rgba(200, 180, 143, 0.08);
92
120
  --db-accent-soft-12: rgba(200, 180, 143, 0.12);
93
121
  --db-accent-soft-15: rgba(200, 180, 143, 0.18);
94
122
  --db-accent-soft-25: rgba(200, 180, 143, 0.28);
95
- --db-accent-tint: #262219;
96
123
  --db-accent-tint-strong: #3a382e;
97
124
  --db-accent-deep: #e6dcc0;
98
125
  --db-input-border: #c8b48f;
@@ -100,6 +127,12 @@
100
127
  --db-danger-bg: #1c1917;
101
128
  --db-shadow: rgba(0, 0, 0, 0.4);
102
129
  --db-gutter-bg: #4a4538;
130
+ --db-git-modified: #e5b567;
131
+ --db-git-added: #81c784;
132
+ --db-git-untracked: #81c784;
133
+ --db-git-renamed: #64b5f6;
134
+ --db-git-deleted: #f87171;
135
+ --db-git-conflicted: #f87171;
103
136
  }
104
137
  }
105
138
 
@@ -154,12 +187,15 @@
154
187
  }
155
188
 
156
189
  .db-explorer-btn {
190
+ width: 24px;
191
+ height: 24px;
157
192
  background: none;
158
193
  border: 1px solid transparent;
159
194
  border-radius: 3px;
160
195
  cursor: pointer;
161
- padding: 3px;
162
- font-size: 12px;
196
+ padding: 0;
197
+ font-size: 14px;
198
+ line-height: 1;
163
199
  color: var(--db-text-muted);
164
200
  display: flex;
165
201
  align-items: center;
@@ -209,7 +245,7 @@
209
245
  padding: 3px 8px;
210
246
  font-size: 12px;
211
247
  background: var(--db-accent);
212
- color: #fff;
248
+ color: var(--db-text-on-accent);
213
249
  border: none;
214
250
  border-radius: 3px;
215
251
  cursor: pointer;
@@ -234,6 +270,20 @@
234
270
  font-size: 12px;
235
271
  }
236
272
 
273
+ .db-tree-error {
274
+ margin: 4px 8px;
275
+ padding: 6px 8px;
276
+ border: 1px solid var(--db-danger, #c33);
277
+ border-radius: 3px;
278
+ color: var(--db-danger, #c33);
279
+ font-size: 12px;
280
+ }
281
+
282
+ .db-tree--drop-target {
283
+ box-shadow: inset 0 0 0 2px var(--db-accent);
284
+ background: var(--db-accent-soft-08);
285
+ }
286
+
237
287
  .db-tree-row {
238
288
  display: flex;
239
289
  align-items: center;
@@ -248,14 +298,26 @@
248
298
  background: var(--db-bg-hover);
249
299
  }
250
300
 
301
+ .db-tree-row--dragging {
302
+ opacity: 0.45;
303
+ }
304
+
305
+ .db-tree-row--drop-target,
306
+ .db-tree-row--drop-target:hover {
307
+ background: var(--db-bg-selected);
308
+ color: var(--db-text-on-selected);
309
+ outline: 1px solid var(--db-accent);
310
+ outline-offset: -1px;
311
+ }
312
+
251
313
  .db-tree-row--selected {
252
314
  background: var(--db-bg-selected);
253
- color: #ffffff;
315
+ color: var(--db-text-on-selected);
254
316
  }
255
317
 
256
318
  .db-tree-row--selected:hover {
257
319
  background: var(--db-bg-selected-hover);
258
- color: #ffffff;
320
+ color: var(--db-text-on-selected);
259
321
  }
260
322
 
261
323
  .db-tree-icon {
@@ -299,6 +361,8 @@
299
361
  border-radius: 3px;
300
362
  background: transparent;
301
363
  color: var(--db-text-secondary);
364
+ font-size: 14px;
365
+ line-height: 1;
302
366
  cursor: pointer;
303
367
  visibility: hidden;
304
368
  }
@@ -317,7 +381,7 @@
317
381
 
318
382
  .db-tree-more--active {
319
383
  background: var(--db-bg-selected);
320
- color: #ffffff;
384
+ color: var(--db-text-on-selected);
321
385
  }
322
386
 
323
387
  /* ── Context Menu ────────────────────────────────────────────── */
@@ -367,6 +431,7 @@
367
431
  position: relative;
368
432
  flex: 1;
369
433
  min-width: 0;
434
+ max-width: 320px;
370
435
  }
371
436
 
372
437
  .db-workspace-picker-btn {
@@ -387,10 +452,33 @@
387
452
  background: var(--db-bg-hover);
388
453
  }
389
454
 
455
+ .db-workspace-picker-label {
456
+ min-width: 0;
457
+ overflow: hidden;
458
+ text-overflow: ellipsis;
459
+ white-space: nowrap;
460
+ }
461
+
462
+ .db-workspace-picker-compact-icon {
463
+ display: none;
464
+ align-items: center;
465
+ justify-content: center;
466
+ }
467
+
390
468
  .db-workspace-picker-caret {
391
- font-size: 10px;
469
+ width: 10px;
470
+ height: 6px;
471
+ flex: 0 0 auto;
392
472
  margin-left: 4px;
393
- color: var(--db-text-placeholder);
473
+ background: currentColor;
474
+ clip-path: polygon(0 0, 100% 0, 50% 100%);
475
+ color: var(--db-text-muted);
476
+ transform-origin: center;
477
+ transition: transform 0.15s;
478
+ }
479
+
480
+ .db-workspace-picker-caret--open {
481
+ transform: rotate(180deg);
394
482
  }
395
483
 
396
484
  .db-workspace-dropdown {
@@ -409,7 +497,7 @@
409
497
 
410
498
  .db-workspace-dropdown-item {
411
499
  display: flex;
412
- align-items: center;
500
+ align-items: flex-start;
413
501
  justify-content: space-between;
414
502
  gap: 8px;
415
503
  width: 100%;
@@ -420,16 +508,21 @@
420
508
  border: none;
421
509
  cursor: pointer;
422
510
  color: var(--db-text-secondary);
423
- white-space: nowrap;
424
511
  }
425
512
 
426
513
  .db-workspace-dropdown-item:hover {
427
514
  background: var(--db-bg-hover);
428
515
  }
429
516
 
517
+ .db-workspace-dropdown-action-label {
518
+ display: inline-flex;
519
+ align-items: center;
520
+ gap: 6px;
521
+ }
522
+
430
523
  .db-workspace-dropdown-item--active {
431
524
  background: var(--db-bg-selected);
432
- color: #ffffff;
525
+ color: var(--db-text-on-selected);
433
526
  font-weight: 500;
434
527
  }
435
528
 
@@ -438,6 +531,35 @@
438
531
  color: var(--db-text-placeholder);
439
532
  }
440
533
 
534
+ .db-workspace-details {
535
+ display: flex;
536
+ flex-direction: column;
537
+ width: 100%;
538
+ min-width: 0;
539
+ }
540
+
541
+ .db-workspace-heading {
542
+ display: flex;
543
+ align-items: baseline;
544
+ justify-content: space-between;
545
+ gap: 12px;
546
+ white-space: nowrap;
547
+ }
548
+
549
+ .db-workspace-path {
550
+ margin-top: 2px;
551
+ color: var(--db-text-muted);
552
+ font-size: 11px;
553
+ font-weight: 400;
554
+ line-height: 1.35;
555
+ overflow-wrap: anywhere;
556
+ }
557
+
558
+ .db-workspace-dropdown-item--active :is(.db-workspace-type, .db-workspace-path) {
559
+ color: var(--db-text-on-selected);
560
+ opacity: 0.75;
561
+ }
562
+
441
563
  .db-workspace-dropdown-divider {
442
564
  height: 1px;
443
565
  background: var(--db-border);
@@ -476,9 +598,14 @@
476
598
  }
477
599
 
478
600
  .db-app-menu-caret {
479
- font-size: 18px;
601
+ width: 10px;
602
+ height: 6px;
603
+ flex: 0 0 auto;
604
+ background: currentColor;
605
+ clip-path: polygon(0 0, 100% 0, 50% 100%);
480
606
  color: var(--db-text-muted);
481
607
  display: inline-block;
608
+ transform-origin: center;
482
609
  transition: transform 0.15s;
483
610
  }
484
611
 
@@ -547,6 +674,8 @@
547
674
  border-radius: 4px;
548
675
  background: transparent;
549
676
  color: var(--db-text-muted);
677
+ font-size: 14px;
678
+ line-height: 1;
550
679
  cursor: pointer;
551
680
  transition:
552
681
  background 0.12s,
@@ -699,6 +828,7 @@ body.db-resizing-sidebar * {
699
828
  }
700
829
 
701
830
  .db-shell-sidebar-header {
831
+ container: db-sidebar-header / inline-size;
702
832
  display: flex;
703
833
  align-items: center;
704
834
  border-bottom: 1px solid var(--db-border-strong);
@@ -708,14 +838,44 @@ body.db-resizing-sidebar * {
708
838
  min-height: 40px;
709
839
  }
710
840
 
841
+ @container db-sidebar-header (max-width: 300px) {
842
+ .db-workspace-picker {
843
+ flex: 0 0 auto;
844
+ }
845
+
846
+ .db-workspace-picker-btn {
847
+ width: auto;
848
+ gap: 6px;
849
+ }
850
+
851
+ .db-workspace-picker-label {
852
+ display: none;
853
+ }
854
+
855
+ .db-workspace-picker-compact-icon {
856
+ display: inline-flex;
857
+ }
858
+ }
859
+
711
860
  .db-shell-sidebar-footer {
712
- padding: 8px 12px;
861
+ box-sizing: border-box;
862
+ display: flex;
863
+ align-items: center;
864
+ gap: 6px;
865
+ height: 23px;
866
+ padding: 0 12px 0 18px;
713
867
  border-top: 1px solid var(--db-border-strong);
714
868
  flex-shrink: 0;
715
869
  font-size: 11px;
870
+ line-height: 1;
871
+ }
872
+
873
+ .db-shell-sidebar-footer > * {
874
+ transform: translateY(-1px);
716
875
  }
717
876
 
718
877
  .db-shell-sidebar-footer a {
878
+ flex-shrink: 0;
719
879
  color: var(--db-text-muted);
720
880
  text-decoration: none;
721
881
  }
@@ -725,6 +885,34 @@ body.db-resizing-sidebar * {
725
885
  text-decoration: underline;
726
886
  }
727
887
 
888
+ .db-shell-sidebar-footer-separator,
889
+ .db-shell-sidebar-footer-action {
890
+ color: var(--db-text-muted);
891
+ }
892
+
893
+ .db-shell-sidebar-footer-separator {
894
+ flex-shrink: 0;
895
+ opacity: 0.65;
896
+ }
897
+
898
+ .db-shell-sidebar-footer-action {
899
+ min-width: 0;
900
+ padding: 0;
901
+ overflow: hidden;
902
+ border: 0;
903
+ background: transparent;
904
+ font: inherit;
905
+ line-height: inherit;
906
+ text-decoration: underline;
907
+ text-overflow: ellipsis;
908
+ white-space: nowrap;
909
+ cursor: pointer;
910
+ }
911
+
912
+ .db-shell-sidebar-footer-action:hover {
913
+ color: var(--db-text-secondary);
914
+ }
915
+
728
916
  .db-shell-empty {
729
917
  display: flex;
730
918
  align-items: center;
@@ -772,10 +960,9 @@ body.db-resizing-sidebar * {
772
960
  background: var(--db-bg-subtle);
773
961
  }
774
962
 
775
- /* "Restore split view" button — appears on the editor toolbar when
776
- compact layout was triggered manually on a wide viewport. Lets the
777
- user pop the sidebar back open alongside the editor. Iconic only,
778
- no label, so it stays compact in the toolbar's right-slot. */
963
+ /* "Restore split view" button — appears in whichever pane is visible when
964
+ compact layout was triggered manually on a wide viewport. Iconic only,
965
+ no label, so it stays compact in either header. */
779
966
  .db-restore-split {
780
967
  display: inline-flex;
781
968
  align-items: center;
@@ -799,7 +986,8 @@ body.db-resizing-sidebar * {
799
986
  .db-dialog-overlay {
800
987
  position: fixed;
801
988
  inset: 0;
802
- z-index: 100;
989
+ /* Keep DocBlocks modals above Squisq player controls and editor tooltips. */
990
+ z-index: 3000;
803
991
  display: flex;
804
992
  align-items: center;
805
993
  justify-content: center;
@@ -928,6 +1116,105 @@ body.db-resizing-sidebar * {
928
1116
  .db-settings-radio input[type='radio'] {
929
1117
  margin: 0;
930
1118
  cursor: pointer;
1119
+ accent-color: var(--db-accent);
1120
+ }
1121
+
1122
+ .db-settings-checkbox {
1123
+ display: flex;
1124
+ align-items: center;
1125
+ gap: 8px;
1126
+ padding: 6px 0;
1127
+ font-size: 13px;
1128
+ color: var(--db-text);
1129
+ cursor: pointer;
1130
+ }
1131
+
1132
+ .db-settings-checkbox input[type='checkbox'] {
1133
+ margin: 0;
1134
+ cursor: pointer;
1135
+ accent-color: var(--db-accent);
1136
+ }
1137
+
1138
+ .db-settings-accent-grid {
1139
+ display: grid;
1140
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1141
+ gap: 6px;
1142
+ }
1143
+
1144
+ .db-settings-accent {
1145
+ position: relative;
1146
+ display: flex;
1147
+ align-items: center;
1148
+ gap: 8px;
1149
+ min-width: 0;
1150
+ padding: 7px 8px;
1151
+ border: 1px solid transparent;
1152
+ border-radius: 6px;
1153
+ color: var(--db-text);
1154
+ cursor: pointer;
1155
+ }
1156
+
1157
+ .db-settings-accent:hover {
1158
+ background: var(--db-bg-subtle);
1159
+ }
1160
+
1161
+ .db-settings-accent--selected {
1162
+ background: var(--db-accent-soft-08);
1163
+ border-color: var(--db-accent);
1164
+ }
1165
+
1166
+ .db-settings-accent-input {
1167
+ position: absolute;
1168
+ width: 1px;
1169
+ height: 1px;
1170
+ margin: -1px;
1171
+ padding: 0;
1172
+ overflow: hidden;
1173
+ clip: rect(0, 0, 0, 0);
1174
+ white-space: nowrap;
1175
+ border: 0;
1176
+ }
1177
+
1178
+ .db-settings-accent:has(.db-settings-accent-input:focus-visible) {
1179
+ outline: 2px solid var(--db-accent);
1180
+ outline-offset: 2px;
1181
+ }
1182
+
1183
+ .db-settings-accent-swatch {
1184
+ width: 16px;
1185
+ height: 16px;
1186
+ flex: 0 0 auto;
1187
+ border: 1px solid rgba(0, 0, 0, 0.22);
1188
+ border-radius: 50%;
1189
+ box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.18);
1190
+ }
1191
+
1192
+ .db-settings-accent-swatch--brown {
1193
+ background: #7d6948;
1194
+ }
1195
+
1196
+ .db-settings-accent-swatch--green {
1197
+ background: #4f715d;
1198
+ }
1199
+
1200
+ .db-settings-accent-swatch--blue {
1201
+ background: #526f91;
1202
+ }
1203
+
1204
+ .db-settings-accent-swatch--purple {
1205
+ background: #735b8c;
1206
+ }
1207
+
1208
+ .db-settings-accent-swatch--maroon {
1209
+ background: #805365;
1210
+ }
1211
+
1212
+ .db-settings-accent-swatch--orange {
1213
+ background: #8a5a32;
1214
+ }
1215
+
1216
+ .db-settings-accent-swatch--gray {
1217
+ background: #676767;
931
1218
  }
932
1219
 
933
1220
  /* ── Folder View ─────────────────────────────────────────────── */
@@ -1034,6 +1321,13 @@ body.db-resizing-sidebar * {
1034
1321
  padding-bottom: 10px;
1035
1322
  }
1036
1323
 
1324
+ /* Keep the preview-mode chevron on the same lifted baseline as its tab
1325
+ label. Squisq's native 9px bottom padding is paired with the native 4px
1326
+ tab padding; the DocBlocks override above adds 6px to the latter. */
1327
+ .db-shell .squisq-use-mode-trigger {
1328
+ padding-bottom: 15px;
1329
+ }
1330
+
1037
1331
  .squisq-toolbar-button[aria-label='Insert image'] {
1038
1332
  font-size: 0;
1039
1333
  background: no-repeat center / 18px
@@ -1072,6 +1366,24 @@ body.db-resizing-sidebar * {
1072
1366
  color: var(--db-text-secondary);
1073
1367
  }
1074
1368
 
1369
+ .db-toolbar-export-trigger {
1370
+ margin-left: 4px;
1371
+ }
1372
+
1373
+ .db-toolbar-export-trigger svg {
1374
+ width: 16px;
1375
+ height: 16px;
1376
+ }
1377
+
1378
+ .db-toolbar-settings-trigger {
1379
+ margin-left: 2px;
1380
+ }
1381
+
1382
+ .db-toolbar-settings-trigger svg {
1383
+ width: 16px;
1384
+ height: 16px;
1385
+ }
1386
+
1075
1387
  .db-toolbar-menu-dropdown {
1076
1388
  position: absolute;
1077
1389
  right: 0;
@@ -1156,6 +1468,53 @@ body.db-resizing-sidebar * {
1156
1468
  border-color: var(--db-accent);
1157
1469
  }
1158
1470
 
1471
+ .db-export-path-row {
1472
+ display: flex;
1473
+ align-items: center;
1474
+ gap: 6px;
1475
+ }
1476
+
1477
+ .db-export-path-input {
1478
+ flex: 1;
1479
+ min-width: 0;
1480
+ box-sizing: border-box;
1481
+ padding: 6px 8px;
1482
+ font-size: 13px;
1483
+ background: var(--db-bg-subtle);
1484
+ color: var(--db-text);
1485
+ border: 1px solid var(--db-border);
1486
+ border-radius: 4px;
1487
+ outline: none;
1488
+ }
1489
+
1490
+ .db-export-path-input:focus {
1491
+ border-color: var(--db-accent);
1492
+ }
1493
+
1494
+ .db-export-path-pick {
1495
+ flex: 0 0 auto;
1496
+ height: 30px;
1497
+ padding: 0 10px;
1498
+ font-size: 13px;
1499
+ font-weight: 600;
1500
+ line-height: 1;
1501
+ color: var(--db-text-secondary);
1502
+ background: var(--db-bg-subtle);
1503
+ border: 1px solid var(--db-border);
1504
+ border-radius: 4px;
1505
+ cursor: pointer;
1506
+ }
1507
+
1508
+ .db-export-path-pick:hover {
1509
+ background: var(--db-bg-hover);
1510
+ }
1511
+
1512
+ .db-export-path-input:disabled,
1513
+ .db-export-path-pick:disabled {
1514
+ opacity: 0.5;
1515
+ cursor: default;
1516
+ }
1517
+
1159
1518
  .db-export-hint {
1160
1519
  display: block;
1161
1520
  margin-top: 3px;
@@ -1210,12 +1569,13 @@ body.db-resizing-sidebar * {
1210
1569
  .db-export-chip--active {
1211
1570
  background: var(--db-accent);
1212
1571
  border-color: var(--db-accent);
1213
- color: #ffffff;
1572
+ color: var(--db-text-on-accent);
1214
1573
  }
1215
1574
 
1216
1575
  .db-export-chip--active:hover {
1217
1576
  background: var(--db-accent-hover);
1218
1577
  border-color: var(--db-accent-hover);
1578
+ color: var(--db-text-on-accent);
1219
1579
  }
1220
1580
 
1221
1581
  .db-export-chip:focus-visible {
@@ -1257,13 +1617,14 @@ body.db-resizing-sidebar * {
1257
1617
 
1258
1618
  .db-export-btn--primary {
1259
1619
  background: var(--db-accent);
1260
- color: #fff;
1620
+ color: var(--db-text-on-accent);
1261
1621
  border-color: var(--db-accent);
1262
1622
  }
1263
1623
 
1264
1624
  .db-export-btn--primary:hover {
1265
1625
  background: var(--db-accent-hover);
1266
1626
  border-color: var(--db-accent-hover);
1627
+ color: var(--db-text-on-accent);
1267
1628
  }
1268
1629
 
1269
1630
  /* ── Squisq editor chrome separators ─────────────────────────── */
@@ -1279,7 +1640,7 @@ body.db-resizing-sidebar * {
1279
1640
  }
1280
1641
 
1281
1642
  .db-shell[data-theme='light'] .squisq-toolbar {
1282
- background: var(--db-accent-tint);
1643
+ background: var(--db-bg-subtle);
1283
1644
  }
1284
1645
 
1285
1646
  .db-shell[data-theme='light'] .squisq-toolbar-view-tabs {
@@ -1292,7 +1653,7 @@ body.db-resizing-sidebar * {
1292
1653
  }
1293
1654
 
1294
1655
  .db-shell[data-theme='dark'] .squisq-toolbar-view-tabs {
1295
- background: #16110b;
1656
+ background: var(--db-editor-canvas);
1296
1657
  }
1297
1658
 
1298
1659
  /* ── Inline preview gutter: thematic green ──────────────────── */
@@ -1310,7 +1671,7 @@ body.db-resizing-sidebar * {
1310
1671
  --squisq-preview-card-border: var(--db-border);
1311
1672
  --squisq-preview-card-shadow: 0 1px 2px rgba(40, 30, 15, 0.08);
1312
1673
  --squisq-preview-card-title: var(--db-accent-deep);
1313
- --squisq-preview-card-svg-bg: var(--db-accent-tint);
1674
+ --squisq-preview-card-svg-bg: var(--db-bg-subtle);
1314
1675
  --squisq-preview-dot-halo: var(--db-gutter-bg);
1315
1676
  --squisq-preview-empty-bg: #ffffff;
1316
1677
  --squisq-preview-empty-border: var(--db-border);
@@ -1355,15 +1716,51 @@ body.db-resizing-sidebar * {
1355
1716
  }
1356
1717
 
1357
1718
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-container {
1358
- background: #16110b;
1719
+ background: var(--db-editor-canvas);
1359
1720
  }
1360
1721
 
1361
1722
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor {
1362
1723
  background: var(--db-bg);
1363
1724
  }
1364
1725
 
1726
+ /* The WYSIWYG canvas owns its scroll port, so the browser's native light
1727
+ scrollbar otherwise cuts a bright stripe through the dark editor. Keep
1728
+ the track and thumb within the DocBlocks palette; Firefox uses the
1729
+ standard properties while Chromium/Electron use the WebKit pseudo-elements. */
1730
+ .db-shell .squisq-wysiwyg-container {
1731
+ scrollbar-color: var(--db-border-strong) var(--db-bg);
1732
+ scrollbar-width: thin;
1733
+ }
1734
+
1735
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar {
1736
+ width: 12px;
1737
+ height: 12px;
1738
+ }
1739
+
1740
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-track,
1741
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-corner {
1742
+ background: var(--db-bg);
1743
+ }
1744
+
1745
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-thumb {
1746
+ min-height: 32px;
1747
+ background: var(--db-border-strong);
1748
+ border: 3px solid var(--db-bg);
1749
+ border-radius: 999px;
1750
+ }
1751
+
1752
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-thumb:hover {
1753
+ background: var(--db-accent);
1754
+ }
1755
+
1756
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-button {
1757
+ display: none;
1758
+ width: 0;
1759
+ height: 0;
1760
+ }
1761
+
1365
1762
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor pre {
1366
- background: #16110b;
1763
+ background: var(--db-editor-canvas);
1367
1764
  }
1368
1765
 
1369
1766
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor code {
@@ -1382,7 +1779,7 @@ body.db-resizing-sidebar * {
1382
1779
  }
1383
1780
 
1384
1781
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-preview-codeblock {
1385
- background: #16110b;
1782
+ background: var(--db-editor-canvas);
1386
1783
  }
1387
1784
 
1388
1785
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-status-bar {
@@ -1477,10 +1874,17 @@ body.db-resizing-sidebar * {
1477
1874
  filter: grayscale(1);
1478
1875
  }
1479
1876
 
1480
- /* Closed-state template trigger: neutralize squisq's slate-navy bg ── */
1877
+ /* Keep the block-type and transition triggers on the same DocBlocks surface.
1878
+ The transition trigger has no thumbnail, so give it the block trigger's
1879
+ natural rendered height explicitly. */
1880
+ .db-shell .squisq-editor-shell .squisq-transition-picker-trigger {
1881
+ box-sizing: border-box;
1882
+ height: 29px;
1883
+ }
1884
+
1481
1885
  .db-shell[data-theme='dark']
1482
1886
  .squisq-editor-shell[data-theme='dark']
1483
- .squisq-template-picker-trigger {
1887
+ :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger) {
1484
1888
  background: var(--db-bg-subtle);
1485
1889
  border-color: var(--db-border);
1486
1890
  color: var(--db-text);
@@ -1488,7 +1892,7 @@ body.db-resizing-sidebar * {
1488
1892
 
1489
1893
  .db-shell[data-theme='dark']
1490
1894
  .squisq-editor-shell[data-theme='dark']
1491
- .squisq-template-picker-trigger:hover {
1895
+ :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger):hover {
1492
1896
  background: var(--db-bg-hover);
1493
1897
  border-color: var(--db-border-strong);
1494
1898
  }
@@ -1544,15 +1948,15 @@ html:has(.db-shell[data-theme='dark']) .squisq-tooltip {
1544
1948
 
1545
1949
  .db-shell[data-theme='dark']
1546
1950
  .squisq-editor-shell[data-theme='dark']
1547
- .squisq-template-picker-trigger--open {
1951
+ :is(.squisq-template-picker-trigger--open, .squisq-transition-picker-trigger--open) {
1548
1952
  border-color: var(--db-accent-hover);
1549
1953
  outline-color: var(--db-accent-soft-25);
1550
1954
  }
1551
1955
 
1552
- /* The template gallery is rendered into document.body via createPortal,
1553
- so it lives outside `.db-shell`. Hoist the same brown/canvas tokens
1554
- onto the html element (gated by `:has(.db-shell[data-theme=…])`) so
1555
- the portal rules below can pull from the same source of truth. */
1956
+ /* The template gallery and file-tree context menu render into document.body
1957
+ via createPortal, so they live outside `.db-shell`. Hoist the same
1958
+ brown/canvas tokens onto the html element (gated by the resolved shell
1959
+ theme) so every portaled surface keeps the DocBlocks palette. */
1556
1960
  html:has(.db-shell[data-theme='dark']) {
1557
1961
  --db-bg: #1a1812;
1558
1962
  --db-bg-subtle: #262219;
@@ -1560,7 +1964,11 @@ html:has(.db-shell[data-theme='dark']) {
1560
1964
  --db-border: #4d4636;
1561
1965
  --db-border-strong: #6b6448;
1562
1966
  --db-text: #e8e2d0;
1967
+ --db-text-secondary: #d4ccb0;
1563
1968
  --db-text-muted: #a89a7c;
1969
+ --db-danger: #f87171;
1970
+ --db-danger-bg: #1c1917;
1971
+ --db-shadow: rgba(0, 0, 0, 0.4);
1564
1972
  --db-accent: #c8b48f;
1565
1973
  --db-accent-hover: #dec79d;
1566
1974
  --db-accent-soft-15: rgba(200, 180, 143, 0.18);
@@ -1576,7 +1984,11 @@ html:has(.db-shell[data-theme='light']) {
1576
1984
  --db-border: #d6cdb0;
1577
1985
  --db-border-strong: #b5a985;
1578
1986
  --db-text: #2a2419;
1987
+ --db-text-secondary: #3d3528;
1579
1988
  --db-text-muted: #6b614a;
1989
+ --db-danger: #b22b1b;
1990
+ --db-danger-bg: #fdf0ee;
1991
+ --db-shadow: rgba(40, 30, 15, 0.12);
1580
1992
  --db-accent: #7d6948;
1581
1993
  --db-accent-hover: #5e4f37;
1582
1994
  --db-accent-soft-15: rgba(125, 105, 72, 0.15);
@@ -1585,10 +1997,645 @@ html:has(.db-shell[data-theme='light']) {
1585
1997
  --db-gutter-bg: #efe8d4;
1586
1998
  }
1587
1999
 
1588
- html:has(.db-shell[data-theme='dark']) #squisq-template-gallery-portal {
1589
- background: var(--db-bg-subtle);
1590
- border-color: var(--db-border);
1591
- box-shadow:
2000
+ /* Accent variants keep Brown as the untouched default while recoloring the
2001
+ full chrome palette for either appearance. The same tokens are hoisted to
2002
+ `html` so Squisq portals and file-tree menus inherit the active variant. */
2003
+ .db-shell[data-theme='light']:not([data-accent='brown']),
2004
+ html:has(.db-shell[data-theme='light']:not([data-accent='brown'])) {
2005
+ --db-accent-soft-08: rgb(var(--db-accent-rgb) / 8%);
2006
+ --db-accent-soft-10: rgb(var(--db-accent-rgb) / 10%);
2007
+ --db-accent-soft-12: rgb(var(--db-accent-rgb) / 12%);
2008
+ --db-accent-soft-15: rgb(var(--db-accent-rgb) / 15%);
2009
+ --db-accent-soft-25: rgb(var(--db-accent-rgb) / 25%);
2010
+ --db-gallery-backdrop: rgba(30, 30, 30, 0.24);
2011
+ --db-gallery-panel-bg: var(--db-bg);
2012
+ --db-gallery-raised-bg: var(--db-bg);
2013
+ --db-gallery-icon-bg: var(--db-gutter-bg);
2014
+ --db-gallery-new-bg: var(--db-bg-subtle);
2015
+ --db-gallery-placeholder: var(--db-text-muted);
2016
+ }
2017
+
2018
+ .db-shell[data-theme='dark']:not([data-accent='brown']),
2019
+ html:has(.db-shell[data-theme='dark']:not([data-accent='brown'])) {
2020
+ --db-accent-soft-08: rgb(var(--db-accent-rgb) / 8%);
2021
+ --db-accent-soft-10: rgb(var(--db-accent-rgb) / 10%);
2022
+ --db-accent-soft-12: rgb(var(--db-accent-rgb) / 12%);
2023
+ --db-accent-soft-15: rgb(var(--db-accent-rgb) / 18%);
2024
+ --db-accent-soft-25: rgb(var(--db-accent-rgb) / 28%);
2025
+ --db-gallery-backdrop: rgba(0, 0, 0, 0.58);
2026
+ --db-gallery-panel-bg: var(--db-bg);
2027
+ --db-gallery-header-bg: var(--db-editor-canvas);
2028
+ --db-gallery-raised-bg: var(--db-bg-subtle);
2029
+ --db-gallery-icon-bg: var(--db-editor-canvas);
2030
+ --db-gallery-new-bg: var(--db-bg-subtle);
2031
+ --db-gallery-placeholder: var(--db-text-muted);
2032
+ }
2033
+
2034
+ .db-shell[data-theme='light'][data-accent='green'],
2035
+ html:has(.db-shell[data-theme='light'][data-accent='green']) {
2036
+ --db-bg-subtle: #edf4ef;
2037
+ --db-bg-hover: #dfece3;
2038
+ --db-bg-selected: #4f715d;
2039
+ --db-bg-selected-hover: #3d5949;
2040
+ --db-border: #c6d8cb;
2041
+ --db-border-strong: #98b3a1;
2042
+ --db-text: #202a23;
2043
+ --db-text-secondary: #334038;
2044
+ --db-text-muted: #5b6d61;
2045
+ --db-text-placeholder: #69786d;
2046
+ --db-accent-rgb: 79 113 93;
2047
+ --db-accent: #4f715d;
2048
+ --db-accent-hover: #3d5949;
2049
+ --db-accent-tint-strong: #cfe0d3;
2050
+ --db-accent-deep: #284534;
2051
+ --db-gutter-bg: #e5f0e8;
2052
+ --db-input-border: #abc2b1;
2053
+ }
2054
+
2055
+ .db-shell[data-theme='dark'][data-accent='green'],
2056
+ html:has(.db-shell[data-theme='dark'][data-accent='green']) {
2057
+ --db-bg: #121814;
2058
+ --db-bg-subtle: #1c261f;
2059
+ --db-bg-hover: #2b392e;
2060
+ --db-bg-selected: #2b392e;
2061
+ --db-bg-selected-hover: #3a4b3e;
2062
+ --db-border: #3b4e40;
2063
+ --db-border-strong: #5b705f;
2064
+ --db-text: #e2ebe4;
2065
+ --db-text-secondary: #cbd9ce;
2066
+ --db-text-muted: #91a596;
2067
+ --db-text-placeholder: #607267;
2068
+ --db-accent-rgb: 158 194 168;
2069
+ --db-accent: #9ec2a8;
2070
+ --db-accent-hover: #b4d2bc;
2071
+ --db-text-on-accent: #132018;
2072
+ --db-text-on-selected: #e2ebe4;
2073
+ --db-accent-tint-strong: #2f4034;
2074
+ --db-accent-deep: #d4e8d9;
2075
+ --db-gutter-bg: #3b4d40;
2076
+ --db-input-border: #9ec2a8;
2077
+ --db-editor-canvas: #0e1510;
2078
+ --db-badge-bg: #294031;
2079
+ --db-badge-text: #dcf1e2;
2080
+ --db-badge-text-hover: #effaf2;
2081
+ }
2082
+
2083
+ .db-shell[data-theme='light'][data-accent='blue'],
2084
+ html:has(.db-shell[data-theme='light'][data-accent='blue']) {
2085
+ --db-bg-subtle: #eef2f7;
2086
+ --db-bg-hover: #e1e8f0;
2087
+ --db-bg-selected: #526f91;
2088
+ --db-bg-selected-hover: #3c5675;
2089
+ --db-border: #c7d1de;
2090
+ --db-border-strong: #99aabd;
2091
+ --db-text: #202733;
2092
+ --db-text-secondary: #34404e;
2093
+ --db-text-muted: #5d6979;
2094
+ --db-text-placeholder: #6d7886;
2095
+ --db-accent-rgb: 82 111 145;
2096
+ --db-accent: #526f91;
2097
+ --db-accent-hover: #3c5675;
2098
+ --db-accent-tint-strong: #d0dbe7;
2099
+ --db-accent-deep: #293e58;
2100
+ --db-gutter-bg: #e7edf5;
2101
+ --db-input-border: #acb9c9;
2102
+ }
2103
+
2104
+ .db-shell[data-theme='dark'][data-accent='blue'],
2105
+ html:has(.db-shell[data-theme='dark'][data-accent='blue']) {
2106
+ --db-bg: #13171c;
2107
+ --db-bg-subtle: #1c232b;
2108
+ --db-bg-hover: #2a3542;
2109
+ --db-bg-selected: #2a3542;
2110
+ --db-bg-selected-hover: #39495a;
2111
+ --db-border: #3b4a5c;
2112
+ --db-border-strong: #5a6d83;
2113
+ --db-text: #e2e8ef;
2114
+ --db-text-secondary: #cad5e0;
2115
+ --db-text-muted: #8fa0b3;
2116
+ --db-text-placeholder: #5f7083;
2117
+ --db-accent-rgb: 167 189 216;
2118
+ --db-accent: #a7bdd8;
2119
+ --db-accent-hover: #bdd0e5;
2120
+ --db-text-on-accent: #131b24;
2121
+ --db-text-on-selected: #e2e8ef;
2122
+ --db-accent-tint-strong: #2e3b49;
2123
+ --db-accent-deep: #d8e5f2;
2124
+ --db-gutter-bg: #394858;
2125
+ --db-input-border: #a7bdd8;
2126
+ --db-editor-canvas: #0f1318;
2127
+ --db-badge-bg: #28394a;
2128
+ --db-badge-text: #dceaff;
2129
+ --db-badge-text-hover: #edf5ff;
2130
+ }
2131
+
2132
+ .db-shell[data-theme='light'][data-accent='purple'],
2133
+ html:has(.db-shell[data-theme='light'][data-accent='purple']) {
2134
+ --db-bg-subtle: #f3eff6;
2135
+ --db-bg-hover: #e9e1ef;
2136
+ --db-bg-selected: #735b8c;
2137
+ --db-bg-selected-hover: #59436f;
2138
+ --db-border: #d5c8dd;
2139
+ --db-border-strong: #b19cbe;
2140
+ --db-text: #29222e;
2141
+ --db-text-secondary: #403648;
2142
+ --db-text-muted: #6e6075;
2143
+ --db-text-placeholder: #7c6e82;
2144
+ --db-accent-rgb: 115 91 140;
2145
+ --db-accent: #735b8c;
2146
+ --db-accent-hover: #59436f;
2147
+ --db-accent-tint-strong: #ddd0e4;
2148
+ --db-accent-deep: #483252;
2149
+ --db-gutter-bg: #eee7f2;
2150
+ --db-input-border: #c2afcc;
2151
+ }
2152
+
2153
+ .db-shell[data-theme='dark'][data-accent='purple'],
2154
+ html:has(.db-shell[data-theme='dark'][data-accent='purple']) {
2155
+ --db-bg: #18141b;
2156
+ --db-bg-subtle: #251d29;
2157
+ --db-bg-hover: #382c3e;
2158
+ --db-bg-selected: #382c3e;
2159
+ --db-bg-selected-hover: #4b3a53;
2160
+ --db-border: #504057;
2161
+ --db-border-strong: #705b79;
2162
+ --db-text: #ece3ef;
2163
+ --db-text-secondary: #d8cadd;
2164
+ --db-text-muted: #a38fab;
2165
+ --db-text-placeholder: #715f79;
2166
+ --db-accent-rgb: 194 169 212;
2167
+ --db-accent: #c2a9d4;
2168
+ --db-accent-hover: #d6bee3;
2169
+ --db-text-on-accent: #211727;
2170
+ --db-text-on-selected: #ece3ef;
2171
+ --db-accent-tint-strong: #413348;
2172
+ --db-accent-deep: #eadcf1;
2173
+ --db-gutter-bg: #493b50;
2174
+ --db-input-border: #c2a9d4;
2175
+ --db-editor-canvas: #120f15;
2176
+ --db-badge-bg: #3b2a44;
2177
+ --db-badge-text: #f2e2fb;
2178
+ --db-badge-text-hover: #faefff;
2179
+ }
2180
+
2181
+ .db-shell[data-theme='light'][data-accent='maroon'],
2182
+ html:has(.db-shell[data-theme='light'][data-accent='maroon']) {
2183
+ --db-bg-subtle: #f7eff2;
2184
+ --db-bg-hover: #eedfe5;
2185
+ --db-bg-selected: #805365;
2186
+ --db-bg-selected-hover: #643d4d;
2187
+ --db-border: #dec8d0;
2188
+ --db-border-strong: #bd9ba8;
2189
+ --db-text: #2f2227;
2190
+ --db-text-secondary: #49343d;
2191
+ --db-text-muted: #775e68;
2192
+ --db-text-placeholder: #856c75;
2193
+ --db-accent-rgb: 128 83 101;
2194
+ --db-accent: #805365;
2195
+ --db-accent-hover: #643d4d;
2196
+ --db-accent-tint-strong: #e6d0d8;
2197
+ --db-accent-deep: #53303e;
2198
+ --db-gutter-bg: #f2e7eb;
2199
+ --db-input-border: #cdaeb9;
2200
+ }
2201
+
2202
+ .db-shell[data-theme='dark'][data-accent='maroon'],
2203
+ html:has(.db-shell[data-theme='dark'][data-accent='maroon']) {
2204
+ --db-bg: #1b1316;
2205
+ --db-bg-subtle: #291d21;
2206
+ --db-bg-hover: #3d2b31;
2207
+ --db-bg-selected: #3d2b31;
2208
+ --db-bg-selected-hover: #513942;
2209
+ --db-border: #553e46;
2210
+ --db-border-strong: #785b65;
2211
+ --db-text: #f0e3e7;
2212
+ --db-text-secondary: #dccbd1;
2213
+ --db-text-muted: #aa929a;
2214
+ --db-text-placeholder: #765f67;
2215
+ --db-accent-rgb: 208 165 180;
2216
+ --db-accent: #d0a5b4;
2217
+ --db-accent-hover: #e2bac8;
2218
+ --db-text-on-accent: #26171c;
2219
+ --db-text-on-selected: #f0e3e7;
2220
+ --db-accent-tint-strong: #473139;
2221
+ --db-accent-deep: #f0d8e0;
2222
+ --db-gutter-bg: #503b42;
2223
+ --db-input-border: #d0a5b4;
2224
+ --db-editor-canvas: #150e11;
2225
+ --db-badge-bg: #442832;
2226
+ --db-badge-text: #ffe4ec;
2227
+ --db-badge-text-hover: #fff2f6;
2228
+ }
2229
+
2230
+ .db-shell[data-theme='light'][data-accent='orange'],
2231
+ html:has(.db-shell[data-theme='light'][data-accent='orange']) {
2232
+ --db-bg-subtle: #f8f1e9;
2233
+ --db-bg-hover: #f0e4d6;
2234
+ --db-bg-selected: #8a5a32;
2235
+ --db-bg-selected-hover: #6d4323;
2236
+ --db-border: #e0cfbc;
2237
+ --db-border-strong: #c2a282;
2238
+ --db-text: #30271f;
2239
+ --db-text-secondary: #4a3c30;
2240
+ --db-text-muted: #776655;
2241
+ --db-text-placeholder: #857362;
2242
+ --db-accent-rgb: 138 90 50;
2243
+ --db-accent: #8a5a32;
2244
+ --db-accent-hover: #6d4323;
2245
+ --db-accent-tint-strong: #ead8c5;
2246
+ --db-accent-deep: #57371f;
2247
+ --db-gutter-bg: #f3e9de;
2248
+ --db-input-border: #cfb394;
2249
+ }
2250
+
2251
+ .db-shell[data-theme='dark'][data-accent='orange'],
2252
+ html:has(.db-shell[data-theme='dark'][data-accent='orange']) {
2253
+ --db-bg: #1b1611;
2254
+ --db-bg-subtle: #2a2118;
2255
+ --db-bg-hover: #3e3123;
2256
+ --db-bg-selected: #3e3123;
2257
+ --db-bg-selected-hover: #52412f;
2258
+ --db-border: #574634;
2259
+ --db-border-strong: #79654d;
2260
+ --db-text: #f0e7dc;
2261
+ --db-text-secondary: #ddcfbe;
2262
+ --db-text-muted: #aa9883;
2263
+ --db-text-placeholder: #756552;
2264
+ --db-accent-rgb: 215 176 138;
2265
+ --db-accent: #d7b08a;
2266
+ --db-accent-hover: #e8c39e;
2267
+ --db-text-on-accent: #251a11;
2268
+ --db-text-on-selected: #f0e7dc;
2269
+ --db-accent-tint-strong: #493a2a;
2270
+ --db-accent-deep: #f1dbc4;
2271
+ --db-gutter-bg: #514333;
2272
+ --db-input-border: #d7b08a;
2273
+ --db-editor-canvas: #15100c;
2274
+ --db-badge-bg: #44301f;
2275
+ --db-badge-text: #ffe8d1;
2276
+ --db-badge-text-hover: #fff4e8;
2277
+ }
2278
+
2279
+ .db-shell[data-theme='light'][data-accent='gray'],
2280
+ html:has(.db-shell[data-theme='light'][data-accent='gray']) {
2281
+ --db-bg-subtle: #f2f2f2;
2282
+ --db-bg-hover: #e6e6e6;
2283
+ --db-bg-selected: #676767;
2284
+ --db-bg-selected-hover: #505050;
2285
+ --db-border: #d1d1d1;
2286
+ --db-border-strong: #a8a8a8;
2287
+ --db-text: #252525;
2288
+ --db-text-secondary: #3d3d3d;
2289
+ --db-text-muted: #686868;
2290
+ --db-text-placeholder: #777777;
2291
+ --db-accent-rgb: 103 103 103;
2292
+ --db-accent: #676767;
2293
+ --db-accent-hover: #505050;
2294
+ --db-accent-tint-strong: #d8d8d8;
2295
+ --db-accent-deep: #383838;
2296
+ --db-gutter-bg: #ececec;
2297
+ --db-input-border: #b8b8b8;
2298
+ }
2299
+
2300
+ .db-shell[data-theme='dark'][data-accent='gray'],
2301
+ html:has(.db-shell[data-theme='dark'][data-accent='gray']) {
2302
+ --db-bg: #171717;
2303
+ --db-bg-subtle: #242424;
2304
+ --db-bg-hover: #363636;
2305
+ --db-bg-selected: #363636;
2306
+ --db-bg-selected-hover: #484848;
2307
+ --db-border: #494949;
2308
+ --db-border-strong: #686868;
2309
+ --db-text: #e8e8e8;
2310
+ --db-text-secondary: #d1d1d1;
2311
+ --db-text-muted: #9a9a9a;
2312
+ --db-text-placeholder: #696969;
2313
+ --db-accent-rgb: 184 184 184;
2314
+ --db-accent: #b8b8b8;
2315
+ --db-accent-hover: #cecece;
2316
+ --db-text-on-accent: #1b1b1b;
2317
+ --db-text-on-selected: #e8e8e8;
2318
+ --db-accent-tint-strong: #383838;
2319
+ --db-accent-deep: #e2e2e2;
2320
+ --db-gutter-bg: #444444;
2321
+ --db-input-border: #b8b8b8;
2322
+ --db-editor-canvas: #111111;
2323
+ --db-badge-bg: #333333;
2324
+ --db-badge-text: #eeeeee;
2325
+ --db-badge-text-hover: #ffffff;
2326
+ }
2327
+
2328
+ html:has(.db-shell[data-theme='light']:not([data-accent='brown'])) .squisq-tooltip {
2329
+ background: var(--db-accent-deep);
2330
+ color: var(--db-bg-subtle);
2331
+ }
2332
+
2333
+ html:has(.db-shell[data-theme='dark']:not([data-accent='brown'])) .squisq-tooltip {
2334
+ background: var(--db-accent-deep);
2335
+ color: var(--db-bg);
2336
+ }
2337
+
2338
+ html:has(.db-shell[data-theme='dark'])
2339
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog[data-theme='dark'] {
2340
+ --squisq-template-gallery-backdrop: var(--db-gallery-backdrop, rgba(18, 14, 9, 0.58));
2341
+ --squisq-template-gallery-panel-bg: var(--db-gallery-panel-bg, var(--db-bg));
2342
+ --squisq-template-gallery-panel-border: var(--db-border);
2343
+ --squisq-template-gallery-header-bg: var(--db-gallery-header-bg, #17130d);
2344
+ --squisq-template-gallery-header-border: var(--db-border);
2345
+ --squisq-template-gallery-title: var(--db-text);
2346
+ --squisq-template-gallery-close-color: var(--db-text-muted);
2347
+ --squisq-template-gallery-close-bg: var(--db-bg-subtle);
2348
+ --squisq-template-gallery-close-border: var(--db-border);
2349
+ --squisq-template-gallery-close-hover-color: var(--db-text);
2350
+ --squisq-template-gallery-close-hover-border: var(--db-accent);
2351
+ --squisq-template-gallery-close-hover-shadow: 0 1px 6px var(--db-accent-soft-15);
2352
+ --squisq-template-gallery-bg: var(--db-bg);
2353
+ --squisq-template-gallery-text: var(--db-text);
2354
+ --squisq-template-gallery-border: var(--db-border);
2355
+ --squisq-template-gallery-search-bg: var(--db-gallery-header-bg, #17130d);
2356
+ --squisq-template-gallery-search-border: var(--db-border);
2357
+ --squisq-template-gallery-search-icon: var(--db-text-muted);
2358
+ --squisq-template-gallery-search-input: var(--db-text);
2359
+ --squisq-template-gallery-search-placeholder: var(--db-gallery-placeholder, #8f8267);
2360
+ --squisq-template-gallery-empty: var(--db-text-muted);
2361
+ --squisq-template-gallery-option-bg: var(--db-bg-subtle);
2362
+ --squisq-template-gallery-option-border: var(--db-border);
2363
+ --squisq-template-gallery-option-hover-bg: var(--db-bg-hover);
2364
+ --squisq-template-gallery-option-hover-border: var(--db-accent);
2365
+ --squisq-template-gallery-option-hover-shadow: 0 1px 5px var(--db-accent-soft-15);
2366
+ --squisq-template-gallery-card-bg: transparent;
2367
+ --squisq-template-gallery-card-border: var(--db-border);
2368
+ --squisq-template-gallery-card-hover-bg: var(--db-bg-hover);
2369
+ --squisq-template-gallery-card-hover-border: var(--db-accent);
2370
+ --squisq-template-gallery-card-hover-shadow: 0 1px 5px var(--db-accent-soft-15);
2371
+ --squisq-template-gallery-selected-bg: var(--db-accent-tint-strong);
2372
+ --squisq-template-gallery-selected-border: var(--db-accent-hover);
2373
+ --squisq-template-gallery-selected-shadow: 0 0 0 2px var(--db-accent-soft-25);
2374
+ --squisq-template-gallery-card-icon-bg: var(--db-gallery-icon-bg, #15120d);
2375
+ --squisq-template-gallery-card-icon-border: var(--db-border);
2376
+ --squisq-template-gallery-content-preview-bg: var(--db-gallery-icon-bg, #15120d);
2377
+ --squisq-template-gallery-name: var(--db-text);
2378
+ --squisq-template-gallery-description: var(--db-text-muted);
2379
+ --squisq-template-gallery-new-bg: var(--db-gallery-new-bg, #2b2418);
2380
+ --squisq-template-gallery-new-border: var(--db-accent);
2381
+ --squisq-template-gallery-new-hover-bg: var(--db-accent-tint-strong);
2382
+ --squisq-template-gallery-new-hover-border: var(--db-accent-hover);
2383
+ --squisq-template-gallery-new-plus-color: var(--db-accent-hover);
2384
+ --squisq-template-gallery-new-plus-bg: var(--db-gallery-header-bg, #17130d);
2385
+ --squisq-template-gallery-new-plus-border: var(--db-accent);
2386
+ --squisq-template-gallery-new-label: var(--db-text);
2387
+ --squisq-template-gallery-new-desc: var(--db-text-muted);
2388
+ --squisq-template-gallery-section-border: var(--db-border);
2389
+ --squisq-template-gallery-section-title: var(--db-text);
2390
+ }
2391
+
2392
+ html:has(.db-shell[data-theme='light'])
2393
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog[data-theme='light'] {
2394
+ --squisq-template-gallery-backdrop: var(--db-gallery-backdrop, rgba(42, 36, 25, 0.24));
2395
+ --squisq-template-gallery-panel-bg: var(--db-gallery-panel-bg, #fffdf7);
2396
+ --squisq-template-gallery-panel-border: var(--db-border);
2397
+ --squisq-template-gallery-header-bg: var(--db-bg-subtle);
2398
+ --squisq-template-gallery-header-border: var(--db-border);
2399
+ --squisq-template-gallery-title: var(--db-text);
2400
+ --squisq-template-gallery-close-color: var(--db-text-muted);
2401
+ --squisq-template-gallery-close-bg: var(--db-gallery-raised-bg, #fffaf0);
2402
+ --squisq-template-gallery-close-border: var(--db-border);
2403
+ --squisq-template-gallery-close-hover-color: var(--db-text);
2404
+ --squisq-template-gallery-close-hover-border: var(--db-accent);
2405
+ --squisq-template-gallery-close-hover-shadow: 0 1px 4px var(--db-accent-soft-15);
2406
+ --squisq-template-gallery-bg: var(--db-gallery-panel-bg, #fffdf7);
2407
+ --squisq-template-gallery-text: var(--db-text);
2408
+ --squisq-template-gallery-border: var(--db-border);
2409
+ --squisq-template-gallery-search-bg: var(--db-bg-subtle);
2410
+ --squisq-template-gallery-search-border: var(--db-border);
2411
+ --squisq-template-gallery-search-icon: var(--db-text-muted);
2412
+ --squisq-template-gallery-search-input: var(--db-text);
2413
+ --squisq-template-gallery-search-placeholder: var(--db-gallery-placeholder, #8b8065);
2414
+ --squisq-template-gallery-empty: var(--db-text-muted);
2415
+ --squisq-template-gallery-option-bg: var(--db-gallery-raised-bg, #fffaf0);
2416
+ --squisq-template-gallery-option-border: var(--db-border);
2417
+ --squisq-template-gallery-option-hover-bg: var(--db-bg-hover);
2418
+ --squisq-template-gallery-option-hover-border: var(--db-accent);
2419
+ --squisq-template-gallery-option-hover-shadow: 0 1px 3px var(--db-accent-soft-15);
2420
+ --squisq-template-gallery-card-bg: transparent;
2421
+ --squisq-template-gallery-card-border: var(--db-border);
2422
+ --squisq-template-gallery-card-hover-bg: var(--db-bg-subtle);
2423
+ --squisq-template-gallery-card-hover-border: var(--db-accent);
2424
+ --squisq-template-gallery-card-hover-shadow: 0 1px 4px var(--db-accent-soft-15);
2425
+ --squisq-template-gallery-selected-bg: var(--db-bg-hover);
2426
+ --squisq-template-gallery-selected-border: var(--db-accent);
2427
+ --squisq-template-gallery-selected-shadow: 0 0 0 2px var(--db-accent-soft-15);
2428
+ --squisq-template-gallery-card-icon-bg: var(--db-gallery-icon-bg, #f6f0df);
2429
+ --squisq-template-gallery-card-icon-border: var(--db-border);
2430
+ --squisq-template-gallery-content-preview-bg: var(--db-gallery-icon-bg, #f6f0df);
2431
+ --squisq-template-gallery-name: var(--db-text);
2432
+ --squisq-template-gallery-description: var(--db-text-muted);
2433
+ --squisq-template-gallery-new-bg: var(--db-gallery-new-bg, #f1ead6);
2434
+ --squisq-template-gallery-new-border: var(--db-border-strong);
2435
+ --squisq-template-gallery-new-hover-bg: var(--db-bg-hover);
2436
+ --squisq-template-gallery-new-hover-border: var(--db-accent);
2437
+ --squisq-template-gallery-new-plus-color: var(--db-accent-hover);
2438
+ --squisq-template-gallery-new-plus-bg: var(--db-gallery-raised-bg, #fffaf0);
2439
+ --squisq-template-gallery-new-plus-border: var(--db-border-strong);
2440
+ --squisq-template-gallery-new-label: var(--db-text);
2441
+ --squisq-template-gallery-new-desc: var(--db-text-muted);
2442
+ --squisq-template-gallery-section-border: var(--db-border);
2443
+ --squisq-template-gallery-section-title: var(--db-text);
2444
+ }
2445
+
2446
+ html:has(.db-shell) #squisq-template-gallery-dialog.squisq-template-gallery-dialog {
2447
+ background: var(--squisq-template-gallery-backdrop);
2448
+ backdrop-filter: blur(var(--squisq-template-gallery-backdrop-blur, 2px));
2449
+ }
2450
+
2451
+ html:has(.db-shell)
2452
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2453
+ .squisq-template-gallery-dialog-panel {
2454
+ background: var(--squisq-template-gallery-panel-bg);
2455
+ border-color: var(--squisq-template-gallery-panel-border);
2456
+ }
2457
+
2458
+ html:has(.db-shell)
2459
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2460
+ .squisq-template-gallery-dialog-header {
2461
+ background: var(--squisq-template-gallery-header-bg);
2462
+ border-bottom-color: var(--squisq-template-gallery-header-border);
2463
+ }
2464
+
2465
+ html:has(.db-shell)
2466
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2467
+ .squisq-template-gallery-dialog-title {
2468
+ color: var(--squisq-template-gallery-title);
2469
+ }
2470
+
2471
+ html:has(.db-shell)
2472
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2473
+ .squisq-template-gallery-dialog-close {
2474
+ color: var(--squisq-template-gallery-close-color);
2475
+ background: var(--squisq-template-gallery-close-bg);
2476
+ border-color: var(--squisq-template-gallery-close-border);
2477
+ }
2478
+
2479
+ html:has(.db-shell)
2480
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2481
+ .squisq-template-gallery-dialog-close:hover {
2482
+ color: var(--squisq-template-gallery-close-hover-color);
2483
+ border-color: var(--squisq-template-gallery-close-hover-border);
2484
+ box-shadow: var(--squisq-template-gallery-close-hover-shadow);
2485
+ }
2486
+
2487
+ html:has(.db-shell)
2488
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2489
+ .squisq-template-gallery {
2490
+ background: var(--squisq-template-gallery-bg);
2491
+ color: var(--squisq-template-gallery-text);
2492
+ }
2493
+
2494
+ html:has(.db-shell)
2495
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2496
+ .squisq-template-gallery-search {
2497
+ background: var(--squisq-template-gallery-search-bg);
2498
+ border-bottom-color: var(--squisq-template-gallery-search-border);
2499
+ }
2500
+
2501
+ html:has(.db-shell)
2502
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2503
+ .squisq-template-gallery-search-icon {
2504
+ color: var(--squisq-template-gallery-search-icon);
2505
+ }
2506
+
2507
+ html:has(.db-shell)
2508
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2509
+ .squisq-template-gallery-search-input {
2510
+ color: var(--squisq-template-gallery-search-input);
2511
+ }
2512
+
2513
+ html:has(.db-shell)
2514
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2515
+ .squisq-template-gallery-search-input::placeholder {
2516
+ color: var(--squisq-template-gallery-search-placeholder);
2517
+ }
2518
+
2519
+ html:has(.db-shell)
2520
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2521
+ .squisq-template-gallery-none {
2522
+ background: var(--squisq-template-gallery-option-bg);
2523
+ border-color: var(--squisq-template-gallery-option-border);
2524
+ }
2525
+
2526
+ html:has(.db-shell)
2527
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2528
+ .squisq-template-gallery-none:hover {
2529
+ background: var(--squisq-template-gallery-option-hover-bg);
2530
+ border-color: var(--squisq-template-gallery-option-hover-border);
2531
+ box-shadow: var(--squisq-template-gallery-option-hover-shadow);
2532
+ }
2533
+
2534
+ html:has(.db-shell)
2535
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2536
+ .squisq-template-gallery-none.squisq-template-gallery-card--selected,
2537
+ html:has(.db-shell)
2538
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2539
+ .squisq-template-gallery-card--selected {
2540
+ background: var(--squisq-template-gallery-selected-bg);
2541
+ border-color: var(--squisq-template-gallery-selected-border);
2542
+ box-shadow: var(--squisq-template-gallery-selected-shadow);
2543
+ }
2544
+
2545
+ html:has(.db-shell)
2546
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2547
+ .squisq-template-gallery-none-label {
2548
+ color: var(--squisq-template-gallery-section-title);
2549
+ }
2550
+
2551
+ html:has(.db-shell)
2552
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2553
+ .squisq-template-gallery-none-desc,
2554
+ html:has(.db-shell)
2555
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2556
+ .squisq-template-gallery-card-desc,
2557
+ html:has(.db-shell)
2558
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2559
+ .squisq-template-gallery-new-desc {
2560
+ color: var(--squisq-template-gallery-description);
2561
+ }
2562
+
2563
+ html:has(.db-shell)
2564
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2565
+ .squisq-template-gallery-card {
2566
+ background: var(--squisq-template-gallery-card-bg);
2567
+ border-color: var(--squisq-template-gallery-card-border);
2568
+ }
2569
+
2570
+ html:has(.db-shell)
2571
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2572
+ .squisq-template-gallery-card:hover {
2573
+ background: var(--squisq-template-gallery-card-hover-bg);
2574
+ border-color: var(--squisq-template-gallery-card-hover-border);
2575
+ box-shadow: var(--squisq-template-gallery-card-hover-shadow);
2576
+ }
2577
+
2578
+ html:has(.db-shell)
2579
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2580
+ .squisq-template-gallery-card-icon {
2581
+ background: var(--squisq-template-gallery-card-icon-bg);
2582
+ border-color: var(--squisq-template-gallery-card-icon-border);
2583
+ }
2584
+
2585
+ html:has(.db-shell)
2586
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2587
+ .squisq-template-gallery-content-preview {
2588
+ background: var(--squisq-template-gallery-content-preview-bg);
2589
+ }
2590
+
2591
+ html:has(.db-shell)
2592
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2593
+ .squisq-template-gallery-card-name,
2594
+ html:has(.db-shell)
2595
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2596
+ .squisq-template-gallery-new-label {
2597
+ color: var(--squisq-template-gallery-name);
2598
+ }
2599
+
2600
+ html:has(.db-shell)
2601
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2602
+ .squisq-template-gallery-new {
2603
+ background: var(--squisq-template-gallery-new-bg);
2604
+ border-color: var(--squisq-template-gallery-new-border);
2605
+ }
2606
+
2607
+ html:has(.db-shell)
2608
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2609
+ .squisq-template-gallery-new:hover {
2610
+ background: var(--squisq-template-gallery-new-hover-bg);
2611
+ border-color: var(--squisq-template-gallery-new-hover-border);
2612
+ }
2613
+
2614
+ html:has(.db-shell)
2615
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2616
+ .squisq-template-gallery-new-plus {
2617
+ color: var(--squisq-template-gallery-new-plus-color);
2618
+ background: var(--squisq-template-gallery-new-plus-bg);
2619
+ border-color: var(--squisq-template-gallery-new-plus-border);
2620
+ }
2621
+
2622
+ html:has(.db-shell)
2623
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2624
+ .squisq-template-gallery-section
2625
+ + .squisq-template-gallery-section {
2626
+ border-top-color: var(--squisq-template-gallery-section-border);
2627
+ }
2628
+
2629
+ html:has(.db-shell)
2630
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2631
+ .squisq-template-gallery-section-title {
2632
+ color: var(--squisq-template-gallery-section-title);
2633
+ }
2634
+
2635
+ html:has(.db-shell[data-theme='dark']) #squisq-template-gallery-portal {
2636
+ background: var(--db-bg-subtle);
2637
+ border-color: var(--db-border);
2638
+ box-shadow:
1592
2639
  0 8px 24px rgba(0, 0, 0, 0.5),
1593
2640
  0 2px 6px rgba(0, 0, 0, 0.3);
1594
2641
  }
@@ -1679,7 +2726,7 @@ html:has(.db-shell[data-theme='dark'])
1679
2726
 
1680
2727
  .db-shell[data-theme='light']
1681
2728
  .squisq-editor-shell[data-theme='light']
1682
- .squisq-template-picker-trigger--open {
2729
+ :is(.squisq-template-picker-trigger--open, .squisq-transition-picker-trigger--open) {
1683
2730
  border-color: var(--db-accent);
1684
2731
  outline-color: var(--db-accent-soft-25);
1685
2732
  }
@@ -1694,7 +2741,7 @@ html:has(.db-shell[data-theme='dark'])
1694
2741
  .db-shell[data-theme='light']
1695
2742
  .squisq-editor-shell[data-theme='light']
1696
2743
  .squisq-template-gallery-card--selected {
1697
- background: var(--db-accent-tint);
2744
+ background: var(--db-bg-subtle);
1698
2745
  border-color: var(--db-accent);
1699
2746
  box-shadow: 0 0 0 2px var(--db-accent-soft-15);
1700
2747
  }
@@ -1702,7 +2749,7 @@ html:has(.db-shell[data-theme='dark'])
1702
2749
  .db-shell[data-theme='light']
1703
2750
  .squisq-editor-shell[data-theme='light']
1704
2751
  .squisq-template-gallery-none.squisq-template-gallery-card--selected {
1705
- background: var(--db-accent-tint);
2752
+ background: var(--db-bg-subtle);
1706
2753
  border-color: var(--db-accent-tint-strong);
1707
2754
  }
1708
2755
 
@@ -1713,27 +2760,189 @@ html:has(.db-shell[data-theme='dark'])
1713
2760
  fill: var(--db-accent);
1714
2761
  }
1715
2762
 
1716
- /* ── Template badge: inherit OS font, amber palette ──────────── */
2763
+ /* ── Squisq block tags: high-contrast DocBlocks palette ─────── */
1717
2764
 
1718
- .db-shell .squisq-template-badge {
2765
+ .db-shell .squisq-template-badge,
2766
+ .db-shell .squisq-props-badge {
1719
2767
  font-family: inherit;
2768
+ opacity: 1;
2769
+ }
2770
+
2771
+ .db-shell .squisq-props-badge {
2772
+ transform: translateY(1px);
2773
+ }
2774
+
2775
+ .db-shell .squisq-template-badge-core::after {
2776
+ opacity: 0.82;
2777
+ }
2778
+
2779
+ .db-shell .squisq-template-badge::before,
2780
+ .db-shell .squisq-template-badge::after {
2781
+ min-height: 20px;
2782
+ font-size: 20px;
2783
+ font-weight: 400;
2784
+ opacity: 0.42;
1720
2785
  }
1721
2786
 
1722
2787
  .db-shell[data-theme='light'] .squisq-template-badge {
1723
- color: #92400e;
1724
- background: #fef3c7;
1725
- border-color: #fcd34d;
2788
+ color: var(--db-accent-hover);
2789
+ }
2790
+
2791
+ .db-shell[data-theme='light'] .squisq-template-badge::before,
2792
+ .db-shell[data-theme='light'] .squisq-template-badge::after {
2793
+ color: var(--db-text-muted);
2794
+ }
2795
+
2796
+ .db-shell[data-theme='light'] .squisq-template-badge-core {
2797
+ color: var(--db-accent-deep);
2798
+ background: var(--db-bg-subtle);
2799
+ border-color: var(--db-border-strong);
2800
+ }
2801
+
2802
+ .db-shell[data-theme='light'] .squisq-template-badge:hover .squisq-template-badge-core,
2803
+ .db-shell[data-theme='light'] .squisq-template-badge:focus-visible .squisq-template-badge-core {
2804
+ color: var(--db-text);
2805
+ background: var(--db-bg-hover);
2806
+ border-color: var(--db-accent);
2807
+ box-shadow: 0 0 0 2px var(--db-accent-soft-15);
2808
+ }
2809
+
2810
+ .db-shell[data-theme='light'] .squisq-template-badge.squisq-template-badge--empty {
2811
+ color: var(--db-text-muted);
2812
+ opacity: 1;
2813
+ }
2814
+
2815
+ .db-shell[data-theme='light']
2816
+ .squisq-template-badge.squisq-template-badge--empty
2817
+ .squisq-template-badge-core {
2818
+ color: var(--db-accent-hover);
2819
+ background: var(--db-accent-soft-08);
2820
+ border-color: var(--db-border-strong);
2821
+ border-style: dashed;
2822
+ }
2823
+
2824
+ .db-shell[data-theme='light']
2825
+ .squisq-template-badge.squisq-template-badge--empty:hover
2826
+ .squisq-template-badge-core,
2827
+ .db-shell[data-theme='light']
2828
+ .squisq-template-badge.squisq-template-badge--empty:focus-visible
2829
+ .squisq-template-badge-core {
2830
+ color: var(--db-text);
2831
+ background: var(--db-bg-hover);
2832
+ border-color: var(--db-accent);
2833
+ border-style: solid;
2834
+ box-shadow: 0 0 0 2px var(--db-accent-soft-15);
2835
+ }
2836
+
2837
+ .db-shell[data-theme='light'] .squisq-props-badge {
2838
+ color: var(--db-accent-hover);
2839
+ background: var(--db-accent-soft-08);
2840
+ border-color: var(--db-border-strong);
2841
+ }
2842
+
2843
+ .db-shell[data-theme='light'] .squisq-props-badge[data-props-summary] {
2844
+ color: var(--db-accent-deep);
2845
+ background: var(--db-bg-subtle);
2846
+ border-color: var(--db-accent);
2847
+ }
2848
+
2849
+ .db-shell[data-theme='light'] .squisq-props-badge:hover,
2850
+ .db-shell[data-theme='light'] .squisq-props-badge:focus-visible {
2851
+ color: var(--db-text);
2852
+ background: var(--db-bg-hover);
2853
+ border-color: var(--db-accent);
2854
+ box-shadow: 0 0 0 2px var(--db-accent-soft-15);
1726
2855
  }
1727
2856
 
1728
2857
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-template-badge {
1729
- color: #fbbf24;
1730
- background: #2a1e08;
1731
- border-color: #92400e;
2858
+ color: var(--db-accent-hover);
2859
+ }
2860
+
2861
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-template-badge::before,
2862
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-template-badge::after {
2863
+ color: var(--db-text-muted);
2864
+ opacity: 0.48;
2865
+ }
2866
+
2867
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-template-badge-core {
2868
+ color: var(--db-badge-text);
2869
+ background: var(--db-badge-bg);
2870
+ border-color: var(--db-accent);
2871
+ }
2872
+
2873
+ .db-shell[data-theme='dark']
2874
+ .squisq-editor-shell[data-theme='dark']
2875
+ .squisq-template-badge:hover
2876
+ .squisq-template-badge-core,
2877
+ .db-shell[data-theme='dark']
2878
+ .squisq-editor-shell[data-theme='dark']
2879
+ .squisq-template-badge:focus-visible
2880
+ .squisq-template-badge-core {
2881
+ color: var(--db-badge-text-hover);
2882
+ background: var(--db-bg-hover);
2883
+ border-color: var(--db-accent-hover);
2884
+ box-shadow: 0 0 0 2px var(--db-accent-soft-25);
2885
+ }
2886
+
2887
+ .db-shell[data-theme='dark']
2888
+ .squisq-editor-shell[data-theme='dark']
2889
+ .squisq-template-badge.squisq-template-badge--empty {
2890
+ color: var(--db-text-secondary);
2891
+ opacity: 1;
2892
+ }
2893
+
2894
+ .db-shell[data-theme='dark']
2895
+ .squisq-editor-shell[data-theme='dark']
2896
+ .squisq-template-badge.squisq-template-badge--empty
2897
+ .squisq-template-badge-core {
2898
+ color: var(--db-text-secondary);
2899
+ background: var(--db-accent-soft-10);
2900
+ border-color: var(--db-border-strong);
2901
+ border-style: dashed;
2902
+ }
2903
+
2904
+ .db-shell[data-theme='dark']
2905
+ .squisq-editor-shell[data-theme='dark']
2906
+ .squisq-template-badge.squisq-template-badge--empty:hover
2907
+ .squisq-template-badge-core,
2908
+ .db-shell[data-theme='dark']
2909
+ .squisq-editor-shell[data-theme='dark']
2910
+ .squisq-template-badge.squisq-template-badge--empty:focus-visible
2911
+ .squisq-template-badge-core {
2912
+ color: var(--db-badge-text-hover);
2913
+ background: var(--db-bg-hover);
2914
+ border-color: var(--db-accent-hover);
2915
+ border-style: solid;
2916
+ box-shadow: 0 0 0 2px var(--db-accent-soft-25);
2917
+ }
2918
+
2919
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-props-badge {
2920
+ color: var(--db-text-secondary);
2921
+ background: var(--db-accent-soft-10);
2922
+ border-color: var(--db-border-strong);
2923
+ }
2924
+
2925
+ .db-shell[data-theme='dark']
2926
+ .squisq-editor-shell[data-theme='dark']
2927
+ .squisq-props-badge[data-props-summary] {
2928
+ color: var(--db-badge-text);
2929
+ background: var(--db-bg-hover);
2930
+ border-color: var(--db-accent);
2931
+ }
2932
+
2933
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-props-badge:hover,
2934
+ .db-shell[data-theme='dark']
2935
+ .squisq-editor-shell[data-theme='dark']
2936
+ .squisq-props-badge:focus-visible {
2937
+ color: var(--db-badge-text-hover);
2938
+ background: var(--db-bg-selected-hover);
2939
+ border-color: var(--db-accent-hover);
2940
+ box-shadow: 0 0 0 2px var(--db-accent-soft-25);
1732
2941
  }
1733
2942
 
1734
2943
  /* Light mode squisq surfaces (toolbar, header, status bar) */
1735
2944
  .db-shell[data-theme='light'] .squisq-editor-shell[data-theme='light'] .squisq-editor-header {
1736
- background: var(--db-accent-tint);
2945
+ background: var(--db-bg-subtle);
1737
2946
  border-bottom-color: var(--db-border-strong);
1738
2947
  }
1739
2948
 
@@ -1741,7 +2950,7 @@ html:has(.db-shell[data-theme='dark'])
1741
2950
  mode-switcher tabs on its left, so the cluster of buttons fades
1742
2951
  into the canvas while the mode switcher reads as the anchor. */
1743
2952
  .db-shell[data-theme='light'] .squisq-editor-shell[data-theme='light'] .squisq-toolbar {
1744
- background: var(--db-accent-tint);
2953
+ background: var(--db-bg-subtle);
1745
2954
  }
1746
2955
 
1747
2956
  .db-shell[data-theme='light'] .squisq-editor-shell[data-theme='light'] .squisq-toolbar-view-tabs {
@@ -1799,6 +3008,95 @@ html:has(.db-shell[data-theme='dark'])
1799
3008
  border-left: 1px solid var(--db-border-strong);
1800
3009
  }
1801
3010
 
3011
+ /* Toolbar overflow menu. Squisq intentionally ships a neutral slate
3012
+ palette; inside DocBlocks this popover should use the same surfaces,
3013
+ borders, text, and interaction colors as our other shell menus. The
3014
+ contextual template/transition controls need explicit treatment too,
3015
+ since they bring their own Squisq surfaces into the popover. */
3016
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu {
3017
+ background: var(--db-bg);
3018
+ border-color: var(--db-border);
3019
+ box-shadow: 0 4px 12px var(--db-shadow);
3020
+ }
3021
+
3022
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu--up {
3023
+ box-shadow: 0 -4px 12px var(--db-shadow);
3024
+ }
3025
+
3026
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item {
3027
+ color: var(--db-text-secondary);
3028
+ }
3029
+
3030
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item:hover {
3031
+ background: var(--db-bg-hover);
3032
+ }
3033
+
3034
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-heading {
3035
+ color: var(--db-text-muted);
3036
+ }
3037
+
3038
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu > .squisq-toolbar-separator {
3039
+ background: var(--db-border);
3040
+ }
3041
+
3042
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item--danger {
3043
+ color: var(--db-danger);
3044
+ }
3045
+
3046
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item--danger:hover {
3047
+ background: var(--db-danger-bg);
3048
+ color: var(--db-danger);
3049
+ }
3050
+
3051
+ .db-shell
3052
+ .squisq-editor-shell
3053
+ .squisq-toolbar-overflow-menu
3054
+ :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger) {
3055
+ background: var(--db-bg-subtle);
3056
+ border-color: var(--db-border);
3057
+ color: var(--db-text-secondary);
3058
+ }
3059
+
3060
+ .db-shell
3061
+ .squisq-editor-shell
3062
+ .squisq-toolbar-overflow-menu
3063
+ :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger):hover {
3064
+ background: var(--db-bg-hover);
3065
+ border-color: var(--db-border-strong);
3066
+ }
3067
+
3068
+ .db-shell
3069
+ .squisq-editor-shell
3070
+ .squisq-toolbar-overflow-menu
3071
+ :is(.squisq-template-picker-trigger--open, .squisq-transition-picker-trigger--open) {
3072
+ background: var(--db-bg-hover);
3073
+ border-color: var(--db-accent);
3074
+ outline-color: var(--db-accent-soft-25);
3075
+ }
3076
+
3077
+ .db-shell
3078
+ .squisq-editor-shell
3079
+ .squisq-toolbar-overflow-menu
3080
+ :is(.squisq-template-picker-trigger-label, .squisq-transition-picker-trigger-label),
3081
+ .db-shell
3082
+ .squisq-editor-shell
3083
+ .squisq-toolbar-overflow-menu
3084
+ :is(.squisq-template-picker-trigger-caret, .squisq-transition-picker-trigger svg) {
3085
+ color: var(--db-text-muted);
3086
+ }
3087
+
3088
+ .db-shell
3089
+ .squisq-editor-shell
3090
+ .squisq-toolbar-overflow-menu
3091
+ :is(.squisq-template-picker-trigger-value, .squisq-transition-picker-trigger-value) {
3092
+ color: var(--db-text-secondary);
3093
+ }
3094
+
3095
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu .squisq-template-picker-trigger-thumb {
3096
+ background: var(--db-bg);
3097
+ border-color: var(--db-border);
3098
+ }
3099
+
1802
3100
  /* Monaco's line-number gutter ("editorGutter.background") is set via
1803
3101
  squisq's JS-side theme registration — those colors can't be CSS
1804
3102
  variables. To make the gutter blend with the outline/preview chrome
@@ -1829,7 +3127,7 @@ html:has(.db-shell[data-theme='dark'])
1829
3127
  .db-shell[data-theme='light']
1830
3128
  .squisq-editor-shell[data-theme='light']
1831
3129
  .squisq-toolbar-button--active {
1832
- background: var(--db-accent-tint);
3130
+ background: var(--db-bg-subtle);
1833
3131
  color: var(--db-accent-hover);
1834
3132
  }
1835
3133
 
@@ -1843,7 +3141,7 @@ html:has(.db-shell[data-theme='dark'])
1843
3141
  .db-shell[data-theme='light']
1844
3142
  .squisq-editor-shell[data-theme='light']
1845
3143
  .squisq-toolbar-overflow-item--active {
1846
- background: var(--db-accent-tint);
3144
+ background: var(--db-bg-subtle);
1847
3145
  color: var(--db-accent-hover);
1848
3146
  }
1849
3147
 
@@ -1902,38 +3200,282 @@ html:has(.db-shell[data-theme='dark'])
1902
3200
  already autosaved on every keystroke; this just confirms it
1903
3201
  so muscle-memory savers feel at ease. */
1904
3202
 
1905
- .db-save-toast {
1906
- position: fixed;
1907
- bottom: 32px;
3203
+ /* ── Welcome gateway ─────────────────────────────────────────── */
3204
+ /* One-time first-run callout floated over the welcome doc's Play
3205
+ view. Names the mode the user landed in and offers a one-click
3206
+ path into the editor. Dismissed forever via localStorage. */
3207
+
3208
+ .db-welcome-gateway {
3209
+ position: absolute;
3210
+ bottom: 56px;
1908
3211
  left: 50%;
1909
3212
  transform: translateX(-50%);
1910
- z-index: 200;
1911
- padding: 8px 16px;
3213
+ z-index: 60;
3214
+ display: flex;
3215
+ align-items: center;
3216
+ gap: 12px;
3217
+ max-width: min(640px, calc(100% - 32px));
3218
+ padding: 10px 10px 10px 16px;
3219
+ background: var(--db-bg);
3220
+ border: 1px solid var(--db-border-strong);
3221
+ border-radius: 10px;
3222
+ box-shadow: 0 10px 32px var(--db-shadow);
3223
+ color: var(--db-text);
1912
3224
  font-size: 13px;
1913
- line-height: 1.4;
1914
- color: #fff;
1915
- background: rgba(31, 41, 55, 0.92);
3225
+ line-height: 1.45;
3226
+ animation: db-welcome-gateway-in 0.4s ease-out;
3227
+ }
3228
+
3229
+ .db-welcome-gateway-cta {
3230
+ flex-shrink: 0;
3231
+ padding: 6px 14px;
3232
+ font-size: 13px;
3233
+ font-weight: 600;
3234
+ background: var(--db-accent);
3235
+ color: var(--db-bg);
3236
+ border: none;
1916
3237
  border-radius: 6px;
1917
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
1918
- pointer-events: none;
1919
- animation: db-save-toast-fade 1.8s ease-out forwards;
3238
+ cursor: pointer;
3239
+ white-space: nowrap;
1920
3240
  }
1921
3241
 
1922
- .db-shell[data-theme='light'] .db-save-toast {
1923
- background: rgba(17, 24, 39, 0.88);
3242
+ .db-welcome-gateway-cta:hover {
3243
+ background: var(--db-accent-hover);
1924
3244
  }
1925
3245
 
1926
- @keyframes db-save-toast-fade {
1927
- 0% {
3246
+ .db-welcome-gateway-dismiss {
3247
+ flex-shrink: 0;
3248
+ display: inline-flex;
3249
+ align-items: center;
3250
+ justify-content: center;
3251
+ width: 26px;
3252
+ height: 26px;
3253
+ font-size: 16px;
3254
+ line-height: 1;
3255
+ background: transparent;
3256
+ color: var(--db-text-muted);
3257
+ border: none;
3258
+ border-radius: 6px;
3259
+ cursor: pointer;
3260
+ }
3261
+
3262
+ .db-welcome-gateway-dismiss:hover {
3263
+ background: var(--db-bg-hover);
3264
+ color: var(--db-text);
3265
+ }
3266
+
3267
+ @keyframes db-welcome-gateway-in {
3268
+ from {
1928
3269
  opacity: 0;
1929
- transform: translate(-50%, 6px);
3270
+ transform: translate(-50%, 8px);
1930
3271
  }
1931
- 10% {
3272
+ to {
1932
3273
  opacity: 1;
1933
3274
  transform: translate(-50%, 0);
1934
3275
  }
1935
- 80% {
1936
- opacity: 1;
3276
+ }
3277
+
3278
+ .db-save-toast {
3279
+ position: fixed;
3280
+ bottom: 32px;
3281
+ left: 50%;
3282
+ transform: translateX(-50%);
3283
+ z-index: 200;
3284
+ padding: 8px 16px;
3285
+ font-size: 13px;
3286
+ line-height: 1.4;
3287
+ color: var(--db-bg);
3288
+ background: var(--db-accent-deep);
3289
+ border-radius: 6px;
3290
+ box-shadow: 0 4px 12px var(--db-shadow);
3291
+ pointer-events: none;
3292
+ animation: db-save-toast-fade 3s ease-out forwards;
3293
+ }
3294
+
3295
+ .db-save-toast--error {
3296
+ color: #fff;
3297
+ background: var(--db-danger, #a33a35);
3298
+ }
3299
+
3300
+ .db-document-conflict {
3301
+ position: fixed;
3302
+ top: 16px;
3303
+ left: 50%;
3304
+ z-index: 210;
3305
+ display: flex;
3306
+ gap: 16px;
3307
+ align-items: center;
3308
+ max-width: min(720px, calc(100vw - 32px));
3309
+ padding: 10px 12px;
3310
+ color: var(--db-text);
3311
+ background: var(--db-bg-elevated, var(--db-bg));
3312
+ border: 1px solid var(--db-warning, #b7791f);
3313
+ border-radius: 8px;
3314
+ box-shadow: 0 6px 20px var(--db-shadow);
3315
+ transform: translateX(-50%);
3316
+ }
3317
+
3318
+ .db-document-conflict-actions {
3319
+ display: flex;
3320
+ flex: none;
3321
+ gap: 8px;
3322
+ }
3323
+
3324
+ .db-document-conflict-actions button {
3325
+ padding: 5px 9px;
3326
+ color: var(--db-text);
3327
+ cursor: pointer;
3328
+ background: var(--db-bg);
3329
+ border: 1px solid var(--db-border);
3330
+ border-radius: 5px;
3331
+ }
3332
+
3333
+ .db-document-conflict-actions button:focus-visible {
3334
+ outline: 2px solid var(--db-focus, var(--db-accent));
3335
+ outline-offset: 2px;
3336
+ }
3337
+
3338
+ /* 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.
3340
+ If the status bar is hidden, it becomes a compact floating badge so the
3341
+ waiting update remains reachable. */
3342
+ .db-shell-editor-area--has-update .squisq-status-bar {
3343
+ padding-right: 132px;
3344
+ }
3345
+
3346
+ .db-update-status-notice {
3347
+ position: absolute;
3348
+ right: 8px;
3349
+ bottom: 1px;
3350
+ z-index: 5;
3351
+ height: 21px;
3352
+ padding: 0 4px;
3353
+ color: var(--db-accent-deep);
3354
+ font: inherit;
3355
+ font-size: 11px;
3356
+ line-height: 1;
3357
+ text-decoration: underline;
3358
+ cursor: pointer;
3359
+ background: transparent;
3360
+ border: 0;
3361
+ }
3362
+
3363
+ .db-update-status-notice:hover {
3364
+ color: var(--db-text);
3365
+ }
3366
+
3367
+ .db-update-status-notice:focus-visible {
3368
+ outline: 2px solid var(--db-focus, var(--db-accent));
3369
+ outline-offset: -2px;
3370
+ }
3371
+
3372
+ .db-update-status-notice:disabled {
3373
+ cursor: default;
3374
+ opacity: 0.55;
3375
+ }
3376
+
3377
+ .db-update-status-notice--floating {
3378
+ right: 8px;
3379
+ bottom: 8px;
3380
+ height: auto;
3381
+ padding: 6px 8px;
3382
+ background: var(--db-bg-elevated, var(--db-bg));
3383
+ border: 1px solid var(--db-accent);
3384
+ border-radius: 5px;
3385
+ box-shadow: 0 2px 8px var(--db-shadow);
3386
+ }
3387
+
3388
+ /* The expanded Reload/Later prompt uses the same top-center card pattern as
3389
+ the document-conflict card, accent-toned instead of warning. */
3390
+ .db-update-banner {
3391
+ position: fixed;
3392
+ top: 16px;
3393
+ left: 50%;
3394
+ z-index: 210;
3395
+ display: flex;
3396
+ gap: 16px;
3397
+ align-items: center;
3398
+ max-width: min(720px, calc(100vw - 32px));
3399
+ padding: 10px 12px;
3400
+ color: var(--db-text);
3401
+ background: var(--db-bg-elevated, var(--db-bg));
3402
+ border: 1px solid var(--db-accent);
3403
+ border-radius: 8px;
3404
+ box-shadow: 0 6px 20px var(--db-shadow);
3405
+ transform: translateX(-50%);
3406
+ }
3407
+
3408
+ .db-update-banner-actions {
3409
+ display: flex;
3410
+ flex: none;
3411
+ gap: 8px;
3412
+ }
3413
+
3414
+ .db-update-banner-actions button {
3415
+ padding: 5px 9px;
3416
+ color: var(--db-text);
3417
+ cursor: pointer;
3418
+ background: var(--db-bg);
3419
+ border: 1px solid var(--db-border);
3420
+ border-radius: 5px;
3421
+ }
3422
+
3423
+ .db-update-banner-actions button:focus-visible {
3424
+ outline: 2px solid var(--db-focus, var(--db-accent));
3425
+ outline-offset: 2px;
3426
+ }
3427
+
3428
+ /* Storage-full alert — the origin quota is exhausted and autosave is
3429
+ failing. Danger-toned variant of the same top-center banner pattern. */
3430
+ .db-storage-full-banner {
3431
+ position: fixed;
3432
+ top: 16px;
3433
+ left: 50%;
3434
+ z-index: 210;
3435
+ display: flex;
3436
+ gap: 16px;
3437
+ align-items: center;
3438
+ max-width: min(720px, calc(100vw - 32px));
3439
+ padding: 10px 12px;
3440
+ color: var(--db-text);
3441
+ background: var(--db-bg-elevated, var(--db-bg));
3442
+ border: 1px solid var(--db-danger, #a33a35);
3443
+ border-radius: 8px;
3444
+ box-shadow: 0 6px 20px var(--db-shadow);
3445
+ transform: translateX(-50%);
3446
+ }
3447
+
3448
+ .db-storage-full-banner-actions {
3449
+ display: flex;
3450
+ flex: none;
3451
+ gap: 8px;
3452
+ }
3453
+
3454
+ .db-storage-full-banner-actions button {
3455
+ padding: 5px 9px;
3456
+ color: var(--db-text);
3457
+ cursor: pointer;
3458
+ background: var(--db-bg);
3459
+ border: 1px solid var(--db-border);
3460
+ border-radius: 5px;
3461
+ }
3462
+
3463
+ .db-storage-full-banner-actions button:focus-visible {
3464
+ outline: 2px solid var(--db-focus, var(--db-accent));
3465
+ outline-offset: 2px;
3466
+ }
3467
+
3468
+ @keyframes db-save-toast-fade {
3469
+ 0% {
3470
+ opacity: 0;
3471
+ transform: translate(-50%, 6px);
3472
+ }
3473
+ 10% {
3474
+ opacity: 1;
3475
+ transform: translate(-50%, 0);
3476
+ }
3477
+ 80% {
3478
+ opacity: 1;
1937
3479
  transform: translate(-50%, 0);
1938
3480
  }
1939
3481
  100% {
@@ -1941,3 +3483,631 @@ html:has(.db-shell[data-theme='dark'])
1941
3483
  transform: translate(-50%, -4px);
1942
3484
  }
1943
3485
  }
3486
+
3487
+ /* ── Git ─────────────────────────────────────────────────────── */
3488
+
3489
+ /* Dialog size modifiers (shared Dialog component) */
3490
+ .db-dialog--wide {
3491
+ width: 560px;
3492
+ max-width: 94vw;
3493
+ }
3494
+
3495
+ .db-dialog--full {
3496
+ width: min(1100px, 94vw);
3497
+ height: 82vh;
3498
+ display: flex;
3499
+ flex-direction: column;
3500
+ }
3501
+
3502
+ .db-dialog--full .db-dialog-body {
3503
+ flex: 1;
3504
+ min-height: 0;
3505
+ overflow: auto;
3506
+ display: flex;
3507
+ flex-direction: column;
3508
+ }
3509
+
3510
+ .db-dialog-footer {
3511
+ display: flex;
3512
+ justify-content: flex-end;
3513
+ gap: 8px;
3514
+ padding: 12px 20px 16px;
3515
+ border-top: 1px solid var(--db-border);
3516
+ }
3517
+
3518
+ /* Buttons used in git dialog footers */
3519
+ .db-git-primary-btn {
3520
+ padding: 6px 16px;
3521
+ border: none;
3522
+ border-radius: 5px;
3523
+ background: var(--db-accent);
3524
+ color: var(--db-text-on-accent);
3525
+ font-size: 13px;
3526
+ font-weight: 600;
3527
+ cursor: pointer;
3528
+ }
3529
+
3530
+ .db-git-primary-btn:hover:not(:disabled) {
3531
+ background: var(--db-accent-hover);
3532
+ }
3533
+
3534
+ .db-git-primary-btn:disabled {
3535
+ opacity: 0.5;
3536
+ cursor: default;
3537
+ }
3538
+
3539
+ .db-git-secondary-btn {
3540
+ padding: 6px 14px;
3541
+ border: 1px solid var(--db-border-strong);
3542
+ border-radius: 5px;
3543
+ background: transparent;
3544
+ color: var(--db-text);
3545
+ font-size: 13px;
3546
+ cursor: pointer;
3547
+ }
3548
+
3549
+ .db-git-secondary-btn:hover:not(:disabled) {
3550
+ background: var(--db-bg-hover);
3551
+ }
3552
+
3553
+ .db-git-secondary-btn:disabled {
3554
+ opacity: 0.5;
3555
+ cursor: default;
3556
+ }
3557
+
3558
+ /* Status bar row in the sidebar */
3559
+ .db-git-statusbar {
3560
+ position: relative;
3561
+ flex-shrink: 0;
3562
+ padding: 2px 8px 4px;
3563
+ border-bottom: 1px solid var(--db-border);
3564
+ }
3565
+
3566
+ .db-git-statusbar-chip {
3567
+ display: flex;
3568
+ align-items: center;
3569
+ gap: 6px;
3570
+ width: 100%;
3571
+ padding: 4px 8px;
3572
+ border: none;
3573
+ border-radius: 4px;
3574
+ background: transparent;
3575
+ color: var(--db-text-secondary);
3576
+ font-size: 12px;
3577
+ cursor: pointer;
3578
+ overflow: hidden;
3579
+ }
3580
+
3581
+ .db-git-statusbar-chip:hover {
3582
+ background: var(--db-bg-hover);
3583
+ }
3584
+
3585
+ .db-git-branch-glyph {
3586
+ color: var(--db-text-muted);
3587
+ flex-shrink: 0;
3588
+ }
3589
+
3590
+ .db-git-statusbar-branch {
3591
+ font-weight: 600;
3592
+ white-space: nowrap;
3593
+ overflow: hidden;
3594
+ text-overflow: ellipsis;
3595
+ }
3596
+
3597
+ .db-git-statusbar-counts {
3598
+ color: var(--db-text-muted);
3599
+ flex-shrink: 0;
3600
+ }
3601
+
3602
+ .db-git-statusbar-dirty {
3603
+ color: var(--db-git-modified);
3604
+ flex-shrink: 0;
3605
+ }
3606
+
3607
+ .db-git-statusbar-merge {
3608
+ color: var(--db-git-conflicted);
3609
+ font-weight: 600;
3610
+ flex-shrink: 0;
3611
+ }
3612
+
3613
+ .db-git-statusbar-busy {
3614
+ color: var(--db-text-muted);
3615
+ flex-shrink: 0;
3616
+ }
3617
+
3618
+ /* Actions dropdown (mirrors db-ws-settings-dropdown) */
3619
+ .db-git-menu {
3620
+ position: absolute;
3621
+ top: 100%;
3622
+ left: 8px;
3623
+ right: 8px;
3624
+ z-index: 100;
3625
+ background: var(--db-bg);
3626
+ border: 1px solid var(--db-border);
3627
+ border-radius: 6px;
3628
+ box-shadow: 0 4px 12px var(--db-shadow);
3629
+ padding: 4px 0;
3630
+ margin-top: 2px;
3631
+ }
3632
+
3633
+ .db-git-menu-item {
3634
+ display: block;
3635
+ width: 100%;
3636
+ padding: 7px 14px;
3637
+ border: none;
3638
+ background: transparent;
3639
+ text-align: left;
3640
+ font-size: 13px;
3641
+ color: var(--db-text);
3642
+ cursor: pointer;
3643
+ }
3644
+
3645
+ .db-git-menu-item:hover:not(:disabled) {
3646
+ background: var(--db-bg-hover);
3647
+ }
3648
+
3649
+ .db-git-menu-item:disabled {
3650
+ color: var(--db-text-placeholder);
3651
+ cursor: default;
3652
+ }
3653
+
3654
+ .db-git-menu-divider {
3655
+ height: 1px;
3656
+ background: var(--db-border);
3657
+ margin: 4px 0;
3658
+ }
3659
+
3660
+ /* aria-live op-result line — visually subtle, announced politely */
3661
+ .db-git-inline-status {
3662
+ display: block;
3663
+ padding: 0 16px;
3664
+ font-size: 11px;
3665
+ color: var(--db-text-muted);
3666
+ min-height: 0;
3667
+ }
3668
+
3669
+ .db-git-inline-status:empty {
3670
+ display: none;
3671
+ }
3672
+
3673
+ /* File-tree badges */
3674
+ .db-git-badge {
3675
+ margin-left: auto;
3676
+ padding: 0 4px;
3677
+ font-size: 10px;
3678
+ font-weight: 700;
3679
+ flex-shrink: 0;
3680
+ }
3681
+
3682
+ .db-tree-row .db-git-badge {
3683
+ margin-left: 4px;
3684
+ }
3685
+
3686
+ .db-git-badge--modified {
3687
+ color: var(--db-git-modified);
3688
+ }
3689
+
3690
+ .db-git-badge--added {
3691
+ color: var(--db-git-added);
3692
+ }
3693
+
3694
+ .db-git-badge--untracked {
3695
+ color: var(--db-git-untracked);
3696
+ }
3697
+
3698
+ .db-git-badge--renamed {
3699
+ color: var(--db-git-renamed);
3700
+ }
3701
+
3702
+ .db-git-badge--deleted {
3703
+ color: var(--db-git-deleted);
3704
+ }
3705
+
3706
+ .db-git-badge--conflicted {
3707
+ color: var(--db-git-conflicted);
3708
+ }
3709
+
3710
+ .db-git-badge--dir {
3711
+ color: var(--db-git-modified);
3712
+ }
3713
+
3714
+ .db-tree-context-divider {
3715
+ height: 1px;
3716
+ background: var(--db-border);
3717
+ margin: 4px 0;
3718
+ }
3719
+
3720
+ /* Toolbar control */
3721
+ .db-git-toolbar-trigger {
3722
+ position: relative;
3723
+ }
3724
+
3725
+ .db-git-toolbar-dot {
3726
+ position: absolute;
3727
+ top: 3px;
3728
+ right: 3px;
3729
+ width: 7px;
3730
+ height: 7px;
3731
+ border-radius: 50%;
3732
+ background: var(--db-git-modified);
3733
+ }
3734
+
3735
+ /* Dialog internals — file lists (commit + conflicts) */
3736
+ .db-git-file-list {
3737
+ margin: 8px 0;
3738
+ padding: 0;
3739
+ list-style: none;
3740
+ max-height: 260px;
3741
+ overflow-y: auto;
3742
+ border: 1px solid var(--db-border);
3743
+ border-radius: 5px;
3744
+ }
3745
+
3746
+ .db-git-file-row {
3747
+ display: flex;
3748
+ align-items: center;
3749
+ gap: 8px;
3750
+ width: 100%;
3751
+ padding: 6px 10px;
3752
+ border: none;
3753
+ background: transparent;
3754
+ font-size: 12.5px;
3755
+ color: var(--db-text);
3756
+ text-align: left;
3757
+ }
3758
+
3759
+ .db-git-file-row + .db-git-file-row {
3760
+ border-top: 1px solid var(--db-border);
3761
+ }
3762
+
3763
+ button.db-git-file-row {
3764
+ cursor: pointer;
3765
+ }
3766
+
3767
+ button.db-git-file-row:hover {
3768
+ background: var(--db-bg-hover);
3769
+ }
3770
+
3771
+ .db-git-file-kind {
3772
+ margin-left: auto;
3773
+ font-size: 10.5px;
3774
+ color: var(--db-text-muted);
3775
+ flex-shrink: 0;
3776
+ }
3777
+
3778
+ .db-git-commit-message {
3779
+ width: 100%;
3780
+ min-height: 72px;
3781
+ padding: 8px 10px;
3782
+ border: 1px solid var(--db-input-border);
3783
+ border-radius: 5px;
3784
+ background: var(--db-bg);
3785
+ color: var(--db-text);
3786
+ font-size: 13px;
3787
+ font-family: inherit;
3788
+ resize: vertical;
3789
+ box-sizing: border-box;
3790
+ }
3791
+
3792
+ /* Generic form rows in git dialogs */
3793
+ .db-git-form-row {
3794
+ display: flex;
3795
+ align-items: center;
3796
+ gap: 8px;
3797
+ margin: 10px 0;
3798
+ }
3799
+
3800
+ .db-git-form-label {
3801
+ font-size: 12.5px;
3802
+ color: var(--db-text-secondary);
3803
+ flex-shrink: 0;
3804
+ }
3805
+
3806
+ .db-git-form-input {
3807
+ flex: 1;
3808
+ padding: 6px 10px;
3809
+ border: 1px solid var(--db-input-border);
3810
+ border-radius: 5px;
3811
+ background: var(--db-bg);
3812
+ color: var(--db-text);
3813
+ font-size: 13px;
3814
+ box-sizing: border-box;
3815
+ }
3816
+
3817
+ .db-git-form-error {
3818
+ margin: 8px 0 0;
3819
+ color: var(--db-danger);
3820
+ font-size: 12.5px;
3821
+ }
3822
+
3823
+ .db-git-hint {
3824
+ color: var(--db-text-muted);
3825
+ font-size: 12px;
3826
+ }
3827
+
3828
+ /* Branches dialog */
3829
+ .db-git-branch-list {
3830
+ margin: 8px 0;
3831
+ padding: 0;
3832
+ list-style: none;
3833
+ max-height: 280px;
3834
+ overflow-y: auto;
3835
+ }
3836
+
3837
+ .db-git-branch-row {
3838
+ display: flex;
3839
+ align-items: center;
3840
+ gap: 8px;
3841
+ width: 100%;
3842
+ padding: 7px 10px;
3843
+ border: none;
3844
+ border-radius: 4px;
3845
+ background: transparent;
3846
+ font-size: 13px;
3847
+ color: var(--db-text);
3848
+ text-align: left;
3849
+ cursor: pointer;
3850
+ }
3851
+
3852
+ .db-git-branch-row:hover {
3853
+ background: var(--db-bg-hover);
3854
+ }
3855
+
3856
+ .db-git-branch-row--current {
3857
+ font-weight: 600;
3858
+ color: var(--db-accent);
3859
+ cursor: default;
3860
+ }
3861
+
3862
+ .db-git-branch-row--current:hover {
3863
+ background: transparent;
3864
+ }
3865
+
3866
+ /* History dialog */
3867
+ .db-git-history-list {
3868
+ margin: 8px 0;
3869
+ padding: 0;
3870
+ list-style: none;
3871
+ }
3872
+
3873
+ .db-git-history-item {
3874
+ padding: 8px 10px;
3875
+ border-bottom: 1px solid var(--db-border);
3876
+ cursor: pointer;
3877
+ }
3878
+
3879
+ .db-git-history-item:hover {
3880
+ background: var(--db-bg-hover);
3881
+ }
3882
+
3883
+ .db-git-history-meta {
3884
+ margin-top: 2px;
3885
+ font-size: 11.5px;
3886
+ color: var(--db-text-muted);
3887
+ }
3888
+
3889
+ .db-git-history-files {
3890
+ margin: 6px 0 0;
3891
+ padding: 0;
3892
+ list-style: none;
3893
+ }
3894
+
3895
+ .db-git-history-file {
3896
+ display: flex;
3897
+ align-items: center;
3898
+ gap: 8px;
3899
+ width: 100%;
3900
+ padding: 4px 8px;
3901
+ border: none;
3902
+ background: transparent;
3903
+ font-size: 12px;
3904
+ color: var(--db-text-secondary);
3905
+ text-align: left;
3906
+ cursor: pointer;
3907
+ border-radius: 4px;
3908
+ }
3909
+
3910
+ .db-git-history-file:hover {
3911
+ background: var(--db-bg-hover);
3912
+ }
3913
+
3914
+ /* Diff dialog */
3915
+ .db-git-diff-host {
3916
+ flex: 1;
3917
+ min-height: 320px;
3918
+ border: 1px solid var(--db-border);
3919
+ border-radius: 5px;
3920
+ overflow: hidden;
3921
+ }
3922
+
3923
+ .db-git-diff-loading {
3924
+ padding: 24px;
3925
+ text-align: center;
3926
+ color: var(--db-text-muted);
3927
+ }
3928
+
3929
+ .db-git-diff-labels {
3930
+ display: flex;
3931
+ gap: 12px;
3932
+ margin-bottom: 6px;
3933
+ font-size: 12px;
3934
+ color: var(--db-text-muted);
3935
+ }
3936
+
3937
+ .db-git-diff-labels > span {
3938
+ flex: 1;
3939
+ }
3940
+
3941
+ /* Clone progress */
3942
+ .db-git-progress {
3943
+ margin: 12px 0 4px;
3944
+ }
3945
+
3946
+ .db-git-progress-bar {
3947
+ height: 6px;
3948
+ border-radius: 3px;
3949
+ background: var(--db-accent-soft-15);
3950
+ overflow: hidden;
3951
+ position: relative;
3952
+ }
3953
+
3954
+ .db-git-progress-bar > span {
3955
+ display: block;
3956
+ height: 100%;
3957
+ background: var(--db-accent);
3958
+ transition: width 0.2s;
3959
+ }
3960
+
3961
+ .db-git-progress-text {
3962
+ margin-top: 6px;
3963
+ font-size: 12px;
3964
+ color: var(--db-text-muted);
3965
+ }
3966
+
3967
+ /* History dialog internals added by the expanded-row layout */
3968
+ .db-git-history-toggle {
3969
+ display: block;
3970
+ width: 100%;
3971
+ padding: 0;
3972
+ border: none;
3973
+ background: transparent;
3974
+ color: inherit;
3975
+ font: inherit;
3976
+ text-align: left;
3977
+ cursor: pointer;
3978
+ }
3979
+
3980
+ .db-git-history-subject {
3981
+ display: block;
3982
+ font-size: 13px;
3983
+ color: var(--db-text);
3984
+ }
3985
+
3986
+ .db-git-history-body {
3987
+ margin: 6px 0 0;
3988
+ padding: 8px 10px;
3989
+ border-radius: 4px;
3990
+ background: var(--db-bg-subtle);
3991
+ color: var(--db-text-secondary);
3992
+ font-size: 12px;
3993
+ white-space: pre-wrap;
3994
+ font-family: inherit;
3995
+ }
3996
+
3997
+ /* ---------------------------------------------------------------------------
3998
+ Window Controls Overlay — installed web app (PWA) custom titlebar.
3999
+
4000
+ When the manifest's `display_override: ["window-controls-overlay", ...]`
4001
+ is active, the OS caption buttons float over the first shell row and this
4002
+ block turns that row into the titlebar: draggable empty space, insets for
4003
+ the caption buttons, and every interactive descendant opted back out.
4004
+
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. */
4010
+ @media (display-mode: window-controls-overlay) {
4011
+ .db-shell {
4012
+ --db-wco-titlebar-height: 48px;
4013
+ }
4014
+
4015
+ /* The first shell row replaces the native titlebar. Empty space can drag
4016
+ the window; every interactive descendant opts back out below. */
4017
+ .db-shell .db-shell-sidebar-header,
4018
+ .db-shell .squisq-toolbar,
4019
+ .db-shell .squisq-editor-header--image {
4020
+ app-region: drag;
4021
+ -webkit-app-region: drag;
4022
+ box-sizing: border-box;
4023
+ height: var(--db-wco-titlebar-height);
4024
+ min-height: var(--db-wco-titlebar-height);
4025
+ }
4026
+
4027
+ .db-shell .db-shell-sidebar-header {
4028
+ padding-left: max(4px, calc(env(titlebar-area-x, 0px) + 4px));
4029
+ cursor: grab;
4030
+ }
4031
+
4032
+ /* Make the draggable header space beside the workspace gear discoverable,
4033
+ matching the Electron titlebar without introducing another control. */
4034
+ .db-shell .db-shell-sidebar-header::after {
4035
+ content: '';
4036
+ width: 12px;
4037
+ height: 20px;
4038
+ flex: 0 0 12px;
4039
+ margin-right: 3px;
4040
+ background-image: radial-gradient(circle, var(--db-text-muted) 1px, transparent 1.25px);
4041
+ background-position: center;
4042
+ background-size: 4px 4px;
4043
+ opacity: 0.72;
4044
+ pointer-events: none;
4045
+ app-region: drag;
4046
+ -webkit-app-region: drag;
4047
+ }
4048
+
4049
+ /* Let the workspace menu size itself to its contents and cross the sidebar
4050
+ boundary above the editor. The explorer still clips its own contents. */
4051
+ .db-shell .db-shell-sidebar {
4052
+ overflow: visible;
4053
+ }
4054
+
4055
+ .db-shell .db-workspace-dropdown {
4056
+ box-sizing: border-box;
4057
+ width: max-content;
4058
+ }
4059
+
4060
+ /* The caption buttons normally occupy the right edge. Derive that inset
4061
+ from the overlay safe area rather than assuming a fixed width, so
4062
+ scaling, RTL controls, and OS variants stay clear. The compact sidebar
4063
+ header is full-width, so it needs the same reservation. */
4064
+ .db-shell.db-shell--mobile .db-shell-sidebar-header,
4065
+ .db-shell .squisq-toolbar,
4066
+ .db-shell .squisq-editor-header--image {
4067
+ padding-right: max(
4068
+ 12px,
4069
+ calc(100vw - env(titlebar-area-x, 0px) - env(titlebar-area-width, 100vw) + 8px)
4070
+ );
4071
+ }
4072
+
4073
+ /* In compact mode there is no sidebar to absorb left-side controls such as
4074
+ macOS traffic lights, so the editor toolbar also observes the left inset. */
4075
+ .db-shell.db-shell--mobile .squisq-toolbar,
4076
+ .db-shell.db-shell--mobile .squisq-editor-header--image {
4077
+ padding-left: env(titlebar-area-x, 0px);
4078
+ }
4079
+
4080
+ .db-shell
4081
+ :is(
4082
+ button,
4083
+ a,
4084
+ input,
4085
+ select,
4086
+ textarea,
4087
+ [contenteditable='true'],
4088
+ [role='button'],
4089
+ [role='tab']
4090
+ ) {
4091
+ app-region: no-drag;
4092
+ -webkit-app-region: no-drag;
4093
+ }
4094
+
4095
+ /* Folder and empty states do not render Squisq's toolbar. Preserve a top
4096
+ drag strip in those states and keep folder content below it. */
4097
+ .db-shell .db-shell-empty::before,
4098
+ .db-shell .db-folder-view::before {
4099
+ content: '';
4100
+ position: absolute;
4101
+ top: 0;
4102
+ left: env(titlebar-area-x, 0px);
4103
+ width: env(titlebar-area-width, 100%);
4104
+ height: var(--db-wco-titlebar-height);
4105
+ app-region: drag;
4106
+ -webkit-app-region: drag;
4107
+ }
4108
+
4109
+ .db-shell .db-folder-view {
4110
+ box-sizing: border-box;
4111
+ padding-top: calc(24px + var(--db-wco-titlebar-height));
4112
+ }
4113
+ }