@bendyline/docblocks-react 1.1.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/README.md +37 -5
  2. package/dist/ExportDialog-7LDIXJZ3.js +10 -0
  3. package/dist/ExportDialog-7LDIXJZ3.js.map +1 -0
  4. package/dist/ExportToolbarControls-GHAOJMH6.js +508 -0
  5. package/dist/ExportToolbarControls-GHAOJMH6.js.map +1 -0
  6. package/dist/GitToolbarControl-GNMRVKWQ.js +136 -0
  7. package/dist/GitToolbarControl-GNMRVKWQ.js.map +1 -0
  8. package/dist/GitUI-VHOBQY43.js +1133 -0
  9. package/dist/GitUI-VHOBQY43.js.map +1 -0
  10. package/dist/LazyEditorShell-EF2BWRXU.js +6 -0
  11. package/dist/LazyEditorShell-EF2BWRXU.js.map +1 -0
  12. package/dist/ShareDialog-63ENBEDZ.js +213 -0
  13. package/dist/ShareDialog-63ENBEDZ.js.map +1 -0
  14. package/dist/chunk-4XXSWN3T.js +13 -0
  15. package/dist/chunk-4XXSWN3T.js.map +1 -0
  16. package/dist/chunk-57ZJJOC5.js +89 -0
  17. package/dist/chunk-57ZJJOC5.js.map +1 -0
  18. package/dist/chunk-5A4KEWKT.js +97 -0
  19. package/dist/chunk-5A4KEWKT.js.map +1 -0
  20. package/dist/chunk-DD4VFJQI.js +51 -0
  21. package/dist/chunk-DD4VFJQI.js.map +1 -0
  22. package/dist/chunk-FEWQUQML.js +256 -0
  23. package/dist/chunk-FEWQUQML.js.map +1 -0
  24. package/dist/chunk-FMGTHSTX.js +110 -0
  25. package/dist/chunk-FMGTHSTX.js.map +1 -0
  26. package/dist/chunk-UNYZQXWR.js +324 -0
  27. package/dist/chunk-UNYZQXWR.js.map +1 -0
  28. package/dist/chunk-VHDP4IPL.js +70 -0
  29. package/dist/chunk-VHDP4IPL.js.map +1 -0
  30. package/dist/chunk-ZI56BNB7.js +270 -0
  31. package/dist/chunk-ZI56BNB7.js.map +1 -0
  32. package/dist/editor.d.ts +11 -0
  33. package/dist/editor.js +9 -0
  34. package/dist/editor.js.map +1 -0
  35. package/dist/export/index.d.ts +93 -0
  36. package/dist/export/index.js +27 -0
  37. package/dist/export/index.js.map +1 -0
  38. package/dist/index.d.ts +346 -18
  39. package/dist/index.js +6169 -18
  40. package/dist/index.js.map +1 -1
  41. package/dist/run-export-ICTZITXC.js +10 -0
  42. package/dist/run-export-ICTZITXC.js.map +1 -0
  43. package/dist/settings/index.d.ts +36 -0
  44. package/dist/settings/index.js +14 -0
  45. package/dist/settings/index.js.map +1 -0
  46. package/package.json +33 -13
  47. package/src/styles/docblocks.css +2738 -132
  48. package/dist/AppMenu/AppMenu.d.ts +0 -26
  49. package/dist/AppMenu/AppMenu.d.ts.map +0 -1
  50. package/dist/AppMenu/AppMenu.js +0 -28
  51. package/dist/AppMenu/AppMenu.js.map +0 -1
  52. package/dist/AppMenu/index.d.ts +0 -3
  53. package/dist/AppMenu/index.d.ts.map +0 -1
  54. package/dist/AppMenu/index.js +0 -2
  55. package/dist/AppMenu/index.js.map +0 -1
  56. package/dist/DocBlocksShell/DocBlocksShell.d.ts +0 -36
  57. package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +0 -1
  58. package/dist/DocBlocksShell/DocBlocksShell.js +0 -1351
  59. package/dist/DocBlocksShell/DocBlocksShell.js.map +0 -1
  60. package/dist/DocBlocksShell/index.d.ts +0 -3
  61. package/dist/DocBlocksShell/index.d.ts.map +0 -1
  62. package/dist/DocBlocksShell/index.js +0 -2
  63. package/dist/DocBlocksShell/index.js.map +0 -1
  64. package/dist/Export/ExportDialog.d.ts +0 -16
  65. package/dist/Export/ExportDialog.d.ts.map +0 -1
  66. package/dist/Export/ExportDialog.js +0 -158
  67. package/dist/Export/ExportDialog.js.map +0 -1
  68. package/dist/Export/ExportToolbarControls.d.ts +0 -17
  69. package/dist/Export/ExportToolbarControls.d.ts.map +0 -1
  70. package/dist/Export/ExportToolbarControls.js +0 -200
  71. package/dist/Export/ExportToolbarControls.js.map +0 -1
  72. package/dist/Export/export-options.d.ts +0 -53
  73. package/dist/Export/export-options.d.ts.map +0 -1
  74. package/dist/Export/export-options.js +0 -49
  75. package/dist/Export/export-options.js.map +0 -1
  76. package/dist/Export/index.d.ts +0 -6
  77. package/dist/Export/index.d.ts.map +0 -1
  78. package/dist/Export/index.js +0 -3
  79. package/dist/Export/index.js.map +0 -1
  80. package/dist/Export/run-export.d.ts +0 -8
  81. package/dist/Export/run-export.d.ts.map +0 -1
  82. package/dist/Export/run-export.js +0 -296
  83. package/dist/Export/run-export.js.map +0 -1
  84. package/dist/Export/transform-summaries.d.ts +0 -7
  85. package/dist/Export/transform-summaries.d.ts.map +0 -1
  86. package/dist/Export/transform-summaries.js +0 -6
  87. package/dist/Export/transform-summaries.js.map +0 -1
  88. package/dist/FileExplorer/FileExplorer.d.ts +0 -21
  89. package/dist/FileExplorer/FileExplorer.d.ts.map +0 -1
  90. package/dist/FileExplorer/FileExplorer.js +0 -140
  91. package/dist/FileExplorer/FileExplorer.js.map +0 -1
  92. package/dist/FileExplorer/FileTreeNode.d.ts +0 -18
  93. package/dist/FileExplorer/FileTreeNode.d.ts.map +0 -1
  94. package/dist/FileExplorer/FileTreeNode.js +0 -112
  95. package/dist/FileExplorer/FileTreeNode.js.map +0 -1
  96. package/dist/FileExplorer/index.d.ts +0 -6
  97. package/dist/FileExplorer/index.d.ts.map +0 -1
  98. package/dist/FileExplorer/index.js +0 -4
  99. package/dist/FileExplorer/index.js.map +0 -1
  100. package/dist/FileExplorer/useFileTree.d.ts +0 -35
  101. package/dist/FileExplorer/useFileTree.d.ts.map +0 -1
  102. package/dist/FileExplorer/useFileTree.js +0 -124
  103. package/dist/FileExplorer/useFileTree.js.map +0 -1
  104. package/dist/WorkspacePicker/WorkspacePicker.d.ts +0 -17
  105. package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +0 -1
  106. package/dist/WorkspacePicker/WorkspacePicker.js +0 -63
  107. package/dist/WorkspacePicker/WorkspacePicker.js.map +0 -1
  108. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts +0 -11
  109. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts.map +0 -1
  110. package/dist/WorkspacePicker/WorkspaceSettingsButton.js +0 -27
  111. package/dist/WorkspacePicker/WorkspaceSettingsButton.js.map +0 -1
  112. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts +0 -20
  113. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts.map +0 -1
  114. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js +0 -36
  115. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js.map +0 -1
  116. package/dist/WorkspacePicker/index.d.ts +0 -3
  117. package/dist/WorkspacePicker/index.d.ts.map +0 -1
  118. package/dist/WorkspacePicker/index.js +0 -2
  119. package/dist/WorkspacePicker/index.js.map +0 -1
  120. package/dist/hooks/index.d.ts +0 -2
  121. package/dist/hooks/index.d.ts.map +0 -1
  122. package/dist/hooks/index.js +0 -2
  123. package/dist/hooks/index.js.map +0 -1
  124. package/dist/hooks/useAutoSave.d.ts +0 -15
  125. package/dist/hooks/useAutoSave.d.ts.map +0 -1
  126. package/dist/hooks/useAutoSave.js +0 -83
  127. package/dist/hooks/useAutoSave.js.map +0 -1
  128. package/dist/icons.d.ts +0 -7
  129. package/dist/icons.d.ts.map +0 -1
  130. package/dist/icons.js +0 -27
  131. package/dist/icons.js.map +0 -1
  132. package/dist/index.d.ts.map +0 -1
  133. package/dist/monaco-slim.d.ts +0 -19
  134. package/dist/monaco-slim.d.ts.map +0 -1
  135. package/dist/monaco-slim.js +0 -19
  136. package/dist/monaco-slim.js.map +0 -1
  137. package/dist/preferences/versioning.d.ts +0 -27
  138. package/dist/preferences/versioning.d.ts.map +0 -1
  139. package/dist/preferences/versioning.js +0 -62
  140. package/dist/preferences/versioning.js.map +0 -1
  141. package/src/AppMenu/AppMenu.tsx +0 -264
  142. package/src/AppMenu/index.ts +0 -2
  143. package/src/DocBlocksShell/DocBlocksShell.tsx +0 -1778
  144. package/src/DocBlocksShell/index.ts +0 -2
  145. package/src/Export/ExportDialog.tsx +0 -383
  146. package/src/Export/ExportToolbarControls.tsx +0 -313
  147. package/src/Export/export-options.ts +0 -99
  148. package/src/Export/index.ts +0 -5
  149. package/src/Export/run-export.ts +0 -349
  150. package/src/Export/transform-summaries.ts +0 -14
  151. package/src/FileExplorer/FileExplorer.tsx +0 -282
  152. package/src/FileExplorer/FileTreeNode.tsx +0 -214
  153. package/src/FileExplorer/index.ts +0 -5
  154. package/src/FileExplorer/useFileTree.ts +0 -178
  155. package/src/WorkspacePicker/WorkspacePicker.tsx +0 -137
  156. package/src/WorkspacePicker/WorkspaceSettingsButton.tsx +0 -88
  157. package/src/WorkspacePicker/WorkspaceSettingsDialog.tsx +0 -121
  158. package/src/WorkspacePicker/index.ts +0 -2
  159. package/src/fonts/fonts.css +0 -362
  160. package/src/fonts/licenses/LICENSE-cormorant-garamond.txt +0 -93
  161. package/src/fonts/licenses/LICENSE-crimson-text.txt +0 -93
  162. package/src/fonts/licenses/LICENSE-dm-sans.txt +0 -93
  163. package/src/fonts/licenses/LICENSE-dm-serif-display.txt +0 -93
  164. package/src/fonts/licenses/LICENSE-hanken-grotesk.txt +0 -94
  165. package/src/fonts/licenses/LICENSE-ibm-plex-sans.txt +0 -93
  166. package/src/fonts/licenses/LICENSE-inter.txt +0 -93
  167. package/src/fonts/licenses/LICENSE-jetbrains-mono.txt +0 -93
  168. package/src/fonts/licenses/LICENSE-lora.txt +0 -93
  169. package/src/fonts/licenses/LICENSE-merriweather.txt +0 -93
  170. package/src/fonts/licenses/LICENSE-oswald.txt +0 -93
  171. package/src/fonts/licenses/LICENSE-playfair-display.txt +0 -93
  172. package/src/fonts/licenses/LICENSE-pt-serif.txt +0 -93
  173. package/src/fonts/licenses/LICENSE-roboto.txt +0 -93
  174. package/src/fonts/licenses/LICENSE-source-serif-4.txt +0 -93
  175. package/src/fonts/woff2/cormorant-garamond-400.woff2 +0 -0
  176. package/src/fonts/woff2/cormorant-garamond-700.woff2 +0 -0
  177. package/src/fonts/woff2/crimson-text-400.woff2 +0 -0
  178. package/src/fonts/woff2/crimson-text-400i.woff2 +0 -0
  179. package/src/fonts/woff2/crimson-text-700.woff2 +0 -0
  180. package/src/fonts/woff2/dm-sans-400.woff2 +0 -0
  181. package/src/fonts/woff2/dm-sans-400i.woff2 +0 -0
  182. package/src/fonts/woff2/dm-sans-500.woff2 +0 -0
  183. package/src/fonts/woff2/dm-sans-700.woff2 +0 -0
  184. package/src/fonts/woff2/dm-serif-display-400.woff2 +0 -0
  185. package/src/fonts/woff2/hanken-grotesk-400.woff2 +0 -0
  186. package/src/fonts/woff2/hanken-grotesk-400i.woff2 +0 -0
  187. package/src/fonts/woff2/hanken-grotesk-500.woff2 +0 -0
  188. package/src/fonts/woff2/hanken-grotesk-600.woff2 +0 -0
  189. package/src/fonts/woff2/hanken-grotesk-700.woff2 +0 -0
  190. package/src/fonts/woff2/ibm-plex-sans-400.woff2 +0 -0
  191. package/src/fonts/woff2/ibm-plex-sans-400i.woff2 +0 -0
  192. package/src/fonts/woff2/ibm-plex-sans-500.woff2 +0 -0
  193. package/src/fonts/woff2/ibm-plex-sans-600.woff2 +0 -0
  194. package/src/fonts/woff2/ibm-plex-sans-700.woff2 +0 -0
  195. package/src/fonts/woff2/inter-400.woff2 +0 -0
  196. package/src/fonts/woff2/inter-400i.woff2 +0 -0
  197. package/src/fonts/woff2/inter-500.woff2 +0 -0
  198. package/src/fonts/woff2/inter-600.woff2 +0 -0
  199. package/src/fonts/woff2/inter-700.woff2 +0 -0
  200. package/src/fonts/woff2/jetbrains-mono-400.woff2 +0 -0
  201. package/src/fonts/woff2/jetbrains-mono-400i.woff2 +0 -0
  202. package/src/fonts/woff2/jetbrains-mono-700.woff2 +0 -0
  203. package/src/fonts/woff2/lora-400.woff2 +0 -0
  204. package/src/fonts/woff2/lora-400i.woff2 +0 -0
  205. package/src/fonts/woff2/lora-700.woff2 +0 -0
  206. package/src/fonts/woff2/merriweather-400.woff2 +0 -0
  207. package/src/fonts/woff2/merriweather-700.woff2 +0 -0
  208. package/src/fonts/woff2/oswald-400.woff2 +0 -0
  209. package/src/fonts/woff2/oswald-700.woff2 +0 -0
  210. package/src/fonts/woff2/playfair-display-400.woff2 +0 -0
  211. package/src/fonts/woff2/playfair-display-700.woff2 +0 -0
  212. package/src/fonts/woff2/pt-serif-400.woff2 +0 -0
  213. package/src/fonts/woff2/pt-serif-700.woff2 +0 -0
  214. package/src/fonts/woff2/roboto-400.woff2 +0 -0
  215. package/src/fonts/woff2/roboto-400i.woff2 +0 -0
  216. package/src/fonts/woff2/roboto-700.woff2 +0 -0
  217. package/src/fonts/woff2/source-serif-4-400.woff2 +0 -0
  218. package/src/fonts/woff2/source-serif-4-400i.woff2 +0 -0
  219. package/src/fonts/woff2/source-serif-4-700.woff2 +0 -0
  220. package/src/hooks/index.ts +0 -1
  221. package/src/hooks/useAutoSave.ts +0 -116
  222. package/src/icons.tsx +0 -70
  223. package/src/index.ts +0 -31
  224. package/src/monaco-slim.ts +0 -20
  225. package/src/preferences/versioning.ts +0 -69
@@ -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,24 @@
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;
30
+ /* Keyboard focus ring. Deliberately darker than --db-accent: the accent
31
+ is also the *selected row* fill, so an accent ring vanished against
32
+ it. Any surface that paints itself --db-bg-selected re-points this
33
+ token at a contrasting value (see .db-tree-row--selected). */
34
+ --db-focus: #3d3220;
28
35
  --db-accent-soft-08: rgba(125, 105, 72, 0.08);
36
+ --db-accent-soft-10: rgba(125, 105, 72, 0.1);
29
37
  --db-accent-soft-12: rgba(125, 105, 72, 0.12);
30
38
  --db-accent-soft-15: rgba(125, 105, 72, 0.15);
31
39
  --db-accent-soft-25: rgba(125, 105, 72, 0.25);
32
- --db-accent-tint: #f3eede;
33
40
  --db-accent-tint-strong: #d8d0b5;
34
41
  --db-accent-deep: #3d3220;
42
+ --db-editor-canvas: #ffffff;
43
+ --db-badge-bg: #f3eede;
44
+ --db-badge-text: #3d3220;
45
+ --db-badge-text-hover: #2a2419;
35
46
  /* Outline pane + inline-preview gutter background. Sits one step
36
47
  lighter than the toolbar (`--db-accent-tint-strong`) so the chrome
37
48
  panes read as distinct from the action bar above the canvas. */
@@ -39,7 +50,16 @@
39
50
  --db-input-border: #c4b693;
40
51
  --db-danger: #b22b1b;
41
52
  --db-danger-bg: #fdf0ee;
53
+ --db-text-on-danger: #ffffff;
42
54
  --db-shadow: rgba(40, 30, 15, 0.12);
55
+ /* Git status colors — file badges, sync chips. Deleted/conflicted reuse
56
+ the danger hue on purpose; renamed gets the one cool accent. */
57
+ --db-git-modified: #9a6b00;
58
+ --db-git-added: #2e7d32;
59
+ --db-git-untracked: #2e7d32;
60
+ --db-git-renamed: #1565c0;
61
+ --db-git-deleted: #b22b1b;
62
+ --db-git-conflicted: #b22b1b;
43
63
  }
44
64
 
45
65
  .db-shell[data-theme='dark'] {
@@ -56,21 +76,35 @@
56
76
  --db-text-placeholder: #6b614a;
57
77
  --db-accent: #c8b48f;
58
78
  --db-accent-hover: #dec79d;
79
+ --db-text-on-accent: #1a1812;
80
+ --db-text-on-selected: #e8e2d0;
81
+ --db-focus: #e8e2d0;
59
82
  --db-accent-soft-08: rgba(200, 180, 143, 0.08);
83
+ --db-accent-soft-10: rgba(200, 180, 143, 0.1);
60
84
  --db-accent-soft-12: rgba(200, 180, 143, 0.12);
61
85
  --db-accent-soft-15: rgba(200, 180, 143, 0.18);
62
86
  --db-accent-soft-25: rgba(200, 180, 143, 0.28);
63
- --db-accent-tint: #262219;
64
87
  --db-accent-tint-strong: #3a382e;
65
88
  --db-accent-deep: #e6dcc0;
89
+ --db-editor-canvas: #16110b;
90
+ --db-badge-bg: #3a2f1f;
91
+ --db-badge-text: #fff4d6;
92
+ --db-badge-text-hover: #fff8e6;
66
93
  --db-input-border: #c8b48f;
67
94
  --db-danger: #f87171;
68
95
  --db-danger-bg: #1c1917;
96
+ --db-text-on-danger: #1c1917;
69
97
  --db-shadow: rgba(0, 0, 0, 0.4);
70
98
  /* In dark mode, "lighter than the toolbar" means brighter — so this
71
99
  sits a step above `--db-accent-tint-strong` instead of between it
72
100
  and tint. */
73
101
  --db-gutter-bg: #4a4538;
102
+ --db-git-modified: #e5b567;
103
+ --db-git-added: #81c784;
104
+ --db-git-untracked: #81c784;
105
+ --db-git-renamed: #64b5f6;
106
+ --db-git-deleted: #f87171;
107
+ --db-git-conflicted: #f87171;
74
108
  }
75
109
 
76
110
  @media (prefers-color-scheme: dark) {
@@ -88,18 +122,27 @@
88
122
  --db-text-placeholder: #6b614a;
89
123
  --db-accent: #c8b48f;
90
124
  --db-accent-hover: #dec79d;
125
+ --db-text-on-accent: #1a1812;
126
+ --db-text-on-selected: #e8e2d0;
127
+ --db-focus: #e8e2d0;
91
128
  --db-accent-soft-08: rgba(200, 180, 143, 0.08);
92
129
  --db-accent-soft-12: rgba(200, 180, 143, 0.12);
93
130
  --db-accent-soft-15: rgba(200, 180, 143, 0.18);
94
131
  --db-accent-soft-25: rgba(200, 180, 143, 0.28);
95
- --db-accent-tint: #262219;
96
132
  --db-accent-tint-strong: #3a382e;
97
133
  --db-accent-deep: #e6dcc0;
98
134
  --db-input-border: #c8b48f;
99
135
  --db-danger: #f87171;
100
136
  --db-danger-bg: #1c1917;
137
+ --db-text-on-danger: #1c1917;
101
138
  --db-shadow: rgba(0, 0, 0, 0.4);
102
139
  --db-gutter-bg: #4a4538;
140
+ --db-git-modified: #e5b567;
141
+ --db-git-added: #81c784;
142
+ --db-git-untracked: #81c784;
143
+ --db-git-renamed: #64b5f6;
144
+ --db-git-deleted: #f87171;
145
+ --db-git-conflicted: #f87171;
103
146
  }
104
147
  }
105
148
 
@@ -154,24 +197,140 @@
154
197
  }
155
198
 
156
199
  .db-explorer-btn {
200
+ width: 24px;
201
+ height: 24px;
157
202
  background: none;
158
203
  border: 1px solid transparent;
159
204
  border-radius: 3px;
160
205
  cursor: pointer;
161
- padding: 3px;
162
- font-size: 12px;
206
+ padding: 0;
207
+ font-size: 14px;
208
+ line-height: 1;
163
209
  color: var(--db-text-muted);
164
210
  display: flex;
165
211
  align-items: center;
166
212
  justify-content: center;
167
213
  }
168
214
 
169
- .db-explorer-btn:hover {
215
+ .db-explorer-btn:hover:not(:disabled) {
170
216
  background: var(--db-bg-hover);
171
217
  border-color: var(--db-border);
172
218
  color: var(--db-text-secondary);
173
219
  }
174
220
 
221
+ .db-explorer-btn:disabled {
222
+ cursor: default;
223
+ opacity: 0.55;
224
+ }
225
+
226
+ /* ── Transient workspace move ────────────────────────────────── */
227
+
228
+ .db-transient-move {
229
+ flex-shrink: 0;
230
+ padding: 8px;
231
+ border-bottom: 1px solid var(--db-border);
232
+ background: var(--db-accent-soft-08);
233
+ }
234
+
235
+ .db-transient-move-trigger {
236
+ width: 100%;
237
+ padding: 7px 9px;
238
+ border: 1px solid var(--db-accent);
239
+ border-radius: 5px;
240
+ background: var(--db-bg);
241
+ color: var(--db-accent-deep);
242
+ font: inherit;
243
+ font-weight: 600;
244
+ text-align: left;
245
+ cursor: pointer;
246
+ }
247
+
248
+ .db-transient-move-trigger:hover {
249
+ background: var(--db-bg-hover);
250
+ }
251
+
252
+ .db-transient-move-trigger:focus-visible,
253
+ .db-transient-move-select:focus-visible,
254
+ .db-transient-move-actions button:focus-visible {
255
+ outline: 2px solid var(--db-focus, var(--db-accent));
256
+ outline-offset: 2px;
257
+ }
258
+
259
+ .db-transient-move-form {
260
+ display: flex;
261
+ flex-direction: column;
262
+ gap: 7px;
263
+ }
264
+
265
+ .db-transient-move-label {
266
+ color: var(--db-text);
267
+ font-size: 12px;
268
+ font-weight: 600;
269
+ }
270
+
271
+ .db-transient-move-select {
272
+ box-sizing: border-box;
273
+ width: 100%;
274
+ min-width: 0;
275
+ padding: 6px 28px 6px 8px;
276
+ border: 1px solid var(--db-input-border);
277
+ border-radius: 4px;
278
+ background: var(--db-bg);
279
+ color: var(--db-text);
280
+ font: inherit;
281
+ }
282
+
283
+ .db-transient-move-hint,
284
+ .db-transient-move-error {
285
+ margin: 0;
286
+ font-size: 11px;
287
+ line-height: 1.4;
288
+ }
289
+
290
+ .db-transient-move-hint {
291
+ color: var(--db-text-muted);
292
+ }
293
+
294
+ .db-transient-move-error {
295
+ color: var(--db-danger);
296
+ }
297
+
298
+ .db-transient-move-actions {
299
+ display: flex;
300
+ justify-content: flex-end;
301
+ gap: 6px;
302
+ }
303
+
304
+ .db-transient-move-actions button {
305
+ padding: 5px 10px;
306
+ border-radius: 4px;
307
+ font: inherit;
308
+ font-weight: 600;
309
+ cursor: pointer;
310
+ }
311
+
312
+ .db-transient-move-actions button:disabled {
313
+ opacity: 0.55;
314
+ cursor: default;
315
+ }
316
+
317
+ .db-transient-move-cancel {
318
+ border: 1px solid var(--db-border-strong);
319
+ background: var(--db-bg);
320
+ color: var(--db-text-secondary);
321
+ }
322
+
323
+ .db-transient-move-submit {
324
+ border: 1px solid var(--db-accent);
325
+ background: var(--db-accent);
326
+ color: var(--db-text-on-accent);
327
+ }
328
+
329
+ .db-transient-move-submit:hover:not(:disabled) {
330
+ border-color: var(--db-accent-hover);
331
+ background: var(--db-accent-hover);
332
+ }
333
+
175
334
  /* ── New Item Input ──────────────────────────────────────────── */
176
335
 
177
336
  .db-new-item {
@@ -198,6 +357,25 @@
198
357
  outline: none;
199
358
  }
200
359
 
360
+ /* The UA outline is suppressed above, so this is the *only* focus
361
+ indicator on an input a keyboard user has to type into (WCAG 2.4.7).
362
+ :focus-visible rather than :focus so a pointer user placing a caret
363
+ doesn't get a ring. */
364
+ .db-new-item-input:focus-visible {
365
+ outline: 2px solid var(--db-focus);
366
+ outline-offset: 1px;
367
+ border-color: var(--db-accent);
368
+ }
369
+
370
+ .db-new-item-input[aria-invalid='true'] {
371
+ border-color: var(--db-danger);
372
+ }
373
+
374
+ .db-new-item-add:focus-visible {
375
+ outline: 2px solid var(--db-focus);
376
+ outline-offset: 1px;
377
+ }
378
+
201
379
  .db-new-item-suffix {
202
380
  font-size: 12px;
203
381
  color: var(--db-text-muted);
@@ -209,16 +387,22 @@
209
387
  padding: 3px 8px;
210
388
  font-size: 12px;
211
389
  background: var(--db-accent);
212
- color: #fff;
390
+ color: var(--db-text-on-accent);
213
391
  border: none;
214
392
  border-radius: 3px;
215
393
  cursor: pointer;
216
394
  }
217
395
 
218
- .db-new-item-add:hover {
396
+ .db-new-item-add:hover:not(:disabled) {
219
397
  background: var(--db-accent-hover);
220
398
  }
221
399
 
400
+ .db-new-item-input:disabled,
401
+ .db-new-item-add:disabled {
402
+ cursor: default;
403
+ opacity: 0.65;
404
+ }
405
+
222
406
  /* ── Tree ────────────────────────────────────────────────────── */
223
407
 
224
408
  .db-tree {
@@ -234,6 +418,31 @@
234
418
  font-size: 12px;
235
419
  }
236
420
 
421
+ .db-tree-error {
422
+ margin: 4px 8px;
423
+ padding: 6px 8px;
424
+ border: 1px solid var(--db-danger, #c33);
425
+ border-radius: 3px;
426
+ color: var(--db-danger, #c33);
427
+ font-size: 12px;
428
+ }
429
+
430
+ .db-tree-error-retry {
431
+ border: 0;
432
+ padding: 0;
433
+ color: inherit;
434
+ background: transparent;
435
+ font: inherit;
436
+ font-weight: 600;
437
+ text-decoration: underline;
438
+ cursor: pointer;
439
+ }
440
+
441
+ .db-tree--drop-target {
442
+ box-shadow: inset 0 0 0 2px var(--db-accent);
443
+ background: var(--db-accent-soft-08);
444
+ }
445
+
237
446
  .db-tree-row {
238
447
  display: flex;
239
448
  align-items: center;
@@ -248,14 +457,42 @@
248
457
  background: var(--db-bg-hover);
249
458
  }
250
459
 
460
+ /* The roving-tabindex row is the tree's single tab stop, so its focus ring
461
+ is the only thing telling a keyboard user where they are. Inset offset
462
+ keeps the ring inside the scroll container instead of being clipped. */
463
+ .db-tree-row:focus-visible {
464
+ outline: 2px solid var(--db-focus);
465
+ outline-offset: -2px;
466
+ }
467
+
468
+ /* A selected/drop-target row is filled with --db-bg-selected, which in
469
+ light mode *is* the accent brown — the default ring would disappear
470
+ into it. Re-point the token rather than duplicating the rule. */
471
+ .db-tree-row--selected,
472
+ .db-tree-row--drop-target {
473
+ --db-focus: #ffffff;
474
+ }
475
+
476
+ .db-tree-row--dragging {
477
+ opacity: 0.45;
478
+ }
479
+
480
+ .db-tree-row--drop-target,
481
+ .db-tree-row--drop-target:hover {
482
+ background: var(--db-bg-selected);
483
+ color: var(--db-text-on-selected);
484
+ outline: 1px solid var(--db-accent);
485
+ outline-offset: -1px;
486
+ }
487
+
251
488
  .db-tree-row--selected {
252
489
  background: var(--db-bg-selected);
253
- color: #ffffff;
490
+ color: var(--db-text-on-selected);
254
491
  }
255
492
 
256
493
  .db-tree-row--selected:hover {
257
494
  background: var(--db-bg-selected-hover);
258
- color: #ffffff;
495
+ color: var(--db-text-on-selected);
259
496
  }
260
497
 
261
498
  .db-tree-icon {
@@ -286,6 +523,15 @@
286
523
  outline: none;
287
524
  }
288
525
 
526
+ /* Same WCAG 2.4.7 gap as .db-new-item-input: the rename input is focused
527
+ programmatically the moment it appears, so with `outline: none` and no
528
+ replacement a keyboard user had no idea where they were typing. */
529
+ .db-tree-rename-input:focus-visible {
530
+ outline: 2px solid var(--db-focus);
531
+ outline-offset: 1px;
532
+ border-color: var(--db-accent);
533
+ }
534
+
289
535
  .db-tree-more {
290
536
  flex-shrink: 0;
291
537
  display: inline-flex;
@@ -299,6 +545,8 @@
299
545
  border-radius: 3px;
300
546
  background: transparent;
301
547
  color: var(--db-text-secondary);
548
+ font-size: 14px;
549
+ line-height: 1;
302
550
  cursor: pointer;
303
551
  visibility: hidden;
304
552
  }
@@ -315,9 +563,14 @@
315
563
  color: var(--db-text);
316
564
  }
317
565
 
566
+ .db-tree-more:focus-visible {
567
+ outline: 2px solid var(--db-focus);
568
+ outline-offset: -2px;
569
+ }
570
+
318
571
  .db-tree-more--active {
319
572
  background: var(--db-bg-selected);
320
- color: #ffffff;
573
+ color: var(--db-text-on-selected);
321
574
  }
322
575
 
323
576
  /* ── Context Menu ────────────────────────────────────────────── */
@@ -349,10 +602,18 @@
349
602
  color: var(--db-text-secondary);
350
603
  }
351
604
 
352
- .db-tree-context-item:hover {
605
+ .db-tree-context-item:hover,
606
+ .db-tree-context-item:focus-visible {
353
607
  background: var(--db-bg-hover);
354
608
  }
355
609
 
610
+ /* Menu items are reached with Arrow keys (they are not tab stops), so the
611
+ ring is the only cue to which item Enter will fire. */
612
+ .db-tree-context-item:focus-visible {
613
+ outline: 2px solid var(--db-focus);
614
+ outline-offset: -2px;
615
+ }
616
+
356
617
  .db-tree-context-item--danger {
357
618
  color: var(--db-danger);
358
619
  }
@@ -367,6 +628,7 @@
367
628
  position: relative;
368
629
  flex: 1;
369
630
  min-width: 0;
631
+ max-width: 320px;
370
632
  }
371
633
 
372
634
  .db-workspace-picker-btn {
@@ -387,10 +649,33 @@
387
649
  background: var(--db-bg-hover);
388
650
  }
389
651
 
652
+ .db-workspace-picker-label {
653
+ min-width: 0;
654
+ overflow: hidden;
655
+ text-overflow: ellipsis;
656
+ white-space: nowrap;
657
+ }
658
+
659
+ .db-workspace-picker-compact-icon {
660
+ display: none;
661
+ align-items: center;
662
+ justify-content: center;
663
+ }
664
+
390
665
  .db-workspace-picker-caret {
391
- font-size: 10px;
666
+ width: 10px;
667
+ height: 6px;
668
+ flex: 0 0 auto;
392
669
  margin-left: 4px;
393
- color: var(--db-text-placeholder);
670
+ background: currentColor;
671
+ clip-path: polygon(0 0, 100% 0, 50% 100%);
672
+ color: var(--db-text-muted);
673
+ transform-origin: center;
674
+ transition: transform 0.15s;
675
+ }
676
+
677
+ .db-workspace-picker-caret--open {
678
+ transform: rotate(180deg);
394
679
  }
395
680
 
396
681
  .db-workspace-dropdown {
@@ -409,7 +694,7 @@
409
694
 
410
695
  .db-workspace-dropdown-item {
411
696
  display: flex;
412
- align-items: center;
697
+ align-items: flex-start;
413
698
  justify-content: space-between;
414
699
  gap: 8px;
415
700
  width: 100%;
@@ -420,16 +705,21 @@
420
705
  border: none;
421
706
  cursor: pointer;
422
707
  color: var(--db-text-secondary);
423
- white-space: nowrap;
424
708
  }
425
709
 
426
710
  .db-workspace-dropdown-item:hover {
427
711
  background: var(--db-bg-hover);
428
712
  }
429
713
 
714
+ .db-workspace-dropdown-action-label {
715
+ display: inline-flex;
716
+ align-items: center;
717
+ gap: 6px;
718
+ }
719
+
430
720
  .db-workspace-dropdown-item--active {
431
721
  background: var(--db-bg-selected);
432
- color: #ffffff;
722
+ color: var(--db-text-on-selected);
433
723
  font-weight: 500;
434
724
  }
435
725
 
@@ -438,6 +728,35 @@
438
728
  color: var(--db-text-placeholder);
439
729
  }
440
730
 
731
+ .db-workspace-details {
732
+ display: flex;
733
+ flex-direction: column;
734
+ width: 100%;
735
+ min-width: 0;
736
+ }
737
+
738
+ .db-workspace-heading {
739
+ display: flex;
740
+ align-items: baseline;
741
+ justify-content: space-between;
742
+ gap: 12px;
743
+ white-space: nowrap;
744
+ }
745
+
746
+ .db-workspace-path {
747
+ margin-top: 2px;
748
+ color: var(--db-text-muted);
749
+ font-size: 11px;
750
+ font-weight: 400;
751
+ line-height: 1.35;
752
+ overflow-wrap: anywhere;
753
+ }
754
+
755
+ .db-workspace-dropdown-item--active :is(.db-workspace-type, .db-workspace-path) {
756
+ color: var(--db-text-on-selected);
757
+ opacity: 0.75;
758
+ }
759
+
441
760
  .db-workspace-dropdown-divider {
442
761
  height: 1px;
443
762
  background: var(--db-border);
@@ -476,9 +795,14 @@
476
795
  }
477
796
 
478
797
  .db-app-menu-caret {
479
- font-size: 18px;
798
+ width: 10px;
799
+ height: 6px;
800
+ flex: 0 0 auto;
801
+ background: currentColor;
802
+ clip-path: polygon(0 0, 100% 0, 50% 100%);
480
803
  color: var(--db-text-muted);
481
804
  display: inline-block;
805
+ transform-origin: center;
482
806
  transition: transform 0.15s;
483
807
  }
484
808
 
@@ -547,6 +871,8 @@
547
871
  border-radius: 4px;
548
872
  background: transparent;
549
873
  color: var(--db-text-muted);
874
+ font-size: 14px;
875
+ line-height: 1;
550
876
  cursor: pointer;
551
877
  transition:
552
878
  background 0.12s,
@@ -699,6 +1025,7 @@ body.db-resizing-sidebar * {
699
1025
  }
700
1026
 
701
1027
  .db-shell-sidebar-header {
1028
+ container: db-sidebar-header / inline-size;
702
1029
  display: flex;
703
1030
  align-items: center;
704
1031
  border-bottom: 1px solid var(--db-border-strong);
@@ -708,14 +1035,44 @@ body.db-resizing-sidebar * {
708
1035
  min-height: 40px;
709
1036
  }
710
1037
 
1038
+ @container db-sidebar-header (max-width: 300px) {
1039
+ .db-workspace-picker {
1040
+ flex: 0 0 auto;
1041
+ }
1042
+
1043
+ .db-workspace-picker-btn {
1044
+ width: auto;
1045
+ gap: 6px;
1046
+ }
1047
+
1048
+ .db-workspace-picker-label {
1049
+ display: none;
1050
+ }
1051
+
1052
+ .db-workspace-picker-compact-icon {
1053
+ display: inline-flex;
1054
+ }
1055
+ }
1056
+
711
1057
  .db-shell-sidebar-footer {
712
- padding: 8px 12px;
1058
+ box-sizing: border-box;
1059
+ display: flex;
1060
+ align-items: center;
1061
+ gap: 6px;
1062
+ height: 23px;
1063
+ padding: 0 12px 0 18px;
713
1064
  border-top: 1px solid var(--db-border-strong);
714
1065
  flex-shrink: 0;
715
1066
  font-size: 11px;
1067
+ line-height: 1;
1068
+ }
1069
+
1070
+ .db-shell-sidebar-footer > * {
1071
+ transform: translateY(-1px);
716
1072
  }
717
1073
 
718
1074
  .db-shell-sidebar-footer a {
1075
+ flex-shrink: 0;
719
1076
  color: var(--db-text-muted);
720
1077
  text-decoration: none;
721
1078
  }
@@ -725,6 +1082,34 @@ body.db-resizing-sidebar * {
725
1082
  text-decoration: underline;
726
1083
  }
727
1084
 
1085
+ .db-shell-sidebar-footer-separator,
1086
+ .db-shell-sidebar-footer-action {
1087
+ color: var(--db-text-muted);
1088
+ }
1089
+
1090
+ .db-shell-sidebar-footer-separator {
1091
+ flex-shrink: 0;
1092
+ opacity: 0.65;
1093
+ }
1094
+
1095
+ .db-shell-sidebar-footer-action {
1096
+ min-width: 0;
1097
+ padding: 0;
1098
+ overflow: hidden;
1099
+ border: 0;
1100
+ background: transparent;
1101
+ font: inherit;
1102
+ line-height: inherit;
1103
+ text-decoration: underline;
1104
+ text-overflow: ellipsis;
1105
+ white-space: nowrap;
1106
+ cursor: pointer;
1107
+ }
1108
+
1109
+ .db-shell-sidebar-footer-action:hover {
1110
+ color: var(--db-text-secondary);
1111
+ }
1112
+
728
1113
  .db-shell-empty {
729
1114
  display: flex;
730
1115
  align-items: center;
@@ -759,9 +1144,16 @@ body.db-resizing-sidebar * {
759
1144
  background: var(--db-bg-hover);
760
1145
  }
761
1146
 
762
- .db-mobile-back-arrow {
763
- font-size: 18px;
764
- line-height: 1;
1147
+ .db-mobile-files-icon {
1148
+ display: inline-flex;
1149
+ align-items: center;
1150
+ justify-content: center;
1151
+ flex-shrink: 0;
1152
+ }
1153
+
1154
+ .db-mobile-files-icon svg {
1155
+ width: 24px;
1156
+ height: 24px;
765
1157
  }
766
1158
 
767
1159
  /* In folder/empty views, the back button sits as a standalone bar */
@@ -772,10 +1164,9 @@ body.db-resizing-sidebar * {
772
1164
  background: var(--db-bg-subtle);
773
1165
  }
774
1166
 
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. */
1167
+ /* "Restore split view" button — appears in whichever pane is visible when
1168
+ compact layout was triggered manually on a wide viewport. Iconic only,
1169
+ no label, so it stays compact in either header. */
779
1170
  .db-restore-split {
780
1171
  display: inline-flex;
781
1172
  align-items: center;
@@ -799,20 +1190,28 @@ body.db-resizing-sidebar * {
799
1190
  .db-dialog-overlay {
800
1191
  position: fixed;
801
1192
  inset: 0;
802
- z-index: 100;
1193
+ /* Keep DocBlocks modals above Squisq player controls and editor tooltips. */
1194
+ z-index: 3000;
803
1195
  display: flex;
804
1196
  align-items: center;
805
1197
  justify-content: center;
1198
+ box-sizing: border-box;
1199
+ padding: 16px;
806
1200
  background: rgba(0, 0, 0, 0.4);
807
1201
  }
808
1202
 
809
1203
  .db-dialog {
1204
+ box-sizing: border-box;
810
1205
  background: var(--db-bg);
811
1206
  border: 1px solid var(--db-border);
812
1207
  border-radius: 8px;
813
1208
  box-shadow: 0 8px 32px var(--db-shadow);
814
1209
  width: 380px;
815
- max-width: 90vw;
1210
+ max-width: 100%;
1211
+ max-height: calc(100vh - 32px);
1212
+ max-height: calc(100dvh - 32px);
1213
+ display: flex;
1214
+ flex-direction: column;
816
1215
  }
817
1216
 
818
1217
  .db-dialog-header {
@@ -847,6 +1246,8 @@ body.db-resizing-sidebar * {
847
1246
  }
848
1247
 
849
1248
  .db-dialog-body {
1249
+ min-height: 0;
1250
+ overflow-y: auto;
850
1251
  padding: 16px 20px 20px;
851
1252
  font-size: 13px;
852
1253
  line-height: 1.6;
@@ -928,34 +1329,191 @@ body.db-resizing-sidebar * {
928
1329
  .db-settings-radio input[type='radio'] {
929
1330
  margin: 0;
930
1331
  cursor: pointer;
1332
+ accent-color: var(--db-accent);
931
1333
  }
932
1334
 
933
- /* ── Folder View ─────────────────────────────────────────────── */
934
-
935
- .db-folder-view {
936
- padding: 24px;
937
- height: 100%;
938
- overflow-y: auto;
939
- }
940
-
941
- .db-folder-view-header {
1335
+ .db-settings-checkbox {
942
1336
  display: flex;
943
1337
  align-items: center;
944
1338
  gap: 8px;
945
- margin-bottom: 16px;
946
- padding-bottom: 12px;
947
- border-bottom: 1px solid var(--db-border);
1339
+ padding: 6px 0;
1340
+ font-size: 13px;
1341
+ color: var(--db-text);
1342
+ cursor: pointer;
948
1343
  }
949
1344
 
950
- .db-folder-view-icon {
951
- display: inline-flex;
952
- align-items: center;
953
- color: var(--db-text-secondary);
1345
+ .db-settings-checkbox input[type='checkbox'] {
1346
+ margin: 0;
1347
+ cursor: pointer;
1348
+ accent-color: var(--db-accent);
954
1349
  }
955
1350
 
956
- .db-folder-view-icon svg {
957
- width: 24px;
958
- height: 24px;
1351
+ .db-settings-slider {
1352
+ display: flex;
1353
+ flex-direction: column;
1354
+ gap: 6px;
1355
+ color: var(--db-text);
1356
+ font-size: 13px;
1357
+ }
1358
+
1359
+ .db-settings-slider + .db-settings-slider {
1360
+ margin-top: 14px;
1361
+ }
1362
+
1363
+ .db-settings-slider-header {
1364
+ display: flex;
1365
+ align-items: baseline;
1366
+ justify-content: space-between;
1367
+ gap: 16px;
1368
+ }
1369
+
1370
+ .db-settings-slider-value {
1371
+ color: var(--db-text-muted);
1372
+ font-variant-numeric: tabular-nums;
1373
+ }
1374
+
1375
+ .db-settings-slider input[type='range'] {
1376
+ width: 100%;
1377
+ margin: 0;
1378
+ accent-color: var(--db-accent);
1379
+ cursor: pointer;
1380
+ }
1381
+
1382
+ .db-settings-accent-grid {
1383
+ display: grid;
1384
+ grid-template-columns: repeat(auto-fit, minmax(104px, 1fr));
1385
+ gap: 6px;
1386
+ }
1387
+
1388
+ .db-settings-action {
1389
+ margin-top: 4px;
1390
+ padding: 7px 12px;
1391
+ border: 1px solid var(--db-accent);
1392
+ border-radius: 5px;
1393
+ background: var(--db-accent);
1394
+ color: var(--db-text-on-accent);
1395
+ font: inherit;
1396
+ font-weight: 600;
1397
+ cursor: pointer;
1398
+ }
1399
+
1400
+ .db-settings-action:hover:not(:disabled) {
1401
+ border-color: var(--db-accent-hover);
1402
+ background: var(--db-accent-hover);
1403
+ }
1404
+
1405
+ .db-settings-action:focus-visible {
1406
+ outline: 2px solid var(--db-focus, var(--db-accent));
1407
+ outline-offset: 2px;
1408
+ }
1409
+
1410
+ .db-settings-action:disabled {
1411
+ opacity: 0.6;
1412
+ cursor: default;
1413
+ }
1414
+
1415
+ .db-settings-accent {
1416
+ position: relative;
1417
+ display: flex;
1418
+ align-items: center;
1419
+ gap: 8px;
1420
+ min-width: 0;
1421
+ padding: 7px 8px;
1422
+ border: 1px solid transparent;
1423
+ border-radius: 6px;
1424
+ color: var(--db-text);
1425
+ cursor: pointer;
1426
+ }
1427
+
1428
+ .db-settings-accent:hover {
1429
+ background: var(--db-bg-subtle);
1430
+ }
1431
+
1432
+ .db-settings-accent--selected {
1433
+ background: var(--db-accent-soft-08);
1434
+ border-color: var(--db-accent);
1435
+ }
1436
+
1437
+ .db-settings-accent-input {
1438
+ position: absolute;
1439
+ width: 1px;
1440
+ height: 1px;
1441
+ margin: -1px;
1442
+ padding: 0;
1443
+ overflow: hidden;
1444
+ clip: rect(0, 0, 0, 0);
1445
+ white-space: nowrap;
1446
+ border: 0;
1447
+ }
1448
+
1449
+ .db-settings-accent:has(.db-settings-accent-input:focus-visible) {
1450
+ outline: 2px solid var(--db-accent);
1451
+ outline-offset: 2px;
1452
+ }
1453
+
1454
+ .db-settings-accent-swatch {
1455
+ width: 16px;
1456
+ height: 16px;
1457
+ flex: 0 0 auto;
1458
+ border: 1px solid rgba(0, 0, 0, 0.22);
1459
+ border-radius: 50%;
1460
+ box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.18);
1461
+ }
1462
+
1463
+ .db-settings-accent-swatch--brown {
1464
+ background: #7d6948;
1465
+ }
1466
+
1467
+ .db-settings-accent-swatch--green {
1468
+ background: #4f715d;
1469
+ }
1470
+
1471
+ .db-settings-accent-swatch--blue {
1472
+ background: #526f91;
1473
+ }
1474
+
1475
+ .db-settings-accent-swatch--purple {
1476
+ background: #735b8c;
1477
+ }
1478
+
1479
+ .db-settings-accent-swatch--maroon {
1480
+ background: #805365;
1481
+ }
1482
+
1483
+ .db-settings-accent-swatch--orange {
1484
+ background: #8a5a32;
1485
+ }
1486
+
1487
+ .db-settings-accent-swatch--gray {
1488
+ background: #676767;
1489
+ }
1490
+
1491
+ /* ── Folder View ─────────────────────────────────────────────── */
1492
+
1493
+ .db-folder-view {
1494
+ padding: 24px;
1495
+ height: 100%;
1496
+ overflow-y: auto;
1497
+ }
1498
+
1499
+ .db-folder-view-header {
1500
+ display: flex;
1501
+ align-items: center;
1502
+ gap: 8px;
1503
+ margin-bottom: 16px;
1504
+ padding-bottom: 12px;
1505
+ border-bottom: 1px solid var(--db-border);
1506
+ }
1507
+
1508
+ .db-folder-view-icon {
1509
+ display: inline-flex;
1510
+ align-items: center;
1511
+ color: var(--db-text-secondary);
1512
+ }
1513
+
1514
+ .db-folder-view-icon svg {
1515
+ width: 24px;
1516
+ height: 24px;
959
1517
  }
960
1518
 
961
1519
  .db-folder-view-path {
@@ -1034,6 +1592,13 @@ body.db-resizing-sidebar * {
1034
1592
  padding-bottom: 10px;
1035
1593
  }
1036
1594
 
1595
+ /* Keep the preview-mode chevron on the same lifted baseline as its tab
1596
+ label. Squisq's native 9px bottom padding is paired with the native 4px
1597
+ tab padding; the DocBlocks override above adds 6px to the latter. */
1598
+ .db-shell .squisq-use-mode-trigger {
1599
+ padding-bottom: 15px;
1600
+ }
1601
+
1037
1602
  .squisq-toolbar-button[aria-label='Insert image'] {
1038
1603
  font-size: 0;
1039
1604
  background: no-repeat center / 18px
@@ -1055,9 +1620,6 @@ body.db-resizing-sidebar * {
1055
1620
  width: 28px;
1056
1621
  height: 28px;
1057
1622
  padding: 0;
1058
- font-size: 16px;
1059
- font-weight: 700;
1060
- letter-spacing: 1px;
1061
1623
  line-height: 1;
1062
1624
  border: 1px solid transparent;
1063
1625
  border-radius: 4px;
@@ -1066,12 +1628,35 @@ body.db-resizing-sidebar * {
1066
1628
  color: var(--db-text-muted);
1067
1629
  }
1068
1630
 
1631
+ .db-toolbar-menu-trigger svg {
1632
+ width: 18px;
1633
+ height: 18px;
1634
+ }
1635
+
1069
1636
  .db-toolbar-menu-trigger:hover {
1070
1637
  background: var(--db-bg-hover);
1071
1638
  border-color: var(--db-border);
1072
1639
  color: var(--db-text-secondary);
1073
1640
  }
1074
1641
 
1642
+ .db-toolbar-export-trigger {
1643
+ margin-left: 4px;
1644
+ }
1645
+
1646
+ .db-toolbar-export-trigger svg {
1647
+ width: 16px;
1648
+ height: 16px;
1649
+ }
1650
+
1651
+ .db-toolbar-settings-trigger {
1652
+ margin-left: 2px;
1653
+ }
1654
+
1655
+ .db-toolbar-settings-trigger svg {
1656
+ width: 16px;
1657
+ height: 16px;
1658
+ }
1659
+
1075
1660
  .db-toolbar-menu-dropdown {
1076
1661
  position: absolute;
1077
1662
  right: 0;
@@ -1099,10 +1684,17 @@ body.db-resizing-sidebar * {
1099
1684
  white-space: nowrap;
1100
1685
  }
1101
1686
 
1102
- .db-toolbar-menu-item:hover {
1687
+ .db-toolbar-menu-item:hover,
1688
+ .db-toolbar-menu-item:focus-visible {
1103
1689
  background: var(--db-bg-hover);
1104
1690
  }
1105
1691
 
1692
+ /* Arrow-reachable, not a tab stop — see .db-git-menu-item:focus-visible. */
1693
+ .db-toolbar-menu-item:focus-visible {
1694
+ outline: 2px solid var(--db-focus);
1695
+ outline-offset: -2px;
1696
+ }
1697
+
1106
1698
  .db-toolbar-menu-item:disabled {
1107
1699
  opacity: 0.5;
1108
1700
  cursor: default;
@@ -1156,6 +1748,53 @@ body.db-resizing-sidebar * {
1156
1748
  border-color: var(--db-accent);
1157
1749
  }
1158
1750
 
1751
+ .db-export-path-row {
1752
+ display: flex;
1753
+ align-items: center;
1754
+ gap: 6px;
1755
+ }
1756
+
1757
+ .db-export-path-input {
1758
+ flex: 1;
1759
+ min-width: 0;
1760
+ box-sizing: border-box;
1761
+ padding: 6px 8px;
1762
+ font-size: 13px;
1763
+ background: var(--db-bg-subtle);
1764
+ color: var(--db-text);
1765
+ border: 1px solid var(--db-border);
1766
+ border-radius: 4px;
1767
+ outline: none;
1768
+ }
1769
+
1770
+ .db-export-path-input:focus {
1771
+ border-color: var(--db-accent);
1772
+ }
1773
+
1774
+ .db-export-path-pick {
1775
+ flex: 0 0 auto;
1776
+ height: 30px;
1777
+ padding: 0 10px;
1778
+ font-size: 13px;
1779
+ font-weight: 600;
1780
+ line-height: 1;
1781
+ color: var(--db-text-secondary);
1782
+ background: var(--db-bg-subtle);
1783
+ border: 1px solid var(--db-border);
1784
+ border-radius: 4px;
1785
+ cursor: pointer;
1786
+ }
1787
+
1788
+ .db-export-path-pick:hover {
1789
+ background: var(--db-bg-hover);
1790
+ }
1791
+
1792
+ .db-export-path-input:disabled,
1793
+ .db-export-path-pick:disabled {
1794
+ opacity: 0.5;
1795
+ cursor: default;
1796
+ }
1797
+
1159
1798
  .db-export-hint {
1160
1799
  display: block;
1161
1800
  margin-top: 3px;
@@ -1210,12 +1849,13 @@ body.db-resizing-sidebar * {
1210
1849
  .db-export-chip--active {
1211
1850
  background: var(--db-accent);
1212
1851
  border-color: var(--db-accent);
1213
- color: #ffffff;
1852
+ color: var(--db-text-on-accent);
1214
1853
  }
1215
1854
 
1216
1855
  .db-export-chip--active:hover {
1217
1856
  background: var(--db-accent-hover);
1218
1857
  border-color: var(--db-accent-hover);
1858
+ color: var(--db-text-on-accent);
1219
1859
  }
1220
1860
 
1221
1861
  .db-export-chip:focus-visible {
@@ -1257,13 +1897,61 @@ body.db-resizing-sidebar * {
1257
1897
 
1258
1898
  .db-export-btn--primary {
1259
1899
  background: var(--db-accent);
1260
- color: #fff;
1900
+ color: var(--db-text-on-accent);
1261
1901
  border-color: var(--db-accent);
1262
1902
  }
1263
1903
 
1264
1904
  .db-export-btn--primary:hover {
1265
1905
  background: var(--db-accent-hover);
1266
1906
  border-color: var(--db-accent-hover);
1907
+ color: var(--db-text-on-accent);
1908
+ }
1909
+
1910
+ /* Shared-document links intentionally resemble export because they package a
1911
+ bounded Markdown-only DBK; the warning is the critical distinction. */
1912
+ .db-share-dialog {
1913
+ width: 480px;
1914
+ }
1915
+
1916
+ .db-share-warning {
1917
+ margin-bottom: 16px;
1918
+ padding: 10px 12px;
1919
+ color: var(--db-text);
1920
+ background: color-mix(in srgb, var(--db-accent) 12%, var(--db-bg-subtle));
1921
+ border: 1px solid var(--db-accent);
1922
+ border-radius: 5px;
1923
+ }
1924
+
1925
+ .db-share-link {
1926
+ display: block;
1927
+ width: 100%;
1928
+ min-height: 72px;
1929
+ box-sizing: border-box;
1930
+ resize: vertical;
1931
+ padding: 8px;
1932
+ font:
1933
+ 11px/1.45 ui-monospace,
1934
+ SFMono-Regular,
1935
+ Consolas,
1936
+ monospace;
1937
+ color: var(--db-text);
1938
+ background: var(--db-bg-subtle);
1939
+ border: 1px solid var(--db-border);
1940
+ border-radius: 4px;
1941
+ outline: none;
1942
+ overflow-wrap: anywhere;
1943
+ }
1944
+
1945
+ .db-share-link:focus {
1946
+ border-color: var(--db-accent);
1947
+ }
1948
+
1949
+ .db-share-length-warning {
1950
+ color: var(--db-danger, #a33a35);
1951
+ }
1952
+
1953
+ .db-share-temporary-note {
1954
+ color: var(--db-text-muted);
1267
1955
  }
1268
1956
 
1269
1957
  /* ── Squisq editor chrome separators ─────────────────────────── */
@@ -1279,7 +1967,7 @@ body.db-resizing-sidebar * {
1279
1967
  }
1280
1968
 
1281
1969
  .db-shell[data-theme='light'] .squisq-toolbar {
1282
- background: var(--db-accent-tint);
1970
+ background: var(--db-bg-subtle);
1283
1971
  }
1284
1972
 
1285
1973
  .db-shell[data-theme='light'] .squisq-toolbar-view-tabs {
@@ -1292,7 +1980,26 @@ body.db-resizing-sidebar * {
1292
1980
  }
1293
1981
 
1294
1982
  .db-shell[data-theme='dark'] .squisq-toolbar-view-tabs {
1295
- background: #16110b;
1983
+ background: var(--db-editor-canvas);
1984
+ }
1985
+
1986
+ /* Bind Squisq's host-facing accent to the active DocBlocks appearance. */
1987
+ .db-shell .squisq-editor-shell {
1988
+ --squisq-accent: var(--db-accent);
1989
+ --squisq-accent-hover: var(--db-accent-hover);
1990
+ --squisq-text-on-accent: var(--db-text-on-accent);
1991
+ }
1992
+
1993
+ /* Simple diagrams, drawings, and layout canvases share Squisq's Scene
1994
+ engine. Keep canvas and raised-control surfaces on the same DocBlocks
1995
+ palette instead of falling back to slate. */
1996
+ .db-shell .squisq-editor-shell .squisq-scene-shell {
1997
+ --squisq-surface: var(--db-editor-canvas);
1998
+ --squisq-surface-raised: var(--db-bg-subtle);
1999
+ --squisq-surface-hover: var(--db-bg-hover);
2000
+ --squisq-border: var(--db-border-strong);
2001
+ --squisq-text: var(--db-text);
2002
+ --squisq-text-muted: var(--db-text-muted);
1296
2003
  }
1297
2004
 
1298
2005
  /* ── Inline preview gutter: thematic green ──────────────────── */
@@ -1310,7 +2017,7 @@ body.db-resizing-sidebar * {
1310
2017
  --squisq-preview-card-border: var(--db-border);
1311
2018
  --squisq-preview-card-shadow: 0 1px 2px rgba(40, 30, 15, 0.08);
1312
2019
  --squisq-preview-card-title: var(--db-accent-deep);
1313
- --squisq-preview-card-svg-bg: var(--db-accent-tint);
2020
+ --squisq-preview-card-svg-bg: var(--db-bg-subtle);
1314
2021
  --squisq-preview-dot-halo: var(--db-gutter-bg);
1315
2022
  --squisq-preview-empty-bg: #ffffff;
1316
2023
  --squisq-preview-empty-border: var(--db-border);
@@ -1355,15 +2062,51 @@ body.db-resizing-sidebar * {
1355
2062
  }
1356
2063
 
1357
2064
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-container {
1358
- background: #16110b;
2065
+ background: var(--db-editor-canvas);
1359
2066
  }
1360
2067
 
1361
2068
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor {
1362
2069
  background: var(--db-bg);
1363
2070
  }
1364
2071
 
2072
+ /* The WYSIWYG canvas owns its scroll port, so the browser's native light
2073
+ scrollbar otherwise cuts a bright stripe through the dark editor. Keep
2074
+ the track and thumb within the DocBlocks palette; Firefox uses the
2075
+ standard properties while Chromium/Electron use the WebKit pseudo-elements. */
2076
+ .db-shell .squisq-wysiwyg-container {
2077
+ scrollbar-color: var(--db-border-strong) var(--db-bg);
2078
+ scrollbar-width: thin;
2079
+ }
2080
+
2081
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar {
2082
+ width: 12px;
2083
+ height: 12px;
2084
+ }
2085
+
2086
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-track,
2087
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-corner {
2088
+ background: var(--db-bg);
2089
+ }
2090
+
2091
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-thumb {
2092
+ min-height: 32px;
2093
+ background: var(--db-border-strong);
2094
+ border: 3px solid var(--db-bg);
2095
+ border-radius: 999px;
2096
+ }
2097
+
2098
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-thumb:hover {
2099
+ background: var(--db-accent);
2100
+ }
2101
+
2102
+ .db-shell .squisq-wysiwyg-container::-webkit-scrollbar-button {
2103
+ display: none;
2104
+ width: 0;
2105
+ height: 0;
2106
+ }
2107
+
1365
2108
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor pre {
1366
- background: #16110b;
2109
+ background: var(--db-editor-canvas);
1367
2110
  }
1368
2111
 
1369
2112
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor code {
@@ -1382,7 +2125,7 @@ body.db-resizing-sidebar * {
1382
2125
  }
1383
2126
 
1384
2127
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-preview-codeblock {
1385
- background: #16110b;
2128
+ background: var(--db-editor-canvas);
1386
2129
  }
1387
2130
 
1388
2131
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-status-bar {
@@ -1395,42 +2138,138 @@ body.db-resizing-sidebar * {
1395
2138
  background: var(--db-bg);
1396
2139
  }
1397
2140
 
1398
- /* ── Squisq accent override (blue thematic green) ──────────── */
2141
+ /* Squisq's media bin ships with a fixed blue-slate palette. Bind the full
2142
+ pane to DocBlocks' appearance tokens so its surface and controls follow
2143
+ the selected accent in both light and dark themes. */
2144
+ .db-shell .squisq-editor-shell .squisq-media-bin {
2145
+ background: var(--db-bg-subtle);
2146
+ border-left-color: var(--db-border);
2147
+ color: var(--db-text);
2148
+ scrollbar-color: var(--db-border-strong) var(--db-bg-subtle);
2149
+ }
1399
2150
 
1400
- .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-view-tab--active {
1401
- color: var(--db-accent-hover);
1402
- border-bottom-color: var(--db-accent-hover);
2151
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-header {
2152
+ border-bottom-color: var(--db-border);
1403
2153
  }
1404
2154
 
1405
- .db-shell[data-theme='dark']
1406
- .squisq-editor-shell[data-theme='dark']
1407
- .squisq-toolbar-view-tab--active {
1408
- color: var(--db-accent-deep);
1409
- border-bottom-color: var(--db-accent-hover);
2155
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-title {
2156
+ color: var(--db-text-secondary);
1410
2157
  }
1411
2158
 
1412
- .db-shell[data-theme='dark']
1413
- .squisq-editor-shell[data-theme='dark']
1414
- .squisq-toolbar-button--active {
2159
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-upload {
1415
2160
  background: var(--db-accent-tint-strong);
1416
- color: var(--db-accent-hover);
2161
+ border-color: var(--db-border);
2162
+ color: var(--db-text-secondary);
1417
2163
  }
1418
2164
 
1419
- .db-shell[data-theme='dark']
1420
- .squisq-editor-shell[data-theme='dark']
1421
- .squisq-toolbar-button--active:hover {
1422
- background: var(--db-accent-tint-strong);
1423
- color: var(--db-accent-deep);
2165
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-upload:hover {
2166
+ background: var(--db-bg-hover);
2167
+ border-color: var(--db-border-strong);
1424
2168
  }
1425
2169
 
1426
- .db-shell[data-theme='dark']
1427
- .squisq-editor-shell[data-theme='dark']
1428
- .squisq-toolbar-overflow-item--active {
1429
- color: var(--db-accent-hover);
1430
- background: var(--db-accent-tint-strong);
2170
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-empty,
2171
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-size {
2172
+ color: var(--db-text-muted);
1431
2173
  }
1432
2174
 
1433
- .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor a {
2175
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-item {
2176
+ border-bottom-color: var(--db-border);
2177
+ color: var(--db-text-secondary);
2178
+ }
2179
+
2180
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-item:hover,
2181
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-item:focus-visible {
2182
+ background: var(--db-bg-hover);
2183
+ }
2184
+
2185
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-item:focus-visible {
2186
+ outline-color: var(--db-accent);
2187
+ }
2188
+
2189
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-thumb,
2190
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-icon {
2191
+ background: var(--db-accent-tint-strong);
2192
+ }
2193
+
2194
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-drop-target {
2195
+ background: color-mix(in srgb, var(--db-bg-subtle) 92%, var(--db-accent));
2196
+ border-color: var(--db-accent);
2197
+ color: var(--db-accent-deep);
2198
+ }
2199
+
2200
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-drop-target-icon {
2201
+ background: var(--db-accent);
2202
+ color: var(--db-text-on-accent);
2203
+ }
2204
+
2205
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-drop-target span:last-child {
2206
+ color: var(--db-text-muted);
2207
+ }
2208
+
2209
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu {
2210
+ background: var(--db-bg);
2211
+ border-color: var(--db-border);
2212
+ box-shadow: 0 12px 28px var(--db-shadow);
2213
+ }
2214
+
2215
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item {
2216
+ color: var(--db-text-secondary);
2217
+ }
2218
+
2219
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item:hover,
2220
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item:focus-visible {
2221
+ background: var(--db-bg-hover);
2222
+ }
2223
+
2224
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item--danger {
2225
+ color: var(--db-danger);
2226
+ }
2227
+
2228
+ .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu-item--danger:hover,
2229
+ .db-shell
2230
+ .squisq-editor-shell
2231
+ .squisq-media-bin
2232
+ .squisq-media-bin-context-menu-item--danger:focus-visible {
2233
+ background: var(--db-danger-bg);
2234
+ color: var(--db-danger);
2235
+ }
2236
+
2237
+ /* ── Squisq accent override (blue → thematic green) ──────────── */
2238
+
2239
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-view-tab--active {
2240
+ color: var(--db-accent-hover);
2241
+ border-bottom-color: var(--db-accent-hover);
2242
+ }
2243
+
2244
+ .db-shell[data-theme='dark']
2245
+ .squisq-editor-shell[data-theme='dark']
2246
+ .squisq-toolbar-view-tab--active {
2247
+ color: var(--db-accent-deep);
2248
+ border-bottom-color: var(--db-accent-hover);
2249
+ }
2250
+
2251
+ .db-shell[data-theme='dark']
2252
+ .squisq-editor-shell[data-theme='dark']
2253
+ .squisq-toolbar-button--active {
2254
+ background: var(--db-accent-tint-strong);
2255
+ color: var(--db-accent-hover);
2256
+ }
2257
+
2258
+ .db-shell[data-theme='dark']
2259
+ .squisq-editor-shell[data-theme='dark']
2260
+ .squisq-toolbar-button--active:hover {
2261
+ background: var(--db-accent-tint-strong);
2262
+ color: var(--db-accent-deep);
2263
+ }
2264
+
2265
+ .db-shell[data-theme='dark']
2266
+ .squisq-editor-shell[data-theme='dark']
2267
+ .squisq-toolbar-overflow-item--active {
2268
+ color: var(--db-accent-hover);
2269
+ background: var(--db-accent-tint-strong);
2270
+ }
2271
+
2272
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor a {
1434
2273
  color: var(--db-accent-hover);
1435
2274
  }
1436
2275
 
@@ -1477,10 +2316,17 @@ body.db-resizing-sidebar * {
1477
2316
  filter: grayscale(1);
1478
2317
  }
1479
2318
 
1480
- /* Closed-state template trigger: neutralize squisq's slate-navy bg ── */
2319
+ /* Keep the block-type and transition triggers on the same DocBlocks surface.
2320
+ The transition trigger has no thumbnail, so give it the block trigger's
2321
+ natural rendered height explicitly. */
2322
+ .db-shell .squisq-editor-shell .squisq-transition-picker-trigger {
2323
+ box-sizing: border-box;
2324
+ height: 29px;
2325
+ }
2326
+
1481
2327
  .db-shell[data-theme='dark']
1482
2328
  .squisq-editor-shell[data-theme='dark']
1483
- .squisq-template-picker-trigger {
2329
+ :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger) {
1484
2330
  background: var(--db-bg-subtle);
1485
2331
  border-color: var(--db-border);
1486
2332
  color: var(--db-text);
@@ -1488,7 +2334,7 @@ body.db-resizing-sidebar * {
1488
2334
 
1489
2335
  .db-shell[data-theme='dark']
1490
2336
  .squisq-editor-shell[data-theme='dark']
1491
- .squisq-template-picker-trigger:hover {
2337
+ :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger):hover {
1492
2338
  background: var(--db-bg-hover);
1493
2339
  border-color: var(--db-border-strong);
1494
2340
  }
@@ -1539,20 +2385,21 @@ html:has(.db-shell[data-theme='dark']) .squisq-tooltip {
1539
2385
  /* The gallery popover renders into document.body via createPortal, so
1540
2386
  neither .db-shell nor .squisq-editor-shell are ancestors. We use
1541
2387
  `html:has(.db-shell[data-theme='dark'])` to detect docblocks' dark
1542
- theme from outside the shell, then style the portaled gallery (its
1543
- root has id="squisq-template-gallery-portal"). */
2388
+ theme from outside the shell, then bind the portaled dialog through
2389
+ Squisq's stable `data-squisq-template-gallery-portal` marker. Dialog
2390
+ and gallery ids are intentionally instance-specific. */
1544
2391
 
1545
2392
  .db-shell[data-theme='dark']
1546
2393
  .squisq-editor-shell[data-theme='dark']
1547
- .squisq-template-picker-trigger--open {
2394
+ :is(.squisq-template-picker-trigger--open, .squisq-transition-picker-trigger--open) {
1548
2395
  border-color: var(--db-accent-hover);
1549
2396
  outline-color: var(--db-accent-soft-25);
1550
2397
  }
1551
2398
 
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. */
2399
+ /* The template gallery and file-tree context menu render into document.body
2400
+ via createPortal, so they live outside `.db-shell`. Hoist the same
2401
+ brown/canvas tokens onto the html element (gated by the resolved shell
2402
+ theme) so every portaled surface keeps the DocBlocks palette. */
1556
2403
  html:has(.db-shell[data-theme='dark']) {
1557
2404
  --db-bg: #1a1812;
1558
2405
  --db-bg-subtle: #262219;
@@ -1560,7 +2407,12 @@ html:has(.db-shell[data-theme='dark']) {
1560
2407
  --db-border: #4d4636;
1561
2408
  --db-border-strong: #6b6448;
1562
2409
  --db-text: #e8e2d0;
2410
+ --db-text-secondary: #d4ccb0;
1563
2411
  --db-text-muted: #a89a7c;
2412
+ --db-danger: #f87171;
2413
+ --db-danger-bg: #1c1917;
2414
+ --db-text-on-danger: #1c1917;
2415
+ --db-shadow: rgba(0, 0, 0, 0.4);
1564
2416
  --db-accent: #c8b48f;
1565
2417
  --db-accent-hover: #dec79d;
1566
2418
  --db-accent-soft-15: rgba(200, 180, 143, 0.18);
@@ -1576,7 +2428,12 @@ html:has(.db-shell[data-theme='light']) {
1576
2428
  --db-border: #d6cdb0;
1577
2429
  --db-border-strong: #b5a985;
1578
2430
  --db-text: #2a2419;
2431
+ --db-text-secondary: #3d3528;
1579
2432
  --db-text-muted: #6b614a;
2433
+ --db-danger: #b22b1b;
2434
+ --db-danger-bg: #fdf0ee;
2435
+ --db-text-on-danger: #ffffff;
2436
+ --db-shadow: rgba(40, 30, 15, 0.12);
1580
2437
  --db-accent: #7d6948;
1581
2438
  --db-accent-hover: #5e4f37;
1582
2439
  --db-accent-soft-15: rgba(125, 105, 72, 0.15);
@@ -1585,6 +2442,641 @@ html:has(.db-shell[data-theme='light']) {
1585
2442
  --db-gutter-bg: #efe8d4;
1586
2443
  }
1587
2444
 
2445
+ /* Accent variants keep Brown as the untouched default while recoloring the
2446
+ full chrome palette for either appearance. The same tokens are hoisted to
2447
+ `html` so Squisq portals and file-tree menus inherit the active variant. */
2448
+ .db-shell[data-theme='light']:not([data-accent='brown']),
2449
+ html:has(.db-shell[data-theme='light']:not([data-accent='brown'])) {
2450
+ --db-accent-soft-08: rgb(var(--db-accent-rgb) / 8%);
2451
+ --db-accent-soft-10: rgb(var(--db-accent-rgb) / 10%);
2452
+ --db-accent-soft-12: rgb(var(--db-accent-rgb) / 12%);
2453
+ --db-accent-soft-15: rgb(var(--db-accent-rgb) / 15%);
2454
+ --db-accent-soft-25: rgb(var(--db-accent-rgb) / 25%);
2455
+ --db-gallery-backdrop: rgba(30, 30, 30, 0.24);
2456
+ --db-gallery-panel-bg: var(--db-bg);
2457
+ --db-gallery-raised-bg: var(--db-bg);
2458
+ --db-gallery-icon-bg: var(--db-gutter-bg);
2459
+ --db-gallery-new-bg: var(--db-bg-subtle);
2460
+ --db-gallery-placeholder: var(--db-text-muted);
2461
+ }
2462
+
2463
+ .db-shell[data-theme='dark']:not([data-accent='brown']),
2464
+ html:has(.db-shell[data-theme='dark']:not([data-accent='brown'])) {
2465
+ --db-accent-soft-08: rgb(var(--db-accent-rgb) / 8%);
2466
+ --db-accent-soft-10: rgb(var(--db-accent-rgb) / 10%);
2467
+ --db-accent-soft-12: rgb(var(--db-accent-rgb) / 12%);
2468
+ --db-accent-soft-15: rgb(var(--db-accent-rgb) / 18%);
2469
+ --db-accent-soft-25: rgb(var(--db-accent-rgb) / 28%);
2470
+ --db-gallery-backdrop: rgba(0, 0, 0, 0.58);
2471
+ --db-gallery-panel-bg: var(--db-bg);
2472
+ --db-gallery-header-bg: var(--db-editor-canvas);
2473
+ --db-gallery-raised-bg: var(--db-bg-subtle);
2474
+ --db-gallery-icon-bg: var(--db-editor-canvas);
2475
+ --db-gallery-new-bg: var(--db-bg-subtle);
2476
+ --db-gallery-placeholder: var(--db-text-muted);
2477
+ }
2478
+
2479
+ .db-shell[data-theme='light'][data-accent='green'],
2480
+ html:has(.db-shell[data-theme='light'][data-accent='green']) {
2481
+ --db-bg-subtle: #edf4ef;
2482
+ --db-bg-hover: #dfece3;
2483
+ --db-bg-selected: #4f715d;
2484
+ --db-bg-selected-hover: #3d5949;
2485
+ --db-border: #c6d8cb;
2486
+ --db-border-strong: #98b3a1;
2487
+ --db-text: #202a23;
2488
+ --db-text-secondary: #334038;
2489
+ --db-text-muted: #5b6d61;
2490
+ --db-text-placeholder: #69786d;
2491
+ --db-accent-rgb: 79 113 93;
2492
+ --db-accent: #4f715d;
2493
+ --db-accent-hover: #3d5949;
2494
+ --db-accent-tint-strong: #cfe0d3;
2495
+ --db-accent-deep: #284534;
2496
+ --db-gutter-bg: #e5f0e8;
2497
+ --db-input-border: #abc2b1;
2498
+ }
2499
+
2500
+ .db-shell[data-theme='dark'][data-accent='green'],
2501
+ html:has(.db-shell[data-theme='dark'][data-accent='green']) {
2502
+ --db-bg: #121814;
2503
+ --db-bg-subtle: #1c261f;
2504
+ --db-bg-hover: #2b392e;
2505
+ --db-bg-selected: #2b392e;
2506
+ --db-bg-selected-hover: #3a4b3e;
2507
+ --db-border: #3b4e40;
2508
+ --db-border-strong: #5b705f;
2509
+ --db-text: #e2ebe4;
2510
+ --db-text-secondary: #cbd9ce;
2511
+ --db-text-muted: #91a596;
2512
+ --db-text-placeholder: #607267;
2513
+ --db-accent-rgb: 158 194 168;
2514
+ --db-accent: #9ec2a8;
2515
+ --db-accent-hover: #b4d2bc;
2516
+ --db-text-on-accent: #132018;
2517
+ --db-text-on-selected: #e2ebe4;
2518
+ --db-accent-tint-strong: #2f4034;
2519
+ --db-accent-deep: #d4e8d9;
2520
+ --db-gutter-bg: #3b4d40;
2521
+ --db-input-border: #9ec2a8;
2522
+ --db-editor-canvas: #0e1510;
2523
+ --db-badge-bg: #294031;
2524
+ --db-badge-text: #dcf1e2;
2525
+ --db-badge-text-hover: #effaf2;
2526
+ }
2527
+
2528
+ .db-shell[data-theme='light'][data-accent='blue'],
2529
+ html:has(.db-shell[data-theme='light'][data-accent='blue']) {
2530
+ --db-bg-subtle: #eef2f7;
2531
+ --db-bg-hover: #e1e8f0;
2532
+ --db-bg-selected: #526f91;
2533
+ --db-bg-selected-hover: #3c5675;
2534
+ --db-border: #c7d1de;
2535
+ --db-border-strong: #99aabd;
2536
+ --db-text: #202733;
2537
+ --db-text-secondary: #34404e;
2538
+ --db-text-muted: #5d6979;
2539
+ --db-text-placeholder: #6d7886;
2540
+ --db-accent-rgb: 82 111 145;
2541
+ --db-accent: #526f91;
2542
+ --db-accent-hover: #3c5675;
2543
+ --db-accent-tint-strong: #d0dbe7;
2544
+ --db-accent-deep: #293e58;
2545
+ --db-gutter-bg: #e7edf5;
2546
+ --db-input-border: #acb9c9;
2547
+ }
2548
+
2549
+ .db-shell[data-theme='dark'][data-accent='blue'],
2550
+ html:has(.db-shell[data-theme='dark'][data-accent='blue']) {
2551
+ --db-bg: #13171c;
2552
+ --db-bg-subtle: #1c232b;
2553
+ --db-bg-hover: #2a3542;
2554
+ --db-bg-selected: #2a3542;
2555
+ --db-bg-selected-hover: #39495a;
2556
+ --db-border: #3b4a5c;
2557
+ --db-border-strong: #5a6d83;
2558
+ --db-text: #e2e8ef;
2559
+ --db-text-secondary: #cad5e0;
2560
+ --db-text-muted: #8fa0b3;
2561
+ --db-text-placeholder: #5f7083;
2562
+ --db-accent-rgb: 167 189 216;
2563
+ --db-accent: #a7bdd8;
2564
+ --db-accent-hover: #bdd0e5;
2565
+ --db-text-on-accent: #131b24;
2566
+ --db-text-on-selected: #e2e8ef;
2567
+ --db-accent-tint-strong: #2e3b49;
2568
+ --db-accent-deep: #d8e5f2;
2569
+ --db-gutter-bg: #394858;
2570
+ --db-input-border: #a7bdd8;
2571
+ --db-editor-canvas: #0f1318;
2572
+ --db-badge-bg: #28394a;
2573
+ --db-badge-text: #dceaff;
2574
+ --db-badge-text-hover: #edf5ff;
2575
+ }
2576
+
2577
+ .db-shell[data-theme='light'][data-accent='purple'],
2578
+ html:has(.db-shell[data-theme='light'][data-accent='purple']) {
2579
+ --db-bg-subtle: #f3eff6;
2580
+ --db-bg-hover: #e9e1ef;
2581
+ --db-bg-selected: #735b8c;
2582
+ --db-bg-selected-hover: #59436f;
2583
+ --db-border: #d5c8dd;
2584
+ --db-border-strong: #b19cbe;
2585
+ --db-text: #29222e;
2586
+ --db-text-secondary: #403648;
2587
+ --db-text-muted: #6e6075;
2588
+ --db-text-placeholder: #7c6e82;
2589
+ --db-accent-rgb: 115 91 140;
2590
+ --db-accent: #735b8c;
2591
+ --db-accent-hover: #59436f;
2592
+ --db-accent-tint-strong: #ddd0e4;
2593
+ --db-accent-deep: #483252;
2594
+ --db-gutter-bg: #eee7f2;
2595
+ --db-input-border: #c2afcc;
2596
+ }
2597
+
2598
+ .db-shell[data-theme='dark'][data-accent='purple'],
2599
+ html:has(.db-shell[data-theme='dark'][data-accent='purple']) {
2600
+ --db-bg: #18141b;
2601
+ --db-bg-subtle: #251d29;
2602
+ --db-bg-hover: #382c3e;
2603
+ --db-bg-selected: #382c3e;
2604
+ --db-bg-selected-hover: #4b3a53;
2605
+ --db-border: #504057;
2606
+ --db-border-strong: #705b79;
2607
+ --db-text: #ece3ef;
2608
+ --db-text-secondary: #d8cadd;
2609
+ --db-text-muted: #a38fab;
2610
+ --db-text-placeholder: #715f79;
2611
+ --db-accent-rgb: 194 169 212;
2612
+ --db-accent: #c2a9d4;
2613
+ --db-accent-hover: #d6bee3;
2614
+ --db-text-on-accent: #211727;
2615
+ --db-text-on-selected: #ece3ef;
2616
+ --db-accent-tint-strong: #413348;
2617
+ --db-accent-deep: #eadcf1;
2618
+ --db-gutter-bg: #493b50;
2619
+ --db-input-border: #c2a9d4;
2620
+ --db-editor-canvas: #120f15;
2621
+ --db-badge-bg: #3b2a44;
2622
+ --db-badge-text: #f2e2fb;
2623
+ --db-badge-text-hover: #faefff;
2624
+ }
2625
+
2626
+ .db-shell[data-theme='light'][data-accent='maroon'],
2627
+ html:has(.db-shell[data-theme='light'][data-accent='maroon']) {
2628
+ --db-bg-subtle: #f7eff2;
2629
+ --db-bg-hover: #eedfe5;
2630
+ --db-bg-selected: #805365;
2631
+ --db-bg-selected-hover: #643d4d;
2632
+ --db-border: #dec8d0;
2633
+ --db-border-strong: #bd9ba8;
2634
+ --db-text: #2f2227;
2635
+ --db-text-secondary: #49343d;
2636
+ --db-text-muted: #775e68;
2637
+ --db-text-placeholder: #856c75;
2638
+ --db-accent-rgb: 128 83 101;
2639
+ --db-accent: #805365;
2640
+ --db-accent-hover: #643d4d;
2641
+ --db-accent-tint-strong: #e6d0d8;
2642
+ --db-accent-deep: #53303e;
2643
+ --db-gutter-bg: #f2e7eb;
2644
+ --db-input-border: #cdaeb9;
2645
+ }
2646
+
2647
+ .db-shell[data-theme='dark'][data-accent='maroon'],
2648
+ html:has(.db-shell[data-theme='dark'][data-accent='maroon']) {
2649
+ --db-bg: #1b1316;
2650
+ --db-bg-subtle: #291d21;
2651
+ --db-bg-hover: #3d2b31;
2652
+ --db-bg-selected: #3d2b31;
2653
+ --db-bg-selected-hover: #513942;
2654
+ --db-border: #553e46;
2655
+ --db-border-strong: #785b65;
2656
+ --db-text: #f0e3e7;
2657
+ --db-text-secondary: #dccbd1;
2658
+ --db-text-muted: #aa929a;
2659
+ --db-text-placeholder: #765f67;
2660
+ --db-accent-rgb: 208 165 180;
2661
+ --db-accent: #d0a5b4;
2662
+ --db-accent-hover: #e2bac8;
2663
+ --db-text-on-accent: #26171c;
2664
+ --db-text-on-selected: #f0e3e7;
2665
+ --db-accent-tint-strong: #473139;
2666
+ --db-accent-deep: #f0d8e0;
2667
+ --db-gutter-bg: #503b42;
2668
+ --db-input-border: #d0a5b4;
2669
+ --db-editor-canvas: #150e11;
2670
+ --db-badge-bg: #442832;
2671
+ --db-badge-text: #ffe4ec;
2672
+ --db-badge-text-hover: #fff2f6;
2673
+ }
2674
+
2675
+ .db-shell[data-theme='light'][data-accent='orange'],
2676
+ html:has(.db-shell[data-theme='light'][data-accent='orange']) {
2677
+ --db-bg-subtle: #f8f1e9;
2678
+ --db-bg-hover: #f0e4d6;
2679
+ --db-bg-selected: #8a5a32;
2680
+ --db-bg-selected-hover: #6d4323;
2681
+ --db-border: #e0cfbc;
2682
+ --db-border-strong: #c2a282;
2683
+ --db-text: #30271f;
2684
+ --db-text-secondary: #4a3c30;
2685
+ --db-text-muted: #776655;
2686
+ --db-text-placeholder: #857362;
2687
+ --db-accent-rgb: 138 90 50;
2688
+ --db-accent: #8a5a32;
2689
+ --db-accent-hover: #6d4323;
2690
+ --db-accent-tint-strong: #ead8c5;
2691
+ --db-accent-deep: #57371f;
2692
+ --db-gutter-bg: #f3e9de;
2693
+ --db-input-border: #cfb394;
2694
+ }
2695
+
2696
+ .db-shell[data-theme='dark'][data-accent='orange'],
2697
+ html:has(.db-shell[data-theme='dark'][data-accent='orange']) {
2698
+ --db-bg: #1b1611;
2699
+ --db-bg-subtle: #2a2118;
2700
+ --db-bg-hover: #3e3123;
2701
+ --db-bg-selected: #3e3123;
2702
+ --db-bg-selected-hover: #52412f;
2703
+ --db-border: #574634;
2704
+ --db-border-strong: #79654d;
2705
+ --db-text: #f0e7dc;
2706
+ --db-text-secondary: #ddcfbe;
2707
+ --db-text-muted: #aa9883;
2708
+ --db-text-placeholder: #756552;
2709
+ --db-accent-rgb: 215 176 138;
2710
+ --db-accent: #d7b08a;
2711
+ --db-accent-hover: #e8c39e;
2712
+ --db-text-on-accent: #251a11;
2713
+ --db-text-on-selected: #f0e7dc;
2714
+ --db-accent-tint-strong: #493a2a;
2715
+ --db-accent-deep: #f1dbc4;
2716
+ --db-gutter-bg: #514333;
2717
+ --db-input-border: #d7b08a;
2718
+ --db-editor-canvas: #15100c;
2719
+ --db-badge-bg: #44301f;
2720
+ --db-badge-text: #ffe8d1;
2721
+ --db-badge-text-hover: #fff4e8;
2722
+ }
2723
+
2724
+ .db-shell[data-theme='light'][data-accent='gray'],
2725
+ html:has(.db-shell[data-theme='light'][data-accent='gray']) {
2726
+ --db-bg-subtle: #f2f2f2;
2727
+ --db-bg-hover: #e6e6e6;
2728
+ --db-bg-selected: #676767;
2729
+ --db-bg-selected-hover: #505050;
2730
+ --db-border: #d1d1d1;
2731
+ --db-border-strong: #a8a8a8;
2732
+ --db-text: #252525;
2733
+ --db-text-secondary: #3d3d3d;
2734
+ --db-text-muted: #686868;
2735
+ --db-text-placeholder: #777777;
2736
+ --db-accent-rgb: 103 103 103;
2737
+ --db-accent: #676767;
2738
+ --db-accent-hover: #505050;
2739
+ --db-accent-tint-strong: #d8d8d8;
2740
+ --db-accent-deep: #383838;
2741
+ --db-gutter-bg: #ececec;
2742
+ --db-input-border: #b8b8b8;
2743
+ }
2744
+
2745
+ .db-shell[data-theme='dark'][data-accent='gray'],
2746
+ html:has(.db-shell[data-theme='dark'][data-accent='gray']) {
2747
+ --db-bg: #171717;
2748
+ --db-bg-subtle: #242424;
2749
+ --db-bg-hover: #363636;
2750
+ --db-bg-selected: #363636;
2751
+ --db-bg-selected-hover: #484848;
2752
+ --db-border: #494949;
2753
+ --db-border-strong: #686868;
2754
+ --db-text: #e8e8e8;
2755
+ --db-text-secondary: #d1d1d1;
2756
+ --db-text-muted: #9a9a9a;
2757
+ --db-text-placeholder: #696969;
2758
+ --db-accent-rgb: 184 184 184;
2759
+ --db-accent: #b8b8b8;
2760
+ --db-accent-hover: #cecece;
2761
+ --db-text-on-accent: #1b1b1b;
2762
+ --db-text-on-selected: #e8e8e8;
2763
+ --db-accent-tint-strong: #383838;
2764
+ --db-accent-deep: #e2e2e2;
2765
+ --db-gutter-bg: #444444;
2766
+ --db-input-border: #b8b8b8;
2767
+ --db-editor-canvas: #111111;
2768
+ --db-badge-bg: #333333;
2769
+ --db-badge-text: #eeeeee;
2770
+ --db-badge-text-hover: #ffffff;
2771
+ }
2772
+
2773
+ html:has(.db-shell[data-theme='light']:not([data-accent='brown'])) .squisq-tooltip {
2774
+ background: var(--db-accent-deep);
2775
+ color: var(--db-bg-subtle);
2776
+ }
2777
+
2778
+ html:has(.db-shell[data-theme='dark']:not([data-accent='brown'])) .squisq-tooltip {
2779
+ background: var(--db-accent-deep);
2780
+ color: var(--db-bg);
2781
+ }
2782
+
2783
+ html:has(.db-shell[data-theme='dark'])
2784
+ .squisq-template-gallery-dialog[data-theme='dark']:has([data-squisq-template-gallery-portal]) {
2785
+ --squisq-template-gallery-backdrop: var(--db-gallery-backdrop, rgba(18, 14, 9, 0.58));
2786
+ --squisq-template-gallery-panel-bg: var(--db-gallery-panel-bg, var(--db-bg));
2787
+ --squisq-template-gallery-panel-border: var(--db-border);
2788
+ --squisq-template-gallery-header-bg: var(--db-gallery-header-bg, #17130d);
2789
+ --squisq-template-gallery-header-border: var(--db-border);
2790
+ --squisq-template-gallery-title: var(--db-text);
2791
+ --squisq-template-gallery-close-color: var(--db-text-muted);
2792
+ --squisq-template-gallery-close-bg: var(--db-bg-subtle);
2793
+ --squisq-template-gallery-close-border: var(--db-border);
2794
+ --squisq-template-gallery-close-hover-color: var(--db-text);
2795
+ --squisq-template-gallery-close-hover-border: var(--db-accent);
2796
+ --squisq-template-gallery-close-hover-shadow: 0 1px 6px var(--db-accent-soft-15);
2797
+ --squisq-template-gallery-bg: var(--db-bg);
2798
+ --squisq-template-gallery-text: var(--db-text);
2799
+ --squisq-template-gallery-border: var(--db-border);
2800
+ --squisq-template-gallery-search-bg: var(--db-gallery-header-bg, #17130d);
2801
+ --squisq-template-gallery-search-border: var(--db-border);
2802
+ --squisq-template-gallery-search-icon: var(--db-text-muted);
2803
+ --squisq-template-gallery-search-input: var(--db-text);
2804
+ --squisq-template-gallery-search-placeholder: var(--db-gallery-placeholder, #8f8267);
2805
+ --squisq-template-gallery-empty: var(--db-text-muted);
2806
+ --squisq-template-gallery-option-bg: var(--db-bg-subtle);
2807
+ --squisq-template-gallery-option-border: var(--db-border);
2808
+ --squisq-template-gallery-option-hover-bg: var(--db-bg-hover);
2809
+ --squisq-template-gallery-option-hover-border: var(--db-accent);
2810
+ --squisq-template-gallery-option-hover-shadow: 0 1px 5px var(--db-accent-soft-15);
2811
+ --squisq-template-gallery-card-bg: transparent;
2812
+ --squisq-template-gallery-card-border: var(--db-border);
2813
+ --squisq-template-gallery-card-hover-bg: var(--db-bg-hover);
2814
+ --squisq-template-gallery-card-hover-border: var(--db-accent);
2815
+ --squisq-template-gallery-card-hover-shadow: 0 1px 5px var(--db-accent-soft-15);
2816
+ --squisq-template-gallery-selected-bg: var(--db-accent-tint-strong);
2817
+ --squisq-template-gallery-selected-border: var(--db-accent-hover);
2818
+ --squisq-template-gallery-selected-shadow: 0 0 0 2px var(--db-accent-soft-25);
2819
+ --squisq-template-gallery-card-icon-bg: var(--db-gallery-icon-bg, #15120d);
2820
+ --squisq-template-gallery-card-icon-border: var(--db-border);
2821
+ --squisq-template-gallery-content-preview-bg: var(--db-gallery-icon-bg, #15120d);
2822
+ --squisq-template-gallery-name: var(--db-text);
2823
+ --squisq-template-gallery-description: var(--db-text-muted);
2824
+ --squisq-template-gallery-new-bg: var(--db-gallery-new-bg, #2b2418);
2825
+ --squisq-template-gallery-new-border: var(--db-accent);
2826
+ --squisq-template-gallery-new-hover-bg: var(--db-accent-tint-strong);
2827
+ --squisq-template-gallery-new-hover-border: var(--db-accent-hover);
2828
+ --squisq-template-gallery-new-plus-color: var(--db-accent-hover);
2829
+ --squisq-template-gallery-new-plus-bg: var(--db-gallery-header-bg, #17130d);
2830
+ --squisq-template-gallery-new-plus-border: var(--db-accent);
2831
+ --squisq-template-gallery-new-label: var(--db-text);
2832
+ --squisq-template-gallery-new-desc: var(--db-text-muted);
2833
+ --squisq-template-gallery-section-border: var(--db-border);
2834
+ --squisq-template-gallery-section-title: var(--db-text);
2835
+ }
2836
+
2837
+ html:has(.db-shell[data-theme='light'])
2838
+ .squisq-template-gallery-dialog[data-theme='light']:has([data-squisq-template-gallery-portal]) {
2839
+ --squisq-template-gallery-backdrop: var(--db-gallery-backdrop, rgba(42, 36, 25, 0.24));
2840
+ --squisq-template-gallery-panel-bg: var(--db-gallery-panel-bg, #fffdf7);
2841
+ --squisq-template-gallery-panel-border: var(--db-border);
2842
+ --squisq-template-gallery-header-bg: var(--db-bg-subtle);
2843
+ --squisq-template-gallery-header-border: var(--db-border);
2844
+ --squisq-template-gallery-title: var(--db-text);
2845
+ --squisq-template-gallery-close-color: var(--db-text-muted);
2846
+ --squisq-template-gallery-close-bg: var(--db-gallery-raised-bg, #fffaf0);
2847
+ --squisq-template-gallery-close-border: var(--db-border);
2848
+ --squisq-template-gallery-close-hover-color: var(--db-text);
2849
+ --squisq-template-gallery-close-hover-border: var(--db-accent);
2850
+ --squisq-template-gallery-close-hover-shadow: 0 1px 4px var(--db-accent-soft-15);
2851
+ --squisq-template-gallery-bg: var(--db-gallery-panel-bg, #fffdf7);
2852
+ --squisq-template-gallery-text: var(--db-text);
2853
+ --squisq-template-gallery-border: var(--db-border);
2854
+ --squisq-template-gallery-search-bg: var(--db-bg-subtle);
2855
+ --squisq-template-gallery-search-border: var(--db-border);
2856
+ --squisq-template-gallery-search-icon: var(--db-text-muted);
2857
+ --squisq-template-gallery-search-input: var(--db-text);
2858
+ --squisq-template-gallery-search-placeholder: var(--db-gallery-placeholder, #8b8065);
2859
+ --squisq-template-gallery-empty: var(--db-text-muted);
2860
+ --squisq-template-gallery-option-bg: var(--db-gallery-raised-bg, #fffaf0);
2861
+ --squisq-template-gallery-option-border: var(--db-border);
2862
+ --squisq-template-gallery-option-hover-bg: var(--db-bg-hover);
2863
+ --squisq-template-gallery-option-hover-border: var(--db-accent);
2864
+ --squisq-template-gallery-option-hover-shadow: 0 1px 3px var(--db-accent-soft-15);
2865
+ --squisq-template-gallery-card-bg: transparent;
2866
+ --squisq-template-gallery-card-border: var(--db-border);
2867
+ --squisq-template-gallery-card-hover-bg: var(--db-bg-subtle);
2868
+ --squisq-template-gallery-card-hover-border: var(--db-accent);
2869
+ --squisq-template-gallery-card-hover-shadow: 0 1px 4px var(--db-accent-soft-15);
2870
+ --squisq-template-gallery-selected-bg: var(--db-bg-hover);
2871
+ --squisq-template-gallery-selected-border: var(--db-accent);
2872
+ --squisq-template-gallery-selected-shadow: 0 0 0 2px var(--db-accent-soft-15);
2873
+ --squisq-template-gallery-card-icon-bg: var(--db-gallery-icon-bg, #f6f0df);
2874
+ --squisq-template-gallery-card-icon-border: var(--db-border);
2875
+ --squisq-template-gallery-content-preview-bg: var(--db-gallery-icon-bg, #f6f0df);
2876
+ --squisq-template-gallery-name: var(--db-text);
2877
+ --squisq-template-gallery-description: var(--db-text-muted);
2878
+ --squisq-template-gallery-new-bg: var(--db-gallery-new-bg, #f1ead6);
2879
+ --squisq-template-gallery-new-border: var(--db-border-strong);
2880
+ --squisq-template-gallery-new-hover-bg: var(--db-bg-hover);
2881
+ --squisq-template-gallery-new-hover-border: var(--db-accent);
2882
+ --squisq-template-gallery-new-plus-color: var(--db-accent-hover);
2883
+ --squisq-template-gallery-new-plus-bg: var(--db-gallery-raised-bg, #fffaf0);
2884
+ --squisq-template-gallery-new-plus-border: var(--db-border-strong);
2885
+ --squisq-template-gallery-new-label: var(--db-text);
2886
+ --squisq-template-gallery-new-desc: var(--db-text-muted);
2887
+ --squisq-template-gallery-section-border: var(--db-border);
2888
+ --squisq-template-gallery-section-title: var(--db-text);
2889
+ }
2890
+
2891
+ html:has(.db-shell) #squisq-template-gallery-dialog.squisq-template-gallery-dialog {
2892
+ background: var(--squisq-template-gallery-backdrop);
2893
+ backdrop-filter: blur(var(--squisq-template-gallery-backdrop-blur, 2px));
2894
+ }
2895
+
2896
+ html:has(.db-shell)
2897
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2898
+ .squisq-template-gallery-dialog-panel {
2899
+ background: var(--squisq-template-gallery-panel-bg);
2900
+ border-color: var(--squisq-template-gallery-panel-border);
2901
+ }
2902
+
2903
+ html:has(.db-shell)
2904
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2905
+ .squisq-template-gallery-dialog-header {
2906
+ background: var(--squisq-template-gallery-header-bg);
2907
+ border-bottom-color: var(--squisq-template-gallery-header-border);
2908
+ }
2909
+
2910
+ html:has(.db-shell)
2911
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2912
+ .squisq-template-gallery-dialog-title {
2913
+ color: var(--squisq-template-gallery-title);
2914
+ }
2915
+
2916
+ html:has(.db-shell)
2917
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2918
+ .squisq-template-gallery-dialog-close {
2919
+ color: var(--squisq-template-gallery-close-color);
2920
+ background: var(--squisq-template-gallery-close-bg);
2921
+ border-color: var(--squisq-template-gallery-close-border);
2922
+ }
2923
+
2924
+ html:has(.db-shell)
2925
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2926
+ .squisq-template-gallery-dialog-close:hover {
2927
+ color: var(--squisq-template-gallery-close-hover-color);
2928
+ border-color: var(--squisq-template-gallery-close-hover-border);
2929
+ box-shadow: var(--squisq-template-gallery-close-hover-shadow);
2930
+ }
2931
+
2932
+ html:has(.db-shell)
2933
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2934
+ .squisq-template-gallery {
2935
+ background: var(--squisq-template-gallery-bg);
2936
+ color: var(--squisq-template-gallery-text);
2937
+ }
2938
+
2939
+ html:has(.db-shell)
2940
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2941
+ .squisq-template-gallery-search {
2942
+ background: var(--squisq-template-gallery-search-bg);
2943
+ border-bottom-color: var(--squisq-template-gallery-search-border);
2944
+ }
2945
+
2946
+ html:has(.db-shell)
2947
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2948
+ .squisq-template-gallery-search-icon {
2949
+ color: var(--squisq-template-gallery-search-icon);
2950
+ }
2951
+
2952
+ html:has(.db-shell)
2953
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2954
+ .squisq-template-gallery-search-input {
2955
+ color: var(--squisq-template-gallery-search-input);
2956
+ }
2957
+
2958
+ html:has(.db-shell)
2959
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2960
+ .squisq-template-gallery-search-input::placeholder {
2961
+ color: var(--squisq-template-gallery-search-placeholder);
2962
+ }
2963
+
2964
+ html:has(.db-shell)
2965
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2966
+ .squisq-template-gallery-none {
2967
+ background: var(--squisq-template-gallery-option-bg);
2968
+ border-color: var(--squisq-template-gallery-option-border);
2969
+ }
2970
+
2971
+ html:has(.db-shell)
2972
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2973
+ .squisq-template-gallery-none:hover {
2974
+ background: var(--squisq-template-gallery-option-hover-bg);
2975
+ border-color: var(--squisq-template-gallery-option-hover-border);
2976
+ box-shadow: var(--squisq-template-gallery-option-hover-shadow);
2977
+ }
2978
+
2979
+ html:has(.db-shell)
2980
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2981
+ .squisq-template-gallery-none.squisq-template-gallery-card--selected,
2982
+ html:has(.db-shell)
2983
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2984
+ .squisq-template-gallery-card--selected {
2985
+ background: var(--squisq-template-gallery-selected-bg);
2986
+ border-color: var(--squisq-template-gallery-selected-border);
2987
+ box-shadow: var(--squisq-template-gallery-selected-shadow);
2988
+ }
2989
+
2990
+ html:has(.db-shell)
2991
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2992
+ .squisq-template-gallery-none-label {
2993
+ color: var(--squisq-template-gallery-section-title);
2994
+ }
2995
+
2996
+ html:has(.db-shell)
2997
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
2998
+ .squisq-template-gallery-none-desc,
2999
+ html:has(.db-shell)
3000
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3001
+ .squisq-template-gallery-card-desc,
3002
+ html:has(.db-shell)
3003
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3004
+ .squisq-template-gallery-new-desc {
3005
+ color: var(--squisq-template-gallery-description);
3006
+ }
3007
+
3008
+ html:has(.db-shell)
3009
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3010
+ .squisq-template-gallery-card {
3011
+ background: var(--squisq-template-gallery-card-bg);
3012
+ border-color: var(--squisq-template-gallery-card-border);
3013
+ }
3014
+
3015
+ html:has(.db-shell)
3016
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3017
+ .squisq-template-gallery-card:hover {
3018
+ background: var(--squisq-template-gallery-card-hover-bg);
3019
+ border-color: var(--squisq-template-gallery-card-hover-border);
3020
+ box-shadow: var(--squisq-template-gallery-card-hover-shadow);
3021
+ }
3022
+
3023
+ html:has(.db-shell)
3024
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3025
+ .squisq-template-gallery-card-icon {
3026
+ background: var(--squisq-template-gallery-card-icon-bg);
3027
+ border-color: var(--squisq-template-gallery-card-icon-border);
3028
+ }
3029
+
3030
+ html:has(.db-shell)
3031
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3032
+ .squisq-template-gallery-content-preview {
3033
+ background: var(--squisq-template-gallery-content-preview-bg);
3034
+ }
3035
+
3036
+ html:has(.db-shell)
3037
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3038
+ .squisq-template-gallery-card-name,
3039
+ html:has(.db-shell)
3040
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3041
+ .squisq-template-gallery-new-label {
3042
+ color: var(--squisq-template-gallery-name);
3043
+ }
3044
+
3045
+ html:has(.db-shell)
3046
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3047
+ .squisq-template-gallery-new {
3048
+ background: var(--squisq-template-gallery-new-bg);
3049
+ border-color: var(--squisq-template-gallery-new-border);
3050
+ }
3051
+
3052
+ html:has(.db-shell)
3053
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3054
+ .squisq-template-gallery-new:hover {
3055
+ background: var(--squisq-template-gallery-new-hover-bg);
3056
+ border-color: var(--squisq-template-gallery-new-hover-border);
3057
+ }
3058
+
3059
+ html:has(.db-shell)
3060
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3061
+ .squisq-template-gallery-new-plus {
3062
+ color: var(--squisq-template-gallery-new-plus-color);
3063
+ background: var(--squisq-template-gallery-new-plus-bg);
3064
+ border-color: var(--squisq-template-gallery-new-plus-border);
3065
+ }
3066
+
3067
+ html:has(.db-shell)
3068
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3069
+ .squisq-template-gallery-section
3070
+ + .squisq-template-gallery-section {
3071
+ border-top-color: var(--squisq-template-gallery-section-border);
3072
+ }
3073
+
3074
+ html:has(.db-shell)
3075
+ #squisq-template-gallery-dialog.squisq-template-gallery-dialog
3076
+ .squisq-template-gallery-section-title {
3077
+ color: var(--squisq-template-gallery-section-title);
3078
+ }
3079
+
1588
3080
  html:has(.db-shell[data-theme='dark']) #squisq-template-gallery-portal {
1589
3081
  background: var(--db-bg-subtle);
1590
3082
  border-color: var(--db-border);
@@ -1679,7 +3171,7 @@ html:has(.db-shell[data-theme='dark'])
1679
3171
 
1680
3172
  .db-shell[data-theme='light']
1681
3173
  .squisq-editor-shell[data-theme='light']
1682
- .squisq-template-picker-trigger--open {
3174
+ :is(.squisq-template-picker-trigger--open, .squisq-transition-picker-trigger--open) {
1683
3175
  border-color: var(--db-accent);
1684
3176
  outline-color: var(--db-accent-soft-25);
1685
3177
  }
@@ -1694,7 +3186,7 @@ html:has(.db-shell[data-theme='dark'])
1694
3186
  .db-shell[data-theme='light']
1695
3187
  .squisq-editor-shell[data-theme='light']
1696
3188
  .squisq-template-gallery-card--selected {
1697
- background: var(--db-accent-tint);
3189
+ background: var(--db-bg-subtle);
1698
3190
  border-color: var(--db-accent);
1699
3191
  box-shadow: 0 0 0 2px var(--db-accent-soft-15);
1700
3192
  }
@@ -1702,7 +3194,7 @@ html:has(.db-shell[data-theme='dark'])
1702
3194
  .db-shell[data-theme='light']
1703
3195
  .squisq-editor-shell[data-theme='light']
1704
3196
  .squisq-template-gallery-none.squisq-template-gallery-card--selected {
1705
- background: var(--db-accent-tint);
3197
+ background: var(--db-bg-subtle);
1706
3198
  border-color: var(--db-accent-tint-strong);
1707
3199
  }
1708
3200
 
@@ -1713,27 +3205,189 @@ html:has(.db-shell[data-theme='dark'])
1713
3205
  fill: var(--db-accent);
1714
3206
  }
1715
3207
 
1716
- /* ── Template badge: inherit OS font, amber palette ──────────── */
3208
+ /* ── Squisq block tags: high-contrast DocBlocks palette ─────── */
1717
3209
 
1718
- .db-shell .squisq-template-badge {
3210
+ .db-shell .squisq-template-badge,
3211
+ .db-shell .squisq-props-badge {
1719
3212
  font-family: inherit;
3213
+ opacity: 1;
3214
+ }
3215
+
3216
+ .db-shell .squisq-props-badge {
3217
+ transform: none;
3218
+ }
3219
+
3220
+ .db-shell .squisq-template-badge-core::after {
3221
+ opacity: 0.82;
3222
+ }
3223
+
3224
+ .db-shell .squisq-template-badge::before,
3225
+ .db-shell .squisq-template-badge::after {
3226
+ min-height: 20px;
3227
+ font-size: 20px;
3228
+ font-weight: 400;
3229
+ opacity: 0.42;
1720
3230
  }
1721
3231
 
1722
3232
  .db-shell[data-theme='light'] .squisq-template-badge {
1723
- color: #92400e;
1724
- background: #fef3c7;
1725
- border-color: #fcd34d;
3233
+ color: var(--db-accent-hover);
3234
+ }
3235
+
3236
+ .db-shell[data-theme='light'] .squisq-template-badge::before,
3237
+ .db-shell[data-theme='light'] .squisq-template-badge::after {
3238
+ color: var(--db-text-muted);
3239
+ }
3240
+
3241
+ .db-shell[data-theme='light'] .squisq-template-badge-core {
3242
+ color: var(--db-accent-deep);
3243
+ background: var(--db-bg-subtle);
3244
+ border-color: var(--db-border-strong);
3245
+ }
3246
+
3247
+ .db-shell[data-theme='light'] .squisq-template-badge:hover .squisq-template-badge-core,
3248
+ .db-shell[data-theme='light'] .squisq-template-badge:focus-visible .squisq-template-badge-core {
3249
+ color: var(--db-text);
3250
+ background: var(--db-bg-hover);
3251
+ border-color: var(--db-accent);
3252
+ box-shadow: 0 0 0 2px var(--db-accent-soft-15);
3253
+ }
3254
+
3255
+ .db-shell[data-theme='light'] .squisq-template-badge.squisq-template-badge--empty {
3256
+ color: var(--db-text-muted);
3257
+ opacity: 1;
3258
+ }
3259
+
3260
+ .db-shell[data-theme='light']
3261
+ .squisq-template-badge.squisq-template-badge--empty
3262
+ .squisq-template-badge-core {
3263
+ color: var(--db-accent-hover);
3264
+ background: var(--db-accent-soft-08);
3265
+ border-color: var(--db-border-strong);
3266
+ border-style: dashed;
3267
+ }
3268
+
3269
+ .db-shell[data-theme='light']
3270
+ .squisq-template-badge.squisq-template-badge--empty:hover
3271
+ .squisq-template-badge-core,
3272
+ .db-shell[data-theme='light']
3273
+ .squisq-template-badge.squisq-template-badge--empty:focus-visible
3274
+ .squisq-template-badge-core {
3275
+ color: var(--db-text);
3276
+ background: var(--db-bg-hover);
3277
+ border-color: var(--db-accent);
3278
+ border-style: solid;
3279
+ box-shadow: 0 0 0 2px var(--db-accent-soft-15);
3280
+ }
3281
+
3282
+ .db-shell[data-theme='light'] .squisq-props-badge {
3283
+ color: var(--db-accent-hover);
3284
+ background: var(--db-accent-soft-08);
3285
+ border-color: var(--db-border-strong);
3286
+ }
3287
+
3288
+ .db-shell[data-theme='light'] .squisq-props-badge[data-props-summary] {
3289
+ color: var(--db-accent-deep);
3290
+ background: var(--db-bg-subtle);
3291
+ border-color: var(--db-accent);
3292
+ }
3293
+
3294
+ .db-shell[data-theme='light'] .squisq-props-badge:hover,
3295
+ .db-shell[data-theme='light'] .squisq-props-badge:focus-visible {
3296
+ color: var(--db-text);
3297
+ background: var(--db-bg-hover);
3298
+ border-color: var(--db-accent);
3299
+ box-shadow: 0 0 0 2px var(--db-accent-soft-15);
1726
3300
  }
1727
3301
 
1728
3302
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-template-badge {
1729
- color: #fbbf24;
1730
- background: #2a1e08;
1731
- border-color: #92400e;
3303
+ color: var(--db-accent-hover);
3304
+ }
3305
+
3306
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-template-badge::before,
3307
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-template-badge::after {
3308
+ color: var(--db-text-muted);
3309
+ opacity: 0.48;
3310
+ }
3311
+
3312
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-template-badge-core {
3313
+ color: var(--db-badge-text);
3314
+ background: var(--db-badge-bg);
3315
+ border-color: var(--db-accent);
3316
+ }
3317
+
3318
+ .db-shell[data-theme='dark']
3319
+ .squisq-editor-shell[data-theme='dark']
3320
+ .squisq-template-badge:hover
3321
+ .squisq-template-badge-core,
3322
+ .db-shell[data-theme='dark']
3323
+ .squisq-editor-shell[data-theme='dark']
3324
+ .squisq-template-badge:focus-visible
3325
+ .squisq-template-badge-core {
3326
+ color: var(--db-badge-text-hover);
3327
+ background: var(--db-bg-hover);
3328
+ border-color: var(--db-accent-hover);
3329
+ box-shadow: 0 0 0 2px var(--db-accent-soft-25);
3330
+ }
3331
+
3332
+ .db-shell[data-theme='dark']
3333
+ .squisq-editor-shell[data-theme='dark']
3334
+ .squisq-template-badge.squisq-template-badge--empty {
3335
+ color: var(--db-text-secondary);
3336
+ opacity: 1;
3337
+ }
3338
+
3339
+ .db-shell[data-theme='dark']
3340
+ .squisq-editor-shell[data-theme='dark']
3341
+ .squisq-template-badge.squisq-template-badge--empty
3342
+ .squisq-template-badge-core {
3343
+ color: var(--db-text-secondary);
3344
+ background: var(--db-accent-soft-10);
3345
+ border-color: var(--db-border-strong);
3346
+ border-style: dashed;
3347
+ }
3348
+
3349
+ .db-shell[data-theme='dark']
3350
+ .squisq-editor-shell[data-theme='dark']
3351
+ .squisq-template-badge.squisq-template-badge--empty:hover
3352
+ .squisq-template-badge-core,
3353
+ .db-shell[data-theme='dark']
3354
+ .squisq-editor-shell[data-theme='dark']
3355
+ .squisq-template-badge.squisq-template-badge--empty:focus-visible
3356
+ .squisq-template-badge-core {
3357
+ color: var(--db-badge-text-hover);
3358
+ background: var(--db-bg-hover);
3359
+ border-color: var(--db-accent-hover);
3360
+ border-style: solid;
3361
+ box-shadow: 0 0 0 2px var(--db-accent-soft-25);
3362
+ }
3363
+
3364
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-props-badge {
3365
+ color: var(--db-text-secondary);
3366
+ background: var(--db-accent-soft-10);
3367
+ border-color: var(--db-border-strong);
3368
+ }
3369
+
3370
+ .db-shell[data-theme='dark']
3371
+ .squisq-editor-shell[data-theme='dark']
3372
+ .squisq-props-badge[data-props-summary] {
3373
+ color: var(--db-badge-text);
3374
+ background: var(--db-bg-hover);
3375
+ border-color: var(--db-accent);
3376
+ }
3377
+
3378
+ .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-props-badge:hover,
3379
+ .db-shell[data-theme='dark']
3380
+ .squisq-editor-shell[data-theme='dark']
3381
+ .squisq-props-badge:focus-visible {
3382
+ color: var(--db-badge-text-hover);
3383
+ background: var(--db-bg-selected-hover);
3384
+ border-color: var(--db-accent-hover);
3385
+ box-shadow: 0 0 0 2px var(--db-accent-soft-25);
1732
3386
  }
1733
3387
 
1734
3388
  /* Light mode squisq surfaces (toolbar, header, status bar) */
1735
3389
  .db-shell[data-theme='light'] .squisq-editor-shell[data-theme='light'] .squisq-editor-header {
1736
- background: var(--db-accent-tint);
3390
+ background: var(--db-bg-subtle);
1737
3391
  border-bottom-color: var(--db-border-strong);
1738
3392
  }
1739
3393
 
@@ -1741,7 +3395,7 @@ html:has(.db-shell[data-theme='dark'])
1741
3395
  mode-switcher tabs on its left, so the cluster of buttons fades
1742
3396
  into the canvas while the mode switcher reads as the anchor. */
1743
3397
  .db-shell[data-theme='light'] .squisq-editor-shell[data-theme='light'] .squisq-toolbar {
1744
- background: var(--db-accent-tint);
3398
+ background: var(--db-bg-subtle);
1745
3399
  }
1746
3400
 
1747
3401
  .db-shell[data-theme='light'] .squisq-editor-shell[data-theme='light'] .squisq-toolbar-view-tabs {
@@ -1756,7 +3410,7 @@ html:has(.db-shell[data-theme='dark'])
1756
3410
 
1757
3411
  /* Status bar "✓ OK" indicator — squisq paints this in saturated emerald
1758
3412
  (#059669 light, #34d399 dark). Re-tone to the sage accent so the
1759
- parse-status indicator harmonizes with the rest of the chrome. */
3413
+ status indicator harmonizes with the rest of the chrome. */
1760
3414
  .db-shell .squisq-status-ok {
1761
3415
  color: var(--db-accent);
1762
3416
  }
@@ -1765,6 +3419,10 @@ html:has(.db-shell[data-theme='dark'])
1765
3419
  color: var(--db-accent-hover);
1766
3420
  }
1767
3421
 
3422
+ .db-autosave-pending {
3423
+ opacity: 0.62;
3424
+ }
3425
+
1768
3426
  /* Outline pane (left of the editor) — squisq paints a warm beige
1769
3427
  (#dcd8d0 light / dark slate in dark mode). Re-tone to `--db-gutter-bg`
1770
3428
  so it matches the inline-preview gutter on the right and reads as
@@ -1799,18 +3457,107 @@ html:has(.db-shell[data-theme='dark'])
1799
3457
  border-left: 1px solid var(--db-border-strong);
1800
3458
  }
1801
3459
 
1802
- /* Monaco's line-number gutter ("editorGutter.background") is set via
1803
- squisq's JS-side theme registration those colors can't be CSS
1804
- variables. To make the gutter blend with the outline/preview chrome
1805
- on either side, we override the painted bg on `.margin` and its
1806
- `.margin-view-overlays` child with our --db-gutter-bg. `!important`
1807
- is required because Monaco inlines the color via the style attribute.
1808
- The right-edge seam pseudo-element (`.margin::after`) also retones
1809
- to --db-border so it's a single hairline matching the toolbar's
1810
- bottom border, not a contrast stripe of its own. */
1811
- .db-shell .squisq-raw-editor-container .monaco-editor .margin,
1812
- .db-shell .squisq-raw-editor-container .monaco-editor .margin-view-overlays {
1813
- background-color: var(--db-gutter-bg) !important;
3460
+ /* Toolbar overflow menu. Squisq intentionally ships a neutral slate
3461
+ palette; inside DocBlocks this popover should use the same surfaces,
3462
+ borders, text, and interaction colors as our other shell menus. The
3463
+ contextual template/transition controls need explicit treatment too,
3464
+ since they bring their own Squisq surfaces into the popover. */
3465
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu {
3466
+ background: var(--db-bg);
3467
+ border-color: var(--db-border);
3468
+ box-shadow: 0 4px 12px var(--db-shadow);
3469
+ }
3470
+
3471
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu--up {
3472
+ box-shadow: 0 -4px 12px var(--db-shadow);
3473
+ }
3474
+
3475
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item {
3476
+ color: var(--db-text-secondary);
3477
+ }
3478
+
3479
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item:hover {
3480
+ background: var(--db-bg-hover);
3481
+ }
3482
+
3483
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-heading {
3484
+ color: var(--db-text-muted);
3485
+ }
3486
+
3487
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu > .squisq-toolbar-separator {
3488
+ background: var(--db-border);
3489
+ }
3490
+
3491
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item--danger {
3492
+ color: var(--db-danger);
3493
+ }
3494
+
3495
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item--danger:hover {
3496
+ background: var(--db-danger-bg);
3497
+ color: var(--db-danger);
3498
+ }
3499
+
3500
+ .db-shell
3501
+ .squisq-editor-shell
3502
+ .squisq-toolbar-overflow-menu
3503
+ :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger) {
3504
+ background: var(--db-bg-subtle);
3505
+ border-color: var(--db-border);
3506
+ color: var(--db-text-secondary);
3507
+ }
3508
+
3509
+ .db-shell
3510
+ .squisq-editor-shell
3511
+ .squisq-toolbar-overflow-menu
3512
+ :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger):hover {
3513
+ background: var(--db-bg-hover);
3514
+ border-color: var(--db-border-strong);
3515
+ }
3516
+
3517
+ .db-shell
3518
+ .squisq-editor-shell
3519
+ .squisq-toolbar-overflow-menu
3520
+ :is(.squisq-template-picker-trigger--open, .squisq-transition-picker-trigger--open) {
3521
+ background: var(--db-bg-hover);
3522
+ border-color: var(--db-accent);
3523
+ outline-color: var(--db-accent-soft-25);
3524
+ }
3525
+
3526
+ .db-shell
3527
+ .squisq-editor-shell
3528
+ .squisq-toolbar-overflow-menu
3529
+ :is(.squisq-template-picker-trigger-label, .squisq-transition-picker-trigger-label),
3530
+ .db-shell
3531
+ .squisq-editor-shell
3532
+ .squisq-toolbar-overflow-menu
3533
+ :is(.squisq-template-picker-trigger-caret, .squisq-transition-picker-trigger svg) {
3534
+ color: var(--db-text-muted);
3535
+ }
3536
+
3537
+ .db-shell
3538
+ .squisq-editor-shell
3539
+ .squisq-toolbar-overflow-menu
3540
+ :is(.squisq-template-picker-trigger-value, .squisq-transition-picker-trigger-value) {
3541
+ color: var(--db-text-secondary);
3542
+ }
3543
+
3544
+ .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu .squisq-template-picker-trigger-thumb {
3545
+ background: var(--db-bg);
3546
+ border-color: var(--db-border);
3547
+ }
3548
+
3549
+ /* Monaco's line-number gutter ("editorGutter.background") is set via
3550
+ squisq's JS-side theme registration — those colors can't be CSS
3551
+ variables. To make the gutter blend with the outline/preview chrome
3552
+ on either side, we override the painted bg on `.margin` and its
3553
+ `.margin-view-overlays` child with our --db-gutter-bg. `!important`
3554
+ is required because Monaco inlines the color via the style attribute.
3555
+ The right-edge seam pseudo-element (`.margin::after`) also retones
3556
+ to --db-border so it's a single hairline matching the toolbar's
3557
+ bottom border, not a contrast stripe of its own. */
3558
+ .db-shell .squisq-raw-editor-container .monaco-editor .margin,
3559
+ .db-shell .squisq-raw-editor-container .monaco-editor .margin-view-overlays {
3560
+ background-color: var(--db-gutter-bg) !important;
1814
3561
  }
1815
3562
 
1816
3563
  .db-shell .squisq-raw-editor-container .monaco-editor .margin::after {
@@ -1829,7 +3576,7 @@ html:has(.db-shell[data-theme='dark'])
1829
3576
  .db-shell[data-theme='light']
1830
3577
  .squisq-editor-shell[data-theme='light']
1831
3578
  .squisq-toolbar-button--active {
1832
- background: var(--db-accent-tint);
3579
+ background: var(--db-bg-subtle);
1833
3580
  color: var(--db-accent-hover);
1834
3581
  }
1835
3582
 
@@ -1843,7 +3590,7 @@ html:has(.db-shell[data-theme='dark'])
1843
3590
  .db-shell[data-theme='light']
1844
3591
  .squisq-editor-shell[data-theme='light']
1845
3592
  .squisq-toolbar-overflow-item--active {
1846
- background: var(--db-accent-tint);
3593
+ background: var(--db-bg-subtle);
1847
3594
  color: var(--db-accent-hover);
1848
3595
  }
1849
3596
 
@@ -1934,7 +3681,7 @@ html:has(.db-shell[data-theme='dark'])
1934
3681
  font-size: 13px;
1935
3682
  font-weight: 600;
1936
3683
  background: var(--db-accent);
1937
- color: var(--db-bg);
3684
+ color: var(--db-text-on-accent);
1938
3685
  border: none;
1939
3686
  border-radius: 6px;
1940
3687
  cursor: pointer;
@@ -1968,11 +3715,9 @@ html:has(.db-shell[data-theme='dark'])
1968
3715
 
1969
3716
  @keyframes db-welcome-gateway-in {
1970
3717
  from {
1971
- opacity: 0;
1972
3718
  transform: translate(-50%, 8px);
1973
3719
  }
1974
3720
  to {
1975
- opacity: 1;
1976
3721
  transform: translate(-50%, 0);
1977
3722
  }
1978
3723
  }
@@ -1986,16 +3731,185 @@ html:has(.db-shell[data-theme='dark'])
1986
3731
  padding: 8px 16px;
1987
3732
  font-size: 13px;
1988
3733
  line-height: 1.4;
1989
- color: #fff;
1990
- background: rgba(31, 41, 55, 0.92);
3734
+ color: var(--db-bg);
3735
+ background: var(--db-accent-deep);
1991
3736
  border-radius: 6px;
1992
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
3737
+ box-shadow: 0 4px 12px var(--db-shadow);
1993
3738
  pointer-events: none;
1994
- animation: db-save-toast-fade 1.8s ease-out forwards;
3739
+ animation: db-save-toast-fade 3s ease-out forwards;
3740
+ }
3741
+
3742
+ .db-save-toast--error {
3743
+ color: #fff;
3744
+ background: var(--db-danger, #a33a35);
3745
+ }
3746
+
3747
+ .db-document-conflict {
3748
+ position: fixed;
3749
+ top: 16px;
3750
+ left: 50%;
3751
+ z-index: 210;
3752
+ display: flex;
3753
+ gap: 16px;
3754
+ align-items: center;
3755
+ max-width: min(720px, calc(100vw - 32px));
3756
+ padding: 10px 12px;
3757
+ color: var(--db-text);
3758
+ background: var(--db-bg-elevated, var(--db-bg));
3759
+ border: 1px solid var(--db-warning, #b7791f);
3760
+ border-radius: 8px;
3761
+ box-shadow: 0 6px 20px var(--db-shadow);
3762
+ transform: translateX(-50%);
3763
+ }
3764
+
3765
+ .db-document-conflict-actions {
3766
+ display: flex;
3767
+ flex: none;
3768
+ gap: 8px;
3769
+ }
3770
+
3771
+ .db-document-conflict-actions button {
3772
+ padding: 5px 9px;
3773
+ color: var(--db-text);
3774
+ cursor: pointer;
3775
+ background: var(--db-bg);
3776
+ border: 1px solid var(--db-border);
3777
+ border-radius: 5px;
3778
+ }
3779
+
3780
+ .db-document-conflict-actions button:focus-visible {
3781
+ outline: 2px solid var(--db-focus, var(--db-accent));
3782
+ outline-offset: 2px;
3783
+ }
3784
+
3785
+ /* Browser PWA update notice. It is docked over the right side of Squisq's
3786
+ status bar, while extra status-bar padding keeps its contents visible.
3787
+ If the status bar is hidden, it becomes a compact floating badge so the
3788
+ waiting update remains reachable. */
3789
+ .db-shell-editor-area--has-update .squisq-status-bar {
3790
+ padding-right: 132px;
3791
+ }
3792
+
3793
+ .db-update-status-notice {
3794
+ position: absolute;
3795
+ right: 8px;
3796
+ bottom: 1px;
3797
+ z-index: 5;
3798
+ height: 21px;
3799
+ padding: 0 4px;
3800
+ color: var(--db-accent-deep);
3801
+ font: inherit;
3802
+ font-size: 11px;
3803
+ line-height: 1;
3804
+ text-decoration: underline;
3805
+ cursor: pointer;
3806
+ background: transparent;
3807
+ border: 0;
3808
+ }
3809
+
3810
+ .db-update-status-notice:hover {
3811
+ color: var(--db-text);
3812
+ }
3813
+
3814
+ .db-update-status-notice:focus-visible {
3815
+ outline: 2px solid var(--db-focus, var(--db-accent));
3816
+ outline-offset: -2px;
3817
+ }
3818
+
3819
+ .db-update-status-notice:disabled {
3820
+ cursor: default;
3821
+ opacity: 0.55;
3822
+ }
3823
+
3824
+ .db-update-status-notice--floating {
3825
+ right: 8px;
3826
+ bottom: 8px;
3827
+ height: auto;
3828
+ padding: 6px 8px;
3829
+ background: var(--db-bg-elevated, var(--db-bg));
3830
+ border: 1px solid var(--db-accent);
3831
+ border-radius: 5px;
3832
+ box-shadow: 0 2px 8px var(--db-shadow);
3833
+ }
3834
+
3835
+ /* The expanded Reload/Later prompt uses the same top-center card pattern as
3836
+ the document-conflict card, accent-toned instead of warning. */
3837
+ .db-update-banner {
3838
+ position: fixed;
3839
+ top: 16px;
3840
+ left: 50%;
3841
+ z-index: 210;
3842
+ display: flex;
3843
+ gap: 16px;
3844
+ align-items: center;
3845
+ max-width: min(720px, calc(100vw - 32px));
3846
+ padding: 10px 12px;
3847
+ color: var(--db-text);
3848
+ background: var(--db-bg-elevated, var(--db-bg));
3849
+ border: 1px solid var(--db-accent);
3850
+ border-radius: 8px;
3851
+ box-shadow: 0 6px 20px var(--db-shadow);
3852
+ transform: translateX(-50%);
3853
+ }
3854
+
3855
+ .db-update-banner-actions {
3856
+ display: flex;
3857
+ flex: none;
3858
+ gap: 8px;
3859
+ }
3860
+
3861
+ .db-update-banner-actions button {
3862
+ padding: 5px 9px;
3863
+ color: var(--db-text);
3864
+ cursor: pointer;
3865
+ background: var(--db-bg);
3866
+ border: 1px solid var(--db-border);
3867
+ border-radius: 5px;
3868
+ }
3869
+
3870
+ .db-update-banner-actions button:focus-visible {
3871
+ outline: 2px solid var(--db-focus, var(--db-accent));
3872
+ outline-offset: 2px;
3873
+ }
3874
+
3875
+ /* Storage-full alert — the origin quota is exhausted and autosave is
3876
+ failing. Danger-toned variant of the same top-center banner pattern. */
3877
+ .db-storage-full-banner {
3878
+ position: fixed;
3879
+ top: 16px;
3880
+ left: 50%;
3881
+ z-index: 210;
3882
+ display: flex;
3883
+ gap: 16px;
3884
+ align-items: center;
3885
+ max-width: min(720px, calc(100vw - 32px));
3886
+ padding: 10px 12px;
3887
+ color: var(--db-text);
3888
+ background: var(--db-bg-elevated, var(--db-bg));
3889
+ border: 1px solid var(--db-danger, #a33a35);
3890
+ border-radius: 8px;
3891
+ box-shadow: 0 6px 20px var(--db-shadow);
3892
+ transform: translateX(-50%);
3893
+ }
3894
+
3895
+ .db-storage-full-banner-actions {
3896
+ display: flex;
3897
+ flex: none;
3898
+ gap: 8px;
3899
+ }
3900
+
3901
+ .db-storage-full-banner-actions button {
3902
+ padding: 5px 9px;
3903
+ color: var(--db-text);
3904
+ cursor: pointer;
3905
+ background: var(--db-bg);
3906
+ border: 1px solid var(--db-border);
3907
+ border-radius: 5px;
1995
3908
  }
1996
3909
 
1997
- .db-shell[data-theme='light'] .db-save-toast {
1998
- background: rgba(17, 24, 39, 0.88);
3910
+ .db-storage-full-banner-actions button:focus-visible {
3911
+ outline: 2px solid var(--db-focus, var(--db-accent));
3912
+ outline-offset: 2px;
1999
3913
  }
2000
3914
 
2001
3915
  @keyframes db-save-toast-fade {
@@ -2016,3 +3930,695 @@ html:has(.db-shell[data-theme='dark'])
2016
3930
  transform: translate(-50%, -4px);
2017
3931
  }
2018
3932
  }
3933
+
3934
+ /* ── Git ─────────────────────────────────────────────────────── */
3935
+
3936
+ /* Dialog size modifiers (shared Dialog component) */
3937
+ .db-dialog--wide {
3938
+ width: 560px;
3939
+ max-width: 100%;
3940
+ }
3941
+
3942
+ .db-dialog--full {
3943
+ width: min(1100px, 94vw);
3944
+ height: 82vh;
3945
+ display: flex;
3946
+ flex-direction: column;
3947
+ }
3948
+
3949
+ .db-dialog--full .db-dialog-body {
3950
+ flex: 1;
3951
+ min-height: 0;
3952
+ overflow: auto;
3953
+ display: flex;
3954
+ flex-direction: column;
3955
+ }
3956
+
3957
+ .db-dialog-footer {
3958
+ display: flex;
3959
+ justify-content: flex-end;
3960
+ gap: 8px;
3961
+ padding: 12px 20px 16px;
3962
+ border-top: 1px solid var(--db-border);
3963
+ }
3964
+
3965
+ /* Buttons used in git dialog footers */
3966
+ .db-git-primary-btn {
3967
+ padding: 6px 16px;
3968
+ border: none;
3969
+ border-radius: 5px;
3970
+ background: var(--db-accent);
3971
+ color: var(--db-text-on-accent);
3972
+ font-size: 13px;
3973
+ font-weight: 600;
3974
+ cursor: pointer;
3975
+ }
3976
+
3977
+ .db-git-primary-btn:hover:not(:disabled) {
3978
+ background: var(--db-accent-hover);
3979
+ }
3980
+
3981
+ .db-git-primary-btn:disabled {
3982
+ opacity: 0.5;
3983
+ cursor: default;
3984
+ }
3985
+
3986
+ /* Destructive confirmation (delete, remove workspace). The foreground comes
3987
+ from a token rather than a literal because the two themes need opposite ink:
3988
+ light's danger is deep red and carries white at ~6.5:1, while dark's is a
3989
+ light red where white would fall to ~2.8:1 and fail WCAG AA. */
3990
+ .db-git-primary-btn--danger {
3991
+ background: var(--db-danger);
3992
+ color: var(--db-text-on-danger);
3993
+ }
3994
+
3995
+ .db-git-primary-btn--danger:hover:not(:disabled) {
3996
+ background: color-mix(in srgb, var(--db-danger) 85%, black);
3997
+ }
3998
+
3999
+ .db-git-secondary-btn {
4000
+ padding: 6px 14px;
4001
+ border: 1px solid var(--db-border-strong);
4002
+ border-radius: 5px;
4003
+ background: transparent;
4004
+ color: var(--db-text);
4005
+ font-size: 13px;
4006
+ cursor: pointer;
4007
+ }
4008
+
4009
+ .db-git-secondary-btn:hover:not(:disabled) {
4010
+ background: var(--db-bg-hover);
4011
+ }
4012
+
4013
+ .db-git-secondary-btn:disabled {
4014
+ opacity: 0.5;
4015
+ cursor: default;
4016
+ }
4017
+
4018
+ /* Status bar row in the sidebar */
4019
+ .db-git-statusbar {
4020
+ position: relative;
4021
+ flex-shrink: 0;
4022
+ padding: 2px 8px 4px;
4023
+ border-bottom: 1px solid var(--db-border);
4024
+ }
4025
+
4026
+ .db-git-statusbar-chip {
4027
+ display: flex;
4028
+ align-items: center;
4029
+ gap: 6px;
4030
+ width: 100%;
4031
+ padding: 4px 8px;
4032
+ border: none;
4033
+ border-radius: 4px;
4034
+ background: transparent;
4035
+ color: var(--db-text-secondary);
4036
+ font-size: 12px;
4037
+ cursor: pointer;
4038
+ overflow: hidden;
4039
+ }
4040
+
4041
+ .db-git-statusbar-chip:hover {
4042
+ background: var(--db-bg-hover);
4043
+ }
4044
+
4045
+ .db-git-branch-glyph {
4046
+ color: var(--db-text-muted);
4047
+ flex-shrink: 0;
4048
+ }
4049
+
4050
+ .db-git-statusbar-branch {
4051
+ font-weight: 600;
4052
+ white-space: nowrap;
4053
+ overflow: hidden;
4054
+ text-overflow: ellipsis;
4055
+ }
4056
+
4057
+ .db-git-statusbar-counts {
4058
+ color: var(--db-text-muted);
4059
+ flex-shrink: 0;
4060
+ }
4061
+
4062
+ .db-git-statusbar-dirty {
4063
+ color: var(--db-git-modified);
4064
+ flex-shrink: 0;
4065
+ }
4066
+
4067
+ .db-git-statusbar-merge {
4068
+ color: var(--db-git-conflicted);
4069
+ font-weight: 600;
4070
+ flex-shrink: 0;
4071
+ }
4072
+
4073
+ .db-git-statusbar-busy {
4074
+ color: var(--db-text-muted);
4075
+ flex-shrink: 0;
4076
+ }
4077
+
4078
+ /* Actions dropdown (mirrors db-ws-settings-dropdown) */
4079
+ .db-git-menu {
4080
+ position: absolute;
4081
+ top: 100%;
4082
+ left: 8px;
4083
+ right: 8px;
4084
+ z-index: 100;
4085
+ background: var(--db-bg);
4086
+ border: 1px solid var(--db-border);
4087
+ border-radius: 6px;
4088
+ box-shadow: 0 4px 12px var(--db-shadow);
4089
+ padding: 4px 0;
4090
+ margin-top: 2px;
4091
+ }
4092
+
4093
+ .db-git-menu-item {
4094
+ display: block;
4095
+ width: 100%;
4096
+ padding: 7px 14px;
4097
+ border: none;
4098
+ background: transparent;
4099
+ text-align: left;
4100
+ font-size: 13px;
4101
+ color: var(--db-text);
4102
+ cursor: pointer;
4103
+ }
4104
+
4105
+ .db-git-menu-item:hover:not(:disabled),
4106
+ .db-git-menu-item:focus-visible {
4107
+ background: var(--db-bg-hover);
4108
+ }
4109
+
4110
+ /* Items are arrow-reachable rather than tab stops, so the ring is the only
4111
+ cue to which one Enter will fire. */
4112
+ .db-git-menu-item:focus-visible {
4113
+ outline: 2px solid var(--db-focus);
4114
+ outline-offset: -2px;
4115
+ }
4116
+
4117
+ .db-git-menu-item:disabled {
4118
+ color: var(--db-text-placeholder);
4119
+ cursor: default;
4120
+ }
4121
+
4122
+ .db-git-menu-divider {
4123
+ height: 1px;
4124
+ background: var(--db-border);
4125
+ margin: 4px 0;
4126
+ }
4127
+
4128
+ /* aria-live op-result line — visually subtle, announced politely */
4129
+ .db-git-inline-status {
4130
+ display: block;
4131
+ padding: 0 16px;
4132
+ font-size: 11px;
4133
+ color: var(--db-text-muted);
4134
+ min-height: 0;
4135
+ }
4136
+
4137
+ .db-git-inline-status:empty {
4138
+ display: none;
4139
+ }
4140
+
4141
+ /* File-tree badges */
4142
+ .db-git-badge {
4143
+ margin-left: auto;
4144
+ padding: 0 4px;
4145
+ font-size: 10px;
4146
+ font-weight: 700;
4147
+ flex-shrink: 0;
4148
+ }
4149
+
4150
+ .db-tree-row .db-git-badge {
4151
+ margin-left: 4px;
4152
+ }
4153
+
4154
+ .db-git-badge--modified {
4155
+ color: var(--db-git-modified);
4156
+ }
4157
+
4158
+ .db-git-badge--added {
4159
+ color: var(--db-git-added);
4160
+ }
4161
+
4162
+ .db-git-badge--untracked {
4163
+ color: var(--db-git-untracked);
4164
+ }
4165
+
4166
+ .db-git-badge--renamed {
4167
+ color: var(--db-git-renamed);
4168
+ }
4169
+
4170
+ .db-git-badge--deleted {
4171
+ color: var(--db-git-deleted);
4172
+ }
4173
+
4174
+ .db-git-badge--conflicted {
4175
+ color: var(--db-git-conflicted);
4176
+ }
4177
+
4178
+ .db-git-badge--dir {
4179
+ color: var(--db-git-modified);
4180
+ }
4181
+
4182
+ .db-tree-context-divider {
4183
+ height: 1px;
4184
+ background: var(--db-border);
4185
+ margin: 4px 0;
4186
+ }
4187
+
4188
+ /* Toolbar control */
4189
+ .db-git-toolbar-trigger {
4190
+ position: relative;
4191
+ }
4192
+
4193
+ .db-git-toolbar-dot {
4194
+ position: absolute;
4195
+ top: 3px;
4196
+ right: 3px;
4197
+ width: 7px;
4198
+ height: 7px;
4199
+ border-radius: 50%;
4200
+ background: var(--db-git-modified);
4201
+ }
4202
+
4203
+ /* Dialog internals — file lists (commit + conflicts) */
4204
+ .db-git-file-list {
4205
+ margin: 8px 0;
4206
+ padding: 0;
4207
+ list-style: none;
4208
+ max-height: 260px;
4209
+ overflow-y: auto;
4210
+ border: 1px solid var(--db-border);
4211
+ border-radius: 5px;
4212
+ }
4213
+
4214
+ .db-git-file-row {
4215
+ display: flex;
4216
+ align-items: center;
4217
+ gap: 8px;
4218
+ width: 100%;
4219
+ padding: 6px 10px;
4220
+ border: none;
4221
+ background: transparent;
4222
+ font-size: 12.5px;
4223
+ color: var(--db-text);
4224
+ text-align: left;
4225
+ }
4226
+
4227
+ .db-git-file-row + .db-git-file-row {
4228
+ border-top: 1px solid var(--db-border);
4229
+ }
4230
+
4231
+ button.db-git-file-row {
4232
+ cursor: pointer;
4233
+ }
4234
+
4235
+ button.db-git-file-row:hover {
4236
+ background: var(--db-bg-hover);
4237
+ }
4238
+
4239
+ .db-git-file-kind {
4240
+ margin-left: auto;
4241
+ font-size: 10.5px;
4242
+ color: var(--db-text-muted);
4243
+ flex-shrink: 0;
4244
+ }
4245
+
4246
+ .db-git-commit-message {
4247
+ width: 100%;
4248
+ min-height: 72px;
4249
+ padding: 8px 10px;
4250
+ border: 1px solid var(--db-input-border);
4251
+ border-radius: 5px;
4252
+ background: var(--db-bg);
4253
+ color: var(--db-text);
4254
+ font-size: 13px;
4255
+ font-family: inherit;
4256
+ resize: vertical;
4257
+ box-sizing: border-box;
4258
+ }
4259
+
4260
+ /* Generic form rows in git dialogs */
4261
+ .db-git-form-row {
4262
+ display: flex;
4263
+ align-items: center;
4264
+ gap: 8px;
4265
+ margin: 10px 0;
4266
+ }
4267
+
4268
+ .db-git-form-label {
4269
+ font-size: 12.5px;
4270
+ color: var(--db-text-secondary);
4271
+ flex-shrink: 0;
4272
+ }
4273
+
4274
+ .db-git-form-input {
4275
+ flex: 1;
4276
+ padding: 6px 10px;
4277
+ border: 1px solid var(--db-input-border);
4278
+ border-radius: 5px;
4279
+ background: var(--db-bg);
4280
+ color: var(--db-text);
4281
+ font-size: 13px;
4282
+ box-sizing: border-box;
4283
+ }
4284
+
4285
+ .db-git-form-error,
4286
+ .db-export-error {
4287
+ margin: 8px 0 0;
4288
+ color: var(--db-danger);
4289
+ font-size: 12.5px;
4290
+ }
4291
+
4292
+ .db-git-hint {
4293
+ color: var(--db-text-muted);
4294
+ font-size: 12px;
4295
+ }
4296
+
4297
+ /* Branches dialog */
4298
+ .db-git-branch-list {
4299
+ margin: 8px 0;
4300
+ padding: 0;
4301
+ list-style: none;
4302
+ max-height: 280px;
4303
+ overflow-y: auto;
4304
+ }
4305
+
4306
+ .db-git-branch-row {
4307
+ display: flex;
4308
+ align-items: center;
4309
+ gap: 8px;
4310
+ width: 100%;
4311
+ padding: 7px 10px;
4312
+ border: none;
4313
+ border-radius: 4px;
4314
+ background: transparent;
4315
+ font-size: 13px;
4316
+ color: var(--db-text);
4317
+ text-align: left;
4318
+ cursor: pointer;
4319
+ }
4320
+
4321
+ .db-git-branch-row:hover {
4322
+ background: var(--db-bg-hover);
4323
+ }
4324
+
4325
+ .db-git-branch-row--current {
4326
+ font-weight: 600;
4327
+ color: var(--db-accent);
4328
+ cursor: default;
4329
+ }
4330
+
4331
+ .db-git-branch-row--current:hover {
4332
+ background: transparent;
4333
+ }
4334
+
4335
+ /* History dialog */
4336
+ .db-git-history-list {
4337
+ margin: 8px 0;
4338
+ padding: 0;
4339
+ list-style: none;
4340
+ }
4341
+
4342
+ .db-git-history-item {
4343
+ padding: 8px 10px;
4344
+ border-bottom: 1px solid var(--db-border);
4345
+ cursor: pointer;
4346
+ }
4347
+
4348
+ .db-git-history-item:hover {
4349
+ background: var(--db-bg-hover);
4350
+ }
4351
+
4352
+ .db-git-history-meta {
4353
+ margin-top: 2px;
4354
+ font-size: 11.5px;
4355
+ color: var(--db-text-muted);
4356
+ }
4357
+
4358
+ .db-git-history-files {
4359
+ margin: 6px 0 0;
4360
+ padding: 0;
4361
+ list-style: none;
4362
+ }
4363
+
4364
+ .db-git-history-file {
4365
+ display: flex;
4366
+ align-items: center;
4367
+ gap: 8px;
4368
+ width: 100%;
4369
+ padding: 4px 8px;
4370
+ border: none;
4371
+ background: transparent;
4372
+ font-size: 12px;
4373
+ color: var(--db-text-secondary);
4374
+ text-align: left;
4375
+ cursor: pointer;
4376
+ border-radius: 4px;
4377
+ }
4378
+
4379
+ .db-git-history-file:hover {
4380
+ background: var(--db-bg-hover);
4381
+ }
4382
+
4383
+ /* Diff dialog */
4384
+ .db-git-diff-host {
4385
+ flex: 1;
4386
+ min-height: 320px;
4387
+ border: 1px solid var(--db-border);
4388
+ border-radius: 5px;
4389
+ overflow: hidden;
4390
+ }
4391
+
4392
+ .db-git-diff-loading {
4393
+ padding: 24px;
4394
+ text-align: center;
4395
+ color: var(--db-text-muted);
4396
+ }
4397
+
4398
+ .db-git-diff-labels {
4399
+ display: flex;
4400
+ gap: 12px;
4401
+ margin-bottom: 6px;
4402
+ font-size: 12px;
4403
+ color: var(--db-text-muted);
4404
+ }
4405
+
4406
+ .db-git-diff-labels > span {
4407
+ flex: 1;
4408
+ }
4409
+
4410
+ /* Clone progress */
4411
+ .db-git-progress {
4412
+ margin: 12px 0 4px;
4413
+ }
4414
+
4415
+ .db-git-progress-bar {
4416
+ height: 6px;
4417
+ border-radius: 3px;
4418
+ background: var(--db-accent-soft-15);
4419
+ overflow: hidden;
4420
+ position: relative;
4421
+ }
4422
+
4423
+ .db-git-progress-bar > span {
4424
+ display: block;
4425
+ height: 100%;
4426
+ background: var(--db-accent);
4427
+ transition: width 0.2s;
4428
+ }
4429
+
4430
+ .db-git-progress-text {
4431
+ margin-top: 6px;
4432
+ font-size: 12px;
4433
+ color: var(--db-text-muted);
4434
+ }
4435
+
4436
+ @media (prefers-reduced-motion: reduce) {
4437
+ .db-workspace-picker-caret,
4438
+ .db-app-menu-caret,
4439
+ .db-ws-settings-btn,
4440
+ .db-shell-sidebar-resizer,
4441
+ .db-export-chip,
4442
+ .db-git-progress-bar > span {
4443
+ transition: none;
4444
+ }
4445
+
4446
+ .db-welcome-gateway,
4447
+ .db-save-toast {
4448
+ animation: none;
4449
+ }
4450
+ }
4451
+
4452
+ /* History dialog internals added by the expanded-row layout */
4453
+ .db-git-history-toggle {
4454
+ display: block;
4455
+ width: 100%;
4456
+ padding: 0;
4457
+ border: none;
4458
+ background: transparent;
4459
+ color: inherit;
4460
+ font: inherit;
4461
+ text-align: left;
4462
+ cursor: pointer;
4463
+ }
4464
+
4465
+ .db-git-history-subject {
4466
+ display: block;
4467
+ font-size: 13px;
4468
+ color: var(--db-text);
4469
+ }
4470
+
4471
+ .db-git-history-body {
4472
+ margin: 6px 0 0;
4473
+ padding: 8px 10px;
4474
+ border-radius: 4px;
4475
+ background: var(--db-bg-subtle);
4476
+ color: var(--db-text-secondary);
4477
+ font-size: 12px;
4478
+ white-space: pre-wrap;
4479
+ font-family: inherit;
4480
+ }
4481
+
4482
+ /* ---------------------------------------------------------------------------
4483
+ Window Controls Overlay — installed web app (PWA) custom titlebar.
4484
+
4485
+ When the manifest's `display_override: ["window-controls-overlay", ...]`
4486
+ is active, the OS caption buttons float over the first shell row and this
4487
+ block turns that row into the titlebar: draggable empty space, insets for
4488
+ the caption buttons, and every interactive descendant opted back out.
4489
+
4490
+ Ported 1:1 from the Electron build — keep in sync with
4491
+ packages/desktop/renderer/titlebar.css (which is scoped under
4492
+ `.db-desktop-root`; Electron windows report `display-mode: browser`, so
4493
+ this media query can never double-apply there). The media query is live:
4494
+ toggling the overlay chevron flips it with no JS. */
4495
+ @media (display-mode: window-controls-overlay) {
4496
+ .db-shell {
4497
+ --db-wco-titlebar-height: env(titlebar-area-height, 32px);
4498
+ }
4499
+
4500
+ /* The first shell row replaces the native titlebar. Empty space can drag
4501
+ the window; every interactive descendant opts back out below. */
4502
+ .db-shell .db-shell-sidebar-header,
4503
+ .db-shell .squisq-toolbar,
4504
+ .db-shell .squisq-editor-header--image {
4505
+ app-region: drag;
4506
+ -webkit-app-region: drag;
4507
+ box-sizing: border-box;
4508
+ height: var(--db-wco-titlebar-height);
4509
+ min-height: var(--db-wco-titlebar-height);
4510
+ }
4511
+
4512
+ .db-shell .db-shell-sidebar-header {
4513
+ padding-block: 0;
4514
+ padding-left: max(4px, calc(env(titlebar-area-x, 0px) + 4px));
4515
+ cursor: grab;
4516
+ }
4517
+
4518
+ /* Keep the shell controls inside the compact native caption band. These
4519
+ overrides apply only to an installed app using Window Controls Overlay;
4520
+ the regular browser toolbar keeps its roomier metrics. */
4521
+ .db-shell .db-app-menu-btn,
4522
+ .db-shell .db-workspace-picker-btn {
4523
+ padding-block: 3px;
4524
+ }
4525
+
4526
+ .db-shell .squisq-toolbar-view-tab {
4527
+ padding-top: 4px;
4528
+ padding-bottom: 4px;
4529
+ }
4530
+
4531
+ .db-shell .squisq-use-mode-trigger {
4532
+ padding-bottom: 9px;
4533
+ }
4534
+
4535
+ .db-shell .squisq-toolbar-button[aria-label='Insert image'] {
4536
+ height: 28px;
4537
+ }
4538
+
4539
+ .db-shell .squisq-editor-header--image {
4540
+ padding-block: 0;
4541
+ }
4542
+
4543
+ /* Make the draggable header space beside the workspace gear discoverable,
4544
+ matching the Electron titlebar without introducing another control. */
4545
+ .db-shell .db-shell-sidebar-header::after {
4546
+ content: '';
4547
+ width: 12px;
4548
+ height: 20px;
4549
+ flex: 0 0 12px;
4550
+ margin-right: 3px;
4551
+ background-image: radial-gradient(circle, var(--db-text-muted) 1px, transparent 1.25px);
4552
+ background-position: center;
4553
+ background-size: 4px 4px;
4554
+ opacity: 0.72;
4555
+ pointer-events: none;
4556
+ app-region: drag;
4557
+ -webkit-app-region: drag;
4558
+ }
4559
+
4560
+ /* Let the workspace menu size itself to its contents and cross the sidebar
4561
+ boundary above the editor. The explorer still clips its own contents. */
4562
+ .db-shell .db-shell-sidebar {
4563
+ overflow: visible;
4564
+ }
4565
+
4566
+ .db-shell .db-workspace-dropdown {
4567
+ box-sizing: border-box;
4568
+ width: max-content;
4569
+ }
4570
+
4571
+ /* The caption buttons normally occupy the right edge. Derive that inset
4572
+ from the overlay safe area rather than assuming a fixed width, so
4573
+ scaling, RTL controls, and OS variants stay clear. The compact sidebar
4574
+ header is full-width, so it needs the same reservation. */
4575
+ .db-shell.db-shell--mobile .db-shell-sidebar-header,
4576
+ .db-shell .squisq-toolbar,
4577
+ .db-shell .squisq-editor-header--image {
4578
+ padding-right: max(
4579
+ 12px,
4580
+ calc(100vw - env(titlebar-area-x, 0px) - env(titlebar-area-width, 100vw) + 8px)
4581
+ );
4582
+ }
4583
+
4584
+ /* In compact mode there is no sidebar to absorb left-side controls such as
4585
+ macOS traffic lights, so the editor toolbar also observes the left inset. */
4586
+ .db-shell.db-shell--mobile .squisq-toolbar,
4587
+ .db-shell.db-shell--mobile .squisq-editor-header--image {
4588
+ padding-left: env(titlebar-area-x, 0px);
4589
+ }
4590
+
4591
+ .db-shell
4592
+ :is(
4593
+ button,
4594
+ a,
4595
+ input,
4596
+ select,
4597
+ textarea,
4598
+ [contenteditable='true'],
4599
+ [role='button'],
4600
+ [role='tab']
4601
+ ) {
4602
+ app-region: no-drag;
4603
+ -webkit-app-region: no-drag;
4604
+ }
4605
+
4606
+ /* Folder and empty states do not render Squisq's toolbar. Preserve a top
4607
+ drag strip in those states and keep folder content below it. */
4608
+ .db-shell .db-shell-empty::before,
4609
+ .db-shell .db-folder-view::before {
4610
+ content: '';
4611
+ position: absolute;
4612
+ top: 0;
4613
+ left: env(titlebar-area-x, 0px);
4614
+ width: env(titlebar-area-width, 100%);
4615
+ height: var(--db-wco-titlebar-height);
4616
+ app-region: drag;
4617
+ -webkit-app-region: drag;
4618
+ }
4619
+
4620
+ .db-shell .db-folder-view {
4621
+ box-sizing: border-box;
4622
+ padding-top: calc(24px + var(--db-wco-titlebar-height));
4623
+ }
4624
+ }