anentrypoint-design 0.0.210 → 0.0.212

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
@@ -199,22 +199,31 @@
199
199
  --size-sm: 32px;
200
200
  --size-base: 42px;
201
201
  --size-lg: 56px;
202
+
203
+ /* Unified focus-ring tokens (single source for the design system). Outset
204
+ rings (the default) tokenize colour+width+offset; bordered text fields use
205
+ the inset variant. Deliberate negative offsets on edge-flush/clipping
206
+ containers stay literal. */
207
+ --focus-color: var(--accent);
208
+ --focus-w: 2px;
209
+ --focus-offset: 2px;
210
+ --focus-ring-inset: inset 0 0 0 var(--focus-w) var(--focus-color);
202
211
  }
203
212
 
204
213
  /* ============================================================
205
214
  Focus-visible styles for keyboard navigation
206
215
  ============================================================ */
207
216
  .ds-247420 :focus-visible {
208
- outline: 2px solid var(--accent);
209
- outline-offset: 2px;
217
+ outline: var(--focus-w) solid var(--focus-color);
218
+ outline-offset: var(--focus-offset);
210
219
  }
211
220
 
212
221
  /* Button variants with focus-visible */
213
222
  .ds-247420 .btn:focus-visible,
214
223
  .ds-247420 .btn-primary:focus-visible,
215
224
  .ds-247420 .btn-ghost:focus-visible {
216
- outline: 2px solid var(--accent);
217
- outline-offset: 2px;
225
+ outline: var(--focus-w) solid var(--focus-color);
226
+ outline-offset: var(--focus-offset);
218
227
  }
219
228
 
220
229
  /* Link focus-visible */
@@ -262,6 +271,10 @@
262
271
  --danger: oklch(0.68 0.19 25);
263
272
  --flame: #FF5A1F;
264
273
  --amber: #D9A93A;
274
+ /* warn/sky dark-tuned pairs (mirror flame/amber): the :root paper values
275
+ (#E0241A / #3A6EFF) are too dark on ink; these clear AA 4.5:1 on --ink. */
276
+ --warn: #FF5A52;
277
+ --sky: #6E9BFF;
265
278
  --code-string: var(--green-2);
266
279
  --code-keyword: var(--sky);
267
280
  --code-fn: var(--flame);
@@ -295,6 +308,8 @@
295
308
  --accent-bright: var(--green-2);
296
309
  --flame: #FF5A1F;
297
310
  --amber: #D9A93A;
311
+ --warn: #FF5A52;
312
+ --sky: #6E9BFF;
298
313
  --code-string: var(--green-2);
299
314
  --code-keyword: var(--sky);
300
315
  --code-fn: var(--flame);
@@ -1024,8 +1039,13 @@
1024
1039
  .ds-247420 .row.rail-purple::before,
1025
1040
  .ds-247420 .row.rail-flame::before { height: 56%; opacity: 1; }
1026
1041
  .ds-247420 .row.rail-green::before { background: var(--accent); }
1027
- .ds-247420 .row.rail-purple::before { background: var(--purple-2, #7F18A4); }
1042
+ .ds-247420 .row.rail-purple::before { background: var(--purple-2); }
1028
1043
  .ds-247420 .row.rail-flame::before { background: var(--flame); }
1044
+ /* Differentiate the rail by SHAPE, not hue alone (color-blind safety): error
1045
+ reads as a taller solid bar, subagent as a dashed/gapped fill, ok stays the
1046
+ short solid bar. Paired with the sr-only status word emitted by Row(). */
1047
+ .ds-247420 .row.rail-flame::before { height: 64%; }
1048
+ .ds-247420 .row.rail-purple::before { background: repeating-linear-gradient(var(--purple-2) 0 4px, transparent 4px 7px); }
1029
1049
  .ds-247420 .row-grid { /* explicit grid-template-columns set inline */ }
1030
1050
  /* A row with no leading code/index drops the empty first column so the title
1031
1051
  takes the full width instead of wrapping in the narrow code gutter. */
@@ -1261,8 +1281,8 @@
1261
1281
  border: 0; border-radius: var(--r-2);
1262
1282
  box-shadow: inset 0 0 0 1px var(--rule);
1263
1283
  }
1264
- .ds-247420 .row-form input:focus,
1265
- .ds-247420 .row-form textarea:focus { box-shadow: inset 0 0 0 2px var(--accent); }
1284
+ .ds-247420 .row-form input:focus-visible,
1285
+ .ds-247420 .row-form textarea:focus-visible { box-shadow: var(--focus-ring-inset); }
1266
1286
 
1267
1287
  /* Field char counter (TextField maxLength) */
1268
1288
  .ds-247420 .ds-field-count {
@@ -1283,9 +1303,9 @@
1283
1303
  Responsive Design — Mobile (480px), Tablet (1024px), Desktop (1440px+)
1284
1304
  ============================================================ */
1285
1305
 
1286
- /* ────────────────────────────────────────────────────────────────────
1306
+ /* --------------------------------------------------------------------
1287
1307
  Mobile Portrait Breakpoint (480px and below)
1288
- ────────────────────────────────────────────────────────────────────── */
1308
+ ---------------------------------------------------------------------- */
1289
1309
  @media (max-width: 480px) {
1290
1310
  /* App Layout: single-column + drawer is handled once in the ≤900px block;
1291
1311
  no need to re-declare grid-template-columns here (was a redundant !important). */
@@ -1409,9 +1429,9 @@
1409
1429
  .ds-247420 .cli .copy { padding: 6px 12px; font-size: var(--fs-micro); }
1410
1430
  }
1411
1431
 
1412
- /* ────────────────────────────────────────────────────────────────────
1432
+ /* --------------------------------------------------------------------
1413
1433
  Container Query Responsive (720px and below)
1414
- ────────────────────────────────────────────────────────────────────── */
1434
+ ---------------------------------------------------------------------- */
1415
1435
  @container (max-width: 760px) {
1416
1436
  .ds-247420 .app-body { grid-template-columns: 1fr !important; }
1417
1437
  .ds-247420 .app-side-shell { border-right: 0; border-bottom: 1px solid var(--rule); }
@@ -1421,9 +1441,9 @@
1421
1441
  .ds-247420 .row .sub { grid-column: 1 / -1; order: 3; }
1422
1442
  }
1423
1443
 
1424
- /* ────────────────────────────────────────────────────────────────────
1444
+ /* --------------------------------------------------------------------
1425
1445
  Tablet Landscape Breakpoint (768px to 1024px)
1426
- ────────────────────────────────────────────────────────────────────── */
1446
+ ---------------------------------------------------------------------- */
1427
1447
  @media (min-width: 481px) and (max-width: 1024px) {
1428
1448
  /* App Layout — side handled by 900px drawer block; restore for 901-1024 */
1429
1449
  .ds-247420 .app-side a {
@@ -1500,9 +1520,9 @@
1500
1520
  }
1501
1521
  }
1502
1522
 
1503
- /* ────────────────────────────────────────────────────────────────────
1523
+ /* --------------------------------------------------------------------
1504
1524
  Mid Breakpoint (768px and below) — collapse sidebar + simplify row grid
1505
- ────────────────────────────────────────────────────────────────────── */
1525
+ ---------------------------------------------------------------------- */
1506
1526
  @media (max-width: 768px) {
1507
1527
  /* Sidebar stacks above main rather than sitting beside it */
1508
1528
  .ds-247420 .app-body { grid-template-columns: 1fr; }
@@ -1517,9 +1537,9 @@
1517
1537
  .ds-247420 .row .sub { grid-column: 1 / -1; }
1518
1538
  }
1519
1539
 
1520
- /* ────────────────────────────────────────────────────────────────────
1540
+ /* --------------------------------------------------------------------
1521
1541
  Desktop Breakpoint Enhancements (1025px and up)
1522
- ────────────────────────────────────────────────────────────────────── */
1542
+ ---------------------------------------------------------------------- */
1523
1543
  @media (min-width: 1025px) {
1524
1544
  /* Chat Bubbles */
1525
1545
  .ds-247420 .chat-stack { max-width: min(70%, 480px); }
@@ -1540,7 +1560,7 @@
1540
1560
  .ds-247420 .ds-chat-md { font-size: var(--fs-sm); line-height: 1.6; }
1541
1561
  .ds-247420 .ds-chat-composer { display: flex; gap: 8px; padding: var(--space-4); }
1542
1562
  .ds-247420 .ds-chat-composer input { flex: 1; padding: 13px 18px; background: var(--bg-2); border: 0; border-radius: var(--r-pill); font-family: inherit; font-size: var(--fs-sm); color: var(--fg); }
1543
- .ds-247420 .ds-chat-composer input:focus { box-shadow: inset 0 0 0 2px var(--accent); }
1563
+ .ds-247420 .ds-chat-composer input:focus-visible { box-shadow: var(--focus-ring-inset); }
1544
1564
 
1545
1565
  /* ============================================================
1546
1566
  File surface — responsive grid + row layouts
@@ -1560,13 +1580,15 @@
1560
1580
  .ds-247420 .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
1561
1581
  /* The quick filter is a compact control, not a full-width form row - a giant
1562
1582
  input above the grid reads as a search page and costs fold height. */
1563
- .ds-247420 .ds-file-filter { padding: 0 0 var(--space-1); display: flex; justify-content: flex-end; }
1583
+ /* The filter is now an inline item in the single .ds-file-controls toolbar row
1584
+ (the standalone right-aligned .ds-file-filter strip was removed). */
1564
1585
  .ds-247420 .ds-file-filter-input {
1565
1586
  width: min(280px, 100%); padding: 6px 12px; font-size: var(--fs-sm);
1566
1587
  background: var(--bg); color: var(--fg);
1567
1588
  border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
1568
1589
  }
1569
- .ds-247420 .ds-file-filter-input:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent); }
1590
+ .ds-247420 .ds-file-controls .ds-file-filter-input { flex: 0 1 220px; }
1591
+ .ds-247420 .ds-file-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
1570
1592
  .ds-247420 .ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
1571
1593
  .ds-247420 .ds-file-sort-btn {
1572
1594
  font-size: var(--fs-tiny); font-family: var(--ff-mono); color: var(--fg-3);
@@ -1687,11 +1709,34 @@
1687
1709
  .ds-247420 .ds-file-act-warn:hover { background: color-mix(in oklab, var(--warn) 18%, var(--bg)); color: var(--warn); }
1688
1710
 
1689
1711
  /* Multi-select — per-row checkbox, header tri-state, bulk action strip. */
1712
+ /* CSS-drawn multi-select checkbox: a bordered box that fills with the accent +
1713
+ a border-drawn tick when its parent button is .is-marked or aria-checked.
1714
+ Shared by FileRow/FileCell (.is-marked) and the file/session select-all +
1715
+ SessionCard select (aria-checked true/mixed) since the bundle concatenates
1716
+ all CSS. Replaces the old [x]/[ ] bracket text - no glyphs, AT keeps the
1717
+ role=checkbox/aria-checked name+state. */
1718
+ .ds-247420 .ds-check-box {
1719
+ width: 15px; height: 15px; box-sizing: border-box; flex: 0 0 auto; position: relative;
1720
+ border: 1.5px solid var(--fg-3); border-radius: 4px;
1721
+ transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
1722
+ }
1723
+ .ds-247420 .is-marked > .ds-check-box,
1724
+ .ds-247420[aria-checked="true"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
1725
+ .ds-247420 .is-marked > .ds-check-box::after,
1726
+ .ds-247420[aria-checked="true"] > .ds-check-box::after {
1727
+ content: ""; position: absolute; left: 4px; top: 1px; width: 4px; height: 8px;
1728
+ border: solid var(--bg); border-width: 0 1.5px 1.5px 0; transform: rotate(45deg);
1729
+ }
1730
+ .ds-247420[aria-checked="mixed"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
1731
+ .ds-247420[aria-checked="mixed"] > .ds-check-box::after {
1732
+ content: ""; position: absolute; left: 3px; right: 3px; top: 6px; height: 2px; background: var(--bg); border-radius: 1px;
1733
+ }
1734
+
1690
1735
  .ds-247420 .ds-file-check {
1691
1736
  display: inline-flex; align-items: center; justify-content: center;
1692
1737
  min-width: 28px; height: 28px; padding: 0 4px;
1693
1738
  background: transparent; border: 0; border-radius: var(--r-1);
1694
- font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3);
1739
+ color: var(--fg-3);
1695
1740
  cursor: pointer;
1696
1741
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1697
1742
  }
@@ -1716,7 +1761,7 @@
1716
1761
  padding: var(--space-1) var(--space-2);
1717
1762
  background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1718
1763
  }
1719
- .ds-247420 .ds-bulkbar-count { font-size: var(--fs-tiny); color: var(--fg-2); }
1764
+ .ds-247420 .ds-bulkbar-count { font-size: var(--fs-sm); font-weight: 600; color: var(--fg-2); }
1720
1765
  /* BulkBar is a toolbar (it even declares role=toolbar): compact rect buttons,
1721
1766
  quiet destructive outline - the app arm-confirms destructive bulk actions
1722
1767
  via ConfirmDialog, so the strip never needs a loud CTA. */
@@ -1782,6 +1827,16 @@
1782
1827
  }
1783
1828
  .ds-247420 .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
1784
1829
  .ds-247420 .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
1830
+ /* Per-type icon tints on thumb tiles so the grid keeps the colour-coding the
1831
+ list rows already carry (mirrors .ds-file-row[data-file-type] .ds-file-icon). */
1832
+ .ds-247420 .ds-file-cell[data-file-type="dir"] .ds-file-icon { color: var(--accent); }
1833
+ .ds-247420 .ds-file-cell[data-file-type="image"] .ds-file-icon { color: var(--mascot); }
1834
+ .ds-247420 .ds-file-cell[data-file-type="video"] .ds-file-icon { color: var(--purple-2); }
1835
+ .ds-247420 .ds-file-cell[data-file-type="audio"] .ds-file-icon { color: var(--sky); }
1836
+ .ds-247420 .ds-file-cell[data-file-type="code"] .ds-file-icon { color: var(--green-2); }
1837
+ .ds-247420 .ds-file-cell[data-file-type="archive"] .ds-file-icon { color: var(--flame); }
1838
+ .ds-247420 .ds-file-cell[data-file-type="document"] .ds-file-icon { color: var(--amber); }
1839
+ .ds-247420 .ds-file-cell[data-file-type="symlink"] .ds-file-icon { color: var(--purple); }
1785
1840
  .ds-247420 .ds-file-cell-name {
1786
1841
  font-size: var(--fs-tiny); text-align: left;
1787
1842
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
@@ -1792,13 +1847,6 @@
1792
1847
  background: color-mix(in oklab, var(--bg) 78%, transparent);
1793
1848
  }
1794
1849
 
1795
- /* Card mode — opt-in via data-columns; switches the list to a grid. */
1796
- .ds-247420 .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
1797
- .ds-247420 .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
1798
- .ds-247420 .ds-file-grid[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
1799
- .ds-247420 .ds-file-grid[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
1800
- .ds-247420 .ds-file-grid[data-columns="4"] { grid-template-columns: repeat(4, 1fr); }
1801
-
1802
1850
  /* ============================================================
1803
1851
  File browser surface — stage, toolbar, breadcrumb, dropzone,
1804
1852
  upload progress, empty state, modals, preview. Authored for
@@ -1977,7 +2025,7 @@
1977
2025
  .ds-247420 .ds-file-empty-glyph { font-size: 34px; opacity: 0.55; }
1978
2026
  .ds-247420 .ds-file-empty-text { font-size: var(--fs-sm); }
1979
2027
 
1980
- /* ── Modals ───────────────────────────────────────────────── */
2028
+ /* -- Modals ------------------------------------------------- */
1981
2029
  .ds-247420 .ds-modal-backdrop {
1982
2030
  position: fixed; inset: 0; z-index: var(--z-modal, 800);
1983
2031
  display: flex; align-items: center; justify-content: center;
@@ -2023,7 +2071,7 @@
2023
2071
  border-radius: var(--r-2); color: var(--fg);
2024
2072
  font-family: inherit; font-size: var(--fs-sm);
2025
2073
  }
2026
- .ds-247420 .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
2074
+ .ds-247420 .ds-modal-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2027
2075
  /* In-body modal error (role=alert): mutation failures (409/403) surface INSIDE
2028
2076
  the dialog, not behind the fixed overlay. */
2029
2077
  .ds-247420 .ds-modal-error {
@@ -2038,7 +2086,7 @@
2038
2086
  color: var(--on-color);
2039
2087
  }
2040
2088
 
2041
- /* ── Preview ──────────────────────────────────────────────── */
2089
+ /* -- Preview ------------------------------------------------ */
2042
2090
  .ds-247420 .ds-preview-head {
2043
2091
  display: flex; align-items: center; gap: var(--space-3);
2044
2092
  padding: var(--space-3) var(--space-4);
@@ -2111,7 +2159,7 @@
2111
2159
  .ds-247420 .ds-file-stage { padding: var(--space-3) var(--space-2); }
2112
2160
  }
2113
2161
 
2114
- /* ── File browser UX affordances ──────────────────────────── */
2162
+ /* -- File browser UX affordances ---------------------------- */
2115
2163
  /* Toolbar filter input — compact search box. */
2116
2164
  .ds-247420 .ds-filter-input {
2117
2165
  width: clamp(120px, 22vw, 220px);
@@ -2120,23 +2168,14 @@
2120
2168
  border-radius: var(--r-pill); color: var(--fg);
2121
2169
  font-family: inherit; font-size: var(--fs-xs);
2122
2170
  }
2123
- .ds-247420 .ds-filter-input:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent); }
2171
+ .ds-247420 .ds-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
2124
2172
 
2125
- /* Loading skeleton placeholder rows while a directory loads. */
2126
- .ds-247420 .ds-file-grid-loading { display: flex; flex-direction: column; gap: 4px; }
2127
- .ds-247420 .ds-file-skeleton {
2128
- height: 48px; border-radius: var(--r-2);
2129
- background: linear-gradient(90deg,
2130
- var(--bg) 0%, var(--bg-2) 50%, var(--bg) 100%);
2131
- background-size: 200% 100%;
2132
- }
2133
- @media (prefers-reduced-motion: no-preference) {
2134
- .ds-247420 .ds-file-skeleton { animation: ds-skeleton-shimmer 1.2s var(--ease) infinite; }
2135
- }
2136
- @keyframes ds-skeleton-shimmer {
2137
- 0% { background-position: 200% 0; }
2138
- 100% { background-position: -200% 0; }
2139
- }
2173
+ /* Loading skeleton: FileSkeleton renders `.ds-file-grid.ds-file-skeleton` with
2174
+ `.ds-file-row.ds-file-row-skeleton` rows whose inner `.ds-skel` children shimmer
2175
+ (via .ds-skel::after). The container therefore inherits the .ds-file-grid layout
2176
+ and must NOT be a single 48px gradient bar (that collapsed every row and double-
2177
+ shimmered). The dead .ds-file-grid-loading rule + unused ds-skeleton-shimmer
2178
+ keyframe were removed; only the inner .ds-skel children animate. */
2140
2179
 
2141
2180
  /* Drag-to-move drop target highlight on a directory row. */
2142
2181
  .ds-247420 .ds-file-row.ds-drop-target {
@@ -2345,6 +2384,13 @@
2345
2384
  padding: 10px 12px; border-radius: 6px; overflow-x: auto;
2346
2385
  font-family: var(--ff-mono); font-size: 0.9em; margin: 8px 0;
2347
2386
  }
2387
+ /* Markdown tables + horizontal rules: agents routinely emit them, but they were
2388
+ unstyled (bare unspaced cells, vanished rules). */
2389
+ .ds-247420 .chat-bubble.chat-md table { border-collapse: collapse; width: auto; max-width: 100%; margin: 8px 0; font-size: .95em; display: block; overflow-x: auto; }
2390
+ .ds-247420 .chat-bubble.chat-md th,
2391
+ .ds-247420 .chat-bubble.chat-md td { border: var(--bw-hair) solid var(--rule); padding: 4px 10px; text-align: left; }
2392
+ .ds-247420 .chat-bubble.chat-md th { background: color-mix(in oklab, var(--fg) 5%, transparent); font-weight: 600; }
2393
+ .ds-247420 .chat-bubble.chat-md hr { border: 0; border-top: var(--bw-hair) solid var(--rule); margin: 12px 0; }
2348
2394
 
2349
2395
  .ds-247420 .chat-msg .chat-bubble.chat-code,
2350
2396
  .ds-247420 .chat-msg.you .chat-bubble.chat-code,
@@ -2643,7 +2689,7 @@
2643
2689
  .ds-247420 .app-side a .glyph { font-family: var(--ff-mono); font-size: 13px; font-weight: 600; color: var(--fg-3); text-align: center; }
2644
2690
  .ds-247420 .app-side a.active .glyph { color: var(--accent); }
2645
2691
 
2646
- /* ── select primitive ─────────────────────────────────────────────────── */
2692
+ /* -- select primitive --------------------------------------------------- */
2647
2693
  .ds-247420 .ds-select {
2648
2694
  width: 100%;
2649
2695
  min-width: 0;
@@ -2667,10 +2713,10 @@
2667
2713
  background-repeat: no-repeat;
2668
2714
  cursor: pointer;
2669
2715
  }
2670
- .ds-247420 .ds-select:focus-visible { box-shadow: inset 0 0 0 2px var(--accent); }
2716
+ .ds-247420 .ds-select:focus-visible { box-shadow: var(--focus-ring-inset); }
2671
2717
  .ds-247420 .ds-select:hover { background-color: var(--bg-3); }
2672
2718
 
2673
- /* ── chat composer autogrow polish (sizing lives in the primary block) ── */
2719
+ /* -- chat composer autogrow polish (sizing lives in the primary block) -- */
2674
2720
  .ds-247420 .chat-composer textarea {
2675
2721
  transition: height var(--dur-snap) var(--ease);
2676
2722
  }
@@ -2679,7 +2725,7 @@
2679
2725
  cursor: not-allowed;
2680
2726
  }
2681
2727
 
2682
- /* ── mobile responsive: chat ──────────────────────────────────────────── */
2728
+ /* -- mobile responsive: chat -------------------------------------------- */
2683
2729
  @media (max-width: 768px) {
2684
2730
  .ds-247420 .chat-stack { max-width: 100%; }
2685
2731
  .ds-247420 .chat-msg { padding: 4px 0; }
@@ -2704,9 +2750,9 @@
2704
2750
  Comprehensive improvements for perfect UX across all surfaces
2705
2751
  ============================================================ */
2706
2752
 
2707
- /* ────────────────────────────────────────────────────────────
2753
+ /* ------------------------------------------------------------
2708
2754
  Component States — Disabled, Loading, Error, Success
2709
- ────────────────────────────────────────────────────────────── */
2755
+ -------------------------------------------------------------- */
2710
2756
 
2711
2757
  /* Disabled state for all interactive elements */
2712
2758
  .ds-247420 .btn:disabled, .ds-247420 .btn-primary:disabled, .ds-247420 .btn-ghost:disabled, .ds-247420 button:disabled, .ds-247420[disabled] {
@@ -2754,9 +2800,9 @@
2754
2800
  opacity: 0.8;
2755
2801
  }
2756
2802
 
2757
- /* ────────────────────────────────────────────────────────────
2803
+ /* ------------------------------------------------------------
2758
2804
  Enhanced Button Micro-Interactions
2759
- ────────────────────────────────────────────────────────────── */
2805
+ -------------------------------------------------------------- */
2760
2806
 
2761
2807
  /* Button scale feedback on active */
2762
2808
  .ds-247420 .btn:active:not(:disabled),
@@ -2783,9 +2829,9 @@
2783
2829
  -webkit-touch-callout: none;
2784
2830
  }
2785
2831
 
2786
- /* ────────────────────────────────────────────────────────────
2832
+ /* ------------------------------------------------------------
2787
2833
  Drag-and-Drop Styles
2788
- ────────────────────────────────────────────────────────────── */
2834
+ -------------------------------------------------------------- */
2789
2835
 
2790
2836
  /* Draggable element */
2791
2837
  .ds-247420[draggable="true"], .ds-247420 .draggable {
@@ -2842,9 +2888,9 @@
2842
2888
  50% { opacity: 1; }
2843
2889
  }
2844
2890
 
2845
- /* ────────────────────────────────────────────────────────────
2891
+ /* ------------------------------------------------------------
2846
2892
  Context Menu Styles
2847
- ────────────────────────────────────────────────────────────── */
2893
+ -------------------------------------------------------------- */
2848
2894
 
2849
2895
  .ds-247420 .ds-context-menu {
2850
2896
  position: absolute;
@@ -2906,9 +2952,9 @@
2906
2952
  cursor: context-menu;
2907
2953
  }
2908
2954
 
2909
- /* ────────────────────────────────────────────────────────────
2955
+ /* ------------------------------------------------------------
2910
2956
  Enhanced Form Inputs
2911
- ────────────────────────────────────────────────────────────── */
2957
+ -------------------------------------------------------------- */
2912
2958
 
2913
2959
  .ds-247420 input[type="text"],
2914
2960
  .ds-247420 input[type="email"],
@@ -2934,7 +2980,7 @@
2934
2980
  color: var(--fg-3);
2935
2981
  }
2936
2982
 
2937
- /* ── Field controls: themed base for TextField / Select / SearchInput ──
2983
+ /* -- Field controls: themed base for TextField / Select / SearchInput --
2938
2984
  Root fix: previously only `transition` was set, so themed apps got
2939
2985
  browser-default white boxes in dark mode and labels collided with inputs
2940
2986
  because `.ds-field` had no layout. */
@@ -2983,7 +3029,7 @@
2983
3029
  .ds-247420 .ds-field .ds-select:focus-visible,
2984
3030
  .ds-247420 .ds-search-input:focus-visible {
2985
3031
  outline: none;
2986
- box-shadow: inset 0 0 0 2px var(--accent);
3032
+ box-shadow: var(--focus-ring-inset);
2987
3033
  }
2988
3034
  .ds-247420 .ds-field input:disabled,
2989
3035
  .ds-247420 .ds-field textarea:disabled,
@@ -3021,9 +3067,9 @@
3021
3067
  color: var(--fg);
3022
3068
  }
3023
3069
 
3024
- /* ────────────────────────────────────────────────────────────
3070
+ /* ------------------------------------------------------------
3025
3071
  Accessibility Enhancements
3026
- ────────────────────────────────────────────────────────────── */
3072
+ -------------------------------------------------------------- */
3027
3073
 
3028
3074
  /* Enhanced focus-visible for all interactive elements */
3029
3075
  .ds-247420[role="button"]:focus-visible,
@@ -3052,11 +3098,17 @@
3052
3098
  animation-iteration-count: 1 !important;
3053
3099
  transition-duration: 0.01ms !important;
3054
3100
  }
3101
+ /* Kill the residual paint frame of looping skeleton/shimmer placeholders and
3102
+ give reduced-motion users a steady placeholder fill instead. */
3103
+ .ds-247420 .skeleton, .ds-247420 .ds-skeleton, .ds-247420 .ds-session-row-skeleton .ds-skel {
3104
+ animation: none !important;
3105
+ background: var(--bg-2) !important;
3106
+ }
3055
3107
  }
3056
3108
 
3057
- /* ────────────────────────────────────────────────────────────
3109
+ /* ------------------------------------------------------------
3058
3110
  Performance
3059
- ────────────────────────────────────────────────────────────── */
3111
+ -------------------------------------------------------------- */
3060
3112
 
3061
3113
  /* Limit layout/style containment to self-contained components. `paint` is
3062
3114
  intentionally omitted — it clips focus rings, tooltips and dropdowns that
@@ -3065,9 +3117,9 @@
3065
3117
  contain: layout style;
3066
3118
  }
3067
3119
 
3068
- /* ────────────────────────────────────────────────────────────
3120
+ /* ------------------------------------------------------------
3069
3121
  Mobile Touch Optimizations
3070
- ────────────────────────────────────────────────────────────── */
3122
+ -------------------------------------------------------------- */
3071
3123
 
3072
3124
  @media (hover: none) and (pointer: coarse) {
3073
3125
  /* Mobile devices: larger touch targets, faster responses */
@@ -3096,9 +3148,9 @@
3096
3148
  }
3097
3149
  }
3098
3150
 
3099
- /* ────────────────────────────────────────────────────────────
3151
+ /* ------------------------------------------------------------
3100
3152
  Theme Transition Smoothness
3101
- ────────────────────────────────────────────────────────────── */
3153
+ -------------------------------------------------------------- */
3102
3154
 
3103
3155
  /* Scoped to the DS wrapper so the design system never reaches out and
3104
3156
  animates the host document's html/body. */
@@ -3107,9 +3159,9 @@
3107
3159
  color var(--dur-base) var(--ease);
3108
3160
  }
3109
3161
 
3110
- /* ────────────────────────────────────────────────────────────
3162
+ /* ------------------------------------------------------------
3111
3163
  Empty State & Loading States
3112
- ────────────────────────────────────────────────────────────── */
3164
+ -------------------------------------------------------------- */
3113
3165
 
3114
3166
  .ds-247420 .empty-state {
3115
3167
  display: flex; flex-direction: column; align-items: center; gap: var(--space-4);
@@ -3147,9 +3199,9 @@
3147
3199
  .ds-247420 .skeleton-line { height: 12px; margin-bottom: 12px; }
3148
3200
  .ds-247420 .skeleton-title { height: 24px; margin-bottom: 16px; width: 60%; }
3149
3201
 
3150
- /* ────────────────────────────────────────────────────────────
3202
+ /* ------------------------------------------------------------
3151
3203
  Toast Notification Styles
3152
- ────────────────────────────────────────────────────────────── */
3204
+ -------------------------------------------------------------- */
3153
3205
 
3154
3206
  .ds-247420 .toast {
3155
3207
  position: fixed;
@@ -3476,6 +3528,15 @@
3476
3528
  .ds-247420 .ws-resizer.ws-resizer-rail { grid-column: 1; }
3477
3529
  .ds-247420 .ws-resizer.ws-resizer-sessions { grid-column: 2; }
3478
3530
  .ds-247420 .ws-resizer.ws-resizer-pane { grid-column: 3; justify-self: end; }
3531
+ /* A resizer must vanish once its TRACK is removed by the staging media blocks,
3532
+ else dragging it writes a --ws-*-w var that no longer affects the now-fixed
3533
+ drawer (a dead handle). Mirror the 1480 / 1100 / 900 staging exactly. */
3534
+ @media (max-width: 1480px) { .ds-247420 .ws-resizer.ws-resizer-pane { display: none; } }
3535
+ @media (max-width: 1100px) { .ds-247420 .ws-resizer.ws-resizer-sessions { display: none; } }
3536
+ @media (max-width: 900px) { .ds-247420 .ws-resizer { display: none; } }
3537
+ /* Coarse-pointer hit target for hybrid touch laptops above the drawer breakpoint
3538
+ (the 8px sliver is un-grabbable by touch). */
3539
+ @media (pointer: coarse) { .ds-247420 .ws-resizer { width: 16px; margin-right: -8px; } }
3479
3540
  /* Ease the rail/pane collapse. Track COUNT stays stable on collapse (only a
3480
3541
  width var flips), so grid-template-columns is animatable; reduced-motion
3481
3542
  drops it to an instant swap. */
@@ -3555,7 +3616,7 @@
3555
3616
  /* Crumb band is the top chrome of the content column: a stable height so the
3556
3617
  top edge aligns with the rail head, and a left gutter matching .ws-main so
3557
3618
  the trail text is not flush against the rail border. */
3558
- .ds-247420 .ws-crumb { flex: 0 0 auto; min-height: 48px; padding: 0 var(--space-4); display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
3619
+ .ds-247420 .ws-crumb { flex: 0 0 auto; min-height: 48px; padding: 0 var(--space-5); display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
3559
3620
  .ds-247420 .ws-crumb-main { flex: 1 1 auto; min-width: 0; }
3560
3621
  /* Content column gutter. Claude-Code-class calm: file grid / dashboard / event
3561
3622
  list / history get a generous, consistent inner gutter instead of butting
@@ -4916,7 +4977,11 @@
4916
4977
  .ds-247420 .cm-vs-btn,
4917
4978
  .ds-247420 .cm-user-btn,
4918
4979
  .ds-247420 .cm-ch-spinner,
4919
- .ds-247420 .cm-ch-voice-badge {
4980
+ .ds-247420 .cm-ch-voice-badge,
4981
+ .ds-247420 .vx-ptt,
4982
+ .ds-247420 .vx-ptt-glow,
4983
+ .ds-247420 .vx-vad-meter,
4984
+ .ds-247420 .vx-vad-fill {
4920
4985
  transition: none !important;
4921
4986
  animation: none !important;
4922
4987
  }
@@ -5455,14 +5520,14 @@
5455
5520
  }
5456
5521
  .ds-247420 .agentchat-empty-title { margin: 0; font-size: 1.05em; color: var(--fg-2, var(--fg)); }
5457
5522
  .ds-247420 .agentchat-empty-sub { margin: 0; font-size: var(--fs-sm); }
5458
- .ds-247420 .agentchat-empty-suggestions {
5523
+ .ds-247420 .agentchat-empty-suggestions, .ds-247420 .chat-empty-suggestions {
5459
5524
  display: flex;
5460
5525
  flex-wrap: wrap;
5461
5526
  gap: .5em;
5462
5527
  justify-content: center;
5463
5528
  margin-top: .5em;
5464
5529
  }
5465
- .ds-247420 .agentchat-empty-suggestion {
5530
+ .ds-247420 .agentchat-empty-suggestion, .ds-247420 .chat-empty-suggestion {
5466
5531
  cursor: pointer;
5467
5532
  font: inherit;
5468
5533
  font-size: var(--fs-tiny);
@@ -5472,8 +5537,8 @@
5472
5537
  background: color-mix(in srgb, var(--fg) 5%, transparent);
5473
5538
  color: var(--fg-2, var(--fg));
5474
5539
  }
5475
- .ds-247420 .agentchat-empty-suggestion:hover { background: color-mix(in srgb, var(--accent, var(--fg)) 12%, transparent); }
5476
- .ds-247420 .agentchat-empty-suggestion:focus-visible { outline: 2px solid var(--accent, var(--fg)); outline-offset: 2px; }
5540
+ .ds-247420 .agentchat-empty-suggestion:hover, .ds-247420 .chat-empty-suggestion:hover { background: color-mix(in srgb, var(--accent, var(--fg)) 12%, transparent); }
5541
+ .ds-247420 .agentchat-empty-suggestion:focus-visible, .ds-247420 .chat-empty-suggestion:focus-visible { outline: 2px solid var(--accent, var(--fg)); outline-offset: 2px; }
5477
5542
 
5478
5543
  /* Guided install path in the empty state: copy line + monospaced command rows
5479
5544
  (each with its own copy button) + a recheck button. No animation. */
@@ -5546,6 +5611,23 @@
5546
5611
  @media (prefers-reduced-motion: reduce) {
5547
5612
  .ds-247420 .agentchat-working .chat-thinking-dots span { animation: none; opacity: .7; }
5548
5613
  }
5614
+ /* Standalone thinking part (ThinkingNode renders .chat-bubble.chat-thinking with
5615
+ .chat-thinking-dots + .chat-thinking-text OUTSIDE the .agentchat-working tail).
5616
+ Without these base rules the dots are invisible empty spans and the text has
5617
+ no muted tone. Reuse the agentchat-dot-bounce keyframe. */
5618
+ .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; }
5619
+ .ds-247420 .chat-thinking-text { color: var(--fg-3); }
5620
+ .ds-247420 .chat-thinking-dots { display: inline-flex; gap: 3px; }
5621
+ .ds-247420 .chat-thinking-dots span {
5622
+ width: 5px; height: 5px; border-radius: 50%;
5623
+ background: var(--fg); opacity: .4;
5624
+ animation: agentchat-dot-bounce 1.2s infinite ease-in-out;
5625
+ }
5626
+ .ds-247420 .chat-thinking-dots span:nth-child(2) { animation-delay: .15s; }
5627
+ .ds-247420 .chat-thinking-dots span:nth-child(3) { animation-delay: .3s; }
5628
+ @media (prefers-reduced-motion: reduce) {
5629
+ .ds-247420 .chat-thinking-dots span { animation: none; opacity: .7; }
5630
+ }
5549
5631
 
5550
5632
  /* Responsive: the control cluster + cwd bar must stay usable on phones/tablets.
5551
5633
  The cwd path can't eat the row beside its label + buttons on a narrow screen. */
@@ -5573,16 +5655,20 @@
5573
5655
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
5574
5656
  background: var(--fg-3); flex: 0 0 auto;
5575
5657
  }
5658
+ /* Each variant carries a non-colour channel (fill vs halo vs hollow ring) so the
5659
+ states stay distinguishable for colour-blind users and when stale/connecting
5660
+ would otherwise share a hue. Mirrors the rail-tone shape differentiation. */
5576
5661
  .ds-247420 .status-dot-disc.status-dot-live { background: var(--accent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
5577
- .ds-247420 .status-dot-disc.status-dot-error { background: var(--flame); }
5578
- .ds-247420 .status-dot-disc.status-dot-connecting { background: var(--amber, #d9a93a); }
5579
- .ds-247420 .status-dot-disc.status-dot-stale { background: var(--amber, #d9a93a); }
5662
+ .ds-247420 .status-dot-disc.status-dot-error { background: var(--flame); box-shadow: 0 0 0 1.5px color-mix(in oklab, var(--flame) 38%, transparent); }
5663
+ .ds-247420 .status-dot-disc.status-dot-connecting { background: transparent; box-shadow: inset 0 0 0 2px var(--amber); }
5664
+ .ds-247420 .status-dot-disc.status-dot-stale { background: color-mix(in oklab, var(--warn) 70%, var(--fg-3)); }
5580
5665
  @keyframes status-disc-pulse {
5581
5666
  0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent); }
5582
5667
  50% { box-shadow: 0 0 0 4px color-mix(in oklab, var(--accent) 0%, transparent); }
5583
5668
  }
5584
5669
  @media (prefers-reduced-motion: reduce) {
5585
- .ds-247420 .status-dot-disc.status-dot-live { animation: none; }
5670
+ /* Keep the live disc shape-differentiated without motion: a static concentric ring. */
5671
+ .ds-247420 .status-dot-disc.status-dot-live { animation: none; box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 35%, transparent); }
5586
5672
  }
5587
5673
 
5588
5674
  /* ----------------------------------------------------------------------------
@@ -5638,14 +5724,16 @@
5638
5724
  /* Rail tones MUST match .row.rail-* in app-shell.css so the same semantic state
5639
5725
  reads as one colour across the conversation list and content rows. */
5640
5726
  .ds-247420 .ds-session-row.rail-green::before { background: var(--accent); }
5641
- .ds-247420 .ds-session-row.rail-purple::before { background: var(--purple-2, #7F18A4); }
5727
+ .ds-247420 .ds-session-row.rail-purple::before { background: var(--purple-2); }
5642
5728
  .ds-247420 .ds-session-row.rail-flame::before { background: var(--flame); }
5643
5729
  .ds-247420 .ds-session-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
5644
5730
  .ds-247420 .ds-session-title { font-size: var(--fs-sm); color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5645
5731
  .ds-247420 .ds-session-sub { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5646
5732
  .ds-247420 .ds-session-meta { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
5647
5733
  .ds-247420 .ds-session-agent { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
5648
- .ds-247420 .ds-session-unread { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); display: inline-block; }
5734
+ /* New-activity cue is a hollow accent RING so it stays shape-distinct from the
5735
+ running live disc (a solid pulsing accent dot) for colour-blind / reduced-motion users. */
5736
+ .ds-247420 .ds-session-unread { width: 8px; height: 8px; border-radius: 50%; background: transparent; box-shadow: inset 0 0 0 2px var(--accent); display: inline-block; }
5649
5737
  .ds-247420 .ds-session-state { padding: var(--space-5) var(--space-3); text-align: center; color: var(--fg-3); font-size: var(--fs-sm); }
5650
5738
  .ds-247420 .ds-session-state-error { color: var(--flame); }
5651
5739
 
@@ -5675,13 +5763,15 @@
5675
5763
  .ds-247420 .ds-dash-card.is-error { border-color: var(--flame); }
5676
5764
  .ds-247420 .ds-dash-card-head { display: flex; align-items: center; gap: var(--space-2); }
5677
5765
  .ds-247420 .ds-dash-status { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; }
5678
- .ds-247420 .ds-dash-status.is-running { color: var(--green); }
5766
+ /* running tone unified on --accent (the later is-running rule + the live disc all
5767
+ use --accent); the dead var(--green) duplicate that lived here was removed. */
5679
5768
  .ds-247420 .ds-dash-status.is-error { color: var(--flame); }
5680
5769
  .ds-247420 .ds-dash-agent { font-size: var(--fs-body); font-weight: 600; color: var(--fg); }
5681
5770
  .ds-247420 .ds-dash-model { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); margin-left: auto; }
5682
5771
  .ds-247420 .ds-dash-meta { display: flex; flex-direction: column; gap: 2px; }
5683
5772
  .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; }
5684
5773
  .ds-247420 .ds-dash-stat { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2); }
5774
+ .ds-247420 .ds-dash-stat-cost { color: var(--fg); font-weight: 600; }
5685
5775
  .ds-247420 .ds-dash-activity { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5686
5776
  .ds-247420 .ds-dash-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
5687
5777
  .ds-247420 .ds-dash-state { padding: var(--space-6) var(--space-4); text-align: center; color: var(--fg-3); font-size: var(--fs-body); }
@@ -5728,6 +5818,13 @@
5728
5818
  /* --- B1: streaming pre shell — monospaced bubble while a fenced block streams,
5729
5819
  so it does not reflow prose->block on settle. --- */
5730
5820
  .ds-247420 .chat-stream-pre pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: var(--ff-mono); font-size: var(--fs-sm); }
5821
+ /* Persistent minimal chrome so a fenced block does not pop a border + lang tab +
5822
+ copy button only on settle - the streaming slab already reads as a code block. */
5823
+ .ds-247420 .chat-stream-pre { position: relative; }
5824
+ .ds-247420 .chat-stream-pre pre {
5825
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
5826
+ padding: var(--space-3); background: color-mix(in oklab, var(--fg) 4%, transparent);
5827
+ }
5731
5828
 
5732
5829
  /* --- A5: composer context line (agent / model / cwd at point of typing). --- */
5733
5830
  .ds-247420 .chat-composer-context {
@@ -5740,11 +5837,25 @@
5740
5837
  .ds-247420 button.chat-composer-context:hover { color: var(--fg-2); }
5741
5838
  .ds-247420 button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5742
5839
 
5840
+ /* Composer send/cancel button row: a non-wrapping cluster pinned to the
5841
+ bottom-right of the flex-end composer (was unstyled, so the send button
5842
+ could wrap below the textarea instead of anchoring like claude.ai/code). */
5843
+ .ds-247420 .chat-composer-toolbar { display: flex; align-items: center; gap: var(--space-1); flex: 0 0 auto; margin-left: auto; align-self: flex-end; }
5844
+ /* Unify the toolbar cluster on one 32px / --r-1 square metric (the round 40px
5845
+ ghost buttons + 36px square send read as two button systems; the kit moved
5846
+ .btn* off --r-pill). chat.css loads after app-shell.css so this wins by order. */
5847
+ .ds-247420 .chat-composer-toolbar .composer-btn,
5848
+ .ds-247420 .chat-composer-toolbar .send { width: 32px; height: 32px; border-radius: var(--r-1); }
5849
+ @media (pointer: coarse) {
5850
+ .ds-247420 .chat-composer-toolbar .composer-btn,
5851
+ .ds-247420 .chat-composer-toolbar .send { width: 44px; height: 44px; }
5852
+ }
5853
+
5743
5854
  /* --- B2: follow-up chips below the last settled assistant turn. --- */
5744
5855
  .ds-247420 .agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
5745
5856
 
5746
5857
  /* --- C1: stale/idle dashboard status (static, NOT pulsing). --- */
5747
- .ds-247420 .ds-dash-status.is-stale { color: var(--amber, #d9a93a); }
5858
+ .ds-247420 .ds-dash-status.is-stale { color: var(--amber); }
5748
5859
  .ds-247420 .ds-dash-status.is-running { color: var(--accent); }
5749
5860
 
5750
5861
  /* --- C2: dashboard sort/filter toolbar + stream-state line. --- */
@@ -5762,7 +5873,7 @@
5762
5873
  }
5763
5874
  .ds-247420 .ds-dash-stream { font-size: var(--fs-tiny); color: var(--fg-3); }
5764
5875
  .ds-247420 .ds-dash-stream.is-lost { color: var(--flame); }
5765
- .ds-247420 .ds-dash-stream.is-connecting { color: var(--amber, #d9a93a); }
5876
+ .ds-247420 .ds-dash-stream.is-connecting { color: var(--amber); }
5766
5877
  .ds-247420 .ds-dash-header .spread { flex: 1; }
5767
5878
  .ds-247420 .ds-dash-errors-toggle {
5768
5879
  padding: 4px 10px; min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
@@ -5788,7 +5899,7 @@
5788
5899
  /* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
5789
5900
  agent is flagged in a dense grid, not merely faded near-invisibly. The word
5790
5901
  'idle' co-carries state, so this stays colour-blind safe. */
5791
- .ds-247420 .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber, #d9a93a); }
5902
+ .ds-247420 .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber); }
5792
5903
 
5793
5904
  /* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
5794
5905
 
@@ -5945,7 +6056,7 @@
5945
6056
  }
5946
6057
 
5947
6058
  /* Stopping state: in-flight cancel reads distinctly from running/error. */
5948
- .ds-247420 .ds-dash-status.is-stopping { color: var(--amber, #d9a93a); }
6059
+ .ds-247420 .ds-dash-status.is-stopping { color: var(--amber); }
5949
6060
 
5950
6061
  /* External (observed, not owned) session card: no stop control exists. */
5951
6062
  .ds-247420 .ds-dash-external {
@@ -5977,8 +6088,29 @@
5977
6088
  .ds-247420 .chat-msg-flat.you .chat-role { color: var(--accent); }
5978
6089
  .ds-247420 .chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
5979
6090
  .ds-247420 .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
5980
- .ds-247420 .chat-msg-flat:hover { background: color-mix(in oklab, var(--fg) 3%, transparent); }
5981
- .ds-247420 .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 2%, transparent); }
6091
+ /* Flat turns strip the bubble padding, so the role label sat 4px above the first
6092
+ paragraph and the .them tint hugged text flush. Restore reading rhythm + give
6093
+ the tinted assistant row inner breathing room so it reads as a card. */
6094
+ .ds-247420 .chat-msg-flat .chat-role { margin-bottom: var(--space-2); }
6095
+ .ds-247420 .chat-msg-flat .chat-md { line-height: 1.65; }
6096
+ .ds-247420 .chat-msg-flat .chat-md p { margin: 8px 0; }
6097
+ .ds-247420 .chat-msg-flat.them { padding-block: calc(var(--space-3) * var(--density, 1) + 2px); }
6098
+ /* Inline backtick code (renderInline tags <code class=chat-tick>) - was a dead
6099
+ class relying on the generic .chat-bubble code rule, so notices / non-bubble
6100
+ surfaces got unstyled monospace. Self-style it regardless of container. */
6101
+ .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); }
6102
+ /* Structured tool/code output earns more width than running prose (claude.ai/code
6103
+ lets diffs/tables break out wider than the reading measure). A flat turn that
6104
+ contains a tool card or code block widens itself AND its stack past --measure;
6105
+ prose-only turns stay clamped. */
6106
+ .ds-247420 .chat-msg-flat:has(.chat-tool),
6107
+ .ds-247420 .chat-msg-flat:has(.chat-bubble.chat-code) { max-width: calc(var(--measure) + 14ch); }
6108
+ .ds-247420 .chat-msg-flat:has(.chat-tool) .chat-stack,
6109
+ .ds-247420 .chat-msg-flat:has(.chat-bubble.chat-code) .chat-stack { max-width: calc(var(--measure) + 14ch); }
6110
+ /* Hover tint exceeds each role's REST tint so the row gives feedback (and the
6111
+ ladder stays monotonic): assistant 5% > its 3% rest; user 4% > transparent. */
6112
+ .ds-247420 .chat-msg-flat.them:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
6113
+ .ds-247420 .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 4%, transparent); }
5982
6114
  .ds-247420 .chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
5983
6115
  .ds-247420 .chat-msg-flat .chat-avatar { display: none; }
5984
6116
 
@@ -6012,6 +6144,9 @@
6012
6144
  }
6013
6145
  .ds-247420 .chat-msg .chat-tool.tool-running .chat-tool-status { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
6014
6146
  .ds-247420 .chat-msg .chat-tool.tool-error .chat-tool-status { color: var(--flame); background: color-mix(in oklab, var(--flame) 12%, transparent); }
6147
+ /* Completed tool: a positive (success) tone so done reads distinctly from the
6148
+ neutral pill and from the accent-toned running pill (--success = green-2). */
6149
+ .ds-247420 .chat-msg .chat-tool.tool-done .chat-tool-status { color: var(--success); background: color-mix(in oklab, var(--success) 12%, transparent); }
6015
6150
  .ds-247420 .chat-tool-body { border-top: var(--bw-hair) solid var(--rule); padding: var(--space-2) var(--space-3); display: flex; flex-direction: column; gap: var(--space-2); }
6016
6151
  .ds-247420 .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
6017
6152
  .ds-247420 .chat-tool-section-label { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); }
@@ -6046,6 +6181,10 @@
6046
6181
  }
6047
6182
  @keyframes ds-arm-pulse { 0% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--warn) 55%, transparent); } 100% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--warn) 0%, transparent); } }
6048
6183
  .ds-247420 .ds-dash-card.is-new { box-shadow: inset 2px 0 0 var(--accent), 0 0 0 1px color-mix(in oklab, var(--accent) 40%, transparent); }
6184
+ /* Error card carries the strongest left-bar tone (flame > stale amber > active
6185
+ accent), placed last so its inset bar wins source order over is-active/is-stale.
6186
+ The full-perimeter border-color (line ~396) stays for extra severity emphasis. */
6187
+ .ds-247420 .ds-dash-card.is-error { box-shadow: inset 2px 0 0 var(--flame); }
6049
6188
  @media (prefers-reduced-motion: no-preference) {
6050
6189
  .ds-247420 .ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
6051
6190
  }
@@ -6055,9 +6194,9 @@
6055
6194
  .ds-247420 .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
6056
6195
  .ds-247420 .ds-dash-group-label { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); padding: 0 var(--space-1); }
6057
6196
  .ds-247420 .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
6058
- .ds-247420 .ds-dash-breakdown .seg.is-running { color: var(--green); font-weight: 600; }
6197
+ .ds-247420 .ds-dash-breakdown .seg.is-running { color: var(--accent); font-weight: 600; }
6059
6198
  .ds-247420 .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
6060
- .ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--amber, #d9a93a); }
6199
+ .ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--amber); font-weight: 600; }
6061
6200
  .ds-247420 .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
6062
6201
  .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); }
6063
6202
  .ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
@@ -6078,7 +6217,7 @@
6078
6217
  .ds-247420 .ds-preview-code code { color: var(--fg); }
6079
6218
  .ds-247420 .ds-preview-code .token.comment, .ds-247420 .ds-preview-code .token.prolog, .ds-247420 .ds-preview-code .token.doctype, .ds-247420 .ds-preview-code .token.cdata { color: var(--fg-3); }
6080
6219
  .ds-247420 .ds-preview-code .token.punctuation { color: var(--fg-2); }
6081
- .ds-247420 .ds-preview-code .token.property, .ds-247420 .ds-preview-code .token.tag, .ds-247420 .ds-preview-code .token.boolean, .ds-247420 .ds-preview-code .token.number, .ds-247420 .ds-preview-code .token.constant, .ds-247420 .ds-preview-code .token.symbol { color: var(--purple-2, #7F18A4); }
6220
+ .ds-247420 .ds-preview-code .token.property, .ds-247420 .ds-preview-code .token.tag, .ds-247420 .ds-preview-code .token.boolean, .ds-247420 .ds-preview-code .token.number, .ds-247420 .ds-preview-code .token.constant, .ds-247420 .ds-preview-code .token.symbol { color: var(--purple-2); }
6082
6221
  .ds-247420 .ds-preview-code .token.selector, .ds-247420 .ds-preview-code .token.attr-name, .ds-247420 .ds-preview-code .token.string, .ds-247420 .ds-preview-code .token.char, .ds-247420 .ds-preview-code .token.builtin { color: var(--code-string, var(--green)); }
6083
6222
  .ds-247420 .ds-preview-code .token.atrule, .ds-247420 .ds-preview-code .token.attr-value, .ds-247420 .ds-preview-code .token.keyword { color: var(--code-keyword, var(--sky)); }
6084
6223
  .ds-247420 .ds-preview-code .token.function, .ds-247420 .ds-preview-code .token.class-name { color: var(--code-fn, var(--flame)); }
@@ -6379,7 +6518,7 @@
6379
6518
  font: var(--fs-tiny, 12px)/1.3 var(--ff-mono, monospace);
6380
6519
  min-width: 0;
6381
6520
  }
6382
- .ds-247420 .ds-input-bare:focus { outline: none; border-color: var(--accent); }
6521
+ .ds-247420 .ds-input-bare:focus-visible { outline: none; border-color: var(--accent); box-shadow: var(--focus-ring-inset); }
6383
6522
  /* A property field whose control spans the full panel width (label above,
6384
6523
  control below) — used for wide segmented controls that would clip in the
6385
6524
  narrow value column. */
@@ -7444,6 +7583,256 @@
7444
7583
  align-content: start;
7445
7584
  }
7446
7585
 
7586
+ /* app-surfaces.css */
7587
+ /* app-surfaces.css — agentgui application-surface styling.
7588
+ *
7589
+ * Owns every design decision for the agentgui consumer app's own surfaces
7590
+ * (the bits the app composes around the flagship kit components): the project
7591
+ * filter pills, the working-directory bar, the resume banner, the backend
7592
+ * health chips, the settings two-column grid, the history empty state, the
7593
+ * boot splash, the chat control cluster, and the cross-cutting base (scrollbar
7594
+ * theming, focus rings, print). These previously lived as a hand-rolled inline
7595
+ * \3c style> block in agentgui's index.html; the kit now owns them so NO design
7596
+ * content lives in the consumer app.
7597
+ *
7598
+ * Every selector is written pre-scoped under `.ds-247420` (the consumer mounts
7599
+ * on <html class="ds-247420">), so the build's selector-prefixer leaves them
7600
+ * untouched rather than mis-compounding the `[attr]` / `*` / bare-element
7601
+ * selectors. All colour/space/radius/font values read from kit tokens
7602
+ * (colors_and_type.css) — there are no app-local colour fallbacks. */
7603
+
7604
+ /* Visually-hidden but screen-reader-available (aria-live announcer, labels). */
7605
+ .ds-247420 .sr-only {
7606
+ position: absolute !important; width: 1px; height: 1px;
7607
+ padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0);
7608
+ white-space: nowrap; border: 0;
7609
+ }
7610
+
7611
+ /* Base: full-height app root reading kit tokens. */
7612
+ .ds-247420, .ds-247420 body { margin: 0; height: 100%; }
7613
+ .ds-247420 body {
7614
+ background: var(--bg);
7615
+ color: var(--fg);
7616
+ font-family: var(--ff-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);
7617
+ }
7618
+ .ds-247420 #app { height: 100vh; height: 100dvh; }
7619
+ .ds-247420 #app > * { height: 100%; }
7620
+
7621
+ /* Themed thin scrollbars — the native chrome scrollbar is chunky/light and
7622
+ clashes with the dark theme on the history sidebar and settings column. */
7623
+ .ds-247420 * {
7624
+ scrollbar-width: thin;
7625
+ scrollbar-color: color-mix(in srgb, var(--fg) 22%, transparent) transparent;
7626
+ }
7627
+ .ds-247420 *::-webkit-scrollbar { width: 9px; height: 9px; }
7628
+ .ds-247420 *::-webkit-scrollbar-track { background: transparent; }
7629
+ .ds-247420 *::-webkit-scrollbar-thumb {
7630
+ background: color-mix(in srgb, var(--fg) 20%, transparent);
7631
+ border-radius: 999px;
7632
+ border: 2px solid transparent;
7633
+ background-clip: padding-box;
7634
+ }
7635
+ .ds-247420 *::-webkit-scrollbar-thumb:hover {
7636
+ background: color-mix(in srgb, var(--fg) 34%, transparent);
7637
+ background-clip: padding-box;
7638
+ }
7639
+
7640
+ /* We move focus to the page heading on tab change for AT users; suppress the
7641
+ resulting outline box on those programmatically-focused elements. */
7642
+ .ds-247420 [data-prog-focus]:focus,
7643
+ .ds-247420 [data-prog-focus]:focus-visible { outline: none !important; box-shadow: none !important; }
7644
+
7645
+ /* The connection-dot disc + pulse are the kit's canonical .status-dot-disc;
7646
+ only the inline-flex wrapper layout stays here. */
7647
+ .ds-247420 .status-dot { display: inline-flex; align-items: center; gap: .4em; white-space: nowrap; }
7648
+
7649
+ /* Resume banner. */
7650
+ .ds-247420 .resume-banner {
7651
+ padding: .6em .8em;
7652
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
7653
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
7654
+ border-radius: var(--r-1, 8px);
7655
+ display: flex; justify-content: space-between; align-items: center; gap: .75em;
7656
+ margin-bottom: .75em;
7657
+ }
7658
+
7659
+ /* History action buttons. */
7660
+ .ds-247420 .history-actions { display: flex; gap: .5em; padding: 0 0 .75em 0; flex-wrap: wrap; }
7661
+
7662
+ /* Empty / loading state. */
7663
+ .ds-247420 .empty-state { display: flex; gap: 8px; align-items: center; padding: .5em 0; white-space: normal; }
7664
+ .ds-247420 p.empty-state { text-align: left; padding: .6em 0; color: var(--fg-3); }
7665
+
7666
+ /* Project filter pills. */
7667
+ .ds-247420 .pill-row { display: flex; flex-wrap: wrap; gap: .35em; padding: .35em 0; }
7668
+ .ds-247420 .pill {
7669
+ cursor: pointer; padding: .25em .7em; border-radius: 999px;
7670
+ border: 1px solid transparent; background: transparent;
7671
+ font: inherit; color: inherit; line-height: 1.4;
7672
+ transition: background-color .15s ease, border-color .15s ease;
7673
+ min-height: 28px;
7674
+ }
7675
+ .ds-247420 .pill:hover { background: color-mix(in srgb, var(--accent) 10%, transparent); }
7676
+ .ds-247420 .pill.pill-active {
7677
+ background: color-mix(in srgb, var(--accent) 18%, transparent);
7678
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
7679
+ }
7680
+ .ds-247420 .pill:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
7681
+
7682
+ /* Subagent toggle (the control itself is the kit Checkbox). */
7683
+ .ds-247420 .subagent-toggle { padding: .4em 0; min-height: 32px; }
7684
+
7685
+ .ds-247420 .field-error { color: var(--warn); }
7686
+
7687
+ /* Boot splash: static text painted with the HTML, replaced by the first mount. */
7688
+ .ds-247420 .boot-splash { height: 100%; min-height: 60vh; display: flex; align-items: center; justify-content: center; color: var(--fg-3); font-size: .9rem; }
7689
+
7690
+ /* Chat control cluster in the crumb bar: model picker, +new, status. */
7691
+ .ds-247420 .chat-controls { display: flex; align-items: center; gap: .6em; flex-wrap: wrap; }
7692
+ .ds-247420 .chat-controls > * { flex: 0 0 auto; }
7693
+ .ds-247420 .chat-controls select,
7694
+ .ds-247420 .chat-controls .select,
7695
+ .ds-247420 .chat-controls [role="combobox"] { min-width: 130px; max-width: 220px; }
7696
+ .ds-247420 .chat-controls .status-dot { white-space: nowrap; }
7697
+
7698
+ /* Main content region layout: every tab is a min-height:0 scroll host; the
7699
+ chat tab additionally flexes as a column so the thread fills the viewport. */
7700
+ .ds-247420 .agentgui-main { min-height: 0; }
7701
+ .ds-247420 .agentgui-main-chat { display: flex; flex-direction: column; flex: 1; }
7702
+ .ds-247420 .agentgui-main .ds-section { margin: 0 0 var(--space-4, 16px); }
7703
+
7704
+ /* Readable backend health summary (replaces raw JSON dump). */
7705
+ .ds-247420 .health-summary { display: flex; flex-wrap: wrap; gap: .4em; margin: .6em 0; }
7706
+ .ds-247420 .health-chip {
7707
+ font-family: var(--ff-mono, ui-monospace, monospace);
7708
+ font-size: .8rem; padding: .15em .55em; border-radius: 6px;
7709
+ background: color-mix(in srgb, var(--fg) 8%, transparent);
7710
+ color: var(--fg-2);
7711
+ border: 1px solid color-mix(in srgb, var(--fg) 12%, transparent);
7712
+ }
7713
+ .ds-247420 .health-summary.health-ok .health-chip:first-child {
7714
+ color: var(--accent);
7715
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
7716
+ }
7717
+
7718
+ /* Compact working-directory bar. */
7719
+ .ds-247420 .cwd-bar {
7720
+ display: flex; align-items: center; gap: .5em; flex-wrap: wrap;
7721
+ padding: .15em 0 .5em; font-size: .85rem;
7722
+ }
7723
+ .ds-247420 .cwd-bar-text {
7724
+ font-family: var(--ff-mono, ui-monospace, monospace);
7725
+ color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 60vw;
7726
+ }
7727
+ .ds-247420 .cwd-bar-btn {
7728
+ cursor: pointer; font: inherit; line-height: 1.3;
7729
+ padding: .15em .55em; border-radius: 6px;
7730
+ background: color-mix(in srgb, var(--fg) 8%, transparent);
7731
+ border: 1px solid color-mix(in srgb, var(--fg) 14%, transparent);
7732
+ color: var(--fg-2);
7733
+ }
7734
+ .ds-247420 .cwd-bar-btn:hover { background: color-mix(in srgb, var(--fg) 14%, transparent); }
7735
+ .ds-247420 .cwd-bar-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
7736
+
7737
+ /* History no-session empty state: fill the void with a centered prompt. */
7738
+ .ds-247420 .history-empty {
7739
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
7740
+ gap: .4em; text-align: center; min-height: 50vh; color: var(--fg-3);
7741
+ }
7742
+ .ds-247420 .history-empty-title { margin: 0; font-size: 1.05rem; color: var(--fg-2); }
7743
+ .ds-247420 .history-empty-sub { margin: 0; max-width: 42ch; }
7744
+
7745
+ /* Settings: two-column on wide screens (backend + agents). */
7746
+ .ds-247420 .settings-grid {
7747
+ display: grid; gap: var(--space-4, 16px);
7748
+ grid-template-columns: minmax(0, 1fr);
7749
+ align-items: start;
7750
+ }
7751
+ .ds-247420 .agentgui-main-settings .settings-grid { margin-top: 0; }
7752
+
7753
+ /* The kit Chat head computes its own zero-padded count and ignores our sub
7754
+ prop; hide it (streaming state shows via the title + busy banner). */
7755
+ .ds-247420 .chat-head .sub { display: none; }
7756
+
7757
+ /* Event-list row hover + search-result flash. */
7758
+ .ds-247420 .ds-event-list .row[role="button"]:hover { background: color-mix(in srgb, var(--fg) 5%, transparent); }
7759
+ .ds-247420 .ds-event-list .row.event-flash { animation: agentgui-event-flash 2s ease-out; }
7760
+
7761
+ /* Chat composer: hide the idle scrollbar on the (empty/short) textarea. */
7762
+ .ds-247420 .chat-composer textarea { overflow-y: auto; scrollbar-width: thin; }
7763
+ .ds-247420 .chat-composer textarea:not(:focus) { overflow-y: hidden; }
7764
+
7765
+ /* Generic interactive focus ring for app-emitted controls. */
7766
+ .ds-247420 button:focus-visible,
7767
+ .ds-247420 [tabindex]:focus-visible,
7768
+ .ds-247420 a:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
7769
+
7770
+ /* Settings-panel field spacing utilities (replace app.js inline style= margins). */
7771
+ .ds-247420 .agentgui-field-mb { margin: 0 0 .5em; }
7772
+ .ds-247420 .agentgui-field-my { margin: .5em 0; }
7773
+
7774
+ @keyframes agentgui-event-flash {
7775
+ 0% { background: color-mix(in srgb, var(--accent) 40%, transparent); }
7776
+ 100% { background: transparent; }
7777
+ }
7778
+
7779
+ @media (min-width: 900px) {
7780
+ .ds-247420 .settings-grid { grid-template-columns: minmax(0, 420px) minmax(0, 1fr); }
7781
+ }
7782
+
7783
+ /* Tablet: keep the chat control cluster from wrapping the status dot alone. */
7784
+ @media (max-width: 900px) {
7785
+ .ds-247420 .chat-controls select,
7786
+ .ds-247420 .chat-controls .select,
7787
+ .ds-247420 .chat-controls [role="combobox"] { min-width: 110px; max-width: 170px; }
7788
+ }
7789
+
7790
+ /* Touch targets on small screens. */
7791
+ @media (max-width: 640px) {
7792
+ .ds-247420 .pill { min-height: 36px; padding: .4em .8em; }
7793
+ .ds-247420 .history-actions { gap: .75em; }
7794
+ .ds-247420 .history-actions .btn, .ds-247420 .history-actions button { min-height: 44px; }
7795
+ .ds-247420 .cwd-bar-text { max-width: 42vw; }
7796
+ .ds-247420 .cwd-bar { gap: .3em; }
7797
+ }
7798
+
7799
+ @media (prefers-reduced-motion: reduce) {
7800
+ .ds-247420 .ds-event-list .row.event-flash { animation: none; outline: 2px solid var(--accent); }
7801
+ }
7802
+
7803
+ @media print {
7804
+ .ds-247420 #app { min-height: auto; display: block; height: auto; }
7805
+ .ds-247420 .skip-link, .ds-247420 .status-dot, .ds-247420 .history-actions, .ds-247420 .chat-composer { display: none !important; }
7806
+ .ds-247420 .app, .ds-247420 .app-main, .ds-247420 .panel, .ds-247420 .chat, .ds-247420 .chat-thread {
7807
+ background: #fff !important; color: #000 !important; box-shadow: none !important;
7808
+ }
7809
+ }
7810
+
7811
+ /* marketing.css */
7812
+ /* marketing.css — landing / docs site surface family (the agentgui flatspace
7813
+ * site renderer composes these instead of carrying inline style= props). Every
7814
+ * selector is written pre-scoped under `.ds-247420` so the build's selector-
7815
+ * prefixer leaves it untouched (consumers mount on <html class="ds-247420">).
7816
+ * All values read kit tokens — no hardcoded hex, no inline design in the app. */
7817
+
7818
+ .ds-247420 .site-panel { margin: var(--space-2); }
7819
+
7820
+ /* Hero block */
7821
+ .ds-247420 .site-hero { padding: 24px 22px; }
7822
+ .ds-247420 .site-hero-h { margin: 0 0 var(--space-2); }
7823
+ .ds-247420 .site-hero-body { margin: var(--space-2) 0 var(--space-3); color: var(--fg-2); max-width: 64ch; }
7824
+ .ds-247420 .site-chip-row { display: flex; gap: 6px; flex-wrap: wrap; margin: 0 0 var(--space-3); }
7825
+ .ds-247420 .site-cta-row { display: flex; gap: var(--space-2); flex-wrap: wrap; }
7826
+
7827
+ /* Quickstart CLI block — these .cli/.prompt/.cmd nodes were previously unstyled. */
7828
+ .ds-247420 .site-cli { padding: 16px 22px; }
7829
+ .ds-247420 .site-cli .cli { display: flex; gap: var(--space-2); font-family: var(--ff-mono); font-size: var(--fs-sm); padding: 2px 0; }
7830
+ .ds-247420 .site-cli .prompt { color: var(--fg-3); user-select: none; flex: 0 0 auto; }
7831
+ .ds-247420 .site-cli .cmd { color: var(--fg); white-space: pre-wrap; word-break: break-word; }
7832
+
7833
+ /* Embedded legacy doc (iframe wrapper) */
7834
+ .ds-247420 .site-embed { width: 100%; height: calc(100vh - 180px); min-height: 520px; border: 0; border-radius: var(--r-1); background: var(--bg-2); display: block; }
7835
+
7447
7836
  /* spoint/loading-screen.css */
7448
7837
  /* Loading-screen kit styles. Scoped under .ds-247420 at build time.
7449
7838
  All colors reference design tokens (no raw literals) per the token-lint gate. */