anentrypoint-design 0.0.206 → 0.0.208

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
@@ -904,10 +904,10 @@
904
904
  ============================================================ */
905
905
  .ds-247420 .panel {
906
906
  background: var(--panel-1, var(--bg-2));
907
- border-radius: var(--r-3);
907
+ border: var(--bw-hair) solid var(--rule);
908
+ border-radius: var(--r-2);
908
909
  margin: 0 0 var(--space-5);
909
910
  padding: var(--space-3);
910
- box-shadow: var(--panel-shadow);
911
911
  position: relative;
912
912
  }
913
913
  .ds-247420 .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
@@ -1296,10 +1296,10 @@
1296
1296
  gap: 3px;
1297
1297
  }
1298
1298
  .ds-247420 .ds-file-row {
1299
- grid-template-columns: 22px minmax(0, 1fr) auto;
1300
- gap: 10px; padding: 10px 12px;
1299
+ gap: 8px; padding: 10px 12px;
1301
1300
  font-size: var(--fs-xs);
1302
1301
  }
1302
+ .ds-247420 .ds-file-open { gap: 10px; }
1303
1303
  /* On mobile, fold meta under the title and keep actions inline. */
1304
1304
  .ds-247420 .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
1305
1305
  .ds-247420 .ds-file-row .ds-file-actions { opacity: 1; }
@@ -1307,6 +1307,7 @@
1307
1307
  reachable by touch (cohesion sweep). */
1308
1308
  .ds-247420 .ds-file-act, .ds-247420 .ds-file-sort-btn, .ds-247420 .ds-crumb-seg { min-height: 44px; }
1309
1309
  .ds-247420 .ds-file-filter-input { min-height: 44px; }
1310
+ .ds-247420 .ds-file-check, .ds-247420 .ds-file-selectall, .ds-247420 .ds-density-btn { min-height: 44px; min-width: 44px; }
1310
1311
 
1311
1312
  /* Chat */
1312
1313
  .ds-247420 .chat-stack { max-width: 100%; min-width: 0; }
@@ -1533,10 +1534,13 @@
1533
1534
  @keyframes ds-skel-shimmer { 100% { transform: translateX(100%); } }
1534
1535
  @media (prefers-reduced-motion: reduce) { .ds-247420 .ds-skel::after { animation: none; } }
1535
1536
 
1536
- /* File row — linear layout (icon · title · meta · actions) */
1537
+ /* File row — linear layout (checkbox? · open-button[code · icon · title · meta] · actions).
1538
+ The row is a flex strip; the open <button> is the stretching member and lays
1539
+ out the entry's own columns. It needs a full reset (UA button chrome off)
1540
+ because FileRow wraps the row content in a real button for native keyboard
1541
+ semantics. */
1537
1542
  .ds-247420 .ds-file-row {
1538
- display: grid; grid-template-columns: 26px minmax(0, 1fr) auto auto;
1539
- gap: 14px; align-items: center;
1543
+ display: flex; align-items: center; gap: 10px;
1540
1544
  padding: 11px 16px; background: var(--bg);
1541
1545
  border: var(--bw-hair) solid transparent;
1542
1546
  border-radius: var(--r-2); color: var(--fg);
@@ -1545,6 +1549,14 @@
1545
1549
  border-color var(--dur-snap) var(--ease),
1546
1550
  transform var(--dur-snap) var(--ease);
1547
1551
  }
1552
+ .ds-247420 .ds-file-open {
1553
+ display: flex; align-items: center; gap: 14px;
1554
+ flex: 1 1 auto; min-width: 0;
1555
+ background: none; border: 0; padding: 0; margin: 0;
1556
+ color: inherit; font: inherit; text-align: left; cursor: pointer;
1557
+ }
1558
+ .ds-247420 .ds-file-open[disabled] { cursor: default; }
1559
+ .ds-247420 .ds-file-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-1); }
1548
1560
  .ds-247420 .ds-file-row:hover {
1549
1561
  background: var(--bg-2);
1550
1562
  border-color: var(--rule);
@@ -1566,7 +1578,7 @@
1566
1578
  .ds-247420 .ds-file-row .title {
1567
1579
  font-weight: 500; font-size: var(--fs-sm);
1568
1580
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1569
- min-width: 0;
1581
+ min-width: 0; flex: 1 1 auto;
1570
1582
  }
1571
1583
  .ds-247420 .ds-file-row .code {
1572
1584
  font-family: var(--ff-mono); font-size: var(--fs-micro);
@@ -1608,6 +1620,99 @@
1608
1620
  .ds-247420 .ds-file-act:hover { background: var(--bg-3); color: var(--fg); }
1609
1621
  .ds-247420 .ds-file-act-warn:hover { background: color-mix(in oklab, var(--warn) 18%, var(--bg)); color: var(--warn); }
1610
1622
 
1623
+ /* Multi-select — per-row checkbox, header tri-state, bulk action strip. */
1624
+ .ds-247420 .ds-file-check {
1625
+ display: inline-flex; align-items: center; justify-content: center;
1626
+ min-width: 28px; height: 28px; padding: 0 4px;
1627
+ background: transparent; border: 0; border-radius: var(--r-1);
1628
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3);
1629
+ cursor: pointer;
1630
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1631
+ }
1632
+ .ds-247420 .ds-file-check:hover { background: var(--bg-3); color: var(--fg); }
1633
+ .ds-247420 .ds-file-check.is-marked { color: var(--accent); }
1634
+ .ds-247420 .ds-file-check:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1635
+ .ds-247420 .ds-file-check[disabled] { opacity: 0.4; cursor: default; }
1636
+ .ds-247420 .ds-file-row.is-marked { background: var(--accent-tint); border-color: var(--accent); }
1637
+ .ds-247420 .ds-file-selectall {
1638
+ display: inline-flex; align-items: center; gap: var(--space-1);
1639
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2);
1640
+ cursor: pointer; background: none; border: none;
1641
+ padding: var(--space-1); border-radius: var(--r-1);
1642
+ }
1643
+ .ds-247420 .ds-file-selectall:hover { background: var(--bg-2); color: var(--fg); }
1644
+ .ds-247420 .ds-file-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1645
+ .ds-247420 .ds-file-controls { display: flex; align-items: center; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); flex-wrap: wrap; }
1646
+ .ds-247420 .ds-file-controls .spread { flex: 1 1 auto; }
1647
+ .ds-247420 .ds-file-controls .ds-file-sort { padding: 0; }
1648
+ .ds-247420 .ds-bulkbar {
1649
+ display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
1650
+ padding: var(--space-1) var(--space-2);
1651
+ background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1652
+ }
1653
+ .ds-247420 .ds-bulkbar-count { font-size: var(--fs-tiny); color: var(--fg-2); }
1654
+
1655
+ /* Density picker — list / compact / thumbnails. */
1656
+ .ds-247420 .ds-density {
1657
+ display: inline-flex; gap: 2px; padding: 2px;
1658
+ background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
1659
+ }
1660
+ .ds-247420 .ds-density-btn {
1661
+ font-size: var(--fs-tiny); color: var(--fg-2);
1662
+ background: none; border: none; cursor: pointer;
1663
+ padding: 2px var(--space-2); border-radius: calc(var(--r-1) - 2px);
1664
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1665
+ }
1666
+ .ds-247420 .ds-density-btn:hover { color: var(--fg); }
1667
+ .ds-247420 .ds-density-btn.active { background: var(--accent-tint); color: var(--accent); }
1668
+ .ds-247420 .ds-density-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1669
+
1670
+ /* Compact density — tighter rows for long listings. */
1671
+ .ds-247420 .ds-file-grid[data-density="compact"] { gap: 2px; }
1672
+ .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-row { padding: 5px 12px; gap: 10px; }
1673
+ .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-row .title { font-size: var(--fs-xs); }
1674
+ .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
1675
+ .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-icon { width: 20px; height: 20px; font-size: 13px; }
1676
+
1677
+ /* Thumbnail density — tile grid; image entries carry a real lazy thumbnail. */
1678
+ .ds-247420 .ds-file-grid-thumb {
1679
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
1680
+ gap: var(--space-3); align-items: start;
1681
+ }
1682
+ .ds-247420 .ds-file-cell {
1683
+ position: relative;
1684
+ background: var(--bg); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1685
+ overflow: hidden;
1686
+ transition: border-color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1687
+ }
1688
+ .ds-247420 .ds-file-cell:hover { border-color: var(--fg-3); }
1689
+ .ds-247420 .ds-file-cell.active { border-color: var(--accent); background: var(--accent-tint); }
1690
+ .ds-247420 .ds-file-cell.is-marked { border-color: var(--accent); background: var(--accent-tint); }
1691
+ .ds-247420 .ds-file-cell.is-locked { opacity: 0.6; }
1692
+ .ds-247420 .ds-file-cell-open {
1693
+ display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1);
1694
+ width: 100%; padding: var(--space-1); margin: 0;
1695
+ background: none; border: none; cursor: pointer; color: var(--fg);
1696
+ }
1697
+ .ds-247420 .ds-file-cell-open[disabled] { cursor: default; }
1698
+ .ds-247420 .ds-file-cell-open:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-2); }
1699
+ .ds-247420 .ds-file-cell-media {
1700
+ display: flex; align-items: center; justify-content: center;
1701
+ width: 100%; aspect-ratio: 4 / 3;
1702
+ background: var(--bg-2); border-radius: var(--r-1); overflow: hidden;
1703
+ }
1704
+ .ds-247420 .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
1705
+ .ds-247420 .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
1706
+ .ds-247420 .ds-file-cell-name {
1707
+ font-size: var(--fs-tiny); text-align: left;
1708
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1709
+ }
1710
+ .ds-247420 .ds-file-cell-meta { font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg-3); text-align: left; }
1711
+ .ds-247420 .ds-file-cell-check {
1712
+ position: absolute; top: 4px; left: 4px; z-index: 1;
1713
+ background: color-mix(in oklab, var(--bg) 78%, transparent);
1714
+ }
1715
+
1611
1716
  /* Card mode — opt-in via data-columns; switches the list to a grid. */
1612
1717
  .ds-247420 .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
1613
1718
  .ds-247420 .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
@@ -1990,7 +2095,7 @@
1990
2095
  .ds-247420 .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
1991
2096
  .ds-247420 .ds-segmented .ds-seg-btn.is-on {
1992
2097
  background: var(--bg); color: var(--fg);
1993
- box-shadow: var(--shadow-1);
2098
+ box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
1994
2099
  }
1995
2100
  .ds-247420 .ds-theme-toggle.btn {
1996
2101
  font-family: var(--ff-mono); font-size: var(--fs-xs);
@@ -2196,7 +2301,6 @@
2196
2301
  .ds-247420 .chat-msg:hover .chat-image,
2197
2302
  .ds-247420 .chat-image:hover {
2198
2303
  border-color: color-mix(in oklab, var(--accent) 35%, transparent);
2199
- box-shadow: 0 4px 16px color-mix(in oklab, var(--fg) 12%, transparent);
2200
2304
  }
2201
2305
  .ds-247420 .chat-image img { display: block; width: 100%; height: auto; max-height: 360px; object-fit: cover; }
2202
2306
  .ds-247420 .chat-image .cap,
@@ -2237,7 +2341,7 @@
2237
2341
  border-radius: 12px; overflow: hidden; max-width: min(100%, 480px);
2238
2342
  transition: box-shadow 0.12s ease, border-color 0.12s ease;
2239
2343
  }
2240
- .ds-247420 .chat-msg:hover .chat-pdf { border-color: color-mix(in oklab, var(--accent) 30%, transparent); box-shadow: 0 2px 12px color-mix(in oklab, var(--fg) 6%, transparent); }
2344
+ .ds-247420 .chat-msg:hover .chat-pdf { border-color: color-mix(in oklab, var(--accent) 30%, transparent); }
2241
2345
  .ds-247420 .chat-pdf-head {
2242
2346
  display: flex; align-items: center; gap: 10px; padding: 10px 14px;
2243
2347
  background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
@@ -2265,7 +2369,6 @@
2265
2369
  .ds-247420 .chat-link:hover {
2266
2370
  background: var(--bg-3);
2267
2371
  border-color: color-mix(in oklab, var(--accent) 40%, transparent);
2268
- box-shadow: 0 2px 12px color-mix(in oklab, var(--fg) 8%, transparent);
2269
2372
  }
2270
2373
  .ds-247420 .chat-link:not(:has(.thumb)):not(:has(img)) { grid-template-columns: 1fr; }
2271
2374
  .ds-247420 .chat-link .thumb,
@@ -3378,6 +3481,15 @@
3378
3481
  .ds-247420 .ws-shell.ws-sessions-open .ws-scrim, .ds-247420 .ws-shell.ws-pane-open .ws-scrim { opacity: 1; pointer-events: auto; }
3379
3482
  /* The mobile drawer-toggle affordances live in the crumb bar. */
3380
3483
  .ds-247420 .ws-drawer-toggle { display: inline-flex; }
3484
+ /* The Crumb's narrow collapse elsewhere keys on the .app @container, which
3485
+ does not exist inside WorkspaceShell - mirror it here so the crumb bar
3486
+ cannot overflow a narrow viewport (trail hides, leaf ellipsizes, the
3487
+ right cluster wraps under instead of pushing past the edge). */
3488
+ .ds-247420 .ws-crumb { padding-top: 6px; padding-bottom: 6px; }
3489
+ .ds-247420 .ws-crumb .app-crumb { flex-wrap: wrap; min-width: 0; }
3490
+ .ds-247420 .ws-crumb .app-crumb > .sep, .ds-247420 .ws-crumb .app-crumb > span:not(.crumb-right):not(.leaf) { display: none; }
3491
+ .ds-247420 .ws-crumb .app-crumb .leaf { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
3492
+ .ds-247420 .ws-crumb .app-crumb .crumb-right { margin-left: 0; flex-wrap: wrap; min-width: 0; display: inline-flex; }
3381
3493
  }
3382
3494
  /* Drawer toggles are mobile-only chrome; hidden on the desktop grid. */
3383
3495
  .ds-247420 .ws-drawer-toggle { display: none; align-items: center; justify-content: center; width: 40px; height: 40px; border: none; background: none; color: var(--fg-2); cursor: pointer; border-radius: var(--r-1); }
@@ -5422,7 +5534,10 @@
5422
5534
  /* --- C5: active dashboard card (current conversation). --- */
5423
5535
  .ds-247420 .ds-dash-card.is-active { box-shadow: inset 2px 0 0 var(--accent); }
5424
5536
  .ds-247420 .ds-dash-card.is-selected { background: var(--accent-tint); }
5425
- .ds-247420 .ds-dash-card.is-stale { opacity: .92; }
5537
+ /* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
5538
+ agent is flagged in a dense grid, not merely faded near-invisibly. The word
5539
+ 'idle' co-carries state, so this stays colour-blind safe. */
5540
+ .ds-247420 .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber, #d9a93a); }
5426
5541
 
5427
5542
  /* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
5428
5543
 
@@ -5508,7 +5623,7 @@
5508
5623
  /* Enter-to-send hint: visible while the composer is focused or carries a
5509
5624
  draft; hidden under 420px to save rows. */
5510
5625
  .ds-247420 .chat-composer-hint {
5511
- display: none; padding: 2px var(--space-3) 0;
5626
+ display: none; width: 100%; order: 5; padding: 2px var(--space-1) 0;
5512
5627
  font-size: var(--fs-micro); color: var(--fg-3);
5513
5628
  }
5514
5629
  .ds-247420 .chat-composer:focus-within .chat-composer-hint,
@@ -5591,6 +5706,140 @@
5591
5706
  /* One connection vocabulary: offline (is-lost kept as legacy alias). */
5592
5707
  .ds-247420 .ds-dash-stream.is-offline { color: var(--flame); }
5593
5708
 
5709
+ /* ============================================================
5710
+ 10th run - Claude-Code-web design-language parity
5711
+ ============================================================ */
5712
+
5713
+ /* Flat full-width chat turns (claude.ai/code), replacing the messenger
5714
+ avatar-disc + colored-bubble layout. AgentChat passes flat:true; the demo
5715
+ Chat keeps the bubble layout. Turns are full-width to --measure; the user vs
5716
+ assistant distinction is a role label + a faint assistant background. */
5717
+ .ds-247420 .chat-msg-flat { display: block; padding: var(--space-3) var(--space-4); margin: 0; background: none; border-radius: var(--r-2); }
5718
+ .ds-247420 .chat-msg-flat.them { background: color-mix(in oklab, var(--fg) 3%, transparent); }
5719
+ .ds-247420 .chat-msg-flat.you { background: none; }
5720
+ .ds-247420 .chat-msg-flat .chat-stack { max-width: var(--measure); width: 100%; margin: 0; align-items: stretch; }
5721
+ .ds-247420 .chat-msg-flat.you .chat-stack { align-items: stretch; }
5722
+ .ds-247420 .chat-role { font-size: var(--fs-tiny); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--fg-3); margin-bottom: var(--space-1); }
5723
+ .ds-247420 .chat-msg-flat.you .chat-role { color: var(--accent); }
5724
+ .ds-247420 .chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
5725
+ .ds-247420 .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
5726
+ .ds-247420 .chat-msg-flat:hover { background: color-mix(in oklab, var(--fg) 3%, transparent); }
5727
+ .ds-247420 .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 2%, transparent); }
5728
+ .ds-247420 .chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
5729
+ .ds-247420 .chat-msg-flat .chat-avatar { display: none; }
5730
+
5731
+ /* Tool-call card: a bordered, status-toned, scannable card (claude.ai/code),
5732
+ not the raw mascot-tinted details dump. The node keeps the .chat-bubble
5733
+ class, so these rules de-frame it and restyle. Placed after the flat-bubble
5734
+ reset so they win on equal specificity. */
5735
+ .ds-247420 .chat-msg .chat-tool {
5736
+ display: block; max-width: 100%; padding: 0; margin: var(--space-1) 0;
5737
+ background: var(--bg); color: var(--fg);
5738
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
5739
+ box-shadow: none; overflow: hidden;
5740
+ }
5741
+ .ds-247420 .chat-msg .chat-tool[open] { background: var(--bg); }
5742
+ .ds-247420 .chat-msg .chat-tool .chat-tool-head {
5743
+ display: flex; align-items: center; gap: var(--space-2);
5744
+ padding: var(--space-2) var(--space-3); cursor: pointer;
5745
+ font-size: var(--fs-sm); list-style: none;
5746
+ }
5747
+ .ds-247420 .chat-msg .chat-tool .chat-tool-head::-webkit-details-marker { display: none; }
5748
+ .ds-247420 .chat-msg .chat-tool .chat-tool-head:hover { background: var(--bg-2); }
5749
+ .ds-247420 .chat-tool-icon { display: inline-flex; color: var(--fg-3); }
5750
+ .ds-247420 .chat-tool-name { font-family: var(--ff-mono); font-weight: 600; color: var(--fg); }
5751
+ .ds-247420 .chat-tool-label { color: var(--fg-3); font-size: var(--fs-tiny); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
5752
+ .ds-247420 .chat-tool-status {
5753
+ margin-left: auto; flex: 0 0 auto;
5754
+ font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
5755
+ color: var(--fg-3);
5756
+ padding: 2px var(--space-2); border-radius: var(--r-pill);
5757
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
5758
+ }
5759
+ .ds-247420 .chat-msg .chat-tool.tool-running .chat-tool-status { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
5760
+ .ds-247420 .chat-msg .chat-tool.tool-error .chat-tool-status { color: var(--flame); background: color-mix(in oklab, var(--flame) 12%, transparent); }
5761
+ .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); }
5762
+ .ds-247420 .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
5763
+ .ds-247420 .chat-tool-section-label { font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--fg-3); }
5764
+ .ds-247420 .chat-tool-pre { margin: 0; padding: var(--space-2); background: var(--bg-2); border-radius: var(--r-1); font-family: var(--ff-mono); font-size: var(--fs-tiny); line-height: 1.45; overflow-x: auto; max-height: 320px; overflow-y: auto; }
5765
+ .ds-247420 .chat-tool-pre.is-error { color: var(--flame); }
5766
+ .ds-247420 .chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
5767
+
5768
+ /* Fenced-code language tab on every rendered-markdown block (not just the
5769
+ structured CodeNode). injectCodeCopy reads the language- class. */
5770
+ .ds-247420 .chat-code-block { position: relative; }
5771
+ .ds-247420 .chat-code-lang {
5772
+ position: absolute; top: 0; left: 0; z-index: 2;
5773
+ padding: 2px var(--space-2); border-bottom-right-radius: var(--r-1);
5774
+ font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: .04em;
5775
+ color: var(--fg-3); background: color-mix(in oklab, var(--fg) 6%, transparent);
5776
+ pointer-events: none;
5777
+ }
5778
+ .ds-247420 .chat-code-block pre { padding-top: calc(var(--space-3) + 4px); }
5779
+
5780
+ /* Motion + microinteraction polish (all reduced-motion guarded). */
5781
+ .ds-247420 .ds-session-row { transition: background var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease); }
5782
+ @media (prefers-reduced-motion: no-preference) {
5783
+ .ds-247420 .agentchat-thread { scroll-behavior: smooth; }
5784
+ .ds-247420 .ds-alert { animation: ds-alert-in var(--dur-base) var(--ease); }
5785
+ }
5786
+ @keyframes ds-alert-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
5787
+ .ds-247420 .chat-code-copy { transition: opacity var(--dur-snap, .12s) var(--ease, ease), color var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease); }
5788
+ .ds-247420 .chat-msg-action { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
5789
+ .ds-247420 .agentchat-install-copy { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
5790
+ @media (prefers-reduced-motion: no-preference) {
5791
+ .ds-247420 .btn.is-armed, .ds-247420 .btn-primary.is-armed { animation: ds-arm-pulse var(--dur-slow) var(--ease); }
5792
+ }
5793
+ @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); } }
5794
+ .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); }
5795
+ @media (prefers-reduced-motion: no-preference) {
5796
+ .ds-247420 .ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
5797
+ }
5798
+ @keyframes ds-card-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
5799
+
5800
+ /* Live command-center: status-bucket groups + header breakdown + heartbeat. */
5801
+ .ds-247420 .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
5802
+ .ds-247420 .ds-dash-group-label { font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--fg-3); padding: 0 var(--space-1); }
5803
+ .ds-247420 .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
5804
+ .ds-247420 .ds-dash-breakdown .seg.is-running { color: var(--green); font-weight: 600; }
5805
+ .ds-247420 .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
5806
+ .ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--amber, #d9a93a); }
5807
+ .ds-247420 .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
5808
+ .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); }
5809
+ .ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5810
+ .ds-247420 .ds-dash-clear { background: none; border: none; color: var(--fg-3); cursor: pointer; font-size: var(--fs-tiny); text-decoration: underline dotted; padding: var(--space-1); }
5811
+
5812
+ /* Conversation-rail loading skeleton (cold ccsniff walk). */
5813
+ .ds-247420 .ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
5814
+ .ds-247420 .ds-session-row-skeleton .ds-skel { background: var(--bg-3); border-radius: var(--r-1); }
5815
+ .ds-247420 .ds-session-row-skeleton .ds-skel-title { height: 12px; width: 70%; }
5816
+ .ds-247420 .ds-session-row-skeleton .ds-skel-meta { height: 9px; width: 45%; }
5817
+ @media (prefers-reduced-motion: no-preference) {
5818
+ .ds-247420 .ds-session-row-skeleton .ds-skel { animation: ds-skel-shimmer 1.3s ease-in-out infinite; background: linear-gradient(90deg, var(--bg-3) 0%, var(--bg-2) 50%, var(--bg-3) 100%); background-size: 200% 100%; }
5819
+ }
5820
+ @keyframes ds-skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
5821
+
5822
+ /* File code preview: paint Prism tokens (the bundle scoped them to the chat
5823
+ block only) + an optional non-selectable line-number gutter. */
5824
+ .ds-247420 .ds-preview-code code { color: var(--fg); }
5825
+ .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); }
5826
+ .ds-247420 .ds-preview-code .token.punctuation { color: var(--fg-2); }
5827
+ .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); }
5828
+ .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(--green-2, #3A9A34); }
5829
+ .ds-247420 .ds-preview-code .token.atrule, .ds-247420 .ds-preview-code .token.attr-value, .ds-247420 .ds-preview-code .token.keyword { color: var(--sky, #3A6EFF); }
5830
+ .ds-247420 .ds-preview-code .token.function, .ds-247420 .ds-preview-code .token.class-name { color: var(--flame); }
5831
+ .ds-247420 .ds-preview-code.has-gutter { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0 var(--space-2); }
5832
+ .ds-247420 .ds-preview-code.has-gutter code { display: block; min-width: 0; overflow-x: auto; }
5833
+ .ds-247420 .ds-preview-gutter { user-select: none; text-align: right; padding: 0 var(--space-2) 0 0; color: var(--fg-3); border-right: var(--bw-hair) solid var(--rule); font-family: var(--ff-mono); white-space: pre; line-height: inherit; }
5834
+
5835
+ /* Image preview: fit/actual control + alpha checkerboard. */
5836
+ .ds-247420 .ds-preview-media-controls { display: flex; gap: var(--space-2); padding: var(--space-2); justify-content: center; }
5837
+ .ds-247420 .ds-preview-media-alpha {
5838
+ background-image: linear-gradient(45deg, var(--bg-3) 25%, transparent 25%), linear-gradient(-45deg, var(--bg-3) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--bg-3) 75%), linear-gradient(-45deg, transparent 75%, var(--bg-3) 75%);
5839
+ background-size: 16px 16px; background-position: 0 0, 0 8px, 8px -8px, -8px 0;
5840
+ }
5841
+ .ds-247420 .ds-preview-media.is-actual { max-width: none; max-height: none; }
5842
+
5594
5843
  /* editor-primitives.css */
5595
5844
  /* editor-primitives.css — chrome for in-engine editors, inspectors, IDEs,
5596
5845
  debug HUDs. All rules under .ds-247420 scope (build prefixes). Tokens