anentrypoint-design 0.0.210 → 0.0.212
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 +120 -74
- package/chat.css +94 -20
- package/colors_and_type.css +19 -4
- package/community.css +5 -1
- package/dist/247420.css +489 -100
- package/dist/247420.js +13 -13
- package/package.json +1 -1
- package/src/components/content.js +8 -2
- package/src/components/files.js +24 -28
- package/src/components/sessions.js +9 -4
- package/src/components/shell.js +32 -10
package/dist/247420.css
CHANGED
|
@@ -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
|
|
@@ -1560,13 +1580,15 @@
|
|
|
1560
1580
|
.ds-247420 .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
|
|
1561
1581
|
/* The quick filter is a compact control, not a full-width form row - a giant
|
|
1562
1582
|
input above the grid reads as a search page and costs fold height. */
|
|
1563
|
-
|
|
1583
|
+
/* The filter is now an inline item in the single .ds-file-controls toolbar row
|
|
1584
|
+
(the standalone right-aligned .ds-file-filter strip was removed). */
|
|
1564
1585
|
.ds-247420 .ds-file-filter-input {
|
|
1565
1586
|
width: min(280px, 100%); padding: 6px 12px; font-size: var(--fs-sm);
|
|
1566
1587
|
background: var(--bg); color: var(--fg);
|
|
1567
1588
|
border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
|
|
1568
1589
|
}
|
|
1569
|
-
.ds-247420 .ds-file-filter-input
|
|
1590
|
+
.ds-247420 .ds-file-controls .ds-file-filter-input { flex: 0 1 220px; }
|
|
1591
|
+
.ds-247420 .ds-file-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
|
|
1570
1592
|
.ds-247420 .ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
|
|
1571
1593
|
.ds-247420 .ds-file-sort-btn {
|
|
1572
1594
|
font-size: var(--fs-tiny); font-family: var(--ff-mono); color: var(--fg-3);
|
|
@@ -1687,11 +1709,34 @@
|
|
|
1687
1709
|
.ds-247420 .ds-file-act-warn:hover { background: color-mix(in oklab, var(--warn) 18%, var(--bg)); color: var(--warn); }
|
|
1688
1710
|
|
|
1689
1711
|
/* Multi-select — per-row checkbox, header tri-state, bulk action strip. */
|
|
1712
|
+
/* CSS-drawn multi-select checkbox: a bordered box that fills with the accent +
|
|
1713
|
+
a border-drawn tick when its parent button is .is-marked or aria-checked.
|
|
1714
|
+
Shared by FileRow/FileCell (.is-marked) and the file/session select-all +
|
|
1715
|
+
SessionCard select (aria-checked true/mixed) since the bundle concatenates
|
|
1716
|
+
all CSS. Replaces the old [x]/[ ] bracket text - no glyphs, AT keeps the
|
|
1717
|
+
role=checkbox/aria-checked name+state. */
|
|
1718
|
+
.ds-247420 .ds-check-box {
|
|
1719
|
+
width: 15px; height: 15px; box-sizing: border-box; flex: 0 0 auto; position: relative;
|
|
1720
|
+
border: 1.5px solid var(--fg-3); border-radius: 4px;
|
|
1721
|
+
transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
|
|
1722
|
+
}
|
|
1723
|
+
.ds-247420 .is-marked > .ds-check-box,
|
|
1724
|
+
.ds-247420[aria-checked="true"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
|
|
1725
|
+
.ds-247420 .is-marked > .ds-check-box::after,
|
|
1726
|
+
.ds-247420[aria-checked="true"] > .ds-check-box::after {
|
|
1727
|
+
content: ""; position: absolute; left: 4px; top: 1px; width: 4px; height: 8px;
|
|
1728
|
+
border: solid var(--bg); border-width: 0 1.5px 1.5px 0; transform: rotate(45deg);
|
|
1729
|
+
}
|
|
1730
|
+
.ds-247420[aria-checked="mixed"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
|
|
1731
|
+
.ds-247420[aria-checked="mixed"] > .ds-check-box::after {
|
|
1732
|
+
content: ""; position: absolute; left: 3px; right: 3px; top: 6px; height: 2px; background: var(--bg); border-radius: 1px;
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1690
1735
|
.ds-247420 .ds-file-check {
|
|
1691
1736
|
display: inline-flex; align-items: center; justify-content: center;
|
|
1692
1737
|
min-width: 28px; height: 28px; padding: 0 4px;
|
|
1693
1738
|
background: transparent; border: 0; border-radius: var(--r-1);
|
|
1694
|
-
|
|
1739
|
+
color: var(--fg-3);
|
|
1695
1740
|
cursor: pointer;
|
|
1696
1741
|
transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
|
|
1697
1742
|
}
|
|
@@ -1716,7 +1761,7 @@
|
|
|
1716
1761
|
padding: var(--space-1) var(--space-2);
|
|
1717
1762
|
background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
|
|
1718
1763
|
}
|
|
1719
|
-
.ds-247420 .ds-bulkbar-count { font-size: var(--fs-
|
|
1764
|
+
.ds-247420 .ds-bulkbar-count { font-size: var(--fs-sm); font-weight: 600; color: var(--fg-2); }
|
|
1720
1765
|
/* BulkBar is a toolbar (it even declares role=toolbar): compact rect buttons,
|
|
1721
1766
|
quiet destructive outline - the app arm-confirms destructive bulk actions
|
|
1722
1767
|
via ConfirmDialog, so the strip never needs a loud CTA. */
|
|
@@ -1782,6 +1827,16 @@
|
|
|
1782
1827
|
}
|
|
1783
1828
|
.ds-247420 .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
|
|
1784
1829
|
.ds-247420 .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
|
|
1830
|
+
/* Per-type icon tints on thumb tiles so the grid keeps the colour-coding the
|
|
1831
|
+
list rows already carry (mirrors .ds-file-row[data-file-type] .ds-file-icon). */
|
|
1832
|
+
.ds-247420 .ds-file-cell[data-file-type="dir"] .ds-file-icon { color: var(--accent); }
|
|
1833
|
+
.ds-247420 .ds-file-cell[data-file-type="image"] .ds-file-icon { color: var(--mascot); }
|
|
1834
|
+
.ds-247420 .ds-file-cell[data-file-type="video"] .ds-file-icon { color: var(--purple-2); }
|
|
1835
|
+
.ds-247420 .ds-file-cell[data-file-type="audio"] .ds-file-icon { color: var(--sky); }
|
|
1836
|
+
.ds-247420 .ds-file-cell[data-file-type="code"] .ds-file-icon { color: var(--green-2); }
|
|
1837
|
+
.ds-247420 .ds-file-cell[data-file-type="archive"] .ds-file-icon { color: var(--flame); }
|
|
1838
|
+
.ds-247420 .ds-file-cell[data-file-type="document"] .ds-file-icon { color: var(--amber); }
|
|
1839
|
+
.ds-247420 .ds-file-cell[data-file-type="symlink"] .ds-file-icon { color: var(--purple); }
|
|
1785
1840
|
.ds-247420 .ds-file-cell-name {
|
|
1786
1841
|
font-size: var(--fs-tiny); text-align: left;
|
|
1787
1842
|
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
@@ -1792,13 +1847,6 @@
|
|
|
1792
1847
|
background: color-mix(in oklab, var(--bg) 78%, transparent);
|
|
1793
1848
|
}
|
|
1794
1849
|
|
|
1795
|
-
/* Card mode — opt-in via data-columns; switches the list to a grid. */
|
|
1796
|
-
.ds-247420 .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
|
|
1797
|
-
.ds-247420 .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
|
|
1798
|
-
.ds-247420 .ds-file-grid[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
|
|
1799
|
-
.ds-247420 .ds-file-grid[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
|
|
1800
|
-
.ds-247420 .ds-file-grid[data-columns="4"] { grid-template-columns: repeat(4, 1fr); }
|
|
1801
|
-
|
|
1802
1850
|
/* ============================================================
|
|
1803
1851
|
File browser surface — stage, toolbar, breadcrumb, dropzone,
|
|
1804
1852
|
upload progress, empty state, modals, preview. Authored for
|
|
@@ -1977,7 +2025,7 @@
|
|
|
1977
2025
|
.ds-247420 .ds-file-empty-glyph { font-size: 34px; opacity: 0.55; }
|
|
1978
2026
|
.ds-247420 .ds-file-empty-text { font-size: var(--fs-sm); }
|
|
1979
2027
|
|
|
1980
|
-
/*
|
|
2028
|
+
/* -- Modals ------------------------------------------------- */
|
|
1981
2029
|
.ds-247420 .ds-modal-backdrop {
|
|
1982
2030
|
position: fixed; inset: 0; z-index: var(--z-modal, 800);
|
|
1983
2031
|
display: flex; align-items: center; justify-content: center;
|
|
@@ -2023,7 +2071,7 @@
|
|
|
2023
2071
|
border-radius: var(--r-2); color: var(--fg);
|
|
2024
2072
|
font-family: inherit; font-size: var(--fs-sm);
|
|
2025
2073
|
}
|
|
2026
|
-
.ds-247420 .ds-modal-input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
2074
|
+
.ds-247420 .ds-modal-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
2027
2075
|
/* In-body modal error (role=alert): mutation failures (409/403) surface INSIDE
|
|
2028
2076
|
the dialog, not behind the fixed overlay. */
|
|
2029
2077
|
.ds-247420 .ds-modal-error {
|
|
@@ -2038,7 +2086,7 @@
|
|
|
2038
2086
|
color: var(--on-color);
|
|
2039
2087
|
}
|
|
2040
2088
|
|
|
2041
|
-
/*
|
|
2089
|
+
/* -- Preview ------------------------------------------------ */
|
|
2042
2090
|
.ds-247420 .ds-preview-head {
|
|
2043
2091
|
display: flex; align-items: center; gap: var(--space-3);
|
|
2044
2092
|
padding: var(--space-3) var(--space-4);
|
|
@@ -2111,7 +2159,7 @@
|
|
|
2111
2159
|
.ds-247420 .ds-file-stage { padding: var(--space-3) var(--space-2); }
|
|
2112
2160
|
}
|
|
2113
2161
|
|
|
2114
|
-
/*
|
|
2162
|
+
/* -- File browser UX affordances ---------------------------- */
|
|
2115
2163
|
/* Toolbar filter input — compact search box. */
|
|
2116
2164
|
.ds-247420 .ds-filter-input {
|
|
2117
2165
|
width: clamp(120px, 22vw, 220px);
|
|
@@ -2120,23 +2168,14 @@
|
|
|
2120
2168
|
border-radius: var(--r-pill); color: var(--fg);
|
|
2121
2169
|
font-family: inherit; font-size: var(--fs-xs);
|
|
2122
2170
|
}
|
|
2123
|
-
.ds-247420 .ds-filter-input:focus-visible { outline: none; box-shadow:
|
|
2171
|
+
.ds-247420 .ds-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
|
|
2124
2172
|
|
|
2125
|
-
/* Loading skeleton
|
|
2126
|
-
|
|
2127
|
-
.ds-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
background-size: 200% 100%;
|
|
2132
|
-
}
|
|
2133
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
2134
|
-
.ds-247420 .ds-file-skeleton { animation: ds-skeleton-shimmer 1.2s var(--ease) infinite; }
|
|
2135
|
-
}
|
|
2136
|
-
@keyframes ds-skeleton-shimmer {
|
|
2137
|
-
0% { background-position: 200% 0; }
|
|
2138
|
-
100% { background-position: -200% 0; }
|
|
2139
|
-
}
|
|
2173
|
+
/* Loading skeleton: FileSkeleton renders `.ds-file-grid.ds-file-skeleton` with
|
|
2174
|
+
`.ds-file-row.ds-file-row-skeleton` rows whose inner `.ds-skel` children shimmer
|
|
2175
|
+
(via .ds-skel::after). The container therefore inherits the .ds-file-grid layout
|
|
2176
|
+
and must NOT be a single 48px gradient bar (that collapsed every row and double-
|
|
2177
|
+
shimmered). The dead .ds-file-grid-loading rule + unused ds-skeleton-shimmer
|
|
2178
|
+
keyframe were removed; only the inner .ds-skel children animate. */
|
|
2140
2179
|
|
|
2141
2180
|
/* Drag-to-move drop target highlight on a directory row. */
|
|
2142
2181
|
.ds-247420 .ds-file-row.ds-drop-target {
|
|
@@ -2345,6 +2384,13 @@
|
|
|
2345
2384
|
padding: 10px 12px; border-radius: 6px; overflow-x: auto;
|
|
2346
2385
|
font-family: var(--ff-mono); font-size: 0.9em; margin: 8px 0;
|
|
2347
2386
|
}
|
|
2387
|
+
/* Markdown tables + horizontal rules: agents routinely emit them, but they were
|
|
2388
|
+
unstyled (bare unspaced cells, vanished rules). */
|
|
2389
|
+
.ds-247420 .chat-bubble.chat-md table { border-collapse: collapse; width: auto; max-width: 100%; margin: 8px 0; font-size: .95em; display: block; overflow-x: auto; }
|
|
2390
|
+
.ds-247420 .chat-bubble.chat-md th,
|
|
2391
|
+
.ds-247420 .chat-bubble.chat-md td { border: var(--bw-hair) solid var(--rule); padding: 4px 10px; text-align: left; }
|
|
2392
|
+
.ds-247420 .chat-bubble.chat-md th { background: color-mix(in oklab, var(--fg) 5%, transparent); font-weight: 600; }
|
|
2393
|
+
.ds-247420 .chat-bubble.chat-md hr { border: 0; border-top: var(--bw-hair) solid var(--rule); margin: 12px 0; }
|
|
2348
2394
|
|
|
2349
2395
|
.ds-247420 .chat-msg .chat-bubble.chat-code,
|
|
2350
2396
|
.ds-247420 .chat-msg.you .chat-bubble.chat-code,
|
|
@@ -2643,7 +2689,7 @@
|
|
|
2643
2689
|
.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
2690
|
.ds-247420 .app-side a.active .glyph { color: var(--accent); }
|
|
2645
2691
|
|
|
2646
|
-
/*
|
|
2692
|
+
/* -- select primitive --------------------------------------------------- */
|
|
2647
2693
|
.ds-247420 .ds-select {
|
|
2648
2694
|
width: 100%;
|
|
2649
2695
|
min-width: 0;
|
|
@@ -2667,10 +2713,10 @@
|
|
|
2667
2713
|
background-repeat: no-repeat;
|
|
2668
2714
|
cursor: pointer;
|
|
2669
2715
|
}
|
|
2670
|
-
.ds-247420 .ds-select:focus-visible { box-shadow:
|
|
2716
|
+
.ds-247420 .ds-select:focus-visible { box-shadow: var(--focus-ring-inset); }
|
|
2671
2717
|
.ds-247420 .ds-select:hover { background-color: var(--bg-3); }
|
|
2672
2718
|
|
|
2673
|
-
/*
|
|
2719
|
+
/* -- chat composer autogrow polish (sizing lives in the primary block) -- */
|
|
2674
2720
|
.ds-247420 .chat-composer textarea {
|
|
2675
2721
|
transition: height var(--dur-snap) var(--ease);
|
|
2676
2722
|
}
|
|
@@ -2679,7 +2725,7 @@
|
|
|
2679
2725
|
cursor: not-allowed;
|
|
2680
2726
|
}
|
|
2681
2727
|
|
|
2682
|
-
/*
|
|
2728
|
+
/* -- mobile responsive: chat -------------------------------------------- */
|
|
2683
2729
|
@media (max-width: 768px) {
|
|
2684
2730
|
.ds-247420 .chat-stack { max-width: 100%; }
|
|
2685
2731
|
.ds-247420 .chat-msg { padding: 4px 0; }
|
|
@@ -2704,9 +2750,9 @@
|
|
|
2704
2750
|
Comprehensive improvements for perfect UX across all surfaces
|
|
2705
2751
|
============================================================ */
|
|
2706
2752
|
|
|
2707
|
-
/*
|
|
2753
|
+
/* ------------------------------------------------------------
|
|
2708
2754
|
Component States — Disabled, Loading, Error, Success
|
|
2709
|
-
|
|
2755
|
+
-------------------------------------------------------------- */
|
|
2710
2756
|
|
|
2711
2757
|
/* Disabled state for all interactive elements */
|
|
2712
2758
|
.ds-247420 .btn:disabled, .ds-247420 .btn-primary:disabled, .ds-247420 .btn-ghost:disabled, .ds-247420 button:disabled, .ds-247420[disabled] {
|
|
@@ -2754,9 +2800,9 @@
|
|
|
2754
2800
|
opacity: 0.8;
|
|
2755
2801
|
}
|
|
2756
2802
|
|
|
2757
|
-
/*
|
|
2803
|
+
/* ------------------------------------------------------------
|
|
2758
2804
|
Enhanced Button Micro-Interactions
|
|
2759
|
-
|
|
2805
|
+
-------------------------------------------------------------- */
|
|
2760
2806
|
|
|
2761
2807
|
/* Button scale feedback on active */
|
|
2762
2808
|
.ds-247420 .btn:active:not(:disabled),
|
|
@@ -2783,9 +2829,9 @@
|
|
|
2783
2829
|
-webkit-touch-callout: none;
|
|
2784
2830
|
}
|
|
2785
2831
|
|
|
2786
|
-
/*
|
|
2832
|
+
/* ------------------------------------------------------------
|
|
2787
2833
|
Drag-and-Drop Styles
|
|
2788
|
-
|
|
2834
|
+
-------------------------------------------------------------- */
|
|
2789
2835
|
|
|
2790
2836
|
/* Draggable element */
|
|
2791
2837
|
.ds-247420[draggable="true"], .ds-247420 .draggable {
|
|
@@ -2842,9 +2888,9 @@
|
|
|
2842
2888
|
50% { opacity: 1; }
|
|
2843
2889
|
}
|
|
2844
2890
|
|
|
2845
|
-
/*
|
|
2891
|
+
/* ------------------------------------------------------------
|
|
2846
2892
|
Context Menu Styles
|
|
2847
|
-
|
|
2893
|
+
-------------------------------------------------------------- */
|
|
2848
2894
|
|
|
2849
2895
|
.ds-247420 .ds-context-menu {
|
|
2850
2896
|
position: absolute;
|
|
@@ -2906,9 +2952,9 @@
|
|
|
2906
2952
|
cursor: context-menu;
|
|
2907
2953
|
}
|
|
2908
2954
|
|
|
2909
|
-
/*
|
|
2955
|
+
/* ------------------------------------------------------------
|
|
2910
2956
|
Enhanced Form Inputs
|
|
2911
|
-
|
|
2957
|
+
-------------------------------------------------------------- */
|
|
2912
2958
|
|
|
2913
2959
|
.ds-247420 input[type="text"],
|
|
2914
2960
|
.ds-247420 input[type="email"],
|
|
@@ -2934,7 +2980,7 @@
|
|
|
2934
2980
|
color: var(--fg-3);
|
|
2935
2981
|
}
|
|
2936
2982
|
|
|
2937
|
-
/*
|
|
2983
|
+
/* -- Field controls: themed base for TextField / Select / SearchInput --
|
|
2938
2984
|
Root fix: previously only `transition` was set, so themed apps got
|
|
2939
2985
|
browser-default white boxes in dark mode and labels collided with inputs
|
|
2940
2986
|
because `.ds-field` had no layout. */
|
|
@@ -2983,7 +3029,7 @@
|
|
|
2983
3029
|
.ds-247420 .ds-field .ds-select:focus-visible,
|
|
2984
3030
|
.ds-247420 .ds-search-input:focus-visible {
|
|
2985
3031
|
outline: none;
|
|
2986
|
-
box-shadow:
|
|
3032
|
+
box-shadow: var(--focus-ring-inset);
|
|
2987
3033
|
}
|
|
2988
3034
|
.ds-247420 .ds-field input:disabled,
|
|
2989
3035
|
.ds-247420 .ds-field textarea:disabled,
|
|
@@ -3021,9 +3067,9 @@
|
|
|
3021
3067
|
color: var(--fg);
|
|
3022
3068
|
}
|
|
3023
3069
|
|
|
3024
|
-
/*
|
|
3070
|
+
/* ------------------------------------------------------------
|
|
3025
3071
|
Accessibility Enhancements
|
|
3026
|
-
|
|
3072
|
+
-------------------------------------------------------------- */
|
|
3027
3073
|
|
|
3028
3074
|
/* Enhanced focus-visible for all interactive elements */
|
|
3029
3075
|
.ds-247420[role="button"]:focus-visible,
|
|
@@ -3052,11 +3098,17 @@
|
|
|
3052
3098
|
animation-iteration-count: 1 !important;
|
|
3053
3099
|
transition-duration: 0.01ms !important;
|
|
3054
3100
|
}
|
|
3101
|
+
/* Kill the residual paint frame of looping skeleton/shimmer placeholders and
|
|
3102
|
+
give reduced-motion users a steady placeholder fill instead. */
|
|
3103
|
+
.ds-247420 .skeleton, .ds-247420 .ds-skeleton, .ds-247420 .ds-session-row-skeleton .ds-skel {
|
|
3104
|
+
animation: none !important;
|
|
3105
|
+
background: var(--bg-2) !important;
|
|
3106
|
+
}
|
|
3055
3107
|
}
|
|
3056
3108
|
|
|
3057
|
-
/*
|
|
3109
|
+
/* ------------------------------------------------------------
|
|
3058
3110
|
Performance
|
|
3059
|
-
|
|
3111
|
+
-------------------------------------------------------------- */
|
|
3060
3112
|
|
|
3061
3113
|
/* Limit layout/style containment to self-contained components. `paint` is
|
|
3062
3114
|
intentionally omitted — it clips focus rings, tooltips and dropdowns that
|
|
@@ -3065,9 +3117,9 @@
|
|
|
3065
3117
|
contain: layout style;
|
|
3066
3118
|
}
|
|
3067
3119
|
|
|
3068
|
-
/*
|
|
3120
|
+
/* ------------------------------------------------------------
|
|
3069
3121
|
Mobile Touch Optimizations
|
|
3070
|
-
|
|
3122
|
+
-------------------------------------------------------------- */
|
|
3071
3123
|
|
|
3072
3124
|
@media (hover: none) and (pointer: coarse) {
|
|
3073
3125
|
/* Mobile devices: larger touch targets, faster responses */
|
|
@@ -3096,9 +3148,9 @@
|
|
|
3096
3148
|
}
|
|
3097
3149
|
}
|
|
3098
3150
|
|
|
3099
|
-
/*
|
|
3151
|
+
/* ------------------------------------------------------------
|
|
3100
3152
|
Theme Transition Smoothness
|
|
3101
|
-
|
|
3153
|
+
-------------------------------------------------------------- */
|
|
3102
3154
|
|
|
3103
3155
|
/* Scoped to the DS wrapper so the design system never reaches out and
|
|
3104
3156
|
animates the host document's html/body. */
|
|
@@ -3107,9 +3159,9 @@
|
|
|
3107
3159
|
color var(--dur-base) var(--ease);
|
|
3108
3160
|
}
|
|
3109
3161
|
|
|
3110
|
-
/*
|
|
3162
|
+
/* ------------------------------------------------------------
|
|
3111
3163
|
Empty State & Loading States
|
|
3112
|
-
|
|
3164
|
+
-------------------------------------------------------------- */
|
|
3113
3165
|
|
|
3114
3166
|
.ds-247420 .empty-state {
|
|
3115
3167
|
display: flex; flex-direction: column; align-items: center; gap: var(--space-4);
|
|
@@ -3147,9 +3199,9 @@
|
|
|
3147
3199
|
.ds-247420 .skeleton-line { height: 12px; margin-bottom: 12px; }
|
|
3148
3200
|
.ds-247420 .skeleton-title { height: 24px; margin-bottom: 16px; width: 60%; }
|
|
3149
3201
|
|
|
3150
|
-
/*
|
|
3202
|
+
/* ------------------------------------------------------------
|
|
3151
3203
|
Toast Notification Styles
|
|
3152
|
-
|
|
3204
|
+
-------------------------------------------------------------- */
|
|
3153
3205
|
|
|
3154
3206
|
.ds-247420 .toast {
|
|
3155
3207
|
position: fixed;
|
|
@@ -3476,6 +3528,15 @@
|
|
|
3476
3528
|
.ds-247420 .ws-resizer.ws-resizer-rail { grid-column: 1; }
|
|
3477
3529
|
.ds-247420 .ws-resizer.ws-resizer-sessions { grid-column: 2; }
|
|
3478
3530
|
.ds-247420 .ws-resizer.ws-resizer-pane { grid-column: 3; justify-self: end; }
|
|
3531
|
+
/* A resizer must vanish once its TRACK is removed by the staging media blocks,
|
|
3532
|
+
else dragging it writes a --ws-*-w var that no longer affects the now-fixed
|
|
3533
|
+
drawer (a dead handle). Mirror the 1480 / 1100 / 900 staging exactly. */
|
|
3534
|
+
@media (max-width: 1480px) { .ds-247420 .ws-resizer.ws-resizer-pane { display: none; } }
|
|
3535
|
+
@media (max-width: 1100px) { .ds-247420 .ws-resizer.ws-resizer-sessions { display: none; } }
|
|
3536
|
+
@media (max-width: 900px) { .ds-247420 .ws-resizer { display: none; } }
|
|
3537
|
+
/* Coarse-pointer hit target for hybrid touch laptops above the drawer breakpoint
|
|
3538
|
+
(the 8px sliver is un-grabbable by touch). */
|
|
3539
|
+
@media (pointer: coarse) { .ds-247420 .ws-resizer { width: 16px; margin-right: -8px; } }
|
|
3479
3540
|
/* Ease the rail/pane collapse. Track COUNT stays stable on collapse (only a
|
|
3480
3541
|
width var flips), so grid-template-columns is animatable; reduced-motion
|
|
3481
3542
|
drops it to an instant swap. */
|
|
@@ -3555,7 +3616,7 @@
|
|
|
3555
3616
|
/* Crumb band is the top chrome of the content column: a stable height so the
|
|
3556
3617
|
top edge aligns with the rail head, and a left gutter matching .ws-main so
|
|
3557
3618
|
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-
|
|
3619
|
+
.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
3620
|
.ds-247420 .ws-crumb-main { flex: 1 1 auto; min-width: 0; }
|
|
3560
3621
|
/* Content column gutter. Claude-Code-class calm: file grid / dashboard / event
|
|
3561
3622
|
list / history get a generous, consistent inner gutter instead of butting
|
|
@@ -4916,7 +4977,11 @@
|
|
|
4916
4977
|
.ds-247420 .cm-vs-btn,
|
|
4917
4978
|
.ds-247420 .cm-user-btn,
|
|
4918
4979
|
.ds-247420 .cm-ch-spinner,
|
|
4919
|
-
.ds-247420 .cm-ch-voice-badge
|
|
4980
|
+
.ds-247420 .cm-ch-voice-badge,
|
|
4981
|
+
.ds-247420 .vx-ptt,
|
|
4982
|
+
.ds-247420 .vx-ptt-glow,
|
|
4983
|
+
.ds-247420 .vx-vad-meter,
|
|
4984
|
+
.ds-247420 .vx-vad-fill {
|
|
4920
4985
|
transition: none !important;
|
|
4921
4986
|
animation: none !important;
|
|
4922
4987
|
}
|
|
@@ -5455,14 +5520,14 @@
|
|
|
5455
5520
|
}
|
|
5456
5521
|
.ds-247420 .agentchat-empty-title { margin: 0; font-size: 1.05em; color: var(--fg-2, var(--fg)); }
|
|
5457
5522
|
.ds-247420 .agentchat-empty-sub { margin: 0; font-size: var(--fs-sm); }
|
|
5458
|
-
.ds-247420 .agentchat-empty-suggestions {
|
|
5523
|
+
.ds-247420 .agentchat-empty-suggestions, .ds-247420 .chat-empty-suggestions {
|
|
5459
5524
|
display: flex;
|
|
5460
5525
|
flex-wrap: wrap;
|
|
5461
5526
|
gap: .5em;
|
|
5462
5527
|
justify-content: center;
|
|
5463
5528
|
margin-top: .5em;
|
|
5464
5529
|
}
|
|
5465
|
-
.ds-247420 .agentchat-empty-suggestion {
|
|
5530
|
+
.ds-247420 .agentchat-empty-suggestion, .ds-247420 .chat-empty-suggestion {
|
|
5466
5531
|
cursor: pointer;
|
|
5467
5532
|
font: inherit;
|
|
5468
5533
|
font-size: var(--fs-tiny);
|
|
@@ -5472,8 +5537,8 @@
|
|
|
5472
5537
|
background: color-mix(in srgb, var(--fg) 5%, transparent);
|
|
5473
5538
|
color: var(--fg-2, var(--fg));
|
|
5474
5539
|
}
|
|
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; }
|
|
5540
|
+
.ds-247420 .agentchat-empty-suggestion:hover, .ds-247420 .chat-empty-suggestion:hover { background: color-mix(in srgb, var(--accent, var(--fg)) 12%, transparent); }
|
|
5541
|
+
.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
5542
|
|
|
5478
5543
|
/* Guided install path in the empty state: copy line + monospaced command rows
|
|
5479
5544
|
(each with its own copy button) + a recheck button. No animation. */
|
|
@@ -5546,6 +5611,23 @@
|
|
|
5546
5611
|
@media (prefers-reduced-motion: reduce) {
|
|
5547
5612
|
.ds-247420 .agentchat-working .chat-thinking-dots span { animation: none; opacity: .7; }
|
|
5548
5613
|
}
|
|
5614
|
+
/* Standalone thinking part (ThinkingNode renders .chat-bubble.chat-thinking with
|
|
5615
|
+
.chat-thinking-dots + .chat-thinking-text OUTSIDE the .agentchat-working tail).
|
|
5616
|
+
Without these base rules the dots are invisible empty spans and the text has
|
|
5617
|
+
no muted tone. Reuse the agentchat-dot-bounce keyframe. */
|
|
5618
|
+
.ds-247420 .chat-thinking { display: flex; align-items: center; gap: .5em; color: var(--fg-3); font-size: var(--fs-tiny); background: none; padding: .3em .2em; }
|
|
5619
|
+
.ds-247420 .chat-thinking-text { color: var(--fg-3); }
|
|
5620
|
+
.ds-247420 .chat-thinking-dots { display: inline-flex; gap: 3px; }
|
|
5621
|
+
.ds-247420 .chat-thinking-dots span {
|
|
5622
|
+
width: 5px; height: 5px; border-radius: 50%;
|
|
5623
|
+
background: var(--fg); opacity: .4;
|
|
5624
|
+
animation: agentchat-dot-bounce 1.2s infinite ease-in-out;
|
|
5625
|
+
}
|
|
5626
|
+
.ds-247420 .chat-thinking-dots span:nth-child(2) { animation-delay: .15s; }
|
|
5627
|
+
.ds-247420 .chat-thinking-dots span:nth-child(3) { animation-delay: .3s; }
|
|
5628
|
+
@media (prefers-reduced-motion: reduce) {
|
|
5629
|
+
.ds-247420 .chat-thinking-dots span { animation: none; opacity: .7; }
|
|
5630
|
+
}
|
|
5549
5631
|
|
|
5550
5632
|
/* Responsive: the control cluster + cwd bar must stay usable on phones/tablets.
|
|
5551
5633
|
The cwd path can't eat the row beside its label + buttons on a narrow screen. */
|
|
@@ -5573,16 +5655,20 @@
|
|
|
5573
5655
|
display: inline-block; width: 8px; height: 8px; border-radius: 50%;
|
|
5574
5656
|
background: var(--fg-3); flex: 0 0 auto;
|
|
5575
5657
|
}
|
|
5658
|
+
/* Each variant carries a non-colour channel (fill vs halo vs hollow ring) so the
|
|
5659
|
+
states stay distinguishable for colour-blind users and when stale/connecting
|
|
5660
|
+
would otherwise share a hue. Mirrors the rail-tone shape differentiation. */
|
|
5576
5661
|
.ds-247420 .status-dot-disc.status-dot-live { background: var(--accent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
|
|
5577
|
-
.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(--
|
|
5662
|
+
.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
|
+
.ds-247420 .status-dot-disc.status-dot-connecting { background: transparent; box-shadow: inset 0 0 0 2px var(--amber); }
|
|
5664
|
+
.ds-247420 .status-dot-disc.status-dot-stale { background: color-mix(in oklab, var(--warn) 70%, var(--fg-3)); }
|
|
5580
5665
|
@keyframes status-disc-pulse {
|
|
5581
5666
|
0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent); }
|
|
5582
5667
|
50% { box-shadow: 0 0 0 4px color-mix(in oklab, var(--accent) 0%, transparent); }
|
|
5583
5668
|
}
|
|
5584
5669
|
@media (prefers-reduced-motion: reduce) {
|
|
5585
|
-
|
|
5670
|
+
/* Keep the live disc shape-differentiated without motion: a static concentric ring. */
|
|
5671
|
+
.ds-247420 .status-dot-disc.status-dot-live { animation: none; box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 35%, transparent); }
|
|
5586
5672
|
}
|
|
5587
5673
|
|
|
5588
5674
|
/* ----------------------------------------------------------------------------
|
|
@@ -5638,14 +5724,16 @@
|
|
|
5638
5724
|
/* Rail tones MUST match .row.rail-* in app-shell.css so the same semantic state
|
|
5639
5725
|
reads as one colour across the conversation list and content rows. */
|
|
5640
5726
|
.ds-247420 .ds-session-row.rail-green::before { background: var(--accent); }
|
|
5641
|
-
.ds-247420 .ds-session-row.rail-purple::before { background: var(--purple-2
|
|
5727
|
+
.ds-247420 .ds-session-row.rail-purple::before { background: var(--purple-2); }
|
|
5642
5728
|
.ds-247420 .ds-session-row.rail-flame::before { background: var(--flame); }
|
|
5643
5729
|
.ds-247420 .ds-session-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
|
|
5644
5730
|
.ds-247420 .ds-session-title { font-size: var(--fs-sm); color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
5645
5731
|
.ds-247420 .ds-session-sub { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
5646
5732
|
.ds-247420 .ds-session-meta { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
|
|
5647
5733
|
.ds-247420 .ds-session-agent { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
|
|
5648
|
-
|
|
5734
|
+
/* New-activity cue is a hollow accent RING so it stays shape-distinct from the
|
|
5735
|
+
running live disc (a solid pulsing accent dot) for colour-blind / reduced-motion users. */
|
|
5736
|
+
.ds-247420 .ds-session-unread { width: 8px; height: 8px; border-radius: 50%; background: transparent; box-shadow: inset 0 0 0 2px var(--accent); display: inline-block; }
|
|
5649
5737
|
.ds-247420 .ds-session-state { padding: var(--space-5) var(--space-3); text-align: center; color: var(--fg-3); font-size: var(--fs-sm); }
|
|
5650
5738
|
.ds-247420 .ds-session-state-error { color: var(--flame); }
|
|
5651
5739
|
|
|
@@ -5675,13 +5763,15 @@
|
|
|
5675
5763
|
.ds-247420 .ds-dash-card.is-error { border-color: var(--flame); }
|
|
5676
5764
|
.ds-247420 .ds-dash-card-head { display: flex; align-items: center; gap: var(--space-2); }
|
|
5677
5765
|
.ds-247420 .ds-dash-status { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; }
|
|
5678
|
-
|
|
5766
|
+
/* running tone unified on --accent (the later is-running rule + the live disc all
|
|
5767
|
+
use --accent); the dead var(--green) duplicate that lived here was removed. */
|
|
5679
5768
|
.ds-247420 .ds-dash-status.is-error { color: var(--flame); }
|
|
5680
5769
|
.ds-247420 .ds-dash-agent { font-size: var(--fs-body); font-weight: 600; color: var(--fg); }
|
|
5681
5770
|
.ds-247420 .ds-dash-model { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); margin-left: auto; }
|
|
5682
5771
|
.ds-247420 .ds-dash-meta { display: flex; flex-direction: column; gap: 2px; }
|
|
5683
5772
|
.ds-247420 .ds-dash-cwd { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
5684
5773
|
.ds-247420 .ds-dash-stat { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2); }
|
|
5774
|
+
.ds-247420 .ds-dash-stat-cost { color: var(--fg); font-weight: 600; }
|
|
5685
5775
|
.ds-247420 .ds-dash-activity { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
5686
5776
|
.ds-247420 .ds-dash-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
|
|
5687
5777
|
.ds-247420 .ds-dash-state { padding: var(--space-6) var(--space-4); text-align: center; color: var(--fg-3); font-size: var(--fs-body); }
|
|
@@ -5728,6 +5818,13 @@
|
|
|
5728
5818
|
/* --- B1: streaming pre shell — monospaced bubble while a fenced block streams,
|
|
5729
5819
|
so it does not reflow prose->block on settle. --- */
|
|
5730
5820
|
.ds-247420 .chat-stream-pre pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: var(--ff-mono); font-size: var(--fs-sm); }
|
|
5821
|
+
/* Persistent minimal chrome so a fenced block does not pop a border + lang tab +
|
|
5822
|
+
copy button only on settle - the streaming slab already reads as a code block. */
|
|
5823
|
+
.ds-247420 .chat-stream-pre { position: relative; }
|
|
5824
|
+
.ds-247420 .chat-stream-pre pre {
|
|
5825
|
+
border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
|
|
5826
|
+
padding: var(--space-3); background: color-mix(in oklab, var(--fg) 4%, transparent);
|
|
5827
|
+
}
|
|
5731
5828
|
|
|
5732
5829
|
/* --- A5: composer context line (agent / model / cwd at point of typing). --- */
|
|
5733
5830
|
.ds-247420 .chat-composer-context {
|
|
@@ -5740,11 +5837,25 @@
|
|
|
5740
5837
|
.ds-247420 button.chat-composer-context:hover { color: var(--fg-2); }
|
|
5741
5838
|
.ds-247420 button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
5742
5839
|
|
|
5840
|
+
/* Composer send/cancel button row: a non-wrapping cluster pinned to the
|
|
5841
|
+
bottom-right of the flex-end composer (was unstyled, so the send button
|
|
5842
|
+
could wrap below the textarea instead of anchoring like claude.ai/code). */
|
|
5843
|
+
.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; }
|
|
5844
|
+
/* Unify the toolbar cluster on one 32px / --r-1 square metric (the round 40px
|
|
5845
|
+
ghost buttons + 36px square send read as two button systems; the kit moved
|
|
5846
|
+
.btn* off --r-pill). chat.css loads after app-shell.css so this wins by order. */
|
|
5847
|
+
.ds-247420 .chat-composer-toolbar .composer-btn,
|
|
5848
|
+
.ds-247420 .chat-composer-toolbar .send { width: 32px; height: 32px; border-radius: var(--r-1); }
|
|
5849
|
+
@media (pointer: coarse) {
|
|
5850
|
+
.ds-247420 .chat-composer-toolbar .composer-btn,
|
|
5851
|
+
.ds-247420 .chat-composer-toolbar .send { width: 44px; height: 44px; }
|
|
5852
|
+
}
|
|
5853
|
+
|
|
5743
5854
|
/* --- B2: follow-up chips below the last settled assistant turn. --- */
|
|
5744
5855
|
.ds-247420 .agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
|
|
5745
5856
|
|
|
5746
5857
|
/* --- C1: stale/idle dashboard status (static, NOT pulsing). --- */
|
|
5747
|
-
.ds-247420 .ds-dash-status.is-stale { color: var(--amber
|
|
5858
|
+
.ds-247420 .ds-dash-status.is-stale { color: var(--amber); }
|
|
5748
5859
|
.ds-247420 .ds-dash-status.is-running { color: var(--accent); }
|
|
5749
5860
|
|
|
5750
5861
|
/* --- C2: dashboard sort/filter toolbar + stream-state line. --- */
|
|
@@ -5762,7 +5873,7 @@
|
|
|
5762
5873
|
}
|
|
5763
5874
|
.ds-247420 .ds-dash-stream { font-size: var(--fs-tiny); color: var(--fg-3); }
|
|
5764
5875
|
.ds-247420 .ds-dash-stream.is-lost { color: var(--flame); }
|
|
5765
|
-
.ds-247420 .ds-dash-stream.is-connecting { color: var(--amber
|
|
5876
|
+
.ds-247420 .ds-dash-stream.is-connecting { color: var(--amber); }
|
|
5766
5877
|
.ds-247420 .ds-dash-header .spread { flex: 1; }
|
|
5767
5878
|
.ds-247420 .ds-dash-errors-toggle {
|
|
5768
5879
|
padding: 4px 10px; min-height: 32px; border: var(--bw-hair) solid var(--bg-3);
|
|
@@ -5788,7 +5899,7 @@
|
|
|
5788
5899
|
/* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
|
|
5789
5900
|
agent is flagged in a dense grid, not merely faded near-invisibly. The word
|
|
5790
5901
|
'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
|
|
5902
|
+
.ds-247420 .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber); }
|
|
5792
5903
|
|
|
5793
5904
|
/* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
|
|
5794
5905
|
|
|
@@ -5945,7 +6056,7 @@
|
|
|
5945
6056
|
}
|
|
5946
6057
|
|
|
5947
6058
|
/* Stopping state: in-flight cancel reads distinctly from running/error. */
|
|
5948
|
-
.ds-247420 .ds-dash-status.is-stopping { color: var(--amber
|
|
6059
|
+
.ds-247420 .ds-dash-status.is-stopping { color: var(--amber); }
|
|
5949
6060
|
|
|
5950
6061
|
/* External (observed, not owned) session card: no stop control exists. */
|
|
5951
6062
|
.ds-247420 .ds-dash-external {
|
|
@@ -5977,8 +6088,29 @@
|
|
|
5977
6088
|
.ds-247420 .chat-msg-flat.you .chat-role { color: var(--accent); }
|
|
5978
6089
|
.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
6090
|
.ds-247420 .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
|
|
5980
|
-
|
|
5981
|
-
|
|
6091
|
+
/* Flat turns strip the bubble padding, so the role label sat 4px above the first
|
|
6092
|
+
paragraph and the .them tint hugged text flush. Restore reading rhythm + give
|
|
6093
|
+
the tinted assistant row inner breathing room so it reads as a card. */
|
|
6094
|
+
.ds-247420 .chat-msg-flat .chat-role { margin-bottom: var(--space-2); }
|
|
6095
|
+
.ds-247420 .chat-msg-flat .chat-md { line-height: 1.65; }
|
|
6096
|
+
.ds-247420 .chat-msg-flat .chat-md p { margin: 8px 0; }
|
|
6097
|
+
.ds-247420 .chat-msg-flat.them { padding-block: calc(var(--space-3) * var(--density, 1) + 2px); }
|
|
6098
|
+
/* Inline backtick code (renderInline tags <code class=chat-tick>) - was a dead
|
|
6099
|
+
class relying on the generic .chat-bubble code rule, so notices / non-bubble
|
|
6100
|
+
surfaces got unstyled monospace. Self-style it regardless of container. */
|
|
6101
|
+
.ds-247420 .chat-tick { font-family: var(--ff-mono); font-size: .92em; background: color-mix(in oklab, var(--fg) 10%, transparent); padding: 1px 6px; border-radius: var(--r-1); }
|
|
6102
|
+
/* Structured tool/code output earns more width than running prose (claude.ai/code
|
|
6103
|
+
lets diffs/tables break out wider than the reading measure). A flat turn that
|
|
6104
|
+
contains a tool card or code block widens itself AND its stack past --measure;
|
|
6105
|
+
prose-only turns stay clamped. */
|
|
6106
|
+
.ds-247420 .chat-msg-flat:has(.chat-tool),
|
|
6107
|
+
.ds-247420 .chat-msg-flat:has(.chat-bubble.chat-code) { max-width: calc(var(--measure) + 14ch); }
|
|
6108
|
+
.ds-247420 .chat-msg-flat:has(.chat-tool) .chat-stack,
|
|
6109
|
+
.ds-247420 .chat-msg-flat:has(.chat-bubble.chat-code) .chat-stack { max-width: calc(var(--measure) + 14ch); }
|
|
6110
|
+
/* Hover tint exceeds each role's REST tint so the row gives feedback (and the
|
|
6111
|
+
ladder stays monotonic): assistant 5% > its 3% rest; user 4% > transparent. */
|
|
6112
|
+
.ds-247420 .chat-msg-flat.them:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
|
|
6113
|
+
.ds-247420 .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 4%, transparent); }
|
|
5982
6114
|
.ds-247420 .chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
|
|
5983
6115
|
.ds-247420 .chat-msg-flat .chat-avatar { display: none; }
|
|
5984
6116
|
|
|
@@ -6012,6 +6144,9 @@
|
|
|
6012
6144
|
}
|
|
6013
6145
|
.ds-247420 .chat-msg .chat-tool.tool-running .chat-tool-status { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
|
|
6014
6146
|
.ds-247420 .chat-msg .chat-tool.tool-error .chat-tool-status { color: var(--flame); background: color-mix(in oklab, var(--flame) 12%, transparent); }
|
|
6147
|
+
/* Completed tool: a positive (success) tone so done reads distinctly from the
|
|
6148
|
+
neutral pill and from the accent-toned running pill (--success = green-2). */
|
|
6149
|
+
.ds-247420 .chat-msg .chat-tool.tool-done .chat-tool-status { color: var(--success); background: color-mix(in oklab, var(--success) 12%, transparent); }
|
|
6015
6150
|
.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
6151
|
.ds-247420 .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
|
|
6017
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); }
|
|
@@ -6046,6 +6181,10 @@
|
|
|
6046
6181
|
}
|
|
6047
6182
|
@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
6183
|
.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); }
|
|
6184
|
+
/* Error card carries the strongest left-bar tone (flame > stale amber > active
|
|
6185
|
+
accent), placed last so its inset bar wins source order over is-active/is-stale.
|
|
6186
|
+
The full-perimeter border-color (line ~396) stays for extra severity emphasis. */
|
|
6187
|
+
.ds-247420 .ds-dash-card.is-error { box-shadow: inset 2px 0 0 var(--flame); }
|
|
6049
6188
|
@media (prefers-reduced-motion: no-preference) {
|
|
6050
6189
|
.ds-247420 .ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
|
|
6051
6190
|
}
|
|
@@ -6055,9 +6194,9 @@
|
|
|
6055
6194
|
.ds-247420 .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
|
|
6056
6195
|
.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); }
|
|
6057
6196
|
.ds-247420 .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
|
|
6058
|
-
.ds-247420 .ds-dash-breakdown .seg.is-running { color: var(--
|
|
6197
|
+
.ds-247420 .ds-dash-breakdown .seg.is-running { color: var(--accent); font-weight: 600; }
|
|
6059
6198
|
.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
|
|
6199
|
+
.ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--amber); font-weight: 600; }
|
|
6061
6200
|
.ds-247420 .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
|
|
6062
6201
|
.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
6202
|
.ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
@@ -6078,7 +6217,7 @@
|
|
|
6078
6217
|
.ds-247420 .ds-preview-code code { color: var(--fg); }
|
|
6079
6218
|
.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
6219
|
.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
|
|
6220
|
+
.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
6221
|
.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
6222
|
.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
6223
|
.ds-247420 .ds-preview-code .token.function, .ds-247420 .ds-preview-code .token.class-name { color: var(--code-fn, var(--flame)); }
|
|
@@ -6379,7 +6518,7 @@
|
|
|
6379
6518
|
font: var(--fs-tiny, 12px)/1.3 var(--ff-mono, monospace);
|
|
6380
6519
|
min-width: 0;
|
|
6381
6520
|
}
|
|
6382
|
-
.ds-247420 .ds-input-bare:focus { outline: none; border-color: var(--accent); }
|
|
6521
|
+
.ds-247420 .ds-input-bare:focus-visible { outline: none; border-color: var(--accent); box-shadow: var(--focus-ring-inset); }
|
|
6383
6522
|
/* A property field whose control spans the full panel width (label above,
|
|
6384
6523
|
control below) — used for wide segmented controls that would clip in the
|
|
6385
6524
|
narrow value column. */
|
|
@@ -7444,6 +7583,256 @@
|
|
|
7444
7583
|
align-content: start;
|
|
7445
7584
|
}
|
|
7446
7585
|
|
|
7586
|
+
/* app-surfaces.css */
|
|
7587
|
+
/* app-surfaces.css — agentgui application-surface styling.
|
|
7588
|
+
*
|
|
7589
|
+
* Owns every design decision for the agentgui consumer app's own surfaces
|
|
7590
|
+
* (the bits the app composes around the flagship kit components): the project
|
|
7591
|
+
* filter pills, the working-directory bar, the resume banner, the backend
|
|
7592
|
+
* health chips, the settings two-column grid, the history empty state, the
|
|
7593
|
+
* boot splash, the chat control cluster, and the cross-cutting base (scrollbar
|
|
7594
|
+
* theming, focus rings, print). These previously lived as a hand-rolled inline
|
|
7595
|
+
* \3c style> block in agentgui's index.html; the kit now owns them so NO design
|
|
7596
|
+
* content lives in the consumer app.
|
|
7597
|
+
*
|
|
7598
|
+
* Every selector is written pre-scoped under `.ds-247420` (the consumer mounts
|
|
7599
|
+
* on <html class="ds-247420">), so the build's selector-prefixer leaves them
|
|
7600
|
+
* untouched rather than mis-compounding the `[attr]` / `*` / bare-element
|
|
7601
|
+
* selectors. All colour/space/radius/font values read from kit tokens
|
|
7602
|
+
* (colors_and_type.css) — there are no app-local colour fallbacks. */
|
|
7603
|
+
|
|
7604
|
+
/* Visually-hidden but screen-reader-available (aria-live announcer, labels). */
|
|
7605
|
+
.ds-247420 .sr-only {
|
|
7606
|
+
position: absolute !important; width: 1px; height: 1px;
|
|
7607
|
+
padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0);
|
|
7608
|
+
white-space: nowrap; border: 0;
|
|
7609
|
+
}
|
|
7610
|
+
|
|
7611
|
+
/* Base: full-height app root reading kit tokens. */
|
|
7612
|
+
.ds-247420, .ds-247420 body { margin: 0; height: 100%; }
|
|
7613
|
+
.ds-247420 body {
|
|
7614
|
+
background: var(--bg);
|
|
7615
|
+
color: var(--fg);
|
|
7616
|
+
font-family: var(--ff-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);
|
|
7617
|
+
}
|
|
7618
|
+
.ds-247420 #app { height: 100vh; height: 100dvh; }
|
|
7619
|
+
.ds-247420 #app > * { height: 100%; }
|
|
7620
|
+
|
|
7621
|
+
/* Themed thin scrollbars — the native chrome scrollbar is chunky/light and
|
|
7622
|
+
clashes with the dark theme on the history sidebar and settings column. */
|
|
7623
|
+
.ds-247420 * {
|
|
7624
|
+
scrollbar-width: thin;
|
|
7625
|
+
scrollbar-color: color-mix(in srgb, var(--fg) 22%, transparent) transparent;
|
|
7626
|
+
}
|
|
7627
|
+
.ds-247420 *::-webkit-scrollbar { width: 9px; height: 9px; }
|
|
7628
|
+
.ds-247420 *::-webkit-scrollbar-track { background: transparent; }
|
|
7629
|
+
.ds-247420 *::-webkit-scrollbar-thumb {
|
|
7630
|
+
background: color-mix(in srgb, var(--fg) 20%, transparent);
|
|
7631
|
+
border-radius: 999px;
|
|
7632
|
+
border: 2px solid transparent;
|
|
7633
|
+
background-clip: padding-box;
|
|
7634
|
+
}
|
|
7635
|
+
.ds-247420 *::-webkit-scrollbar-thumb:hover {
|
|
7636
|
+
background: color-mix(in srgb, var(--fg) 34%, transparent);
|
|
7637
|
+
background-clip: padding-box;
|
|
7638
|
+
}
|
|
7639
|
+
|
|
7640
|
+
/* We move focus to the page heading on tab change for AT users; suppress the
|
|
7641
|
+
resulting outline box on those programmatically-focused elements. */
|
|
7642
|
+
.ds-247420 [data-prog-focus]:focus,
|
|
7643
|
+
.ds-247420 [data-prog-focus]:focus-visible { outline: none !important; box-shadow: none !important; }
|
|
7644
|
+
|
|
7645
|
+
/* The connection-dot disc + pulse are the kit's canonical .status-dot-disc;
|
|
7646
|
+
only the inline-flex wrapper layout stays here. */
|
|
7647
|
+
.ds-247420 .status-dot { display: inline-flex; align-items: center; gap: .4em; white-space: nowrap; }
|
|
7648
|
+
|
|
7649
|
+
/* Resume banner. */
|
|
7650
|
+
.ds-247420 .resume-banner {
|
|
7651
|
+
padding: .6em .8em;
|
|
7652
|
+
background: color-mix(in srgb, var(--accent) 12%, transparent);
|
|
7653
|
+
border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
|
|
7654
|
+
border-radius: var(--r-1, 8px);
|
|
7655
|
+
display: flex; justify-content: space-between; align-items: center; gap: .75em;
|
|
7656
|
+
margin-bottom: .75em;
|
|
7657
|
+
}
|
|
7658
|
+
|
|
7659
|
+
/* History action buttons. */
|
|
7660
|
+
.ds-247420 .history-actions { display: flex; gap: .5em; padding: 0 0 .75em 0; flex-wrap: wrap; }
|
|
7661
|
+
|
|
7662
|
+
/* Empty / loading state. */
|
|
7663
|
+
.ds-247420 .empty-state { display: flex; gap: 8px; align-items: center; padding: .5em 0; white-space: normal; }
|
|
7664
|
+
.ds-247420 p.empty-state { text-align: left; padding: .6em 0; color: var(--fg-3); }
|
|
7665
|
+
|
|
7666
|
+
/* Project filter pills. */
|
|
7667
|
+
.ds-247420 .pill-row { display: flex; flex-wrap: wrap; gap: .35em; padding: .35em 0; }
|
|
7668
|
+
.ds-247420 .pill {
|
|
7669
|
+
cursor: pointer; padding: .25em .7em; border-radius: 999px;
|
|
7670
|
+
border: 1px solid transparent; background: transparent;
|
|
7671
|
+
font: inherit; color: inherit; line-height: 1.4;
|
|
7672
|
+
transition: background-color .15s ease, border-color .15s ease;
|
|
7673
|
+
min-height: 28px;
|
|
7674
|
+
}
|
|
7675
|
+
.ds-247420 .pill:hover { background: color-mix(in srgb, var(--accent) 10%, transparent); }
|
|
7676
|
+
.ds-247420 .pill.pill-active {
|
|
7677
|
+
background: color-mix(in srgb, var(--accent) 18%, transparent);
|
|
7678
|
+
border-color: color-mix(in srgb, var(--accent) 40%, transparent);
|
|
7679
|
+
}
|
|
7680
|
+
.ds-247420 .pill:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
7681
|
+
|
|
7682
|
+
/* Subagent toggle (the control itself is the kit Checkbox). */
|
|
7683
|
+
.ds-247420 .subagent-toggle { padding: .4em 0; min-height: 32px; }
|
|
7684
|
+
|
|
7685
|
+
.ds-247420 .field-error { color: var(--warn); }
|
|
7686
|
+
|
|
7687
|
+
/* Boot splash: static text painted with the HTML, replaced by the first mount. */
|
|
7688
|
+
.ds-247420 .boot-splash { height: 100%; min-height: 60vh; display: flex; align-items: center; justify-content: center; color: var(--fg-3); font-size: .9rem; }
|
|
7689
|
+
|
|
7690
|
+
/* Chat control cluster in the crumb bar: model picker, +new, status. */
|
|
7691
|
+
.ds-247420 .chat-controls { display: flex; align-items: center; gap: .6em; flex-wrap: wrap; }
|
|
7692
|
+
.ds-247420 .chat-controls > * { flex: 0 0 auto; }
|
|
7693
|
+
.ds-247420 .chat-controls select,
|
|
7694
|
+
.ds-247420 .chat-controls .select,
|
|
7695
|
+
.ds-247420 .chat-controls [role="combobox"] { min-width: 130px; max-width: 220px; }
|
|
7696
|
+
.ds-247420 .chat-controls .status-dot { white-space: nowrap; }
|
|
7697
|
+
|
|
7698
|
+
/* Main content region layout: every tab is a min-height:0 scroll host; the
|
|
7699
|
+
chat tab additionally flexes as a column so the thread fills the viewport. */
|
|
7700
|
+
.ds-247420 .agentgui-main { min-height: 0; }
|
|
7701
|
+
.ds-247420 .agentgui-main-chat { display: flex; flex-direction: column; flex: 1; }
|
|
7702
|
+
.ds-247420 .agentgui-main .ds-section { margin: 0 0 var(--space-4, 16px); }
|
|
7703
|
+
|
|
7704
|
+
/* Readable backend health summary (replaces raw JSON dump). */
|
|
7705
|
+
.ds-247420 .health-summary { display: flex; flex-wrap: wrap; gap: .4em; margin: .6em 0; }
|
|
7706
|
+
.ds-247420 .health-chip {
|
|
7707
|
+
font-family: var(--ff-mono, ui-monospace, monospace);
|
|
7708
|
+
font-size: .8rem; padding: .15em .55em; border-radius: 6px;
|
|
7709
|
+
background: color-mix(in srgb, var(--fg) 8%, transparent);
|
|
7710
|
+
color: var(--fg-2);
|
|
7711
|
+
border: 1px solid color-mix(in srgb, var(--fg) 12%, transparent);
|
|
7712
|
+
}
|
|
7713
|
+
.ds-247420 .health-summary.health-ok .health-chip:first-child {
|
|
7714
|
+
color: var(--accent);
|
|
7715
|
+
border-color: color-mix(in srgb, var(--accent) 40%, transparent);
|
|
7716
|
+
}
|
|
7717
|
+
|
|
7718
|
+
/* Compact working-directory bar. */
|
|
7719
|
+
.ds-247420 .cwd-bar {
|
|
7720
|
+
display: flex; align-items: center; gap: .5em; flex-wrap: wrap;
|
|
7721
|
+
padding: .15em 0 .5em; font-size: .85rem;
|
|
7722
|
+
}
|
|
7723
|
+
.ds-247420 .cwd-bar-text {
|
|
7724
|
+
font-family: var(--ff-mono, ui-monospace, monospace);
|
|
7725
|
+
color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 60vw;
|
|
7726
|
+
}
|
|
7727
|
+
.ds-247420 .cwd-bar-btn {
|
|
7728
|
+
cursor: pointer; font: inherit; line-height: 1.3;
|
|
7729
|
+
padding: .15em .55em; border-radius: 6px;
|
|
7730
|
+
background: color-mix(in srgb, var(--fg) 8%, transparent);
|
|
7731
|
+
border: 1px solid color-mix(in srgb, var(--fg) 14%, transparent);
|
|
7732
|
+
color: var(--fg-2);
|
|
7733
|
+
}
|
|
7734
|
+
.ds-247420 .cwd-bar-btn:hover { background: color-mix(in srgb, var(--fg) 14%, transparent); }
|
|
7735
|
+
.ds-247420 .cwd-bar-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
7736
|
+
|
|
7737
|
+
/* History no-session empty state: fill the void with a centered prompt. */
|
|
7738
|
+
.ds-247420 .history-empty {
|
|
7739
|
+
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
|
7740
|
+
gap: .4em; text-align: center; min-height: 50vh; color: var(--fg-3);
|
|
7741
|
+
}
|
|
7742
|
+
.ds-247420 .history-empty-title { margin: 0; font-size: 1.05rem; color: var(--fg-2); }
|
|
7743
|
+
.ds-247420 .history-empty-sub { margin: 0; max-width: 42ch; }
|
|
7744
|
+
|
|
7745
|
+
/* Settings: two-column on wide screens (backend + agents). */
|
|
7746
|
+
.ds-247420 .settings-grid {
|
|
7747
|
+
display: grid; gap: var(--space-4, 16px);
|
|
7748
|
+
grid-template-columns: minmax(0, 1fr);
|
|
7749
|
+
align-items: start;
|
|
7750
|
+
}
|
|
7751
|
+
.ds-247420 .agentgui-main-settings .settings-grid { margin-top: 0; }
|
|
7752
|
+
|
|
7753
|
+
/* The kit Chat head computes its own zero-padded count and ignores our sub
|
|
7754
|
+
prop; hide it (streaming state shows via the title + busy banner). */
|
|
7755
|
+
.ds-247420 .chat-head .sub { display: none; }
|
|
7756
|
+
|
|
7757
|
+
/* Event-list row hover + search-result flash. */
|
|
7758
|
+
.ds-247420 .ds-event-list .row[role="button"]:hover { background: color-mix(in srgb, var(--fg) 5%, transparent); }
|
|
7759
|
+
.ds-247420 .ds-event-list .row.event-flash { animation: agentgui-event-flash 2s ease-out; }
|
|
7760
|
+
|
|
7761
|
+
/* Chat composer: hide the idle scrollbar on the (empty/short) textarea. */
|
|
7762
|
+
.ds-247420 .chat-composer textarea { overflow-y: auto; scrollbar-width: thin; }
|
|
7763
|
+
.ds-247420 .chat-composer textarea:not(:focus) { overflow-y: hidden; }
|
|
7764
|
+
|
|
7765
|
+
/* Generic interactive focus ring for app-emitted controls. */
|
|
7766
|
+
.ds-247420 button:focus-visible,
|
|
7767
|
+
.ds-247420 [tabindex]:focus-visible,
|
|
7768
|
+
.ds-247420 a:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
7769
|
+
|
|
7770
|
+
/* Settings-panel field spacing utilities (replace app.js inline style= margins). */
|
|
7771
|
+
.ds-247420 .agentgui-field-mb { margin: 0 0 .5em; }
|
|
7772
|
+
.ds-247420 .agentgui-field-my { margin: .5em 0; }
|
|
7773
|
+
|
|
7774
|
+
@keyframes agentgui-event-flash {
|
|
7775
|
+
0% { background: color-mix(in srgb, var(--accent) 40%, transparent); }
|
|
7776
|
+
100% { background: transparent; }
|
|
7777
|
+
}
|
|
7778
|
+
|
|
7779
|
+
@media (min-width: 900px) {
|
|
7780
|
+
.ds-247420 .settings-grid { grid-template-columns: minmax(0, 420px) minmax(0, 1fr); }
|
|
7781
|
+
}
|
|
7782
|
+
|
|
7783
|
+
/* Tablet: keep the chat control cluster from wrapping the status dot alone. */
|
|
7784
|
+
@media (max-width: 900px) {
|
|
7785
|
+
.ds-247420 .chat-controls select,
|
|
7786
|
+
.ds-247420 .chat-controls .select,
|
|
7787
|
+
.ds-247420 .chat-controls [role="combobox"] { min-width: 110px; max-width: 170px; }
|
|
7788
|
+
}
|
|
7789
|
+
|
|
7790
|
+
/* Touch targets on small screens. */
|
|
7791
|
+
@media (max-width: 640px) {
|
|
7792
|
+
.ds-247420 .pill { min-height: 36px; padding: .4em .8em; }
|
|
7793
|
+
.ds-247420 .history-actions { gap: .75em; }
|
|
7794
|
+
.ds-247420 .history-actions .btn, .ds-247420 .history-actions button { min-height: 44px; }
|
|
7795
|
+
.ds-247420 .cwd-bar-text { max-width: 42vw; }
|
|
7796
|
+
.ds-247420 .cwd-bar { gap: .3em; }
|
|
7797
|
+
}
|
|
7798
|
+
|
|
7799
|
+
@media (prefers-reduced-motion: reduce) {
|
|
7800
|
+
.ds-247420 .ds-event-list .row.event-flash { animation: none; outline: 2px solid var(--accent); }
|
|
7801
|
+
}
|
|
7802
|
+
|
|
7803
|
+
@media print {
|
|
7804
|
+
.ds-247420 #app { min-height: auto; display: block; height: auto; }
|
|
7805
|
+
.ds-247420 .skip-link, .ds-247420 .status-dot, .ds-247420 .history-actions, .ds-247420 .chat-composer { display: none !important; }
|
|
7806
|
+
.ds-247420 .app, .ds-247420 .app-main, .ds-247420 .panel, .ds-247420 .chat, .ds-247420 .chat-thread {
|
|
7807
|
+
background: #fff !important; color: #000 !important; box-shadow: none !important;
|
|
7808
|
+
}
|
|
7809
|
+
}
|
|
7810
|
+
|
|
7811
|
+
/* marketing.css */
|
|
7812
|
+
/* marketing.css — landing / docs site surface family (the agentgui flatspace
|
|
7813
|
+
* site renderer composes these instead of carrying inline style= props). Every
|
|
7814
|
+
* selector is written pre-scoped under `.ds-247420` so the build's selector-
|
|
7815
|
+
* prefixer leaves it untouched (consumers mount on <html class="ds-247420">).
|
|
7816
|
+
* All values read kit tokens — no hardcoded hex, no inline design in the app. */
|
|
7817
|
+
|
|
7818
|
+
.ds-247420 .site-panel { margin: var(--space-2); }
|
|
7819
|
+
|
|
7820
|
+
/* Hero block */
|
|
7821
|
+
.ds-247420 .site-hero { padding: 24px 22px; }
|
|
7822
|
+
.ds-247420 .site-hero-h { margin: 0 0 var(--space-2); }
|
|
7823
|
+
.ds-247420 .site-hero-body { margin: var(--space-2) 0 var(--space-3); color: var(--fg-2); max-width: 64ch; }
|
|
7824
|
+
.ds-247420 .site-chip-row { display: flex; gap: 6px; flex-wrap: wrap; margin: 0 0 var(--space-3); }
|
|
7825
|
+
.ds-247420 .site-cta-row { display: flex; gap: var(--space-2); flex-wrap: wrap; }
|
|
7826
|
+
|
|
7827
|
+
/* Quickstart CLI block — these .cli/.prompt/.cmd nodes were previously unstyled. */
|
|
7828
|
+
.ds-247420 .site-cli { padding: 16px 22px; }
|
|
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; }
|
|
7830
|
+
.ds-247420 .site-cli .prompt { color: var(--fg-3); user-select: none; flex: 0 0 auto; }
|
|
7831
|
+
.ds-247420 .site-cli .cmd { color: var(--fg); white-space: pre-wrap; word-break: break-word; }
|
|
7832
|
+
|
|
7833
|
+
/* Embedded legacy doc (iframe wrapper) */
|
|
7834
|
+
.ds-247420 .site-embed { width: 100%; height: calc(100vh - 180px); min-height: 520px; border: 0; border-radius: var(--r-1); background: var(--bg-2); display: block; }
|
|
7835
|
+
|
|
7447
7836
|
/* spoint/loading-screen.css */
|
|
7448
7837
|
/* Loading-screen kit styles. Scoped under .ds-247420 at build time.
|
|
7449
7838
|
All colors reference design tokens (no raw literals) per the token-lint gate. */
|