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/dist/247420.css
CHANGED
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
--ink: #131318;
|
|
21
21
|
--ink-2: #25252C;
|
|
22
22
|
--ink-3: #54545A; /* WCAG AAA on --paper (~7.1:1); was #6A6A70 (AA only) */
|
|
23
|
+
--ink-3-dark: #464650; /* dark theme bg-3 (tier-3 surface) */
|
|
24
|
+
--paper-3-dark: #B4B4BC; /* dark theme fg-3 (tier-3 text) */
|
|
23
25
|
|
|
24
26
|
/* Lore palette */
|
|
25
27
|
--green: #247420;
|
|
@@ -252,10 +254,10 @@
|
|
|
252
254
|
color-scheme: dark;
|
|
253
255
|
--bg: var(--ink);
|
|
254
256
|
--bg-2: var(--ink-2);
|
|
255
|
-
--bg-3:
|
|
257
|
+
--bg-3: var(--ink-3-dark);
|
|
256
258
|
--fg: var(--paper);
|
|
257
259
|
--fg-2: var(--paper-2);
|
|
258
|
-
--fg-3:
|
|
260
|
+
--fg-3: var(--paper-3-dark);
|
|
259
261
|
--panel-bg: var(--bg);
|
|
260
262
|
--panel-bg-2: var(--bg-2);
|
|
261
263
|
--panel-0: var(--bg);
|
|
@@ -282,18 +284,20 @@
|
|
|
282
284
|
--code-num: var(--sun);
|
|
283
285
|
}
|
|
284
286
|
|
|
285
|
-
/* NOTE: the [data-theme="auto"] block below
|
|
286
|
-
[data-theme="ink"/"dark"] block above.
|
|
287
|
-
|
|
288
|
-
|
|
287
|
+
/* NOTE: the [data-theme="auto"] block below mirrors the
|
|
288
|
+
[data-theme="ink"/"dark"] block above token-for-token. 'auto + OS-dark' and
|
|
289
|
+
'explicit dark' are the same visual context and resolve every token —
|
|
290
|
+
including --danger — identically. The two are kept as separate selectors
|
|
291
|
+
only because one is media-gated; a future de-drift can consolidate them into
|
|
292
|
+
a shared selector list once a build step can hoist the media query. */
|
|
289
293
|
@media (prefers-color-scheme: dark) {
|
|
290
294
|
.ds-247420[data-theme="auto"] {
|
|
291
295
|
--bg: var(--ink);
|
|
292
296
|
--bg-2: var(--ink-2);
|
|
293
|
-
--bg-3:
|
|
297
|
+
--bg-3: var(--ink-3-dark);
|
|
294
298
|
--fg: var(--paper);
|
|
295
299
|
--fg-2: var(--paper-2);
|
|
296
|
-
--fg-3:
|
|
300
|
+
--fg-3: var(--paper-3-dark);
|
|
297
301
|
--panel-bg: var(--bg);
|
|
298
302
|
--panel-bg-2: var(--bg-2);
|
|
299
303
|
--panel-0: var(--bg);
|
|
@@ -306,6 +310,7 @@
|
|
|
306
310
|
--accent: var(--accent-bright, var(--green-2));
|
|
307
311
|
--accent-fg: var(--ink);
|
|
308
312
|
--accent-bright: var(--green-2);
|
|
313
|
+
--danger: oklch(0.68 0.19 25);
|
|
309
314
|
--flame: #FF5A1F;
|
|
310
315
|
--amber: #D9A93A;
|
|
311
316
|
--warn: #FF5A52;
|
|
@@ -375,7 +380,7 @@
|
|
|
375
380
|
--fg: var(--ink); --fg-2: var(--ink-2); --fg-3: var(--ink-3);
|
|
376
381
|
--accent: var(--green); --accent-fg: var(--paper);
|
|
377
382
|
/* A paper island under a dark ancestor must not inherit the dark signal pair. */
|
|
378
|
-
--flame: #C53E00; --amber: #8A6512;
|
|
383
|
+
--flame: #C53E00; --amber: #8A6512; --warn: #E0241A; --sky: #3A6EFF;
|
|
379
384
|
}
|
|
380
385
|
|
|
381
386
|
/* thebird — warm-paper brand preset. A first-class swappable theme: it lives
|
|
@@ -899,7 +904,7 @@
|
|
|
899
904
|
.ds-247420 .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
|
|
900
905
|
.ds-247420 .ds-icon-btn-primary:hover { background: var(--fg); color: var(--bg); }
|
|
901
906
|
/* warn = destructive ACTION tone; flame stays exclusively error STATUS. */
|
|
902
|
-
.ds-247420 .ds-icon-btn-danger { background: var(--warn); color: var(--
|
|
907
|
+
.ds-247420 .ds-icon-btn-danger { background: var(--warn); color: var(--on-color); }
|
|
903
908
|
.ds-247420 .ds-icon-btn-danger:hover { filter: brightness(1.1); }
|
|
904
909
|
.ds-247420 .ds-icon-btn:active { transform: translateY(1px); }
|
|
905
910
|
.ds-247420 .ds-icon-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
@@ -921,10 +926,10 @@
|
|
|
921
926
|
.ds-247420 .ds-badge.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
|
|
922
927
|
.ds-247420 .ds-badge.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
|
|
923
928
|
.ds-247420 .ds-badge.tone-sun { background: var(--sun); color: var(--ink); }
|
|
924
|
-
.ds-247420 .ds-badge.tone-flame { background: var(--flame); color: var(--
|
|
929
|
+
.ds-247420 .ds-badge.tone-flame { background: var(--flame); color: var(--on-color); }
|
|
925
930
|
.ds-247420 .ds-badge.tone-live { background: var(--green-tint); color: var(--green-deep); }
|
|
926
931
|
.ds-247420 .ds-badge.tone-wip { background: var(--bg-3); color: var(--fg-2); }
|
|
927
|
-
.ds-247420 .ds-badge.tone-error { background: var(--flame); color: var(--
|
|
932
|
+
.ds-247420 .ds-badge.tone-error { background: var(--flame); color: var(--on-color); }
|
|
928
933
|
.ds-247420 .ds-badge.tone-success { background: var(--green-tint); color: var(--green-deep); }
|
|
929
934
|
.ds-247420 .ds-badge.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
|
|
930
935
|
|
|
@@ -941,14 +946,14 @@
|
|
|
941
946
|
.ds-247420 .chip.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
|
|
942
947
|
.ds-247420 .chip.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
|
|
943
948
|
.ds-247420 .chip.tone-sun { background: var(--sun); color: var(--ink); }
|
|
944
|
-
.ds-247420 .chip.tone-flame { background: var(--flame); color: var(--
|
|
949
|
+
.ds-247420 .chip.tone-flame { background: var(--flame); color: var(--on-color); }
|
|
945
950
|
.ds-247420 .chip.tone-live { background: var(--green-tint); color: var(--green-deep); }
|
|
946
951
|
.ds-247420 .chip.tone-wip { background: var(--bg-3); color: var(--fg-2); }
|
|
947
|
-
.ds-247420 .chip.tone-error { background: var(--flame); color: var(--
|
|
952
|
+
.ds-247420 .chip.tone-error { background: var(--flame); color: var(--on-color); }
|
|
948
953
|
.ds-247420 .chip.tone-success { background: var(--green-tint); color: var(--green-deep); }
|
|
949
954
|
.ds-247420 .chip.tone-disabled { background: var(--bg-3); color: var(--fg-3); }
|
|
950
955
|
.ds-247420 .chip.tone-ok { background: var(--green-tint); color: var(--green-deep); }
|
|
951
|
-
.ds-247420 .chip.tone-miss { background: var(--flame); color: var(--
|
|
956
|
+
.ds-247420 .chip.tone-miss { background: var(--flame); color: var(--on-color); }
|
|
952
957
|
.ds-247420 .chip.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
|
|
953
958
|
|
|
954
959
|
.ds-247420 .glyph {
|
|
@@ -987,6 +992,8 @@
|
|
|
987
992
|
font-family: var(--ff-mono); letter-spacing: 0;
|
|
988
993
|
}
|
|
989
994
|
.ds-247420 .panel-body { padding: var(--space-2) var(--space-3) var(--space-3); }
|
|
995
|
+
.ds-247420 .panel-body > * { margin: 0; }
|
|
996
|
+
.ds-247420 .panel-body > * + * { margin-top: var(--space-3); }
|
|
990
997
|
.ds-247420 .panel.panel-wide .panel-body { padding: 0; }
|
|
991
998
|
|
|
992
999
|
/* ============================================================
|
|
@@ -1009,6 +1016,21 @@
|
|
|
1009
1016
|
transition: background var(--dur-snap) var(--ease);
|
|
1010
1017
|
}
|
|
1011
1018
|
.ds-247420 .row + .row { margin-top: 2px; }
|
|
1019
|
+
/* `detail` drops to its own full-width line. The row is a grid, so span every
|
|
1020
|
+
track (grid-column 1/-1); flex-basis:100% covers the flex-row fallback. */
|
|
1021
|
+
.ds-247420 .ds-row-detail {
|
|
1022
|
+
white-space: pre-wrap;
|
|
1023
|
+
font-family: var(--ff-mono);
|
|
1024
|
+
font-size: var(--fs-sm);
|
|
1025
|
+
line-height: var(--lh-snug, 1.3);
|
|
1026
|
+
margin-top: 8px;
|
|
1027
|
+
padding: 10px 12px;
|
|
1028
|
+
background: var(--bg);
|
|
1029
|
+
border-radius: var(--r-1);
|
|
1030
|
+
overflow-x: auto;
|
|
1031
|
+
flex-basis: 100%;
|
|
1032
|
+
grid-column: 1 / -1;
|
|
1033
|
+
}
|
|
1012
1034
|
.ds-247420 .row::before {
|
|
1013
1035
|
content: '';
|
|
1014
1036
|
position: absolute; left: 7px; top: 0; bottom: 0; width: 3px;
|
|
@@ -1392,8 +1414,6 @@
|
|
|
1392
1414
|
.ds-247420 .chat-msg:hover { padding: 4px 0; margin: 0; background: transparent; }
|
|
1393
1415
|
.ds-247420 .chat-composer { padding: 8px; gap: 6px; }
|
|
1394
1416
|
.ds-247420 .chat-composer textarea { padding: 10px 12px; font-size: var(--fs-sm); }
|
|
1395
|
-
.ds-247420 .chat-composer .send,
|
|
1396
|
-
.ds-247420 .chat-composer button { width: 40px; height: 40px; font-size: 16px; }
|
|
1397
1417
|
|
|
1398
1418
|
/* KPI Cards */
|
|
1399
1419
|
.ds-247420 .kpi {
|
|
@@ -1782,13 +1802,14 @@
|
|
|
1782
1802
|
background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
|
|
1783
1803
|
}
|
|
1784
1804
|
.ds-247420 .ds-density-btn {
|
|
1785
|
-
|
|
1805
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
1806
|
+
width: 28px; height: 28px; color: var(--fg-2);
|
|
1786
1807
|
background: none; border: none; cursor: pointer;
|
|
1787
|
-
padding:
|
|
1808
|
+
padding: 0; border-radius: calc(var(--r-1) - 2px);
|
|
1788
1809
|
transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
|
|
1789
1810
|
}
|
|
1790
1811
|
.ds-247420 .ds-density-btn:hover { color: var(--fg); }
|
|
1791
|
-
.ds-247420 .ds-density-btn.active { background: var(--accent-tint); color: var(--
|
|
1812
|
+
.ds-247420 .ds-density-btn.active { background: var(--accent-tint); color: var(--fg); }
|
|
1792
1813
|
.ds-247420 .ds-density-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
1793
1814
|
|
|
1794
1815
|
/* Compact density — tighter rows for long listings. */
|
|
@@ -1813,6 +1834,10 @@
|
|
|
1813
1834
|
.ds-247420 .ds-file-cell.active { border-color: var(--accent); background: var(--accent-tint); }
|
|
1814
1835
|
.ds-247420 .ds-file-cell.is-marked { border-color: var(--accent); background: var(--accent-tint); }
|
|
1815
1836
|
.ds-247420 .ds-file-cell.is-locked { opacity: 0.6; }
|
|
1837
|
+
.ds-247420 .ds-file-row.is-locked { opacity: 0.6; }
|
|
1838
|
+
.ds-247420 .ds-file-row.is-restricted .title { color: var(--fg-2); }
|
|
1839
|
+
.ds-247420 .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; }
|
|
1840
|
+
.ds-247420 .ds-file-perm-tag.is-noaccess { color: var(--flame); border-color: color-mix(in srgb, var(--flame) 40%, transparent); }
|
|
1816
1841
|
.ds-247420 .ds-file-cell-open {
|
|
1817
1842
|
display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1);
|
|
1818
1843
|
width: 100%; padding: var(--space-1); margin: 0;
|
|
@@ -2209,6 +2234,10 @@
|
|
|
2209
2234
|
border-radius: var(--r-2); font-size: var(--fs-xs);
|
|
2210
2235
|
}
|
|
2211
2236
|
.ds-247420 .ds-shortcut-row { display: flex; align-items: center; gap: var(--space-2); }
|
|
2237
|
+
.ds-247420 .ds-shortcuts-hint .ds-kbd-label { flex: 1 1 auto; opacity: .85; }
|
|
2238
|
+
.ds-247420 .ds-shortcuts-hint .ds-kbd { white-space: normal; max-width: 100%; }
|
|
2239
|
+
.ds-247420 .ds-kbd-caps { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px; }
|
|
2240
|
+
.ds-247420 .ds-kbd-sep { color: var(--fg-3); font-size: var(--fs-micro); padding: 0 2px; }
|
|
2212
2241
|
.ds-247420 .ds-kbd {
|
|
2213
2242
|
display: inline-block; min-width: 0;
|
|
2214
2243
|
padding: 2px 7px; border-radius: 6px;
|
|
@@ -2233,6 +2262,7 @@
|
|
|
2233
2262
|
transition: color var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
|
|
2234
2263
|
}
|
|
2235
2264
|
.ds-247420 .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
|
|
2265
|
+
.ds-247420 .ds-segmented .ds-seg-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
2236
2266
|
.ds-247420 .ds-segmented .ds-seg-btn.is-on {
|
|
2237
2267
|
background: var(--bg); color: var(--fg);
|
|
2238
2268
|
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
|
|
@@ -2380,9 +2410,19 @@
|
|
|
2380
2410
|
color: color-mix(in oklab, currentColor 75%, transparent); font-style: italic;
|
|
2381
2411
|
}
|
|
2382
2412
|
.ds-247420 .chat-bubble.chat-md pre {
|
|
2383
|
-
background:
|
|
2384
|
-
|
|
2385
|
-
|
|
2413
|
+
background: var(--bg);
|
|
2414
|
+
border: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
|
|
2415
|
+
padding: 12px 16px; border-radius: var(--r-1); overflow-x: auto;
|
|
2416
|
+
font-family: var(--ff-mono); font-size: var(--fs-xs); line-height: 1.55;
|
|
2417
|
+
color: var(--fg); margin: 8px 0;
|
|
2418
|
+
}
|
|
2419
|
+
/* When injectCodeCopy has wrapped the fence (.chat-code-block), reserve room
|
|
2420
|
+
for the absolute .chat-code-lang tab. This selector outranks the bare
|
|
2421
|
+
.chat-code-block pre reservation in chat.css, which the 2-class md pre
|
|
2422
|
+
selector above would otherwise override. */
|
|
2423
|
+
.ds-247420 .chat-code-block .chat-bubble.chat-md pre,
|
|
2424
|
+
.ds-247420 .chat-bubble.chat-md .chat-code-block pre {
|
|
2425
|
+
padding-top: calc(var(--space-3) + 4px);
|
|
2386
2426
|
}
|
|
2387
2427
|
/* Markdown tables + horizontal rules: agents routinely emit them, but they were
|
|
2388
2428
|
unstyled (bare unspaced cells, vanished rules). */
|
|
@@ -2618,6 +2658,14 @@
|
|
|
2618
2658
|
border-color: var(--accent);
|
|
2619
2659
|
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 18%, transparent);
|
|
2620
2660
|
}
|
|
2661
|
+
.ds-247420 .chat-composer.is-error,
|
|
2662
|
+
.ds-247420 .chat-composer:has(textarea[aria-invalid="true"]) {
|
|
2663
|
+
border-color: var(--flame);
|
|
2664
|
+
}
|
|
2665
|
+
.ds-247420 .chat-composer.is-error:focus-within,
|
|
2666
|
+
.ds-247420 .chat-composer:has(textarea[aria-invalid="true"]):focus-within {
|
|
2667
|
+
box-shadow: 0 0 0 2px color-mix(in oklab, var(--flame) 22%, transparent);
|
|
2668
|
+
}
|
|
2621
2669
|
.ds-247420 .chat-composer textarea {
|
|
2622
2670
|
flex: 1; min-width: 0; padding: 8px 4px;
|
|
2623
2671
|
background: none; color: var(--fg);
|
|
@@ -2633,7 +2681,7 @@
|
|
|
2633
2681
|
.ds-247420 .chat-composer textarea::placeholder { color: var(--fg-3); }
|
|
2634
2682
|
.ds-247420 .chat-composer textarea:focus { background: none; border: none; box-shadow: none; outline: none; }
|
|
2635
2683
|
.ds-247420 .chat-composer .send {
|
|
2636
|
-
|
|
2684
|
+
border-radius: var(--r-1);
|
|
2637
2685
|
background: var(--accent); color: var(--accent-fg);
|
|
2638
2686
|
border: 0; cursor: pointer;
|
|
2639
2687
|
display: inline-flex; align-items: center; justify-content: center;
|
|
@@ -2641,10 +2689,10 @@
|
|
|
2641
2689
|
transition: background var(--dur-snap, .15s) var(--ease, ease);
|
|
2642
2690
|
}
|
|
2643
2691
|
.ds-247420 .chat-composer .send:disabled { opacity: .5; cursor: not-allowed; }
|
|
2644
|
-
/* Ghost icon buttons in the toolbar (attach / emoji / more)
|
|
2645
|
-
|
|
2692
|
+
/* Ghost icon buttons in the toolbar (attach / emoji / more). Size + radius are
|
|
2693
|
+
owned by .chat-composer-toolbar .composer-btn in chat.css (32px / --r-1,
|
|
2694
|
+
44px coarse); this base rule keeps only the shared appearance. */
|
|
2646
2695
|
.ds-247420 .composer-btn {
|
|
2647
|
-
width: 40px; height: 40px; border-radius: 50%;
|
|
2648
2696
|
background: transparent; color: var(--fg-3);
|
|
2649
2697
|
border: 0; cursor: pointer;
|
|
2650
2698
|
display: inline-flex; align-items: center; justify-content: center;
|
|
@@ -2662,6 +2710,12 @@
|
|
|
2662
2710
|
.ds-247420 .chat-composer .send:disabled {
|
|
2663
2711
|
background: var(--bg-3); color: var(--fg-3); cursor: not-allowed; transform: none;
|
|
2664
2712
|
}
|
|
2713
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2714
|
+
.ds-247420 .chat-composer,
|
|
2715
|
+
.ds-247420 .chat-composer textarea,
|
|
2716
|
+
.ds-247420 .chat-composer .send,
|
|
2717
|
+
.ds-247420 .composer-btn { transition: none; }
|
|
2718
|
+
}
|
|
2665
2719
|
|
|
2666
2720
|
.ds-247420 .aicat-portrait { display: inline-flex; align-items: center; gap: 10px; padding: 4px 0; }
|
|
2667
2721
|
.ds-247420 .aicat-face {
|
|
@@ -2740,9 +2794,6 @@
|
|
|
2740
2794
|
@media (max-height: 500px) and (orientation: landscape) {
|
|
2741
2795
|
.ds-247420 .chat-composer { padding: 6px 0; }
|
|
2742
2796
|
.ds-247420 .chat-composer textarea { min-height: 44px; max-height: 120px; }
|
|
2743
|
-
/* Keep the send button at the 44x44 minimum tap target even in the
|
|
2744
|
-
space-constrained landscape layout. */
|
|
2745
|
-
.ds-247420 .chat-composer .send, .ds-247420 .chat-composer button { width: 44px; height: 44px; font-size: 14px; }
|
|
2746
2797
|
}
|
|
2747
2798
|
|
|
2748
2799
|
/* ============================================================
|
|
@@ -2878,7 +2929,6 @@
|
|
|
2878
2929
|
position: absolute;
|
|
2879
2930
|
left: 0; right: 0; height: 2px;
|
|
2880
2931
|
background: var(--accent);
|
|
2881
|
-
animation: pulse-line 0.6s ease-in-out infinite;
|
|
2882
2932
|
}
|
|
2883
2933
|
.ds-247420 .list-item.drag-before::before { top: -2px; }
|
|
2884
2934
|
.ds-247420 .list-item.drag-after::after { bottom: -2px; }
|
|
@@ -2887,6 +2937,10 @@
|
|
|
2887
2937
|
0%, 100% { opacity: 0.3; }
|
|
2888
2938
|
50% { opacity: 1; }
|
|
2889
2939
|
}
|
|
2940
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
2941
|
+
.ds-247420 .list-item.drag-before::before,
|
|
2942
|
+
.ds-247420 .list-item.drag-after::after { animation: pulse-line 0.6s ease-in-out infinite; }
|
|
2943
|
+
}
|
|
2890
2944
|
|
|
2891
2945
|
/* ------------------------------------------------------------
|
|
2892
2946
|
Context Menu Styles
|
|
@@ -2901,7 +2955,6 @@
|
|
|
2901
2955
|
min-width: 160px;
|
|
2902
2956
|
z-index: calc(var(--z-overlay, 1000) + 1);
|
|
2903
2957
|
padding: 4px 0;
|
|
2904
|
-
animation: context-menu-in 0.15s ease-out;
|
|
2905
2958
|
}
|
|
2906
2959
|
|
|
2907
2960
|
@keyframes context-menu-in {
|
|
@@ -2914,6 +2967,9 @@
|
|
|
2914
2967
|
transform: scale(1) translateY(0);
|
|
2915
2968
|
}
|
|
2916
2969
|
}
|
|
2970
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
2971
|
+
.ds-247420 .ds-context-menu { animation: context-menu-in 0.15s ease-out; }
|
|
2972
|
+
}
|
|
2917
2973
|
|
|
2918
2974
|
.ds-247420 .ds-context-menu-item {
|
|
2919
2975
|
display: flex; align-items: center; gap: 10px;
|
|
@@ -3168,6 +3224,10 @@
|
|
|
3168
3224
|
padding: var(--space-8) var(--space-4);
|
|
3169
3225
|
text-align: center; color: var(--fg-3);
|
|
3170
3226
|
}
|
|
3227
|
+
.ds-247420 .empty-state--inline {
|
|
3228
|
+
flex-direction: row; align-items: center; gap: var(--space-2);
|
|
3229
|
+
padding: var(--space-2) 0; text-align: left;
|
|
3230
|
+
}
|
|
3171
3231
|
.ds-247420 .empty-state-icon {
|
|
3172
3232
|
font-size: 48px; opacity: 0.4;
|
|
3173
3233
|
}
|
|
@@ -3212,7 +3272,6 @@
|
|
|
3212
3272
|
padding: var(--space-3) var(--space-4);
|
|
3213
3273
|
max-width: 320px;
|
|
3214
3274
|
box-shadow: 0 10px 40px color-mix(in oklab, var(--fg) 20%, transparent);
|
|
3215
|
-
animation: toast-slide-in 0.3s ease-out;
|
|
3216
3275
|
z-index: calc(var(--z-overlay, 1000) + 10);
|
|
3217
3276
|
}
|
|
3218
3277
|
|
|
@@ -3226,6 +3285,9 @@
|
|
|
3226
3285
|
transform: translateX(0);
|
|
3227
3286
|
}
|
|
3228
3287
|
}
|
|
3288
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
3289
|
+
.ds-247420 .toast { animation: toast-slide-in 0.3s ease-out; }
|
|
3290
|
+
}
|
|
3229
3291
|
|
|
3230
3292
|
.ds-247420 .toast.error { border-color: var(--warn); }
|
|
3231
3293
|
.ds-247420 .toast.success { border-color: var(--green-2); }
|
|
@@ -3252,11 +3314,13 @@
|
|
|
3252
3314
|
height: 4px;
|
|
3253
3315
|
border-radius: 50%;
|
|
3254
3316
|
background: var(--accent);
|
|
3255
|
-
animation: ds-bounce 1.4s infinite ease-in-out;
|
|
3256
3317
|
}
|
|
3257
|
-
|
|
3258
|
-
.ds-247420 .ds-spinner span
|
|
3259
|
-
.ds-247420 .ds-spinner span:nth-child(
|
|
3318
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
3319
|
+
.ds-247420 .ds-spinner span { animation: ds-bounce 1.4s infinite ease-in-out; }
|
|
3320
|
+
.ds-247420 .ds-spinner span:nth-child(1) { animation-delay: 0s; }
|
|
3321
|
+
.ds-247420 .ds-spinner span:nth-child(2) { animation-delay: 0.18s; }
|
|
3322
|
+
.ds-247420 .ds-spinner span:nth-child(3) { animation-delay: 0.36s; }
|
|
3323
|
+
}
|
|
3260
3324
|
|
|
3261
3325
|
.ds-247420 .ds-spinner-lg { height: 24px; gap: 6px; }
|
|
3262
3326
|
.ds-247420 .ds-spinner-lg span { width: 6px; height: 6px; }
|
|
@@ -3534,6 +3598,13 @@
|
|
|
3534
3598
|
@media (max-width: 1480px) { .ds-247420 .ws-resizer.ws-resizer-pane { display: none; } }
|
|
3535
3599
|
@media (max-width: 1100px) { .ds-247420 .ws-resizer.ws-resizer-sessions { display: none; } }
|
|
3536
3600
|
@media (max-width: 900px) { .ds-247420 .ws-resizer { display: none; } }
|
|
3601
|
+
/* A resizer must also vanish once its TRACK is desktop-collapsed: a 0px (pane/
|
|
3602
|
+
sessions) or 60px icon-only (rail) track has no width to drag, and a drag would
|
|
3603
|
+
write an INLINE --ws-*-w that overrides the collapse var (inline wins), fighting
|
|
3604
|
+
the collapse state. Mirror the breakpoint guards for the collapse classes. */
|
|
3605
|
+
.ds-247420 .ws-rail-collapsed .ws-resizer-rail,
|
|
3606
|
+
.ds-247420 .ws-sessions-collapsed .ws-resizer-sessions,
|
|
3607
|
+
.ds-247420 .ws-pane-collapsed .ws-resizer-pane { display: none; }
|
|
3537
3608
|
/* Coarse-pointer hit target for hybrid touch laptops above the drawer breakpoint
|
|
3538
3609
|
(the 8px sliver is un-grabbable by touch). */
|
|
3539
3610
|
@media (pointer: coarse) { .ds-247420 .ws-resizer { width: 16px; margin-right: -8px; } }
|
|
@@ -3634,16 +3705,11 @@
|
|
|
3634
3705
|
overflow: hidden; transition: width var(--dur-base) var(--ease);
|
|
3635
3706
|
}
|
|
3636
3707
|
.ds-247420 .ws-pane-collapsed .ws-pane { width: 0; border-left: none; }
|
|
3637
|
-
.ds-247420 .ws-pane-collapsed .ws-pane >
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
width:
|
|
3641
|
-
display: inline-flex; align-items: center; justify-content: center;
|
|
3642
|
-
background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); color: var(--fg-2);
|
|
3643
|
-
border-radius: var(--r-1); cursor: pointer; z-index: 2;
|
|
3708
|
+
.ds-247420 .ws-pane-collapsed .ws-pane > * { display: none; }
|
|
3709
|
+
@media (pointer: coarse) {
|
|
3710
|
+
.ds-247420 .ws-rail-toggle { width: 44px; height: 44px; }
|
|
3711
|
+
.ds-247420 .ws-drawer-toggle { width: 44px; height: 44px; }
|
|
3644
3712
|
}
|
|
3645
|
-
.ds-247420 .ws-pane-toggle:hover { background: var(--bg-3); color: var(--fg); }
|
|
3646
|
-
.ds-247420 .ws-pane-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
3647
3713
|
|
|
3648
3714
|
/* Drawer toggles and the scrim are hidden by default and revealed by the staged
|
|
3649
3715
|
media blocks BELOW - these base rules must precede those blocks in source
|
|
@@ -3656,6 +3722,10 @@
|
|
|
3656
3722
|
.ds-247420 .ws-desktop-toggle:hover { background: var(--bg-2); color: var(--fg); }
|
|
3657
3723
|
.ds-247420 .ws-desktop-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
3658
3724
|
@media (max-width: 900px) { .ds-247420 .ws-desktop-toggle { display: none; } }
|
|
3725
|
+
/* The pane collapse toggle is meaningless once the pane TRACK is dropped (the
|
|
3726
|
+
pane becomes a mobile overlay drawer at <=1480px, reached via its own
|
|
3727
|
+
drawer-toggle), so hide this crumb control past that breakpoint. */
|
|
3728
|
+
@media (max-width: 1480px) { .ds-247420 .ws-pane-toggle { display: none; } }
|
|
3659
3729
|
.ds-247420 .ws-scrim { display: none; }
|
|
3660
3730
|
|
|
3661
3731
|
/* Responsive: the columns yield to the CONTENT in stages - the main column is
|
|
@@ -3692,9 +3762,7 @@
|
|
|
3692
3762
|
}
|
|
3693
3763
|
.ds-247420 .ws-shell.ws-pane-open .ws-pane { transform: translateX(0); width: min(340px, 85vw); }
|
|
3694
3764
|
.ds-247420 .ws-shell.ws-pane-open.ws-pane-collapsed .ws-pane { border-left: var(--bw-hair) solid var(--bg-3); }
|
|
3695
|
-
.ds-247420 .ws-shell.ws-pane-open.ws-pane-collapsed .ws-pane >
|
|
3696
|
-
/* The desktop collapse chevron is meaningless in drawer mode. */
|
|
3697
|
-
.ds-247420 .ws-pane-toggle { display: none; }
|
|
3765
|
+
.ds-247420 .ws-shell.ws-pane-open.ws-pane-collapsed .ws-pane > * { display: revert; }
|
|
3698
3766
|
.ds-247420 .ws-pane-drawer-toggle { display: inline-flex; }
|
|
3699
3767
|
/* Scrim is always present from this stage down so it FADES with the drawer
|
|
3700
3768
|
instead of hard-appearing; pointer-events gate keeps it inert while closed. */
|
|
@@ -3766,6 +3834,11 @@
|
|
|
3766
3834
|
.ds-247420 .ws-drawer-toggle:hover { background: var(--bg-2); color: var(--fg); }
|
|
3767
3835
|
.ds-247420 .ws-drawer-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
3768
3836
|
|
|
3837
|
+
@media (prefers-reduced-motion: reduce) {
|
|
3838
|
+
.ds-247420 .ws-shell, .ds-247420 .ws-rail, .ds-247420 .ws-pane, .ds-247420 .ws-sessions, .ds-247420 .ws-scrim { transition: none; }
|
|
3839
|
+
.ds-247420 .ws-resizer::after { transition: none; }
|
|
3840
|
+
}
|
|
3841
|
+
|
|
3769
3842
|
/* ============================================================
|
|
3770
3843
|
Row title highlight, expanded-row actions, filter pills.
|
|
3771
3844
|
============================================================ */
|
|
@@ -3796,7 +3869,7 @@
|
|
|
3796
3869
|
transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
|
|
3797
3870
|
}
|
|
3798
3871
|
.ds-247420 .ds-filter-pill:hover { background: var(--bg-3); color: var(--fg); }
|
|
3799
|
-
.ds-247420 .ds-filter-pill.active { background: var(--accent-tint); color: var(--
|
|
3872
|
+
.ds-247420 .ds-filter-pill.active { background: var(--accent-tint); color: var(--fg); border-color: var(--accent); }
|
|
3800
3873
|
.ds-247420 .ds-filter-pill:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
3801
3874
|
|
|
3802
3875
|
/* Touch floor for the new small controls. */
|
|
@@ -4854,6 +4927,16 @@
|
|
|
4854
4927
|
border-radius: var(--r-1);
|
|
4855
4928
|
}
|
|
4856
4929
|
|
|
4930
|
+
/* ThreadPanel / Forum / Page interactive elements */
|
|
4931
|
+
.ds-247420 .cm-tp-item:focus-visible,
|
|
4932
|
+
.ds-247420 .cm-forum-item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r-1); }
|
|
4933
|
+
.ds-247420 .cm-tp-new:focus-visible,
|
|
4934
|
+
.ds-247420 .cm-tp-close:focus-visible,
|
|
4935
|
+
.ds-247420 .cm-forum-new:focus-visible,
|
|
4936
|
+
.ds-247420 .cm-forum-sort:focus-visible,
|
|
4937
|
+
.ds-247420 .cm-page-edit:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-1); }
|
|
4938
|
+
.ds-247420 .cm-forum-search:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent); }
|
|
4939
|
+
|
|
4857
4940
|
/* ---------- mobile header ---------- */
|
|
4858
4941
|
.ds-247420 .cm-mobile-header {
|
|
4859
4942
|
display: flex;
|
|
@@ -5434,23 +5517,26 @@
|
|
|
5434
5517
|
background: none;
|
|
5435
5518
|
border: 1px solid var(--rule);
|
|
5436
5519
|
color: inherit;
|
|
5437
|
-
border-radius:
|
|
5520
|
+
border-radius: var(--r-1);
|
|
5438
5521
|
padding: 2px 8px;
|
|
5439
5522
|
cursor: pointer;
|
|
5440
5523
|
font: inherit;
|
|
5441
5524
|
}
|
|
5442
5525
|
.ds-247420 .agentchat-cwd-btn:hover { border-color: var(--accent); }
|
|
5443
|
-
.ds-247420 .agentchat-cwd-btn:focus-visible { outline:
|
|
5526
|
+
.ds-247420 .agentchat-cwd-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
5444
5527
|
.ds-247420 .agentchat-cwd-input {
|
|
5445
5528
|
flex: 1;
|
|
5446
5529
|
min-width: 12ch;
|
|
5447
5530
|
background: var(--bg-2);
|
|
5448
|
-
border:
|
|
5531
|
+
border: var(--bw-hair) solid var(--rule);
|
|
5449
5532
|
color: var(--fg);
|
|
5450
|
-
border-radius:
|
|
5533
|
+
border-radius: var(--r-1);
|
|
5451
5534
|
padding: 4px 8px;
|
|
5452
5535
|
font: inherit;
|
|
5453
5536
|
}
|
|
5537
|
+
.ds-247420 .agentchat-cwd-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
|
|
5538
|
+
.ds-247420 .agentchat-cwd-input[aria-invalid='true'] { border-color: var(--flame); box-shadow: inset 0 0 0 var(--bw-hair) var(--flame); }
|
|
5539
|
+
.ds-247420 .agentchat-cwd-input[aria-busy='true'] { border-color: var(--fg-3); box-shadow: inset 0 0 0 var(--bw-hair) var(--fg-3); }
|
|
5454
5540
|
|
|
5455
5541
|
/* head + thread */
|
|
5456
5542
|
.ds-247420 .agentchat-head {
|
|
@@ -5658,17 +5744,28 @@
|
|
|
5658
5744
|
/* Each variant carries a non-colour channel (fill vs halo vs hollow ring) so the
|
|
5659
5745
|
states stay distinguishable for colour-blind users and when stale/connecting
|
|
5660
5746
|
would otherwise share a hue. Mirrors the rail-tone shape differentiation. */
|
|
5661
|
-
|
|
5747
|
+
/* One canonical stale tone (disc + word + rail share it) — a muted grey-warn,
|
|
5748
|
+
deliberately desaturated so it is NOT the saturated --amber used by
|
|
5749
|
+
connecting/connecting-stream (which would re-collide hues). */
|
|
5750
|
+
.ds-247420 { --stale: color-mix(in oklab, var(--warn) 70%, var(--fg-3)); }
|
|
5751
|
+
/* Live: a persistent faint concentric ring (resting shape channel, independent
|
|
5752
|
+
of motion) with the pulse layered on top — so even at the pulse trough the
|
|
5753
|
+
disc reads as solid-fill + ring, never a bare solid that aliases stale. */
|
|
5754
|
+
.ds-247420 .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; }
|
|
5662
5755
|
.ds-247420 .status-dot-disc.status-dot-error { background: var(--flame); box-shadow: 0 0 0 1.5px color-mix(in oklab, var(--flame) 38%, transparent); }
|
|
5663
5756
|
.ds-247420 .status-dot-disc.status-dot-connecting { background: transparent; box-shadow: inset 0 0 0 2px var(--amber); }
|
|
5664
|
-
|
|
5757
|
+
/* Stale: a muted ring with a hollow centre — silhouette distinct from live's
|
|
5758
|
+
filled disc and connecting's amber hollow ring (hue + inset core). */
|
|
5759
|
+
.ds-247420 .status-dot-disc.status-dot-stale { background: transparent; box-shadow: inset 0 0 0 1px var(--stale), inset 0 0 0 3px var(--bg); }
|
|
5665
5760
|
@keyframes status-disc-pulse {
|
|
5666
|
-
|
|
5667
|
-
|
|
5761
|
+
/* First shadow is the persistent resting ring; second is the animated halo —
|
|
5762
|
+
the ring is always present so the trough never collapses to a bare solid. */
|
|
5763
|
+
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); }
|
|
5764
|
+
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); }
|
|
5668
5765
|
}
|
|
5669
5766
|
@media (prefers-reduced-motion: reduce) {
|
|
5670
|
-
/*
|
|
5671
|
-
.ds-247420 .status-dot-disc.status-dot-live { animation: none;
|
|
5767
|
+
/* The base rule already carries the persistent ring; just stop the pulse. */
|
|
5768
|
+
.ds-247420 .status-dot-disc.status-dot-live { animation: none; }
|
|
5672
5769
|
}
|
|
5673
5770
|
|
|
5674
5771
|
/* ----------------------------------------------------------------------------
|
|
@@ -5690,18 +5787,14 @@
|
|
|
5690
5787
|
}
|
|
5691
5788
|
.ds-247420 .ds-session-new > span { display: none; }
|
|
5692
5789
|
.ds-247420 .ds-session-new:hover { background: var(--bg-2); color: var(--fg); }
|
|
5693
|
-
|
|
5790
|
+
/* Rail filter uses the shared .ds-search-input primitive (provides bg/border/
|
|
5791
|
+
radius/focus-ring); only the rail layout + touch floor live here. */
|
|
5792
|
+
.ds-247420 .ds-session-head .ds-search-input { order: 1; flex: 1 1 auto; min-width: 0; }
|
|
5694
5793
|
.ds-247420 .ds-session-new:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
5695
|
-
.ds-247420 .ds-session-search {
|
|
5696
|
-
width: 100%; padding: var(--space-1) var(--space-3); min-height: 36px;
|
|
5697
|
-
background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); color: var(--fg);
|
|
5698
|
-
border-radius: var(--r-1); font-family: var(--ff-body); font-size: var(--fs-sm);
|
|
5699
|
-
}
|
|
5700
|
-
.ds-247420 .ds-session-search:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent); }
|
|
5701
5794
|
/* Touch floor (must FOLLOW the base rules - same specificity, order decides). */
|
|
5702
5795
|
@media (pointer: coarse) {
|
|
5703
5796
|
.ds-247420 .ds-session-new { width: 44px; min-height: 44px; }
|
|
5704
|
-
.ds-247420 .ds-session-search { min-height: 44px; }
|
|
5797
|
+
.ds-247420 .ds-session-head .ds-search-input { min-height: 44px; }
|
|
5705
5798
|
}
|
|
5706
5799
|
.ds-247420 .ds-session-list, .ds-247420 .ds-session-groups { flex: 1; min-height: 0; overflow-y: auto; padding: var(--space-2); }
|
|
5707
5800
|
/* Grouped rows (Today/Yesterday/...) lay out like the flat list; the section
|
|
@@ -5835,7 +5928,7 @@
|
|
|
5835
5928
|
}
|
|
5836
5929
|
.ds-247420 button.chat-composer-context { cursor: pointer; }
|
|
5837
5930
|
.ds-247420 button.chat-composer-context:hover { color: var(--fg-2); }
|
|
5838
|
-
.ds-247420 button.chat-composer-context:focus-visible { outline:
|
|
5931
|
+
.ds-247420 button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
5839
5932
|
|
|
5840
5933
|
/* Composer send/cancel button row: a non-wrapping cluster pinned to the
|
|
5841
5934
|
bottom-right of the flex-end composer (was unstyled, so the send button
|
|
@@ -5855,7 +5948,7 @@
|
|
|
5855
5948
|
.ds-247420 .agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
|
|
5856
5949
|
|
|
5857
5950
|
/* --- C1: stale/idle dashboard status (static, NOT pulsing). --- */
|
|
5858
|
-
.ds-247420 .ds-dash-status.is-stale { color: var(--
|
|
5951
|
+
.ds-247420 .ds-dash-status.is-stale { color: var(--stale); }
|
|
5859
5952
|
.ds-247420 .ds-dash-status.is-running { color: var(--accent); }
|
|
5860
5953
|
|
|
5861
5954
|
/* --- C2: dashboard sort/filter toolbar + stream-state line. --- */
|
|
@@ -5880,7 +5973,7 @@
|
|
|
5880
5973
|
border-radius: var(--r-1); background: var(--bg-2); color: var(--fg-2);
|
|
5881
5974
|
cursor: pointer; font-family: var(--ff-body); font-size: var(--fs-tiny);
|
|
5882
5975
|
}
|
|
5883
|
-
.ds-247420 .ds-dash-errors-toggle.active { background: var(--accent-tint); color: var(--
|
|
5976
|
+
.ds-247420 .ds-dash-errors-toggle.active { background: var(--accent-tint); color: var(--fg); border-color: var(--accent); }
|
|
5884
5977
|
.ds-247420 .ds-dash-errors-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
5885
5978
|
|
|
5886
5979
|
/* --- C3: per-card select checkbox. --- */
|
|
@@ -5899,7 +5992,7 @@
|
|
|
5899
5992
|
/* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
|
|
5900
5993
|
agent is flagged in a dense grid, not merely faded near-invisibly. The word
|
|
5901
5994
|
'idle' co-carries state, so this stays colour-blind safe. */
|
|
5902
|
-
.ds-247420 .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--
|
|
5995
|
+
.ds-247420 .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--stale); }
|
|
5903
5996
|
|
|
5904
5997
|
/* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
|
|
5905
5998
|
|
|
@@ -6009,7 +6102,7 @@
|
|
|
6009
6102
|
font: inherit; color: inherit; text-decoration: underline dotted;
|
|
6010
6103
|
}
|
|
6011
6104
|
.ds-247420 .chat-composer-context-bit:hover { color: var(--fg-2); }
|
|
6012
|
-
.ds-247420 .chat-composer-context-bit:focus-visible { outline:
|
|
6105
|
+
.ds-247420 .chat-composer-context-bit:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
6013
6106
|
@media (pointer: coarse) {
|
|
6014
6107
|
.ds-247420 .chat-composer-context-bit { min-height: 44px; }
|
|
6015
6108
|
}
|
|
@@ -6048,6 +6141,7 @@
|
|
|
6048
6141
|
/* Inline cwd validation line (checking / error) under the cwd input. */
|
|
6049
6142
|
.ds-247420 .agentchat-cwd-hint { font-size: var(--fs-tiny); color: var(--fg-3); }
|
|
6050
6143
|
.ds-247420 .agentchat-cwd-hint.is-error { color: var(--flame); }
|
|
6144
|
+
.ds-247420 .agentchat-cwd-hint.is-checking { color: var(--fg-2); font-style: italic; }
|
|
6051
6145
|
|
|
6052
6146
|
/* Dashboard: shared session title heading (same string as the rails). */
|
|
6053
6147
|
.ds-247420 .ds-dash-title {
|
|
@@ -6088,6 +6182,11 @@
|
|
|
6088
6182
|
.ds-247420 .chat-msg-flat.you .chat-role { color: var(--accent); }
|
|
6089
6183
|
.ds-247420 .chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
|
|
6090
6184
|
.ds-247420 .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
|
|
6185
|
+
/* Flat user turns reset their bubble to transparent, but the messenger rule
|
|
6186
|
+
(.chat-msg.you .chat-bubble code) tints inline code on --accent-fg, which is
|
|
6187
|
+
invisible/wrong on the bare page surface. Reset to the neutral fg-10% tint the
|
|
6188
|
+
sibling assistant turns get (wins over app-shell.css by later source order). */
|
|
6189
|
+
.ds-247420 .chat-msg-flat.you .chat-bubble code { background: color-mix(in oklab, var(--fg) 10%, transparent); }
|
|
6091
6190
|
/* Flat turns strip the bubble padding, so the role label sat 4px above the first
|
|
6092
6191
|
paragraph and the .them tint hugged text flush. Restore reading rhythm + give
|
|
6093
6192
|
the tinted assistant row inner breathing room so it reads as a card. */
|
|
@@ -6111,6 +6210,16 @@
|
|
|
6111
6210
|
ladder stays monotonic): assistant 5% > its 3% rest; user 4% > transparent. */
|
|
6112
6211
|
.ds-247420 .chat-msg-flat.them:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
|
|
6113
6212
|
.ds-247420 .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 4%, transparent); }
|
|
6213
|
+
/* A turn whose only assistant content is a bordered tool card or code block
|
|
6214
|
+
already carries its own --bg surface + rule border; the turn-level .them tint
|
|
6215
|
+
would stack a second, wider-than-measure surface behind it. Suppress it so the
|
|
6216
|
+
card is the single surface (claude.ai/code keeps tool cards on bare canvas).
|
|
6217
|
+
Selectors mirror the breakout pair above so suppression + widening always
|
|
6218
|
+
cover the same turns. */
|
|
6219
|
+
.ds-247420 .chat-msg-flat.them:has(.chat-tool),
|
|
6220
|
+
.ds-247420 .chat-msg-flat.them:has(.chat-bubble.chat-code),
|
|
6221
|
+
.ds-247420 .chat-msg-flat.them:has(.chat-tool):hover,
|
|
6222
|
+
.ds-247420 .chat-msg-flat.them:has(.chat-bubble.chat-code):hover { background: none; }
|
|
6114
6223
|
.ds-247420 .chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
|
|
6115
6224
|
.ds-247420 .chat-msg-flat .chat-avatar { display: none; }
|
|
6116
6225
|
|
|
@@ -6132,6 +6241,7 @@
|
|
|
6132
6241
|
}
|
|
6133
6242
|
.ds-247420 .chat-msg .chat-tool .chat-tool-head::-webkit-details-marker { display: none; }
|
|
6134
6243
|
.ds-247420 .chat-msg .chat-tool .chat-tool-head:hover { background: var(--bg-2); }
|
|
6244
|
+
.ds-247420 .chat-msg .chat-tool .chat-tool-head:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
|
|
6135
6245
|
.ds-247420 .chat-tool-icon { display: inline-flex; color: var(--fg-3); }
|
|
6136
6246
|
.ds-247420 .chat-tool-name { font-family: var(--ff-mono); font-weight: 600; color: var(--fg); }
|
|
6137
6247
|
.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; }
|
|
@@ -6149,7 +6259,10 @@
|
|
|
6149
6259
|
.ds-247420 .chat-msg .chat-tool.tool-done .chat-tool-status { color: var(--success); background: color-mix(in oklab, var(--success) 12%, transparent); }
|
|
6150
6260
|
.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); }
|
|
6151
6261
|
.ds-247420 .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
|
|
6152
|
-
.ds-247420 .chat-tool-section-label { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); }
|
|
6262
|
+
.ds-247420 .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); }
|
|
6263
|
+
.ds-247420 .chat-tool-copy { position: static; opacity: 0; }
|
|
6264
|
+
.ds-247420 .chat-tool-section:hover .chat-tool-copy, .ds-247420 .chat-tool-section:focus-within .chat-tool-copy { opacity: 1; }
|
|
6265
|
+
.ds-247420 .chat-tool-copy:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }
|
|
6153
6266
|
.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; }
|
|
6154
6267
|
.ds-247420 .chat-tool-pre.is-error { color: var(--flame); }
|
|
6155
6268
|
.ds-247420 .chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
|
|
@@ -6185,6 +6298,11 @@
|
|
|
6185
6298
|
accent), placed last so its inset bar wins source order over is-active/is-stale.
|
|
6186
6299
|
The full-perimeter border-color (line ~396) stays for extra severity emphasis. */
|
|
6187
6300
|
.ds-247420 .ds-dash-card.is-error { box-shadow: inset 2px 0 0 var(--flame); }
|
|
6301
|
+
/* A newly-arrived AND errored card: keep the LEFT inset bar flame (severity
|
|
6302
|
+
precedence, never accent) while restoring the is-new arrival outline as a
|
|
6303
|
+
full-perimeter accent glow that does not collide with the flame bar. Placed
|
|
6304
|
+
after both is-new and is-error so it wins source order. */
|
|
6305
|
+
.ds-247420 .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); }
|
|
6188
6306
|
@media (prefers-reduced-motion: no-preference) {
|
|
6189
6307
|
.ds-247420 .ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
|
|
6190
6308
|
}
|
|
@@ -6194,13 +6312,23 @@
|
|
|
6194
6312
|
.ds-247420 .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
|
|
6195
6313
|
.ds-247420 .ds-dash-group-label { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); padding: 0 var(--space-1); }
|
|
6196
6314
|
.ds-247420 .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
|
|
6197
|
-
|
|
6198
|
-
|
|
6199
|
-
|
|
6315
|
+
/* Shape-channel discs mirror the .status-dot-disc vocabulary (solid /
|
|
6316
|
+
solid+halo / hollow ring) so a colour-blind user can scan the breakdown by
|
|
6317
|
+
shape, not hue alone. CSS-drawn discs, not glyphs (glyph policy clean). */
|
|
6318
|
+
.ds-247420 .ds-dash-breakdown .seg { display: inline-flex; align-items: center; gap: var(--space-1); font-weight: 600; }
|
|
6319
|
+
.ds-247420 .ds-dash-breakdown .seg::before { content: ''; width: 7px; height: 7px; border-radius: 50%; flex: none; }
|
|
6320
|
+
.ds-247420 .ds-dash-breakdown .seg.is-running { color: var(--accent); }
|
|
6321
|
+
.ds-247420 .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); }
|
|
6322
|
+
.ds-247420 .ds-dash-breakdown .seg.is-error { color: var(--flame); }
|
|
6323
|
+
.ds-247420 .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); }
|
|
6324
|
+
.ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--stale); }
|
|
6325
|
+
.ds-247420 .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); }
|
|
6200
6326
|
.ds-247420 .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
|
|
6201
6327
|
.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); }
|
|
6202
6328
|
.ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
6203
6329
|
.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); }
|
|
6330
|
+
.ds-247420 .ds-dash-clear:hover { color: var(--fg); }
|
|
6331
|
+
.ds-247420 .ds-dash-clear:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; border-radius: var(--r-1); }
|
|
6204
6332
|
|
|
6205
6333
|
/* Conversation-rail loading skeleton (cold ccsniff walk). */
|
|
6206
6334
|
.ds-247420 .ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
|
|
@@ -6268,6 +6396,21 @@
|
|
|
6268
6396
|
.ds-247420 .agentchat-thread { --measure: 84ch; }
|
|
6269
6397
|
}
|
|
6270
6398
|
|
|
6399
|
+
/* Stop/cancel composer control: re-tone the accent send button as a quiet
|
|
6400
|
+
neutral control so 'stop generating' reads as distinct from accent send.
|
|
6401
|
+
Flame/warn stay reserved (flame=error STATUS, warn=destructive ACTION); a
|
|
6402
|
+
neutral quiet tone is the claude-code-aligned read for an in-flight stop. */
|
|
6403
|
+
.ds-247420 .chat-composer .send.cancel {
|
|
6404
|
+
background: var(--bg-3);
|
|
6405
|
+
color: var(--fg);
|
|
6406
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule-strong, var(--rule));
|
|
6407
|
+
}
|
|
6408
|
+
.ds-247420 .chat-composer .send.cancel:hover {
|
|
6409
|
+
background: color-mix(in oklab, var(--fg) 8%, var(--bg-3));
|
|
6410
|
+
filter: none;
|
|
6411
|
+
}
|
|
6412
|
+
.ds-247420 .chat-composer .send.cancel:active { filter: brightness(0.96); }
|
|
6413
|
+
|
|
6271
6414
|
/* editor-primitives.css */
|
|
6272
6415
|
/* editor-primitives.css — chrome for in-engine editors, inspectors, IDEs,
|
|
6273
6416
|
debug HUDs. All rules under .ds-247420 scope (build prefixes). Tokens
|
|
@@ -6470,11 +6613,12 @@
|
|
|
6470
6613
|
font: inherit;
|
|
6471
6614
|
min-width: 0; width: 100%;
|
|
6472
6615
|
}
|
|
6473
|
-
.ds-247420 .ds-ep-propfield-value input:focus,
|
|
6474
|
-
.ds-247420 .ds-ep-propfield-value select:focus,
|
|
6475
|
-
.ds-247420 .ds-ep-propfield-value textarea:focus {
|
|
6616
|
+
.ds-247420 .ds-ep-propfield-value input:focus-visible,
|
|
6617
|
+
.ds-247420 .ds-ep-propfield-value select:focus-visible,
|
|
6618
|
+
.ds-247420 .ds-ep-propfield-value textarea:focus-visible {
|
|
6476
6619
|
outline: none;
|
|
6477
6620
|
border-color: var(--accent);
|
|
6621
|
+
box-shadow: var(--focus-ring-inset);
|
|
6478
6622
|
}
|
|
6479
6623
|
.ds-247420 .ds-ep-propfield-hint {
|
|
6480
6624
|
grid-column: 1 / -1;
|
|
@@ -7392,7 +7536,7 @@
|
|
|
7392
7536
|
.ds-247420 .ds-input-check:checked { background: var(--accent); border-color: var(--accent); }
|
|
7393
7537
|
.ds-247420 .ds-input-check:checked::after {
|
|
7394
7538
|
content: ''; position: absolute; left: 4px; top: 1px;
|
|
7395
|
-
width: 4px; height: 8px; border: solid var(--accent-fg
|
|
7539
|
+
width: 4px; height: 8px; border: solid var(--accent-fg);
|
|
7396
7540
|
border-width: 0 2px 2px 0; transform: rotate(45deg);
|
|
7397
7541
|
}
|
|
7398
7542
|
.ds-247420 .ds-input-check:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
@@ -7434,7 +7578,7 @@
|
|
|
7434
7578
|
-webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
|
|
7435
7579
|
border: 1px solid var(--rule);
|
|
7436
7580
|
border-radius: var(--r-2, 8px);
|
|
7437
|
-
box-shadow:
|
|
7581
|
+
box-shadow: var(--shadow-3);
|
|
7438
7582
|
color: var(--panel-text);
|
|
7439
7583
|
overflow: hidden;
|
|
7440
7584
|
}
|
|
@@ -7705,10 +7849,10 @@
|
|
|
7705
7849
|
.ds-247420 .health-summary { display: flex; flex-wrap: wrap; gap: .4em; margin: .6em 0; }
|
|
7706
7850
|
.ds-247420 .health-chip {
|
|
7707
7851
|
font-family: var(--ff-mono, ui-monospace, monospace);
|
|
7708
|
-
font-size: .8rem; padding: .15em .55em; border-radius: 6px;
|
|
7852
|
+
font-size: .8rem; padding: .15em .55em; border-radius: var(--r-1, 6px);
|
|
7709
7853
|
background: color-mix(in srgb, var(--fg) 8%, transparent);
|
|
7710
7854
|
color: var(--fg-2);
|
|
7711
|
-
border: 1px solid color-mix(in srgb, var(--fg) 12%, transparent);
|
|
7855
|
+
border: var(--bw-hair, 1px) solid color-mix(in srgb, var(--fg) 12%, transparent);
|
|
7712
7856
|
}
|
|
7713
7857
|
.ds-247420 .health-summary.health-ok .health-chip:first-child {
|
|
7714
7858
|
color: var(--accent);
|
|
@@ -7726,9 +7870,9 @@
|
|
|
7726
7870
|
}
|
|
7727
7871
|
.ds-247420 .cwd-bar-btn {
|
|
7728
7872
|
cursor: pointer; font: inherit; line-height: 1.3;
|
|
7729
|
-
padding: .15em .55em; border-radius: 6px;
|
|
7873
|
+
padding: .15em .55em; border-radius: var(--r-1, 6px);
|
|
7730
7874
|
background: color-mix(in srgb, var(--fg) 8%, transparent);
|
|
7731
|
-
border: 1px solid color-mix(in srgb, var(--fg) 14%, transparent);
|
|
7875
|
+
border: var(--bw-hair, 1px) solid color-mix(in srgb, var(--fg) 14%, transparent);
|
|
7732
7876
|
color: var(--fg-2);
|
|
7733
7877
|
}
|
|
7734
7878
|
.ds-247420 .cwd-bar-btn:hover { background: color-mix(in srgb, var(--fg) 14%, transparent); }
|
|
@@ -7801,10 +7945,14 @@
|
|
|
7801
7945
|
}
|
|
7802
7946
|
|
|
7803
7947
|
@media print {
|
|
7948
|
+
/* Re-assert the paper-tuned signal tokens so token-derived foregrounds
|
|
7949
|
+
(status discs, error text, tool cards) print with light-theme colours
|
|
7950
|
+
rather than the dark-theme-derived values inherited under auto-dark. */
|
|
7951
|
+
.ds-247420 { --flame:#C53E00; --amber:#8A6512; --warn:#E0241A; --sky:#3A6EFF; --bg:var(--paper); --fg:var(--ink); }
|
|
7804
7952
|
.ds-247420 #app { min-height: auto; display: block; height: auto; }
|
|
7805
7953
|
.ds-247420 .skip-link, .ds-247420 .status-dot, .ds-247420 .history-actions, .ds-247420 .chat-composer { display: none !important; }
|
|
7806
7954
|
.ds-247420 .app, .ds-247420 .app-main, .ds-247420 .panel, .ds-247420 .chat, .ds-247420 .chat-thread {
|
|
7807
|
-
background:
|
|
7955
|
+
background: var(--paper) !important; color: var(--ink) !important; box-shadow: none !important;
|
|
7808
7956
|
}
|
|
7809
7957
|
}
|
|
7810
7958
|
|
|
@@ -7818,20 +7966,28 @@
|
|
|
7818
7966
|
.ds-247420 .site-panel { margin: var(--space-2); }
|
|
7819
7967
|
|
|
7820
7968
|
/* Hero block */
|
|
7821
|
-
.ds-247420 .site-hero { padding:
|
|
7969
|
+
.ds-247420 .site-hero { padding: var(--space-4); }
|
|
7822
7970
|
.ds-247420 .site-hero-h { margin: 0 0 var(--space-2); }
|
|
7823
7971
|
.ds-247420 .site-hero-body { margin: var(--space-2) 0 var(--space-3); color: var(--fg-2); max-width: 64ch; }
|
|
7824
7972
|
.ds-247420 .site-chip-row { display: flex; gap: 6px; flex-wrap: wrap; margin: 0 0 var(--space-3); }
|
|
7825
7973
|
.ds-247420 .site-cta-row { display: flex; gap: var(--space-2); flex-wrap: wrap; }
|
|
7826
7974
|
|
|
7827
7975
|
/* Quickstart CLI block — these .cli/.prompt/.cmd nodes were previously unstyled. */
|
|
7828
|
-
.ds-247420 .site-cli { padding:
|
|
7829
|
-
.ds-247420 .site-cli .cli { display: flex; gap: var(--space-2); font-family: var(--ff-mono); font-size: var(--fs-sm); padding: 2px 0; }
|
|
7976
|
+
.ds-247420 .site-cli { padding: var(--space-3); background: var(--bg); border: var(--bw-hair, 1px) solid var(--rule); border-radius: var(--r-1); }
|
|
7977
|
+
.ds-247420 .site-cli .cli { display: flex; align-items: baseline; gap: var(--space-2); font-family: var(--ff-mono); font-size: var(--fs-sm); padding: 2px 0; }
|
|
7830
7978
|
.ds-247420 .site-cli .prompt { color: var(--fg-3); user-select: none; flex: 0 0 auto; }
|
|
7831
7979
|
.ds-247420 .site-cli .cmd { color: var(--fg); white-space: pre-wrap; word-break: break-word; }
|
|
7832
7980
|
|
|
7833
|
-
/* Embedded legacy doc (iframe wrapper)
|
|
7834
|
-
|
|
7981
|
+
/* Embedded legacy doc (iframe wrapper). 180px = the page chrome (topbar +
|
|
7982
|
+
* crumb + footer) sitting above the embed; dvh keeps it mobile-safe. */
|
|
7983
|
+
.ds-247420 .site-embed { width: 100%; height: calc(100dvh - 180px); min-height: 320px; border: 0; border-radius: var(--r-1); background: var(--bg-2); display: block; }
|
|
7984
|
+
|
|
7985
|
+
/* Marketing footer family (the in-app .app-status strip suppresses content
|
|
7986
|
+
* below 1100px; the site footer always shows its credits row). */
|
|
7987
|
+
.ds-247420 .site-footer { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); width: 100%; padding: var(--space-3) var(--space-4); font-family: var(--ff-body); font-size: var(--fs-sm); line-height: 1.4; color: var(--fg-3); border-top: 1px solid var(--rule); }
|
|
7988
|
+
.ds-247420 .site-footer .item { color: inherit; }
|
|
7989
|
+
.ds-247420 .site-footer .item:first-of-type { color: var(--accent); }
|
|
7990
|
+
.ds-247420 .site-footer .spread { flex: 1; }
|
|
7835
7991
|
|
|
7836
7992
|
/* spoint/loading-screen.css */
|
|
7837
7993
|
/* Loading-screen kit styles. Scoped under .ds-247420 at build time.
|