@bendyline/docblocks-react 2.7.1 → 2.7.2

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 (32) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_NOTICES.txt +98 -48
  3. package/dist/{ExportDialog-IMBVGRYG.js → ExportDialog-JRVZCG3J.js} +2 -2
  4. package/dist/{ExportToolbarControls-MUM6HM3K.js → ExportToolbarControls-2FEIHNMW.js} +15 -7
  5. package/dist/KeyboardShortcutsDialog-NOD4P25G.js +145 -0
  6. package/dist/{PresentationMaker-W2JIBHRN.js → PresentationMaker-ITNP5SDO.js} +1 -1
  7. package/dist/{Settings-DuXk6baH.d.ts → Settings-RDYvDDI0.d.ts} +13 -11
  8. package/dist/{SpeechToolbarControl-OSQS7NVY.js → SpeechToolbarControl-CLU7RB2G.js} +1 -1
  9. package/dist/{TextFromNarration-XYRAB6O2.js → TextFromNarration-NITJQ4IB.js} +1 -1
  10. package/dist/{WorkspaceSearchPanel-BKZJRPMY.js → WorkspaceSearchPanel-J6BKEZQJ.js} +1 -1
  11. package/dist/{chunk-UG4G7PJ4.js → chunk-5O5YTOXG.js} +1 -1
  12. package/dist/{chunk-VO2JYYQZ.js → chunk-6JJOGV6M.js} +5 -13
  13. package/dist/{chunk-X437UAF7.js → chunk-6MSHXQNB.js} +7 -2
  14. package/dist/{chunk-W55E6TE2.js → chunk-BLUEZG7T.js} +27 -22
  15. package/dist/chunk-DICE7VBJ.js +77 -0
  16. package/dist/{chunk-BCQZTWE5.js → chunk-HRWEGPTY.js} +18 -4
  17. package/dist/chunk-K7XJDJUJ.js +126 -0
  18. package/dist/{chunk-EPOLZNFD.js → chunk-SSB43524.js} +164 -69
  19. package/dist/{chunk-G4MFB3IO.js → chunk-VG434562.js} +2 -70
  20. package/dist/{chunk-BD54Z5XP.js → chunk-Y5OE3HJC.js} +4 -3
  21. package/dist/editor.js +6 -4
  22. package/dist/export/index.d.ts +17 -6
  23. package/dist/export/index.js +4 -4
  24. package/dist/index.d.ts +24 -6
  25. package/dist/index.js +395 -196
  26. package/dist/run-export-CS3HRNAZ.js +13 -0
  27. package/dist/settings/index.d.ts +1 -1
  28. package/dist/settings/index.js +1 -1
  29. package/package.json +9 -8
  30. package/src/styles/docblocks.css +465 -266
  31. package/dist/chunk-EA4BO6E4.js +0 -73
  32. package/dist/run-export-47X5FTYZ.js +0 -11
@@ -4,15 +4,19 @@
4
4
 
5
5
  /* ── Theme Tokens ────────────────────────────────────────────── */
6
6
 
7
- /* DocBlocks accent palette — warm brown on a canvas/parchment base.
8
- Think paper on a wooden desk: the editor itself stays white (paper),
9
- the chrome around it (sidebar, gutters, panes) reads as cream
10
- canvas, and the accent picks up a saturated dark brown for CTAs.
11
- Dark mode inverts the metaphor into espresso wood with light tan
12
- highlights. Derived shades (`--db-accent-soft-*`,
13
- `--db-accent-tint-strong`, `--db-accent-deep`) are defined alongside so every place that needs
14
- a tinted background or a readable-on-tint text color pulls from the
15
- same source of truth. */
7
+ /* DocBlocks palette — paper, ink, and rust.
8
+ The page is the one white sheet. Every chrome pane around it (sidebar,
9
+ toolbar, status bar) shares the cream `--db-bg-subtle`, so nothing but
10
+ the document competes for attention. Text is ink. The default accent
11
+ palette, Rust, paints primary buttons, active tabs and toggles in rust,
12
+ and a selected row is a quiet rust tint marked by a 2px
13
+ `--db-selected-rule` instead of a filled slab. The other accent palettes
14
+ (Green, Blue, …) follow the same model in their own hues. Dark mode
15
+ mirrors it: espresso panes, light ink, a lighter rust.
16
+ Derived shades (`--db-accent-soft-*`, `--db-accent-tint-strong`,
17
+ `--db-accent-deep`) are defined alongside so every place that needs a
18
+ tinted background or a readable-on-tint text color pulls from the same
19
+ source of truth. */
16
20
  /* The palette binds on the document root as well as on the shell. Squisq
17
21
  mounts its menus, dialogs and flyouts in PORTALS on <body>, outside the
18
22
  shell — without a root binding they cannot see --db-*, which is why the
@@ -20,44 +24,59 @@
20
24
  follows whichever appearance the shell in the page resolved to. */
21
25
  :root,
22
26
  .db-shell {
23
- /* Chrome typeface. `system-ui` first so DocBlocks looks native by default.
24
- Settings > Appearance > Interface font swaps this for the bundled face
25
- below; the visual-regression suite forces that, because under the system
26
- stack the same screenshot renders in a different typeface on every OS. */
27
+ /* Chrome typeface: the bundled `DocBlocks Fixed UI` face, which is Hanken
28
+ Grotesk — the sans docblocks.com is set in — so the app and the site
29
+ read as one product and the chrome renders identically on every OS.
30
+ Settings > Appearance > Interface font > System swaps it for the
31
+ platform's own face (the block below). */
27
32
  --db-ui-font:
28
- system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
29
- sans-serif;
30
- --db-bg: #ffffff;
33
+ 'DocBlocks Fixed UI', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
34
+ 'Helvetica Neue', Arial, sans-serif;
35
+ /* Metadata face: counts, timestamps, version strings, section labels. A
36
+ small mono sets what you read apart from what you act on. */
37
+ --db-meta-font: 'JetBrains Mono', ui-monospace, SFMono-Regular, Consolas, monospace;
38
+ /* Squisq's chrome reads `--squisq-ux-font` with a `system-ui` fallback, the
39
+ same bridge shape as the `--squisq-*` color tokens further down. Binding
40
+ it carries the chrome face into the editor toolbar, menus and dialogs.
41
+ DOCUMENT typography is never touched — a theme's fonts are content the
42
+ author chose, not chrome. */
43
+ --squisq-ux-font: var(--db-ui-font);
44
+ --db-bg: #fffdf9;
31
45
  --db-bg-subtle: #f3eede;
32
46
  --db-bg-hover: #e9e2cb;
33
- --db-bg-selected: #7d6948;
34
- --db-bg-selected-hover: #5e4f37;
35
- --db-border: #d6cdb0;
36
- --db-border-strong: #b5a985;
37
- --db-text: #2a2419;
47
+ --db-bg-selected: #e5ccb6;
48
+ --db-bg-selected-hover: #e0c0a8;
49
+ --db-border: #ddd5c3;
50
+ --db-border-strong: #c7bca3;
51
+ --db-text: #231f18;
38
52
  --db-text-secondary: #3d3528;
39
- --db-text-muted: #6b614a;
53
+ --db-text-muted: #6b6252;
40
54
  --db-text-placeholder: #766c54;
41
- --db-accent: #7d6948;
42
- --db-accent-hover: #5e4f37;
43
- --db-text-on-accent: #ffffff;
44
- --db-text-on-selected: #ffffff;
45
- /* Keyboard focus ring. Deliberately darker than --db-accent: the accent
46
- is also the *selected row* fill, so an accent ring vanished against
47
- it. Any surface that paints itself --db-bg-selected re-points this
48
- token at a contrasting value (see .db-tree-row--selected). */
49
- --db-focus: #3d3220;
50
- --db-accent-soft-08: rgba(125, 105, 72, 0.08);
51
- --db-accent-soft-10: rgba(125, 105, 72, 0.1);
52
- --db-accent-soft-12: rgba(125, 105, 72, 0.12);
53
- --db-accent-soft-15: rgba(125, 105, 72, 0.15);
54
- --db-accent-soft-25: rgba(125, 105, 72, 0.25);
55
- --db-accent-tint-strong: #d8d0b5;
56
- --db-accent-deep: #3d3220;
57
- --db-editor-canvas: #ffffff;
55
+ --db-accent: #a0461f;
56
+ --db-accent-hover: #8a3a1a;
57
+ --db-text-on-accent: #fffdf9;
58
+ --db-text-on-selected: #231f18;
59
+ /* The 2px mark down the leading edge of a selected row. Selection is a
60
+ tint, so this is what carries the state at a glance. */
61
+ --db-selected-rule: #a0461f;
62
+ /* Keyboard focus ring, in ink. The accent is rust and paints buttons and
63
+ the selected-row rule, so a rust ring would vanish against them; ink
64
+ holds at 14:1 on the cream panes. */
65
+ --db-focus: #231f18;
66
+ --db-accent-soft-08: rgba(160, 70, 31, 0.08);
67
+ --db-accent-soft-10: rgba(160, 70, 31, 0.1);
68
+ --db-accent-soft-12: rgba(160, 70, 31, 0.12);
69
+ --db-accent-soft-15: rgba(160, 70, 31, 0.15);
70
+ --db-accent-soft-25: rgba(160, 70, 31, 0.25);
71
+ --db-accent-tint-strong: #e8d2be;
72
+ --db-accent-deep: #7a3418;
73
+ --db-editor-canvas: #fffdf9;
74
+ /* Surfaces that float over the chrome: menus, dialogs, popovers. In light
75
+ mode they are the same warm-white sheet as the page. */
76
+ --db-bg-raised: var(--db-bg);
58
77
  --db-badge-bg: #f3eede;
59
78
  --db-badge-text: #3d3220;
60
- --db-badge-text-hover: #2a2419;
79
+ --db-badge-text-hover: #231f18;
61
80
  /* The editor "desk": every chrome surface the page floats on — the
62
81
  outline pane, the inline-preview gutter, the Monaco line-number
63
82
  margin, and (via `--squisq-desk-bg`) the field behind the WYSIWYG
@@ -144,53 +163,63 @@
144
163
  }
145
164
  }
146
165
 
147
- /* Interface font: fixed.
148
- `DocBlocks Fixed UI` is the Roboto variable binary each surface already ships
149
- for the document theme of that name, redeclared over the full 100-900 range
150
- so the chrome's 400/500/600/650/700 weights render exactly rather than
151
- snapping to the nearest static face. Bound on the root, not only the shell,
152
- because Squisq portals its menus onto <body>. */
153
- :root[data-db-interface-font='fixed'],
154
- :root[data-db-interface-font='fixed'] .db-shell {
166
+ /* Interface font: system.
167
+ `DocBlocks Fixed UI` (above) is the Hanken Grotesk variable binary each
168
+ surface already ships for the document theme of that name, redeclared over
169
+ the full 100-900 range so the chrome's 400/500/600/650/700 weights render
170
+ exactly. This block is the opt-out for anyone who wants DocBlocks to look
171
+ native: the platform UI face, and the platform mono for metadata, so the
172
+ chrome fetches nothing. Bound on the root, not only the shell, because
173
+ Squisq portals its menus onto <body>. */
174
+ :root[data-db-interface-font='system'],
175
+ :root[data-db-interface-font='system'] .db-shell {
155
176
  --db-ui-font:
156
- 'DocBlocks Fixed UI', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
157
- 'Helvetica Neue', Arial, sans-serif;
158
- /* Squisq's chrome reads `--squisq-ux-font` with a `system-ui` fallback, the
159
- same bridge shape as the `--squisq-*` colour tokens further down. Setting
160
- it here carries the fixed face into the editor toolbar, menus and dialogs,
161
- which is most of what a shell screenshot actually contains.
162
-
163
- Scoped to fixed mode on purpose: the token is left unset by default so
164
- Squisq keeps its own chrome font, and DOCUMENT typography is never touched
165
- — a theme's fonts are content the author chose, not chrome. */
177
+ system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
178
+ sans-serif;
179
+ --db-meta-font: ui-monospace, SFMono-Regular, Consolas, monospace;
166
180
  --squisq-ux-font: var(--db-ui-font);
167
181
  }
168
182
 
183
+ /* Form controls take the chrome face. Browsers give <button>, <input>,
184
+ <select> and <textarea> a UA font of their own (Arial in Chromium on
185
+ Windows), so every label inside a button — the view tabs, H1–H3, the
186
+ workspace picker — rendered in a second sans beside the chrome's.
187
+ Zero specificity, so any rule that names a font still wins; unscoped,
188
+ because Squisq portals its menus and dialogs onto <body>. */
189
+ :where(button, input, select, textarea) {
190
+ font-family: inherit;
191
+ }
192
+
169
193
  :root:has(.db-shell[data-theme='dark']),
170
194
  .db-shell[data-theme='dark'] {
171
195
  --db-bg: #1a1812;
172
196
  --db-bg-subtle: #262219;
173
197
  --db-bg-hover: #3a3528;
174
- --db-bg-selected: #3a3528;
175
- --db-bg-selected-hover: #4d4636;
176
- --db-border: #4d4636;
177
- --db-border-strong: #6b6448;
178
- --db-text: #e8e2d0;
198
+ --db-bg-selected: #433021;
199
+ --db-bg-selected-hover: #513625;
200
+ --db-border: #342e27;
201
+ --db-border-strong: #4a4238;
202
+ --db-text: #ece6d8;
179
203
  --db-text-secondary: #d4ccb0;
180
- --db-text-muted: #a89a7c;
204
+ --db-text-muted: #a39885;
181
205
  --db-text-placeholder: #6b614a;
182
- --db-accent: #c8b48f;
183
- --db-accent-hover: #dec79d;
206
+ --db-accent: #e0835a;
207
+ --db-accent-hover: #eb9a76;
184
208
  --db-text-on-accent: #1a1812;
185
- --db-text-on-selected: #e8e2d0;
186
- --db-focus: #e8e2d0;
187
- --db-accent-soft-08: rgba(200, 180, 143, 0.08);
188
- --db-accent-soft-10: rgba(200, 180, 143, 0.1);
189
- --db-accent-soft-12: rgba(200, 180, 143, 0.12);
190
- --db-accent-soft-15: rgba(200, 180, 143, 0.18);
191
- --db-accent-soft-25: rgba(200, 180, 143, 0.28);
192
- --db-accent-tint-strong: #3a382e;
193
- --db-accent-deep: #e6dcc0;
209
+ --db-text-on-selected: #ece6d8;
210
+ --db-selected-rule: #e0835a;
211
+ --db-focus: #ece6d8;
212
+ /* Dark mode reverses that: a floating surface must sit LIGHTER than the
213
+ panes it opens over, or a menu reads as a hole in the chrome. Derived
214
+ from the palette's own steps, so every accent palette gets one. */
215
+ --db-bg-raised: color-mix(in srgb, var(--db-bg-subtle), var(--db-bg-hover) 40%);
216
+ --db-accent-soft-08: rgba(224, 131, 90, 0.08);
217
+ --db-accent-soft-10: rgba(224, 131, 90, 0.1);
218
+ --db-accent-soft-12: rgba(224, 131, 90, 0.12);
219
+ --db-accent-soft-15: rgba(224, 131, 90, 0.18);
220
+ --db-accent-soft-25: rgba(224, 131, 90, 0.28);
221
+ --db-accent-tint-strong: #533725;
222
+ --db-accent-deep: #f0c2aa;
194
223
  --db-editor-canvas: #16110b;
195
224
  --db-badge-bg: #3a2f1f;
196
225
  --db-badge-text: #fff4d6;
@@ -220,25 +249,30 @@
220
249
  --db-bg: #1a1812;
221
250
  --db-bg-subtle: #262219;
222
251
  --db-bg-hover: #3a3528;
223
- --db-bg-selected: #3a3528;
224
- --db-bg-selected-hover: #4d4636;
225
- --db-border: #4d4636;
226
- --db-border-strong: #6b6448;
227
- --db-text: #e8e2d0;
252
+ --db-bg-selected: #433021;
253
+ --db-bg-selected-hover: #513625;
254
+ --db-border: #342e27;
255
+ --db-border-strong: #4a4238;
256
+ --db-text: #ece6d8;
228
257
  --db-text-secondary: #d4ccb0;
229
- --db-text-muted: #a89a7c;
258
+ --db-text-muted: #a39885;
230
259
  --db-text-placeholder: #6b614a;
231
- --db-accent: #c8b48f;
232
- --db-accent-hover: #dec79d;
260
+ --db-accent: #e0835a;
261
+ --db-accent-hover: #eb9a76;
233
262
  --db-text-on-accent: #1a1812;
234
- --db-text-on-selected: #e8e2d0;
235
- --db-focus: #e8e2d0;
236
- --db-accent-soft-08: rgba(200, 180, 143, 0.08);
237
- --db-accent-soft-12: rgba(200, 180, 143, 0.12);
238
- --db-accent-soft-15: rgba(200, 180, 143, 0.18);
239
- --db-accent-soft-25: rgba(200, 180, 143, 0.28);
240
- --db-accent-tint-strong: #3a382e;
241
- --db-accent-deep: #e6dcc0;
263
+ --db-text-on-selected: #ece6d8;
264
+ --db-selected-rule: #e0835a;
265
+ --db-focus: #ece6d8;
266
+ /* Dark mode reverses that: a floating surface must sit LIGHTER than the
267
+ panes it opens over, or a menu reads as a hole in the chrome. Derived
268
+ from the palette's own steps, so every accent palette gets one. */
269
+ --db-bg-raised: color-mix(in srgb, var(--db-bg-subtle), var(--db-bg-hover) 40%);
270
+ --db-accent-soft-08: rgba(224, 131, 90, 0.08);
271
+ --db-accent-soft-12: rgba(224, 131, 90, 0.12);
272
+ --db-accent-soft-15: rgba(224, 131, 90, 0.18);
273
+ --db-accent-soft-25: rgba(224, 131, 90, 0.28);
274
+ --db-accent-tint-strong: #533725;
275
+ --db-accent-deep: #f0c2aa;
242
276
  --db-input-border: #c8b48f;
243
277
  --db-danger: #f87171;
244
278
  --db-danger-bg: #1c1917;
@@ -293,10 +327,11 @@
293
327
  }
294
328
 
295
329
  .db-explorer-title {
296
- font-weight: 600;
297
- font-size: 12px;
330
+ font-family: var(--db-meta-font);
331
+ font-weight: 500;
332
+ font-size: 11px;
298
333
  text-transform: uppercase;
299
- letter-spacing: 0.03em;
334
+ letter-spacing: 0.06em;
300
335
  color: var(--db-text-muted);
301
336
  }
302
337
 
@@ -337,7 +372,7 @@
337
372
  padding: 8px 10px 5px;
338
373
  }
339
374
 
340
- .db-pinned-documents-title i {
375
+ .db-pinned-documents-title svg {
341
376
  font-size: 10px;
342
377
  }
343
378
 
@@ -383,9 +418,9 @@
383
418
  .db-pinned-document-row--selected,
384
419
  .db-pinned-document-row--selected:hover,
385
420
  .db-pinned-document-row--selected:has(:focus-visible) {
386
- --db-focus: #ffffff;
387
421
  background: var(--db-bg-selected);
388
422
  color: var(--db-text-on-selected);
423
+ box-shadow: inset 2px 0 0 var(--db-selected-rule);
389
424
  }
390
425
 
391
426
  .db-pinned-document-more {
@@ -445,7 +480,7 @@
445
480
  right: 4px;
446
481
  left: 4px;
447
482
  margin: 0;
448
- background: var(--db-bg);
483
+ background: var(--db-bg-raised);
449
484
  }
450
485
 
451
486
  .db-explorer-btn {
@@ -695,6 +730,14 @@
695
730
  opacity: 0.65;
696
731
  }
697
732
 
733
+ /* What a non-Markdown type means: written in Markdown, saved as that format. */
734
+ .db-new-item-hint {
735
+ margin: 4px 8px 0;
736
+ color: var(--db-text-muted);
737
+ font-size: 12px;
738
+ line-height: 1.35;
739
+ }
740
+
698
741
  /* ── Tree ────────────────────────────────────────────────────── */
699
742
 
700
743
  .db-tree {
@@ -793,14 +836,6 @@
793
836
  outline-offset: -2px;
794
837
  }
795
838
 
796
- /* A selected/drop-target row is filled with --db-bg-selected, which in
797
- light mode *is* the accent brown — the default ring would disappear
798
- into it. Re-point the token rather than duplicating the rule. */
799
- .db-tree-row--selected,
800
- .db-tree-row--drop-target {
801
- --db-focus: #ffffff;
802
- }
803
-
804
839
  .db-tree-row--dragging {
805
840
  opacity: 0.45;
806
841
  }
@@ -816,6 +851,7 @@
816
851
  .db-tree-row--selected {
817
852
  background: var(--db-bg-selected);
818
853
  color: var(--db-text-on-selected);
854
+ box-shadow: inset 2px 0 0 var(--db-selected-rule);
819
855
  }
820
856
 
821
857
  .db-tree-row--selected:hover {
@@ -846,7 +882,8 @@
846
882
  margin-left: 8px;
847
883
  overflow: hidden;
848
884
  color: var(--db-text-secondary);
849
- font-size: 11px;
885
+ font-family: var(--db-meta-font);
886
+ font-size: 10.5px;
850
887
  font-variant-numeric: tabular-nums;
851
888
  text-align: right;
852
889
  text-overflow: ellipsis;
@@ -946,7 +983,7 @@
946
983
  .db-tree-context {
947
984
  position: fixed;
948
985
  z-index: 1000;
949
- background: var(--db-bg);
986
+ background: var(--db-bg-raised);
950
987
  border: 1px solid var(--db-border);
951
988
  border-radius: 4px;
952
989
  box-shadow: 0 4px 12px var(--db-shadow);
@@ -1049,7 +1086,7 @@
1049
1086
  z-index: 60;
1050
1087
  min-width: calc(100% - 16px);
1051
1088
  max-width: min(320px, 90vw);
1052
- background: var(--db-bg);
1089
+ background: var(--db-bg-raised);
1053
1090
  border: 1px solid var(--db-border);
1054
1091
  border-radius: 4px;
1055
1092
  box-shadow: 0 4px 12px var(--db-shadow);
@@ -1288,11 +1325,21 @@
1288
1325
  display: block;
1289
1326
  }
1290
1327
 
1291
- /* The logo is black lettering on a pale extruded edge. On espresso the black
1292
- fill vanished and only the edges showed, so it read as a hollow outline.
1293
- Inverting makes the letters solid and sinks the edge into the background,
1294
- and the sepia warms them toward --db-text. */
1295
- .db-shell[data-theme='dark'] .db-app-menu-logo {
1328
+ /* Hosts pass a light and a dark wordmark; the shell shows the one drawn for
1329
+ its resolved appearance. The dark one is painted as on a hull (white faces,
1330
+ black shade), which an inverted light logo can't reproduce. */
1331
+ .db-app-menu-logo--dark,
1332
+ .db-shell[data-theme='dark'] .db-app-menu-logo--light {
1333
+ display: none;
1334
+ }
1335
+
1336
+ .db-shell[data-theme='dark'] .db-app-menu-logo--dark {
1337
+ display: block;
1338
+ }
1339
+
1340
+ /* A host with only one logo gets it inverted in dark mode — fine for a flat
1341
+ black-on-transparent mark, the case this fallback exists for. */
1342
+ .db-shell[data-theme='dark'] .db-app-menu-logo--invert {
1296
1343
  filter: invert(1) brightness(0.88) sepia(0.15);
1297
1344
  }
1298
1345
 
@@ -1318,7 +1365,7 @@
1318
1365
  left: 0;
1319
1366
  z-index: 70;
1320
1367
  min-width: 200px;
1321
- background: var(--db-bg);
1368
+ background: var(--db-bg-raised);
1322
1369
  border: 1px solid var(--db-border);
1323
1370
  border-radius: 4px;
1324
1371
  box-shadow: 0 4px 12px var(--db-shadow);
@@ -1342,6 +1389,18 @@
1342
1389
  background: var(--db-bg-hover);
1343
1390
  }
1344
1391
 
1392
+ .db-app-menu-item--with-shortcut {
1393
+ display: flex;
1394
+ align-items: baseline;
1395
+ justify-content: space-between;
1396
+ gap: 16px;
1397
+ }
1398
+
1399
+ .db-app-menu-shortcut {
1400
+ color: var(--db-text-muted);
1401
+ font-size: 12px;
1402
+ }
1403
+
1345
1404
  .db-app-menu-item--danger {
1346
1405
  color: var(--db-danger);
1347
1406
  }
@@ -1392,7 +1451,7 @@
1392
1451
  right: 0;
1393
1452
  z-index: 100;
1394
1453
  min-width: 200px;
1395
- background: var(--db-bg);
1454
+ background: var(--db-bg-raised);
1396
1455
  border: 1px solid var(--db-border);
1397
1456
  border-radius: 6px;
1398
1457
  box-shadow: 0 4px 12px var(--db-shadow);
@@ -1517,6 +1576,9 @@
1517
1576
 
1518
1577
  .db-shell-sidebar {
1519
1578
  width: 260px;
1579
+ /* The sidebar is chrome, so it shares the toolbar's paper; only the page
1580
+ itself is white. */
1581
+ background: var(--db-bg-subtle);
1520
1582
  display: flex;
1521
1583
  flex-direction: column;
1522
1584
  overflow: hidden;
@@ -1539,7 +1601,7 @@
1539
1601
  inset-block: 0;
1540
1602
  inset-inline-start: 0;
1541
1603
  z-index: 30;
1542
- background: var(--db-bg);
1604
+ background: var(--db-bg-subtle);
1543
1605
  width: var(--db-drawer-width);
1544
1606
  padding-inline-start: var(--db-safe-left);
1545
1607
  border-inline-end: 1px solid var(--db-border-strong);
@@ -1729,6 +1791,7 @@ body.db-resizing-sidebar * {
1729
1791
  box here so both chrome regions are 25px everywhere. */
1730
1792
  .db-shell .squisq-status-bar {
1731
1793
  line-height: 16px;
1794
+ font-family: var(--db-meta-font);
1732
1795
  }
1733
1796
 
1734
1797
  .db-shell-sidebar-footer {
@@ -1761,8 +1824,7 @@ body.db-resizing-sidebar * {
1761
1824
  text-decoration: underline;
1762
1825
  }
1763
1826
 
1764
- .db-shell-sidebar-footer-separator,
1765
- .db-shell-sidebar-footer-action {
1827
+ .db-shell-sidebar-footer-separator {
1766
1828
  color: var(--db-text-muted);
1767
1829
  }
1768
1830
 
@@ -1771,20 +1833,37 @@ body.db-resizing-sidebar * {
1771
1833
  opacity: 0.65;
1772
1834
  }
1773
1835
 
1836
+ /* The backup action is the footer's one control that protects work, so it is a
1837
+ bordered button with a 22px target (24px including the spacing around it)
1838
+ rather than another 11px text link. */
1774
1839
  .db-shell-sidebar-footer-action {
1840
+ display: inline-flex;
1841
+ align-items: center;
1842
+ gap: 4px;
1775
1843
  flex-shrink: 0;
1776
- padding: 0;
1777
- border: 0;
1778
- background: transparent;
1844
+ min-height: 22px;
1845
+ margin-left: auto;
1846
+ padding: 0 8px;
1847
+ border: 1px solid var(--db-border-strong);
1848
+ border-radius: 999px;
1849
+ background: var(--db-bg);
1850
+ color: var(--db-text-secondary);
1779
1851
  font: inherit;
1780
- line-height: inherit;
1781
- text-decoration: underline;
1852
+ font-size: 12px;
1853
+ font-weight: 600;
1854
+ line-height: 1;
1782
1855
  white-space: nowrap;
1783
1856
  cursor: pointer;
1784
1857
  }
1785
1858
 
1786
1859
  .db-shell-sidebar-footer-action:hover {
1787
- color: var(--db-text-secondary);
1860
+ border-color: var(--db-accent);
1861
+ color: var(--db-text);
1862
+ }
1863
+
1864
+ .db-shell-sidebar-footer-action:focus-visible {
1865
+ outline: 2px solid var(--db-focus);
1866
+ outline-offset: 1px;
1788
1867
  }
1789
1868
 
1790
1869
  .db-shell-empty {
@@ -1938,7 +2017,7 @@ body.db-resizing-sidebar * {
1938
2017
  position: static;
1939
2018
  }
1940
2019
 
1941
- .db-shell--mobile .squisq-editor-shell .squisq-toolbar-overflow-menu {
2020
+ html:has(.db-shell--mobile) .squisq-toolbar-overflow-menu {
1942
2021
  right: auto !important;
1943
2022
  left: max(4px, env(safe-area-inset-left)) !important;
1944
2023
  max-width: calc(100vw - 8px);
@@ -2184,7 +2263,7 @@ body.db-resizing-sidebar * {
2184
2263
 
2185
2264
  .db-dialog {
2186
2265
  box-sizing: border-box;
2187
- background: var(--db-bg);
2266
+ background: var(--db-bg-raised);
2188
2267
  border: 1px solid var(--db-border);
2189
2268
  border-radius: 8px;
2190
2269
  box-shadow: 0 8px 32px var(--db-shadow);
@@ -2297,7 +2376,7 @@ body.db-resizing-sidebar * {
2297
2376
 
2298
2377
  .db-about-version code {
2299
2378
  color: var(--db-text);
2300
- font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2379
+ font-family: var(--db-meta-font);
2301
2380
  user-select: all;
2302
2381
  }
2303
2382
 
@@ -2314,10 +2393,11 @@ body.db-resizing-sidebar * {
2314
2393
  }
2315
2394
 
2316
2395
  .db-settings-legend {
2317
- font-size: 12px;
2318
- font-weight: 600;
2396
+ font-family: var(--db-meta-font);
2397
+ font-size: 11px;
2398
+ font-weight: 500;
2319
2399
  text-transform: uppercase;
2320
- letter-spacing: 0.03em;
2400
+ letter-spacing: 0.06em;
2321
2401
  color: var(--db-text-muted);
2322
2402
  margin-bottom: 8px;
2323
2403
  }
@@ -2632,7 +2712,7 @@ body.db-resizing-sidebar * {
2632
2712
  border: 1px solid var(--db-border-strong);
2633
2713
  border-radius: 6px;
2634
2714
  outline: none;
2635
- background: var(--db-bg);
2715
+ background: var(--db-bg-raised);
2636
2716
  color: var(--db-text);
2637
2717
  box-shadow: 0 10px 28px var(--db-shadow);
2638
2718
  }
@@ -2904,8 +2984,8 @@ body.db-resizing-sidebar * {
2904
2984
  box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.18);
2905
2985
  }
2906
2986
 
2907
- .db-settings-accent-swatch--brown {
2908
- background: #7d6948;
2987
+ .db-settings-accent-swatch--rust {
2988
+ background: #a0461f;
2909
2989
  }
2910
2990
 
2911
2991
  .db-settings-accent-swatch--green {
@@ -3133,7 +3213,7 @@ body.db-resizing-sidebar * {
3133
3213
  margin-top: 4px;
3134
3214
  z-index: 70;
3135
3215
  min-width: 200px;
3136
- background: var(--db-bg);
3216
+ background: var(--db-bg-raised);
3137
3217
  border: 1px solid var(--db-border);
3138
3218
  border-radius: 4px;
3139
3219
  box-shadow: 0 4px 12px var(--db-shadow);
@@ -3598,6 +3678,7 @@ body.db-resizing-sidebar * {
3598
3678
  --squisq-row-hover: var(--db-bg-hover);
3599
3679
  --squisq-hover-bg: var(--db-bg-hover);
3600
3680
  --squisq-panel-bg: var(--db-bg);
3681
+ --squisq-surface-overlay: var(--db-bg-raised);
3601
3682
 
3602
3683
  /* The desk the editing page floats on — the WYSIWYG backing, the block
3603
3684
  card and its preview panel, the outline pane, the Monaco margin. */
@@ -3755,31 +3836,30 @@ body.db-resizing-sidebar * {
3755
3836
  background: var(--squisq-desk-bg);
3756
3837
  }
3757
3838
 
3758
- /* ── Inline preview gutter: thematic green ──────────────────── */
3839
+ /* ── Inline preview gutter ──────────────────────────────────── */
3759
3840
  /* Rebind squisq's `--squisq-preview-*` custom properties so the
3760
- gutter chrome (vertical bracket, diagonal connector + dots,
3761
- "FACTCARD" template label) reads as sage green instead of indigo,
3762
- and the card surface tones harmonize with the rest of docblocks.
3763
- The preview-block renderer's own theme is unaffected — that's a
3764
- document-level concern, not chrome. */
3841
+ gutter chrome (vertical bracket, diagonal connector + dots)
3842
+ draws as hairlines in the rule color rather than in the accent,
3843
+ and the card surface tones harmonize with the rest of docblocks. The preview-block renderer's own theme is unaffected —
3844
+ that's a document-level concern, not chrome. */
3765
3845
  .db-shell[data-theme='light'] .squisq-editor-shell[data-theme='light'] {
3766
- --squisq-preview-accent: var(--db-accent);
3767
- --squisq-preview-accent-muted: var(--db-text-muted);
3846
+ --squisq-preview-accent: var(--db-border-strong);
3847
+ --squisq-preview-accent-muted: var(--db-border);
3768
3848
  --squisq-preview-gutter-bg: var(--db-gutter-bg);
3769
- --squisq-preview-card-bg: #ffffff;
3849
+ --squisq-preview-card-bg: var(--db-bg);
3770
3850
  --squisq-preview-card-border: var(--db-border);
3771
3851
  --squisq-preview-card-shadow: 0 1px 2px rgba(40, 30, 15, 0.08);
3772
3852
  --squisq-preview-card-title: var(--db-accent-deep);
3773
3853
  --squisq-preview-card-svg-bg: var(--db-bg-subtle);
3774
3854
  --squisq-preview-dot-halo: var(--db-gutter-bg);
3775
- --squisq-preview-empty-bg: #ffffff;
3855
+ --squisq-preview-empty-bg: var(--db-bg);
3776
3856
  --squisq-preview-empty-border: var(--db-border);
3777
3857
  --squisq-preview-empty-text: var(--db-accent-deep);
3778
3858
  }
3779
3859
 
3780
3860
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] {
3781
- --squisq-preview-accent: var(--db-accent-hover);
3782
- --squisq-preview-accent-muted: var(--db-text-muted);
3861
+ --squisq-preview-accent: var(--db-border-strong);
3862
+ --squisq-preview-accent-muted: var(--db-border);
3783
3863
  --squisq-preview-gutter-bg: var(--db-gutter-bg);
3784
3864
  --squisq-preview-card-bg: var(--db-bg);
3785
3865
  --squisq-preview-card-border: var(--db-border);
@@ -3792,6 +3872,24 @@ body.db-resizing-sidebar * {
3792
3872
  --squisq-preview-empty-text: var(--db-text-muted);
3793
3873
  }
3794
3874
 
3875
+ /* Squisq colors the card's template label with the same
3876
+ `--squisq-preview-accent` as the hairlines above, and a rule color is
3877
+ too faint for text. Keep the label at the muted text tone so it meets
3878
+ WCAG AA contrast on the card surface. */
3879
+ .db-shell .squisq-editor-shell .squisq-inline-preview-card-template {
3880
+ color: var(--db-text-muted);
3881
+ }
3882
+
3883
+ /* The extent bar shows a block's reach; at Squisq's 4px it read as a cable
3884
+ running beside the page. Squisq has no width token for it. */
3885
+ .db-shell .squisq-editor-shell .squisq-inline-preview-extent {
3886
+ width: 2px;
3887
+ }
3888
+
3889
+ .db-shell .squisq-editor-shell .squisq-inline-preview-extent--untagged {
3890
+ width: 1px;
3891
+ }
3892
+
3795
3893
  /* ── Squisq dark-theme override ──────────────────────────────── */
3796
3894
  /* Squisq has hardcoded slate-blue surfaces in its dark mode. We re-tone
3797
3895
  them via the DocBlocks dark palette so the editor reads as warm dark
@@ -3956,7 +4054,7 @@ body.db-resizing-sidebar * {
3956
4054
  }
3957
4055
 
3958
4056
  .db-shell .squisq-editor-shell .squisq-media-bin .squisq-media-bin-context-menu {
3959
- background: var(--db-bg);
4057
+ background: var(--db-bg-raised);
3960
4058
  border-color: var(--db-border);
3961
4059
  box-shadow: 0 12px 28px var(--db-shadow);
3962
4060
  }
@@ -4088,38 +4186,15 @@ body.db-resizing-sidebar * {
4088
4186
  border-color: var(--db-border-strong);
4089
4187
  }
4090
4188
 
4091
- /* ── Tooltips (portal): sans-serif + thematic chip ───────────── */
4092
- /* Tooltips render via portal into document.body, OUTSIDE `.db-shell`
4093
- — so the `--db-accent-*` variables (scoped to `.db-shell`) don't
4094
- cascade into them. We reach the portaled element with
4095
- `html:has(.db-shell)` and emit explicit colors per theme; using
4096
- `var(--db-accent-…)` here drops to the squisq fallback (dark slate
4097
- bg + near-white text) because the vars never resolve. */
4189
+ /* ── Tooltips (portal): sans-serif + ink chip ───────────────── */
4190
+ /* Tooltips portal into document.body, outside `.db-shell`; the palette is
4191
+ hoisted to the root, so the tokens resolve there. The chip inverts the
4192
+ chrome: ink on cream in light mode, light ink on espresso in dark. */
4098
4193
  html:has(.db-shell) .squisq-tooltip {
4099
4194
  font-family: var(--db-ui-font);
4100
4195
  box-shadow: 0 2px 8px rgba(15, 30, 20, 0.35);
4101
- /* Default (light mode + system-light): dark espresso chip, cream
4102
- text — an inverted floating chip against the cream UI. */
4103
- background: #3d3220;
4104
- color: #f3eede;
4105
- }
4106
-
4107
- html:has(.db-shell[data-theme='dark']) .squisq-tooltip {
4108
- /* Dark mode: cream chip, dark text — an inverted floating chip
4109
- against the espresso UI. Contrast ratio ~12:1 between
4110
- `#e6dcc0` and `#1f1a10`. */
4111
- background: #e6dcc0;
4112
- color: #1f1a10;
4113
- }
4114
-
4115
- @media (prefers-color-scheme: dark) {
4116
- /* Shell defaults to system theme when `data-theme` is unset —
4117
- mirror the dark-mode override so the tooltip stays readable
4118
- without an explicit user choice. */
4119
- html:has(.db-shell:not([data-theme='light'])) .squisq-tooltip {
4120
- background: #e6dcc0;
4121
- color: #1f1a10;
4122
- }
4196
+ background: var(--db-text);
4197
+ color: var(--db-bg-subtle);
4123
4198
  }
4124
4199
 
4125
4200
  /* ── Template picker accents (dark): indigo → thematic green ─── */
@@ -4139,64 +4214,69 @@ html:has(.db-shell[data-theme='dark']) .squisq-tooltip {
4139
4214
 
4140
4215
  /* The template gallery and file-tree context menu render into document.body
4141
4216
  via createPortal, so they live outside `.db-shell`. Hoist the same
4142
- brown/canvas tokens onto the html element (gated by the resolved shell
4217
+ palette tokens onto the html element (gated by the resolved shell
4143
4218
  theme) so every portaled surface keeps the DocBlocks palette. */
4144
4219
  html:has(.db-shell[data-theme='dark']) {
4145
4220
  --db-bg: #1a1812;
4146
4221
  --db-bg-subtle: #262219;
4147
4222
  --db-bg-hover: #3a3528;
4148
- --db-border: #4d4636;
4149
- --db-border-strong: #6b6448;
4150
- --db-text: #e8e2d0;
4223
+ --db-border: #342e27;
4224
+ --db-border-strong: #4a4238;
4225
+ --db-text: #ece6d8;
4151
4226
  --db-text-secondary: #d4ccb0;
4152
- --db-text-muted: #a89a7c;
4227
+ --db-text-muted: #a39885;
4153
4228
  --db-danger: #f87171;
4154
4229
  --db-danger-bg: #1c1917;
4155
4230
  --db-text-on-danger: #1c1917;
4156
4231
  --db-shadow: rgba(0, 0, 0, 0.4);
4157
- --db-accent: #c8b48f;
4158
- --db-accent-hover: #dec79d;
4232
+ --db-accent: #e0835a;
4233
+ --db-accent-hover: #eb9a76;
4159
4234
  --db-text-on-accent: #1a1812;
4160
- --db-accent-soft-15: rgba(200, 180, 143, 0.18);
4161
- --db-accent-soft-25: rgba(200, 180, 143, 0.28);
4162
- --db-accent-tint-strong: #3a382e;
4163
- --db-accent-deep: #e6dcc0;
4235
+ --db-accent-soft-15: rgba(224, 131, 90, 0.18);
4236
+ --db-accent-soft-25: rgba(224, 131, 90, 0.28);
4237
+ --db-accent-tint-strong: #533725;
4238
+ --db-accent-deep: #f0c2aa;
4164
4239
  --db-gutter-bg: #16110b;
4240
+ --db-bg-raised: color-mix(in srgb, var(--db-bg-subtle), var(--db-bg-hover) 40%);
4165
4241
  }
4166
4242
 
4167
4243
  html:has(.db-shell[data-theme='light']) {
4168
- --db-bg: #ffffff;
4244
+ --db-bg: #fffdf9;
4169
4245
  --db-bg-subtle: #f3eede;
4170
4246
  --db-bg-hover: #e9e2cb;
4171
- --db-border: #d6cdb0;
4172
- --db-border-strong: #b5a985;
4173
- --db-text: #2a2419;
4247
+ --db-border: #ddd5c3;
4248
+ --db-border-strong: #c7bca3;
4249
+ --db-text: #231f18;
4174
4250
  --db-text-secondary: #3d3528;
4175
- --db-text-muted: #6b614a;
4251
+ --db-text-muted: #6b6252;
4176
4252
  --db-danger: #b22b1b;
4177
4253
  --db-danger-bg: #fdf0ee;
4178
4254
  --db-text-on-danger: #ffffff;
4179
4255
  --db-shadow: rgba(40, 30, 15, 0.12);
4180
- --db-accent: #7d6948;
4181
- --db-accent-hover: #5e4f37;
4182
- --db-text-on-accent: #ffffff;
4183
- --db-accent-soft-15: rgba(125, 105, 72, 0.15);
4184
- --db-accent-soft-25: rgba(125, 105, 72, 0.25);
4185
- --db-accent-tint-strong: #d8d0b5;
4186
- --db-accent-deep: #3d3220;
4256
+ --db-accent: #a0461f;
4257
+ --db-accent-hover: #8a3a1a;
4258
+ --db-text-on-accent: #fffdf9;
4259
+ --db-accent-soft-15: rgba(160, 70, 31, 0.15);
4260
+ --db-accent-soft-25: rgba(160, 70, 31, 0.25);
4261
+ --db-accent-tint-strong: #e8d2be;
4262
+ --db-accent-deep: #7a3418;
4187
4263
  --db-gutter-bg: #efe8d4;
4188
4264
  }
4189
4265
 
4190
- /* Accent variants keep Brown as the untouched default while recoloring the
4266
+ /* Accent variants keep Rust as the untouched default while recoloring the
4191
4267
  full chrome palette for either appearance. The same tokens are hoisted to
4192
4268
  `html` so Squisq portals and file-tree menus inherit the active variant. */
4193
- .db-shell[data-theme='light']:not([data-accent='brown']),
4194
- html:has(.db-shell[data-theme='light']:not([data-accent='brown'])) {
4269
+ .db-shell[data-theme='light']:not([data-accent='rust']),
4270
+ html:has(.db-shell[data-theme='light']:not([data-accent='rust'])) {
4195
4271
  --db-accent-soft-08: rgb(var(--db-accent-rgb) / 8%);
4196
4272
  --db-accent-soft-10: rgb(var(--db-accent-rgb) / 10%);
4197
4273
  --db-accent-soft-12: rgb(var(--db-accent-rgb) / 12%);
4198
4274
  --db-accent-soft-15: rgb(var(--db-accent-rgb) / 15%);
4199
4275
  --db-accent-soft-25: rgb(var(--db-accent-rgb) / 25%);
4276
+ --db-text-on-selected: var(--db-text);
4277
+ --db-selected-rule: var(--db-accent);
4278
+ --db-bg: #ffffff;
4279
+ --db-editor-canvas: #ffffff;
4200
4280
  --db-gallery-backdrop: rgba(30, 30, 30, 0.24);
4201
4281
  --db-gallery-panel-bg: var(--db-bg);
4202
4282
  --db-gallery-raised-bg: var(--db-bg);
@@ -4205,13 +4285,14 @@ html:has(.db-shell[data-theme='light']:not([data-accent='brown'])) {
4205
4285
  --db-gallery-placeholder: var(--db-text-muted);
4206
4286
  }
4207
4287
 
4208
- .db-shell[data-theme='dark']:not([data-accent='brown']),
4209
- html:has(.db-shell[data-theme='dark']:not([data-accent='brown'])) {
4288
+ .db-shell[data-theme='dark']:not([data-accent='rust']),
4289
+ html:has(.db-shell[data-theme='dark']:not([data-accent='rust'])) {
4210
4290
  --db-accent-soft-08: rgb(var(--db-accent-rgb) / 8%);
4211
4291
  --db-accent-soft-10: rgb(var(--db-accent-rgb) / 10%);
4212
4292
  --db-accent-soft-12: rgb(var(--db-accent-rgb) / 12%);
4213
4293
  --db-accent-soft-15: rgb(var(--db-accent-rgb) / 18%);
4214
4294
  --db-accent-soft-25: rgb(var(--db-accent-rgb) / 28%);
4295
+ --db-selected-rule: var(--db-accent);
4215
4296
  --db-gallery-backdrop: rgba(0, 0, 0, 0.58);
4216
4297
  --db-gallery-panel-bg: var(--db-bg);
4217
4298
  --db-gallery-header-bg: var(--db-editor-canvas);
@@ -4225,8 +4306,8 @@ html:has(.db-shell[data-theme='dark']:not([data-accent='brown'])) {
4225
4306
  html:has(.db-shell[data-theme='light'][data-accent='green']) {
4226
4307
  --db-bg-subtle: #edf4ef;
4227
4308
  --db-bg-hover: #dfece3;
4228
- --db-bg-selected: #4f715d;
4229
- --db-bg-selected-hover: #3d5949;
4309
+ --db-bg-selected: #cfe0d3;
4310
+ --db-bg-selected-hover: #c2d6c7;
4230
4311
  --db-border: #c6d8cb;
4231
4312
  --db-border-strong: #98b3a1;
4232
4313
  --db-text: #202a23;
@@ -4274,8 +4355,8 @@ html:has(.db-shell[data-theme='dark'][data-accent='green']) {
4274
4355
  html:has(.db-shell[data-theme='light'][data-accent='blue']) {
4275
4356
  --db-bg-subtle: #eef2f7;
4276
4357
  --db-bg-hover: #e1e8f0;
4277
- --db-bg-selected: #526f91;
4278
- --db-bg-selected-hover: #3c5675;
4358
+ --db-bg-selected: #d0dbe7;
4359
+ --db-bg-selected-hover: #c3d0de;
4279
4360
  --db-border: #c7d1de;
4280
4361
  --db-border-strong: #99aabd;
4281
4362
  --db-text: #202733;
@@ -4323,8 +4404,8 @@ html:has(.db-shell[data-theme='dark'][data-accent='blue']) {
4323
4404
  html:has(.db-shell[data-theme='light'][data-accent='purple']) {
4324
4405
  --db-bg-subtle: #f3eff6;
4325
4406
  --db-bg-hover: #e9e1ef;
4326
- --db-bg-selected: #735b8c;
4327
- --db-bg-selected-hover: #59436f;
4407
+ --db-bg-selected: #ddd0e4;
4408
+ --db-bg-selected-hover: #d2c3db;
4328
4409
  --db-border: #d5c8dd;
4329
4410
  --db-border-strong: #b19cbe;
4330
4411
  --db-text: #29222e;
@@ -4372,8 +4453,8 @@ html:has(.db-shell[data-theme='dark'][data-accent='purple']) {
4372
4453
  html:has(.db-shell[data-theme='light'][data-accent='maroon']) {
4373
4454
  --db-bg-subtle: #f7eff2;
4374
4455
  --db-bg-hover: #eedfe5;
4375
- --db-bg-selected: #805365;
4376
- --db-bg-selected-hover: #643d4d;
4456
+ --db-bg-selected: #e6d0d8;
4457
+ --db-bg-selected-hover: #dcc3cd;
4377
4458
  --db-border: #dec8d0;
4378
4459
  --db-border-strong: #bd9ba8;
4379
4460
  --db-text: #2f2227;
@@ -4421,8 +4502,8 @@ html:has(.db-shell[data-theme='dark'][data-accent='maroon']) {
4421
4502
  html:has(.db-shell[data-theme='light'][data-accent='orange']) {
4422
4503
  --db-bg-subtle: #f8f1e9;
4423
4504
  --db-bg-hover: #f0e4d6;
4424
- --db-bg-selected: #8a5a32;
4425
- --db-bg-selected-hover: #6d4323;
4505
+ --db-bg-selected: #ead8c5;
4506
+ --db-bg-selected-hover: #e1cbb4;
4426
4507
  --db-border: #e0cfbc;
4427
4508
  --db-border-strong: #c2a282;
4428
4509
  --db-text: #30271f;
@@ -4470,8 +4551,8 @@ html:has(.db-shell[data-theme='dark'][data-accent='orange']) {
4470
4551
  html:has(.db-shell[data-theme='light'][data-accent='gray']) {
4471
4552
  --db-bg-subtle: #f2f2f2;
4472
4553
  --db-bg-hover: #e6e6e6;
4473
- --db-bg-selected: #676767;
4474
- --db-bg-selected-hover: #505050;
4554
+ --db-bg-selected: #d8d8d8;
4555
+ --db-bg-selected-hover: #cdcdcd;
4475
4556
  --db-border: #d1d1d1;
4476
4557
  --db-border-strong: #a8a8a8;
4477
4558
  --db-text: #252525;
@@ -4520,7 +4601,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='gray']) {
4520
4601
  above so its surface, states, icons, and text follow every DocBlocks theme
4521
4602
  and accent instead of falling back to Squisq's standalone blue/slate UI. */
4522
4603
  html:has(.db-shell) .squisq-use-mode-menu {
4523
- background: var(--db-bg);
4604
+ background: var(--db-bg-raised);
4524
4605
  border-color: var(--db-border);
4525
4606
  box-shadow:
4526
4607
  0 12px 32px var(--db-shadow),
@@ -4631,7 +4712,7 @@ html:has(.db-shell)
4631
4712
  same menu surfaces as the rest of the shell. The selector also covers the
4632
4713
  nested Mermaid and code-snippet menus, which share this portal class. */
4633
4714
  html:has(.db-shell) .squisq-insert-menu {
4634
- background: var(--db-bg);
4715
+ background: var(--db-bg-raised);
4635
4716
  border-color: var(--db-border);
4636
4717
  color: var(--db-text-secondary);
4637
4718
  box-shadow: 0 4px 12px var(--db-shadow);
@@ -4654,12 +4735,12 @@ html:has(.db-shell) .squisq-insert-menu .squisq-insert-menu-header--separated {
4654
4735
  border-top-color: var(--db-border);
4655
4736
  }
4656
4737
 
4657
- html:has(.db-shell[data-theme='light']:not([data-accent='brown'])) .squisq-tooltip {
4738
+ html:has(.db-shell[data-theme='light']:not([data-accent='rust'])) .squisq-tooltip {
4658
4739
  background: var(--db-accent-deep);
4659
4740
  color: var(--db-bg-subtle);
4660
4741
  }
4661
4742
 
4662
- html:has(.db-shell[data-theme='dark']:not([data-accent='brown'])) .squisq-tooltip {
4743
+ html:has(.db-shell[data-theme='dark']:not([data-accent='rust'])) .squisq-tooltip {
4663
4744
  background: var(--db-accent-deep);
4664
4745
  color: var(--db-bg);
4665
4746
  }
@@ -4720,7 +4801,7 @@ html:has(.db-shell[data-theme='dark'])
4720
4801
 
4721
4802
  html:has(.db-shell[data-theme='light'])
4722
4803
  .squisq-template-gallery-dialog[data-theme='light']:has([data-squisq-template-gallery-portal]) {
4723
- --squisq-template-gallery-backdrop: var(--db-gallery-backdrop, rgba(42, 36, 25, 0.24));
4804
+ --squisq-template-gallery-backdrop: var(--db-gallery-backdrop, rgba(35, 31, 24, 0.24));
4724
4805
  --squisq-template-gallery-panel-bg: var(--db-gallery-panel-bg, #fffdf7);
4725
4806
  --squisq-template-gallery-panel-border: var(--db-border);
4726
4807
  --squisq-template-gallery-header-bg: var(--db-bg-subtle);
@@ -5283,13 +5364,13 @@ html:has(.db-shell[data-theme='dark'])
5283
5364
  }
5284
5365
 
5285
5366
  .db-shell[data-theme='light'] .squisq-editor-shell[data-theme='light'] .squisq-toolbar-view-tabs {
5286
- background: var(--db-gutter-bg);
5367
+ background: var(--db-bg-subtle);
5287
5368
  border-right-color: var(--db-border);
5288
5369
  }
5289
5370
 
5290
5371
  .db-shell[data-theme='light'] .squisq-editor-shell[data-theme='light'] .squisq-status-bar {
5291
5372
  --squisq-text-muted: var(--db-text-secondary);
5292
- background: var(--db-accent-tint-strong);
5373
+ background: var(--db-bg-subtle);
5293
5374
  border-top-color: var(--db-border-strong);
5294
5375
  }
5295
5376
 
@@ -5330,48 +5411,49 @@ html:has(.db-shell[data-theme='dark'])
5330
5411
  border-left: 1px solid var(--db-border);
5331
5412
  }
5332
5413
 
5333
- /* Toolbar overflow menu. Squisq intentionally ships a neutral slate
5414
+ /* Toolbar overflow menu. Squisq portals it onto <body> (2.12+), outside the
5415
+ shell, so these rules reach it through `html:has(.db-shell)` like the
5416
+ Insert and Use mode menus. Squisq intentionally ships a neutral slate
5334
5417
  palette; inside DocBlocks this popover should use the same surfaces,
5335
5418
  borders, text, and interaction colors as our other shell menus. The
5336
5419
  contextual template/transition controls need explicit treatment too,
5337
5420
  since they bring their own Squisq surfaces into the popover. */
5338
- .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu {
5339
- background: var(--db-bg);
5421
+ html:has(.db-shell) .squisq-toolbar-overflow-menu {
5422
+ background: var(--db-bg-raised);
5340
5423
  border-color: var(--db-border);
5341
5424
  box-shadow: 0 4px 12px var(--db-shadow);
5342
5425
  }
5343
5426
 
5344
- .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu--up {
5427
+ html:has(.db-shell) .squisq-toolbar-overflow-menu--up {
5345
5428
  box-shadow: 0 -4px 12px var(--db-shadow);
5346
5429
  }
5347
5430
 
5348
- .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item {
5431
+ html:has(.db-shell) .squisq-toolbar-overflow-item {
5349
5432
  color: var(--db-text-secondary);
5350
5433
  }
5351
5434
 
5352
- .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item:hover {
5435
+ html:has(.db-shell) .squisq-toolbar-overflow-item:hover {
5353
5436
  background: var(--db-bg-hover);
5354
5437
  }
5355
5438
 
5356
- .db-shell .squisq-editor-shell .squisq-toolbar-overflow-heading {
5439
+ html:has(.db-shell) .squisq-toolbar-overflow-heading {
5357
5440
  color: var(--db-text-muted);
5358
5441
  }
5359
5442
 
5360
- .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu > .squisq-toolbar-separator {
5443
+ html:has(.db-shell) .squisq-toolbar-overflow-menu > .squisq-toolbar-separator {
5361
5444
  background: var(--db-border);
5362
5445
  }
5363
5446
 
5364
- .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item--danger {
5447
+ html:has(.db-shell) .squisq-toolbar-overflow-item--danger {
5365
5448
  color: var(--db-danger);
5366
5449
  }
5367
5450
 
5368
- .db-shell .squisq-editor-shell .squisq-toolbar-overflow-item--danger:hover {
5451
+ html:has(.db-shell) .squisq-toolbar-overflow-item--danger:hover {
5369
5452
  background: var(--db-danger-bg);
5370
5453
  color: var(--db-danger);
5371
5454
  }
5372
5455
 
5373
- .db-shell
5374
- .squisq-editor-shell
5456
+ html:has(.db-shell)
5375
5457
  .squisq-toolbar-overflow-menu
5376
5458
  :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger) {
5377
5459
  background: var(--db-bg-subtle);
@@ -5379,16 +5461,14 @@ html:has(.db-shell[data-theme='dark'])
5379
5461
  color: var(--db-text-secondary);
5380
5462
  }
5381
5463
 
5382
- .db-shell
5383
- .squisq-editor-shell
5464
+ html:has(.db-shell)
5384
5465
  .squisq-toolbar-overflow-menu
5385
5466
  :is(.squisq-template-picker-trigger, .squisq-transition-picker-trigger):hover {
5386
5467
  background: var(--db-bg-hover);
5387
5468
  border-color: var(--db-border-strong);
5388
5469
  }
5389
5470
 
5390
- .db-shell
5391
- .squisq-editor-shell
5471
+ html:has(.db-shell)
5392
5472
  .squisq-toolbar-overflow-menu
5393
5473
  :is(.squisq-template-picker-trigger--open, .squisq-transition-picker-trigger--open) {
5394
5474
  background: var(--db-bg-hover);
@@ -5396,66 +5476,64 @@ html:has(.db-shell[data-theme='dark'])
5396
5476
  outline-color: var(--db-accent-soft-25);
5397
5477
  }
5398
5478
 
5399
- .db-shell
5400
- .squisq-editor-shell
5479
+ html:has(.db-shell)
5401
5480
  .squisq-toolbar-overflow-menu
5402
5481
  :is(.squisq-template-picker-trigger-label, .squisq-transition-picker-trigger-label),
5403
- .db-shell
5404
- .squisq-editor-shell
5482
+ html:has(.db-shell)
5405
5483
  .squisq-toolbar-overflow-menu
5406
5484
  :is(.squisq-template-picker-trigger-caret, .squisq-transition-picker-trigger svg) {
5407
5485
  color: var(--db-text-muted);
5408
5486
  }
5409
5487
 
5410
- .db-shell
5411
- .squisq-editor-shell
5488
+ html:has(.db-shell)
5412
5489
  .squisq-toolbar-overflow-menu
5413
5490
  :is(.squisq-template-picker-trigger-value, .squisq-transition-picker-trigger-value) {
5414
5491
  color: var(--db-text-secondary);
5415
5492
  }
5416
5493
 
5417
- .db-shell .squisq-editor-shell .squisq-toolbar-overflow-menu .squisq-template-picker-trigger-thumb {
5494
+ html:has(.db-shell) .squisq-toolbar-overflow-menu .squisq-template-picker-trigger-thumb {
5418
5495
  background: var(--db-bg);
5419
5496
  border-color: var(--db-border);
5420
5497
  }
5421
5498
 
5422
- /* View menu. Squisq's dark appearance otherwise replaces its generic
5423
- variables with a fixed slate-blue palette. Keep the popover and its
5424
- controls on the same host palette as the DocBlocks app and overflow
5425
- menus, including the native radio/checkbox selection color. */
5426
- .db-shell .squisq-editor-shell .squisq-view-menu-popover {
5427
- background: var(--db-bg);
5499
+ /* View menu — portaled onto <body> like the overflow menu, so reached
5500
+ through `html:has(.db-shell)`. Squisq's dark appearance otherwise
5501
+ replaces its generic variables with a fixed slate-blue palette. Keep the
5502
+ popover and its controls on the same host palette as the DocBlocks app
5503
+ and overflow menus, including the native radio/checkbox selection color. */
5504
+ html:has(.db-shell) .squisq-view-menu-popover {
5505
+ background: var(--db-bg-raised);
5428
5506
  border-color: var(--db-border);
5429
5507
  box-shadow: 0 4px 12px var(--db-shadow);
5430
5508
  color: var(--db-text-secondary);
5431
5509
  }
5432
5510
 
5433
- .db-shell .squisq-editor-shell .squisq-view-menu-row:hover,
5434
- .db-shell .squisq-editor-shell .squisq-view-menu-radio-row:hover {
5511
+ html:has(.db-shell) .squisq-view-menu-row:hover,
5512
+ html:has(.db-shell) .squisq-view-menu-radio-row:hover {
5435
5513
  background: var(--db-bg-hover);
5436
5514
  }
5437
5515
 
5438
- .db-shell .squisq-editor-shell .squisq-view-menu-row--select:hover,
5439
- .db-shell .squisq-editor-shell .squisq-view-menu-row--radios:hover {
5516
+ html:has(.db-shell) .squisq-view-menu-row--select:hover,
5517
+ html:has(.db-shell) .squisq-view-menu-row--radios:hover {
5440
5518
  background: transparent;
5441
5519
  }
5442
5520
 
5443
- .db-shell .squisq-editor-shell .squisq-view-menu-row--select .squisq-view-menu-label,
5444
- .db-shell .squisq-editor-shell .squisq-view-menu-row--radios > .squisq-view-menu-label {
5521
+ html:has(.db-shell) .squisq-view-menu-row--select .squisq-view-menu-label,
5522
+ html:has(.db-shell) .squisq-view-menu-row--radios > .squisq-view-menu-label {
5445
5523
  color: var(--db-text-muted);
5446
5524
  }
5447
5525
 
5448
- .db-shell .squisq-editor-shell .squisq-view-menu-select {
5526
+ html:has(.db-shell) .squisq-view-menu-select {
5449
5527
  background: var(--db-bg-subtle);
5450
5528
  border-color: var(--db-border);
5451
5529
  color: var(--db-text-secondary);
5452
5530
  }
5453
5531
 
5454
- .db-shell .squisq-editor-shell .squisq-view-menu-separator {
5532
+ html:has(.db-shell) .squisq-view-menu-separator {
5455
5533
  background: var(--db-border);
5456
5534
  }
5457
5535
 
5458
- .db-shell .squisq-editor-shell :is(.squisq-view-menu-checkbox, .squisq-view-menu-radio) {
5536
+ html:has(.db-shell) :is(.squisq-view-menu-checkbox, .squisq-view-menu-radio) {
5459
5537
  accent-color: var(--db-accent);
5460
5538
  }
5461
5539
 
@@ -5539,7 +5617,7 @@ html:has(.db-shell[data-theme='dark'])
5539
5617
  }
5540
5618
 
5541
5619
  .db-shell[data-theme='dark'] .squisq-version-history-popover {
5542
- background: var(--db-bg);
5620
+ background: var(--db-bg-raised);
5543
5621
  border-color: var(--db-border);
5544
5622
  color: var(--db-text);
5545
5623
  }
@@ -5578,7 +5656,7 @@ html:has(.db-shell[data-theme='dark'])
5578
5656
  gap: 12px;
5579
5657
  max-width: min(640px, calc(100% - 32px));
5580
5658
  padding: 10px 10px 10px 16px;
5581
- background: var(--db-bg);
5659
+ background: var(--db-bg-raised);
5582
5660
  border: 1px solid var(--db-border-strong);
5583
5661
  border-radius: 10px;
5584
5662
  box-shadow: 0 10px 32px var(--db-shadow);
@@ -6229,7 +6307,7 @@ html:has(.db-shell[data-theme='dark'])
6229
6307
  box-sizing: border-box;
6230
6308
  overflow-y: auto;
6231
6309
  border-left: 1px solid var(--db-border-strong);
6232
- background: var(--db-bg);
6310
+ background: var(--db-bg-raised);
6233
6311
  color: var(--db-text-secondary);
6234
6312
  font: 13px/1.45 var(--db-ui-font);
6235
6313
  }
@@ -6252,7 +6330,7 @@ html:has(.db-shell[data-theme='dark'])
6252
6330
  gap: 12px;
6253
6331
  padding: 14px 14px 10px;
6254
6332
  border-bottom: 1px solid var(--db-border);
6255
- background: var(--db-bg);
6333
+ background: var(--db-bg-raised);
6256
6334
  }
6257
6335
 
6258
6336
  .db-ai-review-header h2 {
@@ -6675,7 +6753,7 @@ html:has(.db-shell[data-theme='dark'])
6675
6753
  left: 8px;
6676
6754
  right: 8px;
6677
6755
  z-index: 100;
6678
- background: var(--db-bg);
6756
+ background: var(--db-bg-raised);
6679
6757
  border: 1px solid var(--db-border);
6680
6758
  border-radius: 6px;
6681
6759
  box-shadow: 0 4px 12px var(--db-shadow);
@@ -6884,6 +6962,91 @@ button.db-git-file-row:hover {
6884
6962
  margin: 10px 0;
6885
6963
  }
6886
6964
 
6965
+ .db-new-document-hint {
6966
+ grid-column: 2;
6967
+ margin: -4px 0 0;
6968
+ color: var(--db-text-muted);
6969
+ font-size: 12px;
6970
+ line-height: 1.4;
6971
+ }
6972
+
6973
+ /* ── Keyboard shortcut sheet ─────────────────────────────────── */
6974
+
6975
+ /* Two columns of sections on a desktop screen, so the sheet reads at a
6976
+ glance instead of scrolling; one column on narrow windows. */
6977
+ .db-dialog.db-shortcuts-dialog {
6978
+ width: 780px;
6979
+ max-height: min(calc(100dvh - 32px), 780px);
6980
+ }
6981
+
6982
+ .db-shortcuts {
6983
+ display: grid;
6984
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
6985
+ gap: 18px 32px;
6986
+ align-items: start;
6987
+ }
6988
+
6989
+ .db-shortcuts:focus-visible {
6990
+ outline: 2px solid var(--db-focus);
6991
+ outline-offset: 4px;
6992
+ }
6993
+
6994
+ .db-shortcuts-heading {
6995
+ margin: 0 0 6px;
6996
+ color: var(--db-text);
6997
+ font-size: 13px;
6998
+ font-weight: 600;
6999
+ }
7000
+
7001
+ .db-shortcuts-list {
7002
+ margin: 0;
7003
+ }
7004
+
7005
+ .db-shortcuts-row {
7006
+ display: flex;
7007
+ align-items: baseline;
7008
+ justify-content: space-between;
7009
+ gap: 12px;
7010
+ padding: 4px 0;
7011
+ border-bottom: 1px solid var(--db-border);
7012
+ }
7013
+
7014
+ .db-shortcuts-action {
7015
+ color: var(--db-text-secondary);
7016
+ font-size: 13px;
7017
+ }
7018
+
7019
+ .db-shortcuts-keys {
7020
+ display: flex;
7021
+ flex-wrap: wrap;
7022
+ align-items: baseline;
7023
+ justify-content: flex-end;
7024
+ gap: 4px;
7025
+ margin: 0;
7026
+ white-space: nowrap;
7027
+ }
7028
+
7029
+ .db-shortcuts-or {
7030
+ color: var(--db-text-muted);
7031
+ font-size: 12px;
7032
+ }
7033
+
7034
+ .db-shortcuts-chord kbd {
7035
+ display: inline-block;
7036
+ min-width: 1.6em;
7037
+ margin-left: 2px;
7038
+ padding: 1px 5px;
7039
+ border: 1px solid var(--db-border-strong);
7040
+ border-bottom-width: 2px;
7041
+ border-radius: 4px;
7042
+ background: var(--db-bg-subtle);
7043
+ color: var(--db-text);
7044
+ font: inherit;
7045
+ font-size: 12px;
7046
+ line-height: 1.4;
7047
+ text-align: center;
7048
+ }
7049
+
6887
7050
  .db-git-form-error,
6888
7051
  .db-export-error {
6889
7052
  margin: 8px 0 0;
@@ -7419,6 +7582,42 @@ button.db-git-file-row:hover {
7419
7582
  color: var(--db-text-muted);
7420
7583
  overflow-wrap: anywhere;
7421
7584
  }
7585
+ .db-presentation-beat-tags {
7586
+ display: flex;
7587
+ flex-wrap: wrap;
7588
+ gap: 6px;
7589
+ max-width: 100%;
7590
+ }
7591
+ /* Marks the slide a request is open for, then every slide with AI wording. */
7592
+ .db-presentation-beats small.db-presentation-beat-ai {
7593
+ display: inline-flex;
7594
+ align-items: center;
7595
+ gap: 5px;
7596
+ background: var(--db-accent-soft-12);
7597
+ color: var(--db-accent-deep);
7598
+ }
7599
+ .db-presentation-beat-ai .db-ai-spinner {
7600
+ width: 10px;
7601
+ height: 10px;
7602
+ flex-basis: 10px;
7603
+ }
7604
+ /* While slides are being suggested, this takes the Suggest button's place in
7605
+ the footer, with Stop beside it, so progress sits where the action started. */
7606
+ .db-presentation-progress {
7607
+ display: inline-flex;
7608
+ align-items: center;
7609
+ flex-wrap: wrap;
7610
+ gap: 8px;
7611
+ min-width: 0;
7612
+ min-height: var(--db-target-min);
7613
+ color: var(--db-text-secondary);
7614
+ font: 600 12px/1.2 var(--db-ui-font);
7615
+ }
7616
+ .db-presentation-progress progress {
7617
+ width: 120px;
7618
+ height: 6px;
7619
+ accent-color: var(--db-accent);
7620
+ }
7422
7621
  .db-presentation label.db-presentation-toggle {
7423
7622
  display: flex;
7424
7623
  flex-direction: row;