anentrypoint-design 0.0.240 → 0.0.242

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
@@ -7,20 +7,9 @@
7
7
  Source-of-truth tokens. Component sheet lives in app-shell.css.
8
8
  ============================================================ */
9
9
 
10
- @import url('https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,200..800&family=Hanken+Grotesk:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&display=swap');
11
-
12
- /* Metric-matched fallback for the display face. While Bricolage Grotesque
13
- loads, text falls back to Arial with size-adjust tuned to its cap-height so
14
- the oversized hero does not reflow on swap. Referenced first in --ff-display
15
- via the 'Bricolage Grotesque' family; this only kicks in for the fallback
16
- glyphs. */
17
- @font-face {
18
- font-family: 'Bricolage Grotesque Fallback';
19
- src: local('Arial');
20
- size-adjust: 99%;
21
- ascent-override: 94%;
22
- descent-override: 24%;
23
- }
10
+ /* System-font stack only — no web-font @import/@font-face. Every --ff-*
11
+ token below is the same fallback chain that used to sit after the custom
12
+ family names; removing the custom names just exposes it directly. */
24
13
 
25
14
  .ds-247420 {
26
15
  /* Tree view indentation tokens */
@@ -132,15 +121,11 @@
132
121
  --panel-accent-2: var(--accent-bright, var(--accent));
133
122
  --panel-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 6%, transparent), 0 4px 14px color-mix(in oklab, var(--fg) 8%, transparent);
134
123
 
135
- /* Type — Bricolage Grotesque carries display/headings (variable editorial
136
- grotesque with real character), Hanken Grotesk carries body and UI,
137
- JetBrains carries code. The narrow alias tracks the display face.
138
- size-adjust on the fallback keeps the oversized hero from shifting while
139
- Bricolage Grotesque loads. */
140
- --ff-display: 'Bricolage Grotesque', 'Bricolage Grotesque Fallback', 'Hanken Grotesk', system-ui, sans-serif;
141
- --ff-narrow: 'Bricolage Grotesque', 'Bricolage Grotesque Fallback', 'Hanken Grotesk', system-ui, sans-serif;
142
- --ff-body: 'Hanken Grotesk', system-ui, sans-serif;
143
- --ff-mono: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
124
+ /* Type — system-font stack, no custom web fonts loaded. */
125
+ --ff-display: system-ui, sans-serif;
126
+ --ff-narrow: system-ui, sans-serif;
127
+ --ff-body: system-ui, sans-serif;
128
+ --ff-mono: ui-monospace, Menlo, Consolas, monospace;
144
129
 
145
130
  --fs-micro: 12px;
146
131
  --fs-tiny: 13px;
@@ -202,10 +187,14 @@
202
187
  --rule: color-mix(in oklab, currentColor 14%, transparent);
203
188
  --rule-strong: color-mix(in oklab, currentColor 28%, transparent);
204
189
 
190
+ /* Micro rungs below --r-1 — chips, badges, scrollbar thumbs, tick marks
191
+ genuinely want a tighter corner than 10px; without these two tokens the
192
+ component sheets fell back to raw px literals bypassing the scale. */
193
+ --r-hair: 2px;
194
+ --r-0: 4px;
205
195
  --r-1: 10px;
206
196
  --r-2: 14px;
207
197
  --r-3: 22px;
208
- --r-4: 32px;
209
198
  --r-pill: 999px;
210
199
 
211
200
  --dur-snap: 80ms;
@@ -235,6 +224,10 @@
235
224
  --measure: 68ch;
236
225
  --measure-wide: 940px;
237
226
  --measure-narrow: 760px;
227
+ /* Page-stage ceiling — independent of --measure-wide (which stays the
228
+ narrower editorial hero/prose measure). Fluid so ultra-wide viewports
229
+ actually gain real estate instead of flat-lining at a fixed px cap. */
230
+ --stage-wide: min(96vw, 1440px);
238
231
 
239
232
  --sidebar-width: 220px;
240
233
  --sidebar-width-collapsed: 64px;
@@ -249,8 +242,11 @@
249
242
  /* Unified focus-ring tokens (single source for the design system). Outset
250
243
  rings (the default) tokenize colour+width+offset; bordered text fields use
251
244
  the inset variant. Deliberate negative offsets on edge-flush/clipping
252
- containers stay literal. */
253
- --focus-color: var(--accent);
245
+ containers stay literal. --focus-color uses --accent-ink (the readable
246
+ text/UI-boundary tone), never bare --accent (the lime FILL token, which
247
+ measures ~1.07:1 against --paper and is nearly invisible as an outline —
248
+ see AGENTS.md token-split rule). */
249
+ --focus-color: var(--accent-ink);
254
250
  --focus-w: 2px;
255
251
  --focus-offset: 2px;
256
252
  --focus-ring-inset: inset 0 0 0 var(--focus-w) var(--focus-color);
@@ -275,7 +271,7 @@
275
271
  /* Link focus-visible */
276
272
  .ds-247420 a:focus-visible,
277
273
  .ds-247420[role="link"]:focus-visible {
278
- outline: 2px solid var(--accent);
274
+ outline: 2px solid var(--accent-ink);
279
275
  outline-offset: 2px;
280
276
  }
281
277
 
@@ -283,13 +279,13 @@
283
279
  .ds-247420 input:focus-visible,
284
280
  .ds-247420 textarea:focus-visible,
285
281
  .ds-247420 select:focus-visible {
286
- outline: 2px solid var(--accent);
282
+ outline: 2px solid var(--accent-ink);
287
283
  outline-offset: 2px;
288
284
  }
289
285
 
290
286
  /* Interactive element focus-visible */
291
287
  .ds-247420[tabindex]:focus-visible {
292
- outline: 2px solid var(--accent);
288
+ outline: 2px solid var(--accent-ink);
293
289
  outline-offset: 2px;
294
290
  }
295
291
 
@@ -502,10 +498,9 @@
502
498
  /* app-shell.css */
503
499
  /* ============================================================
504
500
  247420 design system — component sheet
505
- "Acid Editorial": Bricolage Grotesque display + Hanken Grotesk body +
506
- JetBrains code. Confident hierarchy, asymmetric grid tension, print
507
- texture over glow, one electric lead accent. Indicator rails over
508
- hairlines.
501
+ "Acid Editorial": system-font display + body + mono, no custom web fonts.
502
+ Confident hierarchy, asymmetric grid tension, print texture over glow,
503
+ one electric lead accent. Indicator rails over hairlines.
509
504
  ============================================================ */
510
505
 
511
506
  /* ============================================================
@@ -533,7 +528,7 @@
533
528
  }
534
529
  .ds-247420 .skip-link:focus {
535
530
  top: 10px;
536
- outline: 2px solid var(--accent);
531
+ outline: 2px solid var(--accent-ink);
537
532
  outline-offset: 2px;
538
533
  }
539
534
  .ds-247420 body {
@@ -750,7 +745,7 @@
750
745
  }
751
746
  .ds-247420 .app-topbar nav a:hover { background: var(--bg-2); color: var(--fg); }
752
747
  .ds-247420 .app-topbar nav a:focus-visible {
753
- outline: 2px solid var(--accent);
748
+ outline: 2px solid var(--accent-ink);
754
749
  outline-offset: 2px;
755
750
  }
756
751
  /* Active tab reads as a subtle tinted pill with an accent underline rather than
@@ -786,7 +781,7 @@
786
781
  width: 100%;
787
782
  }
788
783
  .ds-247420 .app-search:focus-within {
789
- outline: 2px solid var(--accent);
784
+ outline: 2px solid var(--accent-ink);
790
785
  outline-offset: 2px;
791
786
  }
792
787
 
@@ -828,7 +823,7 @@
828
823
  }
829
824
  .ds-247420 .app-side a:hover { background: var(--bg-2); color: var(--fg); }
830
825
  .ds-247420 .app-side a:focus-visible {
831
- outline: 2px solid var(--accent);
826
+ outline: 2px solid var(--accent-ink);
832
827
  outline-offset: 2px;
833
828
  }
834
829
  .ds-247420 .app-side a.active {
@@ -951,7 +946,7 @@
951
946
  .ds-247420 .btn-ghost:hover { background: var(--fg); color: var(--bg); }
952
947
  .ds-247420 .btn:active, .ds-247420 .btn-primary:active, .ds-247420 .btn-ghost:active { transform: translateY(2px); }
953
948
  .ds-247420 .btn:focus-visible, .ds-247420 .btn-primary:focus-visible, .ds-247420 .btn-ghost:focus-visible {
954
- outline: 2px solid var(--accent);
949
+ outline: 2px solid var(--accent-ink);
955
950
  outline-offset: 2px;
956
951
  }
957
952
 
@@ -978,7 +973,7 @@
978
973
  .ds-247420 .ds-icon-btn-danger { background: var(--warn); color: var(--on-color); }
979
974
  .ds-247420 .ds-icon-btn-danger:hover { filter: brightness(1.1); }
980
975
  .ds-247420 .ds-icon-btn:active { transform: translateY(1px); }
981
- .ds-247420 .ds-icon-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
976
+ .ds-247420 .ds-icon-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
982
977
  .ds-247420 .ds-icon-btn:disabled, .ds-247420 .ds-icon-btn.is-disabled {
983
978
  opacity: 0.5; cursor: not-allowed; pointer-events: none;
984
979
  }
@@ -990,7 +985,7 @@
990
985
  display: inline-flex; align-items: center; justify-content: center;
991
986
  min-width: 18px; height: 18px; padding: 0 6px;
992
987
  font-size: var(--fs-micro); font-weight: 600; line-height: 1;
993
- border-radius: 999px;
988
+ border-radius: var(--r-pill);
994
989
  background: var(--bg-3); color: var(--fg-2);
995
990
  }
996
991
  .ds-247420 .ds-badge.tone-green { background: var(--green-tint); color: var(--green-deep); }
@@ -1202,16 +1197,13 @@
1202
1197
  padding: var(--space-9) 0 var(--space-8);
1203
1198
  display: grid; gap: var(--space-5) var(--space-6);
1204
1199
  grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
1205
- grid-template-areas: 'title title' 'body actions' 'badge badge';
1200
+ grid-template-areas: 'title title' 'body actions';
1206
1201
  align-items: end;
1207
1202
  max-width: var(--measure-wide);
1208
1203
  }
1209
1204
  .ds-247420 .ds-hero-head { grid-area: title; display: grid; gap: var(--space-3); }
1210
1205
  .ds-247420 .ds-hero-body { grid-area: body; }
1211
1206
  .ds-247420 .ds-hero-actions { grid-area: actions; }
1212
- /* Badge gets its own row — sharing 'actions' overlapped it onto the CTAs
1213
- whenever a caller passes both actions and badge. */
1214
- .ds-247420 .ds-hero-badge { grid-area: badge; }
1215
1207
  .ds-247420 .ds-hero-title {
1216
1208
  font-family: var(--ff-display); font-weight: 700;
1217
1209
  font-size: clamp(40px, 9cqi, 116px);
@@ -1232,7 +1224,7 @@
1232
1224
  @container (max-width: 900px) {
1233
1225
  .ds-247420 .ds-hero {
1234
1226
  grid-template-columns: minmax(0, 1fr);
1235
- grid-template-areas: 'title' 'body' 'actions' 'badge';
1227
+ grid-template-areas: 'title' 'body' 'actions';
1236
1228
  align-items: start;
1237
1229
  padding: var(--space-7) 0 var(--space-6);
1238
1230
  }
@@ -1406,7 +1398,7 @@
1406
1398
  .ds-247420 table tr.clickable { cursor: pointer; }
1407
1399
  .ds-247420 table tr.clickable:hover td { background: var(--bg-2); }
1408
1400
  .ds-247420 table tr.clickable:focus-visible {
1409
- outline: 2px solid var(--accent);
1401
+ outline: 2px solid var(--accent-ink);
1410
1402
  outline-offset: -2px;
1411
1403
  }
1412
1404
  .ds-247420 table tr.clickable:focus-visible td { background: var(--bg-2); }
@@ -1804,7 +1796,7 @@
1804
1796
  flex-direction: column;
1805
1797
  gap: 4px;
1806
1798
  }
1807
- .ds-247420 .ds-file-grid:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-2); }
1799
+ .ds-247420 .ds-file-grid:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; border-radius: var(--r-2); }
1808
1800
 
1809
1801
  /* Listing wrapper holds the optional filter + sort header above the grid. */
1810
1802
  .ds-247420 .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
@@ -1826,7 +1818,7 @@
1826
1818
  }
1827
1819
  .ds-247420 .ds-file-sort-btn:hover { color: var(--fg-2); background: var(--bg-2); }
1828
1820
  .ds-247420 .ds-file-sort-btn.active { color: var(--accent-ink); }
1829
- .ds-247420 .ds-file-sort-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1821
+ .ds-247420 .ds-file-sort-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
1830
1822
 
1831
1823
  /* Skeleton shimmer rows shown while a directory loads. */
1832
1824
  .ds-247420 .ds-file-row-skeleton { cursor: default; pointer-events: none; }
@@ -1874,7 +1866,7 @@
1874
1866
  color: inherit; font: inherit; text-align: left; cursor: pointer;
1875
1867
  }
1876
1868
  .ds-247420 .ds-file-open[disabled] { cursor: default; }
1877
- .ds-247420 .ds-file-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-1); }
1869
+ .ds-247420 .ds-file-open:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; border-radius: var(--r-1); }
1878
1870
  .ds-247420 .ds-file-row:hover {
1879
1871
  background: var(--bg-2);
1880
1872
  border-color: var(--rule);
@@ -1947,7 +1939,7 @@
1947
1939
  role=checkbox/aria-checked name+state. */
1948
1940
  .ds-247420 .ds-check-box {
1949
1941
  width: 15px; height: 15px; box-sizing: border-box; flex: 0 0 auto; position: relative;
1950
- border: 1.5px solid var(--fg-3); border-radius: 4px;
1942
+ border: 1.5px solid var(--fg-3); border-radius: var(--r-0);
1951
1943
  transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
1952
1944
  }
1953
1945
  .ds-247420 .is-marked > .ds-check-box,
@@ -1959,7 +1951,7 @@
1959
1951
  }
1960
1952
  .ds-247420[aria-checked="mixed"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
1961
1953
  .ds-247420[aria-checked="mixed"] > .ds-check-box::after {
1962
- content: ""; position: absolute; left: 3px; right: 3px; top: 6px; height: 2px; background: var(--bg); border-radius: 1px;
1954
+ content: ""; position: absolute; left: 3px; right: 3px; top: 6px; height: 2px; background: var(--bg); border-radius: var(--r-hair);
1963
1955
  }
1964
1956
 
1965
1957
  .ds-247420 .ds-file-check {
@@ -1972,7 +1964,7 @@
1972
1964
  }
1973
1965
  .ds-247420 .ds-file-check:hover { background: var(--bg-3); color: var(--fg); }
1974
1966
  .ds-247420 .ds-file-check.is-marked { color: var(--accent-ink); }
1975
- .ds-247420 .ds-file-check:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1967
+ .ds-247420 .ds-file-check:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
1976
1968
  .ds-247420 .ds-file-check[disabled] { opacity: 0.4; cursor: default; }
1977
1969
  .ds-247420 .ds-file-row.is-marked { background: var(--accent-tint); border-color: var(--accent); }
1978
1970
  .ds-247420 .ds-file-selectall {
@@ -1982,7 +1974,7 @@
1982
1974
  padding: var(--space-1); border-radius: var(--r-1);
1983
1975
  }
1984
1976
  .ds-247420 .ds-file-selectall:hover { background: var(--bg-2); color: var(--fg); }
1985
- .ds-247420 .ds-file-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1977
+ .ds-247420 .ds-file-selectall:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
1986
1978
  .ds-247420 .ds-file-controls { display: flex; align-items: center; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); flex-wrap: wrap; }
1987
1979
  .ds-247420 .ds-file-controls .spread { flex: 1 1 auto; }
1988
1980
  .ds-247420 .ds-file-controls .ds-file-sort { padding: 0; }
@@ -2020,7 +2012,7 @@
2020
2012
  }
2021
2013
  .ds-247420 .ds-density-btn:hover { color: var(--fg); }
2022
2014
  .ds-247420 .ds-density-btn.active { background: var(--accent-tint); color: var(--fg); }
2023
- .ds-247420 .ds-density-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
2015
+ .ds-247420 .ds-density-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2024
2016
 
2025
2017
  /* Compact density — tighter rows for long listings. */
2026
2018
  .ds-247420 .ds-file-grid[data-density="compact"] { gap: 2px; }
@@ -2054,7 +2046,7 @@
2054
2046
  background: none; border: none; cursor: pointer; color: var(--fg);
2055
2047
  }
2056
2048
  .ds-247420 .ds-file-cell-open[disabled] { cursor: default; }
2057
- .ds-247420 .ds-file-cell-open:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-2); }
2049
+ .ds-247420 .ds-file-cell-open:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; border-radius: var(--r-2); }
2058
2050
  .ds-247420 .ds-file-cell-media {
2059
2051
  display: flex; align-items: center; justify-content: center;
2060
2052
  width: 100%; aspect-ratio: 4 / 3;
@@ -2272,7 +2264,7 @@
2272
2264
  color: var(--fg-2); font-family: var(--ff-body); font-size: var(--fs-micro);
2273
2265
  }
2274
2266
  .ds-247420 .ds-upload-act:hover { background: var(--bg-3); color: var(--fg); }
2275
- .ds-247420 .ds-upload-act:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
2267
+ .ds-247420 .ds-upload-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2276
2268
  @media (hover: none), (pointer: coarse) {
2277
2269
  .ds-247420 .ds-upload-act { min-height: 44px; min-width: 44px; }
2278
2270
  /* 44px floor for file controls on ANY touch device, not only narrow ones
@@ -2343,7 +2335,7 @@
2343
2335
  border-radius: var(--r-2); color: var(--fg);
2344
2336
  font-family: inherit; font-size: var(--fs-sm);
2345
2337
  }
2346
- .ds-247420 .ds-modal-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2338
+ .ds-247420 .ds-modal-input:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
2347
2339
  /* iOS auto-zooms inputs under 16px on focus, breaking the modal layout. */
2348
2340
  @media (hover: none), (pointer: coarse) {
2349
2341
  .ds-247420 .ds-modal-input { font-size: 16px; min-height: 44px; }
@@ -2507,7 +2499,7 @@
2507
2499
  .ds-247420 .ds-kbd-sep { color: var(--fg-3); font-size: var(--fs-micro); padding: 0 2px; }
2508
2500
  .ds-247420 .ds-kbd {
2509
2501
  display: inline-block; min-width: 0;
2510
- padding: 2px 7px; border-radius: 6px;
2502
+ padding: 2px 7px; border-radius: var(--r-0);
2511
2503
  background: var(--bg); border: var(--bw-hair) solid var(--rule);
2512
2504
  border-bottom-width: 2px;
2513
2505
  font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg-2);
@@ -2529,7 +2521,7 @@
2529
2521
  transition: color var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
2530
2522
  }
2531
2523
  .ds-247420 .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
2532
- .ds-247420 .ds-segmented .ds-seg-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
2524
+ .ds-247420 .ds-segmented .ds-seg-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2533
2525
  .ds-247420 .ds-segmented .ds-seg-btn.is-on {
2534
2526
  background: var(--bg); color: var(--fg);
2535
2527
  box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
@@ -2583,7 +2575,7 @@
2583
2575
  .ds-247420 .chat-thread { scroll-behavior: smooth; }
2584
2576
  }
2585
2577
  .ds-247420 .chat-thread::-webkit-scrollbar { width: 8px; }
2586
- .ds-247420 .chat-thread::-webkit-scrollbar-thumb { background: var(--bg-3); border-radius: 4px; }
2578
+ .ds-247420 .chat-thread::-webkit-scrollbar-thumb { background: var(--bg-3); border-radius: var(--r-0); }
2587
2579
  .ds-247420 .chat-empty {
2588
2580
  margin: auto;
2589
2581
  text-align: center;
@@ -2597,7 +2589,7 @@
2597
2589
  .ds-247420 .chat-msg { display: flex; gap: 12px; align-items: flex-start; padding: 6px 0; position: relative; min-width: 0; }
2598
2590
  .ds-247420 .chat-msg.you { flex-direction: row-reverse; }
2599
2591
  .ds-247420 .chat-msg.you .chat-stack { align-items: flex-end; }
2600
- .ds-247420 .chat-msg:hover { background: color-mix(in oklab, var(--fg) 4%, transparent); padding: 6px 0; margin: 0; border-radius: 8px; transition: background var(--dur-base) var(--ease); }
2592
+ .ds-247420 .chat-msg:hover { background: color-mix(in oklab, var(--fg) 4%, transparent); padding: 6px 0; margin: 0; border-radius: var(--r-0); transition: background var(--dur-base) var(--ease); }
2601
2593
 
2602
2594
  .ds-247420 .chat-avatar {
2603
2595
  width: 36px; height: 36px; flex-shrink: 0;
@@ -2643,7 +2635,7 @@
2643
2635
  .ds-247420 .chat-bubble code {
2644
2636
  font-family: var(--ff-mono); font-size: 0.92em;
2645
2637
  background: color-mix(in oklab, var(--fg) 10%, transparent);
2646
- padding: 1px 6px; border-radius: 4px;
2638
+ padding: 1px 6px; border-radius: var(--r-0);
2647
2639
  }
2648
2640
  .ds-247420 .chat-msg.you .chat-bubble code { background: color-mix(in oklab, var(--fg) 10%, transparent); }
2649
2641
  .ds-247420 .chat-bubble a {
@@ -2754,7 +2746,7 @@
2754
2746
  .ds-247420 .chat-msg.you .chat-image,
2755
2747
  .ds-247420 .chat-msg .chat-image,
2756
2748
  .ds-247420 .chat-image {
2757
- display: inline-block; border-radius: 12px; overflow: hidden;
2749
+ display: inline-block; border-radius: var(--r-1); overflow: hidden;
2758
2750
  max-width: min(100%, 480px); background: var(--bg-2);
2759
2751
  text-decoration: none; color: var(--fg);
2760
2752
  border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
@@ -2773,7 +2765,7 @@
2773
2765
  .ds-247420 .chat-file {
2774
2766
  display: flex; align-items: center; gap: 12px; padding: 12px 14px;
2775
2767
  background: var(--bg-2); border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
2776
- border-radius: 12px; text-decoration: none; color: var(--fg);
2768
+ border-radius: var(--r-1); text-decoration: none; color: var(--fg);
2777
2769
  max-width: min(100%, 360px);
2778
2770
  transition: background var(--dur-snap, .15s) var(--ease, ease), border-color var(--dur-snap, .15s) var(--ease, ease);
2779
2771
  }
@@ -2782,7 +2774,7 @@
2782
2774
  font-size: 22px; width: 36px; height: 36px;
2783
2775
  display: inline-flex; align-items: center; justify-content: center;
2784
2776
  background: color-mix(in oklab, var(--accent) 18%, transparent);
2785
- color: var(--accent-ink); border-radius: 8px; flex-shrink: 0; font-family: var(--ff-mono);
2777
+ color: var(--accent-ink); border-radius: var(--r-0); flex-shrink: 0; font-family: var(--ff-mono);
2786
2778
  }
2787
2779
  .ds-247420 .chat-file > div { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
2788
2780
  .ds-247420 .chat-file .name {
@@ -2800,7 +2792,7 @@
2800
2792
  background: var(--bg-2);
2801
2793
  color: var(--fg);
2802
2794
  border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
2803
- border-radius: 12px; overflow: hidden; max-width: min(100%, 480px);
2795
+ border-radius: var(--r-1); overflow: hidden; max-width: min(100%, 480px);
2804
2796
  transition: box-shadow 0.12s ease, border-color 0.12s ease;
2805
2797
  }
2806
2798
  .ds-247420 .chat-msg:hover .chat-pdf { border-color: color-mix(in oklab, var(--accent) 30%, transparent); }
@@ -2823,7 +2815,7 @@
2823
2815
  display: grid; grid-template-columns: 80px 1fr; gap: 12px; padding: 10px;
2824
2816
  background: var(--bg-2);
2825
2817
  border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
2826
- border-radius: 12px; text-decoration: none; color: var(--fg);
2818
+ border-radius: var(--r-1); text-decoration: none; color: var(--fg);
2827
2819
  max-width: min(100%, 480px);
2828
2820
  transition: background var(--dur-snap, .15s) var(--ease, ease), border-color var(--dur-snap, .15s) var(--ease, ease), box-shadow 0.15s ease;
2829
2821
  }
@@ -2834,7 +2826,7 @@
2834
2826
  }
2835
2827
  .ds-247420 .chat-link:not(:has(.thumb)):not(:has(img)) { grid-template-columns: 1fr; }
2836
2828
  .ds-247420 .chat-link .thumb,
2837
- .ds-247420 .chat-link img.thumb { width: 80px; height: 80px; border-radius: 8px; object-fit: cover; background: var(--bg-3) center/cover no-repeat; }
2829
+ .ds-247420 .chat-link img.thumb { width: 80px; height: 80px; border-radius: var(--r-0); object-fit: cover; background: var(--bg-3) center/cover no-repeat; }
2838
2830
  .ds-247420 .chat-link .meta { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
2839
2831
  .ds-247420 .chat-link .host { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); text-transform: lowercase; }
2840
2832
  .ds-247420 .chat-link .title { font-weight: 600; font-size: var(--fs-sm); line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
@@ -2858,7 +2850,7 @@
2858
2850
  display: inline-flex; align-items: center; gap: 4px;
2859
2851
  padding: 2px 8px; background: var(--bg-2);
2860
2852
  border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
2861
- border-radius: 999px; font-size: var(--fs-xs);
2853
+ border-radius: var(--r-pill); font-size: var(--fs-xs);
2862
2854
  cursor: pointer; user-select: none;
2863
2855
  transition: background var(--dur-snap, .12s) var(--ease, ease), border-color var(--dur-snap, .12s) var(--ease, ease), transform 0.12s ease;
2864
2856
  position: relative;
@@ -2979,7 +2971,7 @@
2979
2971
  .ds-247420 .chat-composer .send:active { filter: brightness(0.94); }
2980
2972
  .ds-247420 .chat-composer .send:focus-visible,
2981
2973
  .ds-247420 .composer-btn:focus-visible {
2982
- outline: 2px solid var(--accent);
2974
+ outline: 2px solid var(--accent-ink);
2983
2975
  outline-offset: 2px;
2984
2976
  }
2985
2977
  .ds-247420 .chat-composer .send:disabled {
@@ -3091,8 +3083,12 @@
3091
3083
  Component States — Disabled, Loading, Error, Success
3092
3084
  -------------------------------------------------------------- */
3093
3085
 
3094
- /* Disabled state for all interactive elements */
3095
- .ds-247420 .btn:disabled, .ds-247420 .btn-primary:disabled, .ds-247420 .btn-ghost:disabled, .ds-247420 button:disabled, .ds-247420[disabled] {
3086
+ /* Disabled state for all interactive elements. The `.is-disabled` class
3087
+ variants cover Btn()'s anchor-rendered case (shell.js) an <a> has no
3088
+ :disabled pseudo-class, so a disabled link-styled button relies entirely
3089
+ on this class selector for its visual treatment (aria-disabled + tabindex
3090
+ are set in JS; this is the paired CSS half). */
3091
+ .ds-247420 .btn:disabled, .ds-247420 .btn-primary:disabled, .ds-247420 .btn-ghost:disabled, .ds-247420 .btn.is-disabled, .ds-247420 .btn-primary.is-disabled, .ds-247420 .btn-ghost.is-disabled, .ds-247420 button:disabled, .ds-247420[disabled] {
3096
3092
  opacity: 0.6;
3097
3093
  cursor: not-allowed;
3098
3094
  pointer-events: none;
@@ -3422,7 +3418,7 @@
3422
3418
 
3423
3419
  /* Base focus-visible: 2px ring + 2px offset clears dark bg-3 surfaces (WCAG 1.4.11) */
3424
3420
  .ds-247420 :focus-visible {
3425
- outline: 2px solid var(--accent);
3421
+ outline: 2px solid var(--accent-ink);
3426
3422
  outline-offset: 2px;
3427
3423
  }
3428
3424
 
@@ -3432,7 +3428,7 @@
3432
3428
  .ds-247420[role="tab"]:focus-visible,
3433
3429
  .ds-247420 .row:focus-visible,
3434
3430
  .ds-247420 .row[tabindex]:focus-visible {
3435
- outline: 2px solid var(--accent);
3431
+ outline: 2px solid var(--accent-ink);
3436
3432
  outline-offset: 2px;
3437
3433
  }
3438
3434
 
@@ -3819,7 +3815,7 @@
3819
3815
  border-radius: var(--r-1, 6px);
3820
3816
  cursor: pointer;
3821
3817
  }
3822
- .ds-247420 .app-side-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
3818
+ .ds-247420 .app-side-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
3823
3819
  @container (max-width: 900px) {
3824
3820
  .ds-247420 .app-side-toggle { display: inline-flex; }
3825
3821
  .ds-247420 .app-topbar .brand { margin-left: 44px; }
@@ -3909,7 +3905,7 @@
3909
3905
  .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; }
3910
3906
  .ds-247420 .ws-resizer::after { content: ""; display: block; width: 2px; height: 100%; margin: 0 auto; background: transparent; transition: background var(--dur-snap) var(--ease); }
3911
3907
  .ds-247420 .ws-resizer:hover::after, .ds-247420 .ws-resizer:focus-visible::after { background: var(--accent); }
3912
- .ds-247420 .ws-resizer:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
3908
+ .ds-247420 .ws-resizer:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
3913
3909
  .ds-247420 .ws-resizer.ws-resizer-rail { grid-column: 1; }
3914
3910
  .ds-247420 .ws-resizer.ws-resizer-sessions { grid-column: 2; }
3915
3911
  .ds-247420 .ws-resizer.ws-resizer-pane { grid-column: 3; justify-self: end; }
@@ -3961,7 +3957,7 @@
3961
3957
  border-radius: var(--r-1); cursor: pointer;
3962
3958
  }
3963
3959
  .ds-247420 .ws-rail-toggle:hover { background: var(--bg-3); color: var(--fg); }
3964
- .ds-247420 .ws-rail-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
3960
+ .ds-247420 .ws-rail-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
3965
3961
  .ds-247420 .ws-rail-inner { display: flex; flex-direction: column; min-height: 0; flex: 1; padding: var(--space-3) var(--space-2); gap: var(--space-2); }
3966
3962
  .ds-247420 .ws-rail-head { display: flex; align-items: center; min-height: 36px; padding: 0 var(--space-2); }
3967
3963
  .ds-247420 .ws-rail-brand { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-body); color: var(--fg); white-space: nowrap; overflow: hidden; }
@@ -3974,7 +3970,7 @@
3974
3970
  min-height: 40px; white-space: nowrap; overflow: hidden;
3975
3971
  }
3976
3972
  .ds-247420 .ws-rail-action:hover { filter: brightness(1.08); }
3977
- .ds-247420 .ws-rail-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
3973
+ .ds-247420 .ws-rail-action:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
3978
3974
  .ds-247420 .ws-rail-nav { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
3979
3975
  .ds-247420 .ws-rail-item {
3980
3976
  display: flex; align-items: center; gap: var(--space-2);
@@ -3984,7 +3980,7 @@
3984
3980
  font-family: var(--ff-body); font-size: var(--fs-sm); white-space: nowrap; overflow: hidden;
3985
3981
  }
3986
3982
  .ds-247420 .ws-rail-item:hover { background: var(--bg-3); color: var(--fg); }
3987
- .ds-247420 .ws-rail-item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
3983
+ .ds-247420 .ws-rail-item:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
3988
3984
  .ds-247420 .ws-rail-item.active { background: var(--accent-tint); color: var(--fg); box-shadow: inset 2px 0 0 var(--accent); }
3989
3985
  .ds-247420 .ws-rail-item-label { flex: 1; overflow: hidden; text-overflow: ellipsis; }
3990
3986
  .ds-247420 .ws-rail-item-count { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
@@ -4057,7 +4053,7 @@
4057
4053
  /* Desktop-only chrome toggle (sessions collapse): inverse of the mobile drawer-toggle. */
4058
4054
  .ds-247420 .ws-desktop-toggle { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border: none; background: none; color: var(--fg-2); cursor: pointer; border-radius: var(--r-1); }
4059
4055
  .ds-247420 .ws-desktop-toggle:hover { background: var(--bg-2); color: var(--fg); }
4060
- .ds-247420 .ws-desktop-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
4056
+ .ds-247420 .ws-desktop-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4061
4057
  @media (max-width: 900px) { .ds-247420 .ws-desktop-toggle { display: none; } }
4062
4058
  /* The pane collapse toggle is meaningless once the pane TRACK is dropped (the
4063
4059
  pane becomes a mobile overlay drawer at <=1480px, reached via its own
@@ -4181,7 +4177,7 @@
4181
4177
  .ds-247420 .ws-crumb .app-crumb .crumb-right { margin-left: 0; flex-wrap: wrap; min-width: 0; display: inline-flex; }
4182
4178
  }
4183
4179
  .ds-247420 .ws-drawer-toggle:hover { background: var(--bg-2); color: var(--fg); }
4184
- .ds-247420 .ws-drawer-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
4180
+ .ds-247420 .ws-drawer-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4185
4181
 
4186
4182
  @media (prefers-reduced-motion: reduce) {
4187
4183
  .ds-247420 .ws-shell, .ds-247420 .ws-rail, .ds-247420 .ws-pane, .ds-247420 .ws-sessions, .ds-247420 .ws-scrim { transition: none; }
@@ -4193,7 +4189,7 @@
4193
4189
  ============================================================ */
4194
4190
 
4195
4191
  /* Highlighted match inside a Row title (Row `highlight` prop). */
4196
- .ds-247420 .ds-hl { background: color-mix(in oklab, var(--accent) 25%, transparent); color: inherit; border-radius: 2px; }
4192
+ .ds-247420 .ds-hl { background: color-mix(in oklab, var(--accent) 25%, transparent); color: inherit; border-radius: var(--r-hair); }
4197
4193
 
4198
4194
  /* Action strip rendered inside an EXPANDED Row (Row `actions` prop). The
4199
4195
  buttons stop propagation so they never fire the row onClick. */
@@ -4206,20 +4202,20 @@
4206
4202
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
4207
4203
  }
4208
4204
  .ds-247420 .row-act:hover { background: var(--bg-3); color: var(--fg); }
4209
- .ds-247420 .row-act:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
4205
+ .ds-247420 .row-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
4210
4206
 
4211
4207
  /* FilterPills - a group of pill toggle buttons (aria-pressed). */
4212
4208
  .ds-247420 .ds-filter-pills { display: flex; flex-wrap: wrap; gap: var(--space-2); }
4213
4209
  .ds-247420 .ds-filter-pill {
4214
4210
  display: inline-flex; align-items: center; justify-content: center;
4215
4211
  padding: 4px 12px; min-height: 28px;
4216
- background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: 999px;
4212
+ background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-pill);
4217
4213
  color: var(--fg-2); font-family: var(--ff-body); font-size: var(--fs-tiny); cursor: pointer;
4218
4214
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
4219
4215
  }
4220
4216
  .ds-247420 .ds-filter-pill:hover { background: var(--bg-3); color: var(--fg); }
4221
4217
  .ds-247420 .ds-filter-pill.active { background: var(--accent-tint); color: var(--fg); border-color: var(--accent); }
4222
- .ds-247420 .ds-filter-pill:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
4218
+ .ds-247420 .ds-filter-pill:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
4223
4219
 
4224
4220
  /* Touch floor for the new small controls. */
4225
4221
  @media (pointer: coarse) {
@@ -4229,7 +4225,7 @@
4229
4225
  /* Disabled file actions (read-only row / in-flight mutation) stay visible but inert. */
4230
4226
  .ds-247420 .ds-file-act:disabled { opacity: .45; cursor: default; }
4231
4227
  .ds-247420 .ds-file-act:disabled:hover { background: transparent; color: var(--fg-3); }
4232
- .ds-247420 .ds-file-act:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
4228
+ .ds-247420 .ds-file-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
4233
4229
 
4234
4230
  /* ============================================================
4235
4231
  Print — linearize WorkspaceShell so main content prints in full.
@@ -4279,7 +4275,7 @@
4279
4275
  /* PhaseWalk */
4280
4276
  .ds-247420 .ds-phasewalk { display: inline-flex; gap: 2px; vertical-align: middle; }
4281
4277
  .ds-247420 .ds-phasewalk-seg {
4282
- width: 18px; height: 10px; border-radius: 2px;
4278
+ width: 18px; height: 10px; border-radius: var(--r-hair);
4283
4279
  background: var(--bg-3); position: relative;
4284
4280
  }
4285
4281
  .ds-247420 .ds-phasewalk-seg.is-reached { background: var(--success); }
@@ -4318,8 +4314,8 @@
4318
4314
  /* BarRow */
4319
4315
  .ds-247420 .ds-bar-row { display: flex; align-items: center; gap: 8px; margin: 3px 0; font-size: var(--fs-tiny); }
4320
4316
  .ds-247420 .ds-bar-row-label { width: 100px; flex-shrink: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4321
- .ds-247420 .ds-bar-bg { flex: 1; min-width: 60px; background: var(--bg-3); border-radius: 2px; height: 6px; overflow: hidden; }
4322
- .ds-247420 .ds-bar-fill { background: var(--accent); height: 100%; border-radius: 2px; }
4317
+ .ds-247420 .ds-bar-bg { flex: 1; min-width: 60px; background: var(--bg-3); border-radius: var(--r-hair); height: 6px; overflow: hidden; }
4318
+ .ds-247420 .ds-bar-fill { background: var(--accent); height: 100%; border-radius: var(--r-hair); }
4323
4319
  .ds-247420 .ds-bar-row-value { flex-shrink: 0; color: var(--fg-2); max-width: 40%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4324
4320
  @media (max-width: 400px) {
4325
4321
  .ds-247420 .ds-bar-row-label { width: 72px; }
@@ -4334,7 +4330,7 @@
4334
4330
  .ds-247420 .ds-stats-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-1); }
4335
4331
  }
4336
4332
  .ds-247420 .ds-stats-grid-empty { padding: var(--space-3); color: var(--fg-3); font-size: var(--fs-tiny); }
4337
- .ds-247420 .ds-stat { min-width: 0; background: var(--bg-3); border-radius: 4px; padding: 10px 12px; }
4333
+ .ds-247420 .ds-stat { min-width: 0; background: var(--bg-3); border-radius: var(--r-0); padding: 10px 12px; }
4338
4334
  .ds-247420 .ds-stat-val { font-size: clamp(18px, 5cqi, 22px); font-weight: 700; color: var(--accent-ink); overflow-wrap: anywhere; }
4339
4335
  .ds-247420 .ds-stat-val.rate-big { font-size: clamp(24px, 7cqi, 32px); color: var(--success); }
4340
4336
  .ds-247420 .ds-stat-val.err-rate { font-size: clamp(24px, 7cqi, 32px); color: var(--warn); }
@@ -4345,7 +4341,7 @@
4345
4341
  .ds-247420 .ds-sub-grid-empty { padding: var(--space-3); color: var(--fg-3); font-size: var(--fs-tiny); }
4346
4342
  .ds-247420 .ds-sub-btn {
4347
4343
  padding: 6px 10px; background: var(--bg-3); border: var(--bw-hair) solid var(--bg-3);
4348
- border-radius: 4px; font-size: var(--fs-tiny); cursor: pointer; color: var(--fg);
4344
+ border-radius: var(--r-0); font-size: var(--fs-tiny); cursor: pointer; color: var(--fg);
4349
4345
  text-align: left; font-family: var(--ff-body);
4350
4346
  }
4351
4347
  .ds-247420 .ds-sub-btn:hover { border-color: var(--accent); color: var(--accent-ink); }
@@ -4376,7 +4372,7 @@
4376
4372
  /* DevRow */
4377
4373
  .ds-247420 .ds-dev-row {
4378
4374
  background: var(--danger-surface); border-left: var(--bw-chunk) solid var(--warn);
4379
- padding: 8px 12px; margin: 4px 0; border-radius: 3px; font-size: var(--fs-tiny);
4375
+ padding: 8px 12px; margin: 4px 0; border-radius: var(--r-hair); font-size: var(--fs-tiny);
4380
4376
  }
4381
4377
  .ds-247420 .ds-dev-row strong { color: var(--warn); }
4382
4378
 
@@ -4396,7 +4392,7 @@
4396
4392
  .ds-247420 .ds-live-log-entry { padding: 2px 8px; border-bottom: var(--bw-hair) solid var(--bg-3); overflow-wrap: anywhere; }
4397
4393
  .ds-247420 .ds-live-log-entry:hover { background: var(--bg-3); }
4398
4394
  .ds-247420 .ds-live-log-ts { margin-right: 6px; color: var(--fg-3); }
4399
- .ds-247420 .ds-live-log-subtag { margin-right: 6px; padding: 0 5px; border-radius: 2px; font-size: var(--fs-micro); }
4395
+ .ds-247420 .ds-live-log-subtag { margin-right: 6px; padding: 0 5px; border-radius: var(--r-hair); font-size: var(--fs-micro); }
4400
4396
  .ds-247420 .ds-live-log-preview { margin-left: 6px; color: var(--fg-3); word-break: break-word; }
4401
4397
 
4402
4398
  /* Touch floors for the dense controls (not covered by the mobile width blocks). */
@@ -4432,6 +4428,13 @@
4432
4428
  @media (max-width: 760px) {
4433
4429
  .ds-247420 .ds-panel-duo { grid-template-columns: 1fr; }
4434
4430
  }
4431
+ /* Wide-viewport density: auto-fit grid so panel COUNT tracks actual children
4432
+ instead of a hardcoded column number — 2 children sit 2-up, 5 wrap to a
4433
+ third row, never an arbitrary 3-card reflex (same auto-fit/minmax pattern
4434
+ as .ds-tile-grid). Panels floor at 280px before wrapping, so ultra-wide
4435
+ screens still get more columns than a fixed repeat(3, ...) ever allowed. */
4436
+ .ds-247420 .ds-panel-trio { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr)); gap: var(--space-2); margin: var(--space-2) 0; }
4437
+ .ds-247420 .ds-panel-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: var(--space-2); margin: var(--space-2) 0; }
4435
4438
  /* wide dense rows/tables scroll inside their panel, never the page */
4436
4439
  .ds-247420 .ds-scroll-x { overflow-x: auto; -webkit-overflow-scrolling: touch; max-width: 100%; }
4437
4440
 
@@ -4442,7 +4445,7 @@
4442
4445
  max-width: min(1100px, 100%);
4443
4446
  margin: var(--space-3) auto;
4444
4447
  background: var(--bg-2);
4445
- border-radius: 18px;
4448
+ border-radius: var(--r-2);
4446
4449
  padding: clamp(16px, 5vw, 64px);
4447
4450
  box-sizing: border-box;
4448
4451
  display: flex;
@@ -4504,7 +4507,7 @@
4504
4507
  .ds-247420 .ds-slide-split { grid-template-columns: 1fr; }
4505
4508
  }
4506
4509
  .ds-247420 .ds-slide-split-cell {
4507
- padding: 18px; background: var(--bg-2); border-radius: 14px;
4510
+ padding: 18px; background: var(--bg-2); border-radius: var(--r-2);
4508
4511
  color: var(--fg-2); font-size: var(--fs-lg); line-height: var(--lh-base); min-width: 0;
4509
4512
  }
4510
4513
  .ds-247420 .ds-slide-split-cell--accent { border-left: 3px solid var(--slide-accent, var(--accent)); }
@@ -4521,7 +4524,7 @@
4521
4524
  .ds-247420 .ds-err-path {
4522
4525
  display: inline-flex; gap: 6px; align-items: baseline; flex-wrap: wrap; max-width: 100%;
4523
4526
  font-family: var(--ff-mono); font-size: 13px; color: var(--panel-text-2);
4524
- background: var(--panel-1); padding: 6px 12px; border-radius: 8px;
4527
+ background: var(--panel-1); padding: 6px 12px; border-radius: var(--r-0);
4525
4528
  overflow-wrap: anywhere; word-break: break-all;
4526
4529
  }
4527
4530
 
@@ -4537,10 +4540,15 @@
4537
4540
  }
4538
4541
  .ds-247420 .ds-gallery-tile {
4539
4542
  cursor: pointer; display: flex; flex-direction: column; gap: 6px;
4540
- padding: 12px; border-radius: 10px; min-height: clamp(120px, 18vw, 160px);
4543
+ padding: 12px; border-radius: var(--r-1); min-height: clamp(120px, 18vw, 160px);
4541
4544
  border: 0; text-align: left; font: inherit; color: inherit;
4542
4545
  background: var(--tile-tone, var(--panel-1));
4546
+ transition: transform var(--dur-base) var(--ease), box-shadow var(--dur-base) var(--ease);
4543
4547
  }
4548
+ /* Flat tonal fill only (house style: no bespoke tile chrome, no borders — see
4549
+ .ds-feature above), so the hover affordance is a lift, matching the same
4550
+ translateY + shadow idiom .chat-msg:hover .chat-bubble already uses. */
4551
+ .ds-247420 .ds-gallery-tile:hover { transform: translateY(-2px); box-shadow: 0 2px 8px color-mix(in oklab, var(--fg) 10%, transparent); }
4544
4552
  .ds-247420 .ds-gallery-tile:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4545
4553
  .ds-247420 .ds-gallery-tile--tight { min-height: clamp(96px, 14vw, 120px); }
4546
4554
  .ds-247420 .ds-lightbox {
@@ -4551,7 +4559,7 @@
4551
4559
  z-index: 50;
4552
4560
  }
4553
4561
  .ds-247420 .ds-lightbox-card {
4554
- background: var(--panel-0); border-radius: 14px; padding: clamp(16px, 4vw, 28px);
4562
+ background: var(--panel-0); border-radius: var(--r-2); padding: clamp(16px, 4vw, 28px);
4555
4563
  width: min(520px, 100%); min-width: 0;
4556
4564
  max-height: calc(100vh - 24px);
4557
4565
  max-height: calc(100dvh - 24px);
@@ -4559,7 +4567,7 @@
4559
4567
  display: flex; flex-direction: column; gap: 14px;
4560
4568
  }
4561
4569
  .ds-247420 .ds-lightbox-preview {
4562
- padding: clamp(16px, 6vw, 36px); border-radius: 10px; text-align: center;
4570
+ padding: clamp(16px, 6vw, 36px); border-radius: var(--r-1); text-align: center;
4563
4571
  font-family: var(--ff-mono); white-space: pre-line; font-size: clamp(16px, 5vw, 24px);
4564
4572
  background: var(--tile-tone, var(--panel-1));
4565
4573
  }
@@ -4581,7 +4589,7 @@
4581
4589
  }
4582
4590
  .ds-247420 .ds-swatch-grid-lg { grid-template-columns: repeat(auto-fill, minmax(min(150px, 100%), 1fr)); }
4583
4591
  .ds-247420 .ds-swatch-col { display: flex; flex-direction: column; gap: 6px; }
4584
- .ds-247420 .ds-swatch-chip { height: 48px; border-radius: 10px; border: 1px solid var(--rule); background: var(--swatch, var(--panel-1)); }
4592
+ .ds-247420 .ds-swatch-chip { height: 48px; border-radius: var(--r-1); border: 1px solid var(--rule); background: var(--swatch, var(--panel-1)); }
4585
4593
  .ds-247420 .ds-swatch-chip--big { height: 64px; }
4586
4594
  .ds-247420 .ds-swatch-name { font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
4587
4595
  .ds-247420 .ds-type-panel { padding: clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px); display: flex; flex-direction: column; gap: 14px; }
@@ -4643,14 +4651,14 @@
4643
4651
  .ds-247420 .ds-savebar {
4644
4652
  position: sticky; bottom: 8px; display: flex; align-items: center;
4645
4653
  justify-content: flex-end; gap: 8px; flex-wrap: wrap; padding: 10px;
4646
- background: var(--panel-2); border-radius: 10px; margin: 8px 0;
4654
+ background: var(--panel-2); border-radius: var(--r-1); margin: 8px 0;
4647
4655
  }
4648
4656
  .ds-247420 .ds-savebar-note { flex: 1 1 160px; min-width: 0; color: var(--panel-text-2); }
4649
4657
  .ds-247420 .ds-settings-modal { min-width: min(320px, calc(100vw - 32px)); max-width: 480px; }
4650
4658
  .ds-247420 .ds-modal-body-form { padding: 16px; display: flex; flex-direction: column; gap: 12px; }
4651
4659
  .ds-247420 .ds-modal-note { margin: 0 0 8px; color: var(--panel-text-2); font-size: 14px; }
4652
4660
  .ds-247420 .ds-draft-preview {
4653
- background: var(--panel-1); padding: 12px; border-radius: 6px;
4661
+ background: var(--panel-1); padding: 12px; border-radius: var(--r-0);
4654
4662
  font-size: 13px; color: var(--panel-text-2); max-height: 120px;
4655
4663
  overflow-y: auto; font-family: var(--ff-mono); overflow-wrap: anywhere;
4656
4664
  }
@@ -4671,7 +4679,7 @@
4671
4679
  .ds-247420 .ds-auth-remember { display: flex; align-items: center; gap: 6px; cursor: pointer; }
4672
4680
  .ds-247420 .ds-auth-remember-text { color: var(--panel-text-2); font-size: 13px; }
4673
4681
  .ds-247420 .ds-auth-forgot { font-size: 13px; }
4674
- .ds-247420 .ds-auth-error { padding: 8px 10px; background: var(--panel-1); border-radius: 8px; color: var(--danger); font-size: 13px; overflow-wrap: anywhere; }
4682
+ .ds-247420 .ds-auth-error { padding: 8px 10px; background: var(--panel-1); border-radius: var(--r-0); color: var(--danger); font-size: 13px; overflow-wrap: anywhere; }
4675
4683
  .ds-247420 .ds-auth-divider { display: flex; align-items: center; gap: 10px; margin: 6px 0; color: var(--panel-text-3); font-size: 12px; }
4676
4684
  .ds-247420 .ds-auth-divider-line { flex: 1; height: 1px; background: var(--panel-2); }
4677
4685
  .ds-247420 .ds-auth-providers { display: flex; gap: 8px; flex-wrap: wrap; }
@@ -4695,7 +4703,7 @@
4695
4703
  .ds-247420 .ds-tile-meta { display: flex; align-items: center; justify-content: space-between; gap: 6px; font-size: 12px; flex-wrap: wrap; min-width: 0; }
4696
4704
  .ds-247420 .ds-tile-glyph { font-family: var(--ff-mono); color: var(--panel-text-3); }
4697
4705
  .ds-247420 .ds-tile-label { color: var(--panel-text); overflow-wrap: anywhere; }
4698
- .ds-247420 .ds-gal-swatch { height: 64px; border-radius: 8px; background: var(--swatch, var(--panel-1)); }
4706
+ .ds-247420 .ds-gal-swatch { height: 64px; border-radius: var(--r-0); background: var(--swatch, var(--panel-1)); }
4699
4707
  .ds-247420 .ds-gal-swatch-meta { display: flex; justify-content: space-between; gap: 6px; flex-wrap: wrap; font-family: var(--ff-mono); font-size: 11px; min-width: 0; }
4700
4708
  .ds-247420 .ds-gal-swatch-name { color: var(--panel-text); }
4701
4709
  .ds-247420 .ds-gal-swatch-hint { color: var(--panel-text-3); overflow-wrap: anywhere; }
@@ -4716,7 +4724,7 @@
4716
4724
  .ds-247420 .ds-cli-warn .prompt, .ds-247420 .ds-cli-warn .cmd { color: var(--mascot); }
4717
4725
  .ds-247420 .ds-cli-log .prompt { color: var(--fg-3); }
4718
4726
  .ds-247420 .ds-cli-log .cmd { color: var(--fg-2); font-family: var(--ff-mono); }
4719
- .ds-247420 .ds-term-body { padding: 14px 18px; display: flex; flex-direction: column; gap: 4px; background: var(--bg-2); border-radius: 10px; }
4727
+ .ds-247420 .ds-term-body { padding: 14px 18px; display: flex; flex-direction: column; gap: 4px; background: var(--bg-2); border-radius: var(--r-1); }
4720
4728
  .ds-247420 .ds-term-body--tall { min-height: 280px; }
4721
4729
  .ds-247420 .ds-term-input-row { margin-top: 6px; }
4722
4730
  .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); }
@@ -4841,7 +4849,7 @@
4841
4849
  width: 4px;
4842
4850
  height: 8px;
4843
4851
  background: var(--fg);
4844
- border-radius: 0 4px 4px 0;
4852
+ border-radius: 0 var(--r-0) var(--r-0) 0;
4845
4853
  transition: height var(--dur-base) var(--ease);
4846
4854
  }
4847
4855
  .ds-247420 .cm-server-icon:hover .cm-server-pill { height: 20px; }
@@ -4897,7 +4905,7 @@
4897
4905
  width: 32px;
4898
4906
  height: 2px;
4899
4907
  background: color-mix(in oklab, var(--fg) 12%, transparent);
4900
- border-radius: 2px;
4908
+ border-radius: var(--r-hair);
4901
4909
  margin: 4px 0;
4902
4910
  flex-shrink: 0;
4903
4911
  }
@@ -4958,7 +4966,7 @@
4958
4966
  .ds-247420 .cm-channel-list::-webkit-scrollbar-track { background: transparent; }
4959
4967
  .ds-247420 .cm-channel-list::-webkit-scrollbar-thumb {
4960
4968
  background: color-mix(in oklab, var(--fg) 18%, transparent);
4961
- border-radius: 4px;
4969
+ border-radius: var(--r-0);
4962
4970
  }
4963
4971
 
4964
4972
  /* ============================================================
@@ -5038,7 +5046,7 @@
5038
5046
  background: color-mix(in oklab, var(--fg) 8%, transparent);
5039
5047
  }
5040
5048
  .ds-247420 .cm-cat-add:focus-visible {
5041
- outline: 2px solid var(--accent);
5049
+ outline: 2px solid var(--accent-ink);
5042
5050
  outline-offset: 2px;
5043
5051
  }
5044
5052
 
@@ -5090,7 +5098,7 @@
5090
5098
  bottom: 4px;
5091
5099
  width: 3px;
5092
5100
  background: var(--accent);
5093
- border-radius: 0 3px 3px 0;
5101
+ border-radius: 0 var(--r-hair) var(--r-hair) 0;
5094
5102
  }
5095
5103
 
5096
5104
  .ds-247420 .cm-channel-item.voice-active {
@@ -5219,7 +5227,7 @@
5219
5227
  background: color-mix(in oklab, var(--fg) 10%, transparent);
5220
5228
  }
5221
5229
  .ds-247420 .cm-ch-action-btn:focus-visible {
5222
- outline: 2px solid var(--accent);
5230
+ outline: 2px solid var(--accent-ink);
5223
5231
  outline-offset: 2px;
5224
5232
  }
5225
5233
 
@@ -5558,7 +5566,7 @@
5558
5566
  .ds-247420 .cm-member-list::-webkit-scrollbar { width: 8px; }
5559
5567
  .ds-247420 .cm-member-list::-webkit-scrollbar-thumb {
5560
5568
  background: color-mix(in oklab, var(--fg) 18%, transparent);
5561
- border-radius: 4px;
5569
+ border-radius: var(--r-0);
5562
5570
  }
5563
5571
 
5564
5572
  .ds-247420 .cm-member-category {
@@ -5802,45 +5810,45 @@
5802
5810
  .ds-247420 .cm-server-icon:focus-visible,
5803
5811
  .ds-247420 .cm-server-back:focus-visible,
5804
5812
  .ds-247420 .cm-server-add:focus-visible {
5805
- outline: 2px solid var(--accent);
5813
+ outline: 2px solid var(--accent-ink);
5806
5814
  outline-offset: 2px;
5807
5815
  border-radius: var(--r-2);
5808
5816
  }
5809
5817
 
5810
5818
  .ds-247420 .cm-channel-item:focus-visible {
5811
- outline: 2px solid var(--accent);
5819
+ outline: 2px solid var(--accent-ink);
5812
5820
  outline-offset: -2px;
5813
5821
  border-radius: var(--r-1);
5814
5822
  }
5815
5823
 
5816
5824
  .ds-247420 .cm-server-header:focus-visible,
5817
5825
  .ds-247420 .cm-category-header:focus-visible {
5818
- outline: 2px solid var(--accent);
5826
+ outline: 2px solid var(--accent-ink);
5819
5827
  outline-offset: -2px;
5820
5828
  }
5821
5829
 
5822
5830
  .ds-247420 .cm-member-item:focus-visible {
5823
- outline: 2px solid var(--accent);
5831
+ outline: 2px solid var(--accent-ink);
5824
5832
  outline-offset: -2px;
5825
5833
  border-radius: var(--r-1);
5826
5834
  }
5827
5835
 
5828
5836
  .ds-247420 .cm-vs-btn:focus-visible,
5829
5837
  .ds-247420 .cm-user-btn:focus-visible {
5830
- outline: 2px solid var(--accent);
5838
+ outline: 2px solid var(--accent-ink);
5831
5839
  outline-offset: 2px;
5832
5840
  border-radius: var(--r-1);
5833
5841
  }
5834
5842
 
5835
5843
  /* ThreadPanel / Forum / Page interactive elements */
5836
5844
  .ds-247420 .cm-tp-item:focus-visible,
5837
- .ds-247420 .cm-forum-item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-1); }
5845
+ .ds-247420 .cm-forum-item:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; border-radius: var(--r-1); }
5838
5846
  .ds-247420 .cm-tp-new:focus-visible,
5839
5847
  .ds-247420 .cm-tp-close:focus-visible,
5840
5848
  .ds-247420 .cm-forum-new:focus-visible,
5841
5849
  .ds-247420 .cm-forum-sort:focus-visible,
5842
- .ds-247420 .cm-page-edit:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-1); }
5843
- .ds-247420 .cm-forum-search:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent); }
5850
+ .ds-247420 .cm-page-edit:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; border-radius: var(--r-1); }
5851
+ .ds-247420 .cm-forum-search:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent-ink); }
5844
5852
 
5845
5853
  /* ---------- mobile header ---------- */
5846
5854
  .ds-247420 .cm-mobile-header {
@@ -5868,7 +5876,7 @@
5868
5876
  border-radius: var(--r-1);
5869
5877
  }
5870
5878
  .ds-247420 .cm-mh-btn:hover { background: var(--panel-3); }
5871
- .ds-247420 .cm-mh-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
5879
+ .ds-247420 .cm-mh-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
5872
5880
  .ds-247420 .cm-mh-title {
5873
5881
  flex: 1 1 auto;
5874
5882
  min-width: 0;
@@ -5913,7 +5921,7 @@
5913
5921
  border-radius: var(--r-1);
5914
5922
  }
5915
5923
  .ds-247420 .cm-rb-cancel:hover { background: var(--panel-3); color: var(--fg); }
5916
- .ds-247420 .cm-rb-cancel:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5924
+ .ds-247420 .cm-rb-cancel:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
5917
5925
 
5918
5926
  /* ---------- banner ---------- */
5919
5927
  .ds-247420 .cm-banner {
@@ -5926,6 +5934,7 @@
5926
5934
  font-weight: 500;
5927
5935
  }
5928
5936
  .ds-247420 .cm-banner.clickable { cursor: pointer; }
5937
+ .ds-247420 .cm-banner.clickable:hover { background: color-mix(in oklab, currentColor 10%, transparent); }
5929
5938
  .ds-247420 .cm-banner-msg { flex: 1 1 auto; min-width: 0; }
5930
5939
  .ds-247420 .cm-banner-action {
5931
5940
  flex: none;
@@ -6002,6 +6011,7 @@
6002
6011
  touch-action: none;
6003
6012
  transition: background var(--dur-base) var(--ease), border-color var(--dur-base) var(--ease), transform var(--dur-snap) var(--ease);
6004
6013
  }
6014
+ .ds-247420 .vx-ptt:hover { background: color-mix(in oklab, var(--fg) 8%, var(--bg-2)); }
6005
6015
  .ds-247420 .vx-ptt:active { transform: scale(0.97); }
6006
6016
  .ds-247420 .vx-ptt-icon { font-size: var(--fs-xl); line-height: 1; }
6007
6017
  .ds-247420 .vx-ptt-label { font-size: var(--fs-tiny); letter-spacing: var(--tr-label); text-transform: uppercase; }
@@ -6111,6 +6121,7 @@
6111
6121
  cursor: pointer;
6112
6122
  transition: background var(--dur-base) var(--ease);
6113
6123
  }
6124
+ .ds-247420 .vx-btn:hover { background: var(--bg-4, var(--bg-3)); }
6114
6125
  .ds-247420 .vx-btn-on, .ds-247420 .vx-btn-primary { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }
6115
6126
 
6116
6127
  .ds-247420 .vx-modal-backdrop {
@@ -6141,6 +6152,7 @@
6141
6152
  border: 0; background: transparent; color: var(--fg-3);
6142
6153
  font-size: var(--fs-xl); line-height: 1; cursor: pointer; padding: 0 var(--space-1);
6143
6154
  }
6155
+ .ds-247420 .vx-modal-x:hover { color: var(--fg); }
6144
6156
  .ds-247420 .vx-modal-body { padding: var(--space-3); overflow-y: auto; display: flex; flex-direction: column; gap: var(--space-3); }
6145
6157
  .ds-247420 .vx-modal-foot {
6146
6158
  display: flex; justify-content: flex-end; gap: var(--space-2);
@@ -6198,6 +6210,7 @@
6198
6210
  cursor: pointer;
6199
6211
  font-size: var(--fs-sm);
6200
6212
  }
6213
+ .ds-247420 .vx-queue-btn:hover { background: var(--bg-4, var(--bg-2)); }
6201
6214
  .ds-247420 .vx-queue-strip {
6202
6215
  display: flex; gap: var(--space-2);
6203
6216
  overflow-x: auto;
@@ -6215,6 +6228,7 @@
6215
6228
  font-size: var(--fs-tiny);
6216
6229
  cursor: pointer;
6217
6230
  }
6231
+ .ds-247420 .vx-chip:hover { background: var(--bg-4, var(--bg-2)); border-color: var(--rule-strong); }
6218
6232
  .ds-247420 .vx-chip-current { border-color: var(--accent); background: color-mix(in oklab, var(--accent) 16%, var(--bg-3)); }
6219
6233
  .ds-247420 .vx-chip-live { border-color: var(--green-2); }
6220
6234
  .ds-247420 .vx-chip-dot { width: 8px; height: 8px; border-radius: var(--r-pill); background: var(--fg-3); flex-shrink: 0; }
@@ -6291,7 +6305,44 @@
6291
6305
  .ds-247420 .cm-tp-item-title { font-size: var(--fs-1, 14px); }
6292
6306
  .ds-247420 .cm-tp-item-snippet { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
6293
6307
  .ds-247420 .cm-tp-item-meta { display: flex; gap: var(--space-2); font-size: var(--fs-micro, 11px); color: var(--fg-2, var(--fg)); opacity: .7; }
6294
- .ds-247420 .cm-tp-empty, .ds-247420 .cm-forum-empty, .ds-247420 .cm-channel-empty, .ds-247420 .cm-member-empty { padding: var(--space-3); text-align: center; color: var(--fg-2, var(--fg)); opacity: .7; font-size: var(--fs-sm); }
6308
+ .ds-247420 .cm-tp-empty, .ds-247420 .cm-forum-empty, .ds-247420 .cm-channel-empty, .ds-247420 .cm-member-empty {
6309
+ display: flex; flex-direction: column; align-items: center; gap: var(--space-2);
6310
+ padding: var(--space-4) var(--space-3); text-align: center;
6311
+ color: var(--fg-2, var(--fg)); opacity: .7; font-size: var(--fs-sm);
6312
+ }
6313
+ .ds-247420 .cm-tp-empty svg, .ds-247420 .cm-forum-empty svg, .ds-247420 .cm-channel-empty svg, .ds-247420 .cm-member-empty svg { opacity: .6; }
6314
+
6315
+ /* Loading skeletons — cold-load placeholders for channel/member/thread/forum
6316
+ lists. Same .ds-skel shimmer primitive as sessions.js/files.js so every
6317
+ list surface in the kit uses one shimmer language, never a bare spinner. */
6318
+ .ds-247420 .cm-channel-item-skeleton, .ds-247420 .cm-member-item-skeleton {
6319
+ display: flex; align-items: center; gap: var(--space-2);
6320
+ padding: var(--space-2); margin: 2px var(--space-1);
6321
+ }
6322
+ .ds-247420 .cm-channel-item-skeleton .ds-skel-icon, .ds-247420 .cm-member-item-skeleton .ds-skel-icon {
6323
+ width: 20px; height: 20px; border-radius: var(--r-round, 50%); flex: none; background: var(--bg-3);
6324
+ }
6325
+ .ds-247420 .cm-channel-item-skeleton .ds-skel-title, .ds-247420 .cm-member-item-skeleton .ds-skel-title {
6326
+ height: 12px; width: 60%; border-radius: var(--r-1); background: var(--bg-3);
6327
+ }
6328
+ .ds-247420 .cm-list-item-skeleton {
6329
+ display: flex; flex-direction: column; gap: 6px;
6330
+ padding: var(--space-2) var(--space-3); border-bottom: var(--bw-hair) solid var(--rule);
6331
+ }
6332
+ .ds-247420 .cm-list-item-skeleton .ds-skel-title { height: 12px; width: 55%; border-radius: var(--r-1); background: var(--bg-3); }
6333
+ .ds-247420 .cm-list-item-skeleton .ds-skel-meta { height: 9px; width: 35%; border-radius: var(--r-1); background: var(--bg-3); }
6334
+ /* Self-contained shimmer keyframe: community.css ships standalone (the
6335
+ community-app kit does not also load chat.css), so this cannot depend on
6336
+ chat.css's ds-skel-shimmer definition even though the visual language and
6337
+ token vocabulary match it exactly. */
6338
+ @media (prefers-reduced-motion: no-preference) {
6339
+ .ds-247420 .cm-channel-item-skeleton .ds-skel-icon, .ds-247420 .cm-channel-item-skeleton .ds-skel-title, .ds-247420 .cm-member-item-skeleton .ds-skel-icon, .ds-247420 .cm-member-item-skeleton .ds-skel-title, .ds-247420 .cm-list-item-skeleton .ds-skel-title, .ds-247420 .cm-list-item-skeleton .ds-skel-meta {
6340
+ animation: cm-skel-shimmer 1.3s ease-in-out infinite;
6341
+ background: linear-gradient(90deg, var(--bg-3) 0%, var(--bg-2) 50%, var(--bg-3) 100%);
6342
+ background-size: 200% 100%;
6343
+ }
6344
+ }
6345
+ @keyframes cm-skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
6295
6346
 
6296
6347
  /* ForumView — cm-forum / cm-forum-* */
6297
6348
  .ds-247420 .cm-forum { display: flex; flex-direction: column; height: 100%; min-height: 0; background: var(--bg-1, var(--bg-2)); color: var(--fg); }
@@ -6488,13 +6539,13 @@
6488
6539
  position: absolute; right: 16px; bottom: 12px; z-index: 3;
6489
6540
  display: none; align-items: center; gap: .35em;
6490
6541
  padding: .4em .8em; font: inherit; font-size: var(--fs-tiny); cursor: pointer;
6491
- border-radius: 999px; border: var(--bw-hair) solid var(--rule);
6542
+ border-radius: var(--r-pill); border: var(--bw-hair) solid var(--rule);
6492
6543
  background: var(--bg-2); color: var(--fg-2, var(--fg));
6493
6544
  box-shadow: 0 2px 8px color-mix(in srgb, var(--fg) 14%, transparent);
6494
6545
  }
6495
6546
  .ds-247420 .agentchat-jump.show { display: inline-flex; }
6496
6547
  .ds-247420 .agentchat-jump:hover { background: var(--bg-3); }
6497
- .ds-247420 .agentchat-jump:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
6548
+ .ds-247420 .agentchat-jump:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
6498
6549
 
6499
6550
  /* Streaming caret: a thin blinking bar at the live edge of an assistant turn. */
6500
6551
  .ds-247420 .chat-stream-caret {
@@ -6516,7 +6567,7 @@
6516
6567
  }
6517
6568
  .ds-247420 .chat-msg-action-label { font-size: var(--fs-tiny); }
6518
6569
  .ds-247420 .chat-msg-action:hover { background: var(--bg-2); color: var(--fg); }
6519
- .ds-247420 .chat-msg-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
6570
+ .ds-247420 .chat-msg-action:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; opacity: 1; }
6520
6571
 
6521
6572
  /* Empty state: a fresh thread is an invitation, not a void. */
6522
6573
  .ds-247420 .agentchat-empty {
@@ -6544,7 +6595,7 @@
6544
6595
  font: inherit;
6545
6596
  font-size: var(--fs-tiny);
6546
6597
  padding: .4em .8em;
6547
- border-radius: 999px;
6598
+ border-radius: var(--r-pill);
6548
6599
  border: 1px solid color-mix(in srgb, var(--fg) 16%, transparent);
6549
6600
  background: color-mix(in srgb, var(--fg) 5%, transparent);
6550
6601
  color: var(--fg-2, var(--fg));
@@ -6583,7 +6634,7 @@
6583
6634
  font-family: var(--ff-body); font-size: var(--fs-tiny);
6584
6635
  }
6585
6636
  .ds-247420 .agentchat-install-copy:hover { background: var(--bg-3); color: var(--fg); }
6586
- .ds-247420 .agentchat-install-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
6637
+ .ds-247420 .agentchat-install-copy:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
6587
6638
  .ds-247420 .agentchat-install-actions { display: flex; justify-content: flex-start; }
6588
6639
 
6589
6640
  /* Host-supplied transcript export actions riding the controls row. */
@@ -6594,7 +6645,7 @@
6594
6645
  font-family: var(--ff-body); font-size: var(--fs-tiny);
6595
6646
  }
6596
6647
  .ds-247420 .agentchat-export-act:hover { background: var(--bg-2); color: var(--fg); }
6597
- .ds-247420 .agentchat-export-act:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
6648
+ .ds-247420 .agentchat-export-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
6598
6649
 
6599
6650
  /* "working" tail: a long silent tool call shouldn't read as frozen. */
6600
6651
  .ds-247420 .agentchat-working {
@@ -6724,7 +6775,7 @@
6724
6775
  /* Rail filter uses the shared .ds-search-input primitive (provides bg/border/
6725
6776
  radius/focus-ring); only the rail layout + touch floor live here. */
6726
6777
  .ds-247420 .ds-session-head .ds-search-input { order: 1; flex: 1 1 auto; min-width: 0; min-height: 36px; padding: 0 10px; }
6727
- .ds-247420 .ds-session-new:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
6778
+ .ds-247420 .ds-session-new:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
6728
6779
  /* Touch floor (must FOLLOW the base rules - same specificity, order decides). */
6729
6780
  @media (pointer: coarse) {
6730
6781
  .ds-247420 .ds-session-new { width: 44px; min-height: 44px; }
@@ -6743,10 +6794,10 @@
6743
6794
  cursor: pointer; text-align: left; color: var(--fg);
6744
6795
  }
6745
6796
  .ds-247420 .ds-session-row:hover { background: var(--bg-2); }
6746
- .ds-247420 .ds-session-row:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
6797
+ .ds-247420 .ds-session-row:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
6747
6798
  .ds-247420 .ds-session-row.active { background: var(--accent-tint); box-shadow: inset 2px 0 0 var(--accent); }
6748
6799
  .ds-247420 .ds-session-row.rail-green::before, .ds-247420 .ds-session-row.rail-purple::before, .ds-247420 .ds-session-row.rail-flame::before {
6749
- content: ''; position: absolute; left: 0; top: 8px; bottom: 8px; width: 3px; border-radius: 3px;
6800
+ content: ''; position: absolute; left: 0; top: 8px; bottom: 8px; width: 3px; border-radius: var(--r-hair);
6750
6801
  }
6751
6802
  /* Rail tones MUST match .row.rail-* in app-shell.css so the same semantic state
6752
6803
  reads as one colour across the conversation list and content rows. */
@@ -6837,7 +6888,7 @@
6837
6888
  }
6838
6889
  .ds-247420 .chat-code-block:hover .chat-code-copy, .ds-247420 .chat-code-block:focus-within .chat-code-copy { opacity: 1; }
6839
6890
  .ds-247420 .chat-code-copy.is-copied { color: var(--accent-ink); border-color: var(--accent); }
6840
- .ds-247420 .chat-code-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
6891
+ .ds-247420 .chat-code-copy:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; opacity: 1; }
6841
6892
  /* Head-placed copy (structured CodeNode + FilePreviewCode) is always visible. */
6842
6893
  .ds-247420 .chat-code-head .spread { flex: 1; }
6843
6894
  .ds-247420 .chat-code-copy-head { position: static; opacity: 1; }
@@ -6926,7 +6977,7 @@
6926
6977
  cursor: pointer; font-family: var(--ff-body); font-size: var(--fs-tiny);
6927
6978
  }
6928
6979
  .ds-247420 .ds-dash-errors-toggle.active { background: var(--accent-tint); color: var(--fg); border-color: var(--accent); }
6929
- .ds-247420 .ds-dash-errors-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
6980
+ .ds-247420 .ds-dash-errors-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
6930
6981
 
6931
6982
  /* --- C3: per-card select checkbox. --- */
6932
6983
  .ds-247420 .ds-dash-select {
@@ -6936,7 +6987,7 @@
6936
6987
  font-family: var(--ff-mono); font-size: var(--fs-sm);
6937
6988
  }
6938
6989
  .ds-247420 .ds-dash-select[aria-checked="true"] { color: var(--accent-ink); }
6939
- .ds-247420 .ds-dash-select:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
6990
+ .ds-247420 .ds-dash-select:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
6940
6991
 
6941
6992
  /* --- C5: active dashboard card (current conversation). --- */
6942
6993
  .ds-247420 .ds-dash-card.is-active { box-shadow: inset 2px 0 0 var(--accent); }
@@ -6958,7 +7009,7 @@
6958
7009
 
6959
7010
  /* --- E1: inline file preview pane (split view, non-modal). --- */
6960
7011
  .ds-247420 .ds-preview-pane { display: flex; flex-direction: column; min-height: 0; height: 100%; overflow: hidden; }
6961
- .ds-247420 .ds-preview-pane:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
7012
+ .ds-247420 .ds-preview-pane:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
6962
7013
  .ds-247420 .ds-preview-pane .ds-preview-body { flex: 1; min-height: 0; overflow: auto; }
6963
7014
  .ds-247420 .ds-preview-pane-empty { align-items: center; justify-content: center; color: var(--fg-3); font-size: var(--fs-sm); }
6964
7015
  .ds-247420 .ds-preview-code-wrap { display: flex; flex-direction: column; min-height: 0; }
@@ -6975,7 +7026,7 @@
6975
7026
  border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2); cursor: pointer;
6976
7027
  font-family: var(--ff-body); font-size: var(--fs-tiny);
6977
7028
  }
6978
- .ds-247420 .ds-file-more-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
7029
+ .ds-247420 .ds-file-more-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
6979
7030
  /* --- D3: locked/no-access file row. --- */
6980
7031
  .ds-247420 .ds-file-row.is-locked { opacity: .6; }
6981
7032
 
@@ -6986,8 +7037,9 @@
6986
7037
  background: none; color: var(--fg-3); cursor: pointer;
6987
7038
  font-family: var(--ff-body); font-size: var(--fs-tiny);
6988
7039
  }
7040
+ .ds-247420 .ds-roots-tab:hover { background: var(--bg-2); color: var(--fg); }
6989
7041
  .ds-247420 .ds-roots-tab.active { background: var(--bg); color: var(--fg); }
6990
- .ds-247420 .ds-roots-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
7042
+ .ds-247420 .ds-roots-tab:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
6991
7043
 
6992
7044
  /* --- H4: touch targets. On a coarse pointer / narrow screen the hover-revealed
6993
7045
  action rows are made permanently visible and small controls floor to 44px so
@@ -7019,7 +7071,7 @@
7019
7071
  color: var(--fg-3); font-family: var(--ff-body); font-size: var(--fs-micro);
7020
7072
  }
7021
7073
  .ds-247420 .ds-session-meta-copy:hover { background: var(--bg-3); color: var(--fg); }
7022
- .ds-247420 .ds-session-meta-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
7074
+ .ds-247420 .ds-session-meta-copy:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
7023
7075
  @media (pointer: coarse), (max-width: 640px) {
7024
7076
  .ds-247420 .ds-session-meta-copy { min-height: 44px; min-width: 44px; }
7025
7077
  }
@@ -7047,7 +7099,7 @@
7047
7099
  }
7048
7100
 
7049
7101
  /* Drag-over ring: token accent, never a hex. */
7050
- .ds-247420 .chat-composer.dragover { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-2); }
7102
+ .ds-247420 .chat-composer.dragover { outline: 2px solid var(--accent-ink); outline-offset: -2px; border-radius: var(--r-2); }
7051
7103
 
7052
7104
  /* Per-bit composer context: only the bit that owns a control is a button. */
7053
7105
  .ds-247420 .chat-composer-context-bit {
@@ -7087,7 +7139,8 @@
7087
7139
  border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2); cursor: pointer;
7088
7140
  font-family: var(--ff-body); font-size: var(--fs-tiny);
7089
7141
  }
7090
- .ds-247420 .agentchat-earlier-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
7142
+ .ds-247420 .agentchat-earlier-btn:hover { background: var(--bg-2); color: var(--fg); }
7143
+ .ds-247420 .agentchat-earlier-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
7091
7144
  @media (pointer: coarse) {
7092
7145
  .ds-247420 .agentchat-earlier-btn { min-height: 44px; }
7093
7146
  }
@@ -7195,7 +7248,7 @@
7195
7248
  }
7196
7249
  .ds-247420 .chat-msg .chat-tool .chat-tool-head::-webkit-details-marker { display: none; }
7197
7250
  .ds-247420 .chat-msg .chat-tool .chat-tool-head:hover { background: var(--bg-2); }
7198
- .ds-247420 .chat-msg .chat-tool .chat-tool-head:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
7251
+ .ds-247420 .chat-msg .chat-tool .chat-tool-head:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
7199
7252
  .ds-247420 .chat-tool-icon { display: inline-flex; color: var(--fg-3); }
7200
7253
  .ds-247420 .chat-tool-name { font-family: var(--ff-mono); font-weight: 600; color: var(--fg); }
7201
7254
  .ds-247420 .chat-tool-label { color: var(--fg-3); font-size: var(--fs-tiny); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
@@ -7219,7 +7272,7 @@
7219
7272
  .ds-247420 .chat-tool-section-label { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); }
7220
7273
  .ds-247420 .chat-tool-copy { position: static; opacity: 0; }
7221
7274
  .ds-247420 .chat-tool-section:hover .chat-tool-copy, .ds-247420 .chat-tool-section:focus-within .chat-tool-copy { opacity: 1; }
7222
- .ds-247420 .chat-tool-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
7275
+ .ds-247420 .chat-tool-copy:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; opacity: 1; }
7223
7276
  .ds-247420 .chat-tool-pre { margin: 0; padding: var(--space-2); background: var(--bg-2); border-radius: var(--r-1); font-family: var(--ff-mono); font-size: var(--fs-tiny); line-height: 1.45; overflow-x: auto; max-height: 320px; overflow-y: auto; }
7224
7277
  .ds-247420 .chat-tool-pre.is-error { color: var(--flame); }
7225
7278
  .ds-247420 .chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
@@ -7282,10 +7335,11 @@
7282
7335
  .ds-247420 .ds-dash-breakdown .seg.is-idle::before { background: transparent; box-shadow: inset 0 0 0 1px var(--stale), inset 0 0 0 3px var(--bg); }
7283
7336
  .ds-247420 .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
7284
7337
  .ds-247420 .ds-dash-selectall { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--fs-tiny); color: var(--fg-2); cursor: pointer; background: none; border: none; padding: var(--space-1); }
7285
- .ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
7338
+ .ds-247420 .ds-dash-selectall:hover { color: var(--fg); }
7339
+ .ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
7286
7340
  .ds-247420 .ds-dash-clear { background: none; border: none; color: var(--fg-3); cursor: pointer; font-size: var(--fs-tiny); text-decoration: underline dotted; padding: var(--space-1); }
7287
7341
  .ds-247420 .ds-dash-clear:hover { color: var(--fg); }
7288
- .ds-247420 .ds-dash-clear:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; border-radius: var(--r-1); }
7342
+ .ds-247420 .ds-dash-clear:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; border-radius: var(--r-1); }
7289
7343
 
7290
7344
  /* Conversation-rail loading skeleton (cold ccsniff walk). */
7291
7345
  .ds-247420 .ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
@@ -7503,7 +7557,7 @@
7503
7557
  overflow: auto;
7504
7558
  }
7505
7559
  .ds-247420 .ds-ep-tree-item { display: flex; flex-direction: column; }
7506
- .ds-247420 .ds-ep-tree-item:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
7560
+ .ds-247420 .ds-ep-tree-item:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
7507
7561
  .ds-247420 .ds-ep-tree-row {
7508
7562
  display: flex; align-items: center; gap: 6px;
7509
7563
  padding: 4px 8px 4px 0;
@@ -7859,12 +7913,15 @@
7859
7913
  background: var(--panel-2, transparent);
7860
7914
  color: inherit; font: inherit; cursor: pointer;
7861
7915
  }
7916
+ .ds-247420 .ds-ep-dialog-btn:hover { background: var(--panel-3, var(--bg-3)); }
7862
7917
  .ds-247420 .ds-ep-dialog-btn.kind-primary {
7863
7918
  background: var(--accent); color: var(--accent-fg); border-color: var(--accent);
7864
7919
  }
7920
+ .ds-247420 .ds-ep-dialog-btn.kind-primary:hover { filter: brightness(1.08); }
7865
7921
  .ds-247420 .ds-ep-dialog-btn.kind-danger {
7866
7922
  background: var(--danger); color: var(--on-accent); border-color: var(--danger);
7867
7923
  }
7924
+ .ds-247420 .ds-ep-dialog-btn.kind-danger:hover { filter: brightness(1.1); }
7868
7925
 
7869
7926
  /* ---------------------------------------------------------------
7870
7927
  Toast
@@ -7908,7 +7965,7 @@
7908
7965
  .ds-247420 .ds-ep-ctxmenu-item:focus-visible,
7909
7966
  .ds-247420 .ds-ep-resize:focus-visible,
7910
7967
  .ds-247420 .ds-ep-dialog-btn:focus-visible {
7911
- outline: 2px solid var(--accent);
7968
+ outline: 2px solid var(--accent-ink);
7912
7969
  outline-offset: 2px;
7913
7970
  }
7914
7971
 
@@ -7959,7 +8016,7 @@
7959
8016
  .ds-247420 .ds-ep-iconbtn:focus-visible,
7960
8017
  .ds-247420 .ds-ep-iconbtn-group button:focus-visible,
7961
8018
  .ds-247420 .ds-ep-resize:focus-visible {
7962
- outline: 2px solid var(--accent);
8019
+ outline: 2px solid var(--accent-ink);
7963
8020
  outline-offset: 2px;
7964
8021
  border-radius: var(--r-1);
7965
8022
  }
@@ -7988,7 +8045,7 @@
7988
8045
  cursor: inherit;
7989
8046
  }
7990
8047
  .ds-247420 .ds-check:focus-visible, .ds-247420 .ds-radio:focus-visible {
7991
- outline: 2px solid var(--accent);
8048
+ outline: 2px solid var(--accent-ink);
7992
8049
  outline-offset: 2px;
7993
8050
  }
7994
8051
 
@@ -8015,6 +8072,7 @@
8015
8072
  padding: 0;
8016
8073
  flex-shrink: 0;
8017
8074
  }
8075
+ .ds-247420 .ds-toggle:hover { border-color: var(--rule-strong, var(--fg-3)); }
8018
8076
  .ds-247420 .ds-toggle-knob {
8019
8077
  position: absolute;
8020
8078
  top: 1px; left: 1px;
@@ -8032,7 +8090,7 @@
8032
8090
  transform: translateX(20px);
8033
8091
  }
8034
8092
  .ds-247420 .ds-toggle:focus-visible {
8035
- outline: 2px solid var(--accent);
8093
+ outline: 2px solid var(--accent-ink);
8036
8094
  outline-offset: 2px;
8037
8095
  }
8038
8096
  .ds-247420 .ds-toggle:disabled { cursor: not-allowed; }
@@ -8147,7 +8205,7 @@
8147
8205
  outline: none;
8148
8206
  }
8149
8207
  .ds-247420 .ds-dropdown-item:focus-visible {
8150
- outline: 2px solid var(--accent);
8208
+ outline: 2px solid var(--accent-ink);
8151
8209
  outline-offset: -2px;
8152
8210
  }
8153
8211
  .ds-247420 .ds-dropdown-item[aria-disabled="true"] {
@@ -8191,7 +8249,7 @@
8191
8249
  cursor: grab; font: 14px/1 var(--ff-mono, monospace); letter-spacing: -2px;
8192
8250
  touch-action: none; user-select: none;
8193
8251
  }
8194
- .ds-247420 .ds-reorder-handle:focus-visible { outline: 2px solid var(--focus-ring, var(--accent)); outline-offset: 2px; }
8252
+ .ds-247420 .ds-reorder-handle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
8195
8253
  .ds-247420 .ds-reorder-handle:active { cursor: grabbing; }
8196
8254
  .ds-247420[data-dragging="true"] { opacity: 0.6; cursor: grabbing; transform: scale(0.98); }
8197
8255
  .ds-247420[data-drop-target-active="true"] {
@@ -8200,7 +8258,7 @@
8200
8258
  }
8201
8259
  .ds-247420 .ds-reorder-insertion-line {
8202
8260
  height: 2px; background: var(--focus-ring, var(--accent));
8203
- border-radius: 1px; animation: ds-insertion-in var(--dur-snap, 120ms) var(--ease, ease);
8261
+ border-radius: var(--r-hair); animation: ds-insertion-in var(--dur-snap, 120ms) var(--ease, ease);
8204
8262
  }
8205
8263
  @keyframes ds-insertion-in { from { transform: scaleX(0); opacity: 0; } to { transform: scaleX(1); opacity: 1; } }
8206
8264
  @media (prefers-reduced-motion: reduce) {
@@ -8267,6 +8325,7 @@
8267
8325
  color: var(--fg); font: inherit; text-align: left;
8268
8326
  border-radius: var(--r-1, 10px); cursor: pointer;
8269
8327
  }
8328
+ .ds-247420 .ov-cmd-item:hover { background: var(--panel-2, var(--rule)); }
8270
8329
  .ds-247420 .ov-cmd-item.is-active { background: var(--accent); color: var(--accent-fg); }
8271
8330
  .ds-247420 .ov-cmd-glyph { width: 18px; display: inline-flex; justify-content: center; flex-shrink: 0; }
8272
8331
  .ds-247420 .ov-cmd-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -8301,6 +8360,7 @@
8301
8360
  padding: var(--space-2, 8px); cursor: pointer; font-size: var(--fs-lg, 18px);
8302
8361
  border-bottom: 2px solid transparent;
8303
8362
  }
8363
+ .ds-247420 .ov-emoji-tab:hover { background: var(--bg-2); }
8304
8364
  .ds-247420 .ov-emoji-tab[aria-selected="true"] { border-bottom-color: var(--accent); background: var(--bg-2); }
8305
8365
  .ds-247420 .ov-emoji-grid { overflow: auto; max-height: 220px; padding: var(--space-2, 8px); }
8306
8366
  .ds-247420 .ov-emoji-grid-inner { display: grid; grid-template-columns: repeat(8, 1fr); gap: var(--space-1, 4px); }
@@ -8399,7 +8459,7 @@
8399
8459
  border: 1px solid var(--rule); border-radius: var(--r-1, 10px);
8400
8460
  padding: var(--space-1, 4px) var(--space-2, 8px); font: inherit;
8401
8461
  }
8402
- .ds-247420 .ov-set-control:focus-visible { outline: none; border-color: var(--accent); }
8462
+ .ds-247420 .ov-set-control:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; border-color: var(--accent-ink); }
8403
8463
  .ds-247420 input.ov-set-control[type="range"] { padding: 0; accent-color: var(--accent); }
8404
8464
  .ds-247420 .ov-set-toggle { width: 18px; height: 18px; accent-color: var(--accent); flex-shrink: 0; cursor: pointer; }
8405
8465
  .ds-247420 .ov-set-btn {
@@ -8429,6 +8489,7 @@
8429
8489
  .ds-247420 .ov-auth-x:hover { color: var(--fg); }
8430
8490
  .ds-247420 .ov-auth-tabs { display: flex; gap: var(--space-1); padding: var(--space-2) var(--space-3) 0; }
8431
8491
  .ds-247420 .ov-auth-tab { flex: 1; padding: var(--space-1) var(--space-2); border: 1px solid var(--rule); border-bottom: none; border-radius: var(--r-1) var(--r-1) 0 0; background: var(--bg-3); color: var(--fg-2, var(--fg)); cursor: pointer; }
8492
+ .ds-247420 .ov-auth-tab:hover { color: var(--fg); }
8432
8493
  .ds-247420 .ov-auth-tab.is-active { background: var(--bg-2); color: var(--fg); font-weight: 700; }
8433
8494
  .ds-247420 .ov-auth-body { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3); }
8434
8495
  .ds-247420 .ov-auth-hint { margin: 0; font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); }
@@ -8494,8 +8555,8 @@
8494
8555
  background: var(--panel-2); cursor: pointer; flex-shrink: 0;
8495
8556
  }
8496
8557
  .ds-247420 .ds-input-color::-webkit-color-swatch-wrapper { padding: 2px; }
8497
- .ds-247420 .ds-input-color::-webkit-color-swatch { border: none; border-radius: 2px; }
8498
- .ds-247420 .ds-input-color:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
8558
+ .ds-247420 .ds-input-color::-webkit-color-swatch { border: none; border-radius: var(--r-hair); }
8559
+ .ds-247420 .ds-input-color:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
8499
8560
  .ds-247420 .ds-input-check {
8500
8561
  appearance: none; -webkit-appearance: none;
8501
8562
  width: 16px; height: 16px; flex-shrink: 0;
@@ -8508,7 +8569,7 @@
8508
8569
  width: 4px; height: 8px; border: solid var(--accent-fg);
8509
8570
  border-width: 0 2px 2px 0; transform: rotate(45deg);
8510
8571
  }
8511
- .ds-247420 .ds-input-check:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
8572
+ .ds-247420 .ds-input-check:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
8512
8573
 
8513
8574
  /* ---------------------------------------------------------------
8514
8575
  Tree drag-reparent affordance — clear drop target + dragging row.
@@ -8642,7 +8703,7 @@
8642
8703
  align-items: center;
8643
8704
  gap: 8px;
8644
8705
  padding: 6px 8px;
8645
- border-radius: 6px;
8706
+ border-radius: var(--r-0);
8646
8707
  color: var(--fg-2, color-mix(in oklab, var(--fg) 78%, transparent));
8647
8708
  text-decoration: none;
8648
8709
  font-size: var(--fs-sm, 14px);
@@ -8664,7 +8725,7 @@
8664
8725
  flex-shrink: 0;
8665
8726
  min-width: 18px;
8666
8727
  padding: 0 5px;
8667
- border-radius: 9px;
8728
+ border-radius: var(--r-1);
8668
8729
  background: var(--accent);
8669
8730
  color: var(--on-accent);
8670
8731
  font-size: 11px;
@@ -8942,7 +9003,7 @@
8942
9003
  }
8943
9004
 
8944
9005
  @media (prefers-reduced-motion: reduce) {
8945
- .ds-247420 .ds-event-list .row.event-flash { animation: none; outline: 2px solid var(--accent); }
9006
+ .ds-247420 .ds-event-list .row.event-flash { animation: none; outline: 2px solid var(--accent-ink); }
8946
9007
  }
8947
9008
 
8948
9009
  @media print {
@@ -9018,7 +9079,7 @@
9018
9079
  max-width: 100%;
9019
9080
  padding: 18px 18px 18px 20px;
9020
9081
  background: var(--panel-1);
9021
- border-radius: 10px;
9082
+ border-radius: var(--r-1);
9022
9083
  box-shadow: var(--panel-shadow);
9023
9084
  scrollbar-width: thin;
9024
9085
  scrollbar-color: var(--panel-3) transparent;
@@ -9027,7 +9088,7 @@
9027
9088
  .ds-247420 #ds-article-host.has-toc > .toc::-webkit-scrollbar-track { background: transparent; }
9028
9089
  .ds-247420 #ds-article-host.has-toc > .toc::-webkit-scrollbar-thumb {
9029
9090
  background: var(--panel-3);
9030
- border-radius: 8px;
9091
+ border-radius: var(--r-0);
9031
9092
  border: 2px solid transparent;
9032
9093
  background-clip: padding-box;
9033
9094
  }
@@ -9063,7 +9124,7 @@
9063
9124
  .ds-247420 .cli {
9064
9125
  display: block;
9065
9126
  background: var(--panel-1);
9066
- border-radius: 8px;
9127
+ border-radius: var(--r-0);
9067
9128
  padding: 16px 20px;
9068
9129
  margin: 16px 0 28px 0;
9069
9130
  font-family: var(--ff-mono);
@@ -9124,7 +9185,7 @@
9124
9185
  padding: 14px 18px;
9125
9186
  margin: 8px 0;
9126
9187
  background: var(--panel-1);
9127
- border-radius: 6px;
9188
+ border-radius: var(--r-0);
9128
9189
  font-size: 13px;
9129
9190
  box-shadow: var(--panel-shadow);
9130
9191
  text-decoration: none;
@@ -9141,7 +9202,7 @@
9141
9202
  border: 1px solid var(--panel-3);
9142
9203
  font-size: 0.7rem;
9143
9204
  padding: 0.15rem 0.5rem;
9144
- border-radius: 3px;
9205
+ border-radius: var(--r-hair);
9145
9206
  font-family: var(--ff-mono);
9146
9207
  }
9147
9208
  .ds-247420 .ds-prose .gm-callout {
@@ -9242,7 +9303,7 @@
9242
9303
  }
9243
9304
  .ds-247420 .sp-loading-bar-track {
9244
9305
  height: 6px;
9245
- border-radius: 3px;
9306
+ border-radius: var(--r-hair);
9246
9307
  background: var(--bg-3);
9247
9308
  overflow: hidden;
9248
9309
  }