agentgui 1.0.969 → 1.0.970
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/.claude/workflows/gui-design-consolidation.js +101 -0
- package/AGENTS.md +6 -0
- package/PUNCHLIST-DESIGN.md +196 -0
- package/package.json +1 -1
- package/site/app/index.html +5 -240
- package/site/app/js/app.js +7 -10
- package/site/app/vendor/anentrypoint-design/247420.css +357 -69
- package/site/app/vendor/anentrypoint-design/247420.js +12 -12
|
@@ -199,22 +199,31 @@
|
|
|
199
199
|
--size-sm: 32px;
|
|
200
200
|
--size-base: 42px;
|
|
201
201
|
--size-lg: 56px;
|
|
202
|
+
|
|
203
|
+
/* Unified focus-ring tokens (single source for the design system). Outset
|
|
204
|
+
rings (the default) tokenize colour+width+offset; bordered text fields use
|
|
205
|
+
the inset variant. Deliberate negative offsets on edge-flush/clipping
|
|
206
|
+
containers stay literal. */
|
|
207
|
+
--focus-color: var(--accent);
|
|
208
|
+
--focus-w: 2px;
|
|
209
|
+
--focus-offset: 2px;
|
|
210
|
+
--focus-ring-inset: inset 0 0 0 var(--focus-w) var(--focus-color);
|
|
202
211
|
}
|
|
203
212
|
|
|
204
213
|
/* ============================================================
|
|
205
214
|
Focus-visible styles for keyboard navigation
|
|
206
215
|
============================================================ */
|
|
207
216
|
.ds-247420 :focus-visible {
|
|
208
|
-
outline:
|
|
209
|
-
outline-offset:
|
|
217
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
218
|
+
outline-offset: var(--focus-offset);
|
|
210
219
|
}
|
|
211
220
|
|
|
212
221
|
/* Button variants with focus-visible */
|
|
213
222
|
.ds-247420 .btn:focus-visible,
|
|
214
223
|
.ds-247420 .btn-primary:focus-visible,
|
|
215
224
|
.ds-247420 .btn-ghost:focus-visible {
|
|
216
|
-
outline:
|
|
217
|
-
outline-offset:
|
|
225
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
226
|
+
outline-offset: var(--focus-offset);
|
|
218
227
|
}
|
|
219
228
|
|
|
220
229
|
/* Link focus-visible */
|
|
@@ -262,6 +271,10 @@
|
|
|
262
271
|
--danger: oklch(0.68 0.19 25);
|
|
263
272
|
--flame: #FF5A1F;
|
|
264
273
|
--amber: #D9A93A;
|
|
274
|
+
/* warn/sky dark-tuned pairs (mirror flame/amber): the :root paper values
|
|
275
|
+
(#E0241A / #3A6EFF) are too dark on ink; these clear AA 4.5:1 on --ink. */
|
|
276
|
+
--warn: #FF5A52;
|
|
277
|
+
--sky: #6E9BFF;
|
|
265
278
|
--code-string: var(--green-2);
|
|
266
279
|
--code-keyword: var(--sky);
|
|
267
280
|
--code-fn: var(--flame);
|
|
@@ -295,6 +308,8 @@
|
|
|
295
308
|
--accent-bright: var(--green-2);
|
|
296
309
|
--flame: #FF5A1F;
|
|
297
310
|
--amber: #D9A93A;
|
|
311
|
+
--warn: #FF5A52;
|
|
312
|
+
--sky: #6E9BFF;
|
|
298
313
|
--code-string: var(--green-2);
|
|
299
314
|
--code-keyword: var(--sky);
|
|
300
315
|
--code-fn: var(--flame);
|
|
@@ -1024,8 +1039,13 @@
|
|
|
1024
1039
|
.ds-247420 .row.rail-purple::before,
|
|
1025
1040
|
.ds-247420 .row.rail-flame::before { height: 56%; opacity: 1; }
|
|
1026
1041
|
.ds-247420 .row.rail-green::before { background: var(--accent); }
|
|
1027
|
-
.ds-247420 .row.rail-purple::before { background: var(--purple-2
|
|
1042
|
+
.ds-247420 .row.rail-purple::before { background: var(--purple-2); }
|
|
1028
1043
|
.ds-247420 .row.rail-flame::before { background: var(--flame); }
|
|
1044
|
+
/* Differentiate the rail by SHAPE, not hue alone (color-blind safety): error
|
|
1045
|
+
reads as a taller solid bar, subagent as a dashed/gapped fill, ok stays the
|
|
1046
|
+
short solid bar. Paired with the sr-only status word emitted by Row(). */
|
|
1047
|
+
.ds-247420 .row.rail-flame::before { height: 64%; }
|
|
1048
|
+
.ds-247420 .row.rail-purple::before { background: repeating-linear-gradient(var(--purple-2) 0 4px, transparent 4px 7px); }
|
|
1029
1049
|
.ds-247420 .row-grid { /* explicit grid-template-columns set inline */ }
|
|
1030
1050
|
/* A row with no leading code/index drops the empty first column so the title
|
|
1031
1051
|
takes the full width instead of wrapping in the narrow code gutter. */
|
|
@@ -1261,8 +1281,8 @@
|
|
|
1261
1281
|
border: 0; border-radius: var(--r-2);
|
|
1262
1282
|
box-shadow: inset 0 0 0 1px var(--rule);
|
|
1263
1283
|
}
|
|
1264
|
-
.ds-247420 .row-form input:focus,
|
|
1265
|
-
.ds-247420 .row-form textarea:focus { box-shadow:
|
|
1284
|
+
.ds-247420 .row-form input:focus-visible,
|
|
1285
|
+
.ds-247420 .row-form textarea:focus-visible { box-shadow: var(--focus-ring-inset); }
|
|
1266
1286
|
|
|
1267
1287
|
/* Field char counter (TextField maxLength) */
|
|
1268
1288
|
.ds-247420 .ds-field-count {
|
|
@@ -1283,9 +1303,9 @@
|
|
|
1283
1303
|
Responsive Design — Mobile (480px), Tablet (1024px), Desktop (1440px+)
|
|
1284
1304
|
============================================================ */
|
|
1285
1305
|
|
|
1286
|
-
/*
|
|
1306
|
+
/* --------------------------------------------------------------------
|
|
1287
1307
|
Mobile Portrait Breakpoint (480px and below)
|
|
1288
|
-
|
|
1308
|
+
---------------------------------------------------------------------- */
|
|
1289
1309
|
@media (max-width: 480px) {
|
|
1290
1310
|
/* App Layout: single-column + drawer is handled once in the ≤900px block;
|
|
1291
1311
|
no need to re-declare grid-template-columns here (was a redundant !important). */
|
|
@@ -1409,9 +1429,9 @@
|
|
|
1409
1429
|
.ds-247420 .cli .copy { padding: 6px 12px; font-size: var(--fs-micro); }
|
|
1410
1430
|
}
|
|
1411
1431
|
|
|
1412
|
-
/*
|
|
1432
|
+
/* --------------------------------------------------------------------
|
|
1413
1433
|
Container Query Responsive (720px and below)
|
|
1414
|
-
|
|
1434
|
+
---------------------------------------------------------------------- */
|
|
1415
1435
|
@container (max-width: 760px) {
|
|
1416
1436
|
.ds-247420 .app-body { grid-template-columns: 1fr !important; }
|
|
1417
1437
|
.ds-247420 .app-side-shell { border-right: 0; border-bottom: 1px solid var(--rule); }
|
|
@@ -1421,9 +1441,9 @@
|
|
|
1421
1441
|
.ds-247420 .row .sub { grid-column: 1 / -1; order: 3; }
|
|
1422
1442
|
}
|
|
1423
1443
|
|
|
1424
|
-
/*
|
|
1444
|
+
/* --------------------------------------------------------------------
|
|
1425
1445
|
Tablet Landscape Breakpoint (768px to 1024px)
|
|
1426
|
-
|
|
1446
|
+
---------------------------------------------------------------------- */
|
|
1427
1447
|
@media (min-width: 481px) and (max-width: 1024px) {
|
|
1428
1448
|
/* App Layout — side handled by 900px drawer block; restore for 901-1024 */
|
|
1429
1449
|
.ds-247420 .app-side a {
|
|
@@ -1500,9 +1520,9 @@
|
|
|
1500
1520
|
}
|
|
1501
1521
|
}
|
|
1502
1522
|
|
|
1503
|
-
/*
|
|
1523
|
+
/* --------------------------------------------------------------------
|
|
1504
1524
|
Mid Breakpoint (768px and below) — collapse sidebar + simplify row grid
|
|
1505
|
-
|
|
1525
|
+
---------------------------------------------------------------------- */
|
|
1506
1526
|
@media (max-width: 768px) {
|
|
1507
1527
|
/* Sidebar stacks above main rather than sitting beside it */
|
|
1508
1528
|
.ds-247420 .app-body { grid-template-columns: 1fr; }
|
|
@@ -1517,9 +1537,9 @@
|
|
|
1517
1537
|
.ds-247420 .row .sub { grid-column: 1 / -1; }
|
|
1518
1538
|
}
|
|
1519
1539
|
|
|
1520
|
-
/*
|
|
1540
|
+
/* --------------------------------------------------------------------
|
|
1521
1541
|
Desktop Breakpoint Enhancements (1025px and up)
|
|
1522
|
-
|
|
1542
|
+
---------------------------------------------------------------------- */
|
|
1523
1543
|
@media (min-width: 1025px) {
|
|
1524
1544
|
/* Chat Bubbles */
|
|
1525
1545
|
.ds-247420 .chat-stack { max-width: min(70%, 480px); }
|
|
@@ -1540,7 +1560,7 @@
|
|
|
1540
1560
|
.ds-247420 .ds-chat-md { font-size: var(--fs-sm); line-height: 1.6; }
|
|
1541
1561
|
.ds-247420 .ds-chat-composer { display: flex; gap: 8px; padding: var(--space-4); }
|
|
1542
1562
|
.ds-247420 .ds-chat-composer input { flex: 1; padding: 13px 18px; background: var(--bg-2); border: 0; border-radius: var(--r-pill); font-family: inherit; font-size: var(--fs-sm); color: var(--fg); }
|
|
1543
|
-
.ds-247420 .ds-chat-composer input:focus { box-shadow:
|
|
1563
|
+
.ds-247420 .ds-chat-composer input:focus-visible { box-shadow: var(--focus-ring-inset); }
|
|
1544
1564
|
|
|
1545
1565
|
/* ============================================================
|
|
1546
1566
|
File surface — responsive grid + row layouts
|
|
@@ -1566,7 +1586,7 @@
|
|
|
1566
1586
|
background: var(--bg); color: var(--fg);
|
|
1567
1587
|
border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
|
|
1568
1588
|
}
|
|
1569
|
-
.ds-247420 .ds-file-filter-input:focus-visible { outline: none; box-shadow:
|
|
1589
|
+
.ds-247420 .ds-file-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
|
|
1570
1590
|
.ds-247420 .ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
|
|
1571
1591
|
.ds-247420 .ds-file-sort-btn {
|
|
1572
1592
|
font-size: var(--fs-tiny); font-family: var(--ff-mono); color: var(--fg-3);
|
|
@@ -1687,6 +1707,29 @@
|
|
|
1687
1707
|
.ds-247420 .ds-file-act-warn:hover { background: color-mix(in oklab, var(--warn) 18%, var(--bg)); color: var(--warn); }
|
|
1688
1708
|
|
|
1689
1709
|
/* Multi-select — per-row checkbox, header tri-state, bulk action strip. */
|
|
1710
|
+
/* CSS-drawn multi-select checkbox: a bordered box that fills with the accent +
|
|
1711
|
+
a border-drawn tick when its parent button is .is-marked or aria-checked.
|
|
1712
|
+
Shared by FileRow/FileCell (.is-marked) and the file/session select-all +
|
|
1713
|
+
SessionCard select (aria-checked true/mixed) since the bundle concatenates
|
|
1714
|
+
all CSS. Replaces the old [x]/[ ] bracket text - no glyphs, AT keeps the
|
|
1715
|
+
role=checkbox/aria-checked name+state. */
|
|
1716
|
+
.ds-247420 .ds-check-box {
|
|
1717
|
+
width: 15px; height: 15px; box-sizing: border-box; flex: 0 0 auto; position: relative;
|
|
1718
|
+
border: 1.5px solid var(--rule); border-radius: 4px;
|
|
1719
|
+
transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
|
|
1720
|
+
}
|
|
1721
|
+
.ds-247420 .is-marked > .ds-check-box,
|
|
1722
|
+
.ds-247420[aria-checked="true"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
|
|
1723
|
+
.ds-247420 .is-marked > .ds-check-box::after,
|
|
1724
|
+
.ds-247420[aria-checked="true"] > .ds-check-box::after {
|
|
1725
|
+
content: ""; position: absolute; left: 4px; top: 1px; width: 4px; height: 8px;
|
|
1726
|
+
border: solid var(--bg); border-width: 0 1.5px 1.5px 0; transform: rotate(45deg);
|
|
1727
|
+
}
|
|
1728
|
+
.ds-247420[aria-checked="mixed"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
|
|
1729
|
+
.ds-247420[aria-checked="mixed"] > .ds-check-box::after {
|
|
1730
|
+
content: ""; position: absolute; left: 2px; right: 2px; top: 50%; height: 1.5px; margin-top: -0.75px; background: var(--bg);
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1690
1733
|
.ds-247420 .ds-file-check {
|
|
1691
1734
|
display: inline-flex; align-items: center; justify-content: center;
|
|
1692
1735
|
min-width: 28px; height: 28px; padding: 0 4px;
|
|
@@ -1716,7 +1759,7 @@
|
|
|
1716
1759
|
padding: var(--space-1) var(--space-2);
|
|
1717
1760
|
background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
|
|
1718
1761
|
}
|
|
1719
|
-
.ds-247420 .ds-bulkbar-count { font-size: var(--fs-
|
|
1762
|
+
.ds-247420 .ds-bulkbar-count { font-size: var(--fs-sm); font-weight: 600; color: var(--fg-2); }
|
|
1720
1763
|
/* BulkBar is a toolbar (it even declares role=toolbar): compact rect buttons,
|
|
1721
1764
|
quiet destructive outline - the app arm-confirms destructive bulk actions
|
|
1722
1765
|
via ConfirmDialog, so the strip never needs a loud CTA. */
|
|
@@ -1977,7 +2020,7 @@
|
|
|
1977
2020
|
.ds-247420 .ds-file-empty-glyph { font-size: 34px; opacity: 0.55; }
|
|
1978
2021
|
.ds-247420 .ds-file-empty-text { font-size: var(--fs-sm); }
|
|
1979
2022
|
|
|
1980
|
-
/*
|
|
2023
|
+
/* -- Modals ------------------------------------------------- */
|
|
1981
2024
|
.ds-247420 .ds-modal-backdrop {
|
|
1982
2025
|
position: fixed; inset: 0; z-index: var(--z-modal, 800);
|
|
1983
2026
|
display: flex; align-items: center; justify-content: center;
|
|
@@ -2023,7 +2066,7 @@
|
|
|
2023
2066
|
border-radius: var(--r-2); color: var(--fg);
|
|
2024
2067
|
font-family: inherit; font-size: var(--fs-sm);
|
|
2025
2068
|
}
|
|
2026
|
-
.ds-247420 .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
2069
|
+
.ds-247420 .ds-modal-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
2027
2070
|
/* In-body modal error (role=alert): mutation failures (409/403) surface INSIDE
|
|
2028
2071
|
the dialog, not behind the fixed overlay. */
|
|
2029
2072
|
.ds-247420 .ds-modal-error {
|
|
@@ -2038,7 +2081,7 @@
|
|
|
2038
2081
|
color: var(--on-color);
|
|
2039
2082
|
}
|
|
2040
2083
|
|
|
2041
|
-
/*
|
|
2084
|
+
/* -- Preview ------------------------------------------------ */
|
|
2042
2085
|
.ds-247420 .ds-preview-head {
|
|
2043
2086
|
display: flex; align-items: center; gap: var(--space-3);
|
|
2044
2087
|
padding: var(--space-3) var(--space-4);
|
|
@@ -2111,7 +2154,7 @@
|
|
|
2111
2154
|
.ds-247420 .ds-file-stage { padding: var(--space-3) var(--space-2); }
|
|
2112
2155
|
}
|
|
2113
2156
|
|
|
2114
|
-
/*
|
|
2157
|
+
/* -- File browser UX affordances ---------------------------- */
|
|
2115
2158
|
/* Toolbar filter input — compact search box. */
|
|
2116
2159
|
.ds-247420 .ds-filter-input {
|
|
2117
2160
|
width: clamp(120px, 22vw, 220px);
|
|
@@ -2120,7 +2163,7 @@
|
|
|
2120
2163
|
border-radius: var(--r-pill); color: var(--fg);
|
|
2121
2164
|
font-family: inherit; font-size: var(--fs-xs);
|
|
2122
2165
|
}
|
|
2123
|
-
.ds-247420 .ds-filter-input:focus-visible { outline: none; box-shadow:
|
|
2166
|
+
.ds-247420 .ds-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
|
|
2124
2167
|
|
|
2125
2168
|
/* Loading skeleton — placeholder rows while a directory loads. */
|
|
2126
2169
|
.ds-247420 .ds-file-grid-loading { display: flex; flex-direction: column; gap: 4px; }
|
|
@@ -2643,7 +2686,7 @@
|
|
|
2643
2686
|
.ds-247420 .app-side a .glyph { font-family: var(--ff-mono); font-size: 13px; font-weight: 600; color: var(--fg-3); text-align: center; }
|
|
2644
2687
|
.ds-247420 .app-side a.active .glyph { color: var(--accent); }
|
|
2645
2688
|
|
|
2646
|
-
/*
|
|
2689
|
+
/* -- select primitive --------------------------------------------------- */
|
|
2647
2690
|
.ds-247420 .ds-select {
|
|
2648
2691
|
width: 100%;
|
|
2649
2692
|
min-width: 0;
|
|
@@ -2667,10 +2710,10 @@
|
|
|
2667
2710
|
background-repeat: no-repeat;
|
|
2668
2711
|
cursor: pointer;
|
|
2669
2712
|
}
|
|
2670
|
-
.ds-247420 .ds-select:focus-visible { box-shadow:
|
|
2713
|
+
.ds-247420 .ds-select:focus-visible { box-shadow: var(--focus-ring-inset); }
|
|
2671
2714
|
.ds-247420 .ds-select:hover { background-color: var(--bg-3); }
|
|
2672
2715
|
|
|
2673
|
-
/*
|
|
2716
|
+
/* -- chat composer autogrow polish (sizing lives in the primary block) -- */
|
|
2674
2717
|
.ds-247420 .chat-composer textarea {
|
|
2675
2718
|
transition: height var(--dur-snap) var(--ease);
|
|
2676
2719
|
}
|
|
@@ -2679,7 +2722,7 @@
|
|
|
2679
2722
|
cursor: not-allowed;
|
|
2680
2723
|
}
|
|
2681
2724
|
|
|
2682
|
-
/*
|
|
2725
|
+
/* -- mobile responsive: chat -------------------------------------------- */
|
|
2683
2726
|
@media (max-width: 768px) {
|
|
2684
2727
|
.ds-247420 .chat-stack { max-width: 100%; }
|
|
2685
2728
|
.ds-247420 .chat-msg { padding: 4px 0; }
|
|
@@ -2704,9 +2747,9 @@
|
|
|
2704
2747
|
Comprehensive improvements for perfect UX across all surfaces
|
|
2705
2748
|
============================================================ */
|
|
2706
2749
|
|
|
2707
|
-
/*
|
|
2750
|
+
/* ------------------------------------------------------------
|
|
2708
2751
|
Component States — Disabled, Loading, Error, Success
|
|
2709
|
-
|
|
2752
|
+
-------------------------------------------------------------- */
|
|
2710
2753
|
|
|
2711
2754
|
/* Disabled state for all interactive elements */
|
|
2712
2755
|
.ds-247420 .btn:disabled, .ds-247420 .btn-primary:disabled, .ds-247420 .btn-ghost:disabled, .ds-247420 button:disabled, .ds-247420[disabled] {
|
|
@@ -2754,9 +2797,9 @@
|
|
|
2754
2797
|
opacity: 0.8;
|
|
2755
2798
|
}
|
|
2756
2799
|
|
|
2757
|
-
/*
|
|
2800
|
+
/* ------------------------------------------------------------
|
|
2758
2801
|
Enhanced Button Micro-Interactions
|
|
2759
|
-
|
|
2802
|
+
-------------------------------------------------------------- */
|
|
2760
2803
|
|
|
2761
2804
|
/* Button scale feedback on active */
|
|
2762
2805
|
.ds-247420 .btn:active:not(:disabled),
|
|
@@ -2783,9 +2826,9 @@
|
|
|
2783
2826
|
-webkit-touch-callout: none;
|
|
2784
2827
|
}
|
|
2785
2828
|
|
|
2786
|
-
/*
|
|
2829
|
+
/* ------------------------------------------------------------
|
|
2787
2830
|
Drag-and-Drop Styles
|
|
2788
|
-
|
|
2831
|
+
-------------------------------------------------------------- */
|
|
2789
2832
|
|
|
2790
2833
|
/* Draggable element */
|
|
2791
2834
|
.ds-247420[draggable="true"], .ds-247420 .draggable {
|
|
@@ -2842,9 +2885,9 @@
|
|
|
2842
2885
|
50% { opacity: 1; }
|
|
2843
2886
|
}
|
|
2844
2887
|
|
|
2845
|
-
/*
|
|
2888
|
+
/* ------------------------------------------------------------
|
|
2846
2889
|
Context Menu Styles
|
|
2847
|
-
|
|
2890
|
+
-------------------------------------------------------------- */
|
|
2848
2891
|
|
|
2849
2892
|
.ds-247420 .ds-context-menu {
|
|
2850
2893
|
position: absolute;
|
|
@@ -2906,9 +2949,9 @@
|
|
|
2906
2949
|
cursor: context-menu;
|
|
2907
2950
|
}
|
|
2908
2951
|
|
|
2909
|
-
/*
|
|
2952
|
+
/* ------------------------------------------------------------
|
|
2910
2953
|
Enhanced Form Inputs
|
|
2911
|
-
|
|
2954
|
+
-------------------------------------------------------------- */
|
|
2912
2955
|
|
|
2913
2956
|
.ds-247420 input[type="text"],
|
|
2914
2957
|
.ds-247420 input[type="email"],
|
|
@@ -2934,7 +2977,7 @@
|
|
|
2934
2977
|
color: var(--fg-3);
|
|
2935
2978
|
}
|
|
2936
2979
|
|
|
2937
|
-
/*
|
|
2980
|
+
/* -- Field controls: themed base for TextField / Select / SearchInput --
|
|
2938
2981
|
Root fix: previously only `transition` was set, so themed apps got
|
|
2939
2982
|
browser-default white boxes in dark mode and labels collided with inputs
|
|
2940
2983
|
because `.ds-field` had no layout. */
|
|
@@ -2983,7 +3026,7 @@
|
|
|
2983
3026
|
.ds-247420 .ds-field .ds-select:focus-visible,
|
|
2984
3027
|
.ds-247420 .ds-search-input:focus-visible {
|
|
2985
3028
|
outline: none;
|
|
2986
|
-
box-shadow:
|
|
3029
|
+
box-shadow: var(--focus-ring-inset);
|
|
2987
3030
|
}
|
|
2988
3031
|
.ds-247420 .ds-field input:disabled,
|
|
2989
3032
|
.ds-247420 .ds-field textarea:disabled,
|
|
@@ -3021,9 +3064,9 @@
|
|
|
3021
3064
|
color: var(--fg);
|
|
3022
3065
|
}
|
|
3023
3066
|
|
|
3024
|
-
/*
|
|
3067
|
+
/* ------------------------------------------------------------
|
|
3025
3068
|
Accessibility Enhancements
|
|
3026
|
-
|
|
3069
|
+
-------------------------------------------------------------- */
|
|
3027
3070
|
|
|
3028
3071
|
/* Enhanced focus-visible for all interactive elements */
|
|
3029
3072
|
.ds-247420[role="button"]:focus-visible,
|
|
@@ -3052,11 +3095,17 @@
|
|
|
3052
3095
|
animation-iteration-count: 1 !important;
|
|
3053
3096
|
transition-duration: 0.01ms !important;
|
|
3054
3097
|
}
|
|
3098
|
+
/* Kill the residual paint frame of looping skeleton/shimmer placeholders and
|
|
3099
|
+
give reduced-motion users a steady placeholder fill instead. */
|
|
3100
|
+
.ds-247420 .skeleton, .ds-247420 .ds-skeleton, .ds-247420 .ds-session-row-skeleton .ds-skel {
|
|
3101
|
+
animation: none !important;
|
|
3102
|
+
background: var(--bg-2) !important;
|
|
3103
|
+
}
|
|
3055
3104
|
}
|
|
3056
3105
|
|
|
3057
|
-
/*
|
|
3106
|
+
/* ------------------------------------------------------------
|
|
3058
3107
|
Performance
|
|
3059
|
-
|
|
3108
|
+
-------------------------------------------------------------- */
|
|
3060
3109
|
|
|
3061
3110
|
/* Limit layout/style containment to self-contained components. `paint` is
|
|
3062
3111
|
intentionally omitted — it clips focus rings, tooltips and dropdowns that
|
|
@@ -3065,9 +3114,9 @@
|
|
|
3065
3114
|
contain: layout style;
|
|
3066
3115
|
}
|
|
3067
3116
|
|
|
3068
|
-
/*
|
|
3117
|
+
/* ------------------------------------------------------------
|
|
3069
3118
|
Mobile Touch Optimizations
|
|
3070
|
-
|
|
3119
|
+
-------------------------------------------------------------- */
|
|
3071
3120
|
|
|
3072
3121
|
@media (hover: none) and (pointer: coarse) {
|
|
3073
3122
|
/* Mobile devices: larger touch targets, faster responses */
|
|
@@ -3096,9 +3145,9 @@
|
|
|
3096
3145
|
}
|
|
3097
3146
|
}
|
|
3098
3147
|
|
|
3099
|
-
/*
|
|
3148
|
+
/* ------------------------------------------------------------
|
|
3100
3149
|
Theme Transition Smoothness
|
|
3101
|
-
|
|
3150
|
+
-------------------------------------------------------------- */
|
|
3102
3151
|
|
|
3103
3152
|
/* Scoped to the DS wrapper so the design system never reaches out and
|
|
3104
3153
|
animates the host document's html/body. */
|
|
@@ -3107,9 +3156,9 @@
|
|
|
3107
3156
|
color var(--dur-base) var(--ease);
|
|
3108
3157
|
}
|
|
3109
3158
|
|
|
3110
|
-
/*
|
|
3159
|
+
/* ------------------------------------------------------------
|
|
3111
3160
|
Empty State & Loading States
|
|
3112
|
-
|
|
3161
|
+
-------------------------------------------------------------- */
|
|
3113
3162
|
|
|
3114
3163
|
.ds-247420 .empty-state {
|
|
3115
3164
|
display: flex; flex-direction: column; align-items: center; gap: var(--space-4);
|
|
@@ -3147,9 +3196,9 @@
|
|
|
3147
3196
|
.ds-247420 .skeleton-line { height: 12px; margin-bottom: 12px; }
|
|
3148
3197
|
.ds-247420 .skeleton-title { height: 24px; margin-bottom: 16px; width: 60%; }
|
|
3149
3198
|
|
|
3150
|
-
/*
|
|
3199
|
+
/* ------------------------------------------------------------
|
|
3151
3200
|
Toast Notification Styles
|
|
3152
|
-
|
|
3201
|
+
-------------------------------------------------------------- */
|
|
3153
3202
|
|
|
3154
3203
|
.ds-247420 .toast {
|
|
3155
3204
|
position: fixed;
|
|
@@ -3555,7 +3604,7 @@
|
|
|
3555
3604
|
/* Crumb band is the top chrome of the content column: a stable height so the
|
|
3556
3605
|
top edge aligns with the rail head, and a left gutter matching .ws-main so
|
|
3557
3606
|
the trail text is not flush against the rail border. */
|
|
3558
|
-
.ds-247420 .ws-crumb { flex: 0 0 auto; min-height: 48px; padding: 0 var(--space-
|
|
3607
|
+
.ds-247420 .ws-crumb { flex: 0 0 auto; min-height: 48px; padding: 0 var(--space-5); display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
|
|
3559
3608
|
.ds-247420 .ws-crumb-main { flex: 1 1 auto; min-width: 0; }
|
|
3560
3609
|
/* Content column gutter. Claude-Code-class calm: file grid / dashboard / event
|
|
3561
3610
|
list / history get a generous, consistent inner gutter instead of butting
|
|
@@ -5455,14 +5504,14 @@
|
|
|
5455
5504
|
}
|
|
5456
5505
|
.ds-247420 .agentchat-empty-title { margin: 0; font-size: 1.05em; color: var(--fg-2, var(--fg)); }
|
|
5457
5506
|
.ds-247420 .agentchat-empty-sub { margin: 0; font-size: var(--fs-sm); }
|
|
5458
|
-
.ds-247420 .agentchat-empty-suggestions {
|
|
5507
|
+
.ds-247420 .agentchat-empty-suggestions, .ds-247420 .chat-empty-suggestions {
|
|
5459
5508
|
display: flex;
|
|
5460
5509
|
flex-wrap: wrap;
|
|
5461
5510
|
gap: .5em;
|
|
5462
5511
|
justify-content: center;
|
|
5463
5512
|
margin-top: .5em;
|
|
5464
5513
|
}
|
|
5465
|
-
.ds-247420 .agentchat-empty-suggestion {
|
|
5514
|
+
.ds-247420 .agentchat-empty-suggestion, .ds-247420 .chat-empty-suggestion {
|
|
5466
5515
|
cursor: pointer;
|
|
5467
5516
|
font: inherit;
|
|
5468
5517
|
font-size: var(--fs-tiny);
|
|
@@ -5472,8 +5521,8 @@
|
|
|
5472
5521
|
background: color-mix(in srgb, var(--fg) 5%, transparent);
|
|
5473
5522
|
color: var(--fg-2, var(--fg));
|
|
5474
5523
|
}
|
|
5475
|
-
.ds-247420 .agentchat-empty-suggestion:hover { background: color-mix(in srgb, var(--accent, var(--fg)) 12%, transparent); }
|
|
5476
|
-
.ds-247420 .agentchat-empty-suggestion:focus-visible { outline: 2px solid var(--accent, var(--fg)); outline-offset: 2px; }
|
|
5524
|
+
.ds-247420 .agentchat-empty-suggestion:hover, .ds-247420 .chat-empty-suggestion:hover { background: color-mix(in srgb, var(--accent, var(--fg)) 12%, transparent); }
|
|
5525
|
+
.ds-247420 .agentchat-empty-suggestion:focus-visible, .ds-247420 .chat-empty-suggestion:focus-visible { outline: 2px solid var(--accent, var(--fg)); outline-offset: 2px; }
|
|
5477
5526
|
|
|
5478
5527
|
/* Guided install path in the empty state: copy line + monospaced command rows
|
|
5479
5528
|
(each with its own copy button) + a recheck button. No animation. */
|
|
@@ -5575,8 +5624,8 @@
|
|
|
5575
5624
|
}
|
|
5576
5625
|
.ds-247420 .status-dot-disc.status-dot-live { background: var(--accent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
|
|
5577
5626
|
.ds-247420 .status-dot-disc.status-dot-error { background: var(--flame); }
|
|
5578
|
-
.ds-247420 .status-dot-disc.status-dot-connecting { background: var(--amber
|
|
5579
|
-
.ds-247420 .status-dot-disc.status-dot-stale { background: var(--amber
|
|
5627
|
+
.ds-247420 .status-dot-disc.status-dot-connecting { background: var(--amber); }
|
|
5628
|
+
.ds-247420 .status-dot-disc.status-dot-stale { background: var(--amber); }
|
|
5580
5629
|
@keyframes status-disc-pulse {
|
|
5581
5630
|
0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent); }
|
|
5582
5631
|
50% { box-shadow: 0 0 0 4px color-mix(in oklab, var(--accent) 0%, transparent); }
|
|
@@ -5638,7 +5687,7 @@
|
|
|
5638
5687
|
/* Rail tones MUST match .row.rail-* in app-shell.css so the same semantic state
|
|
5639
5688
|
reads as one colour across the conversation list and content rows. */
|
|
5640
5689
|
.ds-247420 .ds-session-row.rail-green::before { background: var(--accent); }
|
|
5641
|
-
.ds-247420 .ds-session-row.rail-purple::before { background: var(--purple-2
|
|
5690
|
+
.ds-247420 .ds-session-row.rail-purple::before { background: var(--purple-2); }
|
|
5642
5691
|
.ds-247420 .ds-session-row.rail-flame::before { background: var(--flame); }
|
|
5643
5692
|
.ds-247420 .ds-session-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
|
|
5644
5693
|
.ds-247420 .ds-session-title { font-size: var(--fs-sm); color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
@@ -5740,11 +5789,16 @@
|
|
|
5740
5789
|
.ds-247420 button.chat-composer-context:hover { color: var(--fg-2); }
|
|
5741
5790
|
.ds-247420 button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
5742
5791
|
|
|
5792
|
+
/* Composer send/cancel button row: a non-wrapping cluster pinned to the
|
|
5793
|
+
bottom-right of the flex-end composer (was unstyled, so the send button
|
|
5794
|
+
could wrap below the textarea instead of anchoring like claude.ai/code). */
|
|
5795
|
+
.ds-247420 .chat-composer-toolbar { display: flex; align-items: center; gap: var(--space-1); flex: 0 0 auto; margin-left: auto; align-self: flex-end; }
|
|
5796
|
+
|
|
5743
5797
|
/* --- B2: follow-up chips below the last settled assistant turn. --- */
|
|
5744
5798
|
.ds-247420 .agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
|
|
5745
5799
|
|
|
5746
5800
|
/* --- C1: stale/idle dashboard status (static, NOT pulsing). --- */
|
|
5747
|
-
.ds-247420 .ds-dash-status.is-stale { color: var(--amber
|
|
5801
|
+
.ds-247420 .ds-dash-status.is-stale { color: var(--amber); }
|
|
5748
5802
|
.ds-247420 .ds-dash-status.is-running { color: var(--accent); }
|
|
5749
5803
|
|
|
5750
5804
|
/* --- C2: dashboard sort/filter toolbar + stream-state line. --- */
|
|
@@ -5762,7 +5816,7 @@
|
|
|
5762
5816
|
}
|
|
5763
5817
|
.ds-247420 .ds-dash-stream { font-size: var(--fs-tiny); color: var(--fg-3); }
|
|
5764
5818
|
.ds-247420 .ds-dash-stream.is-lost { color: var(--flame); }
|
|
5765
|
-
.ds-247420 .ds-dash-stream.is-connecting { color: var(--amber
|
|
5819
|
+
.ds-247420 .ds-dash-stream.is-connecting { color: var(--amber); }
|
|
5766
5820
|
.ds-247420 .ds-dash-header .spread { flex: 1; }
|
|
5767
5821
|
.ds-247420 .ds-dash-errors-toggle {
|
|
5768
5822
|
padding: 4px 10px; min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
|
|
@@ -5788,7 +5842,7 @@
|
|
|
5788
5842
|
/* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
|
|
5789
5843
|
agent is flagged in a dense grid, not merely faded near-invisibly. The word
|
|
5790
5844
|
'idle' co-carries state, so this stays colour-blind safe. */
|
|
5791
|
-
.ds-247420 .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber
|
|
5845
|
+
.ds-247420 .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber); }
|
|
5792
5846
|
|
|
5793
5847
|
/* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
|
|
5794
5848
|
|
|
@@ -5945,7 +5999,7 @@
|
|
|
5945
5999
|
}
|
|
5946
6000
|
|
|
5947
6001
|
/* Stopping state: in-flight cancel reads distinctly from running/error. */
|
|
5948
|
-
.ds-247420 .ds-dash-status.is-stopping { color: var(--amber
|
|
6002
|
+
.ds-247420 .ds-dash-status.is-stopping { color: var(--amber); }
|
|
5949
6003
|
|
|
5950
6004
|
/* External (observed, not owned) session card: no stop control exists. */
|
|
5951
6005
|
.ds-247420 .ds-dash-external {
|
|
@@ -5977,8 +6031,10 @@
|
|
|
5977
6031
|
.ds-247420 .chat-msg-flat.you .chat-role { color: var(--accent); }
|
|
5978
6032
|
.ds-247420 .chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
|
|
5979
6033
|
.ds-247420 .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
|
|
5980
|
-
|
|
5981
|
-
|
|
6034
|
+
/* Hover tint exceeds each role's REST tint so the row gives feedback (and the
|
|
6035
|
+
ladder stays monotonic): assistant 5% > its 3% rest; user 4% > transparent. */
|
|
6036
|
+
.ds-247420 .chat-msg-flat.them:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
|
|
6037
|
+
.ds-247420 .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 4%, transparent); }
|
|
5982
6038
|
.ds-247420 .chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
|
|
5983
6039
|
.ds-247420 .chat-msg-flat .chat-avatar { display: none; }
|
|
5984
6040
|
|
|
@@ -6012,6 +6068,9 @@
|
|
|
6012
6068
|
}
|
|
6013
6069
|
.ds-247420 .chat-msg .chat-tool.tool-running .chat-tool-status { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
|
|
6014
6070
|
.ds-247420 .chat-msg .chat-tool.tool-error .chat-tool-status { color: var(--flame); background: color-mix(in oklab, var(--flame) 12%, transparent); }
|
|
6071
|
+
/* Completed tool: a positive (success) tone so done reads distinctly from the
|
|
6072
|
+
neutral pill and from the accent-toned running pill (--success = green-2). */
|
|
6073
|
+
.ds-247420 .chat-msg .chat-tool.tool-done .chat-tool-status { color: var(--success); background: color-mix(in oklab, var(--success) 12%, transparent); }
|
|
6015
6074
|
.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); }
|
|
6016
6075
|
.ds-247420 .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
|
|
6017
6076
|
.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); }
|
|
@@ -6046,6 +6105,10 @@
|
|
|
6046
6105
|
}
|
|
6047
6106
|
@keyframes ds-arm-pulse { 0% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--warn) 55%, transparent); } 100% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--warn) 0%, transparent); } }
|
|
6048
6107
|
.ds-247420 .ds-dash-card.is-new { box-shadow: inset 2px 0 0 var(--accent), 0 0 0 1px color-mix(in oklab, var(--accent) 40%, transparent); }
|
|
6108
|
+
/* Error card carries the strongest left-bar tone (flame > stale amber > active
|
|
6109
|
+
accent), placed last so its inset bar wins source order over is-active/is-stale.
|
|
6110
|
+
The full-perimeter border-color (line ~396) stays for extra severity emphasis. */
|
|
6111
|
+
.ds-247420 .ds-dash-card.is-error { box-shadow: inset 2px 0 0 var(--flame); }
|
|
6049
6112
|
@media (prefers-reduced-motion: no-preference) {
|
|
6050
6113
|
.ds-247420 .ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
|
|
6051
6114
|
}
|
|
@@ -6057,7 +6120,7 @@
|
|
|
6057
6120
|
.ds-247420 .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
|
|
6058
6121
|
.ds-247420 .ds-dash-breakdown .seg.is-running { color: var(--green); font-weight: 600; }
|
|
6059
6122
|
.ds-247420 .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
|
|
6060
|
-
.ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--amber
|
|
6123
|
+
.ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--amber); }
|
|
6061
6124
|
.ds-247420 .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
|
|
6062
6125
|
.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); }
|
|
6063
6126
|
.ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
@@ -6078,7 +6141,7 @@
|
|
|
6078
6141
|
.ds-247420 .ds-preview-code code { color: var(--fg); }
|
|
6079
6142
|
.ds-247420 .ds-preview-code .token.comment, .ds-247420 .ds-preview-code .token.prolog, .ds-247420 .ds-preview-code .token.doctype, .ds-247420 .ds-preview-code .token.cdata { color: var(--fg-3); }
|
|
6080
6143
|
.ds-247420 .ds-preview-code .token.punctuation { color: var(--fg-2); }
|
|
6081
|
-
.ds-247420 .ds-preview-code .token.property, .ds-247420 .ds-preview-code .token.tag, .ds-247420 .ds-preview-code .token.boolean, .ds-247420 .ds-preview-code .token.number, .ds-247420 .ds-preview-code .token.constant, .ds-247420 .ds-preview-code .token.symbol { color: var(--purple-2
|
|
6144
|
+
.ds-247420 .ds-preview-code .token.property, .ds-247420 .ds-preview-code .token.tag, .ds-247420 .ds-preview-code .token.boolean, .ds-247420 .ds-preview-code .token.number, .ds-247420 .ds-preview-code .token.constant, .ds-247420 .ds-preview-code .token.symbol { color: var(--purple-2); }
|
|
6082
6145
|
.ds-247420 .ds-preview-code .token.selector, .ds-247420 .ds-preview-code .token.attr-name, .ds-247420 .ds-preview-code .token.string, .ds-247420 .ds-preview-code .token.char, .ds-247420 .ds-preview-code .token.builtin { color: var(--code-string, var(--green)); }
|
|
6083
6146
|
.ds-247420 .ds-preview-code .token.atrule, .ds-247420 .ds-preview-code .token.attr-value, .ds-247420 .ds-preview-code .token.keyword { color: var(--code-keyword, var(--sky)); }
|
|
6084
6147
|
.ds-247420 .ds-preview-code .token.function, .ds-247420 .ds-preview-code .token.class-name { color: var(--code-fn, var(--flame)); }
|
|
@@ -7444,6 +7507,231 @@
|
|
|
7444
7507
|
align-content: start;
|
|
7445
7508
|
}
|
|
7446
7509
|
|
|
7510
|
+
/* app-surfaces.css */
|
|
7511
|
+
/* app-surfaces.css — agentgui application-surface styling.
|
|
7512
|
+
*
|
|
7513
|
+
* Owns every design decision for the agentgui consumer app's own surfaces
|
|
7514
|
+
* (the bits the app composes around the flagship kit components): the project
|
|
7515
|
+
* filter pills, the working-directory bar, the resume banner, the backend
|
|
7516
|
+
* health chips, the settings two-column grid, the history empty state, the
|
|
7517
|
+
* boot splash, the chat control cluster, and the cross-cutting base (scrollbar
|
|
7518
|
+
* theming, focus rings, print). These previously lived as a hand-rolled inline
|
|
7519
|
+
* \3c style> block in agentgui's index.html; the kit now owns them so NO design
|
|
7520
|
+
* content lives in the consumer app.
|
|
7521
|
+
*
|
|
7522
|
+
* Every selector is written pre-scoped under `.ds-247420` (the consumer mounts
|
|
7523
|
+
* on <html class="ds-247420">), so the build's selector-prefixer leaves them
|
|
7524
|
+
* untouched rather than mis-compounding the `[attr]` / `*` / bare-element
|
|
7525
|
+
* selectors. All colour/space/radius/font values read from kit tokens
|
|
7526
|
+
* (colors_and_type.css) — there are no app-local colour fallbacks. */
|
|
7527
|
+
|
|
7528
|
+
/* Visually-hidden but screen-reader-available (aria-live announcer, labels). */
|
|
7529
|
+
.ds-247420 .sr-only {
|
|
7530
|
+
position: absolute !important; width: 1px; height: 1px;
|
|
7531
|
+
padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0);
|
|
7532
|
+
white-space: nowrap; border: 0;
|
|
7533
|
+
}
|
|
7534
|
+
|
|
7535
|
+
/* Base: full-height app root reading kit tokens. */
|
|
7536
|
+
.ds-247420, .ds-247420 body { margin: 0; height: 100%; }
|
|
7537
|
+
.ds-247420 body {
|
|
7538
|
+
background: var(--bg);
|
|
7539
|
+
color: var(--fg);
|
|
7540
|
+
font-family: var(--ff-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);
|
|
7541
|
+
}
|
|
7542
|
+
.ds-247420 #app { height: 100vh; height: 100dvh; }
|
|
7543
|
+
.ds-247420 #app > * { height: 100%; }
|
|
7544
|
+
|
|
7545
|
+
/* Themed thin scrollbars — the native chrome scrollbar is chunky/light and
|
|
7546
|
+
clashes with the dark theme on the history sidebar and settings column. */
|
|
7547
|
+
.ds-247420 * {
|
|
7548
|
+
scrollbar-width: thin;
|
|
7549
|
+
scrollbar-color: color-mix(in srgb, var(--fg) 22%, transparent) transparent;
|
|
7550
|
+
}
|
|
7551
|
+
.ds-247420 *::-webkit-scrollbar { width: 9px; height: 9px; }
|
|
7552
|
+
.ds-247420 *::-webkit-scrollbar-track { background: transparent; }
|
|
7553
|
+
.ds-247420 *::-webkit-scrollbar-thumb {
|
|
7554
|
+
background: color-mix(in srgb, var(--fg) 20%, transparent);
|
|
7555
|
+
border-radius: 999px;
|
|
7556
|
+
border: 2px solid transparent;
|
|
7557
|
+
background-clip: padding-box;
|
|
7558
|
+
}
|
|
7559
|
+
.ds-247420 *::-webkit-scrollbar-thumb:hover {
|
|
7560
|
+
background: color-mix(in srgb, var(--fg) 34%, transparent);
|
|
7561
|
+
background-clip: padding-box;
|
|
7562
|
+
}
|
|
7563
|
+
|
|
7564
|
+
/* We move focus to the page heading on tab change for AT users; suppress the
|
|
7565
|
+
resulting outline box on those programmatically-focused elements. */
|
|
7566
|
+
.ds-247420 [data-prog-focus]:focus,
|
|
7567
|
+
.ds-247420 [data-prog-focus]:focus-visible { outline: none !important; box-shadow: none !important; }
|
|
7568
|
+
|
|
7569
|
+
/* The connection-dot disc + pulse are the kit's canonical .status-dot-disc;
|
|
7570
|
+
only the inline-flex wrapper layout stays here. */
|
|
7571
|
+
.ds-247420 .status-dot { display: inline-flex; align-items: center; gap: .4em; white-space: nowrap; }
|
|
7572
|
+
|
|
7573
|
+
/* Resume banner. */
|
|
7574
|
+
.ds-247420 .resume-banner {
|
|
7575
|
+
padding: .6em .8em;
|
|
7576
|
+
background: color-mix(in srgb, var(--accent) 12%, transparent);
|
|
7577
|
+
border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
|
|
7578
|
+
border-radius: var(--r-1, 8px);
|
|
7579
|
+
display: flex; justify-content: space-between; align-items: center; gap: .75em;
|
|
7580
|
+
margin-bottom: .75em;
|
|
7581
|
+
}
|
|
7582
|
+
|
|
7583
|
+
/* History action buttons. */
|
|
7584
|
+
.ds-247420 .history-actions { display: flex; gap: .5em; padding: 0 0 .75em 0; flex-wrap: wrap; }
|
|
7585
|
+
|
|
7586
|
+
/* Empty / loading state. */
|
|
7587
|
+
.ds-247420 .empty-state { display: flex; gap: 8px; align-items: center; padding: .5em 0; white-space: normal; }
|
|
7588
|
+
.ds-247420 p.empty-state { text-align: left; padding: .6em 0; color: var(--fg-3); }
|
|
7589
|
+
|
|
7590
|
+
/* Project filter pills. */
|
|
7591
|
+
.ds-247420 .pill-row { display: flex; flex-wrap: wrap; gap: .35em; padding: .35em 0; }
|
|
7592
|
+
.ds-247420 .pill {
|
|
7593
|
+
cursor: pointer; padding: .25em .7em; border-radius: 999px;
|
|
7594
|
+
border: 1px solid transparent; background: transparent;
|
|
7595
|
+
font: inherit; color: inherit; line-height: 1.4;
|
|
7596
|
+
transition: background-color .15s ease, border-color .15s ease;
|
|
7597
|
+
min-height: 28px;
|
|
7598
|
+
}
|
|
7599
|
+
.ds-247420 .pill:hover { background: color-mix(in srgb, var(--accent) 10%, transparent); }
|
|
7600
|
+
.ds-247420 .pill.pill-active {
|
|
7601
|
+
background: color-mix(in srgb, var(--accent) 18%, transparent);
|
|
7602
|
+
border-color: color-mix(in srgb, var(--accent) 40%, transparent);
|
|
7603
|
+
}
|
|
7604
|
+
.ds-247420 .pill:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
7605
|
+
|
|
7606
|
+
/* Subagent toggle (the control itself is the kit Checkbox). */
|
|
7607
|
+
.ds-247420 .subagent-toggle { padding: .4em 0; min-height: 32px; }
|
|
7608
|
+
|
|
7609
|
+
.ds-247420 .field-error { color: var(--warn); }
|
|
7610
|
+
|
|
7611
|
+
/* Boot splash: static text painted with the HTML, replaced by the first mount. */
|
|
7612
|
+
.ds-247420 .boot-splash { height: 100%; min-height: 60vh; display: flex; align-items: center; justify-content: center; color: var(--fg-3); font-size: .9rem; }
|
|
7613
|
+
|
|
7614
|
+
/* Chat control cluster in the crumb bar: model picker, +new, status. */
|
|
7615
|
+
.ds-247420 .chat-controls { display: flex; align-items: center; gap: .6em; flex-wrap: wrap; }
|
|
7616
|
+
.ds-247420 .chat-controls > * { flex: 0 0 auto; }
|
|
7617
|
+
.ds-247420 .chat-controls select,
|
|
7618
|
+
.ds-247420 .chat-controls .select,
|
|
7619
|
+
.ds-247420 .chat-controls [role="combobox"] { min-width: 130px; max-width: 220px; }
|
|
7620
|
+
.ds-247420 .chat-controls .status-dot { white-space: nowrap; }
|
|
7621
|
+
|
|
7622
|
+
/* Main content region layout: every tab is a min-height:0 scroll host; the
|
|
7623
|
+
chat tab additionally flexes as a column so the thread fills the viewport. */
|
|
7624
|
+
.ds-247420 .agentgui-main { min-height: 0; }
|
|
7625
|
+
.ds-247420 .agentgui-main-chat { display: flex; flex-direction: column; flex: 1; }
|
|
7626
|
+
.ds-247420 .agentgui-main .ds-section { margin: 0 0 var(--space-4, 16px); }
|
|
7627
|
+
|
|
7628
|
+
/* Readable backend health summary (replaces raw JSON dump). */
|
|
7629
|
+
.ds-247420 .health-summary { display: flex; flex-wrap: wrap; gap: .4em; margin: .6em 0; }
|
|
7630
|
+
.ds-247420 .health-chip {
|
|
7631
|
+
font-family: var(--ff-mono, ui-monospace, monospace);
|
|
7632
|
+
font-size: .8rem; padding: .15em .55em; border-radius: 6px;
|
|
7633
|
+
background: color-mix(in srgb, var(--fg) 8%, transparent);
|
|
7634
|
+
color: var(--fg-2);
|
|
7635
|
+
border: 1px solid color-mix(in srgb, var(--fg) 12%, transparent);
|
|
7636
|
+
}
|
|
7637
|
+
.ds-247420 .health-summary.health-ok .health-chip:first-child {
|
|
7638
|
+
color: var(--accent);
|
|
7639
|
+
border-color: color-mix(in srgb, var(--accent) 40%, transparent);
|
|
7640
|
+
}
|
|
7641
|
+
|
|
7642
|
+
/* Compact working-directory bar. */
|
|
7643
|
+
.ds-247420 .cwd-bar {
|
|
7644
|
+
display: flex; align-items: center; gap: .5em; flex-wrap: wrap;
|
|
7645
|
+
padding: .15em 0 .5em; font-size: .85rem;
|
|
7646
|
+
}
|
|
7647
|
+
.ds-247420 .cwd-bar-text {
|
|
7648
|
+
font-family: var(--ff-mono, ui-monospace, monospace);
|
|
7649
|
+
color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 60vw;
|
|
7650
|
+
}
|
|
7651
|
+
.ds-247420 .cwd-bar-btn {
|
|
7652
|
+
cursor: pointer; font: inherit; line-height: 1.3;
|
|
7653
|
+
padding: .15em .55em; border-radius: 6px;
|
|
7654
|
+
background: color-mix(in srgb, var(--fg) 8%, transparent);
|
|
7655
|
+
border: 1px solid color-mix(in srgb, var(--fg) 14%, transparent);
|
|
7656
|
+
color: var(--fg-2);
|
|
7657
|
+
}
|
|
7658
|
+
.ds-247420 .cwd-bar-btn:hover { background: color-mix(in srgb, var(--fg) 14%, transparent); }
|
|
7659
|
+
.ds-247420 .cwd-bar-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
7660
|
+
|
|
7661
|
+
/* History no-session empty state: fill the void with a centered prompt. */
|
|
7662
|
+
.ds-247420 .history-empty {
|
|
7663
|
+
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
|
7664
|
+
gap: .4em; text-align: center; min-height: 50vh; color: var(--fg-3);
|
|
7665
|
+
}
|
|
7666
|
+
.ds-247420 .history-empty-title { margin: 0; font-size: 1.05rem; color: var(--fg-2); }
|
|
7667
|
+
.ds-247420 .history-empty-sub { margin: 0; max-width: 42ch; }
|
|
7668
|
+
|
|
7669
|
+
/* Settings: two-column on wide screens (backend + agents). */
|
|
7670
|
+
.ds-247420 .settings-grid {
|
|
7671
|
+
display: grid; gap: var(--space-4, 16px);
|
|
7672
|
+
grid-template-columns: minmax(0, 1fr);
|
|
7673
|
+
align-items: start;
|
|
7674
|
+
}
|
|
7675
|
+
.ds-247420 .agentgui-main-settings .settings-grid { margin-top: 0; }
|
|
7676
|
+
|
|
7677
|
+
/* The kit Chat head computes its own zero-padded count and ignores our sub
|
|
7678
|
+
prop; hide it (streaming state shows via the title + busy banner). */
|
|
7679
|
+
.ds-247420 .chat-head .sub { display: none; }
|
|
7680
|
+
|
|
7681
|
+
/* Event-list row hover + search-result flash. */
|
|
7682
|
+
.ds-247420 .ds-event-list .row[role="button"]:hover { background: color-mix(in srgb, var(--fg) 5%, transparent); }
|
|
7683
|
+
.ds-247420 .ds-event-list .row.event-flash { animation: agentgui-event-flash 2s ease-out; }
|
|
7684
|
+
|
|
7685
|
+
/* Chat composer: hide the idle scrollbar on the (empty/short) textarea. */
|
|
7686
|
+
.ds-247420 .chat-composer textarea { overflow-y: auto; scrollbar-width: thin; }
|
|
7687
|
+
.ds-247420 .chat-composer textarea:not(:focus) { overflow-y: hidden; }
|
|
7688
|
+
|
|
7689
|
+
/* Generic interactive focus ring for app-emitted controls. */
|
|
7690
|
+
.ds-247420 button:focus-visible,
|
|
7691
|
+
.ds-247420 [tabindex]:focus-visible,
|
|
7692
|
+
.ds-247420 a:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
7693
|
+
|
|
7694
|
+
/* Settings-panel field spacing utilities (replace app.js inline style= margins). */
|
|
7695
|
+
.ds-247420 .agentgui-field-mb { margin: 0 0 .5em; }
|
|
7696
|
+
.ds-247420 .agentgui-field-my { margin: .5em 0; }
|
|
7697
|
+
|
|
7698
|
+
@keyframes agentgui-event-flash {
|
|
7699
|
+
0% { background: color-mix(in srgb, var(--accent) 40%, transparent); }
|
|
7700
|
+
100% { background: transparent; }
|
|
7701
|
+
}
|
|
7702
|
+
|
|
7703
|
+
@media (min-width: 900px) {
|
|
7704
|
+
.ds-247420 .settings-grid { grid-template-columns: minmax(0, 420px) minmax(0, 1fr); }
|
|
7705
|
+
}
|
|
7706
|
+
|
|
7707
|
+
/* Tablet: keep the chat control cluster from wrapping the status dot alone. */
|
|
7708
|
+
@media (max-width: 900px) {
|
|
7709
|
+
.ds-247420 .chat-controls select,
|
|
7710
|
+
.ds-247420 .chat-controls .select,
|
|
7711
|
+
.ds-247420 .chat-controls [role="combobox"] { min-width: 110px; max-width: 170px; }
|
|
7712
|
+
}
|
|
7713
|
+
|
|
7714
|
+
/* Touch targets on small screens. */
|
|
7715
|
+
@media (max-width: 640px) {
|
|
7716
|
+
.ds-247420 .pill { min-height: 36px; padding: .4em .8em; }
|
|
7717
|
+
.ds-247420 .history-actions { gap: .75em; }
|
|
7718
|
+
.ds-247420 .history-actions .btn, .ds-247420 .history-actions button { min-height: 44px; }
|
|
7719
|
+
.ds-247420 .cwd-bar-text { max-width: 42vw; }
|
|
7720
|
+
.ds-247420 .cwd-bar { gap: .3em; }
|
|
7721
|
+
}
|
|
7722
|
+
|
|
7723
|
+
@media (prefers-reduced-motion: reduce) {
|
|
7724
|
+
.ds-247420 .ds-event-list .row.event-flash { animation: none; outline: 2px solid var(--accent); }
|
|
7725
|
+
}
|
|
7726
|
+
|
|
7727
|
+
@media print {
|
|
7728
|
+
.ds-247420 #app { min-height: auto; display: block; height: auto; }
|
|
7729
|
+
.ds-247420 .skip-link, .ds-247420 .status-dot, .ds-247420 .history-actions, .ds-247420 .chat-composer { display: none !important; }
|
|
7730
|
+
.ds-247420 .app, .ds-247420 .app-main, .ds-247420 .panel, .ds-247420 .chat, .ds-247420 .chat-thread {
|
|
7731
|
+
background: #fff !important; color: #000 !important; box-shadow: none !important;
|
|
7732
|
+
}
|
|
7733
|
+
}
|
|
7734
|
+
|
|
7447
7735
|
/* spoint/loading-screen.css */
|
|
7448
7736
|
/* Loading-screen kit styles. Scoped under .ds-247420 at build time.
|
|
7449
7737
|
All colors reference design tokens (no raw literals) per the token-lint gate. */
|