anentrypoint-design 0.0.211 → 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/app-shell.css CHANGED
@@ -1131,12 +1131,14 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1131
1131
  .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
1132
1132
  /* The quick filter is a compact control, not a full-width form row - a giant
1133
1133
  input above the grid reads as a search page and costs fold height. */
1134
- .ds-file-filter { padding: 0 0 var(--space-1); display: flex; justify-content: flex-end; }
1134
+ /* The filter is now an inline item in the single .ds-file-controls toolbar row
1135
+ (the standalone right-aligned .ds-file-filter strip was removed). */
1135
1136
  .ds-file-filter-input {
1136
1137
  width: min(280px, 100%); padding: 6px 12px; font-size: var(--fs-sm);
1137
1138
  background: var(--bg); color: var(--fg);
1138
1139
  border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
1139
1140
  }
1141
+ .ds-file-controls .ds-file-filter-input { flex: 0 1 220px; }
1140
1142
  .ds-file-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
1141
1143
  .ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
1142
1144
  .ds-file-sort-btn {
@@ -1266,7 +1268,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1266
1268
  role=checkbox/aria-checked name+state. */
1267
1269
  .ds-check-box {
1268
1270
  width: 15px; height: 15px; box-sizing: border-box; flex: 0 0 auto; position: relative;
1269
- border: 1.5px solid var(--rule); border-radius: 4px;
1271
+ border: 1.5px solid var(--fg-3); border-radius: 4px;
1270
1272
  transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
1271
1273
  }
1272
1274
  .is-marked > .ds-check-box,
@@ -1278,14 +1280,14 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1278
1280
  }
1279
1281
  [aria-checked="mixed"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
1280
1282
  [aria-checked="mixed"] > .ds-check-box::after {
1281
- content: ""; position: absolute; left: 2px; right: 2px; top: 50%; height: 1.5px; margin-top: -0.75px; background: var(--bg);
1283
+ content: ""; position: absolute; left: 3px; right: 3px; top: 6px; height: 2px; background: var(--bg); border-radius: 1px;
1282
1284
  }
1283
1285
 
1284
1286
  .ds-file-check {
1285
1287
  display: inline-flex; align-items: center; justify-content: center;
1286
1288
  min-width: 28px; height: 28px; padding: 0 4px;
1287
1289
  background: transparent; border: 0; border-radius: var(--r-1);
1288
- font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3);
1290
+ color: var(--fg-3);
1289
1291
  cursor: pointer;
1290
1292
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1291
1293
  }
@@ -1376,6 +1378,16 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1376
1378
  }
1377
1379
  .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
1378
1380
  .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
1381
+ /* Per-type icon tints on thumb tiles so the grid keeps the colour-coding the
1382
+ list rows already carry (mirrors .ds-file-row[data-file-type] .ds-file-icon). */
1383
+ .ds-file-cell[data-file-type="dir"] .ds-file-icon { color: var(--accent); }
1384
+ .ds-file-cell[data-file-type="image"] .ds-file-icon { color: var(--mascot); }
1385
+ .ds-file-cell[data-file-type="video"] .ds-file-icon { color: var(--purple-2); }
1386
+ .ds-file-cell[data-file-type="audio"] .ds-file-icon { color: var(--sky); }
1387
+ .ds-file-cell[data-file-type="code"] .ds-file-icon { color: var(--green-2); }
1388
+ .ds-file-cell[data-file-type="archive"] .ds-file-icon { color: var(--flame); }
1389
+ .ds-file-cell[data-file-type="document"] .ds-file-icon { color: var(--amber); }
1390
+ .ds-file-cell[data-file-type="symlink"] .ds-file-icon { color: var(--purple); }
1379
1391
  .ds-file-cell-name {
1380
1392
  font-size: var(--fs-tiny); text-align: left;
1381
1393
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
@@ -1386,13 +1398,6 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1386
1398
  background: color-mix(in oklab, var(--bg) 78%, transparent);
1387
1399
  }
1388
1400
 
1389
- /* Card mode — opt-in via data-columns; switches the list to a grid. */
1390
- .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
1391
- .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
1392
- .ds-file-grid[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
1393
- .ds-file-grid[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
1394
- .ds-file-grid[data-columns="4"] { grid-template-columns: repeat(4, 1fr); }
1395
-
1396
1401
  /* ============================================================
1397
1402
  File browser surface — stage, toolbar, breadcrumb, dropzone,
1398
1403
  upload progress, empty state, modals, preview. Authored for
@@ -1716,21 +1721,12 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1716
1721
  }
1717
1722
  .ds-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
1718
1723
 
1719
- /* Loading skeleton placeholder rows while a directory loads. */
1720
- .ds-file-grid-loading { display: flex; flex-direction: column; gap: 4px; }
1721
- .ds-file-skeleton {
1722
- height: 48px; border-radius: var(--r-2);
1723
- background: linear-gradient(90deg,
1724
- var(--bg) 0%, var(--bg-2) 50%, var(--bg) 100%);
1725
- background-size: 200% 100%;
1726
- }
1727
- @media (prefers-reduced-motion: no-preference) {
1728
- .ds-file-skeleton { animation: ds-skeleton-shimmer 1.2s var(--ease) infinite; }
1729
- }
1730
- @keyframes ds-skeleton-shimmer {
1731
- 0% { background-position: 200% 0; }
1732
- 100% { background-position: -200% 0; }
1733
- }
1724
+ /* Loading skeleton: FileSkeleton renders `.ds-file-grid.ds-file-skeleton` with
1725
+ `.ds-file-row.ds-file-row-skeleton` rows whose inner `.ds-skel` children shimmer
1726
+ (via .ds-skel::after). The container therefore inherits the .ds-file-grid layout
1727
+ and must NOT be a single 48px gradient bar (that collapsed every row and double-
1728
+ shimmered). The dead .ds-file-grid-loading rule + unused ds-skeleton-shimmer
1729
+ keyframe were removed; only the inner .ds-skel children animate. */
1734
1730
 
1735
1731
  /* Drag-to-move drop target highlight on a directory row. */
1736
1732
  .ds-file-row.ds-drop-target {
@@ -1939,6 +1935,13 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1939
1935
  padding: 10px 12px; border-radius: 6px; overflow-x: auto;
1940
1936
  font-family: var(--ff-mono); font-size: 0.9em; margin: 8px 0;
1941
1937
  }
1938
+ /* Markdown tables + horizontal rules: agents routinely emit them, but they were
1939
+ unstyled (bare unspaced cells, vanished rules). */
1940
+ .chat-bubble.chat-md table { border-collapse: collapse; width: auto; max-width: 100%; margin: 8px 0; font-size: .95em; display: block; overflow-x: auto; }
1941
+ .chat-bubble.chat-md th,
1942
+ .chat-bubble.chat-md td { border: var(--bw-hair) solid var(--rule); padding: 4px 10px; text-align: left; }
1943
+ .chat-bubble.chat-md th { background: color-mix(in oklab, var(--fg) 5%, transparent); font-weight: 600; }
1944
+ .chat-bubble.chat-md hr { border: 0; border-top: var(--bw-hair) solid var(--rule); margin: 12px 0; }
1942
1945
 
1943
1946
  .chat-msg .chat-bubble.chat-code,
1944
1947
  .chat-msg.you .chat-bubble.chat-code,
@@ -3085,6 +3088,15 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3085
3088
  .ws-resizer.ws-resizer-rail { grid-column: 1; }
3086
3089
  .ws-resizer.ws-resizer-sessions { grid-column: 2; }
3087
3090
  .ws-resizer.ws-resizer-pane { grid-column: 3; justify-self: end; }
3091
+ /* A resizer must vanish once its TRACK is removed by the staging media blocks,
3092
+ else dragging it writes a --ws-*-w var that no longer affects the now-fixed
3093
+ drawer (a dead handle). Mirror the 1480 / 1100 / 900 staging exactly. */
3094
+ @media (max-width: 1480px) { .ws-resizer.ws-resizer-pane { display: none; } }
3095
+ @media (max-width: 1100px) { .ws-resizer.ws-resizer-sessions { display: none; } }
3096
+ @media (max-width: 900px) { .ws-resizer { display: none; } }
3097
+ /* Coarse-pointer hit target for hybrid touch laptops above the drawer breakpoint
3098
+ (the 8px sliver is un-grabbable by touch). */
3099
+ @media (pointer: coarse) { .ws-resizer { width: 16px; margin-right: -8px; } }
3088
3100
  /* Ease the rail/pane collapse. Track COUNT stays stable on collapse (only a
3089
3101
  width var flips), so grid-template-columns is animatable; reduced-motion
3090
3102
  drops it to an instant swap. */
package/chat.css CHANGED
@@ -268,6 +268,23 @@
268
268
  @media (prefers-reduced-motion: reduce) {
269
269
  .agentchat-working .chat-thinking-dots span { animation: none; opacity: .7; }
270
270
  }
271
+ /* Standalone thinking part (ThinkingNode renders .chat-bubble.chat-thinking with
272
+ .chat-thinking-dots + .chat-thinking-text OUTSIDE the .agentchat-working tail).
273
+ Without these base rules the dots are invisible empty spans and the text has
274
+ no muted tone. Reuse the agentchat-dot-bounce keyframe. */
275
+ .chat-thinking { display: flex; align-items: center; gap: .5em; color: var(--fg-3); font-size: var(--fs-tiny); background: none; padding: .3em .2em; }
276
+ .chat-thinking-text { color: var(--fg-3); }
277
+ .chat-thinking-dots { display: inline-flex; gap: 3px; }
278
+ .chat-thinking-dots span {
279
+ width: 5px; height: 5px; border-radius: 50%;
280
+ background: var(--fg); opacity: .4;
281
+ animation: agentchat-dot-bounce 1.2s infinite ease-in-out;
282
+ }
283
+ .chat-thinking-dots span:nth-child(2) { animation-delay: .15s; }
284
+ .chat-thinking-dots span:nth-child(3) { animation-delay: .3s; }
285
+ @media (prefers-reduced-motion: reduce) {
286
+ .chat-thinking-dots span { animation: none; opacity: .7; }
287
+ }
271
288
 
272
289
  /* Responsive: the control cluster + cwd bar must stay usable on phones/tablets.
273
290
  The cwd path can't eat the row beside its label + buttons on a narrow screen. */
@@ -295,16 +312,20 @@
295
312
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
296
313
  background: var(--fg-3); flex: 0 0 auto;
297
314
  }
315
+ /* Each variant carries a non-colour channel (fill vs halo vs hollow ring) so the
316
+ states stay distinguishable for colour-blind users and when stale/connecting
317
+ would otherwise share a hue. Mirrors the rail-tone shape differentiation. */
298
318
  .status-dot-disc.status-dot-live { background: var(--accent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
299
- .status-dot-disc.status-dot-error { background: var(--flame); }
300
- .status-dot-disc.status-dot-connecting { background: var(--amber); }
301
- .status-dot-disc.status-dot-stale { background: var(--amber); }
319
+ .status-dot-disc.status-dot-error { background: var(--flame); box-shadow: 0 0 0 1.5px color-mix(in oklab, var(--flame) 38%, transparent); }
320
+ .status-dot-disc.status-dot-connecting { background: transparent; box-shadow: inset 0 0 0 2px var(--amber); }
321
+ .status-dot-disc.status-dot-stale { background: color-mix(in oklab, var(--warn) 70%, var(--fg-3)); }
302
322
  @keyframes status-disc-pulse {
303
323
  0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent); }
304
324
  50% { box-shadow: 0 0 0 4px color-mix(in oklab, var(--accent) 0%, transparent); }
305
325
  }
306
326
  @media (prefers-reduced-motion: reduce) {
307
- .status-dot-disc.status-dot-live { animation: none; }
327
+ /* Keep the live disc shape-differentiated without motion: a static concentric ring. */
328
+ .status-dot-disc.status-dot-live { animation: none; box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 35%, transparent); }
308
329
  }
309
330
 
310
331
  /* ----------------------------------------------------------------------------
@@ -367,7 +388,9 @@
367
388
  .ds-session-sub { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
368
389
  .ds-session-meta { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
369
390
  .ds-session-agent { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
370
- .ds-session-unread { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); display: inline-block; }
391
+ /* New-activity cue is a hollow accent RING so it stays shape-distinct from the
392
+ running live disc (a solid pulsing accent dot) for colour-blind / reduced-motion users. */
393
+ .ds-session-unread { width: 8px; height: 8px; border-radius: 50%; background: transparent; box-shadow: inset 0 0 0 2px var(--accent); display: inline-block; }
371
394
  .ds-session-state { padding: var(--space-5) var(--space-3); text-align: center; color: var(--fg-3); font-size: var(--fs-sm); }
372
395
  .ds-session-state-error { color: var(--flame); }
373
396
 
@@ -397,13 +420,15 @@
397
420
  .ds-dash-card.is-error { border-color: var(--flame); }
398
421
  .ds-dash-card-head { display: flex; align-items: center; gap: var(--space-2); }
399
422
  .ds-dash-status { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; }
400
- .ds-dash-status.is-running { color: var(--green); }
423
+ /* running tone unified on --accent (the later is-running rule + the live disc all
424
+ use --accent); the dead var(--green) duplicate that lived here was removed. */
401
425
  .ds-dash-status.is-error { color: var(--flame); }
402
426
  .ds-dash-agent { font-size: var(--fs-body); font-weight: 600; color: var(--fg); }
403
427
  .ds-dash-model { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); margin-left: auto; }
404
428
  .ds-dash-meta { display: flex; flex-direction: column; gap: 2px; }
405
429
  .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; }
406
430
  .ds-dash-stat { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2); }
431
+ .ds-dash-stat-cost { color: var(--fg); font-weight: 600; }
407
432
  .ds-dash-activity { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
408
433
  .ds-dash-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
409
434
  .ds-dash-state { padding: var(--space-6) var(--space-4); text-align: center; color: var(--fg-3); font-size: var(--fs-body); }
@@ -450,6 +475,13 @@
450
475
  /* --- B1: streaming pre shell — monospaced bubble while a fenced block streams,
451
476
  so it does not reflow prose->block on settle. --- */
452
477
  .chat-stream-pre pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: var(--ff-mono); font-size: var(--fs-sm); }
478
+ /* Persistent minimal chrome so a fenced block does not pop a border + lang tab +
479
+ copy button only on settle - the streaming slab already reads as a code block. */
480
+ .chat-stream-pre { position: relative; }
481
+ .chat-stream-pre pre {
482
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
483
+ padding: var(--space-3); background: color-mix(in oklab, var(--fg) 4%, transparent);
484
+ }
453
485
 
454
486
  /* --- A5: composer context line (agent / model / cwd at point of typing). --- */
455
487
  .chat-composer-context {
@@ -466,6 +498,15 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
466
498
  bottom-right of the flex-end composer (was unstyled, so the send button
467
499
  could wrap below the textarea instead of anchoring like claude.ai/code). */
468
500
  .chat-composer-toolbar { display: flex; align-items: center; gap: var(--space-1); flex: 0 0 auto; margin-left: auto; align-self: flex-end; }
501
+ /* Unify the toolbar cluster on one 32px / --r-1 square metric (the round 40px
502
+ ghost buttons + 36px square send read as two button systems; the kit moved
503
+ .btn* off --r-pill). chat.css loads after app-shell.css so this wins by order. */
504
+ .chat-composer-toolbar .composer-btn,
505
+ .chat-composer-toolbar .send { width: 32px; height: 32px; border-radius: var(--r-1); }
506
+ @media (pointer: coarse) {
507
+ .chat-composer-toolbar .composer-btn,
508
+ .chat-composer-toolbar .send { width: 44px; height: 44px; }
509
+ }
469
510
 
470
511
  /* --- B2: follow-up chips below the last settled assistant turn. --- */
471
512
  .agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
@@ -704,6 +745,25 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
704
745
  .chat-msg-flat.you .chat-role { color: var(--accent); }
705
746
  .chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
706
747
  .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
748
+ /* Flat turns strip the bubble padding, so the role label sat 4px above the first
749
+ paragraph and the .them tint hugged text flush. Restore reading rhythm + give
750
+ the tinted assistant row inner breathing room so it reads as a card. */
751
+ .chat-msg-flat .chat-role { margin-bottom: var(--space-2); }
752
+ .chat-msg-flat .chat-md { line-height: 1.65; }
753
+ .chat-msg-flat .chat-md p { margin: 8px 0; }
754
+ .chat-msg-flat.them { padding-block: calc(var(--space-3) * var(--density, 1) + 2px); }
755
+ /* Inline backtick code (renderInline tags <code class=chat-tick>) - was a dead
756
+ class relying on the generic .chat-bubble code rule, so notices / non-bubble
757
+ surfaces got unstyled monospace. Self-style it regardless of container. */
758
+ .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); }
759
+ /* Structured tool/code output earns more width than running prose (claude.ai/code
760
+ lets diffs/tables break out wider than the reading measure). A flat turn that
761
+ contains a tool card or code block widens itself AND its stack past --measure;
762
+ prose-only turns stay clamped. */
763
+ .chat-msg-flat:has(.chat-tool),
764
+ .chat-msg-flat:has(.chat-bubble.chat-code) { max-width: calc(var(--measure) + 14ch); }
765
+ .chat-msg-flat:has(.chat-tool) .chat-stack,
766
+ .chat-msg-flat:has(.chat-bubble.chat-code) .chat-stack { max-width: calc(var(--measure) + 14ch); }
707
767
  /* Hover tint exceeds each role's REST tint so the row gives feedback (and the
708
768
  ladder stays monotonic): assistant 5% > its 3% rest; user 4% > transparent. */
709
769
  .chat-msg-flat.them:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
@@ -791,9 +851,9 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
791
851
  .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
792
852
  .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); }
793
853
  .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
794
- .ds-dash-breakdown .seg.is-running { color: var(--green); font-weight: 600; }
854
+ .ds-dash-breakdown .seg.is-running { color: var(--accent); font-weight: 600; }
795
855
  .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
796
- .ds-dash-breakdown .seg.is-idle { color: var(--amber); }
856
+ .ds-dash-breakdown .seg.is-idle { color: var(--amber); font-weight: 600; }
797
857
  .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
798
858
  .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); }
799
859
  .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
package/community.css CHANGED
@@ -1166,7 +1166,11 @@
1166
1166
  .cm-vs-btn,
1167
1167
  .cm-user-btn,
1168
1168
  .cm-ch-spinner,
1169
- .cm-ch-voice-badge {
1169
+ .cm-ch-voice-badge,
1170
+ .vx-ptt,
1171
+ .vx-ptt-glow,
1172
+ .vx-vad-meter,
1173
+ .vx-vad-fill {
1170
1174
  transition: none !important;
1171
1175
  animation: none !important;
1172
1176
  }
package/dist/247420.css CHANGED
@@ -1580,12 +1580,14 @@
1580
1580
  .ds-247420 .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
1581
1581
  /* The quick filter is a compact control, not a full-width form row - a giant
1582
1582
  input above the grid reads as a search page and costs fold height. */
1583
- .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). */
1584
1585
  .ds-247420 .ds-file-filter-input {
1585
1586
  width: min(280px, 100%); padding: 6px 12px; font-size: var(--fs-sm);
1586
1587
  background: var(--bg); color: var(--fg);
1587
1588
  border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
1588
1589
  }
1590
+ .ds-247420 .ds-file-controls .ds-file-filter-input { flex: 0 1 220px; }
1589
1591
  .ds-247420 .ds-file-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
1590
1592
  .ds-247420 .ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
1591
1593
  .ds-247420 .ds-file-sort-btn {
@@ -1715,7 +1717,7 @@
1715
1717
  role=checkbox/aria-checked name+state. */
1716
1718
  .ds-247420 .ds-check-box {
1717
1719
  width: 15px; height: 15px; box-sizing: border-box; flex: 0 0 auto; position: relative;
1718
- border: 1.5px solid var(--rule); border-radius: 4px;
1720
+ border: 1.5px solid var(--fg-3); border-radius: 4px;
1719
1721
  transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
1720
1722
  }
1721
1723
  .ds-247420 .is-marked > .ds-check-box,
@@ -1727,14 +1729,14 @@
1727
1729
  }
1728
1730
  .ds-247420[aria-checked="mixed"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
1729
1731
  .ds-247420[aria-checked="mixed"] > .ds-check-box::after {
1730
- content: ""; position: absolute; left: 2px; right: 2px; top: 50%; height: 1.5px; margin-top: -0.75px; background: var(--bg);
1732
+ content: ""; position: absolute; left: 3px; right: 3px; top: 6px; height: 2px; background: var(--bg); border-radius: 1px;
1731
1733
  }
1732
1734
 
1733
1735
  .ds-247420 .ds-file-check {
1734
1736
  display: inline-flex; align-items: center; justify-content: center;
1735
1737
  min-width: 28px; height: 28px; padding: 0 4px;
1736
1738
  background: transparent; border: 0; border-radius: var(--r-1);
1737
- font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3);
1739
+ color: var(--fg-3);
1738
1740
  cursor: pointer;
1739
1741
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1740
1742
  }
@@ -1825,6 +1827,16 @@
1825
1827
  }
1826
1828
  .ds-247420 .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
1827
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); }
1828
1840
  .ds-247420 .ds-file-cell-name {
1829
1841
  font-size: var(--fs-tiny); text-align: left;
1830
1842
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
@@ -1835,13 +1847,6 @@
1835
1847
  background: color-mix(in oklab, var(--bg) 78%, transparent);
1836
1848
  }
1837
1849
 
1838
- /* Card mode — opt-in via data-columns; switches the list to a grid. */
1839
- .ds-247420 .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
1840
- .ds-247420 .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
1841
- .ds-247420 .ds-file-grid[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
1842
- .ds-247420 .ds-file-grid[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
1843
- .ds-247420 .ds-file-grid[data-columns="4"] { grid-template-columns: repeat(4, 1fr); }
1844
-
1845
1850
  /* ============================================================
1846
1851
  File browser surface — stage, toolbar, breadcrumb, dropzone,
1847
1852
  upload progress, empty state, modals, preview. Authored for
@@ -2165,21 +2170,12 @@
2165
2170
  }
2166
2171
  .ds-247420 .ds-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
2167
2172
 
2168
- /* Loading skeleton placeholder rows while a directory loads. */
2169
- .ds-247420 .ds-file-grid-loading { display: flex; flex-direction: column; gap: 4px; }
2170
- .ds-247420 .ds-file-skeleton {
2171
- height: 48px; border-radius: var(--r-2);
2172
- background: linear-gradient(90deg,
2173
- var(--bg) 0%, var(--bg-2) 50%, var(--bg) 100%);
2174
- background-size: 200% 100%;
2175
- }
2176
- @media (prefers-reduced-motion: no-preference) {
2177
- .ds-247420 .ds-file-skeleton { animation: ds-skeleton-shimmer 1.2s var(--ease) infinite; }
2178
- }
2179
- @keyframes ds-skeleton-shimmer {
2180
- 0% { background-position: 200% 0; }
2181
- 100% { background-position: -200% 0; }
2182
- }
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. */
2183
2179
 
2184
2180
  /* Drag-to-move drop target highlight on a directory row. */
2185
2181
  .ds-247420 .ds-file-row.ds-drop-target {
@@ -2388,6 +2384,13 @@
2388
2384
  padding: 10px 12px; border-radius: 6px; overflow-x: auto;
2389
2385
  font-family: var(--ff-mono); font-size: 0.9em; margin: 8px 0;
2390
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; }
2391
2394
 
2392
2395
  .ds-247420 .chat-msg .chat-bubble.chat-code,
2393
2396
  .ds-247420 .chat-msg.you .chat-bubble.chat-code,
@@ -3525,6 +3528,15 @@
3525
3528
  .ds-247420 .ws-resizer.ws-resizer-rail { grid-column: 1; }
3526
3529
  .ds-247420 .ws-resizer.ws-resizer-sessions { grid-column: 2; }
3527
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; } }
3528
3540
  /* Ease the rail/pane collapse. Track COUNT stays stable on collapse (only a
3529
3541
  width var flips), so grid-template-columns is animatable; reduced-motion
3530
3542
  drops it to an instant swap. */
@@ -4965,7 +4977,11 @@
4965
4977
  .ds-247420 .cm-vs-btn,
4966
4978
  .ds-247420 .cm-user-btn,
4967
4979
  .ds-247420 .cm-ch-spinner,
4968
- .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 {
4969
4985
  transition: none !important;
4970
4986
  animation: none !important;
4971
4987
  }
@@ -5595,6 +5611,23 @@
5595
5611
  @media (prefers-reduced-motion: reduce) {
5596
5612
  .ds-247420 .agentchat-working .chat-thinking-dots span { animation: none; opacity: .7; }
5597
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
+ }
5598
5631
 
5599
5632
  /* Responsive: the control cluster + cwd bar must stay usable on phones/tablets.
5600
5633
  The cwd path can't eat the row beside its label + buttons on a narrow screen. */
@@ -5622,16 +5655,20 @@
5622
5655
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
5623
5656
  background: var(--fg-3); flex: 0 0 auto;
5624
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. */
5625
5661
  .ds-247420 .status-dot-disc.status-dot-live { background: var(--accent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
5626
- .ds-247420 .status-dot-disc.status-dot-error { background: var(--flame); }
5627
- .ds-247420 .status-dot-disc.status-dot-connecting { background: var(--amber); }
5628
- .ds-247420 .status-dot-disc.status-dot-stale { background: var(--amber); }
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)); }
5629
5665
  @keyframes status-disc-pulse {
5630
5666
  0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent); }
5631
5667
  50% { box-shadow: 0 0 0 4px color-mix(in oklab, var(--accent) 0%, transparent); }
5632
5668
  }
5633
5669
  @media (prefers-reduced-motion: reduce) {
5634
- .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); }
5635
5672
  }
5636
5673
 
5637
5674
  /* ----------------------------------------------------------------------------
@@ -5694,7 +5731,9 @@
5694
5731
  .ds-247420 .ds-session-sub { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5695
5732
  .ds-247420 .ds-session-meta { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
5696
5733
  .ds-247420 .ds-session-agent { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
5697
- .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; }
5698
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); }
5699
5738
  .ds-247420 .ds-session-state-error { color: var(--flame); }
5700
5739
 
@@ -5724,13 +5763,15 @@
5724
5763
  .ds-247420 .ds-dash-card.is-error { border-color: var(--flame); }
5725
5764
  .ds-247420 .ds-dash-card-head { display: flex; align-items: center; gap: var(--space-2); }
5726
5765
  .ds-247420 .ds-dash-status { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; }
5727
- .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. */
5728
5768
  .ds-247420 .ds-dash-status.is-error { color: var(--flame); }
5729
5769
  .ds-247420 .ds-dash-agent { font-size: var(--fs-body); font-weight: 600; color: var(--fg); }
5730
5770
  .ds-247420 .ds-dash-model { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); margin-left: auto; }
5731
5771
  .ds-247420 .ds-dash-meta { display: flex; flex-direction: column; gap: 2px; }
5732
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; }
5733
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; }
5734
5775
  .ds-247420 .ds-dash-activity { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5735
5776
  .ds-247420 .ds-dash-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
5736
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); }
@@ -5777,6 +5818,13 @@
5777
5818
  /* --- B1: streaming pre shell — monospaced bubble while a fenced block streams,
5778
5819
  so it does not reflow prose->block on settle. --- */
5779
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
+ }
5780
5828
 
5781
5829
  /* --- A5: composer context line (agent / model / cwd at point of typing). --- */
5782
5830
  .ds-247420 .chat-composer-context {
@@ -5793,6 +5841,15 @@
5793
5841
  bottom-right of the flex-end composer (was unstyled, so the send button
5794
5842
  could wrap below the textarea instead of anchoring like claude.ai/code). */
5795
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
+ }
5796
5853
 
5797
5854
  /* --- B2: follow-up chips below the last settled assistant turn. --- */
5798
5855
  .ds-247420 .agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
@@ -6031,6 +6088,25 @@
6031
6088
  .ds-247420 .chat-msg-flat.you .chat-role { color: var(--accent); }
6032
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; }
6033
6090
  .ds-247420 .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
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); }
6034
6110
  /* Hover tint exceeds each role's REST tint so the row gives feedback (and the
6035
6111
  ladder stays monotonic): assistant 5% > its 3% rest; user 4% > transparent. */
6036
6112
  .ds-247420 .chat-msg-flat.them:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
@@ -6118,9 +6194,9 @@
6118
6194
  .ds-247420 .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
6119
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); }
6120
6196
  .ds-247420 .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
6121
- .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; }
6122
6198
  .ds-247420 .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
6123
- .ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--amber); }
6199
+ .ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--amber); font-weight: 600; }
6124
6200
  .ds-247420 .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
6125
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); }
6126
6202
  .ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
@@ -6442,7 +6518,7 @@
6442
6518
  font: var(--fs-tiny, 12px)/1.3 var(--ff-mono, monospace);
6443
6519
  min-width: 0;
6444
6520
  }
6445
- .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); }
6446
6522
  /* A property field whose control spans the full panel width (label above,
6447
6523
  control below) — used for wide segmented controls that would clip in the
6448
6524
  narrow value column. */
@@ -7732,6 +7808,31 @@
7732
7808
  }
7733
7809
  }
7734
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
+
7735
7836
  /* spoint/loading-screen.css */
7736
7837
  /* Loading-screen kit styles. Scoped under .ds-247420 at build time.
7737
7838
  All colors reference design tokens (no raw literals) per the token-lint gate. */