anentrypoint-design 0.0.380 → 0.0.381

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.
package/dist/247420.css CHANGED
@@ -147,6 +147,13 @@
147
147
  --ff-body: system-ui, sans-serif;
148
148
  --ff-mono: ui-monospace, Menlo, Consolas, monospace;
149
149
 
150
+ /* Sub-12px tiers exist ONLY for dense OS/data chrome — taskbar strips,
151
+ session chips, tool-call headers, file-row metadata, ID/stat columns.
152
+ Never use them for body copy or ordinary UI text: at these sizes the
153
+ system stack loses its readable x-height, so they are reserved for
154
+ glanceable, secondary, non-prose material. --fs-pico is the floor. */
155
+ --fs-pico: 10px;
156
+ --fs-nano: 11px;
150
157
  --fs-micro: 12px;
151
158
  --fs-tiny: 13px;
152
159
  --fs-xs: 14px;
@@ -247,8 +254,61 @@
247
254
  edges (panel spine, expo numbering). A literal length, not a color. */
248
255
  --ink-offset: 3px;
249
256
 
250
- --z-header: 100;
251
- --z-overlay: 1000;
257
+ /* ============================================================
258
+ Stacking scale — the ONE ordered set of layers anything may
259
+ paint into. Rungs are 100 apart so a future layer can be
260
+ inserted between two neighbours without renumbering the rest,
261
+ and so a component may locally offset (+1/+2) within its own
262
+ rung without colliding with the next one.
263
+
264
+ Order is the contract; the numbers are just how it is spelled.
265
+ Read top to bottom as "what paints over what":
266
+
267
+ --z-below -1 decorative texture UNDER its own content
268
+ (.ds-grain/.ds-halftone print layer)
269
+ --z-base 0 in-flow content; the default plane
270
+ --z-raised 100 a thing lifted above its siblings inside
271
+ one component (code-lang tab, timeline dot,
272
+ selection checkbox, resize handle)
273
+ --z-sticky 200 sticky-within-a-scroller chrome: section
274
+ labels, sticky table headers, save bars.
275
+ Above raised content it scrolls past.
276
+ --z-header 300 the app's own sticky chrome band
277
+ (.app-topbar/.app-chrome)
278
+ --z-drawer 400 off-canvas panels (sidebar/pane/session
279
+ drawers) and their scrim, which must cover
280
+ the header they slide over
281
+ --z-window 500 free-floating window-manager surfaces —
282
+ the OS kit's .wm-root canvas of draggable
283
+ windows. Above the shell, below all
284
+ transient popups.
285
+ --z-dock 600 persistent OS shell furniture that must
286
+ stay above windows: launcher dock, menubar,
287
+ taskbar, os-root
288
+ --z-dropdown 700 menus/popovers anchored to a trigger; they
289
+ must escape the dock that spawned them
290
+ --z-modal 800 blocking dialogs, lightboxes, command
291
+ palettes and their backdrops
292
+ --z-toast 900 transient notifications — above a modal,
293
+ because they report on what the modal did
294
+ --z-tooltip 1000 pointer-following hint; never blocked
295
+ --z-top 1100 last resort: boot/loading veils and
296
+ full-screen takeovers that outrank
297
+ everything, including a tooltip
298
+ ============================================================ */
299
+ --z-below: -1;
300
+ --z-base: 0;
301
+ --z-raised: 100;
302
+ --z-sticky: 200;
303
+ --z-header: 300;
304
+ --z-drawer: 400;
305
+ --z-window: 500;
306
+ --z-dock: 600;
307
+ --z-dropdown: 700;
308
+ --z-modal: 800;
309
+ --z-toast: 900;
310
+ --z-tooltip: 1000;
311
+ --z-top: 1100;
252
312
 
253
313
  --measure: 68ch;
254
314
  --measure-wide: 940px;
@@ -591,11 +651,10 @@
591
651
  scrim; heavier than --shadow-3 and theme-driven (was raw rgba(0,0,0,.4)). */
592
652
  --shadow-overlay: 0 12px 40px color-mix(in oklab, var(--fg) 28%, transparent),
593
653
  0 4px 12px color-mix(in oklab, var(--fg) 16%, transparent);
594
- --z-dropdown: 600;
595
- --z-popover: 700;
596
- --z-modal: 800;
597
- --z-toast: 900;
598
- --z-tooltip: 1000;
654
+ /* --z-popover is an alias, not a rung: popovers and dropdowns are the
655
+ same anchored-to-a-trigger layer and must never be able to drift
656
+ apart. The rungs themselves live with the stacking scale above. */
657
+ --z-popover: var(--z-dropdown);
599
658
  }
600
659
 
601
660
  /* app-shell.css */
@@ -624,7 +683,10 @@
624
683
  color: var(--accent-fg);
625
684
  padding: 8px 16px;
626
685
  text-decoration: none;
627
- z-index: 100;
686
+ /* Must outrank every layer of chrome once focused, or the first Tab press
687
+ lands on a control hidden behind the sticky header (was z-index:100,
688
+ which the header alone now matches). */
689
+ z-index: var(--z-top);
628
690
  border-radius: var(--r-pill);
629
691
  font-weight: 600;
630
692
  font-size: var(--fs-sm);
@@ -679,6 +741,13 @@
679
741
  .ds-247420 .t-mono { font-family: var(--ff-mono); }
680
742
  .ds-247420 .t-body { font-family: var(--ff-body); }
681
743
 
744
+ /* House small-label voice, in two sizes. Every declaration here is sourced
745
+ from a token, so a sheet that cannot join these selector lists (community.css
746
+ and gm-prose.css ship as separate <link>-able exports and must not depend on
747
+ app-shell.css being present) still composes the same voice by referencing the
748
+ same four tokens — --ff-mono / --fs-* / uppercase / --tr-label. That token
749
+ set, not this rule, is the single source of truth; a selector that restates a
750
+ literal instead of the token is the drift this pairing exists to prevent. */
682
751
  .ds-247420 .t-label { font-family: var(--ff-mono); font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-label); font-weight: 500; }
683
752
  .ds-247420 .t-micro { font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: var(--tr-label); color: var(--fg-3); }
684
753
  .ds-247420 .t-meta { font-family: var(--ff-body); font-size: var(--fs-sm); color: var(--fg-3); }
@@ -1348,7 +1417,12 @@
1348
1417
  }
1349
1418
  .ds-247420 .panel-body { padding: var(--space-2) var(--space-3) var(--space-3); }
1350
1419
  .ds-247420 .panel-body > * { margin: 0; }
1351
- .ds-247420 .panel-body > * + * { margin-top: var(--space-3); }
1420
+ /* Inner sibling rhythm scales with density like the outer panel rhythm, so a
1421
+ compact/spacious surface stays proportional instead of only its outer
1422
+ intervals moving while the panel interiors hold still. Kept strictly below
1423
+ the outer .ds-panel-gap interval at every density — that ordering is what
1424
+ makes proximity report grouping truthfully. */
1425
+ .ds-247420 .panel-body > * + * { margin-top: calc(var(--space-3) * var(--density)); }
1352
1426
  .ds-247420 .panel.panel-wide .panel-body { padding: 0; }
1353
1427
 
1354
1428
  /* ============================================================
@@ -1570,7 +1644,7 @@
1570
1644
  ============================================================ */
1571
1645
  .ds-247420 .ds-grain { position: relative; isolation: isolate; }
1572
1646
  .ds-247420 .ds-grain::after {
1573
- content: ''; position: absolute; inset: 0; z-index: -1;
1647
+ content: ''; position: absolute; inset: 0; z-index: var(--z-below);
1574
1648
  pointer-events: none;
1575
1649
  background-image: var(--grain);
1576
1650
  background-size: 160px 160px;
@@ -2454,7 +2528,7 @@
2454
2528
  }
2455
2529
  .ds-247420 .ds-file-cell-meta { font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg-3); text-align: left; }
2456
2530
  .ds-247420 .ds-file-cell-check {
2457
- position: absolute; top: 4px; left: 4px; z-index: 1;
2531
+ position: absolute; top: 4px; left: 4px; z-index: var(--z-raised);
2458
2532
  background: color-mix(in oklab, var(--bg) 78%, transparent);
2459
2533
  }
2460
2534
 
@@ -2600,7 +2674,7 @@
2600
2674
  .ds-247420 .ds-dropzone--wrap { position: relative; border: none; border-radius: 0; background: transparent; }
2601
2675
  .ds-247420 .ds-dropzone--wrap > .ds-dropzone-inner { display: none; }
2602
2676
  .ds-247420 .ds-dropzone--wrap.dragover > .ds-dropzone-inner {
2603
- display: flex; position: absolute; inset: 0; z-index: 5;
2677
+ display: flex; position: absolute; inset: 0; z-index: var(--z-raised);
2604
2678
  margin: 0; padding: var(--space-3);
2605
2679
  align-items: center; justify-content: center;
2606
2680
  background: color-mix(in srgb, var(--bg) 84%, transparent);
@@ -2692,7 +2766,7 @@
2692
2766
 
2693
2767
  /* -- Modals ------------------------------------------------- */
2694
2768
  .ds-247420 .ds-modal-backdrop {
2695
- position: fixed; inset: 0; z-index: var(--z-modal, 800);
2769
+ position: fixed; inset: 0; z-index: var(--z-modal);
2696
2770
  display: flex; align-items: center; justify-content: center;
2697
2771
  /* Notch/home-indicator safe: near-fullscreen modals must not slide under. */
2698
2772
  padding: max(var(--space-3), env(safe-area-inset-top))
@@ -3001,6 +3075,13 @@
3001
3075
  transition: color var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
3002
3076
  }
3003
3077
  .ds-247420 .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
3078
+ /* Touch floor — a segmented control is a primary mode switch but renders ~30px
3079
+ tall from its 4px padding, below the 44px minimum the rest of the system
3080
+ holds. Grows the hit area only; the pill's visual size is unchanged at
3081
+ fine-pointer sizes. */
3082
+ @media (pointer: coarse) {
3083
+ .ds-247420 .ds-segmented .ds-seg-btn { min-height: 44px; padding-inline: var(--space-3); }
3084
+ }
3004
3085
  .ds-247420 .ds-segmented .ds-seg-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
3005
3086
  .ds-247420 .ds-segmented .ds-seg-btn.is-on {
3006
3087
  background: var(--bg); color: var(--fg);
@@ -3146,7 +3227,12 @@
3146
3227
  .ds-247420 .chat-bubble.chat-md li { margin: var(--space-1) 0; }
3147
3228
  .ds-247420 .chat-bubble.chat-md blockquote {
3148
3229
  margin: var(--space-2) 0; padding: 4px 12px;
3149
- border-left: 3px solid color-mix(in oklab, currentColor 30%, transparent);
3230
+ /* DELIBERATE, but slimmed to the --bw-rule tier. This is a real markdown
3231
+ <blockquote> inside a chat bubble: the left rule is the standard
3232
+ typographic quotation mark, not a colored alert stripe (the tone is a
3233
+ currentColor mix that inherits the bubble's own ink — never an accent).
3234
+ A 3px off-scale literal read as the generic tell; 2px reads as type. */
3235
+ border-left: var(--bw-rule) solid color-mix(in oklab, currentColor 30%, transparent);
3150
3236
  color: color-mix(in oklab, currentColor 75%, transparent); font-style: italic;
3151
3237
  }
3152
3238
  .ds-247420 .chat-bubble.chat-md pre {
@@ -3722,7 +3808,12 @@
3722
3808
  min-height: 120px;
3723
3809
  display: flex; align-items: center; justify-content: center;
3724
3810
  text-align: center; color: var(--fg-3);
3725
- transition: all var(--dur-snap) var(--ease);
3811
+ /* Explicit list, never `all` — the only things `.drop-zone.active` changes
3812
+ are the dashed border tone, the tinted fill and the label colour. `all`
3813
+ also animated padding/min-height/border-width, so a drop target visibly
3814
+ resized mid-drag instead of snapping. */
3815
+ transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease),
3816
+ color var(--dur-snap) var(--ease);
3726
3817
  }
3727
3818
  .ds-247420 .drop-zone.active {
3728
3819
  border-color: var(--accent);
@@ -3762,7 +3853,7 @@
3762
3853
  border-radius: var(--r-2);
3763
3854
  box-shadow: var(--shadow-overlay);
3764
3855
  min-width: 160px;
3765
- z-index: calc(var(--z-overlay, 1000) + 1);
3856
+ z-index: var(--z-dropdown);
3766
3857
  padding: 4px 0;
3767
3858
  }
3768
3859
 
@@ -4141,7 +4232,7 @@
4141
4232
  position: absolute; top: -40px; left: 0;
4142
4233
  background: var(--fg); color: var(--bg);
4143
4234
  padding: 8px 16px; border-radius: var(--r-1);
4144
- text-decoration: none; z-index: var(--z-overlay, 1000);
4235
+ text-decoration: none; z-index: var(--z-top);
4145
4236
  }
4146
4237
  .ds-247420 .skip-to-main:focus { top: 10px; }
4147
4238
 
@@ -4261,7 +4352,7 @@
4261
4352
  padding: var(--space-3) var(--space-4);
4262
4353
  max-width: 320px;
4263
4354
  box-shadow: var(--shadow-overlay);
4264
- z-index: calc(var(--z-overlay, 1000) + 10);
4355
+ z-index: var(--z-toast);
4265
4356
  }
4266
4357
 
4267
4358
  @keyframes toast-slide-in {
@@ -4435,8 +4526,9 @@
4435
4526
  width: 280px; max-width: 80%;
4436
4527
  transform: translateX(-100%);
4437
4528
  transition: transform var(--dur-base, 240ms) var(--ease, ease);
4438
- /* Above the sticky chrome (z-header): scrim > chrome > content budget. */
4439
- z-index: calc(var(--z-header, 100) + 2);
4529
+ /* Drawer rung, above the sticky chrome it slides over. +1 puts the panel
4530
+ itself over its own scrim (--z-drawer), which is the layer below it. */
4531
+ z-index: calc(var(--z-drawer) + 1);
4440
4532
  background: var(--bg);
4441
4533
  border-right: 1px solid color-mix(in oklab, var(--fg) 8%, transparent);
4442
4534
  overflow-y: auto;
@@ -4477,8 +4569,9 @@
4477
4569
  display: none;
4478
4570
  position: absolute; inset: 0;
4479
4571
  background: color-mix(in oklab, var(--bg) 60%, transparent);
4480
- /* Above the sticky chrome so nav behind an open drawer is not clickable. */
4481
- z-index: calc(var(--z-header, 100) + 1);
4572
+ /* Above the sticky chrome so nav behind an open drawer is not clickable.
4573
+ Base of the drawer rung — the panel itself sits one above this. */
4574
+ z-index: var(--z-drawer);
4482
4575
  }
4483
4576
  @container (max-width: 900px) {
4484
4577
  .ds-247420 .app-body.side-open .app-side-scrim { display: block; }
@@ -4490,9 +4583,10 @@
4490
4583
  .ds-247420 .app-side-toggle {
4491
4584
  display: none;
4492
4585
  position: absolute; top: calc((var(--app-topbar-h) - 44px) / 2); left: 10px;
4493
- /* Above the sticky topbar/chrome (z-header) and the drawer/scrim so the
4494
- translucent blurred chrome never paints over or intercepts the toggle. */
4495
- z-index: calc(var(--z-header, 100) + 3);
4586
+ /* Above the sticky topbar/chrome and the drawer/scrim so the translucent
4587
+ blurred chrome never paints over or intercepts the toggle. Top of the
4588
+ drawer rung: scrim < panel < toggle. */
4589
+ z-index: calc(var(--z-drawer) + 2);
4496
4590
  /* 44x44 minimum hit area (WCAG 2.5.5 / Apple HIG) - 36px is below the
4497
4591
  reliable-tap threshold on touch. */
4498
4592
  width: 44px; height: 44px;
@@ -4594,7 +4688,7 @@
4594
4688
  /* Column resize handles: a thin keyboard-accessible separator pinned to the
4595
4689
  right edge of each chrome track; drag (or ArrowLeft/Right) writes a clamped
4596
4690
  inline --ws-*-w. */
4597
- .ds-247420 .ws-resizer { grid-row: 1 / -1; align-self: stretch; justify-self: end; width: 8px; margin-right: -4px; z-index: 5; cursor: col-resize; background: transparent; border: none; padding: 0; touch-action: none; }
4691
+ .ds-247420 .ws-resizer { grid-row: 1 / -1; align-self: stretch; justify-self: end; width: 8px; margin-right: -4px; z-index: var(--z-raised); cursor: col-resize; background: transparent; border: none; padding: 0; touch-action: none; }
4598
4692
  .ds-247420 .ws-resizer::after { content: ""; display: block; width: 2px; height: 100%; margin: 0 auto; background: transparent; transition: background var(--dur-snap) var(--ease); }
4599
4693
  .ds-247420 .ws-resizer:hover::after, .ds-247420 .ws-resizer:focus-visible::after { background: var(--accent); }
4600
4694
  .ds-247420 .ws-resizer:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: -2px; }
@@ -4783,7 +4877,7 @@
4783
4877
  .ds-247420 .ws-pane {
4784
4878
  position: fixed; inset: 0 0 0 auto;
4785
4879
  width: min(340px, 85vw);
4786
- z-index: 42; transform: translateX(110%);
4880
+ z-index: calc(var(--z-drawer) + 1); transform: translateX(110%);
4787
4881
  transition: transform var(--dur-base) var(--ease);
4788
4882
  }
4789
4883
  .ds-247420 .ws-shell.ws-pane-open .ws-pane { transform: translateX(0); width: min(340px, 85vw); }
@@ -4792,7 +4886,7 @@
4792
4886
  .ds-247420 .ws-pane-drawer-toggle { display: inline-flex; }
4793
4887
  /* Scrim is always present from this stage down so it FADES with the drawer
4794
4888
  instead of hard-appearing; pointer-events gate keeps it inert while closed. */
4795
- .ds-247420 .ws-scrim { display: block; opacity: 0; pointer-events: none; position: fixed; inset: 0; z-index: 41; background: color-mix(in srgb, var(--fg) 38%, transparent); transition: opacity var(--dur-base) var(--ease); }
4889
+ .ds-247420 .ws-scrim { display: block; opacity: 0; pointer-events: none; position: fixed; inset: 0; z-index: var(--z-drawer); background: color-mix(in srgb, var(--fg) 38%, transparent); transition: opacity var(--dur-base) var(--ease); }
4796
4890
  .ds-247420 .ws-shell.ws-sessions-open .ws-scrim, .ds-247420 .ws-shell.ws-pane-open .ws-scrim { opacity: 1; pointer-events: auto; }
4797
4891
  }
4798
4892
 
@@ -4814,7 +4908,7 @@
4814
4908
  /* Immune to the desktop collapse var (--ws-sessions-w:0px persisted from
4815
4909
  a desktop session would open an invisible 0-width drawer). */
4816
4910
  width: min(max(var(--ws-sessions-w), 280px), 80vw);
4817
- z-index: 42; transform: translateX(-110%);
4911
+ z-index: calc(var(--z-drawer) + 1); transform: translateX(-110%);
4818
4912
  transition: transform var(--dur-base) var(--ease);
4819
4913
  border-right: var(--bw-hair) solid var(--bg-3);
4820
4914
  overscroll-behavior: contain;
@@ -4841,7 +4935,9 @@
4841
4935
  grid-template-columns: minmax(0, 1fr);
4842
4936
  grid-template-areas: "content";
4843
4937
  }
4844
- .ds-247420 .ws-rail { position: fixed; inset: 0 auto 0 0; width: var(--ws-rail-w-collapsed); z-index: 40; }
4938
+ /* Persistent chrome, not a drawer: it stays put while the session/pane
4939
+ drawers slide over it, so it sits on the header rung below them. */
4940
+ .ds-247420 .ws-rail { position: fixed; inset: 0 auto 0 0; width: var(--ws-rail-w-collapsed); z-index: var(--z-header); }
4845
4941
  .ds-247420 .ws-rail .ws-rail-brand,
4846
4942
  .ds-247420 .ws-rail .ws-rail-action-label,
4847
4943
  .ds-247420 .ws-rail .ws-rail-item-label,
@@ -5054,10 +5150,28 @@
5054
5150
  .ds-247420 .ds-sub-btn:hover { border-color: var(--accent); color: var(--accent-ink); }
5055
5151
  .ds-247420 .ds-sub-btn span { display: block; font-size: 18px; font-weight: 700; color: var(--accent-ink); }
5056
5152
 
5057
- /* SessionRow — base .ds-session-row (layout, hover/focus/active states,
5058
- rail-tone indicators) is canonically defined in chat.css alongside the
5059
- rest of the chat session-list component; this file only carries the
5060
- dev/admin-row sub-parts (id/counts/devcnt/span) that decorate it. */
5153
+ /* SessionRow — the RICH treatment (hover/focus/active, rail tones, nesting,
5154
+ inline rename/delete) lives in chat.css with the rest of the chat session
5155
+ list. But SessionRow is part of this data-density family and is used by kits
5156
+ that never link chat.css (gm_inspector links only colors_and_type +
5157
+ app-shell + editor-primitives), where the component rendered with NO layout
5158
+ at all: gap resolved to `normal`, so id/counts/devcnt/phasewalk/span all
5159
+ butted together at 0px. The layout floor therefore belongs here, next to the
5160
+ sub-parts it positions, so the component is never shipped shapeless.
5161
+ chat.css still layers its interactive states on top; these declarations are
5162
+ identical to the ones there, so a kit loading both gets the same result. */
5163
+ .ds-247420 .ds-session-row {
5164
+ position: relative; display: flex; align-items: center; gap: var(--space-2);
5165
+ width: 100%; padding: var(--space-2); min-height: 52px; margin-bottom: 2px;
5166
+ background: transparent; border: none; border-radius: var(--r-1);
5167
+ text-align: left; color: var(--fg);
5168
+ }
5169
+ /* Only an interactive row gets the pointer affordance (chat.css sets cursor
5170
+ unconditionally because every row there is clickable; here rows are often
5171
+ static readouts). */
5172
+ .ds-247420 .ds-session-row[role="button"], .ds-247420 a.ds-session-row { cursor: pointer; }
5173
+
5174
+ /* Sub-parts that decorate the row above. */
5061
5175
  .ds-247420 .ds-session-row-id {
5062
5176
  font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--accent-ink);
5063
5177
  flex: 0 1 160px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
@@ -5126,11 +5240,115 @@
5126
5240
  /* == appended: ui-kits == */
5127
5241
  /* ============================================================
5128
5242
  ui_kit responsive helpers (kits-grids sweep) */
5129
- .ds-247420 .ds-section-pad { padding: clamp(6px, 1.2vw, 16px); }
5130
- .ds-247420 .ds-panel-gap { margin: var(--space-2) 0; }
5131
- .ds-247420 .ds-panel-duo { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2); margin: var(--space-2) 0; }
5243
+ /* App-surface root. .ds-section carries a --space-8 (96px) editorial rhythm
5244
+ that is correct between landing-page sections and wrong as the ROOT wrapper
5245
+ of an Operate surface, where .app-main has already padded the region used
5246
+ there it just pushes the page heading a screen-inch down and adds dead space
5247
+ below the last panel. This is the app-mode counterpart: no outer margin, and
5248
+ it owns the heading -> lede -> first-panel cadence so each kit stops
5249
+ re-deriving it. Pair with .ds-section-pad for the shadow inset. */
5250
+ .ds-247420 .ds-app-surface { margin: 0; display: flow-root; }
5251
+ /* Operate surfaces run the compact heading ceiling. --fs-h1 tops out at 64px,
5252
+ a display size that makes the page TITLE outweigh the data it labels; the
5253
+ app scale (--fs-h1-app, 22-30px) is what these tokens exist for. Applied
5254
+ here rather than as a data-attribute on each kit shell so any surface using
5255
+ this root gets the app voice without a per-kit opt-in that kits forget. */
5256
+ .ds-247420 .ds-app-surface > h1, .ds-247420 .ds-app-surface > .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
5257
+ .ds-247420 .ds-app-surface > h2, .ds-247420 .ds-app-surface > .t-h2 { font-size: var(--fs-h2-app); }
5258
+ .ds-247420 .ds-app-surface > h3, .ds-247420 .ds-app-surface > .t-h3 { font-size: var(--fs-h3-app); }
5259
+ /* The lede is supporting chrome under an app title, not a marketing stand-first:
5260
+ it drops to body size and keeps a readable measure instead of --fs-xl. */
5261
+ .ds-247420 .ds-app-surface > .lede, .ds-247420 .ds-app-surface > .t-lede { font-size: var(--fs-body); max-width: 60ch; }
5262
+ .ds-247420 .ds-app-surface > h1,
5263
+ .ds-247420 .ds-app-surface > h2 { margin-bottom: var(--space-2); }
5264
+ /* The lede belongs to the heading above it, so it sits tight to that heading
5265
+ and separates generously from the content it introduces. */
5266
+ .ds-247420 .ds-app-surface > .lede,
5267
+ .ds-247420 .ds-app-surface > .t-lede { margin-bottom: calc(var(--space-6) * var(--density)); }
5268
+ /* No leading margin on the first block or trailing margin on the last — the
5269
+ shell owns the region's outer edges. */
5270
+ .ds-247420 .ds-app-surface > :first-child { margin-top: 0; }
5271
+ .ds-247420 .ds-app-surface > :last-child { margin-bottom: 0; }
5272
+
5273
+ /* Section padding is the shell's job (.app-main owns --pad-x). This only adds
5274
+ the small inset a kit root needs so panel shadows are not clipped by the
5275
+ scroll container, and it scales with density like every other app metric —
5276
+ the old clamp(6px,1.2vw,16px) sized against the VIEWPORT inside a
5277
+ container-query layout that measures everything else in cqi. */
5278
+ .ds-247420 .ds-section-pad { padding: calc(var(--space-1) * var(--density)); }
5279
+
5280
+ /* Separation between sibling panels. This is the OUTER rhythm: it must exceed
5281
+ .panel-body's 16px inner sibling gap, otherwise proximity says two unrelated
5282
+ panels belong together more tightly than two rows inside one panel. The old
5283
+ value was --space-2 (8px), which inverted exactly that relationship and made
5284
+ the class named "gap" the only rule in the system that removed separation. */
5285
+ .ds-247420 .ds-panel-gap { margin: calc(var(--space-5) * var(--density)) 0; }
5286
+ /* Density-scaled sibling rhythm for any run of stacked panels, so the cadence
5287
+ holds without each kit re-declaring a margin per panel. */
5288
+ .ds-247420 .ds-panel-gap + .ds-panel-gap { margin-top: calc(var(--space-5) * var(--density)); }
5289
+
5290
+ /* A panel inside a gap-owning parent (grid/flex row). .panel ships a 24px
5291
+ bottom margin for the stacked case; inside a row that margin fights the
5292
+ parent's gap and makes the last row of a wrapping grid sit on a different
5293
+ rhythm than the columns. The container owns separation, so the panel drops
5294
+ its own. Also stretches to the row's height so a short panel next to a tall
5295
+ one does not leave a ragged bottom edge. */
5296
+ /* Drops only the panel's own bottom margin — the row container owns separation.
5297
+ Height is deliberately NOT forced here: whether panels in a row should match
5298
+ heights depends on whether they are a SET (trio: equal peers, matching edge
5299
+ reads as one band) or a PAIR of different things (duo: a 4-bar chart beside a
5300
+ 5-row table, where forcing equality just relocates the dead space inside the
5301
+ shorter panel). Each container decides via align-items below. */
5302
+ .ds-247420 .ds-panel-flush { margin-bottom: 0; }
5303
+
5304
+ /* Paired panels. Container-relative (the shell is the CQ container), so the
5305
+ split collapses when the PANELS are cramped rather than when the viewport
5306
+ crosses an arbitrary width — with a sidebar open those are far apart.
5307
+ minmax(0,1fr) lets a scrolling table shrink instead of forcing overflow. */
5308
+ .ds-247420 .ds-panel-duo {
5309
+ display: grid;
5310
+ grid-template-columns: repeat(2, minmax(0, 1fr));
5311
+ gap: calc(var(--space-3) * var(--density));
5312
+ margin: calc(var(--space-5) * var(--density)) 0;
5313
+ /* A duo pairs two DIFFERENT things (a 4-bar chart beside a 5-row table).
5314
+ Stretching them to a common height does not create equality, it just moves
5315
+ the shorter panel's dead space inside its own body. Each takes its natural
5316
+ height and they align at the top, where the eye actually starts. */
5317
+ align-items: start;
5318
+ }
5319
+ @container (max-width: 900px) {
5320
+ .ds-247420 .ds-panel-duo { grid-template-columns: minmax(0, 1fr); }
5321
+ }
5322
+ /* Fallback for kit roots that are not themselves a container (older kit shells
5323
+ mount outside .app/.ds-stage); harmless where the CQ rule already applies. */
5324
+ @media (max-width: 760px) {
5325
+ .ds-247420 .ds-panel-duo { grid-template-columns: minmax(0, 1fr); }
5326
+ }
5327
+
5328
+ /* Three equal reference panels. Real grid tracks, NOT percentage flex-basis:
5329
+ three 33.33% bases plus two gaps exceed 100% and wrap the last panel onto
5330
+ its own row. Steps 3 -> 2 -> 1 on container width so the panels reflow when
5331
+ they are actually cramped rather than at a viewport number that ignores how
5332
+ much chrome the shell is holding. */
5333
+ .ds-247420 .ds-panel-trio {
5334
+ display: grid;
5335
+ grid-template-columns: repeat(3, minmax(0, 1fr));
5336
+ gap: calc(var(--space-3) * var(--density));
5337
+ margin: calc(var(--space-5) * var(--density)) 0;
5338
+ /* A trio IS a set of equal peers, so a shared bottom edge reads as one band
5339
+ rather than three ragged cards — the opposite call from .ds-panel-duo
5340
+ above, and the reason these are two classes and not one. */
5341
+ align-items: stretch;
5342
+ }
5343
+ .ds-247420 .ds-panel-trio > .panel { height: 100%; }
5344
+ @container (max-width: 1100px) {
5345
+ .ds-247420 .ds-panel-trio { grid-template-columns: repeat(2, minmax(0, 1fr)); }
5346
+ }
5347
+ @container (max-width: 720px) {
5348
+ .ds-247420 .ds-panel-trio { grid-template-columns: minmax(0, 1fr); }
5349
+ }
5132
5350
  @media (max-width: 760px) {
5133
- .ds-247420 .ds-panel-duo { grid-template-columns: 1fr; }
5351
+ .ds-247420 .ds-panel-trio { grid-template-columns: minmax(0, 1fr); }
5134
5352
  }
5135
5353
  /* wide dense rows/tables scroll inside their panel, never the page */
5136
5354
  .ds-247420 .ds-scroll-x { overflow-x: auto; -webkit-overflow-scrolling: touch; max-width: 100%; }
@@ -5165,9 +5383,28 @@
5165
5383
  @media (pointer: coarse) {
5166
5384
  .ds-247420 .ds-deck-controls .btn { min-height: 44px; min-width: 44px; }
5167
5385
  }
5386
+ /* Kit small-label voice — one local composition of the house `.t-label` recipe
5387
+ (base.css) for every eyebrow/label in the appended kit blocks below. These
5388
+ previously each restated the four declarations with drifted tracking
5389
+ (0.1em / 0.06em / --tr-label) and drifted size (11px / --fs-micro); they now
5390
+ share --fs-nano + --tr-label. Members declare only their real differences.
5391
+ --fs-nano because these are dense kit chrome, never body or UI text. */
5392
+ .ds-247420 .ds-slide-eyebrow,
5393
+ .ds-247420 .ds-field-eyebrow,
5394
+ .ds-247420 .ds-auth-field-label,
5395
+ .ds-247420 .ds-lightbox-tag {
5396
+ font-family: var(--ff-mono);
5397
+ font-size: var(--fs-nano);
5398
+ letter-spacing: var(--tr-label);
5399
+ text-transform: uppercase;
5400
+ color: var(--panel-text-3);
5401
+ }
5402
+
5403
+ /* Deliberate overrides: the deck slide eyebrow sits on the app --fg ramp (it is
5404
+ full-bleed slide chrome, not panel chrome) and owns its own bottom gutter. */
5168
5405
  .ds-247420 .ds-slide-eyebrow {
5169
- font-family: var(--ff-mono); font-size: 11px; letter-spacing: 0.1em;
5170
- text-transform: uppercase; color: var(--fg-3); margin-bottom: clamp(12px, 2.5cqw, 24px);
5406
+ color: var(--fg-3);
5407
+ margin-bottom: clamp(12px, 2.5cqw, 24px);
5171
5408
  }
5172
5409
  .ds-247420 .ds-slide-col { display: flex; flex-direction: column; justify-content: center; gap: clamp(12px, 2.5cqw, 24px); min-width: 0; }
5173
5410
  .ds-247420 .ds-slide-col--start { align-items: flex-start; }
@@ -5204,10 +5441,24 @@
5204
5441
  .ds-247420 .ds-slide-split { grid-template-columns: 1fr; }
5205
5442
  }
5206
5443
  .ds-247420 .ds-slide-split-cell {
5207
- padding: 18px; background: var(--bg-2); border-radius: var(--r-2);
5444
+ padding: var(--space-3-5); background: var(--bg-2); border-radius: var(--r-2);
5208
5445
  color: var(--fg-2); font-size: var(--fs-lg); line-height: var(--lh-base); min-width: 0;
5209
5446
  }
5210
- .ds-247420 .ds-slide-split-cell--accent { border-left: 3px solid var(--slide-accent, var(--accent)); }
5447
+ /* DELIBERATE accent spine this modifier's only job is to mark the emphasized
5448
+ half of a split slide (see ui_kits/slide_deck/app.js), so the rule is the
5449
+ whole component, not decoration on a card. Routed through the house
5450
+ .panel-spine idiom (::before rail at --bw-chunk, squared leading corners)
5451
+ instead of an off-scale 3px border-left. */
5452
+ .ds-247420 .ds-slide-split-cell--accent {
5453
+ position: relative;
5454
+ padding-left: calc(var(--space-3-5) + var(--bw-chunk));
5455
+ border-radius: 0 var(--r-2) var(--r-2) 0;
5456
+ }
5457
+ .ds-247420 .ds-slide-split-cell--accent::before {
5458
+ content: ''; position: absolute; left: 0; top: 0; bottom: 0;
5459
+ width: var(--bw-chunk); background: var(--slide-accent, var(--accent));
5460
+ border-radius: var(--bw-chunk) 0 0 var(--bw-chunk);
5461
+ }
5211
5462
 
5212
5463
  /* --- error 404 --------------------------------------------- */
5213
5464
  .ds-247420 .ds-err-hero {
@@ -5253,7 +5504,7 @@
5253
5504
  display: flex; align-items: center; justify-content: center;
5254
5505
  padding: clamp(12px, 4vw, 32px);
5255
5506
  padding-bottom: max(clamp(12px, 4vw, 32px), env(safe-area-inset-bottom));
5256
- z-index: 50;
5507
+ z-index: var(--z-modal);
5257
5508
  }
5258
5509
  .ds-247420 .ds-lightbox-card {
5259
5510
  background: var(--panel-0); border-radius: var(--r-2); padding: clamp(16px, 4vw, 28px);
@@ -5367,15 +5618,29 @@
5367
5618
 
5368
5619
  /* == appended: settings kit cleanup == */
5369
5620
  /* == appended: settings kit == */
5370
- .ds-247420 .ds-settings-main { padding: var(--space-2, 8px); }
5371
- .ds-247420 .ds-settings-body { padding: 14px 18px; }
5372
- .ds-247420 .ds-settings-body-stack { display: flex; flex-direction: column; gap: var(--space-2-5, 10px); }
5373
- .ds-247420 .ds-field-block { margin: var(--space-2-5, 10px) 0; }
5374
- .ds-247420 .ds-field-eyebrow {
5375
- font-family: var(--ff-mono); font-size: 11px; letter-spacing: 0.06em;
5376
- text-transform: uppercase; color: var(--panel-text-3);
5377
- }
5378
- .ds-247420 .ds-hint-sm { font-size: 12px; color: var(--panel-text-2); }
5621
+ /* .app-main already owns this region's padding; this only supplies the inset
5622
+ that keeps panel shadows off the scroll edge (see .ds-section-pad). */
5623
+ .ds-247420 .ds-settings-main { padding: calc(var(--space-1) * var(--density)); }
5624
+ /* .panel-body already pads the panel interior — this sat inside it and
5625
+ double-padded every field, on an off-scale 14/18 pair. The body is now a
5626
+ flow container that owns only the RHYTHM between fields, not a second inset. */
5627
+ .ds-247420 .ds-settings-body { padding: 0; }
5628
+ .ds-247420 .ds-settings-body-stack { display: flex; flex-direction: column; gap: calc(var(--space-2-5) * var(--density)); }
5629
+ /* Field rhythm: the label/control/hint cluster is tight internally, so fields
5630
+ need a clearly larger interval between them than within them, or the whole
5631
+ form reads as one undifferentiated column. Margin-collapse-free (flow root
5632
+ siblings) — first/last are zeroed so the panel body sets the outer edge. */
5633
+ .ds-247420 .ds-field-block { display: flex; flex-direction: column; gap: var(--space-1-75); margin: calc(var(--space-4) * var(--density)) 0 0; }
5634
+ .ds-247420 .ds-settings-body > .ds-field-block:first-child { margin-top: 0; }
5635
+ /* Field width is a hint about expected input length. A name or handle stretched
5636
+ across a 1000px desktop column tells the user to type a paragraph and leaves
5637
+ the eye no left-to-right anchor; capping the control (not the row) keeps the
5638
+ label/hint full-width for wrapping while the input reads as the right size.
5639
+ Textareas keep a wider cap since prose genuinely uses the room. */
5640
+ .ds-247420 .ds-field-block > .input { max-width: 44ch; width: 100%; }
5641
+ .ds-247420 .ds-field-block > textarea.input { max-width: 72ch; }
5642
+ /* .ds-field-eyebrow joins the kit small-label voice above with no overrides. */
5643
+ .ds-247420 .ds-hint-sm { font-size: var(--fs-xs); color: var(--panel-text-2); }
5379
5644
  .ds-247420 .ds-note-quiet { margin: 0; color: var(--panel-text-2); }
5380
5645
  .ds-247420 .ds-btn-row { display: flex; gap: var(--space-2, 8px); flex-wrap: wrap; }
5381
5646
  .ds-247420 .ds-btn-row-tight { gap: var(--space-1-75, 6px); }
@@ -5386,21 +5651,31 @@
5386
5651
  /* Raw --mascot text measures 3.11:1 on paper (fails 4.5:1); --mascot-deep is
5387
5652
  the text-safe tone, same accent/accent-ink split used everywhere else. */
5388
5653
  .ds-247420 .ds-btn-mascot { color: var(--mascot-deep); }
5654
+ /* Sticky commit bar. It floats OVER the form it commits, so it needs real
5655
+ elevation and a larger top margin than the form's own field rhythm —
5656
+ otherwise it reads as one more field rather than as the action for all of
5657
+ them. Spacing is density-scaled like the rest of the surface. */
5389
5658
  .ds-247420 .ds-savebar {
5390
- position: sticky; bottom: 8px; display: flex; align-items: center;
5391
- justify-content: flex-end; gap: 8px; flex-wrap: wrap; padding: 10px;
5392
- background: var(--panel-2); border-radius: var(--r-1); margin: 8px 0;
5659
+ position: sticky; bottom: var(--space-2); z-index: var(--z-sticky);
5660
+ display: flex; align-items: center;
5661
+ justify-content: flex-end; gap: var(--space-2); flex-wrap: wrap;
5662
+ padding: calc(var(--space-2-75) * var(--density)) calc(var(--space-3) * var(--density));
5663
+ background: var(--panel-2); border-radius: var(--r-1);
5664
+ margin: calc(var(--space-5) * var(--density)) 0 var(--space-2);
5665
+ box-shadow: var(--shadow-2, var(--shadow-1));
5393
5666
  }
5394
5667
  .ds-247420 .ds-savebar-note { flex: 1 1 160px; min-width: 0; color: var(--panel-text-2); }
5395
- .ds-247420 .ds-settings-modal { min-width: min(320px, calc(100vw - 32px)); max-width: 480px; }
5396
- .ds-247420 .ds-modal-body-form { padding: 16px; display: flex; flex-direction: column; gap: 12px; }
5397
- .ds-247420 .ds-modal-note { margin: 0 0 8px; color: var(--panel-text-2); font-size: 14px; }
5668
+ .ds-247420 .ds-settings-modal { min-width: min(320px, calc(100vw - var(--space-5))); max-width: 480px; }
5669
+ .ds-247420 .ds-modal-body-form { padding: var(--space-3); display: flex; flex-direction: column; gap: var(--space-2-75); }
5670
+ .ds-247420 .ds-modal-note { margin: 0; color: var(--panel-text-2); font-size: var(--fs-xs); }
5398
5671
  .ds-247420 .ds-draft-preview {
5399
- background: var(--panel-1); padding: 12px; border-radius: var(--r-0);
5400
- font-size: 13px; color: var(--panel-text-2); max-height: 120px;
5672
+ background: var(--panel-1); padding: var(--space-2-75); border-radius: var(--r-0);
5673
+ font-size: var(--fs-micro); color: var(--panel-text-2); max-height: 120px;
5401
5674
  overflow-y: auto; font-family: var(--ff-mono); overflow-wrap: anywhere;
5402
5675
  }
5403
- .ds-247420 .ds-modal-actions { display: flex; gap: 8px; margin-top: 12px; justify-content: space-between; flex-wrap: wrap; }
5676
+ /* Destructive-choice actions get a clearly larger interval than the body's own
5677
+ gap — the decision must not read as the next line of the explanation. */
5678
+ .ds-247420 .ds-modal-actions { display: flex; gap: var(--space-2); margin-top: var(--space-3); justify-content: space-between; flex-wrap: wrap; }
5404
5679
 
5405
5680
  /* == appended: signin kit cleanup == */
5406
5681
  /* -- signin kit (ui_kits/signin) -- */
@@ -5412,7 +5687,7 @@
5412
5687
  .ds-247420 .ds-auth-sent-title { margin: 0; font-weight: 600; }
5413
5688
  .ds-247420 .ds-auth-sent-sub { margin: 0; color: var(--panel-text-2); overflow-wrap: anywhere; }
5414
5689
  .ds-247420 .ds-auth-field { display: flex; flex-direction: column; gap: 4px; }
5415
- .ds-247420 .ds-auth-field-label { font-family: var(--ff-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--panel-text-3); }
5690
+ /* .ds-auth-field-label joins the kit small-label voice above, no overrides. */
5416
5691
  .ds-247420 .ds-auth-row-between { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
5417
5692
  .ds-247420 .ds-auth-remember { display: flex; align-items: center; gap: 6px; cursor: pointer; }
5418
5693
  .ds-247420 .ds-auth-remember-text { color: var(--panel-text-2); font-size: 13px; }
@@ -5444,7 +5719,7 @@
5444
5719
  .ds-247420 .ds-gal-swatch-name { color: var(--panel-text); }
5445
5720
  .ds-247420 .ds-gal-swatch-hint { color: var(--panel-text-3); overflow-wrap: anywhere; }
5446
5721
  .ds-247420 .ds-lightbox-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; flex-wrap: wrap; }
5447
- .ds-247420 .ds-lightbox-tag { font-family: var(--ff-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--panel-text-3); }
5722
+ /* .ds-lightbox-tag joins the kit small-label voice above, no overrides. */
5448
5723
 
5449
5724
  /* --- error_404 kit --- */
5450
5725
  .ds-247420 .ds-err-actions { display: flex; gap: 8px; flex-wrap: wrap; justify-content: center; margin-top: 6px; }
@@ -5460,10 +5735,18 @@
5460
5735
  .ds-247420 .ds-cli-warn .prompt, .ds-247420 .ds-cli-warn .cmd { color: var(--mascot-deep); }
5461
5736
  .ds-247420 .ds-cli-log .prompt { color: var(--fg-3); }
5462
5737
  .ds-247420 .ds-cli-log .cmd { color: var(--fg-2); font-family: var(--ff-mono); }
5463
- .ds-247420 .ds-term-body { padding: 14px 18px; display: flex; flex-direction: column; gap: 4px; background: var(--bg-2); border-radius: var(--r-1); }
5738
+ .ds-247420 .ds-term-body { padding: var(--space-2-75) var(--space-3-5); display: flex; flex-direction: column; gap: var(--space-1); background: var(--bg-2); border-radius: var(--r-1); }
5464
5739
  .ds-247420 .ds-term-body--tall { min-height: 280px; }
5465
- .ds-247420 .ds-term-input-row { margin-top: 6px; }
5466
- .ds-247420 .ds-term-input { flex: 1; min-width: 0; background: transparent; border: 0; outline: 0; font-family: var(--ff-mono); font-size: 13px; color: var(--fg); }
5740
+ .ds-247420 .ds-term-input-row { margin-top: var(--space-1-75); }
5741
+ .ds-247420 .ds-term-input { flex: 1; min-width: 0; background: transparent; border: 0; outline: 0; font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg); }
5742
+ /* The input itself is a prompt line, not a form control, so it is NOT floored
5743
+ to 44px (that would break the terminal's line rhythm). Instead the whole
5744
+ prompt ROW becomes the tap target, and the font goes to 16px so focusing it
5745
+ does not trigger iOS zoom — a sub-16px input is what causes that. */
5746
+ @media (pointer: coarse) {
5747
+ .ds-247420 .ds-term-input-row { min-height: 44px; align-items: center; }
5748
+ .ds-247420 .ds-term-input { font-size: max(16px, var(--fs-micro)); }
5749
+ }
5467
5750
  /* full-viewport render root (community-app) */
5468
5751
  .ds-247420 .ds-root-viewport { height: 100vh; height: 100dvh; }
5469
5752
 
@@ -5527,7 +5810,7 @@
5527
5810
  }
5528
5811
  .ds-247420 .ds-sheet-preview-table thead th {
5529
5812
  position: sticky; top: 0; background: var(--bg-2); color: var(--fg-3);
5530
- font-weight: 600; z-index: 1;
5813
+ font-weight: 600; z-index: var(--z-sticky);
5531
5814
  }
5532
5815
  .ds-247420 .ds-sheet-preview-table td.num { text-align: right; font-variant-numeric: tabular-nums; }
5533
5816
  .ds-247420 .ds-sheet-preview-empty { padding: var(--space-3, 16px); color: var(--fg-3); }
@@ -5538,6 +5821,191 @@
5538
5821
  }
5539
5822
  .ds-247420 .ds-sheet-preview-error-action:hover { background: var(--bg-2); }
5540
5823
  .ds-247420 .ds-sheet-preview-error-action:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: 2px; }
5824
+
5825
+ /* == appended: community kit message list == */
5826
+ /* ui_kits/community mounts CommunityShell (the .cm-* family) but renders its
5827
+ OWN message list in ds-* markup, and its index.html links app-shell.css
5828
+ WITHOUT community.css. So these live here, not in community.css: the .cm-*
5829
+ sheet never reaches this page, and .ds-community-* is ds-family markup by
5830
+ the lint-classes taxonomy anyway. Every rule below deliberately mirrors the
5831
+ .chat-msg / .chat-avatar / .chat-stack primitives in chat-polish.css so the
5832
+ community thread and the chat kit read as one message language. */
5833
+
5834
+ /* Page root — owns the full viewport column so CommunityShell's own 100dvh
5835
+ flex shell has a height to resolve against, with the topbar/status chrome
5836
+ stacked around it. */
5837
+ .ds-247420 .ds-community-page {
5838
+ display: flex;
5839
+ flex-direction: column;
5840
+ min-height: 100vh;
5841
+ min-height: 100dvh;
5842
+ min-width: 0;
5843
+ }
5844
+ /* Main column inside the shell — .cm-main's ds-family counterpart: header
5845
+ pinned, message list taking the remaining height and doing the scrolling. */
5846
+ .ds-247420 .ds-community-main {
5847
+ display: flex;
5848
+ flex-direction: column;
5849
+ flex: 1;
5850
+ min-width: 0;
5851
+ min-height: 0;
5852
+ }
5853
+
5854
+ /* Thread scroller. Same rhythm as .chat-thread (column + --space-3 gap +
5855
+ own overflow), so messages breathe on the same interval as the chat kit. */
5856
+ .ds-247420 .ds-community-messages {
5857
+ display: flex;
5858
+ flex-direction: column;
5859
+ gap: var(--space-3);
5860
+ flex: 1;
5861
+ min-height: 0;
5862
+ overflow-y: auto;
5863
+ padding: var(--space-3);
5864
+ scrollbar-width: thin;
5865
+ scrollbar-color: var(--bg-3) transparent;
5866
+ }
5867
+ .ds-247420 .ds-community-messages::-webkit-scrollbar { width: 8px; }
5868
+ .ds-247420 .ds-community-messages::-webkit-scrollbar-thumb { background: var(--bg-3); border-radius: var(--r-0); }
5869
+
5870
+ /* One message — avatar rail + body stack, matching .chat-msg's flex/gap and
5871
+ its quiet tonal hover (no border, per the zero-border aesthetic). */
5872
+ .ds-247420 .ds-community-msg {
5873
+ display: flex;
5874
+ align-items: flex-start;
5875
+ gap: var(--space-2-75);
5876
+ padding: var(--space-1-75) var(--space-2);
5877
+ margin: 0;
5878
+ border-radius: var(--r-1);
5879
+ min-width: 0;
5880
+ transition: background var(--dur-base) var(--ease);
5881
+ }
5882
+ .ds-247420 .ds-community-msg:hover { background: color-mix(in oklab, var(--fg) 4%, transparent); }
5883
+
5884
+ /* Identity disc. The inline `background:` from app.js supplies the per-author
5885
+ tone; this owns the SHAPE — a circle, which is the whole reason the avatar
5886
+ was rendering as a coloured bar with no rule. Footprint + type match
5887
+ .chat-avatar exactly. */
5888
+ .ds-247420 .ds-community-avatar {
5889
+ flex: 0 0 36px;
5890
+ width: 36px;
5891
+ height: 36px;
5892
+ border-radius: 50%;
5893
+ display: inline-flex;
5894
+ align-items: center;
5895
+ justify-content: center;
5896
+ overflow: hidden;
5897
+ color: var(--ink);
5898
+ font-family: var(--ff-mono);
5899
+ font-size: var(--fs-micro);
5900
+ font-weight: 600;
5901
+ line-height: 1;
5902
+ user-select: none;
5903
+ }
5904
+
5905
+ /* Body stack — name + time on one baseline, text beneath. .chat-stack's
5906
+ column/gap idiom, without the bubble max-width (this is a flat list row,
5907
+ not a two-sided bubble thread). */
5908
+ .ds-247420 .ds-community-msg-body {
5909
+ display: flex;
5910
+ flex-wrap: wrap;
5911
+ align-items: baseline;
5912
+ gap: var(--space-1) var(--space-2);
5913
+ flex: 1;
5914
+ min-width: 0;
5915
+ }
5916
+ /* Author. The inline `color:` from app.js carries the per-author tone; weight
5917
+ and size are what make it read as the row's title. */
5918
+ .ds-247420 .ds-community-msg-name {
5919
+ font-weight: 600;
5920
+ font-size: var(--fs-sm);
5921
+ line-height: 1.3;
5922
+ }
5923
+ /* Timestamp — the quiet mono meta voice used by .cm-user-tag / row .meta. */
5924
+ .ds-247420 .ds-community-msg-time {
5925
+ font-family: var(--ff-mono);
5926
+ font-size: var(--fs-micro);
5927
+ color: var(--fg-3);
5928
+ line-height: 1.3;
5929
+ }
5930
+ /* Message body claims the full second line of the wrapping body row. */
5931
+ .ds-247420 .ds-community-msg-text {
5932
+ flex: 1 0 100%;
5933
+ margin: 0;
5934
+ min-width: 0;
5935
+ color: var(--fg-2);
5936
+ font-size: var(--fs-sm);
5937
+ line-height: var(--lh-base);
5938
+ overflow-wrap: anywhere;
5939
+ }
5940
+
5941
+ @media (prefers-reduced-motion: reduce) {
5942
+ .ds-247420 .ds-community-msg { transition: none; }
5943
+ }
5944
+
5945
+ /* == appended: cross-kit note / swatch / chat-page / caret == */
5946
+
5947
+ /* "about this kit" explanatory block — 8 kits render a run of <p> lines here
5948
+ (often carrying inline Chip()/<code>) inside a .panel body. This is
5949
+ SECONDARY copy annotating the demo above it, so it takes the quiet voice:
5950
+ one step down from body, on the --fg-2 ramp, with a comfortable reading
5951
+ line-height. It owns only the RHYTHM between its lines; the panel body still
5952
+ owns the inset, so this must not re-pad. */
5953
+ .ds-247420 .ds-pattern-notes {
5954
+ display: flex;
5955
+ flex-direction: column;
5956
+ gap: var(--space-2);
5957
+ color: var(--fg-2);
5958
+ font-size: var(--fs-sm);
5959
+ line-height: var(--lh-base);
5960
+ max-width: var(--measure);
5961
+ min-width: 0;
5962
+ }
5963
+ .ds-247420 .ds-pattern-notes p { margin: 0; overflow-wrap: anywhere; }
5964
+ /* Inline literals inside a note read as quoted machinery, not as body copy —
5965
+ same tonal chip treatment .chat-bubble code uses. */
5966
+ .ds-247420 .ds-pattern-notes code {
5967
+ font-family: var(--ff-mono);
5968
+ font-size: 0.92em;
5969
+ background: color-mix(in oklab, var(--fg) 8%, transparent);
5970
+ padding: 0 var(--space-1);
5971
+ border-radius: var(--r-hair);
5972
+ }
5973
+ .ds-247420 .ds-pattern-notes strong { color: var(--fg); font-weight: 600; }
5974
+
5975
+ /* Swatch cell wrapper (system_primer pairs it with .ds-swatch-col, which owns
5976
+ the column/gap). This adds only what the wrapper itself needs: a minimum-zero
5977
+ track so long token names ellipsize inside the grid instead of widening it. */
5978
+ .ds-247420 .ds-swatch { min-width: 0; }
5979
+ .ds-247420 .ds-swatch .ds-swatch-name { overflow-wrap: anywhere; }
5980
+
5981
+ /* Chat kit page root — the thread must own the leftover column height rather
5982
+ than growing the page, so the composer stays on screen. Pairs with
5983
+ .ds-chat-layout (flex column, flex:1) which is already defined above. */
5984
+ .ds-247420 .chat-kit-page {
5985
+ display: flex;
5986
+ flex-direction: column;
5987
+ flex: 1;
5988
+ min-height: 0;
5989
+ min-width: 0;
5990
+ }
5991
+
5992
+ /* Terminal caret — a solid block that sits on the last demo line. Sized in ch
5993
+ so it tracks the mono column it follows. The blink is motion, so it is
5994
+ declared ONLY inside prefers-reduced-motion: no-preference (the same
5995
+ opt-in shape .cm-ch-spinner / .cm-vs-label::before use); with reduced
5996
+ motion the caret is a steady block, still marking the cursor position. */
5997
+ .ds-247420 .cursor-blink {
5998
+ display: inline-block;
5999
+ width: 1ch;
6000
+ height: 1em;
6001
+ margin-left: var(--space-1);
6002
+ background: var(--accent);
6003
+ vertical-align: text-bottom;
6004
+ }
6005
+ @media (prefers-reduced-motion: no-preference) {
6006
+ .ds-247420 .cursor-blink { animation: ds-cursor-blink 1s step-end infinite; }
6007
+ @keyframes ds-cursor-blink { 50% { opacity: 0; } }
6008
+ }
5541
6009
  /* ============================================================
5542
6010
  Git status panel + diff view — changed-file list, unified diff.
5543
6011
  ============================================================ */
@@ -5655,7 +6123,7 @@
5655
6123
  ============================================================ */
5656
6124
 
5657
6125
  .ds-247420 .ds-plugins-overlay {
5658
- position: fixed; inset: 0; z-index: var(--z-modal, 1000);
6126
+ position: fixed; inset: 0; z-index: var(--z-modal);
5659
6127
  background: color-mix(in oklab, var(--ink) 35%, transparent);
5660
6128
  display: flex; align-items: center; justify-content: center;
5661
6129
  padding: var(--space-3);
@@ -5917,6 +6385,25 @@
5917
6385
  All tokens sourced from colors_and_type.css.
5918
6386
  ============================================================ */
5919
6387
 
6388
+ /* ============================================================
6389
+ Small-label voice — the local composition of the house `.t-micro`
6390
+ recipe (src/css/app-shell/base.css). This sheet is a standalone
6391
+ published export consumed via its own <link>, so it cannot join the
6392
+ `.t-micro` selector list; it composes by referencing the identical
6393
+ token set instead. Every selector below that needs the label voice
6394
+ JOINS this rule and declares only what it deliberately differs on —
6395
+ never a second copy of these four declarations.
6396
+ ============================================================ */
6397
+ .ds-247420 .cm-vs-label,
6398
+ .ds-247420 .vx-section-label,
6399
+ .ds-247420 .vx-chip-tag {
6400
+ font-family: var(--ff-mono);
6401
+ font-size: var(--fs-micro);
6402
+ text-transform: uppercase;
6403
+ letter-spacing: var(--tr-label);
6404
+ color: var(--fg-3);
6405
+ }
6406
+
5920
6407
  /* ============================================================
5921
6408
  Shell — top-level flex container for the community layout
5922
6409
  ============================================================ */
@@ -5955,8 +6442,8 @@
5955
6442
  display: flex;
5956
6443
  flex-direction: column;
5957
6444
  align-items: center;
5958
- gap: 8px;
5959
- padding: 12px 0;
6445
+ gap: var(--space-2);
6446
+ padding: var(--space-2-75) 0;
5960
6447
  background: color-mix(in oklab, var(--bg) 70%, var(--ink));
5961
6448
  overflow-y: auto;
5962
6449
  overflow-x: hidden;
@@ -6025,7 +6512,7 @@
6025
6512
  right: -2px;
6026
6513
  min-width: 18px;
6027
6514
  height: 18px;
6028
- padding: 0 5px;
6515
+ padding: 0 var(--space-1-5);
6029
6516
  background: var(--warn);
6030
6517
  color: var(--paper);
6031
6518
  font-family: var(--ff-mono);
@@ -6070,7 +6557,7 @@
6070
6557
  height: 2px;
6071
6558
  background: color-mix(in oklab, var(--fg) 12%, transparent);
6072
6559
  border-radius: var(--r-hair);
6073
- margin: 4px 0;
6560
+ margin: var(--space-1) 0;
6074
6561
  flex-shrink: 0;
6075
6562
  }
6076
6563
 
@@ -6091,8 +6578,8 @@
6091
6578
  display: flex;
6092
6579
  align-items: center;
6093
6580
  justify-content: space-between;
6094
- gap: 8px;
6095
- padding: 14px 16px;
6581
+ gap: var(--space-2);
6582
+ padding: var(--space-2-75) var(--space-3);
6096
6583
  background: var(--bg-2);
6097
6584
  box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
6098
6585
  font-weight: 600;
@@ -6119,10 +6606,10 @@
6119
6606
  min-height: 0;
6120
6607
  overflow-y: auto;
6121
6608
  overflow-x: hidden;
6122
- padding: 8px 0 16px;
6609
+ padding: var(--space-2) 0 var(--space-3);
6123
6610
  display: flex;
6124
6611
  flex-direction: column;
6125
- gap: 2px;
6612
+ gap: var(--space-hair);
6126
6613
  scrollbar-width: thin;
6127
6614
  scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
6128
6615
  }
@@ -6139,15 +6626,15 @@
6139
6626
  .ds-247420 .cm-channel-category {
6140
6627
  display: flex;
6141
6628
  flex-direction: column;
6142
- margin-top: 12px;
6629
+ margin-top: var(--space-2-75);
6143
6630
  }
6144
- .ds-247420 .cm-channel-category:first-child { margin-top: 4px; }
6631
+ .ds-247420 .cm-channel-category:first-child { margin-top: var(--space-1); }
6145
6632
 
6146
6633
  .ds-247420 .cm-category-header {
6147
6634
  display: flex;
6148
6635
  align-items: center;
6149
- gap: 4px;
6150
- padding: 4px 8px 4px 8px;
6636
+ gap: var(--space-1);
6637
+ padding: var(--space-1) var(--space-2);
6151
6638
  font-family: var(--ff-body);
6152
6639
  font-size: var(--fs-micro);
6153
6640
  font-weight: 600;
@@ -6181,6 +6668,10 @@
6181
6668
  text-overflow: ellipsis;
6182
6669
  white-space: nowrap;
6183
6670
  }
6671
+ /* Deliberately NOT the small-label voice: this is the `+` affordance sitting
6672
+ inside .cm-category-header, which IS uppercase + tracked. The zeroed
6673
+ letter-spacing and text-transform are resets of that inherited voice, not a
6674
+ copy of it — a bare glyph must not be tracked apart or case-folded. */
6184
6675
  .ds-247420 .cm-cat-extra {
6185
6676
  font-family: var(--ff-mono);
6186
6677
  font-size: var(--fs-micro);
@@ -6195,7 +6686,7 @@
6195
6686
  justify-content: center;
6196
6687
  width: 28px;
6197
6688
  height: 28px;
6198
- padding: 4px;
6689
+ padding: var(--space-1);
6199
6690
  border: 0;
6200
6691
  background: transparent;
6201
6692
  color: var(--fg-3);
@@ -6217,8 +6708,11 @@
6217
6708
  .ds-247420 .cm-cat-channels {
6218
6709
  display: flex;
6219
6710
  flex-direction: column;
6711
+ /* gap:1px is OFF-SCALE ON PURPOSE — channel rows are meant to read as one
6712
+ near-continuous stack with only a hairline seam between them. --space-hair
6713
+ (2px) doubles the seam and breaks the rows into visibly separate pills. */
6220
6714
  gap: 1px;
6221
- padding: 2px 0;
6715
+ padding: var(--space-hair) 0;
6222
6716
  }
6223
6717
 
6224
6718
  /* ============================================================
@@ -6226,15 +6720,15 @@
6226
6720
  ============================================================ */
6227
6721
  .ds-247420 .cm-channel-item-wrap {
6228
6722
  position: relative;
6229
- padding: 0 8px;
6723
+ padding: 0 var(--space-2);
6230
6724
  }
6231
6725
 
6232
6726
  .ds-247420 .cm-channel-item {
6233
6727
  position: relative;
6234
6728
  display: flex;
6235
6729
  align-items: center;
6236
- gap: 8px;
6237
- padding: 6px 8px;
6730
+ gap: var(--space-2);
6731
+ padding: var(--space-1-75) var(--space-2);
6238
6732
  border-radius: var(--r-1);
6239
6733
  color: var(--fg-3);
6240
6734
  cursor: pointer;
@@ -6350,7 +6844,7 @@
6350
6844
  flex-shrink: 0;
6351
6845
  min-width: 16px;
6352
6846
  height: 16px;
6353
- padding: 0 5px;
6847
+ padding: 0 var(--space-1-5);
6354
6848
  background: var(--warn);
6355
6849
  color: var(--paper);
6356
6850
  font-family: var(--ff-mono);
@@ -6366,7 +6860,7 @@
6366
6860
  .ds-247420 .cm-ch-actions {
6367
6861
  display: inline-flex;
6368
6862
  align-items: center;
6369
- gap: 2px;
6863
+ gap: var(--space-hair);
6370
6864
  opacity: 0;
6371
6865
  transition: opacity var(--dur-snap) var(--ease);
6372
6866
  flex-shrink: 0;
@@ -6376,7 +6870,7 @@
6376
6870
  .ds-247420 .cm-ch-action-btn {
6377
6871
  width: 28px;
6378
6872
  height: 28px;
6379
- padding: 4px;
6873
+ padding: var(--space-1);
6380
6874
  display: inline-flex;
6381
6875
  align-items: center;
6382
6876
  justify-content: center;
@@ -6401,15 +6895,16 @@
6401
6895
  .ds-247420 .cm-ch-voice-users {
6402
6896
  display: flex;
6403
6897
  flex-direction: column;
6898
+ /* gap:1px — same hairline-seam rationale as .cm-cat-channels above. */
6404
6899
  gap: 1px;
6405
- padding: 2px 8px 4px 32px;
6900
+ padding: var(--space-hair) var(--space-2) var(--space-1) var(--space-5);
6406
6901
  }
6407
6902
 
6408
6903
  .ds-247420 .cm-ch-voice-user {
6409
6904
  display: flex;
6410
6905
  align-items: center;
6411
- gap: 8px;
6412
- padding: 3px 6px;
6906
+ gap: var(--space-2);
6907
+ padding: var(--space-half) var(--space-1-75);
6413
6908
  border-radius: var(--r-1);
6414
6909
  color: var(--fg-2);
6415
6910
  font-size: var(--fs-xs);
@@ -6463,8 +6958,8 @@
6463
6958
  .ds-247420 .cm-voice-strip {
6464
6959
  display: none;
6465
6960
  flex-direction: column;
6466
- gap: 8px;
6467
- padding: 10px 12px;
6961
+ gap: var(--space-2);
6962
+ padding: var(--space-2-5) var(--space-2-75);
6468
6963
  background: color-mix(in oklab, var(--green) 18%, var(--bg-2));
6469
6964
  color: var(--fg);
6470
6965
  box-shadow: 0 -1px 0 color-mix(in oklab, var(--fg) 10%, transparent);
@@ -6472,16 +6967,15 @@
6472
6967
  }
6473
6968
  .ds-247420 .cm-voice-strip.open { display: flex; }
6474
6969
 
6970
+ /* Joins the small-label voice above. Deliberate overrides: --green (this is a
6971
+ live-recording indicator, not neutral chrome) and weight 700 (it sits next to
6972
+ a pulsing dot and must read as the loudest thing in the strip). */
6475
6973
  .ds-247420 .cm-vs-label {
6476
- font-family: var(--ff-mono);
6477
- font-size: var(--fs-micro);
6478
- text-transform: uppercase;
6479
- letter-spacing: var(--tr-caps);
6480
6974
  color: var(--green);
6481
6975
  font-weight: 700;
6482
6976
  display: inline-flex;
6483
6977
  align-items: center;
6484
- gap: 6px;
6978
+ gap: var(--space-1-75);
6485
6979
  }
6486
6980
  .ds-247420 .cm-vs-label::before {
6487
6981
  content: '';
@@ -6515,7 +7009,7 @@
6515
7009
  color: var(--fg-2);
6516
7010
  display: flex;
6517
7011
  align-items: center;
6518
- gap: 6px;
7012
+ gap: var(--space-1-75);
6519
7013
  flex-wrap: wrap;
6520
7014
  }
6521
7015
 
@@ -6523,9 +7017,9 @@
6523
7017
  display: inline-flex;
6524
7018
  align-items: center;
6525
7019
  justify-content: center;
6526
- gap: 6px;
7020
+ gap: var(--space-1-75);
6527
7021
  height: 28px;
6528
- padding: 0 10px;
7022
+ padding: 0 var(--space-2-5);
6529
7023
  background: color-mix(in oklab, var(--fg) 10%, transparent);
6530
7024
  color: var(--fg);
6531
7025
  border: 0;
@@ -6553,8 +7047,8 @@
6553
7047
  .ds-247420 .cm-user-panel {
6554
7048
  display: flex;
6555
7049
  align-items: center;
6556
- gap: 8px;
6557
- padding: 8px 8px;
7050
+ gap: var(--space-2);
7051
+ padding: var(--space-2);
6558
7052
  background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
6559
7053
  flex-shrink: 0;
6560
7054
  }
@@ -6607,6 +7101,8 @@
6607
7101
  text-overflow: ellipsis;
6608
7102
  white-space: nowrap;
6609
7103
  }
7104
+ /* Deliberately NOT the small-label voice: a user's handle/tag is content, not
7105
+ chrome, so it stays sentence-case and untracked. Mono + micro + --fg-3 only. */
6610
7106
  .ds-247420 .cm-user-tag {
6611
7107
  font-family: var(--ff-mono);
6612
7108
  font-size: var(--fs-micro);
@@ -6619,7 +7115,7 @@
6619
7115
  .ds-247420 .cm-user-controls {
6620
7116
  display: inline-flex;
6621
7117
  align-items: center;
6622
- gap: 2px;
7118
+ gap: var(--space-hair);
6623
7119
  }
6624
7120
 
6625
7121
  .ds-247420 .cm-user-btn {
@@ -6654,8 +7150,8 @@
6654
7150
  .ds-247420 .cm-chat-header {
6655
7151
  display: flex;
6656
7152
  align-items: center;
6657
- gap: 10px;
6658
- padding: 12px 16px;
7153
+ gap: var(--space-2-5);
7154
+ padding: var(--space-2-75) var(--space-3);
6659
7155
  background: var(--bg);
6660
7156
  box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
6661
7157
  flex-shrink: 0;
@@ -6685,8 +7181,8 @@
6685
7181
  .ds-247420 .cm-chat-header-topic {
6686
7182
  flex: 1;
6687
7183
  min-width: 0;
6688
- padding-left: 12px;
6689
- margin-left: 4px;
7184
+ padding-left: var(--space-2-75);
7185
+ margin-left: var(--space-1);
6690
7186
  border-left: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
6691
7187
  color: var(--fg-3);
6692
7188
  font-size: var(--fs-xs);
@@ -6698,7 +7194,7 @@
6698
7194
  .ds-247420 .cm-chat-header-toolbar {
6699
7195
  display: inline-flex;
6700
7196
  align-items: center;
6701
- gap: 4px;
7197
+ gap: var(--space-1);
6702
7198
  flex-shrink: 0;
6703
7199
  }
6704
7200
 
@@ -6714,7 +7210,7 @@
6714
7210
  overflow-y: auto;
6715
7211
  overflow-x: hidden;
6716
7212
  background: var(--bg-2);
6717
- padding: 16px 0;
7213
+ padding: var(--space-3) 0;
6718
7214
  scrollbar-width: thin;
6719
7215
  scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
6720
7216
  transition: width var(--dur-base) var(--ease), flex-basis var(--dur-base) var(--ease);
@@ -6736,7 +7232,7 @@
6736
7232
  }
6737
7233
 
6738
7234
  .ds-247420 .cm-member-category {
6739
- padding: 12px 16px 6px;
7235
+ padding: var(--space-2-75) var(--space-3) var(--space-1-75);
6740
7236
  font-family: var(--ff-body);
6741
7237
  font-size: var(--fs-micro);
6742
7238
  font-weight: 600;
@@ -6748,9 +7244,9 @@
6748
7244
  .ds-247420 .cm-member-item {
6749
7245
  display: flex;
6750
7246
  align-items: center;
6751
- gap: 10px;
6752
- padding: 6px 12px;
6753
- margin: 0 8px;
7247
+ gap: var(--space-2-5);
7248
+ padding: var(--space-1-75) var(--space-2-75);
7249
+ margin: 0 var(--space-2);
6754
7250
  border-radius: var(--r-1);
6755
7251
  color: var(--fg-2);
6756
7252
  cursor: pointer;
@@ -6815,8 +7311,8 @@
6815
7311
  display: inline-flex;
6816
7312
  flex-direction: column;
6817
7313
  align-items: center;
6818
- gap: 6px;
6819
- padding: 10px;
7314
+ gap: var(--space-1-75);
7315
+ padding: var(--space-2-5);
6820
7316
  border-radius: var(--r-2);
6821
7317
  background: var(--bg-2);
6822
7318
  transition: box-shadow var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
@@ -6866,7 +7362,7 @@
6866
7362
  @media (max-width: 900px) {
6867
7363
  .ds-247420 .cm-channel-sidebar {
6868
7364
  position: absolute;
6869
- z-index: 20;
7365
+ z-index: calc(var(--z-drawer) + 1);
6870
7366
  top: 0;
6871
7367
  left: 72px;
6872
7368
  bottom: 0;
@@ -6879,7 +7375,7 @@
6879
7375
  .ds-247420 .cm-member-list.open {
6880
7376
  display: flex;
6881
7377
  position: absolute;
6882
- z-index: 20;
7378
+ z-index: calc(var(--z-drawer) + 1);
6883
7379
  top: 0;
6884
7380
  right: 0;
6885
7381
  bottom: 0;
@@ -6899,7 +7395,7 @@
6899
7395
  content: '';
6900
7396
  position: absolute;
6901
7397
  inset: 0;
6902
- z-index: 15;
7398
+ z-index: var(--z-drawer);
6903
7399
  background: color-mix(in oklab, var(--ink) 40%, transparent);
6904
7400
  pointer-events: none;
6905
7401
  }
@@ -6915,7 +7411,7 @@
6915
7411
  .ds-247420 .cm-server-back {
6916
7412
  width: 44px;
6917
7413
  height: 44px;
6918
- padding: 4px;
7414
+ padding: var(--space-1);
6919
7415
  }
6920
7416
  .ds-247420 .cm-channel-sidebar,
6921
7417
  .ds-247420 .cm-channel-sidebar.open {
@@ -7061,7 +7557,12 @@
7061
7557
  gap: var(--space-2);
7062
7558
  padding: var(--space-1) var(--space-2);
7063
7559
  background: var(--bg-2);
7064
- border-left: 3px solid var(--accent);
7560
+ /* Hairline, not a 3px accent bar. This is a transient status strip pinned
7561
+ above the composer (role=status, "Replying to <author>"), not a card or a
7562
+ callout — the tinted fill already carries the attachment. A chunky left
7563
+ bar here was the generic accent-stripe tell; the real accent still lands
7564
+ on .cm-rb-author. */
7565
+ border-left: var(--bw-hair) solid var(--rule-strong);
7065
7566
  font-size: 0.85rem;
7066
7567
  }
7067
7568
  .ds-247420 .cm-rb-label { flex: none; color: var(--fg-2); }
@@ -7109,7 +7610,7 @@
7109
7610
  color: inherit;
7110
7611
  font: inherit;
7111
7612
  font-weight: 600;
7112
- padding: 2px var(--space-2);
7613
+ padding: var(--space-hair) var(--space-2);
7113
7614
  border-radius: var(--r-1);
7114
7615
  cursor: pointer;
7115
7616
  }
@@ -7339,13 +7840,7 @@
7339
7840
  border-top: var(--bw-hair) solid var(--rule);
7340
7841
  }
7341
7842
  .ds-247420 .vx-section { display: flex; flex-direction: column; gap: var(--space-2); }
7342
- .ds-247420 .vx-section-label {
7343
- font-family: var(--ff-mono);
7344
- font-size: var(--fs-micro);
7345
- letter-spacing: var(--tr-label);
7346
- text-transform: uppercase;
7347
- color: var(--fg-3);
7348
- }
7843
+ /* Joins the small-label voice above with no overrides — it IS the plain voice. */
7349
7844
  .ds-247420 .vx-segmented { display: flex; gap: var(--space-1); }
7350
7845
  .ds-247420 .vx-seg {
7351
7846
  flex: 1;
@@ -7394,7 +7889,7 @@
7394
7889
  display: flex; gap: var(--space-2);
7395
7890
  overflow-x: auto;
7396
7891
  flex: 1;
7397
- padding-bottom: 2px;
7892
+ padding-bottom: var(--space-hair);
7398
7893
  }
7399
7894
  .ds-247420 .vx-chip {
7400
7895
  display: inline-flex; align-items: center; gap: var(--space-1);
@@ -7413,9 +7908,11 @@
7413
7908
  .ds-247420 .vx-chip-dot { width: 8px; height: 8px; border-radius: var(--r-pill); background: var(--fg-3); flex-shrink: 0; }
7414
7909
  .ds-247420 .vx-chip-name { font-weight: 600; }
7415
7910
  .ds-247420 .vx-chip-dur { font-family: var(--ff-mono); color: var(--fg-3); }
7911
+ /* Joins the small-label voice above. Deliberate overrides: --green + weight 700
7912
+ because this is the "LIVE" badge on a session chip, same signal role as
7913
+ .cm-vs-label. */
7416
7914
  .ds-247420 .vx-chip-tag {
7417
- font-family: var(--ff-mono); font-size: var(--fs-micro);
7418
- color: var(--green); font-weight: 700; letter-spacing: var(--tr-caps);
7915
+ color: var(--green); font-weight: 700;
7419
7916
  }
7420
7917
 
7421
7918
  /* VoiceControls — vx-vc-* */
@@ -7450,7 +7947,7 @@
7450
7947
  @media (max-width: 900px) {
7451
7948
  .ds-247420 .cm-thread-panel {
7452
7949
  position: absolute;
7453
- z-index: 20;
7950
+ z-index: calc(var(--z-drawer) + 1);
7454
7951
  top: 0; right: 0; bottom: 0;
7455
7952
  height: auto;
7456
7953
  width: min(320px, 90vw);
@@ -7471,7 +7968,7 @@
7471
7968
  .ds-247420 .cm-tp-list { flex: 1; min-height: 0; overflow-y: auto; }
7472
7969
  .ds-247420 .cm-tp-item {
7473
7970
  position: relative; /* anchors .cm-tp-dot to the row, not the panel */
7474
- display: flex; flex-direction: column; gap: 2px;
7971
+ display: flex; flex-direction: column; gap: var(--space-hair);
7475
7972
  width: 100%; text-align: left; cursor: pointer;
7476
7973
  padding: var(--space-2); border: none; background: transparent;
7477
7974
  border-bottom: var(--bw-hair) solid var(--rule);
@@ -7496,7 +7993,7 @@
7496
7993
  list surface in the kit uses one shimmer language, never a bare spinner. */
7497
7994
  .ds-247420 .cm-channel-item-skeleton, .ds-247420 .cm-member-item-skeleton {
7498
7995
  display: flex; align-items: center; gap: var(--space-2);
7499
- padding: var(--space-2); margin: 2px var(--space-1);
7996
+ padding: var(--space-2); margin: var(--space-hair) var(--space-1);
7500
7997
  }
7501
7998
  .ds-247420 .cm-channel-item-skeleton .ds-skel-icon, .ds-247420 .cm-member-item-skeleton .ds-skel-icon {
7502
7999
  width: 20px; height: 20px; border-radius: var(--r-round, 50%); flex: none; background: var(--bg-3);
@@ -7505,7 +8002,7 @@
7505
8002
  height: 12px; width: 60%; border-radius: var(--r-1); background: var(--bg-3);
7506
8003
  }
7507
8004
  .ds-247420 .cm-list-item-skeleton {
7508
- display: flex; flex-direction: column; gap: 6px;
8005
+ display: flex; flex-direction: column; gap: var(--space-1-75);
7509
8006
  padding: var(--space-2) var(--space-3); border-bottom: var(--bw-hair) solid var(--rule);
7510
8007
  }
7511
8008
  .ds-247420 .cm-list-item-skeleton .ds-skel-title { height: 12px; width: 55%; border-radius: var(--r-1); background: var(--bg-3); }
@@ -7537,8 +8034,10 @@
7537
8034
  .ds-247420 .cm-forum-item-replies { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .8; white-space: nowrap; }
7538
8035
  .ds-247420 .cm-forum-item-snippet { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .85; }
7539
8036
  .ds-247420 .cm-forum-item-meta { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; font-size: var(--fs-micro, 11px); color: var(--fg-2, var(--fg)); opacity: .7; }
7540
- .ds-247420 .cm-forum-item-tags { display: inline-flex; gap: 4px; }
7541
- .ds-247420 .cm-forum-tag { padding: 1px 6px; border-radius: var(--r-1); background: var(--bg-3); border: var(--bw-hair) solid var(--rule); }
8037
+ .ds-247420 .cm-forum-item-tags { display: inline-flex; gap: var(--space-1); }
8038
+ /* 1px vertical is OFF-SCALE ON PURPOSE the tag is an inline chip inside the
8039
+ forum meta row; --space-hair (2px) tips it past the row height. */
8040
+ .ds-247420 .cm-forum-tag { padding: 1px var(--space-1-75); border-radius: var(--r-1); background: var(--bg-3); border: var(--bw-hair) solid var(--rule); }
7542
8041
 
7543
8042
  /* PageView — cm-page / cm-page-* */
7544
8043
  .ds-247420 .cm-page { display: flex; flex-direction: column; height: 100%; min-height: 0; overflow-y: auto; background: var(--bg-1, var(--bg-2)); color: var(--fg); }
@@ -7565,6 +8064,9 @@
7565
8064
  .ds-247420 .fd-chat-thread { flex: 1 1 auto; min-height: 240px; overflow-y: auto; display: flex; flex-direction: column; gap: var(--space-2, 10px); padding: var(--space-2, 10px); }
7566
8065
  .ds-247420 .fd-page-error { white-space: pre-wrap; overflow-wrap: anywhere; }
7567
8066
  /* Visually-hidden polite live region — announces async busy/done to SR users. */
8067
+ /* margin:-1px is OFF-SCALE ON PURPOSE — the canonical visually-hidden idiom;
8068
+ the negative margin cancels the 1px box so the live region contributes zero
8069
+ layout. A --space-* rung would reintroduce a measurable gap. */
7568
8070
  .ds-247420 .fd-sr-live { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
7569
8071
  /* page-level responsive: tighten padding on narrow viewports */
7570
8072
  @media (max-width: 640px) {
@@ -7604,8 +8106,12 @@
7604
8106
  .ds-247420 .agentchat-controls .ds-select { min-width: 130px; max-width: 240px; }
7605
8107
  /* One shared control metric for the most-seen chrome row (mirrors the
7606
8108
  .ds-dash-toolbar precedent): selects, buttons, export acts all 32px / r-1. */
7607
- .ds-247420 .agentchat-controls .ds-select { min-height: 32px; padding: 4px 28px 4px 10px; font-size: var(--fs-sm); border-radius: var(--r-1); }
7608
- .ds-247420 .agentchat-controls .btn, .ds-247420 .agentchat-controls .btn-primary { padding: 5px 12px; min-height: 32px; border-radius: var(--r-1); font-weight: 500; }
8109
+ /* The 28px right pad is OFF-SCALE ON PURPOSE: it is not rhythm but clearance
8110
+ for the native select's dropdown arrow, which the UA draws at a fixed inset.
8111
+ Snapping to --space-5 (32px) or --space-4 (24px) either wastes a column of
8112
+ text width or lets long option labels run under the arrow. */
8113
+ .ds-247420 .agentchat-controls .ds-select { min-height: 32px; padding: var(--space-1) 28px var(--space-1) var(--space-2-5); font-size: var(--fs-sm); border-radius: var(--r-1); }
8114
+ .ds-247420 .agentchat-controls .btn, .ds-247420 .agentchat-controls .btn-primary { padding: var(--space-1-5) var(--space-2-75); min-height: 32px; border-radius: var(--r-1); font-weight: 500; }
7609
8115
  @media (pointer: coarse) {
7610
8116
  .ds-247420 .agentchat-controls .ds-select, .ds-247420 .agentchat-controls .btn, .ds-247420 .agentchat-controls .btn-primary { min-height: 44px; }
7611
8117
  }
@@ -7625,6 +8131,12 @@
7625
8131
  .ds-247420 .agentchat-controls [role="combobox"] { flex-basis: 100%; }
7626
8132
  }
7627
8133
 
8134
+ /* The .4em/.5em gaps on this status line, .agentchat-head below, and the
8135
+ narrow-viewport .agentchat-controls override are em-based ON PURPOSE, not
8136
+ un-migrated literals: each is the gap between a label and its own inline
8137
+ text/disc, so it must track that element's font-size (these rows are scaled
8138
+ by font-size alone at narrow widths). A --space-* px rung would hold the gap
8139
+ fixed while the type around it shrank. */
7628
8140
  .ds-247420 .agentchat-status {
7629
8141
  display: inline-flex;
7630
8142
  align-items: center;
@@ -7675,7 +8187,7 @@
7675
8187
  border: 1px solid var(--rule);
7676
8188
  color: inherit;
7677
8189
  border-radius: var(--r-1);
7678
- padding: 2px 8px;
8190
+ padding: var(--space-hair) var(--space-2);
7679
8191
  cursor: pointer;
7680
8192
  font: inherit;
7681
8193
  }
@@ -7688,7 +8200,7 @@
7688
8200
  border: var(--bw-hair) solid var(--rule);
7689
8201
  color: var(--fg);
7690
8202
  border-radius: var(--r-1);
7691
- padding: 4px 8px;
8203
+ padding: var(--space-1) var(--space-2);
7692
8204
  font: inherit;
7693
8205
  }
7694
8206
  .ds-247420 .agentchat-cwd-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
@@ -7701,12 +8213,12 @@
7701
8213
  .ds-247420 .agentchat-cwd-editing { flex-direction: column; align-items: stretch; }
7702
8214
  .ds-247420 .agentchat-cwd-row { display: flex; align-items: center; gap: var(--space-2, 8px); flex-wrap: wrap; }
7703
8215
  .ds-247420 .agentchat-cwd-roots, .ds-247420 .agentchat-cwd-recent {
7704
- display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
8216
+ display: flex; align-items: center; gap: var(--space-1-75); flex-wrap: wrap;
7705
8217
  }
7706
8218
  .ds-247420 .agentchat-cwd-recent-label { font-size: var(--fs-tiny); color: var(--fg-3); }
7707
8219
  .ds-247420 .agentchat-cwd-chip {
7708
8220
  background: var(--bg-2); border: var(--bw-hair) solid var(--rule); color: var(--fg-2);
7709
- border-radius: var(--r-pill); padding: 3px 10px; font: inherit; font-size: var(--fs-tiny);
8221
+ border-radius: var(--r-pill); padding: var(--space-half) var(--space-2-5); font: inherit; font-size: var(--fs-tiny);
7710
8222
  cursor: pointer;
7711
8223
  }
7712
8224
  .ds-247420 .agentchat-cwd-chip:hover { border-color: var(--accent); color: var(--fg); }
@@ -7714,17 +8226,17 @@
7714
8226
  .ds-247420 .agentchat-cwd-browse {
7715
8227
  border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
7716
8228
  padding: var(--space-2, 8px); background: var(--bg-2);
7717
- display: flex; flex-direction: column; gap: 6px;
8229
+ display: flex; flex-direction: column; gap: var(--space-1-75);
7718
8230
  max-height: 220px;
7719
8231
  }
7720
8232
  .ds-247420 .agentchat-cwd-browse-list { overflow-y: auto; display: flex; flex-direction: column; max-height: 160px; }
7721
8233
  .ds-247420 .agentchat-cwd-browse-item {
7722
8234
  background: none; border: none; color: var(--fg-2); text-align: left;
7723
- padding: 6px 8px; border-radius: var(--r-1); font: inherit; font-size: var(--fs-tiny);
8235
+ padding: var(--space-1-75) var(--space-2); border-radius: var(--r-1); font: inherit; font-size: var(--fs-tiny);
7724
8236
  cursor: pointer;
7725
8237
  }
7726
8238
  .ds-247420 .agentchat-cwd-browse-item:hover, .ds-247420 .agentchat-cwd-browse-item:focus-visible { background: var(--bg-3, var(--bg)); color: var(--fg); }
7727
- .ds-247420 .agentchat-cwd-browse-loading, .ds-247420 .agentchat-cwd-browse-empty { padding: 6px 8px; font-size: var(--fs-tiny); color: var(--fg-3); }
8239
+ .ds-247420 .agentchat-cwd-browse-loading, .ds-247420 .agentchat-cwd-browse-empty { padding: var(--space-1-75) var(--space-2); font-size: var(--fs-tiny); color: var(--fg-3); }
7728
8240
 
7729
8241
  /* head + thread */
7730
8242
  .ds-247420 .agentchat-head {
@@ -7745,14 +8257,14 @@
7745
8257
  .ds-247420 .agentchat-side-panel { display: flex; flex-direction: column; height: 100%; min-height: 0; border-left: var(--bw-hair) solid var(--bg-3); }
7746
8258
  .ds-247420 .agentchat-side-panel-head {
7747
8259
  display: flex; align-items: center; justify-content: space-between;
7748
- padding: var(--space-2, 8px) var(--space-3, 12px); border-bottom: var(--bw-hair) solid var(--bg-3);
8260
+ padding: var(--space-2, 8px) var(--space-3, 16px); border-bottom: var(--bw-hair) solid var(--bg-3);
7749
8261
  flex: 0 0 auto;
7750
8262
  }
7751
8263
  .ds-247420 .agentchat-side-panel-title { font-size: var(--fs-tiny); font-weight: 600; color: var(--fg-2); text-transform: uppercase; letter-spacing: var(--tr-label); }
7752
8264
  .ds-247420 .agentchat-side-panel-close {
7753
8265
  display: inline-flex; align-items: center; justify-content: center;
7754
8266
  background: none; border: none; color: var(--fg-3); cursor: pointer;
7755
- padding: 4px; border-radius: var(--r-1);
8267
+ padding: var(--space-1); border-radius: var(--r-1);
7756
8268
  }
7757
8269
  .ds-247420 .agentchat-side-panel-close:hover { background: var(--bg-2); color: var(--fg); }
7758
8270
  .ds-247420 .agentchat-side-panel-close:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
@@ -7776,8 +8288,11 @@
7776
8288
 
7777
8289
  /* Jump-to-latest: hidden until the thread scroll listener adds .show. */
7778
8290
  .ds-247420 .agentchat-jump {
7779
- position: absolute; right: 16px; bottom: 12px; z-index: 3;
8291
+ position: absolute; right: 16px; bottom: 12px; z-index: var(--z-raised);
7780
8292
  display: none; align-items: center; gap: .35em;
8293
+ /* em, not --space-*: this pill must scale with its own --fs-tiny text so the
8294
+ capsule stays proportional when a host overrides the chat font size. A px
8295
+ rung would fix the padding while the label grew/shrank inside it. */
7781
8296
  padding: .4em .8em; font: inherit; font-size: var(--fs-tiny); cursor: pointer;
7782
8297
  border-radius: var(--r-pill); border: var(--bw-hair) solid var(--rule);
7783
8298
  background: var(--bg-2); color: var(--fg-2, var(--fg));
@@ -7789,6 +8304,9 @@
7789
8304
 
7790
8305
  /* Streaming caret: a thin blinking bar at the live edge of an assistant turn. */
7791
8306
  .ds-247420 .chat-stream-caret {
8307
+ /* margin-left:1px is OFF-SCALE ON PURPOSE — a hairline optical nudge that
8308
+ separates the caret bar from the last glyph without reading as a space
8309
+ character. --space-hair (2px) is already wide enough to look like one. */
7792
8310
  display: inline-block; width: 2px; height: 1.05em; margin-left: 1px;
7793
8311
  vertical-align: text-bottom; background: var(--accent, var(--fg));
7794
8312
  animation: chat-caret-blink 1s step-end infinite;
@@ -7797,11 +8315,11 @@
7797
8315
  @media (prefers-reduced-motion: reduce) { .ds-247420 .chat-stream-caret { animation: none; opacity: .8; } }
7798
8316
 
7799
8317
  /* Per-message hover-revealed action row (copy / retry / edit). */
7800
- .ds-247420 .chat-msg-actions { display: flex; gap: 2px; margin-top: 3px; opacity: 0; transition: opacity var(--dur-snap, .12s) var(--ease, ease); }
8318
+ .ds-247420 .chat-msg-actions { display: flex; gap: var(--space-hair); margin-top: var(--space-half); opacity: 0; transition: opacity var(--dur-snap, .12s) var(--ease, ease); }
7801
8319
  .ds-247420 .chat-msg:hover .chat-msg-actions, .ds-247420 .chat-msg:focus-within .chat-msg-actions { opacity: 1; }
7802
8320
  .ds-247420 .chat-msg-action {
7803
- display: inline-flex; align-items: center; justify-content: center; gap: 4px;
7804
- min-width: 26px; height: 26px; padding: 0 6px; cursor: pointer;
8321
+ display: inline-flex; align-items: center; justify-content: center; gap: var(--space-1);
8322
+ min-width: 26px; height: 26px; padding: 0 var(--space-1-75); cursor: pointer;
7805
8323
  border: none; border-radius: var(--r-1, 4px); background: none; color: var(--fg-3);
7806
8324
  font-family: var(--ff-body); font-size: var(--fs-tiny);
7807
8325
  }
@@ -7810,7 +8328,12 @@
7810
8328
  .ds-247420 .chat-msg-action:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: 1px; opacity: 1; }
7811
8329
  .ds-247420 .chat-msg-action.is-copied { color: var(--accent-ink); opacity: 1; }
7812
8330
 
7813
- /* Empty state: a fresh thread is an invitation, not a void. */
8331
+ /* Empty state: a fresh thread is an invitation, not a void.
8332
+ The em-based gap/padding through this block and the suggestion chips below
8333
+ are OFF the --space-* px scale ON PURPOSE: the empty state is typeset copy
8334
+ whose rhythm must track its own font-size (hosts scale this panel down on
8335
+ narrow viewports via font-size alone). Fixed px rungs here would decouple
8336
+ the chip padding from the label and break the capsule proportions. */
7814
8337
  .ds-247420 .agentchat-empty {
7815
8338
  margin: auto;
7816
8339
  display: flex;
@@ -7874,7 +8397,7 @@
7874
8397
  font-family: var(--ff-mono); font-size: var(--fs-sm); color: var(--fg-2, var(--fg));
7875
8398
  }
7876
8399
  .ds-247420 .agentchat-install-copy {
7877
- flex: 0 0 auto; cursor: pointer; padding: 2px 8px; min-height: 24px;
8400
+ flex: 0 0 auto; cursor: pointer; padding: var(--space-hair) var(--space-2); min-height: 24px;
7878
8401
  border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
7879
8402
  background: none; color: var(--fg-3);
7880
8403
  font-family: var(--ff-body); font-size: var(--fs-tiny);
@@ -7885,7 +8408,7 @@
7885
8408
 
7886
8409
  /* Host-supplied transcript export actions riding the controls row. */
7887
8410
  .ds-247420 .agentchat-export-act {
7888
- cursor: pointer; padding: 4px 10px; min-height: 32px;
8411
+ cursor: pointer; padding: var(--space-1) var(--space-2-5); min-height: 32px;
7889
8412
  border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
7890
8413
  background: none; color: var(--fg-3);
7891
8414
  font-family: var(--ff-body); font-size: var(--fs-tiny);
@@ -7893,7 +8416,10 @@
7893
8416
  .ds-247420 .agentchat-export-act:hover { background: var(--bg-2); color: var(--fg); }
7894
8417
  .ds-247420 .agentchat-export-act:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: 1px; }
7895
8418
 
7896
- /* "working" tail: a long silent tool call shouldn't read as frozen. */
8419
+ /* "working" tail: a long silent tool call shouldn't read as frozen.
8420
+ em gap/padding here and on .chat-thinking below is deliberate — both tails
8421
+ are inline status text sized off --fs-tiny, and their inset must shrink with
8422
+ the type, not sit on a fixed px rung. */
7897
8423
  .ds-247420 .agentchat-working {
7898
8424
  display: flex;
7899
8425
  align-items: center;
@@ -7905,7 +8431,7 @@
7905
8431
  .ds-247420 .agentchat-working-text { color: var(--fg-3); }
7906
8432
  /* Self-contained dots (chat-thinking-dots lives in a kit sheet not bundled
7907
8433
  into this DS distribution, so the agentchat tail draws its own). */
7908
- .ds-247420 .agentchat-working .chat-thinking-dots { display: inline-flex; gap: 3px; }
8434
+ .ds-247420 .agentchat-working .chat-thinking-dots { display: inline-flex; gap: var(--space-half); }
7909
8435
  .ds-247420 .agentchat-working .chat-thinking-dots span {
7910
8436
  width: 5px; height: 5px; border-radius: 50%;
7911
8437
  background: var(--fg); opacity: .4;
@@ -7926,7 +8452,7 @@
7926
8452
  no muted tone. Reuse the agentchat-dot-bounce keyframe. */
7927
8453
  .ds-247420 .chat-thinking { display: flex; align-items: center; gap: .5em; color: var(--fg-3); font-size: var(--fs-tiny); background: none; padding: .3em .2em; }
7928
8454
  .ds-247420 .chat-thinking-text { color: var(--fg-3); }
7929
- .ds-247420 .chat-thinking-dots { display: inline-flex; gap: 3px; }
8455
+ .ds-247420 .chat-thinking-dots { display: inline-flex; gap: var(--space-half); }
7930
8456
  .ds-247420 .chat-thinking-dots span {
7931
8457
  width: 5px; height: 5px; border-radius: 50%;
7932
8458
  background: var(--fg); opacity: .4;
@@ -8026,7 +8552,7 @@
8026
8552
  .ds-247420 .ds-session-new:hover { background: var(--bg-2); color: var(--fg); }
8027
8553
  /* Rail filter uses the shared .ds-search-input primitive (provides bg/border/
8028
8554
  radius/focus-ring); only the rail layout + touch floor live here. */
8029
- .ds-247420 .ds-session-head .ds-search-input { order: 1; flex: 1 1 auto; min-width: 0; min-height: 36px; padding: 0 10px; }
8555
+ .ds-247420 .ds-session-head .ds-search-input { order: 1; flex: 1 1 auto; min-width: 0; min-height: 36px; padding: 0 var(--space-2-5); }
8030
8556
  .ds-247420 .ds-session-new:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
8031
8557
  /* Touch floor (must FOLLOW the base rules - same specificity, order decides). */
8032
8558
  @media (pointer: coarse) {
@@ -8035,7 +8561,7 @@
8035
8561
  }
8036
8562
  .ds-247420 .ds-session-list, .ds-247420 .ds-session-groups { flex: 1; min-height: 0; overflow-y: auto; padding: var(--space-2); }
8037
8563
  .ds-247420 .ds-session-loadmore {
8038
- width: 100%; margin-top: var(--space-1); padding: 8px 12px;
8564
+ width: 100%; margin-top: var(--space-1); padding: var(--space-2) var(--space-2-75);
8039
8565
  font-size: var(--fs-sm); font-family: inherit; color: var(--fg-3);
8040
8566
  background: none; border: var(--bw-hair) dashed var(--rule); border-radius: var(--r-1);
8041
8567
  cursor: pointer; text-align: center;
@@ -8046,11 +8572,11 @@
8046
8572
  /* Grouped rows (Today/Yesterday/...) lay out like the flat list; the section
8047
8573
  label sticks to the top of the scroll area for Claude-Desktop-style headers. */
8048
8574
  .ds-247420 .ds-session-group { display: flex; flex-direction: column; }
8049
- .ds-247420 .ds-session-group-rows { display: flex; flex-direction: column; gap: 2px; }
8050
- .ds-247420 .ds-session-group-label { position: sticky; top: 0; z-index: 1; background: var(--bg-1, var(--bg)); font-size: var(--fs-tiny); font-weight: 600; color: var(--fg-3); text-transform: uppercase; letter-spacing: var(--tr-label); padding: var(--space-2) var(--space-2) var(--space-1); }
8575
+ .ds-247420 .ds-session-group-rows { display: flex; flex-direction: column; gap: var(--space-hair); }
8576
+ .ds-247420 .ds-session-group-label { position: sticky; top: 0; z-index: var(--z-sticky); background: var(--bg-1, var(--bg)); font-size: var(--fs-tiny); font-weight: 600; color: var(--fg-3); text-transform: uppercase; letter-spacing: var(--tr-label); padding: var(--space-2) var(--space-2) var(--space-1); }
8051
8577
  .ds-247420 .ds-session-row {
8052
8578
  position: relative; display: flex; align-items: center; gap: var(--space-2);
8053
- width: 100%; padding: var(--space-2); min-height: 52px; margin-bottom: 2px;
8579
+ width: 100%; padding: var(--space-2); min-height: 52px; margin-bottom: var(--space-hair);
8054
8580
  background: transparent; border: none; border-radius: var(--r-1);
8055
8581
  cursor: pointer; text-align: left; color: var(--fg);
8056
8582
  }
@@ -8065,7 +8591,7 @@
8065
8591
  .ds-247420 .ds-session-row.rail-green::before { background: var(--accent-ink); }
8066
8592
  .ds-247420 .ds-session-row.rail-purple::before { background: var(--purple-2); }
8067
8593
  .ds-247420 .ds-session-row.rail-flame::before { background: var(--flame); }
8068
- .ds-247420 .ds-session-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
8594
+ .ds-247420 .ds-session-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--space-hair); }
8069
8595
  .ds-247420 .ds-session-title { font-size: var(--fs-sm); color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
8070
8596
  .ds-247420 .ds-session-sub { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
8071
8597
  .ds-247420 .ds-session-meta { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
@@ -8135,7 +8661,7 @@
8135
8661
  it only goes loud while ARMED (the one-shot press-again confirm). */
8136
8662
  .ds-247420 .ds-dash-header .btn, .ds-247420 .ds-dash-header .btn-primary {
8137
8663
  margin-left: 0;
8138
- padding: 5px 12px; min-height: 32px; border-radius: var(--r-1); font-weight: 500;
8664
+ padding: var(--space-1-5) var(--space-2-75); min-height: 32px; border-radius: var(--r-1); font-weight: 500;
8139
8665
  }
8140
8666
  .ds-247420 .ds-dash-header .btn-primary.danger {
8141
8667
  background: transparent; color: var(--warn);
@@ -8156,7 +8682,7 @@
8156
8682
  .ds-247420 .ds-dash-status.is-error { color: var(--flame); }
8157
8683
  .ds-247420 .ds-dash-agent { font-size: var(--fs-body); font-weight: 600; color: var(--fg); }
8158
8684
  .ds-247420 .ds-dash-model { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); margin-left: auto; }
8159
- .ds-247420 .ds-dash-meta { display: flex; flex-direction: column; gap: 2px; }
8685
+ .ds-247420 .ds-dash-meta { display: flex; flex-direction: column; gap: var(--space-hair); }
8160
8686
  .ds-247420 .ds-dash-cwd { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
8161
8687
  .ds-247420 .ds-dash-stat { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2); }
8162
8688
  .ds-247420 .ds-dash-stat-cost { color: var(--fg); font-weight: 600; }
@@ -8187,7 +8713,7 @@
8187
8713
  letter-spacing: var(--tr-caps); text-transform: uppercase;
8188
8714
  padding: 0 0 var(--space-2);
8189
8715
  }
8190
- .ds-247420 .ds-context-group .row + .row { margin-top: 2px; }
8716
+ .ds-247420 .ds-context-group .row + .row { margin-top: var(--space-hair); }
8191
8717
 
8192
8718
  /* ============================================================================
8193
8719
  Cohesion sweep (gui-cohesion.js): one-product polish across surfaces.
@@ -8201,7 +8727,7 @@
8201
8727
  .ds-247420 .chat-code-copy {
8202
8728
  position: absolute; top: 6px; right: 6px;
8203
8729
  display: inline-flex; align-items: center; justify-content: center;
8204
- min-width: 48px; min-height: 24px; padding: 2px 8px;
8730
+ min-width: 48px; min-height: 24px; padding: var(--space-hair) var(--space-2);
8205
8731
  border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1, 4px);
8206
8732
  background: var(--bg-2); color: var(--fg-2); cursor: pointer;
8207
8733
  font-family: var(--ff-body); font-size: var(--fs-tiny);
@@ -8244,7 +8770,7 @@
8244
8770
 
8245
8771
  /* --- A5: composer context line (agent / model / cwd at point of typing). --- */
8246
8772
  .ds-247420 .chat-composer-context {
8247
- display: block; width: 100%; text-align: left; padding: 4px var(--space-3) 0;
8773
+ display: block; width: 100%; text-align: left; padding: var(--space-1) var(--space-3) 0;
8248
8774
  background: none; border: none; cursor: default; color: var(--fg-3);
8249
8775
  font-family: var(--ff-mono); font-size: var(--fs-tiny);
8250
8776
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
@@ -8286,11 +8812,11 @@
8286
8812
  height, never a stacked full-width form column. */
8287
8813
  .ds-247420 .ds-dash-toolbar { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
8288
8814
  .ds-247420 .ds-dash-toolbar .ds-search-input {
8289
- width: 200px; min-height: 32px; padding: 5px 10px;
8815
+ width: 200px; min-height: 32px; padding: var(--space-1-5) var(--space-2-5);
8290
8816
  font-size: var(--fs-sm); border-radius: var(--r-1);
8291
8817
  }
8292
8818
  .ds-247420 .ds-dash-toolbar .ds-select, .ds-247420 .ds-dash-toolbar select {
8293
- min-height: 32px; padding: 4px 10px; font-size: var(--fs-sm);
8819
+ min-height: 32px; padding: var(--space-1) var(--space-2-5); font-size: var(--fs-sm);
8294
8820
  width: auto; border-radius: var(--r-1);
8295
8821
  }
8296
8822
  .ds-247420 .ds-dash-stream { font-size: var(--fs-tiny); color: var(--fg-3); }
@@ -8299,7 +8825,7 @@
8299
8825
  .ds-247420 .ds-dash-stream.is-connecting { color: var(--amber); }
8300
8826
  .ds-247420 .ds-dash-header .spread { flex: 1; }
8301
8827
  .ds-247420 .ds-dash-errors-toggle {
8302
- padding: 4px 10px; min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
8828
+ padding: var(--space-1) var(--space-2-5); min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
8303
8829
  border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2);
8304
8830
  cursor: pointer; font-family: var(--ff-body); font-size: var(--fs-tiny);
8305
8831
  }
@@ -8342,14 +8868,14 @@
8342
8868
  .ds-247420 .ds-preview-code-wrap { display: flex; flex-direction: column; min-height: 0; }
8343
8869
  .ds-247420 .ds-preview-code-head { flex: 0 0 auto; }
8344
8870
  /* --- E2: prev/next stepper in preview head. --- */
8345
- .ds-247420 .ds-preview-step { display: inline-flex; gap: 2px; }
8346
- .ds-247420 .ds-preview-step .ds-file-act { min-width: 40px; padding: 0 6px; font-family: var(--ff-body); font-size: var(--fs-tiny); }
8871
+ .ds-247420 .ds-preview-step { display: inline-flex; gap: var(--space-hair); }
8872
+ .ds-247420 .ds-preview-step .ds-file-act { min-width: 40px; padding: 0 var(--space-1-75); font-family: var(--ff-body); font-size: var(--fs-tiny); }
8347
8873
 
8348
8874
  /* --- D1: file grid "show more" row. --- */
8349
8875
  .ds-247420 .ds-file-more { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3); justify-content: center; }
8350
8876
  .ds-247420 .ds-file-more-count { font-size: var(--fs-tiny); color: var(--fg-3); }
8351
8877
  .ds-247420 .ds-file-more-btn {
8352
- padding: 4px 12px; min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
8878
+ padding: var(--space-1) var(--space-2-75); min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
8353
8879
  border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2); cursor: pointer;
8354
8880
  font-family: var(--ff-body); font-size: var(--fs-tiny);
8355
8881
  }
@@ -8358,9 +8884,9 @@
8358
8884
  .ds-247420 .ds-file-row.is-locked { opacity: .6; }
8359
8885
 
8360
8886
  /* --- D4: roots picker segmented control. --- */
8361
- .ds-247420 .ds-roots-picker { display: inline-flex; gap: 2px; padding: 2px; background: var(--bg-2); border-radius: var(--r-1); }
8887
+ .ds-247420 .ds-roots-picker { display: inline-flex; gap: var(--space-hair); padding: var(--space-hair); background: var(--bg-2); border-radius: var(--r-1); }
8362
8888
  .ds-247420 .ds-roots-tab {
8363
- padding: 4px 10px; min-height: 32px; border: none; border-radius: var(--r-1);
8889
+ padding: var(--space-1) var(--space-2-5); min-height: 32px; border: none; border-radius: var(--r-1);
8364
8890
  background: none; color: var(--fg-3); cursor: pointer;
8365
8891
  font-family: var(--ff-body); font-size: var(--fs-tiny);
8366
8892
  }
@@ -8394,7 +8920,7 @@
8394
8920
  .ds-247420 .ds-session-meta-label { color: var(--fg-3); }
8395
8921
  .ds-247420 .ds-session-meta-value { font-family: var(--ff-mono); color: var(--fg-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
8396
8922
  .ds-247420 .ds-session-meta-copy, .ds-247420 .ds-session-meta-action {
8397
- padding: 2px 8px; min-height: 24px; cursor: pointer;
8923
+ padding: var(--space-hair) var(--space-2); min-height: 24px; cursor: pointer;
8398
8924
  background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-1);
8399
8925
  color: var(--fg-3); font-family: var(--ff-body); font-size: var(--fs-micro);
8400
8926
  }
@@ -8413,7 +8939,7 @@
8413
8939
  can discover Enter-vs-Shift+Enter without having to focus it first;
8414
8940
  hidden under 420px to save rows. */
8415
8941
  .ds-247420 .chat-composer-hint {
8416
- display: block; width: 100%; order: 5; padding: 2px var(--space-1) 0;
8942
+ display: block; width: 100%; order: 5; padding: var(--space-hair) var(--space-1) 0;
8417
8943
  font-size: var(--fs-micro); color: var(--fg-3);
8418
8944
  }
8419
8945
  @media (max-width: 420px) {
@@ -8422,13 +8948,13 @@
8422
8948
 
8423
8949
  /* Transient composer note (paste/drop not supported), aria-live polite. */
8424
8950
  .ds-247420 .chat-composer-note {
8425
- padding: 4px var(--space-3); font-size: var(--fs-tiny); color: var(--fg-2);
8951
+ padding: var(--space-1) var(--space-3); font-size: var(--fs-tiny); color: var(--fg-2);
8426
8952
  }
8427
8953
 
8428
8954
  /* Streaming elapsed-time counter: ticks m:ss while a turn is in flight.
8429
8955
  Tabular-nums so the digits don't jitter the layout every second. */
8430
8956
  .ds-247420 .chat-composer-elapsed {
8431
- order: 5; padding: 2px var(--space-1) 0;
8957
+ order: 5; padding: var(--space-hair) var(--space-1) 0;
8432
8958
  font-size: var(--fs-micro); color: var(--fg-3);
8433
8959
  font-variant-numeric: tabular-nums; font-feature-settings: 'tnum';
8434
8960
  }
@@ -8438,7 +8964,7 @@
8438
8964
  new chrome. */
8439
8965
  .ds-247420 .chat-composer-detected-badge {
8440
8966
  display: flex; align-items: center; gap: var(--space-2, 8px);
8441
- padding: 4px var(--space-3); font-size: var(--fs-tiny); color: var(--fg-2);
8967
+ padding: var(--space-1) var(--space-3); font-size: var(--fs-tiny); color: var(--fg-2);
8442
8968
  background: var(--bg-2); border: var(--bw-hair) solid var(--rule);
8443
8969
  border-radius: var(--r-1); width: 100%; order: -1;
8444
8970
  }
@@ -8446,7 +8972,7 @@
8446
8972
  .ds-247420 .chat-composer-detected-dismiss {
8447
8973
  flex: 0 0 auto; background: none; border: none; cursor: pointer;
8448
8974
  color: var(--fg-3); font: inherit; font-size: var(--fs-tiny);
8449
- padding: 2px 6px; border-radius: var(--r-1);
8975
+ padding: var(--space-hair) var(--space-1-75); border-radius: var(--r-1);
8450
8976
  }
8451
8977
  .ds-247420 .chat-composer-detected-dismiss:hover { color: var(--fg); }
8452
8978
  .ds-247420 .chat-composer-detected-dismiss:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
@@ -8499,7 +9025,7 @@
8499
9025
  /* Out-of-band turn notices: neutral tone (NOT error red) — a stopped or
8500
9026
  incomplete turn must not read as a finished answer. */
8501
9027
  .ds-247420 .chat-msg-notice {
8502
- margin-top: var(--space-1); padding: 6px 10px;
9028
+ margin-top: var(--space-1); padding: var(--space-1-75) var(--space-2-5);
8503
9029
  border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
8504
9030
  background: var(--bg-2); color: var(--fg-2); font-size: var(--fs-tiny);
8505
9031
  }
@@ -8514,14 +9040,14 @@
8514
9040
  .ds-247420 .chat-msg-retry-btn {
8515
9041
  border: var(--bw-hair) solid var(--danger); border-radius: var(--r-1);
8516
9042
  background: transparent; color: var(--danger-ink, var(--danger));
8517
- font: inherit; font-size: var(--fs-tiny); padding: 2px 10px; cursor: pointer;
9043
+ font: inherit; font-size: var(--fs-tiny); padding: var(--space-hair) var(--space-2-5); cursor: pointer;
8518
9044
  }
8519
9045
  .ds-247420 .chat-msg-retry-btn:hover { background: var(--danger); color: var(--bg); }
8520
9046
  .ds-247420 .chat-msg-retry-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
8521
9047
 
8522
9048
  /* Tail-window streaming head ('streaming · N KB so far'). */
8523
9049
  .ds-247420 .chat-stream-head {
8524
- padding: 2px 0 6px; font-family: var(--ff-mono);
9050
+ padding: var(--space-hair) 0 var(--space-1-75); font-family: var(--ff-mono);
8525
9051
  font-size: var(--fs-micro); color: var(--fg-3);
8526
9052
  }
8527
9053
 
@@ -8532,7 +9058,7 @@
8532
9058
  }
8533
9059
  .ds-247420 .agentchat-earlier-count { font-size: var(--fs-tiny); color: var(--fg-3); }
8534
9060
  .ds-247420 .agentchat-earlier-btn {
8535
- padding: 4px 12px; min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
9061
+ padding: var(--space-1) var(--space-2-75); min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
8536
9062
  border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2); cursor: pointer;
8537
9063
  font-family: var(--ff-body); font-size: var(--fs-tiny);
8538
9064
  }
@@ -8558,7 +9084,10 @@
8558
9084
 
8559
9085
  /* External (observed, not owned) session card: no stop control exists. */
8560
9086
  .ds-247420 .ds-dash-external {
8561
- padding: 1px 6px; border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-pill);
9087
+ /* 1px vertical is OFF-SCALE ON PURPOSE — a --fs-micro uppercase pill whose
9088
+ height must stay inside the card's meta row. --space-hair (2px) tips it
9089
+ past the row and pushes the card taller. Horizontal snaps normally. */
9090
+ padding: 1px var(--space-1-75); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-pill);
8562
9091
  font-size: var(--fs-micro); color: var(--fg-3); text-transform: uppercase; letter-spacing: var(--tr-caps);
8563
9092
  }
8564
9093
  .ds-247420 .ds-dash-card.is-external { border-style: dashed; }
@@ -8597,11 +9126,18 @@
8597
9126
  .ds-247420 .chat-msg-flat .chat-role { margin-bottom: var(--space-2); }
8598
9127
  .ds-247420 .chat-msg-flat .chat-md { line-height: var(--lh-long); }
8599
9128
  .ds-247420 .chat-msg-flat .chat-md p { margin: var(--space-2) 0; }
9129
+ /* The `+ 2px` is an OFF-SCALE optical correction, not a rhythm step: the tinted
9130
+ assistant row needs marginally more inset than the untinted .you row so the
9131
+ fill does not appear to crowd the text. Expressing it as a --space-* rung
9132
+ would make it a visible step rather than the sub-perceptual nudge intended. */
8600
9133
  .ds-247420 .chat-msg-flat.them { padding-block: calc(var(--space-3) * var(--density, 1) + 2px); }
8601
9134
  /* Inline backtick code (renderInline tags <code class=chat-tick>) - was a dead
8602
9135
  class relying on the generic .chat-bubble code rule, so notices / non-bubble
8603
9136
  surfaces got unstyled monospace. Self-style it regardless of container. */
8604
- .ds-247420 .chat-tick { font-family: var(--ff-mono); font-size: .92em; background: color-mix(in oklab, var(--fg) 10%, transparent); padding: 1px 6px; border-radius: var(--r-1); }
9137
+ /* 1px vertical is OFF-SCALE ON PURPOSE inline code sits INSIDE a line of running
9138
+ prose; any larger vertical pad makes the tinted box overlap the lines above and
9139
+ below. Horizontal is on the scale. */
9140
+ .ds-247420 .chat-tick { font-family: var(--ff-mono); font-size: .92em; background: color-mix(in oklab, var(--fg) 10%, transparent); padding: 1px var(--space-1-75); border-radius: var(--r-1); }
8605
9141
  /* Structured tool/code output earns more width than running prose (claude.ai/code
8606
9142
  lets diffs/tables break out wider than the reading measure). A flat turn that
8607
9143
  contains a tool card or code block widens itself AND its stack past --measure;
@@ -8653,7 +9189,7 @@
8653
9189
  margin-left: auto; flex: 0 0 auto;
8654
9190
  font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: var(--tr-caps);
8655
9191
  color: var(--fg-3);
8656
- padding: 2px var(--space-2); border-radius: var(--r-pill);
9192
+ padding: var(--space-hair) var(--space-2); border-radius: var(--r-pill);
8657
9193
  background: color-mix(in oklab, var(--fg) 6%, transparent);
8658
9194
  }
8659
9195
  .ds-247420 .chat-msg .chat-tool.tool-running .chat-tool-status { color: var(--accent-ink); background: color-mix(in oklab, var(--accent) 12%, transparent); }
@@ -8681,8 +9217,8 @@
8681
9217
  structured CodeNode). injectCodeCopy reads the language- class. */
8682
9218
  .ds-247420 .chat-code-block { position: relative; }
8683
9219
  .ds-247420 .chat-code-lang {
8684
- position: absolute; top: 0; left: 0; z-index: 2;
8685
- padding: 2px var(--space-2); border-bottom-right-radius: var(--r-1);
9220
+ position: absolute; top: 0; left: 0; z-index: var(--z-raised);
9221
+ padding: var(--space-hair) var(--space-2); border-bottom-right-radius: var(--r-1);
8686
9222
  font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: var(--tr-caps);
8687
9223
  color: var(--fg-3); background: color-mix(in oklab, var(--fg) 6%, transparent);
8688
9224
  pointer-events: none;
@@ -8742,7 +9278,7 @@
8742
9278
  .ds-247420 .ds-dash-clear:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: 1px; border-radius: var(--r-1); }
8743
9279
 
8744
9280
  /* Conversation-rail loading skeleton (cold ccsniff walk). */
8745
- .ds-247420 .ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
9281
+ .ds-247420 .ds-session-row-skeleton { display: flex; flex-direction: column; gap: var(--space-1-75); padding: var(--space-2) var(--space-3); }
8746
9282
  .ds-247420 .ds-session-row-skeleton .ds-skel { background: var(--bg-3); border-radius: var(--r-1); }
8747
9283
  .ds-247420 .ds-session-row-skeleton .ds-skel-title { height: 12px; width: 70%; }
8748
9284
  .ds-247420 .ds-session-row-skeleton .ds-skel-meta { height: 9px; width: 45%; }
@@ -8793,7 +9329,7 @@
8793
9329
  Hover/focus/active-state rules on the originals still apply.
8794
9330
  ---------------------------------------------------------------------------- */
8795
9331
  .ds-247420 .row-act, .ds-247420 .ds-dash-errors-toggle, .ds-247420 .agentchat-export-act, .ds-247420 .ds-file-more-btn {
8796
- min-height: 32px; padding: 5px 12px; border-radius: var(--r-1);
9332
+ min-height: 32px; padding: var(--space-1-5) var(--space-2-75); border-radius: var(--r-1);
8797
9333
  font-family: var(--ff-body); font-size: var(--fs-tiny); font-weight: 500;
8798
9334
  background: transparent; border: var(--bw-hair) solid var(--rule); color: var(--fg-2);
8799
9335
  cursor: pointer;
@@ -8802,7 +9338,7 @@
8802
9338
  background: var(--bg-2); color: var(--fg);
8803
9339
  }
8804
9340
  .ds-247420 .agentchat-install-copy, .ds-247420 .ds-upload-act, .ds-247420 .ds-session-meta-copy {
8805
- min-height: 24px; padding: 2px 8px; border-radius: var(--r-1);
9341
+ min-height: 24px; padding: var(--space-hair) var(--space-2); border-radius: var(--r-1);
8806
9342
  font-family: var(--ff-body); font-size: var(--fs-tiny);
8807
9343
  background: transparent; border: var(--bw-hair) solid var(--rule); color: var(--fg-3);
8808
9344
  cursor: pointer;
@@ -8856,7 +9392,10 @@
8856
9392
  border-top: var(--bw-hair) solid var(--rule);
8857
9393
  border-bottom: var(--bw-hair) solid var(--rule);
8858
9394
  pointer-events: none;
8859
- z-index: 1;
9395
+ /* Minimap internal order: centerline < viewport < dot < tooltip. All four
9396
+ live inside the one raised widget, so they share its rung and differ
9397
+ only by a local offset. */
9398
+ z-index: calc(var(--z-raised) + 1);
8860
9399
  }
8861
9400
  .ds-247420 .chat-minimap-centerline {
8862
9401
  position: absolute;
@@ -8866,7 +9405,7 @@
8866
9405
  width: 1px;
8867
9406
  background: var(--rule);
8868
9407
  transform: translateX(-50%);
8869
- z-index: 0;
9408
+ z-index: var(--z-raised);
8870
9409
  }
8871
9410
  .ds-247420 .chat-minimap-dot {
8872
9411
  position: absolute;
@@ -8876,7 +9415,7 @@
8876
9415
  border-radius: var(--r-pill, 999px);
8877
9416
  transform: translate(-50%, -50%) scale(1);
8878
9417
  transition: transform 0.1s;
8879
- z-index: 2;
9418
+ z-index: calc(var(--z-raised) + 2);
8880
9419
  }
8881
9420
  .ds-247420 .chat-minimap-dot.is-user {
8882
9421
  background: color-mix(in oklab, var(--accent) 18%, transparent);
@@ -8898,7 +9437,10 @@
8898
9437
  border-left: 2px solid var(--fg-3);
8899
9438
  border-radius: var(--r-1);
8900
9439
  padding: calc(var(--space-1) / 2) var(--space-2);
8901
- z-index: 100;
9440
+ /* Top of the minimap's internal order. Deliberately NOT --z-tooltip: it is
9441
+ clipped to the minimap rail rather than floating over the app, so it must
9442
+ not outrank real overlays that may cover the rail. */
9443
+ z-index: calc(var(--z-raised) + 3);
8902
9444
  pointer-events: none;
8903
9445
  opacity: 0.45;
8904
9446
  font-size: var(--fs-tiny);
@@ -8936,8 +9478,8 @@
8936
9478
  }
8937
9479
  .ds-247420 .ds-ep-panel-head {
8938
9480
  flex-shrink: 0;
8939
- display: flex; align-items: center; justify-content: space-between; gap: 8px;
8940
- padding: 6px 10px;
9481
+ display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
9482
+ padding: var(--space-1-75) var(--space-2-5);
8941
9483
  border-bottom: 1px solid var(--rule);
8942
9484
  font-size: var(--fs-micro, 11px); font-weight: 600;
8943
9485
  text-transform: uppercase; letter-spacing: 0.1em;
@@ -8951,7 +9493,7 @@
8951
9493
  }
8952
9494
  .ds-247420 .ds-ep-panel-body {
8953
9495
  flex: 1; min-height: 0; overflow: auto;
8954
- padding: 6px 8px;
9496
+ padding: var(--space-1-75) var(--space-2);
8955
9497
  }
8956
9498
  .ds-247420 .ds-ep-panel-body.flush { padding: 0; }
8957
9499
  /* A sub-section divider inside a docked panel (e.g. app-prop mount). Only
@@ -8967,36 +9509,36 @@
8967
9509
  /* Dense status strip for editor chrome — thin, flush, bordered top. */
8968
9510
  .ds-247420 .ds-ep-statusbar {
8969
9511
  flex-shrink: 0;
8970
- display: flex; align-items: center; justify-content: space-between; gap: 8px;
9512
+ display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
8971
9513
  min-height: 0; height: 26px;
8972
- padding: 0 10px;
9514
+ padding: 0 var(--space-2-5);
8973
9515
  border-top: 1px solid var(--rule);
8974
9516
  background: var(--panel-1);
8975
9517
  color: var(--panel-text-2);
8976
9518
  font: var(--fs-micro, 11px)/1 var(--ff-mono, monospace);
8977
9519
  }
8978
- .ds-247420 .ds-ep-statusbar-left, .ds-247420 .ds-ep-statusbar-right { display: flex; align-items: center; gap: 8px; min-width: 0; }
9520
+ .ds-247420 .ds-ep-statusbar-left, .ds-247420 .ds-ep-statusbar-right { display: flex; align-items: center; gap: var(--space-2); min-width: 0; }
8979
9521
  .ds-247420 .ds-ep-statusbar-left { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
8980
9522
  /* Buttons inside the dense strip shrink to fit the 26px band. */
8981
9523
  .ds-247420 .ds-ep-statusbar button {
8982
- min-height: 0; height: 20px; padding: 0 8px;
9524
+ min-height: 0; height: 20px; padding: 0 var(--space-2);
8983
9525
  border-radius: var(--r-1, 4px);
8984
9526
  font: var(--fs-micro, 11px)/1 var(--ff-mono, monospace);
8985
9527
  }
8986
9528
 
8987
9529
  /* Toolbar */
8988
9530
  .ds-247420 .ds-ep-toolbar {
8989
- display: flex; align-items: center; gap: 6px;
8990
- padding: 8px 10px;
9531
+ display: flex; align-items: center; gap: var(--space-1-75);
9532
+ padding: var(--space-2) var(--space-2-5);
8991
9533
  background: var(--panel-1);
8992
9534
  color: var(--panel-text);
8993
9535
  border-bottom: 1px solid var(--rule);
8994
9536
  font: var(--fs-tiny, 12px)/var(--lh-base, 1.55) var(--ff-mono, monospace);
8995
9537
  }
8996
- .ds-247420 .ds-ep-toolbar.dense { padding: 2px 4px; gap: 2px; }
9538
+ .ds-247420 .ds-ep-toolbar.dense { padding: var(--space-hair) var(--space-1); gap: var(--space-hair); }
8997
9539
  .ds-247420 .ds-ep-toolbar-leading,
8998
9540
  .ds-247420 .ds-ep-toolbar-center,
8999
- .ds-247420 .ds-ep-toolbar-trailing { display: flex; align-items: center; gap: 4px; }
9541
+ .ds-247420 .ds-ep-toolbar-trailing { display: flex; align-items: center; gap: var(--space-1); }
9000
9542
  .ds-247420 .ds-ep-toolbar-trailing { margin-left: auto; }
9001
9543
  .ds-247420 .ds-ep-toolbar-center { flex: 1; min-width: 0; }
9002
9544
 
@@ -9066,7 +9608,7 @@
9066
9608
  flex: 1; min-width: 0; appearance: none; background: transparent; border: 0;
9067
9609
  border-bottom: 2px solid transparent;
9068
9610
  color: var(--panel-text-3);
9069
- padding: 8px 10px;
9611
+ padding: var(--space-2) var(--space-2-5);
9070
9612
  font: inherit; cursor: pointer;
9071
9613
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
9072
9614
  transition: color var(--dur-snap, 80ms) var(--ease, ease), border-color var(--dur-snap, 80ms) var(--ease, ease);
@@ -9105,8 +9647,8 @@
9105
9647
  color: var(--panel-text);
9106
9648
  }
9107
9649
  .ds-247420 .ds-ep-eventrow {
9108
- display: flex; align-items: baseline; gap: 8px;
9109
- padding: 3px 8px;
9650
+ display: flex; align-items: baseline; gap: var(--space-2);
9651
+ padding: var(--space-half) var(--space-2);
9110
9652
  border-bottom: 1px solid color-mix(in oklab, var(--rule) 50%, transparent);
9111
9653
  }
9112
9654
  .ds-247420 .ds-ep-eventrow:hover { background: color-mix(in oklab, var(--accent) 6%, transparent); }
@@ -9123,8 +9665,8 @@
9123
9665
  .ds-247420 .ds-ep-tree-item { display: flex; flex-direction: column; }
9124
9666
  .ds-247420 .ds-ep-tree-item:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
9125
9667
  .ds-247420 .ds-ep-tree-row {
9126
- display: flex; align-items: center; gap: 6px;
9127
- padding: 4px 8px 4px 0;
9668
+ display: flex; align-items: center; gap: var(--space-1-75);
9669
+ padding: var(--space-1) var(--space-2) var(--space-1) 0;
9128
9670
  border-radius: var(--r-1, 10px);
9129
9671
  cursor: pointer;
9130
9672
  color: var(--panel-text-2);
@@ -9147,25 +9689,25 @@
9147
9689
  .ds-247420 .ds-ep-tree-glyph { flex-shrink: 0; color: var(--panel-text-3); }
9148
9690
  .ds-247420 .ds-ep-tree-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
9149
9691
  .ds-247420 .ds-ep-tree-tag {
9150
- flex-shrink: 0; padding-left: 6px;
9692
+ flex-shrink: 0; padding-left: var(--space-1-75);
9151
9693
  font-size: 0.85em; color: var(--panel-text-3);
9152
9694
  }
9153
9695
  .ds-247420 .ds-ep-tree-children { display: flex; flex-direction: column; }
9154
9696
 
9155
9697
  /* PropertyGrid / PropertyField */
9156
9698
  .ds-247420 .ds-ep-propgrid {
9157
- display: flex; flex-direction: column; gap: 6px;
9158
- padding: 8px;
9699
+ display: flex; flex-direction: column; gap: var(--space-1-75);
9700
+ padding: var(--space-2);
9159
9701
  color: var(--panel-text);
9160
9702
  font: var(--fs-tiny, 12px)/var(--lh-base, 1.55) var(--ff-mono, monospace);
9161
9703
  }
9162
9704
  .ds-247420 .ds-ep-propfield {
9163
9705
  display: grid;
9164
9706
  grid-template-columns: minmax(80px, 120px) 1fr;
9165
- gap: 4px 10px;
9707
+ gap: var(--space-1) var(--space-2-5);
9166
9708
  align-items: center;
9167
9709
  }
9168
- .ds-247420 .ds-ep-propfield.inline { display: flex; gap: 8px; }
9710
+ .ds-247420 .ds-ep-propfield.inline { display: flex; gap: var(--space-2); }
9169
9711
  .ds-247420 .ds-ep-propfield-label {
9170
9712
  color: var(--panel-text-3);
9171
9713
  font-size: 0.85em;
@@ -9174,7 +9716,7 @@
9174
9716
  }
9175
9717
  .ds-247420 .ds-ep-propfield-value {
9176
9718
  color: var(--panel-text);
9177
- display: flex; align-items: center; gap: 4px; min-width: 0;
9719
+ display: flex; align-items: center; gap: var(--space-1); min-width: 0;
9178
9720
  }
9179
9721
  .ds-247420 .ds-ep-propfield-value input,
9180
9722
  .ds-247420 .ds-ep-propfield-value select,
@@ -9184,7 +9726,7 @@
9184
9726
  color: var(--panel-text);
9185
9727
  border: 1px solid var(--rule);
9186
9728
  border-radius: var(--r-1, 10px);
9187
- padding: 4px 8px;
9729
+ padding: var(--space-1) var(--space-2);
9188
9730
  font: inherit;
9189
9731
  min-width: 0; width: 100%;
9190
9732
  }
@@ -9202,7 +9744,7 @@
9202
9744
  }
9203
9745
  /* x/y/z packed on one row, each field equal width, no horizontal overflow. */
9204
9746
  .ds-247420 .ds-ep-vec3 {
9205
- display: flex; gap: 4px; width: 100%; min-width: 0;
9747
+ display: flex; gap: var(--space-1); width: 100%; min-width: 0;
9206
9748
  }
9207
9749
  .ds-247420 .ds-ep-vec3 > * { flex: 1 1 0; min-width: 0; }
9208
9750
  /* Each axis cell (axis letter + scrub input) must show its full 3-decimal value
@@ -9210,7 +9752,7 @@
9210
9752
  fill the rest with tight padding and centered text so 0.000 / -0.0 / 1.000 are
9211
9753
  always legible even in the narrow 3-up layout. */
9212
9754
  .ds-247420 .ds-ep-vec3 > * {
9213
- display: flex; align-items: center; gap: 2px;
9755
+ display: flex; align-items: center; gap: var(--space-hair);
9214
9756
  }
9215
9757
  .ds-247420 .ds-ep-vec3 .ds-ep-propfield-hint {
9216
9758
  flex: 0 0 auto; width: 9px; text-align: center;
@@ -9218,12 +9760,12 @@
9218
9760
  }
9219
9761
  .ds-247420 .ds-ep-vec3 .ds-input-bare {
9220
9762
  flex: 1 1 auto; min-width: 0; width: auto;
9221
- padding: 2px 4px; text-align: center; text-overflow: clip;
9763
+ padding: var(--space-hair) var(--space-1); text-align: center; text-overflow: clip;
9222
9764
  }
9223
9765
  /* Dense numeric inputs in the inspector — compact, tight radius, mono. */
9224
9766
  .ds-247420 .ds-ep-propfield-value input,
9225
9767
  .ds-247420 .ds-ep-propfield-value .ds-input-bare {
9226
- padding: 2px 6px;
9768
+ padding: var(--space-hair) var(--space-1-75);
9227
9769
  border-radius: var(--r-1, 4px);
9228
9770
  font: var(--fs-tiny, 12px)/1.3 var(--ff-mono, monospace);
9229
9771
  }
@@ -9233,7 +9775,7 @@
9233
9775
  color: var(--panel-text);
9234
9776
  border: 1px solid var(--rule);
9235
9777
  border-radius: var(--r-1, 4px);
9236
- padding: 2px 6px;
9778
+ padding: var(--space-hair) var(--space-1-75);
9237
9779
  font: var(--fs-tiny, 12px)/1.3 var(--ff-mono, monospace);
9238
9780
  min-width: 0;
9239
9781
  }
@@ -9242,7 +9784,7 @@
9242
9784
  control below) — used for wide segmented controls that would clip in the
9243
9785
  narrow value column. */
9244
9786
  .ds-247420 .ds-ep-propfield.block {
9245
- display: flex; flex-direction: column; align-items: stretch; gap: 4px;
9787
+ display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1);
9246
9788
  }
9247
9789
  .ds-247420 .ds-ep-propfield.block > .ds-ep-propfield-value { width: 100%; }
9248
9790
  .ds-247420 .ds-ep-propfield.block .ds-ep-btngrp { width: 100%; }
@@ -9291,8 +9833,8 @@
9291
9833
  Compact buttons, square-ish, bordered top — not big floating pills. */
9292
9834
  .ds-247420 .ds-ep-actionbar {
9293
9835
  flex-shrink: 0;
9294
- display: flex; align-items: center; gap: 6px;
9295
- padding: 6px 8px;
9836
+ display: flex; align-items: center; gap: var(--space-1-75);
9837
+ padding: var(--space-1-75) var(--space-2);
9296
9838
  border-top: 1px solid var(--rule);
9297
9839
  background: var(--panel-1);
9298
9840
  }
@@ -9310,7 +9852,7 @@
9310
9852
  IconButtonGroup which manages its own sizing. */
9311
9853
  .ds-247420 .ds-ep-tree-row button:not(.ds-ep-btngrp-btn),
9312
9854
  .ds-247420 .ds-ep-toolbar button:not(.ds-ep-btngrp-btn) {
9313
- min-height: 24px; height: 24px; padding: 0 8px;
9855
+ min-height: 24px; height: 24px; padding: 0 var(--space-2);
9314
9856
  border-radius: var(--r-1, 4px);
9315
9857
  font: var(--fs-tiny, 12px)/1 var(--ff-mono, monospace);
9316
9858
  }
@@ -9346,7 +9888,7 @@
9346
9888
  border: 1px solid var(--rule);
9347
9889
  color: var(--panel-text, var(--fg));
9348
9890
  min-width: 1.75em;
9349
- padding: var(--space-half, 3px) var(--space-1, 5px);
9891
+ padding: var(--space-half, 3px) var(--space-1, 4px);
9350
9892
  border-radius: var(--r-1, 4px);
9351
9893
  font: inherit;
9352
9894
  text-align: center;
@@ -9358,6 +9900,15 @@
9358
9900
  border-color: var(--accent);
9359
9901
  }
9360
9902
  .ds-247420 .ds-ep-pager-ellipsis { padding: 0 var(--space-hair, 2px); opacity: 0.6; }
9903
+ /* Touch floor. Pager controls render ~21px tall, so on a coarse pointer they
9904
+ were the smallest interactive targets in the kit — every other control family
9905
+ here (.ds-sub-btn, .ds-session-row, .ds-file-act, .btn) already floors at
9906
+ 44px, and paging is a repeated, mis-tap-prone action. The visible mark stays
9907
+ compact; only the hit area grows. */
9908
+ @media (pointer: coarse) {
9909
+ .ds-247420 .ds-ep-pager-btn, .ds-247420 .ds-ep-pager-num { min-height: 44px; min-width: 44px; }
9910
+ .ds-247420 .ds-ep-pager { gap: var(--space-2); }
9911
+ }
9361
9912
  .ds-247420 .ds-ep-pager-total { white-space: nowrap; margin-left: auto; }
9362
9913
 
9363
9914
  /* Grid / GridItem — 24-column responsive layout. GridItem's flex-basis is
@@ -9438,7 +9989,7 @@
9438
9989
  /* Collapsible tree mode — native details/summary, indent guides on children. */
9439
9990
  .ds-247420 .ds-ep-json-tree { white-space: normal; }
9440
9991
  .ds-247420 .ds-ep-json-kids {
9441
- padding-left: var(--space-3-5, 14px);
9992
+ padding-left: var(--space-3-5, 20px);
9442
9993
  margin-left: var(--space-1, 4px);
9443
9994
  border-left: 1px solid var(--rule);
9444
9995
  }
@@ -9450,7 +10001,7 @@
9450
10001
  .ds-247420 .ds-ep-json-sum::-webkit-details-marker { display: none; }
9451
10002
  .ds-247420 .ds-ep-json-sum::before {
9452
10003
  content: '+';
9453
- display: inline-block; width: var(--space-3, 12px);
10004
+ display: inline-block; width: var(--space-3, 16px);
9454
10005
  color: var(--panel-text-3, var(--fg-3));
9455
10006
  }
9456
10007
  .ds-247420 .ds-ep-json-node[open] > .ds-ep-json-sum::before { content: '-'; }
@@ -9464,11 +10015,11 @@
9464
10015
  font-size: var(--fs-micro, 11px);
9465
10016
  color: var(--panel-text-3, var(--fg-3));
9466
10017
  }
9467
- .ds-247420 .ds-ep-json-leaf { padding-left: var(--space-3, 12px); word-break: break-all; }
10018
+ .ds-247420 .ds-ep-json-leaf { padding-left: var(--space-3, 16px); word-break: break-all; }
9468
10019
  /* Copy affordance (copyable:true) — floats over the viewer's top-right. */
9469
10020
  .ds-247420 .ds-ep-json-wrap { position: relative; }
9470
10021
  .ds-247420 .ds-ep-json-copy {
9471
- position: absolute; top: var(--space-1-75, 6px); right: var(--space-1-75, 6px); z-index: 1;
10022
+ position: absolute; top: var(--space-1-75, 6px); right: var(--space-1-75, 6px); z-index: var(--z-raised);
9472
10023
  appearance: none; cursor: pointer;
9473
10024
  background: var(--panel-1, var(--bg-1));
9474
10025
  border: 1px solid var(--rule);
@@ -9526,12 +10077,12 @@
9526
10077
  overflow: hidden;
9527
10078
  background: var(--panel-2);
9528
10079
  }
9529
- .ds-247420 .ds-ep-btngrp.dense .ds-ep-btngrp-btn { padding: 2px 6px; min-width: 22px; }
10080
+ .ds-247420 .ds-ep-btngrp.dense .ds-ep-btngrp-btn { padding: var(--space-hair) var(--space-1-75); min-width: 22px; }
9530
10081
  .ds-247420 .ds-ep-btngrp-btn {
9531
10082
  appearance: none; border: 0;
9532
10083
  background: transparent;
9533
10084
  color: var(--panel-text-2);
9534
- padding: 4px 10px;
10085
+ padding: var(--space-1) var(--space-2-5);
9535
10086
  font: inherit; cursor: pointer;
9536
10087
  border-right: 1px solid var(--rule);
9537
10088
  transition: background var(--dur-snap, 80ms) var(--ease, ease), color var(--dur-snap, 80ms) var(--ease, ease);
@@ -9585,7 +10136,7 @@
9585
10136
  ContextMenu
9586
10137
  --------------------------------------------------------------- */
9587
10138
  .ds-247420 .ds-ep-ctxmenu-backdrop {
9588
- position: fixed; inset: 0; z-index: 9000;
10139
+ position: fixed; inset: 0; z-index: var(--z-dropdown);
9589
10140
  }
9590
10141
  .ds-247420 .ds-ep-ctxmenu {
9591
10142
  position: absolute;
@@ -9600,13 +10151,13 @@
9600
10151
  border: 1px solid var(--rule);
9601
10152
  border-radius: var(--r-2, 8px);
9602
10153
  box-shadow: var(--shadow-2);
9603
- padding: 4px;
10154
+ padding: var(--space-1);
9604
10155
  display: flex; flex-direction: column;
9605
10156
  outline: none;
9606
10157
  }
9607
10158
  .ds-247420 .ds-ep-ctxmenu-item {
9608
- display: flex; align-items: center; gap: 8px;
9609
- padding: 8px 10px;
10159
+ display: flex; align-items: center; gap: var(--space-2);
10160
+ padding: var(--space-2) var(--space-2-5);
9610
10161
  background: transparent; border: 0;
9611
10162
  color: inherit; font: inherit; text-align: left;
9612
10163
  border-radius: var(--r-1, 4px);
@@ -9619,13 +10170,13 @@
9619
10170
  .ds-247420 .ds-ep-ctxmenu-item.danger { color: var(--danger); }
9620
10171
  .ds-247420 .ds-ep-ctxmenu-item.disabled { opacity: 0.45; cursor: not-allowed; }
9621
10172
  .ds-247420 .ds-ep-ctxmenu-icon { width: 16px; display: inline-flex; justify-content: center; }
9622
- .ds-247420 .ds-ep-ctxmenu-sep { height: 1px; background: var(--rule); margin: 4px 6px; }
10173
+ .ds-247420 .ds-ep-ctxmenu-sep { height: 1px; background: var(--rule); margin: var(--space-1) var(--space-1-75); }
9623
10174
 
9624
10175
  /* ---------------------------------------------------------------
9625
10176
  Drawer
9626
10177
  --------------------------------------------------------------- */
9627
10178
  .ds-247420 .ds-ep-drawer-backdrop {
9628
- position: fixed; inset: 0; z-index: 8500;
10179
+ position: fixed; inset: 0; z-index: var(--z-drawer);
9629
10180
  background: var(--scrim);
9630
10181
  }
9631
10182
  .ds-247420 .ds-ep-drawer {
@@ -9635,11 +10186,11 @@
9635
10186
  box-shadow: var(--shadow-overlay);
9636
10187
  outline: none;
9637
10188
  transition: transform 180ms ease;
9638
- padding: 12px;
9639
- padding-top: max(12px, env(safe-area-inset-top));
9640
- padding-bottom: max(12px, env(safe-area-inset-bottom));
9641
- padding-left: max(12px, env(safe-area-inset-left));
9642
- padding-right: max(12px, env(safe-area-inset-right));
10189
+ padding: var(--space-2-75);
10190
+ padding-top: max(var(--space-2-75), env(safe-area-inset-top));
10191
+ padding-bottom: max(var(--space-2-75), env(safe-area-inset-bottom));
10192
+ padding-left: max(var(--space-2-75), env(safe-area-inset-left));
10193
+ padding-right: max(var(--space-2-75), env(safe-area-inset-right));
9643
10194
  }
9644
10195
  .ds-247420 .ds-ep-drawer.side-left { left: 0; top: 0; bottom: 0; width: 86vw; max-width: 320px; }
9645
10196
  .ds-247420 .ds-ep-drawer.side-right { right: 0; top: 0; bottom: 0; width: 86vw; max-width: 320px; }
@@ -9652,10 +10203,10 @@
9652
10203
  Dialog
9653
10204
  --------------------------------------------------------------- */
9654
10205
  .ds-247420 .ds-ep-dialog-backdrop {
9655
- position: fixed; inset: 0; z-index: 9500;
10206
+ position: fixed; inset: 0; z-index: var(--z-modal);
9656
10207
  background: var(--scrim-strong);
9657
10208
  display: flex; align-items: center; justify-content: center;
9658
- padding: max(16px, env(safe-area-inset-top)) max(16px, env(safe-area-inset-right)) max(16px, env(safe-area-inset-bottom)) max(16px, env(safe-area-inset-left));
10209
+ padding: max(var(--space-3), env(safe-area-inset-top)) max(var(--space-3), env(safe-area-inset-right)) max(var(--space-3), env(safe-area-inset-bottom)) max(var(--space-3), env(safe-area-inset-left));
9659
10210
  }
9660
10211
  .ds-247420 .ds-ep-dialog {
9661
10212
  background: var(--panel-1, var(--panel-bg));
@@ -9705,8 +10256,8 @@
9705
10256
  position: fixed;
9706
10257
  top: max(16px, env(safe-area-inset-top));
9707
10258
  right: max(16px, env(safe-area-inset-right));
9708
- z-index: 9800;
9709
- display: flex; flex-direction: column; gap: 8px;
10259
+ z-index: var(--z-toast);
10260
+ display: flex; flex-direction: column; gap: var(--space-2);
9710
10261
  pointer-events: none;
9711
10262
  }
9712
10263
  .ds-247420 .ds-ep-toast {
@@ -9714,7 +10265,13 @@
9714
10265
  background: var(--panel-1, var(--panel-bg));
9715
10266
  color: var(--panel-text, var(--fg-text));
9716
10267
  border: 1px solid var(--rule);
9717
- border-left: 3px solid var(--accent);
10268
+ /* DELIBERATE accent spine (same intent as .panel-spine, expressed as a
10269
+ border because a toast has no free ::before — the host stacks them and
10270
+ .has-action reflows the box). Load-bearing, not decoration: this edge is
10271
+ the ONLY channel carrying toast severity — .kind-success/.kind-warn/
10272
+ .kind-error below recolour border-left-color and nothing else. Do not
10273
+ demote to a hairline; that would erase the status signal. */
10274
+ border-left: var(--bw-chunk) solid var(--accent);
9718
10275
  border-radius: var(--r-1, 6px);
9719
10276
  padding: var(--space-2) var(--space-2-75);
9720
10277
  box-shadow: var(--shadow-3);
@@ -9773,8 +10330,8 @@
9773
10330
  .ds-247420 .ds-ep-tree-row,
9774
10331
  .ds-247420 .ds-ep-pager-btn {
9775
10332
  min-height: 44px;
9776
- padding-top: 10px;
9777
- padding-bottom: 10px;
10333
+ padding-top: var(--space-2-5);
10334
+ padding-bottom: var(--space-2-5);
9778
10335
  }
9779
10336
  .ds-247420 .ds-ep-resize.axis-h { width: 14px; }
9780
10337
  .ds-247420 .ds-ep-resize.axis-v { height: 14px; }
@@ -9919,6 +10476,10 @@
9919
10476
 
9920
10477
  .ds-247420 .sr-only {
9921
10478
  position: absolute; width: 1px; height: 1px;
10479
+ /* margin:-1px is OFF-SCALE ON PURPOSE — it is not rhythm, it is the
10480
+ canonical visually-hidden idiom: the negative margin cancels the 1px
10481
+ box so the clipped element contributes zero layout. Snapping it to a
10482
+ --space-* rung would reintroduce a measurable gap. */
9922
10483
  padding: 0; margin: -1px; overflow: hidden;
9923
10484
  clip: rect(0,0,0,0); white-space: nowrap; border: 0;
9924
10485
  }
@@ -9933,7 +10494,7 @@
9933
10494
  .ds-247420 .ds-tooltip {
9934
10495
  position: fixed;
9935
10496
  left: 0; top: 0;
9936
- z-index: 9700;
10497
+ z-index: var(--z-tooltip);
9937
10498
  background: var(--panel-1, var(--panel-bg));
9938
10499
  color: var(--panel-text, var(--fg-text));
9939
10500
  border: 1px solid var(--rule);
@@ -9956,7 +10517,7 @@
9956
10517
  .ds-247420 .ds-popover {
9957
10518
  position: fixed;
9958
10519
  left: 0; top: 0;
9959
- z-index: 9600;
10520
+ z-index: var(--z-dropdown);
9960
10521
  background: var(--panel-1, var(--panel-bg));
9961
10522
  color: var(--panel-text, var(--fg-text));
9962
10523
  border: 1px solid var(--rule);
@@ -9978,10 +10539,10 @@
9978
10539
  /* ---------------------------------------------------------------
9979
10540
  Dropdown
9980
10541
  --------------------------------------------------------------- */
9981
- .ds-247420 .ds-dropdown-menu { padding: 4px; }
10542
+ .ds-247420 .ds-dropdown-menu { padding: var(--space-1); }
9982
10543
  .ds-247420 .ds-dropdown-list { display: flex; flex-direction: column; }
9983
10544
  .ds-247420 .ds-dropdown-item {
9984
- display: flex; align-items: center; gap: 8px;
10545
+ display: flex; align-items: center; gap: var(--space-2);
9985
10546
  /* Dense desktop row (was an unconditional 44px touch target — a menu of
9986
10547
  these was very tall on desktop). ~30px here; the 44px tap target is
9987
10548
  restored under @media(pointer:coarse) below, matching the .ds-check-row
@@ -10013,7 +10574,7 @@
10013
10574
  .ds-247420 .ds-dropdown-item.is-danger { color: var(--danger); }
10014
10575
  .ds-247420 .ds-dropdown-glyph { width: 16px; display: inline-flex; justify-content: center; flex-shrink: 0; }
10015
10576
  .ds-247420 .ds-dropdown-label { flex: 1; min-width: 0; }
10016
- .ds-247420 .ds-dropdown-separator { height: 1px; background: var(--rule); margin: 4px 6px; }
10577
+ .ds-247420 .ds-dropdown-separator { height: 1px; background: var(--rule); margin: var(--space-1) var(--space-1-75); }
10017
10578
  .ds-247420 .ds-dropdown-trigger {
10018
10579
  appearance: none;
10019
10580
  background: var(--panel-2, transparent);
@@ -10153,7 +10714,7 @@
10153
10714
  border-radius: var(--r-1, 10px);
10154
10715
  background: var(--panel-2, var(--panel-1)); color: var(--panel-text);
10155
10716
  }
10156
- .ds-247420 .ds-kbd-group { margin: var(--space-3, 12px) 0; }
10717
+ .ds-247420 .ds-kbd-group { margin: var(--space-3, 16px) 0; }
10157
10718
  .ds-247420 .ds-kbd-group h3 { font-size: 0.9em; opacity: 0.7; margin: 0 0 var(--space-1, 4px); text-transform: capitalize; }
10158
10719
  /* One shortcut per row: the key chip on the left, its description on the right,
10159
10720
  so the dialog reads as "G Translate gizmo" rather than a wall of bare keys. */
@@ -10167,7 +10728,7 @@
10167
10728
  --------------------------------------------------------------- */
10168
10729
  .ds-247420 .ov-cmd-backdrop {
10169
10730
  position: fixed; inset: 0;
10170
- z-index: var(--z-overlay, 1000);
10731
+ z-index: var(--z-modal);
10171
10732
  background: color-mix(in oklab, var(--fg) 32%, transparent);
10172
10733
  display: flex; align-items: flex-start; justify-content: center;
10173
10734
  padding: 12vh var(--space-3, 16px) var(--space-3, 16px);
@@ -10222,7 +10783,8 @@
10222
10783
  --------------------------------------------------------------- */
10223
10784
  .ds-247420 .ov-emoji-root {
10224
10785
  position: fixed; left: 0; top: 0;
10225
- z-index: var(--z-overlay, 1000);
10786
+ /* Anchored to a trigger, not a blocking surface — dropdown rung. */
10787
+ z-index: var(--z-dropdown);
10226
10788
  width: 280px;
10227
10789
  display: flex; flex-direction: column;
10228
10790
  background: var(--bg-2); color: var(--fg);
@@ -10260,7 +10822,7 @@
10260
10822
  --------------------------------------------------------------- */
10261
10823
  .ds-247420 .ov-boot {
10262
10824
  position: fixed; inset: 0;
10263
- z-index: calc(var(--z-overlay, 1000) + 100);
10825
+ z-index: var(--z-top);
10264
10826
  background: var(--bg);
10265
10827
  display: flex; align-items: center; justify-content: center;
10266
10828
  color: var(--fg);
@@ -10303,7 +10865,8 @@
10303
10865
  --------------------------------------------------------------- */
10304
10866
  .ds-247420 .ov-set-root {
10305
10867
  position: fixed; left: 0; top: 0;
10306
- z-index: var(--z-overlay, 1000);
10868
+ /* Anchored to a trigger, not a blocking surface — dropdown rung. */
10869
+ z-index: var(--z-dropdown);
10307
10870
  width: 300px; max-height: 70vh;
10308
10871
  display: flex; flex-direction: column;
10309
10872
  background: var(--bg-2); color: var(--fg);
@@ -10352,7 +10915,7 @@
10352
10915
 
10353
10916
  /* AuthModal — ov-auth-* */
10354
10917
  .ds-247420 .ov-auth-backdrop {
10355
- position: fixed; inset: 0; z-index: var(--z-overlay, 1000);
10918
+ position: fixed; inset: 0; z-index: var(--z-modal);
10356
10919
  display: flex; align-items: center; justify-content: center;
10357
10920
  background: var(--scrim-strong);
10358
10921
  }
@@ -10381,7 +10944,7 @@
10381
10944
 
10382
10945
  /* VideoLightbox — ov-lightbox-* */
10383
10946
  .ds-247420 .ov-lightbox-backdrop {
10384
- position: fixed; inset: 0; z-index: var(--z-overlay-top, 1100);
10947
+ position: fixed; inset: 0; z-index: var(--z-modal);
10385
10948
  display: flex; align-items: center; justify-content: center;
10386
10949
  background: var(--scrim-media);
10387
10950
  }
@@ -10435,7 +10998,7 @@
10435
10998
  border: 1px solid var(--rule); border-radius: var(--r-1, 4px);
10436
10999
  background: var(--panel-2); cursor: pointer; flex-shrink: 0;
10437
11000
  }
10438
- .ds-247420 .ds-input-color::-webkit-color-swatch-wrapper { padding: 2px; }
11001
+ .ds-247420 .ds-input-color::-webkit-color-swatch-wrapper { padding: var(--space-hair); }
10439
11002
  .ds-247420 .ds-input-color::-webkit-color-swatch { border: none; border-radius: var(--r-hair); }
10440
11003
  .ds-247420 .ds-input-color:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
10441
11004
  .ds-247420 .ds-input-check {
@@ -10498,8 +11061,8 @@
10498
11061
  /* Collapsed: shrink to just the header strip, freeing the viewport. */
10499
11062
  .ds-247420 .ds-ep-dock.collapsed { bottom: auto; height: auto; }
10500
11063
  .ds-247420 .ds-ep-dock-head {
10501
- display: flex; align-items: center; gap: 6px;
10502
- flex: 0 0 auto; padding: 4px 6px 4px 10px;
11064
+ display: flex; align-items: center; gap: var(--space-1-75);
11065
+ flex: 0 0 auto; padding: var(--space-1) var(--space-1-75) var(--space-1) var(--space-2-5);
10503
11066
  border-bottom: 1px solid var(--rule);
10504
11067
  background: color-mix(in oklab, var(--panel-1) 60%, transparent);
10505
11068
  }
@@ -10530,7 +11093,7 @@
10530
11093
  border-radius: var(--r-1, 4px);
10531
11094
  background: var(--panel-2, var(--bg-2));
10532
11095
  }
10533
- .ds-247420 .ds-ep-collapse + .ds-ep-collapse { margin-top: var(--space-1, 5px); }
11096
+ .ds-247420 .ds-ep-collapse + .ds-ep-collapse { margin-top: var(--space-1, 4px); }
10534
11097
  .ds-247420 .ds-ep-collapse-head {
10535
11098
  appearance: none; cursor: pointer; width: 100%;
10536
11099
  display: flex; align-items: center; gap: var(--space-1-5, 5px);
@@ -10597,7 +11160,7 @@
10597
11160
  .ds-247420 .ov-perm-action {
10598
11161
  flex: 1; appearance: none; border: 1px solid var(--rule); background: transparent;
10599
11162
  color: var(--fg-2); font: inherit; font-size: var(--fs-tiny, 12px);
10600
- padding: 4px 8px; border-radius: var(--r-1, 10px); cursor: pointer;
11163
+ padding: var(--space-1) var(--space-2); border-radius: var(--r-1, 10px); cursor: pointer;
10601
11164
  }
10602
11165
  .ds-247420 .ov-perm-action:hover { background: var(--panel-2, var(--rule)); }
10603
11166
 
@@ -10828,7 +11391,7 @@
10828
11391
  @media (max-width: 900px) {
10829
11392
  .ds-247420.ds-247420 .ca-rail {
10830
11393
  position: absolute;
10831
- z-index: 20;
11394
+ z-index: calc(var(--z-drawer) + 1);
10832
11395
  top: 0; left: 0; bottom: 0;
10833
11396
  width: 240px; min-width: 240px;
10834
11397
  transform: translateX(-110%);
@@ -10843,7 +11406,7 @@
10843
11406
  content: '';
10844
11407
  position: absolute;
10845
11408
  inset: 0;
10846
- z-index: 15;
11409
+ z-index: var(--z-drawer);
10847
11410
  background: color-mix(in oklab, var(--ink, #000) 40%, transparent);
10848
11411
  pointer-events: none;
10849
11412
  }
@@ -11167,6 +11730,11 @@
11167
11730
  .ds-247420 #ds-article-host.has-toc {
11168
11731
  display: flex;
11169
11732
  align-items: flex-start;
11733
+ /* 44px is OFF-SCALE ON PURPOSE — it is not a rhythm step but one term of the
11734
+ three-term width equation on the next line (256px rail + 44px gutter +
11735
+ measure). It sits between --space-6 (48) and --space-5 (32); snapping it
11736
+ would silently change the host's computed max-width unless the calc were
11737
+ re-derived, so the literal and the calc stay coupled and explicit. */
11170
11738
  column-gap: 44px;
11171
11739
  gap: 44px;
11172
11740
  max-width: calc(256px + 44px + var(--measure-narrow));
@@ -11190,7 +11758,7 @@
11190
11758
  overscroll-behavior: contain;
11191
11759
  margin: 0;
11192
11760
  max-width: 100%;
11193
- padding: 18px 18px 18px 20px;
11761
+ padding: var(--space-3-5);
11194
11762
  background: var(--panel-1);
11195
11763
  border-radius: var(--r-1);
11196
11764
  box-shadow: var(--panel-shadow);
@@ -11209,15 +11777,28 @@
11209
11777
  background: var(--panel-text-3);
11210
11778
  background-clip: padding-box;
11211
11779
  }
11212
- .ds-247420 #ds-article-host .toc .toc-title {
11780
+ /* Small-label voice — the local composition of the house `.t-label` recipe
11781
+ (src/css/app-shell/base.css). This sheet is a standalone published export
11782
+ with its own <link>, so it cannot join the `.t-label` selector list; it
11783
+ composes by referencing the identical token set. Both members are gm-
11784
+ generated markup (injected into #ds-article-host), so the class list is not
11785
+ reachable from src/ — the rule, not the markup, does the composing.
11786
+ Deliberate override for both: --panel-text-2, because prose surfaces use the
11787
+ panel text ramp rather than the app --fg ramp. Sized at --fs-nano: these
11788
+ labels ride above dense article chrome, not UI text. */
11789
+ .ds-247420 #ds-article-host .toc .toc-title,
11790
+ .ds-247420 .ds-prose .gm-callout .who {
11213
11791
  font-family: var(--ff-mono);
11214
- font-size: 11px;
11792
+ font-size: var(--fs-nano);
11215
11793
  text-transform: uppercase;
11216
- letter-spacing: .09em;
11794
+ letter-spacing: var(--tr-label);
11217
11795
  color: var(--panel-text-2);
11218
- margin: 0 0 14px 0;
11219
11796
  }
11220
- .ds-247420 #ds-article-host .toc ol { margin: 0; padding-left: 18px; }
11797
+
11798
+ .ds-247420 #ds-article-host .toc .toc-title {
11799
+ margin: 0 0 var(--space-3) 0;
11800
+ }
11801
+ .ds-247420 #ds-article-host .toc ol { margin: 0; padding-left: var(--space-3-5); }
11221
11802
  .ds-247420 #ds-article-host .toc li { font-size: 13px; line-height: 1.85; color: var(--panel-text); }
11222
11803
  .ds-247420 #ds-article-host .toc li::marker { color: var(--panel-text-3); font-variant-numeric: tabular-nums; }
11223
11804
  .ds-247420 #ds-article-host .toc a { color: var(--panel-text-2); text-decoration: none; transition: color .12s ease; }
@@ -11230,7 +11811,7 @@
11230
11811
  position: static;
11231
11812
  max-height: none;
11232
11813
  overflow: visible;
11233
- margin: 0 0 28px 0;
11814
+ margin: 0 0 var(--space-5) 0;
11234
11815
  }
11235
11816
  }
11236
11817
 
@@ -11246,8 +11827,8 @@
11246
11827
  display: block;
11247
11828
  background: var(--panel-1);
11248
11829
  border-radius: var(--r-0);
11249
- padding: 16px 20px;
11250
- margin: 16px 0 28px 0;
11830
+ padding: var(--space-3) var(--space-3-5);
11831
+ margin: var(--space-3) 0 var(--space-5) 0;
11251
11832
  font-family: var(--ff-mono);
11252
11833
  font-size: 12.5px;
11253
11834
  line-height: 1.6;
@@ -11262,14 +11843,14 @@
11262
11843
  white-space: pre-wrap;
11263
11844
  word-break: break-word;
11264
11845
  min-height: 1.4em;
11265
- padding: 3px 0;
11846
+ padding: var(--space-half) 0;
11266
11847
  line-height: 1.6;
11267
11848
  }
11268
11849
  .ds-247420 .ds-cli-block .ds-cli-comment:empty::before { content: '\00a0'; }
11269
11850
  .ds-247420 .ds-cli-block .ds-cli-row {
11270
11851
  display: flex;
11271
- gap: 10px;
11272
- padding: 3px 0;
11852
+ gap: var(--space-2-5);
11853
+ padding: var(--space-half) 0;
11273
11854
  white-space: pre-wrap;
11274
11855
  word-break: break-word;
11275
11856
  }
@@ -11285,14 +11866,14 @@
11285
11866
  word-break: break-word;
11286
11867
  }
11287
11868
 
11288
- .ds-247420 .panel .row { align-items: flex-start; padding: 16px 20px; gap: 16px; }
11869
+ .ds-247420 .panel .row { align-items: flex-start; padding: var(--space-3) var(--space-3-5); gap: var(--space-3); }
11289
11870
  .ds-247420 .panel .row + .row { box-shadow: inset 0 1px 0 var(--rule); }
11290
- .ds-247420 .panel .row .code { padding-top: 2px; min-width: 28px; }
11291
- .ds-247420 .panel .row .meta { padding-top: 2px; opacity: 0.4; }
11871
+ .ds-247420 .panel .row .code { padding-top: var(--space-hair); min-width: 28px; }
11872
+ .ds-247420 .panel .row .meta { padding-top: var(--space-hair); opacity: 0.4; }
11292
11873
  .ds-247420 .panel .row .title { display: block; line-height: 1.4; }
11293
11874
  .ds-247420 .panel .row .title .sub {
11294
11875
  display: block;
11295
- margin-top: 6px;
11876
+ margin-top: var(--space-1-75);
11296
11877
  font-weight: 400;
11297
11878
  color: var(--panel-text-2);
11298
11879
  font-size: 13px;
@@ -11302,9 +11883,9 @@
11302
11883
  .ds-247420 .ds-prose .card {
11303
11884
  display: flex;
11304
11885
  flex-direction: column;
11305
- gap: 8px;
11306
- padding: 14px 18px;
11307
- margin: 8px 0;
11886
+ gap: var(--space-2);
11887
+ padding: var(--space-2-75) var(--space-3-5);
11888
+ margin: var(--space-2) 0;
11308
11889
  background: var(--panel-1);
11309
11890
  border-radius: var(--r-0);
11310
11891
  font-size: 13px;
@@ -11312,35 +11893,46 @@
11312
11893
  text-decoration: none;
11313
11894
  }
11314
11895
  .ds-247420 .ds-prose .card:hover { background: var(--panel-hover); }
11315
- .ds-247420 .ds-prose .card .card-top { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
11896
+ .ds-247420 .ds-prose .card .card-top { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-2-75); }
11316
11897
  .ds-247420 .ds-prose .card .repo-name { font-weight: 600; color: var(--panel-text); }
11317
11898
  .ds-247420 .ds-prose .card .stars { color: var(--panel-text-3); font-family: var(--ff-mono); font-size: 12px; flex: 0 0 auto; }
11318
11899
  .ds-247420 .ds-prose .card .desc { color: var(--panel-text-2); font-size: 12px; line-height: 1.5; margin: 0; }
11319
- .ds-247420 .ds-prose .tags { display: flex; gap: 6px; flex-wrap: wrap; }
11900
+ .ds-247420 .ds-prose .tags { display: flex; gap: var(--space-1-75); flex-wrap: wrap; }
11320
11901
  .ds-247420 .ds-prose .tag {
11321
11902
  background: var(--panel-2);
11322
11903
  color: var(--panel-text-2);
11323
11904
  border: 1px solid var(--panel-3);
11324
11905
  font-size: 0.7rem;
11906
+ /* rem, not --space-*: the chip's inset is deliberately tied to the root type
11907
+ scale alongside its own 0.7rem size, so the capsule keeps its proportions
11908
+ when a doc site scales root font-size. A px rung would decouple them. */
11325
11909
  padding: 0.15rem 0.5rem;
11326
11910
  border-radius: var(--r-hair);
11327
11911
  font-family: var(--ff-mono);
11328
11912
  }
11913
+ /* Attributed callout — an editorial pull-quote (it carries a .who byline), so
11914
+ the left accent is DELIBERATE, not the generic alert stripe. Expressed via
11915
+ the house .panel-spine idiom (absolute ::before rail at --bw-chunk, squared
11916
+ leading corners) instead of a raw 3px border-left, so it stays on the border
11917
+ scale and matches the spine primitive in panel-row.css. */
11329
11918
  .ds-247420 .ds-prose .gm-callout {
11330
- margin: 18px 0;
11331
- padding: 14px 18px;
11919
+ position: relative;
11920
+ margin: var(--space-3-5) 0;
11921
+ padding: var(--space-2-75) var(--space-3-5);
11922
+ padding-left: calc(var(--space-3-5) + var(--bw-chunk));
11332
11923
  background: var(--panel-1);
11333
- border-left: 3px solid var(--panel-accent);
11924
+ border-radius: 0 var(--r-1) var(--r-1) 0;
11334
11925
  color: var(--panel-text);
11335
11926
  }
11927
+ .ds-247420 .ds-prose .gm-callout::before {
11928
+ content: ''; position: absolute; left: 0; top: 0; bottom: 0;
11929
+ width: var(--bw-chunk); background: var(--panel-accent);
11930
+ border-radius: var(--bw-chunk) 0 0 var(--bw-chunk);
11931
+ }
11932
+ /* Joins the small-label voice above; only its own box properties here. */
11336
11933
  .ds-247420 .ds-prose .gm-callout .who {
11337
11934
  display: block;
11338
- font-family: var(--ff-mono);
11339
- font-size: 11px;
11340
- text-transform: uppercase;
11341
- letter-spacing: .08em;
11342
- color: var(--panel-text-2);
11343
- margin-bottom: 4px;
11935
+ margin-bottom: var(--space-1);
11344
11936
  }
11345
11937
 
11346
11938
  /* marketing.css */
@@ -11382,7 +11974,7 @@
11382
11974
  .ds-247420 .sp-loading {
11383
11975
  position: fixed;
11384
11976
  inset: 0;
11385
- z-index: 10000;
11977
+ z-index: var(--z-top);
11386
11978
  display: flex;
11387
11979
  align-items: center;
11388
11980
  justify-content: center;
@@ -11513,7 +12105,7 @@
11513
12105
  .ds-247420 .sp-lobby {
11514
12106
  position: fixed;
11515
12107
  inset: 0;
11516
- z-index: 9500;
12108
+ z-index: var(--z-modal);
11517
12109
  display: flex;
11518
12110
  align-items: center;
11519
12111
  justify-content: center;