@bendyline/docblocks-react 2.5.0 → 2.6.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.
@@ -13,6 +13,12 @@
13
13
  `--db-accent-tint-strong`, `--db-accent-deep`) are defined alongside so every place that needs
14
14
  a tinted background or a readable-on-tint text color pulls from the
15
15
  same source of truth. */
16
+ /* The palette binds on the document root as well as on the shell. Squisq
17
+ mounts its menus, dialogs and flyouts in PORTALS on <body>, outside the
18
+ shell — without a root binding they cannot see --db-*, which is why the
19
+ editor chrome used to need per-menu patches further down. The root
20
+ follows whichever appearance the shell in the page resolved to. */
21
+ :root,
16
22
  .db-shell {
17
23
  --db-bg: #ffffff;
18
24
  --db-bg-subtle: #f3eede;
@@ -45,9 +51,16 @@
45
51
  --db-badge-bg: #f3eede;
46
52
  --db-badge-text: #3d3220;
47
53
  --db-badge-text-hover: #2a2419;
48
- /* Outline pane + inline-preview gutter background. Sits one step
49
- lighter than the toolbar (`--db-accent-tint-strong`) so the chrome
50
- panes read as distinct from the action bar above the canvas. */
54
+ /* The editor "desk": every chrome surface the page floats on — the
55
+ outline pane, the inline-preview gutter, the Monaco line-number
56
+ margin, and (via `--squisq-desk-bg`) the field behind the WYSIWYG
57
+ page in light mode. Squisq's own default for that field is a cool
58
+ `#dcd8d0`, which read as a grey slab against this cream palette;
59
+ binding it here keeps the whole editor area one continuous tone.
60
+ Dark mode re-points that one field at `--db-editor-canvas` so the
61
+ page still sits lighter than what it floats on.
62
+ Sits one step lighter than the toolbar (`--db-accent-tint-strong`)
63
+ so the chrome still reads as distinct from the action bar. */
51
64
  --db-gutter-bg: #efe8d4;
52
65
  --db-input-border: #c4b693;
53
66
  --db-danger: #b22b1b;
@@ -64,6 +77,7 @@
64
77
  --db-git-conflicted: #b22b1b;
65
78
  }
66
79
 
80
+ :root:has(.db-shell[data-theme='dark']),
67
81
  .db-shell[data-theme='dark'] {
68
82
  --db-bg: #1a1812;
69
83
  --db-bg-subtle: #262219;
@@ -97,10 +111,12 @@
97
111
  --db-danger-bg: #1c1917;
98
112
  --db-text-on-danger: #1c1917;
99
113
  --db-shadow: rgba(0, 0, 0, 0.4);
100
- /* In dark mode, "lighter than the toolbar" means brighter so this
101
- sits a step above `--db-accent-tint-strong` instead of between it
102
- and tint. */
103
- --db-gutter-bg: #4a4538;
114
+ /* Dark mode reads contrast the other way round: a pane lighter than
115
+ the toolbar becomes a lit slab beside a near-black canvas. So the
116
+ desk recedes to the same tone as `--db-editor-canvas` — the field
117
+ the page already floats on — and the panes flanking that field
118
+ match it instead of bracketing it in a brighter frame. */
119
+ --db-gutter-bg: #16110b;
104
120
  --db-git-modified: #e5b567;
105
121
  --db-git-added: #81c784;
106
122
  --db-git-untracked: #81c784;
@@ -110,6 +126,7 @@
110
126
  }
111
127
 
112
128
  @media (prefers-color-scheme: dark) {
129
+ :root:has(.db-shell:not([data-theme='light'])),
113
130
  .db-shell:not([data-theme='light']) {
114
131
  --db-bg: #1a1812;
115
132
  --db-bg-subtle: #262219;
@@ -138,7 +155,7 @@
138
155
  --db-danger-bg: #1c1917;
139
156
  --db-text-on-danger: #1c1917;
140
157
  --db-shadow: rgba(0, 0, 0, 0.4);
141
- --db-gutter-bg: #4a4538;
158
+ --db-gutter-bg: #16110b;
142
159
  --db-git-modified: #e5b567;
143
160
  --db-git-added: #81c784;
144
161
  --db-git-untracked: #81c784;
@@ -496,14 +513,25 @@
496
513
  /* ── New Item Input ──────────────────────────────────────────── */
497
514
 
498
515
  .db-new-item {
499
- padding: 4px 8px;
516
+ padding: 8px;
500
517
  border-bottom: 1px solid var(--db-border);
501
518
  }
502
519
 
503
520
  .db-new-item-row {
504
521
  display: flex;
505
522
  align-items: center;
506
- gap: 4px;
523
+ gap: 6px;
524
+ }
525
+
526
+ .db-new-item-row--file {
527
+ display: grid;
528
+ align-items: stretch;
529
+ }
530
+
531
+ .db-new-item-file-controls {
532
+ display: flex;
533
+ align-items: stretch;
534
+ gap: 6px;
507
535
  }
508
536
 
509
537
  .db-new-item-input {
@@ -533,15 +561,23 @@
533
561
  border-color: var(--db-danger);
534
562
  }
535
563
 
536
- .db-new-item-add:focus-visible {
564
+ .db-new-item-add:focus-visible,
565
+ .db-new-item-format:focus-visible {
537
566
  outline: 2px solid var(--db-focus);
538
567
  outline-offset: 1px;
539
568
  }
540
569
 
541
- .db-new-item-suffix {
570
+ .db-new-item-format {
571
+ flex: 1;
572
+ min-width: 0;
573
+ box-sizing: border-box;
574
+ padding: 4px 24px 4px 7px;
575
+ font: inherit;
542
576
  font-size: 12px;
543
- color: var(--db-text-muted);
544
- flex-shrink: 0;
577
+ background: var(--db-bg);
578
+ color: var(--db-text);
579
+ border: 1px solid var(--db-input-border);
580
+ border-radius: 3px;
545
581
  }
546
582
 
547
583
  .db-new-item-add {
@@ -560,6 +596,7 @@
560
596
  }
561
597
 
562
598
  .db-new-item-input:disabled,
599
+ .db-new-item-format:disabled,
563
600
  .db-new-item-add:disabled {
564
601
  cursor: default;
565
602
  opacity: 0.65;
@@ -1262,6 +1299,62 @@
1262
1299
  flex-direction: column;
1263
1300
  overflow: hidden;
1264
1301
  flex-shrink: 0;
1302
+ position: relative;
1303
+ }
1304
+
1305
+ .db-sidebar-collapse-preview {
1306
+ position: absolute;
1307
+ inset: 0;
1308
+ z-index: 20;
1309
+ display: flex;
1310
+ flex-direction: column;
1311
+ align-items: center;
1312
+ justify-content: center;
1313
+ gap: 12px;
1314
+ pointer-events: none;
1315
+ visibility: hidden;
1316
+ opacity: 0;
1317
+ background: color-mix(in srgb, var(--db-bg) 78%, transparent);
1318
+ color: var(--db-text);
1319
+ backdrop-filter: blur(1px) grayscale(0.3);
1320
+ transition:
1321
+ opacity 120ms ease,
1322
+ visibility 0s linear 120ms;
1323
+ }
1324
+
1325
+ .db-shell-sidebar--collapse-preview .db-sidebar-collapse-preview {
1326
+ visibility: visible;
1327
+ opacity: 1;
1328
+ transition-delay: 0s;
1329
+ }
1330
+
1331
+ .db-sidebar-collapse-preview-icon {
1332
+ box-sizing: border-box;
1333
+ display: flex;
1334
+ align-items: center;
1335
+ justify-content: center;
1336
+ width: 88px;
1337
+ height: 88px;
1338
+ border: 1px solid var(--db-border-strong);
1339
+ border-radius: 22px;
1340
+ background: var(--db-bg-subtle);
1341
+ color: var(--db-accent);
1342
+ box-shadow: 0 10px 30px var(--db-shadow);
1343
+ }
1344
+
1345
+ .db-sidebar-collapse-preview-icon svg {
1346
+ width: 64px;
1347
+ height: 64px;
1348
+ }
1349
+
1350
+ .db-sidebar-collapse-preview-label {
1351
+ padding: 5px 10px;
1352
+ border-radius: 999px;
1353
+ background: var(--db-bg-subtle);
1354
+ box-shadow: 0 4px 14px var(--db-shadow);
1355
+ color: var(--db-text-secondary);
1356
+ font-size: 13px;
1357
+ font-weight: 600;
1265
1358
  }
1266
1359
 
1267
1360
  /* Drag handle between sidebar and editor. The visible line is the
@@ -1511,10 +1604,10 @@ body.db-resizing-sidebar * {
1511
1604
  }
1512
1605
 
1513
1606
  /* The compact editor uses two deliberate toolbar rows: navigation/views on
1514
- top and actions below. Squisq's formatting actions remain available through
1515
- its measured More menu; hiding their inline copies removes clipped,
1516
- keyboard-focusable controls while leaving room for versioning, document
1517
- settings, Files, and DocBlocks' Export and share control. */
1607
+ top and actions below. The second row keeps versioning, document settings,
1608
+ Files, and DocBlocks' Export and share control at its right; Squisq's
1609
+ formatting actions fill whatever width is left over and spill the remainder
1610
+ into its measured More menu. */
1518
1611
  .db-shell--mobile .squisq-toolbar {
1519
1612
  min-height: 88px;
1520
1613
  flex-wrap: wrap;
@@ -1538,25 +1631,26 @@ body.db-resizing-sidebar * {
1538
1631
  height: 44px;
1539
1632
  }
1540
1633
 
1634
+ /* A zero flex basis keeps the actions row out of flex line-breaking — its
1635
+ intrinsic width is far wider than the row, and breaking uses the base size,
1636
+ so any other basis would push the right-side controls onto a third row.
1637
+ Growing from zero then hands it every pixel the fixed controls leave. */
1541
1638
  .db-shell--mobile .squisq-toolbar-actions {
1542
- flex: 0 1 0;
1543
- width: 0;
1639
+ flex: 1 1 0;
1640
+ min-width: 0;
1544
1641
  height: 44px;
1545
1642
  }
1546
1643
 
1547
- .db-shell--mobile .squisq-toolbar-actions > * {
1548
- visibility: hidden;
1549
- }
1550
-
1551
1644
  .db-shell--mobile .squisq-toolbar-overflow,
1552
1645
  .db-shell--mobile .squisq-toolbar > .squisq-toolbar-button,
1553
1646
  .db-shell--mobile .squisq-toolbar > .db-toolbar-menu {
1554
1647
  flex: 0 0 auto;
1555
1648
  }
1556
1649
 
1557
- /* The compact layout moves Squisq's overflow trigger to the left edge of
1558
- the second row. Its desktop right-aligned placement can consequently put
1559
- the menu off-canvas, so anchor the mobile popover to the viewport instead. */
1650
+ /* The compact layout puts Squisq's overflow trigger part-way along the second
1651
+ row, wherever the formatting buttons stop. Its desktop right-aligned
1652
+ placement would hang the menu off-canvas from there, so anchor the mobile
1653
+ popover to the viewport instead. */
1560
1654
  .db-shell--mobile .squisq-editor-shell .squisq-toolbar-overflow-menu {
1561
1655
  right: auto !important;
1562
1656
  left: max(4px, env(safe-area-inset-left)) !important;
@@ -1565,6 +1659,32 @@ body.db-resizing-sidebar * {
1565
1659
  overflow-y: auto;
1566
1660
  }
1567
1661
 
1662
+ /* A wide sidebar or a narrow window can leave the editor pane too small for
1663
+ the view tabs, formatting controls, and host controls to share one row —
1664
+ the actions lane is the only flexible item, so it is what gets squeezed to
1665
+ nothing. Past the measured pane width the view tabs take a row of their own
1666
+ and everything else drops below them: the same two-row shape the compact
1667
+ layout uses, without giving up the split view. The shell class comes from a
1668
+ ResizeObserver on the editor pane, so dragging the sidebar is handled too.
1669
+ Electron overrides the row height to line these rows up with its native
1670
+ caption buttons; see packages/desktop/renderer/titlebar.css. */
1671
+ .db-shell--desktop-toolbar-wrapped:not(.db-shell--mobile) {
1672
+ --db-toolbar-wrapped-row: 44px;
1673
+ }
1674
+
1675
+ .db-shell--desktop-toolbar-wrapped:not(.db-shell--mobile) .squisq-toolbar {
1676
+ min-height: calc(var(--db-toolbar-wrapped-row) * 2);
1677
+ flex-wrap: wrap;
1678
+ align-content: stretch;
1679
+ }
1680
+
1681
+ .db-shell--desktop-toolbar-wrapped:not(.db-shell--mobile) .squisq-toolbar-view-tabs {
1682
+ box-sizing: border-box;
1683
+ flex: 0 0 100%;
1684
+ width: 100%;
1685
+ height: var(--db-toolbar-wrapped-row);
1686
+ }
1687
+
1568
1688
  .db-mobile-back {
1569
1689
  display: flex;
1570
1690
  align-items: center;
@@ -2894,21 +3014,95 @@ body.db-resizing-sidebar * {
2894
3014
  background: var(--db-editor-canvas);
2895
3015
  }
2896
3016
 
2897
- /* Bind Squisq's host-facing accent to the active DocBlocks appearance.
2898
- RawEditor uses the editor background/foreground variables for its
2899
- textarea while Monaco's first lazy load is in flight. Define them here so
2900
- Source view never paints Squisq's light fallback before the requested
2901
- Monaco theme is ready. */
2902
- .db-shell .squisq-editor-shell {
3017
+ /* ── Squisq chrome palette DocBlocks ────────────────────────── */
3018
+ /* Squisq declares its whole editor-chrome palette as `--squisq-*` tokens
3019
+ (see squisq's docs/theming.md), inside `:where()` at zero specificity so
3020
+ a host can rebind it. This block is that rebinding, and it is the seam the
3021
+ older per-selector patches below were standing in for — bind a token here
3022
+ rather than adding another `.db-shell .squisq-thing` rule.
3023
+
3024
+ The selector list mirrors squisq's own. `:root` covers the app; the bare
3025
+ `[data-theme]` covers the editor shell AND the menus, dialogs and flyouts
3026
+ that portal to <body>. Those stamp their own `data-theme`, which is what
3027
+ squisq keys its dark values off — and a declaration ON an element beats
3028
+ one inherited from an ancestor, so a `:root`-only binding would leave
3029
+ squisq's slate/blue winning inside the shell. */
3030
+ :root,
3031
+ [data-theme] {
3032
+ /* Ink. DocBlocks has four ink steps to squisq's five. */
3033
+ --squisq-text-strong: var(--db-text);
3034
+ --squisq-text: var(--db-text);
3035
+ --squisq-text-soft: var(--db-text-secondary);
3036
+ --squisq-text-muted: var(--db-text-muted);
3037
+ --squisq-text-faint: var(--db-text-placeholder);
3038
+
3039
+ /* Surfaces. */
3040
+ --squisq-bg: var(--db-bg-subtle);
3041
+ --squisq-surface: var(--db-bg);
3042
+ --squisq-surface-subtle: var(--db-bg-subtle);
3043
+ --squisq-surface-sunken: var(--db-bg-subtle);
3044
+ --squisq-surface-hover: var(--db-bg-hover);
3045
+ --squisq-surface-raised: var(--db-bg-hover);
3046
+ --squisq-input-bg: var(--db-bg);
3047
+ --squisq-row-hover: var(--db-bg-hover);
3048
+ --squisq-hover-bg: var(--db-bg-hover);
3049
+ --squisq-panel-bg: var(--db-bg);
3050
+
3051
+ /* The desk the editing page floats on — the WYSIWYG backing, the block
3052
+ card and its preview panel, the outline pane, the Monaco margin. */
3053
+ --squisq-desk-bg: var(--db-gutter-bg);
3054
+ --squisq-desk-rail: var(--db-bg-subtle);
3055
+ --squisq-desk-border: var(--db-border);
3056
+
3057
+ --squisq-border-subtle: var(--db-border);
3058
+ --squisq-border: var(--db-border-strong);
3059
+ --squisq-border-strong: var(--db-border-strong);
3060
+
3061
+ /* Accent. `--db-accent` is also the selected-row fill, so the focus ring
3062
+ deliberately points at `--db-focus` — a ring the same color as the fill
3063
+ it sits on is invisible. */
2903
3064
  --squisq-accent: var(--db-accent);
2904
3065
  --squisq-accent-hover: var(--db-accent-hover);
3066
+ --squisq-accent-strong: var(--db-accent-deep);
3067
+ --squisq-accent-soft: var(--db-accent-tint-strong);
3068
+ --squisq-accent-subtle: var(--db-accent-soft-12);
3069
+ --squisq-accent-border: var(--db-accent-soft-25);
2905
3070
  --squisq-text-on-accent: var(--db-text-on-accent);
2906
- /* Hover/open surface for toolbar dropdown triggers (e.g. the cover-slide
2907
- control). Squisq leaves this token undefined and falls back to its own
2908
- palette; bind it so the open trigger keeps DocBlocks hover contrast. */
2909
- --squisq-hover-bg: var(--db-bg-hover);
2910
- --squisq-editor-background: #ffffff;
2911
- --squisq-editor-foreground: #1f2937;
3071
+ --squisq-focus-ring: var(--db-focus);
3072
+
3073
+ --squisq-danger: var(--db-danger);
3074
+ --squisq-danger-hover: var(--db-danger);
3075
+ --squisq-danger-strong: var(--db-danger);
3076
+ --squisq-danger-soft: var(--db-danger-bg);
3077
+ --squisq-danger-border: var(--db-danger);
3078
+ --squisq-text-on-danger: var(--db-text-on-danger);
3079
+
3080
+ /* Advisory and success reuse the git-status hues, which are already the
3081
+ app's vocabulary for "changed" and "added". */
3082
+ --squisq-warning: var(--db-git-modified);
3083
+ --squisq-warning-hover: var(--db-git-modified);
3084
+ --squisq-warning-strong: var(--db-git-modified);
3085
+ --squisq-warning-soft: var(--db-bg-subtle);
3086
+ --squisq-warning-border: var(--db-git-modified);
3087
+ --squisq-success: var(--db-git-added);
3088
+ --squisq-success-border: var(--db-git-added);
3089
+
3090
+ --squisq-shadow-rgb: 40 30 15;
3091
+
3092
+ /* Monaco's canvas while its lazy load is in flight — without these,
3093
+ Source view paints squisq's white fallback before the requested Monaco
3094
+ theme is ready, which reads as a flash. */
3095
+ --squisq-editor-background: var(--db-editor-canvas);
3096
+ --squisq-editor-foreground: var(--db-text);
3097
+ }
3098
+
3099
+ /* Match Monaco's built-in vs-dark canvas exactly so replacing the loading
3100
+ textarea with Monaco does not introduce a second, subtler color flash. */
3101
+ :root:has(.db-shell[data-theme='dark']),
3102
+ .db-shell[data-theme='dark'],
3103
+ .squisq-editor-shell[data-theme='dark'] {
3104
+ --squisq-editor-background: #1e1e1e;
3105
+ --squisq-editor-foreground: #d4d4d4;
2912
3106
  }
2913
3107
 
2914
3108
  /* Squisq's segmented mode controls otherwise retain their standalone
@@ -2946,13 +3140,6 @@ body.db-resizing-sidebar * {
2946
3140
  outline-offset: -2px;
2947
3141
  }
2948
3142
 
2949
- .db-shell .squisq-editor-shell[data-theme='dark'] {
2950
- /* Match Monaco's built-in vs-dark canvas exactly so replacing the loading
2951
- textarea with Monaco does not introduce a second, subtler color flash. */
2952
- --squisq-editor-background: #1e1e1e;
2953
- --squisq-editor-foreground: #d4d4d4;
2954
- }
2955
-
2956
3143
  /* The Write-canvas font picker is an explicit host preference, so its
2957
3144
  variables must beat the active document theme in Write mode. Squisq's base
2958
3145
  stylesheet intentionally puts theme fonts first; reverse that order only
@@ -2996,6 +3183,27 @@ body.db-resizing-sidebar * {
2996
3183
  --squisq-text-muted: var(--db-text-muted);
2997
3184
  }
2998
3185
 
3186
+ /* ── Editor desk ─────────────────────────────────────────────── */
3187
+ /* Squisq paints its outline pane, block card, block-preview panel, and the
3188
+ field behind the WYSIWYG page from one `--squisq-desk-bg` token — the
3189
+ "desk" the page floats on. Bind it to the DocBlocks desk tone once, and
3190
+ paint those surfaces from it here as well so the pairing also holds
3191
+ against a published squisq predating the token. Anything that wants to
3192
+ sit apart from the desk shades from `--db-gutter-bg`; it should not pick
3193
+ a tone of its own, which is how the panes drifted into slabs that read
3194
+ as brighter chrome rather than as the surface under the page.
3195
+ (The inline-preview gutter is left to `--squisq-preview-gutter-bg`,
3196
+ bound to the same value below, so hosts can still peel it off.) */
3197
+ .db-shell .squisq-editor-shell {
3198
+ --squisq-desk-bg: var(--db-gutter-bg);
3199
+ }
3200
+
3201
+ .db-shell
3202
+ .squisq-editor-shell
3203
+ :is(.squisq-wysiwyg-container, .squisq-block-card, .squisq-block-preview-panel, .squisq-outline) {
3204
+ background: var(--squisq-desk-bg);
3205
+ }
3206
+
2999
3207
  /* ── Inline preview gutter: thematic green ──────────────────── */
3000
3208
  /* Rebind squisq's `--squisq-preview-*` custom properties so the
3001
3209
  gutter chrome (vertical bracket, diagonal connector + dots,
@@ -3055,10 +3263,6 @@ body.db-resizing-sidebar * {
3055
3263
  background: var(--db-bg);
3056
3264
  }
3057
3265
 
3058
- .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-container {
3059
- background: var(--db-editor-canvas);
3060
- }
3061
-
3062
3266
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor {
3063
3267
  background: var(--db-bg);
3064
3268
  }
@@ -3414,7 +3618,7 @@ html:has(.db-shell[data-theme='dark']) {
3414
3618
  --db-accent-soft-25: rgba(200, 180, 143, 0.28);
3415
3619
  --db-accent-tint-strong: #3a382e;
3416
3620
  --db-accent-deep: #e6dcc0;
3417
- --db-gutter-bg: #4a4538;
3621
+ --db-gutter-bg: #16110b;
3418
3622
  }
3419
3623
 
3420
3624
  html:has(.db-shell[data-theme='light']) {
@@ -3515,7 +3719,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='green']) {
3515
3719
  --db-text-on-selected: #e2ebe4;
3516
3720
  --db-accent-tint-strong: #2f4034;
3517
3721
  --db-accent-deep: #d4e8d9;
3518
- --db-gutter-bg: #3b4d40;
3722
+ --db-gutter-bg: #0e1510;
3519
3723
  --db-input-border: #9ec2a8;
3520
3724
  --db-editor-canvas: #0e1510;
3521
3725
  --db-badge-bg: #294031;
@@ -3564,7 +3768,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='blue']) {
3564
3768
  --db-text-on-selected: #e2e8ef;
3565
3769
  --db-accent-tint-strong: #2e3b49;
3566
3770
  --db-accent-deep: #d8e5f2;
3567
- --db-gutter-bg: #394858;
3771
+ --db-gutter-bg: #0f1318;
3568
3772
  --db-input-border: #a7bdd8;
3569
3773
  --db-editor-canvas: #0f1318;
3570
3774
  --db-badge-bg: #28394a;
@@ -3613,7 +3817,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='purple']) {
3613
3817
  --db-text-on-selected: #ece3ef;
3614
3818
  --db-accent-tint-strong: #413348;
3615
3819
  --db-accent-deep: #eadcf1;
3616
- --db-gutter-bg: #493b50;
3820
+ --db-gutter-bg: #120f15;
3617
3821
  --db-input-border: #c2a9d4;
3618
3822
  --db-editor-canvas: #120f15;
3619
3823
  --db-badge-bg: #3b2a44;
@@ -3662,7 +3866,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='maroon']) {
3662
3866
  --db-text-on-selected: #f0e3e7;
3663
3867
  --db-accent-tint-strong: #473139;
3664
3868
  --db-accent-deep: #f0d8e0;
3665
- --db-gutter-bg: #503b42;
3869
+ --db-gutter-bg: #150e11;
3666
3870
  --db-input-border: #d0a5b4;
3667
3871
  --db-editor-canvas: #150e11;
3668
3872
  --db-badge-bg: #442832;
@@ -3711,7 +3915,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='orange']) {
3711
3915
  --db-text-on-selected: #f0e7dc;
3712
3916
  --db-accent-tint-strong: #493a2a;
3713
3917
  --db-accent-deep: #f1dbc4;
3714
- --db-gutter-bg: #514333;
3918
+ --db-gutter-bg: #15100c;
3715
3919
  --db-input-border: #d7b08a;
3716
3920
  --db-editor-canvas: #15100c;
3717
3921
  --db-badge-bg: #44301f;
@@ -3760,7 +3964,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='gray']) {
3760
3964
  --db-text-on-selected: #e8e8e8;
3761
3965
  --db-accent-tint-strong: #383838;
3762
3966
  --db-accent-deep: #e2e2e2;
3763
- --db-gutter-bg: #444444;
3967
+ --db-gutter-bg: #111111;
3764
3968
  --db-input-border: #b8b8b8;
3765
3969
  --db-editor-canvas: #111111;
3766
3970
  --db-badge-bg: #333333;
@@ -3839,8 +4043,14 @@ html:has(.db-shell) .squisq-cover-slide-menu {
3839
4043
  /* Custom layout authoring is portaled to document.body. Bind its host-facing
3840
4044
  accent tokens at that portal boundary so selected layouts, palette states,
3841
4045
  primary actions, and focus rings follow the active DocBlocks accent instead
3842
- of Squisq's standalone indigo defaults. */
3843
- html:has(.db-shell) :is(.squisq-template-designer-overlay, .squisq-layout-manager-overlay) {
4046
+ of Squisq's standalone indigo defaults. Squisq repeats `data-theme` on the
4047
+ nested layout-manager panel, so that second theme root needs the same bridge. */
4048
+ html:has(.db-shell)
4049
+ :is(
4050
+ .squisq-template-designer-overlay,
4051
+ .squisq-layout-manager-overlay,
4052
+ .squisq-layout-manager-panel
4053
+ ) {
3844
4054
  --squisq-layout-accent-text: var(--db-accent-hover);
3845
4055
  --squisq-layout-accent-bg: var(--db-accent);
3846
4056
  --squisq-layout-accent-bg-hover: var(--db-accent-hover);
@@ -3852,13 +4062,21 @@ html:has(.db-shell) :is(.squisq-template-designer-overlay, .squisq-layout-manage
3852
4062
  }
3853
4063
 
3854
4064
  html:has(.db-shell)
3855
- :is(.squisq-template-designer-overlay, .squisq-layout-manager-overlay)
4065
+ :is(
4066
+ .squisq-template-designer-overlay,
4067
+ .squisq-layout-manager-overlay,
4068
+ .squisq-layout-manager-panel
4069
+ )
3856
4070
  .squisq-template-designer-btn--primary {
3857
4071
  color: var(--db-text-on-accent);
3858
4072
  }
3859
4073
 
3860
4074
  html:has(.db-shell)
3861
- :is(.squisq-template-designer-overlay, .squisq-layout-manager-overlay)
4075
+ :is(
4076
+ .squisq-template-designer-overlay,
4077
+ .squisq-layout-manager-overlay,
4078
+ .squisq-layout-manager-panel
4079
+ )
3862
4080
  .squisq-template-designer-field
3863
4081
  input:focus {
3864
4082
  box-shadow: 0 0 0 3px var(--db-accent-soft-25);
@@ -4200,7 +4418,7 @@ html:has(.db-shell)
4200
4418
  color: var(--squisq-template-gallery-section-title);
4201
4419
  }
4202
4420
 
4203
- html:has(.db-shell[data-theme='dark']) #squisq-template-gallery-portal {
4421
+ html:has(.db-shell[data-theme='dark']) [data-squisq-template-gallery-portal] {
4204
4422
  background: var(--db-bg-subtle);
4205
4423
  border-color: var(--db-border);
4206
4424
  box-shadow:
@@ -4209,46 +4427,46 @@ html:has(.db-shell[data-theme='dark']) #squisq-template-gallery-portal {
4209
4427
  }
4210
4428
 
4211
4429
  html:has(.db-shell[data-theme='dark'])
4212
- #squisq-template-gallery-portal
4430
+ [data-squisq-template-gallery-portal]
4213
4431
  .squisq-template-gallery-none {
4214
4432
  background: transparent;
4215
4433
  border-color: var(--db-border);
4216
4434
  }
4217
4435
 
4218
4436
  html:has(.db-shell[data-theme='dark'])
4219
- #squisq-template-gallery-portal
4437
+ [data-squisq-template-gallery-portal]
4220
4438
  .squisq-template-gallery-none:hover {
4221
4439
  background: var(--db-bg-hover);
4222
4440
  }
4223
4441
 
4224
4442
  html:has(.db-shell[data-theme='dark'])
4225
- #squisq-template-gallery-portal
4443
+ [data-squisq-template-gallery-portal]
4226
4444
  .squisq-template-gallery-none.squisq-template-gallery-card--selected {
4227
4445
  background: var(--db-accent-tint-strong);
4228
4446
  border-color: var(--db-accent);
4229
4447
  }
4230
4448
 
4231
4449
  html:has(.db-shell[data-theme='dark'])
4232
- #squisq-template-gallery-portal
4450
+ [data-squisq-template-gallery-portal]
4233
4451
  .squisq-template-gallery-none-label {
4234
4452
  color: var(--db-text);
4235
4453
  }
4236
4454
 
4237
4455
  html:has(.db-shell[data-theme='dark'])
4238
- #squisq-template-gallery-portal
4456
+ [data-squisq-template-gallery-portal]
4239
4457
  .squisq-template-gallery-none-desc {
4240
4458
  color: var(--db-text-muted);
4241
4459
  }
4242
4460
 
4243
4461
  html:has(.db-shell[data-theme='dark'])
4244
- #squisq-template-gallery-portal
4462
+ [data-squisq-template-gallery-portal]
4245
4463
  .squisq-template-gallery-card {
4246
4464
  background: transparent;
4247
4465
  border-color: var(--db-border);
4248
4466
  }
4249
4467
 
4250
4468
  html:has(.db-shell[data-theme='dark'])
4251
- #squisq-template-gallery-portal
4469
+ [data-squisq-template-gallery-portal]
4252
4470
  .squisq-template-gallery-card:hover {
4253
4471
  background: var(--db-bg-hover);
4254
4472
  border-color: var(--db-accent);
@@ -4256,7 +4474,7 @@ html:has(.db-shell[data-theme='dark'])
4256
4474
  }
4257
4475
 
4258
4476
  html:has(.db-shell[data-theme='dark'])
4259
- #squisq-template-gallery-portal
4477
+ [data-squisq-template-gallery-portal]
4260
4478
  .squisq-template-gallery-card--selected {
4261
4479
  background: var(--db-accent-tint-strong);
4262
4480
  border-color: var(--db-accent-hover);
@@ -4264,27 +4482,27 @@ html:has(.db-shell[data-theme='dark'])
4264
4482
  }
4265
4483
 
4266
4484
  html:has(.db-shell[data-theme='dark'])
4267
- #squisq-template-gallery-portal
4485
+ [data-squisq-template-gallery-portal]
4268
4486
  .squisq-template-gallery-card-icon {
4269
4487
  background: var(--db-bg);
4270
4488
  border-color: var(--db-border);
4271
4489
  }
4272
4490
 
4273
4491
  html:has(.db-shell[data-theme='dark'])
4274
- #squisq-template-gallery-portal
4492
+ [data-squisq-template-gallery-portal]
4275
4493
  .squisq-template-gallery-card-name {
4276
4494
  color: var(--db-text);
4277
4495
  }
4278
4496
 
4279
4497
  html:has(.db-shell[data-theme='dark'])
4280
- #squisq-template-gallery-portal
4498
+ [data-squisq-template-gallery-portal]
4281
4499
  .squisq-template-gallery-card-desc {
4282
4500
  color: var(--db-text-muted);
4283
4501
  }
4284
4502
 
4285
4503
  /* Recolor the indigo accent fills inside template thumbnail SVGs */
4286
4504
  html:has(.db-shell[data-theme='dark'])
4287
- #squisq-template-gallery-portal
4505
+ [data-squisq-template-gallery-portal]
4288
4506
  .squisq-template-picker-icon
4289
4507
  [fill='#818cf8'] {
4290
4508
  fill: var(--db-accent-hover);
@@ -4546,38 +4764,28 @@ html:has(.db-shell[data-theme='dark'])
4546
4764
  opacity: 0.62;
4547
4765
  }
4548
4766
 
4549
- /* Outline pane (left of the editor) squisq paints a warm beige
4550
- (#dcd8d0 light / dark slate in dark mode). Re-tone to `--db-gutter-bg`
4551
- so it matches the inline-preview gutter on the right and reads as
4552
- one step lighter than the toolbar above. */
4553
- .db-shell[data-theme='light'] .squisq-outline {
4554
- background: var(--db-gutter-bg);
4555
- color: var(--db-text);
4556
- }
4557
-
4558
- .db-shell[data-theme='light'] .squisq-outline-row:hover {
4559
- background: var(--db-accent-soft-15);
4560
- }
4561
-
4562
- .db-shell[data-theme='dark'] .squisq-outline {
4563
- background: var(--db-gutter-bg);
4767
+ /* Outline pane (left of the editor). Its background comes from
4768
+ `--squisq-desk-bg` above, same as every other desk surface only the
4769
+ text and hover tint need binding to the DocBlocks palette. */
4770
+ .db-shell .squisq-outline {
4564
4771
  color: var(--db-text);
4565
4772
  }
4566
4773
 
4567
- .db-shell[data-theme='dark'] .squisq-outline-row:hover {
4774
+ .db-shell .squisq-outline-row:hover {
4568
4775
  background: var(--db-accent-soft-15);
4569
4776
  }
4570
4777
 
4571
- /* Explicit borders on the canvas side of each chrome pane so the
4572
- white editor area reads as a clearly-edged "page" rather than
4573
- blending into the cream gutters. Uses --db-border-strong to match
4574
- the hairline under the toolbar. */
4778
+ /* Hairlines on the canvas side of each chrome pane. The desk is one
4779
+ continuous tone across the panes and the field behind the page, so
4780
+ these mark where the panes end without the --db-border-strong stripe
4781
+ that used to divide two different surfaces — the page's own shadow
4782
+ does the heavier separating. */
4575
4783
  .db-shell .squisq-outline {
4576
- border-right: 1px solid var(--db-border-strong);
4784
+ border-right: 1px solid var(--db-border);
4577
4785
  }
4578
4786
 
4579
4787
  .db-shell .squisq-inline-preview-gutter {
4580
- border-left: 1px solid var(--db-border-strong);
4788
+ border-left: 1px solid var(--db-border);
4581
4789
  }
4582
4790
 
4583
4791
  /* Toolbar overflow menu. Squisq intentionally ships a neutral slate
@@ -5241,6 +5449,55 @@ html:has(.db-shell[data-theme='dark'])
5241
5449
  flex-shrink: 0;
5242
5450
  }
5243
5451
 
5452
+ /* The offer to turn Git on for a folder inside a larger repository. It sits
5453
+ directly above the sidebar footer and borrows its voice: muted, 11px, no
5454
+ icon and no accent — this is a default the user may change, not a fault. */
5455
+ .db-git-grant-notice {
5456
+ box-sizing: border-box;
5457
+ display: flex;
5458
+ align-items: center;
5459
+ gap: 6px;
5460
+ flex-shrink: 0;
5461
+ padding: 6px 12px 6px 18px;
5462
+ border-top: 1px solid var(--db-border);
5463
+ color: var(--db-text-muted);
5464
+ font-size: 11px;
5465
+ line-height: 1.3;
5466
+ }
5467
+
5468
+ .db-git-grant-notice-text {
5469
+ overflow: hidden;
5470
+ text-overflow: ellipsis;
5471
+ white-space: nowrap;
5472
+ }
5473
+
5474
+ .db-git-grant-notice-action {
5475
+ flex-shrink: 0;
5476
+ padding: 0;
5477
+ border: 0;
5478
+ background: transparent;
5479
+ color: inherit;
5480
+ font: inherit;
5481
+ line-height: inherit;
5482
+ text-decoration: underline;
5483
+ white-space: nowrap;
5484
+ cursor: pointer;
5485
+ }
5486
+
5487
+ .db-git-grant-notice-action:hover {
5488
+ color: var(--db-text-secondary);
5489
+ }
5490
+
5491
+ .db-git-grant-remember {
5492
+ display: flex;
5493
+ align-items: center;
5494
+ gap: 8px;
5495
+ margin: 12px 0;
5496
+ font-size: 13px;
5497
+ color: var(--db-text);
5498
+ cursor: pointer;
5499
+ }
5500
+
5244
5501
  /* Actions dropdown (mirrors db-ws-settings-dropdown) */
5245
5502
  .db-git-menu {
5246
5503
  position: absolute;
@@ -5604,6 +5861,7 @@ button.db-git-file-row:hover {
5604
5861
  .db-app-menu-caret,
5605
5862
  .db-ws-settings-btn,
5606
5863
  .db-shell-sidebar-resizer,
5864
+ .db-sidebar-collapse-preview,
5607
5865
  .db-export-chip,
5608
5866
  .db-git-progress-bar > span {
5609
5867
  transition: none;
@@ -5684,6 +5942,16 @@ button.db-git-file-row:hover {
5684
5942
  min-height: 0;
5685
5943
  }
5686
5944
 
5945
+ /* The flexible actions lane owns the otherwise-empty gap between Squisq's
5946
+ formatting controls and the fixed document controls. Mark the child
5947
+ explicitly because its overflow clipping can prevent the toolbar's drag
5948
+ region from reaching those pixels. Controls opt out below. */
5949
+ .db-shell .squisq-toolbar-actions {
5950
+ app-region: drag;
5951
+ -webkit-app-region: drag;
5952
+ cursor: grab;
5953
+ }
5954
+
5687
5955
  .db-shell .db-shell-sidebar-header {
5688
5956
  padding-block: 0;
5689
5957
  padding-left: max(4px, calc(env(titlebar-area-x, 0px) + 4px));