@bendyline/docblocks-react 2.4.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;
@@ -2743,7 +2863,7 @@ body.db-resizing-sidebar * {
2743
2863
  /* Shared-document links intentionally resemble export because they package a
2744
2864
  bounded Markdown-only DBK; the warning is the critical distinction. */
2745
2865
  .db-share-dialog {
2746
- width: 480px;
2866
+ width: 560px;
2747
2867
  }
2748
2868
 
2749
2869
  .db-share-warning {
@@ -2783,10 +2903,88 @@ body.db-resizing-sidebar * {
2783
2903
  color: var(--db-danger, #a33a35);
2784
2904
  }
2785
2905
 
2906
+ .db-share-qr {
2907
+ margin: 18px 0 14px;
2908
+ padding-top: 16px;
2909
+ border-top: 1px solid var(--db-border);
2910
+ }
2911
+
2912
+ .db-share-qr-heading {
2913
+ display: flex;
2914
+ align-items: flex-start;
2915
+ justify-content: space-between;
2916
+ gap: 12px;
2917
+ }
2918
+
2919
+ .db-share-qr-heading h3 {
2920
+ margin: 0;
2921
+ color: var(--db-text);
2922
+ font-size: 14px;
2923
+ line-height: 1.4;
2924
+ }
2925
+
2926
+ .db-share-qr-actions {
2927
+ display: flex;
2928
+ flex-shrink: 0;
2929
+ flex-wrap: wrap;
2930
+ justify-content: flex-end;
2931
+ gap: 8px;
2932
+ }
2933
+
2934
+ .db-share-qr-image {
2935
+ display: block;
2936
+ box-sizing: border-box;
2937
+ width: min(100%, 360px);
2938
+ height: auto;
2939
+ margin: 14px auto 0;
2940
+ image-rendering: pixelated;
2941
+ background: #fff;
2942
+ border: 1px solid var(--db-border);
2943
+ border-radius: 4px;
2944
+ }
2945
+
2946
+ .db-share-qr-placeholder {
2947
+ display: flex;
2948
+ align-items: center;
2949
+ justify-content: center;
2950
+ box-sizing: border-box;
2951
+ min-height: 120px;
2952
+ margin-top: 14px;
2953
+ padding: 18px;
2954
+ color: var(--db-text-muted);
2955
+ text-align: center;
2956
+ background: var(--db-bg-subtle);
2957
+ border: 1px dashed var(--db-border);
2958
+ border-radius: 4px;
2959
+ }
2960
+
2961
+ .db-share-qr-placeholder--error {
2962
+ color: var(--db-danger, #a33a35);
2963
+ border-color: currentColor;
2964
+ }
2965
+
2966
+ .db-share-qr-status {
2967
+ display: block;
2968
+ min-height: 1.4em;
2969
+ margin-top: 6px;
2970
+ text-align: center;
2971
+ }
2972
+
2786
2973
  .db-share-temporary-note {
2787
2974
  color: var(--db-text-muted);
2788
2975
  }
2789
2976
 
2977
+ @media (max-width: 560px) {
2978
+ .db-share-qr-heading {
2979
+ display: block;
2980
+ }
2981
+
2982
+ .db-share-qr-actions {
2983
+ justify-content: flex-start;
2984
+ margin-top: 10px;
2985
+ }
2986
+ }
2987
+
2790
2988
  /* ── Squisq editor chrome separators ─────────────────────────── */
2791
2989
  /* Strengthen the dividers so the toolbar, tabs, and editor body
2792
2990
  read as three distinct zones instead of near-identical whites. */
@@ -2816,21 +3014,95 @@ body.db-resizing-sidebar * {
2816
3014
  background: var(--db-editor-canvas);
2817
3015
  }
2818
3016
 
2819
- /* Bind Squisq's host-facing accent to the active DocBlocks appearance.
2820
- RawEditor uses the editor background/foreground variables for its
2821
- textarea while Monaco's first lazy load is in flight. Define them here so
2822
- Source view never paints Squisq's light fallback before the requested
2823
- Monaco theme is ready. */
2824
- .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. */
2825
3064
  --squisq-accent: var(--db-accent);
2826
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);
2827
3070
  --squisq-text-on-accent: var(--db-text-on-accent);
2828
- /* Hover/open surface for toolbar dropdown triggers (e.g. the cover-slide
2829
- control). Squisq leaves this token undefined and falls back to its own
2830
- palette; bind it so the open trigger keeps DocBlocks hover contrast. */
2831
- --squisq-hover-bg: var(--db-bg-hover);
2832
- --squisq-editor-background: #ffffff;
2833
- --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;
2834
3106
  }
2835
3107
 
2836
3108
  /* Squisq's segmented mode controls otherwise retain their standalone
@@ -2868,13 +3140,6 @@ body.db-resizing-sidebar * {
2868
3140
  outline-offset: -2px;
2869
3141
  }
2870
3142
 
2871
- .db-shell .squisq-editor-shell[data-theme='dark'] {
2872
- /* Match Monaco's built-in vs-dark canvas exactly so replacing the loading
2873
- textarea with Monaco does not introduce a second, subtler color flash. */
2874
- --squisq-editor-background: #1e1e1e;
2875
- --squisq-editor-foreground: #d4d4d4;
2876
- }
2877
-
2878
3143
  /* The Write-canvas font picker is an explicit host preference, so its
2879
3144
  variables must beat the active document theme in Write mode. Squisq's base
2880
3145
  stylesheet intentionally puts theme fonts first; reverse that order only
@@ -2918,6 +3183,27 @@ body.db-resizing-sidebar * {
2918
3183
  --squisq-text-muted: var(--db-text-muted);
2919
3184
  }
2920
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
+
2921
3207
  /* ── Inline preview gutter: thematic green ──────────────────── */
2922
3208
  /* Rebind squisq's `--squisq-preview-*` custom properties so the
2923
3209
  gutter chrome (vertical bracket, diagonal connector + dots,
@@ -2977,10 +3263,6 @@ body.db-resizing-sidebar * {
2977
3263
  background: var(--db-bg);
2978
3264
  }
2979
3265
 
2980
- .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-container {
2981
- background: var(--db-editor-canvas);
2982
- }
2983
-
2984
3266
  .db-shell[data-theme='dark'] .squisq-editor-shell[data-theme='dark'] .squisq-wysiwyg-editor {
2985
3267
  background: var(--db-bg);
2986
3268
  }
@@ -3336,7 +3618,7 @@ html:has(.db-shell[data-theme='dark']) {
3336
3618
  --db-accent-soft-25: rgba(200, 180, 143, 0.28);
3337
3619
  --db-accent-tint-strong: #3a382e;
3338
3620
  --db-accent-deep: #e6dcc0;
3339
- --db-gutter-bg: #4a4538;
3621
+ --db-gutter-bg: #16110b;
3340
3622
  }
3341
3623
 
3342
3624
  html:has(.db-shell[data-theme='light']) {
@@ -3437,7 +3719,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='green']) {
3437
3719
  --db-text-on-selected: #e2ebe4;
3438
3720
  --db-accent-tint-strong: #2f4034;
3439
3721
  --db-accent-deep: #d4e8d9;
3440
- --db-gutter-bg: #3b4d40;
3722
+ --db-gutter-bg: #0e1510;
3441
3723
  --db-input-border: #9ec2a8;
3442
3724
  --db-editor-canvas: #0e1510;
3443
3725
  --db-badge-bg: #294031;
@@ -3486,7 +3768,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='blue']) {
3486
3768
  --db-text-on-selected: #e2e8ef;
3487
3769
  --db-accent-tint-strong: #2e3b49;
3488
3770
  --db-accent-deep: #d8e5f2;
3489
- --db-gutter-bg: #394858;
3771
+ --db-gutter-bg: #0f1318;
3490
3772
  --db-input-border: #a7bdd8;
3491
3773
  --db-editor-canvas: #0f1318;
3492
3774
  --db-badge-bg: #28394a;
@@ -3535,7 +3817,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='purple']) {
3535
3817
  --db-text-on-selected: #ece3ef;
3536
3818
  --db-accent-tint-strong: #413348;
3537
3819
  --db-accent-deep: #eadcf1;
3538
- --db-gutter-bg: #493b50;
3820
+ --db-gutter-bg: #120f15;
3539
3821
  --db-input-border: #c2a9d4;
3540
3822
  --db-editor-canvas: #120f15;
3541
3823
  --db-badge-bg: #3b2a44;
@@ -3584,7 +3866,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='maroon']) {
3584
3866
  --db-text-on-selected: #f0e3e7;
3585
3867
  --db-accent-tint-strong: #473139;
3586
3868
  --db-accent-deep: #f0d8e0;
3587
- --db-gutter-bg: #503b42;
3869
+ --db-gutter-bg: #150e11;
3588
3870
  --db-input-border: #d0a5b4;
3589
3871
  --db-editor-canvas: #150e11;
3590
3872
  --db-badge-bg: #442832;
@@ -3633,7 +3915,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='orange']) {
3633
3915
  --db-text-on-selected: #f0e7dc;
3634
3916
  --db-accent-tint-strong: #493a2a;
3635
3917
  --db-accent-deep: #f1dbc4;
3636
- --db-gutter-bg: #514333;
3918
+ --db-gutter-bg: #15100c;
3637
3919
  --db-input-border: #d7b08a;
3638
3920
  --db-editor-canvas: #15100c;
3639
3921
  --db-badge-bg: #44301f;
@@ -3682,7 +3964,7 @@ html:has(.db-shell[data-theme='dark'][data-accent='gray']) {
3682
3964
  --db-text-on-selected: #e8e8e8;
3683
3965
  --db-accent-tint-strong: #383838;
3684
3966
  --db-accent-deep: #e2e2e2;
3685
- --db-gutter-bg: #444444;
3967
+ --db-gutter-bg: #111111;
3686
3968
  --db-input-border: #b8b8b8;
3687
3969
  --db-editor-canvas: #111111;
3688
3970
  --db-badge-bg: #333333;
@@ -3761,8 +4043,14 @@ html:has(.db-shell) .squisq-cover-slide-menu {
3761
4043
  /* Custom layout authoring is portaled to document.body. Bind its host-facing
3762
4044
  accent tokens at that portal boundary so selected layouts, palette states,
3763
4045
  primary actions, and focus rings follow the active DocBlocks accent instead
3764
- of Squisq's standalone indigo defaults. */
3765
- 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
+ ) {
3766
4054
  --squisq-layout-accent-text: var(--db-accent-hover);
3767
4055
  --squisq-layout-accent-bg: var(--db-accent);
3768
4056
  --squisq-layout-accent-bg-hover: var(--db-accent-hover);
@@ -3774,13 +4062,21 @@ html:has(.db-shell) :is(.squisq-template-designer-overlay, .squisq-layout-manage
3774
4062
  }
3775
4063
 
3776
4064
  html:has(.db-shell)
3777
- :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
+ )
3778
4070
  .squisq-template-designer-btn--primary {
3779
4071
  color: var(--db-text-on-accent);
3780
4072
  }
3781
4073
 
3782
4074
  html:has(.db-shell)
3783
- :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
+ )
3784
4080
  .squisq-template-designer-field
3785
4081
  input:focus {
3786
4082
  box-shadow: 0 0 0 3px var(--db-accent-soft-25);
@@ -4122,7 +4418,7 @@ html:has(.db-shell)
4122
4418
  color: var(--squisq-template-gallery-section-title);
4123
4419
  }
4124
4420
 
4125
- html:has(.db-shell[data-theme='dark']) #squisq-template-gallery-portal {
4421
+ html:has(.db-shell[data-theme='dark']) [data-squisq-template-gallery-portal] {
4126
4422
  background: var(--db-bg-subtle);
4127
4423
  border-color: var(--db-border);
4128
4424
  box-shadow:
@@ -4131,46 +4427,46 @@ html:has(.db-shell[data-theme='dark']) #squisq-template-gallery-portal {
4131
4427
  }
4132
4428
 
4133
4429
  html:has(.db-shell[data-theme='dark'])
4134
- #squisq-template-gallery-portal
4430
+ [data-squisq-template-gallery-portal]
4135
4431
  .squisq-template-gallery-none {
4136
4432
  background: transparent;
4137
4433
  border-color: var(--db-border);
4138
4434
  }
4139
4435
 
4140
4436
  html:has(.db-shell[data-theme='dark'])
4141
- #squisq-template-gallery-portal
4437
+ [data-squisq-template-gallery-portal]
4142
4438
  .squisq-template-gallery-none:hover {
4143
4439
  background: var(--db-bg-hover);
4144
4440
  }
4145
4441
 
4146
4442
  html:has(.db-shell[data-theme='dark'])
4147
- #squisq-template-gallery-portal
4443
+ [data-squisq-template-gallery-portal]
4148
4444
  .squisq-template-gallery-none.squisq-template-gallery-card--selected {
4149
4445
  background: var(--db-accent-tint-strong);
4150
4446
  border-color: var(--db-accent);
4151
4447
  }
4152
4448
 
4153
4449
  html:has(.db-shell[data-theme='dark'])
4154
- #squisq-template-gallery-portal
4450
+ [data-squisq-template-gallery-portal]
4155
4451
  .squisq-template-gallery-none-label {
4156
4452
  color: var(--db-text);
4157
4453
  }
4158
4454
 
4159
4455
  html:has(.db-shell[data-theme='dark'])
4160
- #squisq-template-gallery-portal
4456
+ [data-squisq-template-gallery-portal]
4161
4457
  .squisq-template-gallery-none-desc {
4162
4458
  color: var(--db-text-muted);
4163
4459
  }
4164
4460
 
4165
4461
  html:has(.db-shell[data-theme='dark'])
4166
- #squisq-template-gallery-portal
4462
+ [data-squisq-template-gallery-portal]
4167
4463
  .squisq-template-gallery-card {
4168
4464
  background: transparent;
4169
4465
  border-color: var(--db-border);
4170
4466
  }
4171
4467
 
4172
4468
  html:has(.db-shell[data-theme='dark'])
4173
- #squisq-template-gallery-portal
4469
+ [data-squisq-template-gallery-portal]
4174
4470
  .squisq-template-gallery-card:hover {
4175
4471
  background: var(--db-bg-hover);
4176
4472
  border-color: var(--db-accent);
@@ -4178,7 +4474,7 @@ html:has(.db-shell[data-theme='dark'])
4178
4474
  }
4179
4475
 
4180
4476
  html:has(.db-shell[data-theme='dark'])
4181
- #squisq-template-gallery-portal
4477
+ [data-squisq-template-gallery-portal]
4182
4478
  .squisq-template-gallery-card--selected {
4183
4479
  background: var(--db-accent-tint-strong);
4184
4480
  border-color: var(--db-accent-hover);
@@ -4186,27 +4482,27 @@ html:has(.db-shell[data-theme='dark'])
4186
4482
  }
4187
4483
 
4188
4484
  html:has(.db-shell[data-theme='dark'])
4189
- #squisq-template-gallery-portal
4485
+ [data-squisq-template-gallery-portal]
4190
4486
  .squisq-template-gallery-card-icon {
4191
4487
  background: var(--db-bg);
4192
4488
  border-color: var(--db-border);
4193
4489
  }
4194
4490
 
4195
4491
  html:has(.db-shell[data-theme='dark'])
4196
- #squisq-template-gallery-portal
4492
+ [data-squisq-template-gallery-portal]
4197
4493
  .squisq-template-gallery-card-name {
4198
4494
  color: var(--db-text);
4199
4495
  }
4200
4496
 
4201
4497
  html:has(.db-shell[data-theme='dark'])
4202
- #squisq-template-gallery-portal
4498
+ [data-squisq-template-gallery-portal]
4203
4499
  .squisq-template-gallery-card-desc {
4204
4500
  color: var(--db-text-muted);
4205
4501
  }
4206
4502
 
4207
4503
  /* Recolor the indigo accent fills inside template thumbnail SVGs */
4208
4504
  html:has(.db-shell[data-theme='dark'])
4209
- #squisq-template-gallery-portal
4505
+ [data-squisq-template-gallery-portal]
4210
4506
  .squisq-template-picker-icon
4211
4507
  [fill='#818cf8'] {
4212
4508
  fill: var(--db-accent-hover);
@@ -4468,38 +4764,28 @@ html:has(.db-shell[data-theme='dark'])
4468
4764
  opacity: 0.62;
4469
4765
  }
4470
4766
 
4471
- /* Outline pane (left of the editor) squisq paints a warm beige
4472
- (#dcd8d0 light / dark slate in dark mode). Re-tone to `--db-gutter-bg`
4473
- so it matches the inline-preview gutter on the right and reads as
4474
- one step lighter than the toolbar above. */
4475
- .db-shell[data-theme='light'] .squisq-outline {
4476
- background: var(--db-gutter-bg);
4477
- color: var(--db-text);
4478
- }
4479
-
4480
- .db-shell[data-theme='light'] .squisq-outline-row:hover {
4481
- background: var(--db-accent-soft-15);
4482
- }
4483
-
4484
- .db-shell[data-theme='dark'] .squisq-outline {
4485
- 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 {
4486
4771
  color: var(--db-text);
4487
4772
  }
4488
4773
 
4489
- .db-shell[data-theme='dark'] .squisq-outline-row:hover {
4774
+ .db-shell .squisq-outline-row:hover {
4490
4775
  background: var(--db-accent-soft-15);
4491
4776
  }
4492
4777
 
4493
- /* Explicit borders on the canvas side of each chrome pane so the
4494
- white editor area reads as a clearly-edged "page" rather than
4495
- blending into the cream gutters. Uses --db-border-strong to match
4496
- 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. */
4497
4783
  .db-shell .squisq-outline {
4498
- border-right: 1px solid var(--db-border-strong);
4784
+ border-right: 1px solid var(--db-border);
4499
4785
  }
4500
4786
 
4501
4787
  .db-shell .squisq-inline-preview-gutter {
4502
- border-left: 1px solid var(--db-border-strong);
4788
+ border-left: 1px solid var(--db-border);
4503
4789
  }
4504
4790
 
4505
4791
  /* Toolbar overflow menu. Squisq intentionally ships a neutral slate
@@ -5163,6 +5449,55 @@ html:has(.db-shell[data-theme='dark'])
5163
5449
  flex-shrink: 0;
5164
5450
  }
5165
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
+
5166
5501
  /* Actions dropdown (mirrors db-ws-settings-dropdown) */
5167
5502
  .db-git-menu {
5168
5503
  position: absolute;
@@ -5526,6 +5861,7 @@ button.db-git-file-row:hover {
5526
5861
  .db-app-menu-caret,
5527
5862
  .db-ws-settings-btn,
5528
5863
  .db-shell-sidebar-resizer,
5864
+ .db-sidebar-collapse-preview,
5529
5865
  .db-export-chip,
5530
5866
  .db-git-progress-bar > span {
5531
5867
  transition: none;
@@ -5606,6 +5942,16 @@ button.db-git-file-row:hover {
5606
5942
  min-height: 0;
5607
5943
  }
5608
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
+
5609
5955
  .db-shell .db-shell-sidebar-header {
5610
5956
  padding-block: 0;
5611
5957
  padding-left: max(4px, calc(env(titlebar-area-x, 0px) + 4px));