anentrypoint-design 0.0.212 → 0.0.214
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 +109 -41
- package/chat.css +87 -27
- package/colors_and_type.css +14 -9
- package/community.css +10 -0
- package/dist/247420.css +248 -92
- package/dist/247420.js +13 -13
- package/package.json +1 -1
- package/src/components/agent-chat.js +1 -0
- package/src/components/chat.js +29 -12
- package/src/components/community.js +1 -1
- package/src/components/content.js +26 -8
- package/src/components/files.js +72 -16
- package/src/components/interaction-primitives.js +22 -0
- package/src/components/sessions.js +10 -7
- package/src/components/shell.js +29 -17
- package/src/components/voice.js +1 -1
- package/src/components.js +1 -1
package/app-shell.css
CHANGED
|
@@ -450,7 +450,7 @@ body.canvas-host { background: transparent !important; }
|
|
|
450
450
|
.ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
|
|
451
451
|
.ds-icon-btn-primary:hover { background: var(--fg); color: var(--bg); }
|
|
452
452
|
/* warn = destructive ACTION tone; flame stays exclusively error STATUS. */
|
|
453
|
-
.ds-icon-btn-danger { background: var(--warn); color: var(--
|
|
453
|
+
.ds-icon-btn-danger { background: var(--warn); color: var(--on-color); }
|
|
454
454
|
.ds-icon-btn-danger:hover { filter: brightness(1.1); }
|
|
455
455
|
.ds-icon-btn:active { transform: translateY(1px); }
|
|
456
456
|
.ds-icon-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
@@ -472,10 +472,10 @@ body.canvas-host { background: transparent !important; }
|
|
|
472
472
|
.ds-badge.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
|
|
473
473
|
.ds-badge.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
|
|
474
474
|
.ds-badge.tone-sun { background: var(--sun); color: var(--ink); }
|
|
475
|
-
.ds-badge.tone-flame { background: var(--flame); color: var(--
|
|
475
|
+
.ds-badge.tone-flame { background: var(--flame); color: var(--on-color); }
|
|
476
476
|
.ds-badge.tone-live { background: var(--green-tint); color: var(--green-deep); }
|
|
477
477
|
.ds-badge.tone-wip { background: var(--bg-3); color: var(--fg-2); }
|
|
478
|
-
.ds-badge.tone-error { background: var(--flame); color: var(--
|
|
478
|
+
.ds-badge.tone-error { background: var(--flame); color: var(--on-color); }
|
|
479
479
|
.ds-badge.tone-success { background: var(--green-tint); color: var(--green-deep); }
|
|
480
480
|
.ds-badge.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
|
|
481
481
|
|
|
@@ -492,14 +492,14 @@ body.canvas-host { background: transparent !important; }
|
|
|
492
492
|
.chip.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
|
|
493
493
|
.chip.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
|
|
494
494
|
.chip.tone-sun { background: var(--sun); color: var(--ink); }
|
|
495
|
-
.chip.tone-flame { background: var(--flame); color: var(--
|
|
495
|
+
.chip.tone-flame { background: var(--flame); color: var(--on-color); }
|
|
496
496
|
.chip.tone-live { background: var(--green-tint); color: var(--green-deep); }
|
|
497
497
|
.chip.tone-wip { background: var(--bg-3); color: var(--fg-2); }
|
|
498
|
-
.chip.tone-error { background: var(--flame); color: var(--
|
|
498
|
+
.chip.tone-error { background: var(--flame); color: var(--on-color); }
|
|
499
499
|
.chip.tone-success { background: var(--green-tint); color: var(--green-deep); }
|
|
500
500
|
.chip.tone-disabled { background: var(--bg-3); color: var(--fg-3); }
|
|
501
501
|
.chip.tone-ok { background: var(--green-tint); color: var(--green-deep); }
|
|
502
|
-
.chip.tone-miss { background: var(--flame); color: var(--
|
|
502
|
+
.chip.tone-miss { background: var(--flame); color: var(--on-color); }
|
|
503
503
|
.chip.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
|
|
504
504
|
|
|
505
505
|
.glyph {
|
|
@@ -538,6 +538,8 @@ body.canvas-host { background: transparent !important; }
|
|
|
538
538
|
font-family: var(--ff-mono); letter-spacing: 0;
|
|
539
539
|
}
|
|
540
540
|
.panel-body { padding: var(--space-2) var(--space-3) var(--space-3); }
|
|
541
|
+
.panel-body > * { margin: 0; }
|
|
542
|
+
.panel-body > * + * { margin-top: var(--space-3); }
|
|
541
543
|
.panel.panel-wide .panel-body { padding: 0; }
|
|
542
544
|
|
|
543
545
|
/* ============================================================
|
|
@@ -560,6 +562,21 @@ body.canvas-host { background: transparent !important; }
|
|
|
560
562
|
transition: background var(--dur-snap) var(--ease);
|
|
561
563
|
}
|
|
562
564
|
.row + .row { margin-top: 2px; }
|
|
565
|
+
/* `detail` drops to its own full-width line. The row is a grid, so span every
|
|
566
|
+
track (grid-column 1/-1); flex-basis:100% covers the flex-row fallback. */
|
|
567
|
+
.ds-row-detail {
|
|
568
|
+
white-space: pre-wrap;
|
|
569
|
+
font-family: var(--ff-mono);
|
|
570
|
+
font-size: var(--fs-sm);
|
|
571
|
+
line-height: var(--lh-snug, 1.3);
|
|
572
|
+
margin-top: 8px;
|
|
573
|
+
padding: 10px 12px;
|
|
574
|
+
background: var(--bg);
|
|
575
|
+
border-radius: var(--r-1);
|
|
576
|
+
overflow-x: auto;
|
|
577
|
+
flex-basis: 100%;
|
|
578
|
+
grid-column: 1 / -1;
|
|
579
|
+
}
|
|
563
580
|
.row::before {
|
|
564
581
|
content: '';
|
|
565
582
|
position: absolute; left: 7px; top: 0; bottom: 0; width: 3px;
|
|
@@ -943,8 +960,6 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
943
960
|
.chat-msg:hover { padding: 4px 0; margin: 0; background: transparent; }
|
|
944
961
|
.chat-composer { padding: 8px; gap: 6px; }
|
|
945
962
|
.chat-composer textarea { padding: 10px 12px; font-size: var(--fs-sm); }
|
|
946
|
-
.chat-composer .send,
|
|
947
|
-
.chat-composer button { width: 40px; height: 40px; font-size: 16px; }
|
|
948
963
|
|
|
949
964
|
/* KPI Cards */
|
|
950
965
|
.kpi {
|
|
@@ -1333,13 +1348,14 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1333
1348
|
background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
|
|
1334
1349
|
}
|
|
1335
1350
|
.ds-density-btn {
|
|
1336
|
-
|
|
1351
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
1352
|
+
width: 28px; height: 28px; color: var(--fg-2);
|
|
1337
1353
|
background: none; border: none; cursor: pointer;
|
|
1338
|
-
padding:
|
|
1354
|
+
padding: 0; border-radius: calc(var(--r-1) - 2px);
|
|
1339
1355
|
transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
|
|
1340
1356
|
}
|
|
1341
1357
|
.ds-density-btn:hover { color: var(--fg); }
|
|
1342
|
-
.ds-density-btn.active { background: var(--accent-tint); color: var(--
|
|
1358
|
+
.ds-density-btn.active { background: var(--accent-tint); color: var(--fg); }
|
|
1343
1359
|
.ds-density-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
1344
1360
|
|
|
1345
1361
|
/* Compact density — tighter rows for long listings. */
|
|
@@ -1364,6 +1380,10 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1364
1380
|
.ds-file-cell.active { border-color: var(--accent); background: var(--accent-tint); }
|
|
1365
1381
|
.ds-file-cell.is-marked { border-color: var(--accent); background: var(--accent-tint); }
|
|
1366
1382
|
.ds-file-cell.is-locked { opacity: 0.6; }
|
|
1383
|
+
.ds-file-row.is-locked { opacity: 0.6; }
|
|
1384
|
+
.ds-file-row.is-restricted .title { color: var(--fg-2); }
|
|
1385
|
+
.ds-file-perm-tag { font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg-3); padding: 1px 6px; border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1); white-space: nowrap; }
|
|
1386
|
+
.ds-file-perm-tag.is-noaccess { color: var(--flame); border-color: color-mix(in srgb, var(--flame) 40%, transparent); }
|
|
1367
1387
|
.ds-file-cell-open {
|
|
1368
1388
|
display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1);
|
|
1369
1389
|
width: 100%; padding: var(--space-1); margin: 0;
|
|
@@ -1760,6 +1780,10 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1760
1780
|
border-radius: var(--r-2); font-size: var(--fs-xs);
|
|
1761
1781
|
}
|
|
1762
1782
|
.ds-shortcut-row { display: flex; align-items: center; gap: var(--space-2); }
|
|
1783
|
+
.ds-shortcuts-hint .ds-kbd-label { flex: 1 1 auto; opacity: .85; }
|
|
1784
|
+
.ds-shortcuts-hint .ds-kbd { white-space: normal; max-width: 100%; }
|
|
1785
|
+
.ds-kbd-caps { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px; }
|
|
1786
|
+
.ds-kbd-sep { color: var(--fg-3); font-size: var(--fs-micro); padding: 0 2px; }
|
|
1763
1787
|
.ds-kbd {
|
|
1764
1788
|
display: inline-block; min-width: 0;
|
|
1765
1789
|
padding: 2px 7px; border-radius: 6px;
|
|
@@ -1784,6 +1808,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1784
1808
|
transition: color var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
|
|
1785
1809
|
}
|
|
1786
1810
|
.ds-segmented .ds-seg-btn:hover { color: var(--fg); }
|
|
1811
|
+
.ds-segmented .ds-seg-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
1787
1812
|
.ds-segmented .ds-seg-btn.is-on {
|
|
1788
1813
|
background: var(--bg); color: var(--fg);
|
|
1789
1814
|
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
|
|
@@ -1931,9 +1956,19 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1931
1956
|
color: color-mix(in oklab, currentColor 75%, transparent); font-style: italic;
|
|
1932
1957
|
}
|
|
1933
1958
|
.chat-bubble.chat-md pre {
|
|
1934
|
-
background:
|
|
1935
|
-
|
|
1936
|
-
|
|
1959
|
+
background: var(--bg);
|
|
1960
|
+
border: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
|
|
1961
|
+
padding: 12px 16px; border-radius: var(--r-1); overflow-x: auto;
|
|
1962
|
+
font-family: var(--ff-mono); font-size: var(--fs-xs); line-height: 1.55;
|
|
1963
|
+
color: var(--fg); margin: 8px 0;
|
|
1964
|
+
}
|
|
1965
|
+
/* When injectCodeCopy has wrapped the fence (.chat-code-block), reserve room
|
|
1966
|
+
for the absolute .chat-code-lang tab. This selector outranks the bare
|
|
1967
|
+
.chat-code-block pre reservation in chat.css, which the 2-class md pre
|
|
1968
|
+
selector above would otherwise override. */
|
|
1969
|
+
.chat-code-block .chat-bubble.chat-md pre,
|
|
1970
|
+
.chat-bubble.chat-md .chat-code-block pre {
|
|
1971
|
+
padding-top: calc(var(--space-3) + 4px);
|
|
1937
1972
|
}
|
|
1938
1973
|
/* Markdown tables + horizontal rules: agents routinely emit them, but they were
|
|
1939
1974
|
unstyled (bare unspaced cells, vanished rules). */
|
|
@@ -2169,6 +2204,14 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
2169
2204
|
border-color: var(--accent);
|
|
2170
2205
|
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 18%, transparent);
|
|
2171
2206
|
}
|
|
2207
|
+
.chat-composer.is-error,
|
|
2208
|
+
.chat-composer:has(textarea[aria-invalid="true"]) {
|
|
2209
|
+
border-color: var(--flame);
|
|
2210
|
+
}
|
|
2211
|
+
.chat-composer.is-error:focus-within,
|
|
2212
|
+
.chat-composer:has(textarea[aria-invalid="true"]):focus-within {
|
|
2213
|
+
box-shadow: 0 0 0 2px color-mix(in oklab, var(--flame) 22%, transparent);
|
|
2214
|
+
}
|
|
2172
2215
|
.chat-composer textarea {
|
|
2173
2216
|
flex: 1; min-width: 0; padding: 8px 4px;
|
|
2174
2217
|
background: none; color: var(--fg);
|
|
@@ -2184,7 +2227,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
2184
2227
|
.chat-composer textarea::placeholder { color: var(--fg-3); }
|
|
2185
2228
|
.chat-composer textarea:focus { background: none; border: none; box-shadow: none; outline: none; }
|
|
2186
2229
|
.chat-composer .send {
|
|
2187
|
-
|
|
2230
|
+
border-radius: var(--r-1);
|
|
2188
2231
|
background: var(--accent); color: var(--accent-fg);
|
|
2189
2232
|
border: 0; cursor: pointer;
|
|
2190
2233
|
display: inline-flex; align-items: center; justify-content: center;
|
|
@@ -2192,10 +2235,10 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
2192
2235
|
transition: background var(--dur-snap, .15s) var(--ease, ease);
|
|
2193
2236
|
}
|
|
2194
2237
|
.chat-composer .send:disabled { opacity: .5; cursor: not-allowed; }
|
|
2195
|
-
/* Ghost icon buttons in the toolbar (attach / emoji / more)
|
|
2196
|
-
|
|
2238
|
+
/* Ghost icon buttons in the toolbar (attach / emoji / more). Size + radius are
|
|
2239
|
+
owned by .chat-composer-toolbar .composer-btn in chat.css (32px / --r-1,
|
|
2240
|
+
44px coarse); this base rule keeps only the shared appearance. */
|
|
2197
2241
|
.composer-btn {
|
|
2198
|
-
width: 40px; height: 40px; border-radius: 50%;
|
|
2199
2242
|
background: transparent; color: var(--fg-3);
|
|
2200
2243
|
border: 0; cursor: pointer;
|
|
2201
2244
|
display: inline-flex; align-items: center; justify-content: center;
|
|
@@ -2213,6 +2256,12 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
2213
2256
|
.chat-composer .send:disabled {
|
|
2214
2257
|
background: var(--bg-3); color: var(--fg-3); cursor: not-allowed; transform: none;
|
|
2215
2258
|
}
|
|
2259
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2260
|
+
.chat-composer,
|
|
2261
|
+
.chat-composer textarea,
|
|
2262
|
+
.chat-composer .send,
|
|
2263
|
+
.composer-btn { transition: none; }
|
|
2264
|
+
}
|
|
2216
2265
|
|
|
2217
2266
|
.aicat-portrait { display: inline-flex; align-items: center; gap: 10px; padding: 4px 0; }
|
|
2218
2267
|
.aicat-face {
|
|
@@ -2291,9 +2340,6 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
2291
2340
|
@media (max-height: 500px) and (orientation: landscape) {
|
|
2292
2341
|
.chat-composer { padding: 6px 0; }
|
|
2293
2342
|
.chat-composer textarea { min-height: 44px; max-height: 120px; }
|
|
2294
|
-
/* Keep the send button at the 44x44 minimum tap target even in the
|
|
2295
|
-
space-constrained landscape layout. */
|
|
2296
|
-
.chat-composer .send, .chat-composer button { width: 44px; height: 44px; font-size: 14px; }
|
|
2297
2343
|
}
|
|
2298
2344
|
|
|
2299
2345
|
/* ============================================================
|
|
@@ -2436,7 +2482,6 @@ input[type="checkbox"], input[type="radio"] {
|
|
|
2436
2482
|
position: absolute;
|
|
2437
2483
|
left: 0; right: 0; height: 2px;
|
|
2438
2484
|
background: var(--accent);
|
|
2439
|
-
animation: pulse-line 0.6s ease-in-out infinite;
|
|
2440
2485
|
}
|
|
2441
2486
|
.list-item.drag-before::before { top: -2px; }
|
|
2442
2487
|
.list-item.drag-after::after { bottom: -2px; }
|
|
@@ -2445,6 +2490,10 @@ input[type="checkbox"], input[type="radio"] {
|
|
|
2445
2490
|
0%, 100% { opacity: 0.3; }
|
|
2446
2491
|
50% { opacity: 1; }
|
|
2447
2492
|
}
|
|
2493
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
2494
|
+
.list-item.drag-before::before,
|
|
2495
|
+
.list-item.drag-after::after { animation: pulse-line 0.6s ease-in-out infinite; }
|
|
2496
|
+
}
|
|
2448
2497
|
|
|
2449
2498
|
/* ------------------------------------------------------------
|
|
2450
2499
|
Context Menu Styles
|
|
@@ -2459,7 +2508,6 @@ input[type="checkbox"], input[type="radio"] {
|
|
|
2459
2508
|
min-width: 160px;
|
|
2460
2509
|
z-index: calc(var(--z-overlay, 1000) + 1);
|
|
2461
2510
|
padding: 4px 0;
|
|
2462
|
-
animation: context-menu-in 0.15s ease-out;
|
|
2463
2511
|
}
|
|
2464
2512
|
|
|
2465
2513
|
@keyframes context-menu-in {
|
|
@@ -2472,6 +2520,9 @@ input[type="checkbox"], input[type="radio"] {
|
|
|
2472
2520
|
transform: scale(1) translateY(0);
|
|
2473
2521
|
}
|
|
2474
2522
|
}
|
|
2523
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
2524
|
+
.ds-context-menu { animation: context-menu-in 0.15s ease-out; }
|
|
2525
|
+
}
|
|
2475
2526
|
|
|
2476
2527
|
.ds-context-menu-item {
|
|
2477
2528
|
display: flex; align-items: center; gap: 10px;
|
|
@@ -2728,6 +2779,10 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
2728
2779
|
padding: var(--space-8) var(--space-4);
|
|
2729
2780
|
text-align: center; color: var(--fg-3);
|
|
2730
2781
|
}
|
|
2782
|
+
.empty-state--inline {
|
|
2783
|
+
flex-direction: row; align-items: center; gap: var(--space-2);
|
|
2784
|
+
padding: var(--space-2) 0; text-align: left;
|
|
2785
|
+
}
|
|
2731
2786
|
.empty-state-icon {
|
|
2732
2787
|
font-size: 48px; opacity: 0.4;
|
|
2733
2788
|
}
|
|
@@ -2772,7 +2827,6 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
2772
2827
|
padding: var(--space-3) var(--space-4);
|
|
2773
2828
|
max-width: 320px;
|
|
2774
2829
|
box-shadow: 0 10px 40px color-mix(in oklab, var(--fg) 20%, transparent);
|
|
2775
|
-
animation: toast-slide-in 0.3s ease-out;
|
|
2776
2830
|
z-index: calc(var(--z-overlay, 1000) + 10);
|
|
2777
2831
|
}
|
|
2778
2832
|
|
|
@@ -2786,6 +2840,9 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
2786
2840
|
transform: translateX(0);
|
|
2787
2841
|
}
|
|
2788
2842
|
}
|
|
2843
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
2844
|
+
.toast { animation: toast-slide-in 0.3s ease-out; }
|
|
2845
|
+
}
|
|
2789
2846
|
|
|
2790
2847
|
.toast.error { border-color: var(--warn); }
|
|
2791
2848
|
.toast.success { border-color: var(--green-2); }
|
|
@@ -2812,11 +2869,13 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
2812
2869
|
height: 4px;
|
|
2813
2870
|
border-radius: 50%;
|
|
2814
2871
|
background: var(--accent);
|
|
2815
|
-
animation: ds-bounce 1.4s infinite ease-in-out;
|
|
2816
2872
|
}
|
|
2817
|
-
|
|
2818
|
-
.ds-spinner span
|
|
2819
|
-
.ds-spinner span:nth-child(
|
|
2873
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
2874
|
+
.ds-spinner span { animation: ds-bounce 1.4s infinite ease-in-out; }
|
|
2875
|
+
.ds-spinner span:nth-child(1) { animation-delay: 0s; }
|
|
2876
|
+
.ds-spinner span:nth-child(2) { animation-delay: 0.18s; }
|
|
2877
|
+
.ds-spinner span:nth-child(3) { animation-delay: 0.36s; }
|
|
2878
|
+
}
|
|
2820
2879
|
|
|
2821
2880
|
.ds-spinner-lg { height: 24px; gap: 6px; }
|
|
2822
2881
|
.ds-spinner-lg span { width: 6px; height: 6px; }
|
|
@@ -3094,6 +3153,13 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
3094
3153
|
@media (max-width: 1480px) { .ws-resizer.ws-resizer-pane { display: none; } }
|
|
3095
3154
|
@media (max-width: 1100px) { .ws-resizer.ws-resizer-sessions { display: none; } }
|
|
3096
3155
|
@media (max-width: 900px) { .ws-resizer { display: none; } }
|
|
3156
|
+
/* A resizer must also vanish once its TRACK is desktop-collapsed: a 0px (pane/
|
|
3157
|
+
sessions) or 60px icon-only (rail) track has no width to drag, and a drag would
|
|
3158
|
+
write an INLINE --ws-*-w that overrides the collapse var (inline wins), fighting
|
|
3159
|
+
the collapse state. Mirror the breakpoint guards for the collapse classes. */
|
|
3160
|
+
.ws-rail-collapsed .ws-resizer-rail,
|
|
3161
|
+
.ws-sessions-collapsed .ws-resizer-sessions,
|
|
3162
|
+
.ws-pane-collapsed .ws-resizer-pane { display: none; }
|
|
3097
3163
|
/* Coarse-pointer hit target for hybrid touch laptops above the drawer breakpoint
|
|
3098
3164
|
(the 8px sliver is un-grabbable by touch). */
|
|
3099
3165
|
@media (pointer: coarse) { .ws-resizer { width: 16px; margin-right: -8px; } }
|
|
@@ -3194,16 +3260,11 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
3194
3260
|
overflow: hidden; transition: width var(--dur-base) var(--ease);
|
|
3195
3261
|
}
|
|
3196
3262
|
.ws-pane-collapsed .ws-pane { width: 0; border-left: none; }
|
|
3197
|
-
.ws-pane-collapsed .ws-pane >
|
|
3198
|
-
|
|
3199
|
-
|
|
3200
|
-
width:
|
|
3201
|
-
display: inline-flex; align-items: center; justify-content: center;
|
|
3202
|
-
background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); color: var(--fg-2);
|
|
3203
|
-
border-radius: var(--r-1); cursor: pointer; z-index: 2;
|
|
3263
|
+
.ws-pane-collapsed .ws-pane > * { display: none; }
|
|
3264
|
+
@media (pointer: coarse) {
|
|
3265
|
+
.ws-rail-toggle { width: 44px; height: 44px; }
|
|
3266
|
+
.ws-drawer-toggle { width: 44px; height: 44px; }
|
|
3204
3267
|
}
|
|
3205
|
-
.ws-pane-toggle:hover { background: var(--bg-3); color: var(--fg); }
|
|
3206
|
-
.ws-pane-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
3207
3268
|
|
|
3208
3269
|
/* Drawer toggles and the scrim are hidden by default and revealed by the staged
|
|
3209
3270
|
media blocks BELOW - these base rules must precede those blocks in source
|
|
@@ -3216,6 +3277,10 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
3216
3277
|
.ws-desktop-toggle:hover { background: var(--bg-2); color: var(--fg); }
|
|
3217
3278
|
.ws-desktop-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
3218
3279
|
@media (max-width: 900px) { .ws-desktop-toggle { display: none; } }
|
|
3280
|
+
/* The pane collapse toggle is meaningless once the pane TRACK is dropped (the
|
|
3281
|
+
pane becomes a mobile overlay drawer at <=1480px, reached via its own
|
|
3282
|
+
drawer-toggle), so hide this crumb control past that breakpoint. */
|
|
3283
|
+
@media (max-width: 1480px) { .ws-pane-toggle { display: none; } }
|
|
3219
3284
|
.ws-scrim { display: none; }
|
|
3220
3285
|
|
|
3221
3286
|
/* Responsive: the columns yield to the CONTENT in stages - the main column is
|
|
@@ -3252,9 +3317,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
3252
3317
|
}
|
|
3253
3318
|
.ws-shell.ws-pane-open .ws-pane { transform: translateX(0); width: min(340px, 85vw); }
|
|
3254
3319
|
.ws-shell.ws-pane-open.ws-pane-collapsed .ws-pane { border-left: var(--bw-hair) solid var(--bg-3); }
|
|
3255
|
-
.ws-shell.ws-pane-open.ws-pane-collapsed .ws-pane >
|
|
3256
|
-
/* The desktop collapse chevron is meaningless in drawer mode. */
|
|
3257
|
-
.ws-pane-toggle { display: none; }
|
|
3320
|
+
.ws-shell.ws-pane-open.ws-pane-collapsed .ws-pane > * { display: revert; }
|
|
3258
3321
|
.ws-pane-drawer-toggle { display: inline-flex; }
|
|
3259
3322
|
/* Scrim is always present from this stage down so it FADES with the drawer
|
|
3260
3323
|
instead of hard-appearing; pointer-events gate keeps it inert while closed. */
|
|
@@ -3326,6 +3389,11 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
3326
3389
|
.ws-drawer-toggle:hover { background: var(--bg-2); color: var(--fg); }
|
|
3327
3390
|
.ws-drawer-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
3328
3391
|
|
|
3392
|
+
@media (prefers-reduced-motion: reduce) {
|
|
3393
|
+
.ws-shell, .ws-rail, .ws-pane, .ws-sessions, .ws-scrim { transition: none; }
|
|
3394
|
+
.ws-resizer::after { transition: none; }
|
|
3395
|
+
}
|
|
3396
|
+
|
|
3329
3397
|
/* ============================================================
|
|
3330
3398
|
Row title highlight, expanded-row actions, filter pills.
|
|
3331
3399
|
============================================================ */
|
|
@@ -3356,7 +3424,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
3356
3424
|
transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
|
|
3357
3425
|
}
|
|
3358
3426
|
.ds-filter-pill:hover { background: var(--bg-3); color: var(--fg); }
|
|
3359
|
-
.ds-filter-pill.active { background: var(--accent-tint); color: var(--
|
|
3427
|
+
.ds-filter-pill.active { background: var(--accent-tint); color: var(--fg); border-color: var(--accent); }
|
|
3360
3428
|
.ds-filter-pill:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
3361
3429
|
|
|
3362
3430
|
/* Touch floor for the new small controls. */
|
package/chat.css
CHANGED
|
@@ -91,23 +91,26 @@
|
|
|
91
91
|
background: none;
|
|
92
92
|
border: 1px solid var(--rule);
|
|
93
93
|
color: inherit;
|
|
94
|
-
border-radius:
|
|
94
|
+
border-radius: var(--r-1);
|
|
95
95
|
padding: 2px 8px;
|
|
96
96
|
cursor: pointer;
|
|
97
97
|
font: inherit;
|
|
98
98
|
}
|
|
99
99
|
.agentchat-cwd-btn:hover { border-color: var(--accent); }
|
|
100
|
-
.agentchat-cwd-btn:focus-visible { outline:
|
|
100
|
+
.agentchat-cwd-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
101
101
|
.agentchat-cwd-input {
|
|
102
102
|
flex: 1;
|
|
103
103
|
min-width: 12ch;
|
|
104
104
|
background: var(--bg-2);
|
|
105
|
-
border:
|
|
105
|
+
border: var(--bw-hair) solid var(--rule);
|
|
106
106
|
color: var(--fg);
|
|
107
|
-
border-radius:
|
|
107
|
+
border-radius: var(--r-1);
|
|
108
108
|
padding: 4px 8px;
|
|
109
109
|
font: inherit;
|
|
110
110
|
}
|
|
111
|
+
.agentchat-cwd-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
|
|
112
|
+
.agentchat-cwd-input[aria-invalid='true'] { border-color: var(--flame); box-shadow: inset 0 0 0 var(--bw-hair) var(--flame); }
|
|
113
|
+
.agentchat-cwd-input[aria-busy='true'] { border-color: var(--fg-3); box-shadow: inset 0 0 0 var(--bw-hair) var(--fg-3); }
|
|
111
114
|
|
|
112
115
|
/* head + thread */
|
|
113
116
|
.agentchat-head {
|
|
@@ -315,17 +318,28 @@
|
|
|
315
318
|
/* Each variant carries a non-colour channel (fill vs halo vs hollow ring) so the
|
|
316
319
|
states stay distinguishable for colour-blind users and when stale/connecting
|
|
317
320
|
would otherwise share a hue. Mirrors the rail-tone shape differentiation. */
|
|
318
|
-
|
|
321
|
+
/* One canonical stale tone (disc + word + rail share it) — a muted grey-warn,
|
|
322
|
+
deliberately desaturated so it is NOT the saturated --amber used by
|
|
323
|
+
connecting/connecting-stream (which would re-collide hues). */
|
|
324
|
+
:root { --stale: color-mix(in oklab, var(--warn) 70%, var(--fg-3)); }
|
|
325
|
+
/* Live: a persistent faint concentric ring (resting shape channel, independent
|
|
326
|
+
of motion) with the pulse layered on top — so even at the pulse trough the
|
|
327
|
+
disc reads as solid-fill + ring, never a bare solid that aliases stale. */
|
|
328
|
+
.status-dot-disc.status-dot-live { background: var(--accent); box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 30%, transparent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
|
|
319
329
|
.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
330
|
.status-dot-disc.status-dot-connecting { background: transparent; box-shadow: inset 0 0 0 2px var(--amber); }
|
|
321
|
-
|
|
331
|
+
/* Stale: a muted ring with a hollow centre — silhouette distinct from live's
|
|
332
|
+
filled disc and connecting's amber hollow ring (hue + inset core). */
|
|
333
|
+
.status-dot-disc.status-dot-stale { background: transparent; box-shadow: inset 0 0 0 1px var(--stale), inset 0 0 0 3px var(--bg); }
|
|
322
334
|
@keyframes status-disc-pulse {
|
|
323
|
-
|
|
324
|
-
|
|
335
|
+
/* First shadow is the persistent resting ring; second is the animated halo —
|
|
336
|
+
the ring is always present so the trough never collapses to a bare solid. */
|
|
337
|
+
0%, 100% { box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 30%, transparent), 0 0 0 2px color-mix(in oklab, var(--accent) 55%, transparent); }
|
|
338
|
+
50% { box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 30%, transparent), 0 0 0 6px color-mix(in oklab, var(--accent) 0%, transparent); }
|
|
325
339
|
}
|
|
326
340
|
@media (prefers-reduced-motion: reduce) {
|
|
327
|
-
/*
|
|
328
|
-
.status-dot-disc.status-dot-live { animation: none;
|
|
341
|
+
/* The base rule already carries the persistent ring; just stop the pulse. */
|
|
342
|
+
.status-dot-disc.status-dot-live { animation: none; }
|
|
329
343
|
}
|
|
330
344
|
|
|
331
345
|
/* ----------------------------------------------------------------------------
|
|
@@ -347,18 +361,14 @@
|
|
|
347
361
|
}
|
|
348
362
|
.ds-session-new > span { display: none; }
|
|
349
363
|
.ds-session-new:hover { background: var(--bg-2); color: var(--fg); }
|
|
350
|
-
|
|
364
|
+
/* Rail filter uses the shared .ds-search-input primitive (provides bg/border/
|
|
365
|
+
radius/focus-ring); only the rail layout + touch floor live here. */
|
|
366
|
+
.ds-session-head .ds-search-input { order: 1; flex: 1 1 auto; min-width: 0; }
|
|
351
367
|
.ds-session-new:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
352
|
-
.ds-session-search {
|
|
353
|
-
width: 100%; padding: var(--space-1) var(--space-3); min-height: 36px;
|
|
354
|
-
background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); color: var(--fg);
|
|
355
|
-
border-radius: var(--r-1); font-family: var(--ff-body); font-size: var(--fs-sm);
|
|
356
|
-
}
|
|
357
|
-
.ds-session-search:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent); }
|
|
358
368
|
/* Touch floor (must FOLLOW the base rules - same specificity, order decides). */
|
|
359
369
|
@media (pointer: coarse) {
|
|
360
370
|
.ds-session-new { width: 44px; min-height: 44px; }
|
|
361
|
-
.ds-session-search { min-height: 44px; }
|
|
371
|
+
.ds-session-head .ds-search-input { min-height: 44px; }
|
|
362
372
|
}
|
|
363
373
|
.ds-session-list, .ds-session-groups { flex: 1; min-height: 0; overflow-y: auto; padding: var(--space-2); }
|
|
364
374
|
/* Grouped rows (Today/Yesterday/...) lay out like the flat list; the section
|
|
@@ -492,7 +502,7 @@
|
|
|
492
502
|
}
|
|
493
503
|
button.chat-composer-context { cursor: pointer; }
|
|
494
504
|
button.chat-composer-context:hover { color: var(--fg-2); }
|
|
495
|
-
button.chat-composer-context:focus-visible { outline:
|
|
505
|
+
button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
496
506
|
|
|
497
507
|
/* Composer send/cancel button row: a non-wrapping cluster pinned to the
|
|
498
508
|
bottom-right of the flex-end composer (was unstyled, so the send button
|
|
@@ -512,7 +522,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
512
522
|
.agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
|
|
513
523
|
|
|
514
524
|
/* --- C1: stale/idle dashboard status (static, NOT pulsing). --- */
|
|
515
|
-
.ds-dash-status.is-stale { color: var(--
|
|
525
|
+
.ds-dash-status.is-stale { color: var(--stale); }
|
|
516
526
|
.ds-dash-status.is-running { color: var(--accent); }
|
|
517
527
|
|
|
518
528
|
/* --- C2: dashboard sort/filter toolbar + stream-state line. --- */
|
|
@@ -537,7 +547,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
537
547
|
border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2);
|
|
538
548
|
cursor: pointer; font-family: var(--ff-body); font-size: var(--fs-tiny);
|
|
539
549
|
}
|
|
540
|
-
.ds-dash-errors-toggle.active { background: var(--accent-tint); color: var(--
|
|
550
|
+
.ds-dash-errors-toggle.active { background: var(--accent-tint); color: var(--fg); border-color: var(--accent); }
|
|
541
551
|
.ds-dash-errors-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
542
552
|
|
|
543
553
|
/* --- C3: per-card select checkbox. --- */
|
|
@@ -556,7 +566,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
556
566
|
/* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
|
|
557
567
|
agent is flagged in a dense grid, not merely faded near-invisibly. The word
|
|
558
568
|
'idle' co-carries state, so this stays colour-blind safe. */
|
|
559
|
-
.ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--
|
|
569
|
+
.ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--stale); }
|
|
560
570
|
|
|
561
571
|
/* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
|
|
562
572
|
|
|
@@ -666,7 +676,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
666
676
|
font: inherit; color: inherit; text-decoration: underline dotted;
|
|
667
677
|
}
|
|
668
678
|
.chat-composer-context-bit:hover { color: var(--fg-2); }
|
|
669
|
-
.chat-composer-context-bit:focus-visible { outline:
|
|
679
|
+
.chat-composer-context-bit:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
670
680
|
@media (pointer: coarse) {
|
|
671
681
|
.chat-composer-context-bit { min-height: 44px; }
|
|
672
682
|
}
|
|
@@ -705,6 +715,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
705
715
|
/* Inline cwd validation line (checking / error) under the cwd input. */
|
|
706
716
|
.agentchat-cwd-hint { font-size: var(--fs-tiny); color: var(--fg-3); }
|
|
707
717
|
.agentchat-cwd-hint.is-error { color: var(--flame); }
|
|
718
|
+
.agentchat-cwd-hint.is-checking { color: var(--fg-2); font-style: italic; }
|
|
708
719
|
|
|
709
720
|
/* Dashboard: shared session title heading (same string as the rails). */
|
|
710
721
|
.ds-dash-title {
|
|
@@ -745,6 +756,11 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
745
756
|
.chat-msg-flat.you .chat-role { color: var(--accent); }
|
|
746
757
|
.chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
|
|
747
758
|
.chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
|
|
759
|
+
/* Flat user turns reset their bubble to transparent, but the messenger rule
|
|
760
|
+
(.chat-msg.you .chat-bubble code) tints inline code on --accent-fg, which is
|
|
761
|
+
invisible/wrong on the bare page surface. Reset to the neutral fg-10% tint the
|
|
762
|
+
sibling assistant turns get (wins over app-shell.css by later source order). */
|
|
763
|
+
.chat-msg-flat.you .chat-bubble code { background: color-mix(in oklab, var(--fg) 10%, transparent); }
|
|
748
764
|
/* Flat turns strip the bubble padding, so the role label sat 4px above the first
|
|
749
765
|
paragraph and the .them tint hugged text flush. Restore reading rhythm + give
|
|
750
766
|
the tinted assistant row inner breathing room so it reads as a card. */
|
|
@@ -768,6 +784,16 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
768
784
|
ladder stays monotonic): assistant 5% > its 3% rest; user 4% > transparent. */
|
|
769
785
|
.chat-msg-flat.them:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
|
|
770
786
|
.chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 4%, transparent); }
|
|
787
|
+
/* A turn whose only assistant content is a bordered tool card or code block
|
|
788
|
+
already carries its own --bg surface + rule border; the turn-level .them tint
|
|
789
|
+
would stack a second, wider-than-measure surface behind it. Suppress it so the
|
|
790
|
+
card is the single surface (claude.ai/code keeps tool cards on bare canvas).
|
|
791
|
+
Selectors mirror the breakout pair above so suppression + widening always
|
|
792
|
+
cover the same turns. */
|
|
793
|
+
.chat-msg-flat.them:has(.chat-tool),
|
|
794
|
+
.chat-msg-flat.them:has(.chat-bubble.chat-code),
|
|
795
|
+
.chat-msg-flat.them:has(.chat-tool):hover,
|
|
796
|
+
.chat-msg-flat.them:has(.chat-bubble.chat-code):hover { background: none; }
|
|
771
797
|
.chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
|
|
772
798
|
.chat-msg-flat .chat-avatar { display: none; }
|
|
773
799
|
|
|
@@ -789,6 +815,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
789
815
|
}
|
|
790
816
|
.chat-msg .chat-tool .chat-tool-head::-webkit-details-marker { display: none; }
|
|
791
817
|
.chat-msg .chat-tool .chat-tool-head:hover { background: var(--bg-2); }
|
|
818
|
+
.chat-msg .chat-tool .chat-tool-head:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
|
|
792
819
|
.chat-tool-icon { display: inline-flex; color: var(--fg-3); }
|
|
793
820
|
.chat-tool-name { font-family: var(--ff-mono); font-weight: 600; color: var(--fg); }
|
|
794
821
|
.chat-tool-label { color: var(--fg-3); font-size: var(--fs-tiny); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
@@ -806,7 +833,10 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
806
833
|
.chat-msg .chat-tool.tool-done .chat-tool-status { color: var(--success); background: color-mix(in oklab, var(--success) 12%, transparent); }
|
|
807
834
|
.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); }
|
|
808
835
|
.chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
|
|
809
|
-
.chat-tool-section-label { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); }
|
|
836
|
+
.chat-tool-section-label { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); }
|
|
837
|
+
.chat-tool-copy { position: static; opacity: 0; }
|
|
838
|
+
.chat-tool-section:hover .chat-tool-copy, .chat-tool-section:focus-within .chat-tool-copy { opacity: 1; }
|
|
839
|
+
.chat-tool-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
|
|
810
840
|
.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; }
|
|
811
841
|
.chat-tool-pre.is-error { color: var(--flame); }
|
|
812
842
|
.chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
|
|
@@ -842,6 +872,11 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
842
872
|
accent), placed last so its inset bar wins source order over is-active/is-stale.
|
|
843
873
|
The full-perimeter border-color (line ~396) stays for extra severity emphasis. */
|
|
844
874
|
.ds-dash-card.is-error { box-shadow: inset 2px 0 0 var(--flame); }
|
|
875
|
+
/* A newly-arrived AND errored card: keep the LEFT inset bar flame (severity
|
|
876
|
+
precedence, never accent) while restoring the is-new arrival outline as a
|
|
877
|
+
full-perimeter accent glow that does not collide with the flame bar. Placed
|
|
878
|
+
after both is-new and is-error so it wins source order. */
|
|
879
|
+
.ds-dash-card.is-new.is-error { box-shadow: inset 2px 0 0 var(--flame), 0 0 0 1px color-mix(in oklab, var(--accent) 40%, transparent); }
|
|
845
880
|
@media (prefers-reduced-motion: no-preference) {
|
|
846
881
|
.ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
|
|
847
882
|
}
|
|
@@ -851,13 +886,23 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
851
886
|
.ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
|
|
852
887
|
.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); }
|
|
853
888
|
.ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
.
|
|
889
|
+
/* Shape-channel discs mirror the .status-dot-disc vocabulary (solid /
|
|
890
|
+
solid+halo / hollow ring) so a colour-blind user can scan the breakdown by
|
|
891
|
+
shape, not hue alone. CSS-drawn discs, not glyphs (glyph policy clean). */
|
|
892
|
+
.ds-dash-breakdown .seg { display: inline-flex; align-items: center; gap: var(--space-1); font-weight: 600; }
|
|
893
|
+
.ds-dash-breakdown .seg::before { content: ''; width: 7px; height: 7px; border-radius: 50%; flex: none; }
|
|
894
|
+
.ds-dash-breakdown .seg.is-running { color: var(--accent); }
|
|
895
|
+
.ds-dash-breakdown .seg.is-running::before { background: var(--accent); box-shadow: 0 0 0 1.5px color-mix(in oklab, var(--accent) 30%, transparent); }
|
|
896
|
+
.ds-dash-breakdown .seg.is-error { color: var(--flame); }
|
|
897
|
+
.ds-dash-breakdown .seg.is-error::before { background: var(--flame); box-shadow: 0 0 0 1.5px color-mix(in oklab, var(--flame) 38%, transparent); }
|
|
898
|
+
.ds-dash-breakdown .seg.is-idle { color: var(--stale); }
|
|
899
|
+
.ds-dash-breakdown .seg.is-idle::before { background: transparent; box-shadow: inset 0 0 0 1px var(--stale), inset 0 0 0 3px var(--bg); }
|
|
857
900
|
.ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
|
|
858
901
|
.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); }
|
|
859
902
|
.ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
860
903
|
.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); }
|
|
904
|
+
.ds-dash-clear:hover { color: var(--fg); }
|
|
905
|
+
.ds-dash-clear:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; border-radius: var(--r-1); }
|
|
861
906
|
|
|
862
907
|
/* Conversation-rail loading skeleton (cold ccsniff walk). */
|
|
863
908
|
.ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
|
|
@@ -925,3 +970,18 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
|
|
|
925
970
|
@media (min-width: 1600px) {
|
|
926
971
|
.agentchat-thread { --measure: 84ch; }
|
|
927
972
|
}
|
|
973
|
+
|
|
974
|
+
/* Stop/cancel composer control: re-tone the accent send button as a quiet
|
|
975
|
+
neutral control so 'stop generating' reads as distinct from accent send.
|
|
976
|
+
Flame/warn stay reserved (flame=error STATUS, warn=destructive ACTION); a
|
|
977
|
+
neutral quiet tone is the claude-code-aligned read for an in-flight stop. */
|
|
978
|
+
.chat-composer .send.cancel {
|
|
979
|
+
background: var(--bg-3);
|
|
980
|
+
color: var(--fg);
|
|
981
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule-strong, var(--rule));
|
|
982
|
+
}
|
|
983
|
+
.chat-composer .send.cancel:hover {
|
|
984
|
+
background: color-mix(in oklab, var(--fg) 8%, var(--bg-3));
|
|
985
|
+
filter: none;
|
|
986
|
+
}
|
|
987
|
+
.chat-composer .send.cancel:active { filter: brightness(0.96); }
|