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/app-shell.css CHANGED
@@ -503,10 +503,10 @@ body.canvas-host { background: transparent !important; }
503
503
  ============================================================ */
504
504
  .panel {
505
505
  background: var(--panel-1, var(--bg-2));
506
- border-radius: var(--r-3);
506
+ border: var(--bw-hair) solid var(--rule);
507
+ border-radius: var(--r-2);
507
508
  margin: 0 0 var(--space-5);
508
509
  padding: var(--space-3);
509
- box-shadow: var(--panel-shadow);
510
510
  position: relative;
511
511
  }
512
512
  .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
@@ -895,10 +895,10 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
895
895
  gap: 3px;
896
896
  }
897
897
  .ds-file-row {
898
- grid-template-columns: 22px minmax(0, 1fr) auto;
899
- gap: 10px; padding: 10px 12px;
898
+ gap: 8px; padding: 10px 12px;
900
899
  font-size: var(--fs-xs);
901
900
  }
901
+ .ds-file-open { gap: 10px; }
902
902
  /* On mobile, fold meta under the title and keep actions inline. */
903
903
  .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
904
904
  .ds-file-row .ds-file-actions { opacity: 1; }
@@ -906,6 +906,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
906
906
  reachable by touch (cohesion sweep). */
907
907
  .ds-file-act, .ds-file-sort-btn, .ds-crumb-seg { min-height: 44px; }
908
908
  .ds-file-filter-input { min-height: 44px; }
909
+ .ds-file-check, .ds-file-selectall, .ds-density-btn { min-height: 44px; min-width: 44px; }
909
910
 
910
911
  /* Chat */
911
912
  .chat-stack { max-width: 100%; min-width: 0; }
@@ -1132,10 +1133,13 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1132
1133
  @keyframes ds-skel-shimmer { 100% { transform: translateX(100%); } }
1133
1134
  @media (prefers-reduced-motion: reduce) { .ds-skel::after { animation: none; } }
1134
1135
 
1135
- /* File row — linear layout (icon · title · meta · actions) */
1136
+ /* File row — linear layout (checkbox? · open-button[code · icon · title · meta] · actions).
1137
+ The row is a flex strip; the open <button> is the stretching member and lays
1138
+ out the entry's own columns. It needs a full reset (UA button chrome off)
1139
+ because FileRow wraps the row content in a real button for native keyboard
1140
+ semantics. */
1136
1141
  .ds-file-row {
1137
- display: grid; grid-template-columns: 26px minmax(0, 1fr) auto auto;
1138
- gap: 14px; align-items: center;
1142
+ display: flex; align-items: center; gap: 10px;
1139
1143
  padding: 11px 16px; background: var(--bg);
1140
1144
  border: var(--bw-hair) solid transparent;
1141
1145
  border-radius: var(--r-2); color: var(--fg);
@@ -1144,6 +1148,14 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1144
1148
  border-color var(--dur-snap) var(--ease),
1145
1149
  transform var(--dur-snap) var(--ease);
1146
1150
  }
1151
+ .ds-file-open {
1152
+ display: flex; align-items: center; gap: 14px;
1153
+ flex: 1 1 auto; min-width: 0;
1154
+ background: none; border: 0; padding: 0; margin: 0;
1155
+ color: inherit; font: inherit; text-align: left; cursor: pointer;
1156
+ }
1157
+ .ds-file-open[disabled] { cursor: default; }
1158
+ .ds-file-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-1); }
1147
1159
  .ds-file-row:hover {
1148
1160
  background: var(--bg-2);
1149
1161
  border-color: var(--rule);
@@ -1165,7 +1177,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1165
1177
  .ds-file-row .title {
1166
1178
  font-weight: 500; font-size: var(--fs-sm);
1167
1179
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1168
- min-width: 0;
1180
+ min-width: 0; flex: 1 1 auto;
1169
1181
  }
1170
1182
  .ds-file-row .code {
1171
1183
  font-family: var(--ff-mono); font-size: var(--fs-micro);
@@ -1207,6 +1219,99 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1207
1219
  .ds-file-act:hover { background: var(--bg-3); color: var(--fg); }
1208
1220
  .ds-file-act-warn:hover { background: color-mix(in oklab, var(--warn) 18%, var(--bg)); color: var(--warn); }
1209
1221
 
1222
+ /* Multi-select — per-row checkbox, header tri-state, bulk action strip. */
1223
+ .ds-file-check {
1224
+ display: inline-flex; align-items: center; justify-content: center;
1225
+ min-width: 28px; height: 28px; padding: 0 4px;
1226
+ background: transparent; border: 0; border-radius: var(--r-1);
1227
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3);
1228
+ cursor: pointer;
1229
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1230
+ }
1231
+ .ds-file-check:hover { background: var(--bg-3); color: var(--fg); }
1232
+ .ds-file-check.is-marked { color: var(--accent); }
1233
+ .ds-file-check:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1234
+ .ds-file-check[disabled] { opacity: 0.4; cursor: default; }
1235
+ .ds-file-row.is-marked { background: var(--accent-tint); border-color: var(--accent); }
1236
+ .ds-file-selectall {
1237
+ display: inline-flex; align-items: center; gap: var(--space-1);
1238
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2);
1239
+ cursor: pointer; background: none; border: none;
1240
+ padding: var(--space-1); border-radius: var(--r-1);
1241
+ }
1242
+ .ds-file-selectall:hover { background: var(--bg-2); color: var(--fg); }
1243
+ .ds-file-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1244
+ .ds-file-controls { display: flex; align-items: center; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); flex-wrap: wrap; }
1245
+ .ds-file-controls .spread { flex: 1 1 auto; }
1246
+ .ds-file-controls .ds-file-sort { padding: 0; }
1247
+ .ds-bulkbar {
1248
+ display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
1249
+ padding: var(--space-1) var(--space-2);
1250
+ background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1251
+ }
1252
+ .ds-bulkbar-count { font-size: var(--fs-tiny); color: var(--fg-2); }
1253
+
1254
+ /* Density picker — list / compact / thumbnails. */
1255
+ .ds-density {
1256
+ display: inline-flex; gap: 2px; padding: 2px;
1257
+ background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
1258
+ }
1259
+ .ds-density-btn {
1260
+ font-size: var(--fs-tiny); color: var(--fg-2);
1261
+ background: none; border: none; cursor: pointer;
1262
+ padding: 2px var(--space-2); border-radius: calc(var(--r-1) - 2px);
1263
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1264
+ }
1265
+ .ds-density-btn:hover { color: var(--fg); }
1266
+ .ds-density-btn.active { background: var(--accent-tint); color: var(--accent); }
1267
+ .ds-density-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1268
+
1269
+ /* Compact density — tighter rows for long listings. */
1270
+ .ds-file-grid[data-density="compact"] { gap: 2px; }
1271
+ .ds-file-grid[data-density="compact"] .ds-file-row { padding: 5px 12px; gap: 10px; }
1272
+ .ds-file-grid[data-density="compact"] .ds-file-row .title { font-size: var(--fs-xs); }
1273
+ .ds-file-grid[data-density="compact"] .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
1274
+ .ds-file-grid[data-density="compact"] .ds-file-icon { width: 20px; height: 20px; font-size: 13px; }
1275
+
1276
+ /* Thumbnail density — tile grid; image entries carry a real lazy thumbnail. */
1277
+ .ds-file-grid-thumb {
1278
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
1279
+ gap: var(--space-3); align-items: start;
1280
+ }
1281
+ .ds-file-cell {
1282
+ position: relative;
1283
+ background: var(--bg); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
1284
+ overflow: hidden;
1285
+ transition: border-color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1286
+ }
1287
+ .ds-file-cell:hover { border-color: var(--fg-3); }
1288
+ .ds-file-cell.active { border-color: var(--accent); background: var(--accent-tint); }
1289
+ .ds-file-cell.is-marked { border-color: var(--accent); background: var(--accent-tint); }
1290
+ .ds-file-cell.is-locked { opacity: 0.6; }
1291
+ .ds-file-cell-open {
1292
+ display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1);
1293
+ width: 100%; padding: var(--space-1); margin: 0;
1294
+ background: none; border: none; cursor: pointer; color: var(--fg);
1295
+ }
1296
+ .ds-file-cell-open[disabled] { cursor: default; }
1297
+ .ds-file-cell-open:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-2); }
1298
+ .ds-file-cell-media {
1299
+ display: flex; align-items: center; justify-content: center;
1300
+ width: 100%; aspect-ratio: 4 / 3;
1301
+ background: var(--bg-2); border-radius: var(--r-1); overflow: hidden;
1302
+ }
1303
+ .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
1304
+ .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
1305
+ .ds-file-cell-name {
1306
+ font-size: var(--fs-tiny); text-align: left;
1307
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1308
+ }
1309
+ .ds-file-cell-meta { font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg-3); text-align: left; }
1310
+ .ds-file-cell-check {
1311
+ position: absolute; top: 4px; left: 4px; z-index: 1;
1312
+ background: color-mix(in oklab, var(--bg) 78%, transparent);
1313
+ }
1314
+
1210
1315
  /* Card mode — opt-in via data-columns; switches the list to a grid. */
1211
1316
  .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
1212
1317
  .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
@@ -1589,7 +1694,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1589
1694
  .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
1590
1695
  .ds-segmented .ds-seg-btn.is-on {
1591
1696
  background: var(--bg); color: var(--fg);
1592
- box-shadow: var(--shadow-1);
1697
+ box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
1593
1698
  }
1594
1699
  .ds-theme-toggle.btn {
1595
1700
  font-family: var(--ff-mono); font-size: var(--fs-xs);
@@ -1795,7 +1900,6 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1795
1900
  .chat-msg:hover .chat-image,
1796
1901
  .chat-image:hover {
1797
1902
  border-color: color-mix(in oklab, var(--accent) 35%, transparent);
1798
- box-shadow: 0 4px 16px color-mix(in oklab, var(--fg) 12%, transparent);
1799
1903
  }
1800
1904
  .chat-image img { display: block; width: 100%; height: auto; max-height: 360px; object-fit: cover; }
1801
1905
  .chat-image .cap,
@@ -1836,7 +1940,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1836
1940
  border-radius: 12px; overflow: hidden; max-width: min(100%, 480px);
1837
1941
  transition: box-shadow 0.12s ease, border-color 0.12s ease;
1838
1942
  }
1839
- .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); }
1943
+ .chat-msg:hover .chat-pdf { border-color: color-mix(in oklab, var(--accent) 30%, transparent); }
1840
1944
  .chat-pdf-head {
1841
1945
  display: flex; align-items: center; gap: 10px; padding: 10px 14px;
1842
1946
  background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
@@ -1864,7 +1968,6 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1864
1968
  .chat-link:hover {
1865
1969
  background: var(--bg-3);
1866
1970
  border-color: color-mix(in oklab, var(--accent) 40%, transparent);
1867
- box-shadow: 0 2px 12px color-mix(in oklab, var(--fg) 8%, transparent);
1868
1971
  }
1869
1972
  .chat-link:not(:has(.thumb)):not(:has(img)) { grid-template-columns: 1fr; }
1870
1973
  .chat-link .thumb,
@@ -2986,6 +3089,15 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
2986
3089
  .ws-shell.ws-sessions-open .ws-scrim, .ws-shell.ws-pane-open .ws-scrim { opacity: 1; pointer-events: auto; }
2987
3090
  /* The mobile drawer-toggle affordances live in the crumb bar. */
2988
3091
  .ws-drawer-toggle { display: inline-flex; }
3092
+ /* The Crumb's narrow collapse elsewhere keys on the .app @container, which
3093
+ does not exist inside WorkspaceShell - mirror it here so the crumb bar
3094
+ cannot overflow a narrow viewport (trail hides, leaf ellipsizes, the
3095
+ right cluster wraps under instead of pushing past the edge). */
3096
+ .ws-crumb { padding-top: 6px; padding-bottom: 6px; }
3097
+ .ws-crumb .app-crumb { flex-wrap: wrap; min-width: 0; }
3098
+ .ws-crumb .app-crumb > .sep, .ws-crumb .app-crumb > span:not(.crumb-right):not(.leaf) { display: none; }
3099
+ .ws-crumb .app-crumb .leaf { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
3100
+ .ws-crumb .app-crumb .crumb-right { margin-left: 0; flex-wrap: wrap; min-width: 0; display: inline-flex; }
2989
3101
  }
2990
3102
  /* Drawer toggles are mobile-only chrome; hidden on the desktop grid. */
2991
3103
  .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); }
package/chat.css CHANGED
@@ -464,7 +464,10 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
464
464
  /* --- C5: active dashboard card (current conversation). --- */
465
465
  .ds-dash-card.is-active { box-shadow: inset 2px 0 0 var(--accent); }
466
466
  .ds-dash-card.is-selected { background: var(--accent-tint); }
467
- .ds-dash-card.is-stale { opacity: .92; }
467
+ /* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
468
+ agent is flagged in a dense grid, not merely faded near-invisibly. The word
469
+ 'idle' co-carries state, so this stays colour-blind safe. */
470
+ .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber, #d9a93a); }
468
471
 
469
472
  /* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
470
473
 
@@ -550,7 +553,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
550
553
  /* Enter-to-send hint: visible while the composer is focused or carries a
551
554
  draft; hidden under 420px to save rows. */
552
555
  .chat-composer-hint {
553
- display: none; padding: 2px var(--space-3) 0;
556
+ display: none; width: 100%; order: 5; padding: 2px var(--space-1) 0;
554
557
  font-size: var(--fs-micro); color: var(--fg-3);
555
558
  }
556
559
  .chat-composer:focus-within .chat-composer-hint,
@@ -632,3 +635,137 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
632
635
 
633
636
  /* One connection vocabulary: offline (is-lost kept as legacy alias). */
634
637
  .ds-dash-stream.is-offline { color: var(--flame); }
638
+
639
+ /* ============================================================
640
+ 10th run - Claude-Code-web design-language parity
641
+ ============================================================ */
642
+
643
+ /* Flat full-width chat turns (claude.ai/code), replacing the messenger
644
+ avatar-disc + colored-bubble layout. AgentChat passes flat:true; the demo
645
+ Chat keeps the bubble layout. Turns are full-width to --measure; the user vs
646
+ assistant distinction is a role label + a faint assistant background. */
647
+ .chat-msg-flat { display: block; padding: var(--space-3) var(--space-4); margin: 0; background: none; border-radius: var(--r-2); }
648
+ .chat-msg-flat.them { background: color-mix(in oklab, var(--fg) 3%, transparent); }
649
+ .chat-msg-flat.you { background: none; }
650
+ .chat-msg-flat .chat-stack { max-width: var(--measure); width: 100%; margin: 0; align-items: stretch; }
651
+ .chat-msg-flat.you .chat-stack { align-items: stretch; }
652
+ .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); }
653
+ .chat-msg-flat.you .chat-role { color: var(--accent); }
654
+ .chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
655
+ .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
656
+ .chat-msg-flat:hover { background: color-mix(in oklab, var(--fg) 3%, transparent); }
657
+ .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 2%, transparent); }
658
+ .chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
659
+ .chat-msg-flat .chat-avatar { display: none; }
660
+
661
+ /* Tool-call card: a bordered, status-toned, scannable card (claude.ai/code),
662
+ not the raw mascot-tinted details dump. The node keeps the .chat-bubble
663
+ class, so these rules de-frame it and restyle. Placed after the flat-bubble
664
+ reset so they win on equal specificity. */
665
+ .chat-msg .chat-tool {
666
+ display: block; max-width: 100%; padding: 0; margin: var(--space-1) 0;
667
+ background: var(--bg); color: var(--fg);
668
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
669
+ box-shadow: none; overflow: hidden;
670
+ }
671
+ .chat-msg .chat-tool[open] { background: var(--bg); }
672
+ .chat-msg .chat-tool .chat-tool-head {
673
+ display: flex; align-items: center; gap: var(--space-2);
674
+ padding: var(--space-2) var(--space-3); cursor: pointer;
675
+ font-size: var(--fs-sm); list-style: none;
676
+ }
677
+ .chat-msg .chat-tool .chat-tool-head::-webkit-details-marker { display: none; }
678
+ .chat-msg .chat-tool .chat-tool-head:hover { background: var(--bg-2); }
679
+ .chat-tool-icon { display: inline-flex; color: var(--fg-3); }
680
+ .chat-tool-name { font-family: var(--ff-mono); font-weight: 600; color: var(--fg); }
681
+ .chat-tool-label { color: var(--fg-3); font-size: var(--fs-tiny); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
682
+ .chat-tool-status {
683
+ margin-left: auto; flex: 0 0 auto;
684
+ font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
685
+ color: var(--fg-3);
686
+ padding: 2px var(--space-2); border-radius: var(--r-pill);
687
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
688
+ }
689
+ .chat-msg .chat-tool.tool-running .chat-tool-status { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
690
+ .chat-msg .chat-tool.tool-error .chat-tool-status { color: var(--flame); background: color-mix(in oklab, var(--flame) 12%, transparent); }
691
+ .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); }
692
+ .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
693
+ .chat-tool-section-label { font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--fg-3); }
694
+ .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; }
695
+ .chat-tool-pre.is-error { color: var(--flame); }
696
+ .chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
697
+
698
+ /* Fenced-code language tab on every rendered-markdown block (not just the
699
+ structured CodeNode). injectCodeCopy reads the language- class. */
700
+ .chat-code-block { position: relative; }
701
+ .chat-code-lang {
702
+ position: absolute; top: 0; left: 0; z-index: 2;
703
+ padding: 2px var(--space-2); border-bottom-right-radius: var(--r-1);
704
+ font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: .04em;
705
+ color: var(--fg-3); background: color-mix(in oklab, var(--fg) 6%, transparent);
706
+ pointer-events: none;
707
+ }
708
+ .chat-code-block pre { padding-top: calc(var(--space-3) + 4px); }
709
+
710
+ /* Motion + microinteraction polish (all reduced-motion guarded). */
711
+ .ds-session-row { transition: background var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease); }
712
+ @media (prefers-reduced-motion: no-preference) {
713
+ .agentchat-thread { scroll-behavior: smooth; }
714
+ .ds-alert { animation: ds-alert-in var(--dur-base) var(--ease); }
715
+ }
716
+ @keyframes ds-alert-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
717
+ .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); }
718
+ .chat-msg-action { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
719
+ .agentchat-install-copy { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
720
+ @media (prefers-reduced-motion: no-preference) {
721
+ .btn.is-armed, .btn-primary.is-armed { animation: ds-arm-pulse var(--dur-slow) var(--ease); }
722
+ }
723
+ @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); } }
724
+ .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); }
725
+ @media (prefers-reduced-motion: no-preference) {
726
+ .ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
727
+ }
728
+ @keyframes ds-card-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
729
+
730
+ /* Live command-center: status-bucket groups + header breakdown + heartbeat. */
731
+ .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
732
+ .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); }
733
+ .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
734
+ .ds-dash-breakdown .seg.is-running { color: var(--green); font-weight: 600; }
735
+ .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
736
+ .ds-dash-breakdown .seg.is-idle { color: var(--amber, #d9a93a); }
737
+ .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
738
+ .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); }
739
+ .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
740
+ .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); }
741
+
742
+ /* Conversation-rail loading skeleton (cold ccsniff walk). */
743
+ .ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
744
+ .ds-session-row-skeleton .ds-skel { background: var(--bg-3); border-radius: var(--r-1); }
745
+ .ds-session-row-skeleton .ds-skel-title { height: 12px; width: 70%; }
746
+ .ds-session-row-skeleton .ds-skel-meta { height: 9px; width: 45%; }
747
+ @media (prefers-reduced-motion: no-preference) {
748
+ .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%; }
749
+ }
750
+ @keyframes ds-skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
751
+
752
+ /* File code preview: paint Prism tokens (the bundle scoped them to the chat
753
+ block only) + an optional non-selectable line-number gutter. */
754
+ .ds-preview-code code { color: var(--fg); }
755
+ .ds-preview-code .token.comment, .ds-preview-code .token.prolog, .ds-preview-code .token.doctype, .ds-preview-code .token.cdata { color: var(--fg-3); }
756
+ .ds-preview-code .token.punctuation { color: var(--fg-2); }
757
+ .ds-preview-code .token.property, .ds-preview-code .token.tag, .ds-preview-code .token.boolean, .ds-preview-code .token.number, .ds-preview-code .token.constant, .ds-preview-code .token.symbol { color: var(--purple-2, #7F18A4); }
758
+ .ds-preview-code .token.selector, .ds-preview-code .token.attr-name, .ds-preview-code .token.string, .ds-preview-code .token.char, .ds-preview-code .token.builtin { color: var(--green-2, #3A9A34); }
759
+ .ds-preview-code .token.atrule, .ds-preview-code .token.attr-value, .ds-preview-code .token.keyword { color: var(--sky, #3A6EFF); }
760
+ .ds-preview-code .token.function, .ds-preview-code .token.class-name { color: var(--flame); }
761
+ .ds-preview-code.has-gutter { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0 var(--space-2); }
762
+ .ds-preview-code.has-gutter code { display: block; min-width: 0; overflow-x: auto; }
763
+ .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; }
764
+
765
+ /* Image preview: fit/actual control + alpha checkerboard. */
766
+ .ds-preview-media-controls { display: flex; gap: var(--space-2); padding: var(--space-2); justify-content: center; }
767
+ .ds-preview-media-alpha {
768
+ 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%);
769
+ background-size: 16px 16px; background-position: 0 0, 0 8px, 8px -8px, -8px 0;
770
+ }
771
+ .ds-preview-media.is-actual { max-width: none; max-height: none; }