agentgui 1.0.970 → 1.0.971
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/AGENTS.md +6 -0
- package/PUNCHLIST-DESIGN-14.md +43 -0
- package/package.json +1 -1
- package/site/app/vendor/anentrypoint-design/247420.css +137 -36
- package/site/app/vendor/anentrypoint-design/247420.js +12 -12
- package/site/theme.mjs +19 -15
package/AGENTS.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# AgentGUI — Agent Notes
|
|
2
2
|
|
|
3
|
+
## Design-maturity sweep + marketing-site consolidation (2026-06-18) — fourteenth run
|
|
4
|
+
|
|
5
|
+
Continues the 13th run's "all design lives in the kit" mandate to the LAST residue surface + a kit design-maturity sweep. **`site/theme.mjs` (the flatspace marketing/landing renderer, NOT the SPA) was the remaining residue**: it carried an inline `<style>` with hardcoded hex (`#FBF6EB`/`#1F1B16`), ~12 inline `style=` props, deprecated `C.Btn({primary})`, and two `↗` arrow glyphs. ALL migrated: a new kit **`marketing.css`** `.site-*` family (`.site-panel`/`.site-hero`/`.site-hero-h`/`.site-hero-body`/`.site-chip-row`/`.site-cta-row`/`.site-cli`+`.cli`/`.prompt`/`.cmd`/`.site-embed`, pre-scoped `.ds-247420`, wired into `build.mjs` cssParts + `lint-glyphs` `SCAN_ROOT_FILES`); kit `Panel`/`Heading` gained a **`class` prop** (they only accepted `style`) so consumers attach classes instead of inline styles; `Btn({primary})` -> `Btn({variant:'primary'})`; `↗` -> `->`. theme.mjs head now render-blocking-`<link>`s the kit `247420.css` (it loaded the kit via JS importmap only, so the inline `<style>` was its pre-JS FOUC guard) — the kit already owns the base surface (`app-surfaces.css:27` `.ds-247420 body { background:var(--bg); color:var(--fg); font-family:var(--ff-display) }`). flatspace is NOT a dep here; theme.mjs is a pure render fn witnessed by loading its `renderHtml()` output. **The marketing site tracks unpkg@latest (importmap+CSS link); the SPA ships the pinned vendored dist — two intentional load strategies.**
|
|
6
|
+
|
|
7
|
+
**Workflow `gui-design-14` (via the Workflow tool, run `wf_50751bd9-a43`, 7 lenses: chat-thread/files/sessions/shell-chrome/tokens-theme/a11y-motion/marketing-residue): 46 agents -> 39 findings -> 28 adversarially confirmed** (`PUNCHLIST-DESIGN-14.md`; 2 lens connection-failures: tokens-theme hunt + marketing-residue verify). ALL landed in the kit. **chat:** ThinkingNode base CSS (`.chat-thinking`/`-text`/`-dots` had ZERO base rules outside `.agentchat-working`), markdown `table`/`th`/`td`/`hr` (were unstyled -> bare cells), dead `.chat-tick` inline-code class given a rule, composer toolbar unified on 32px/`--r-1` (was 40px-round vs 36px-square), flat `.chat-md` rhythm+inset, streaming `.chat-stream-pre` persistent chrome, tool/code `:has()` measure-breakout. **files:** FileSkeleton container was a single 48px shimmer bar collapsing all rows (now inner `.ds-skel`-only), filter folded into one `.ds-file-controls` toolbar row, per-type cell icon tints, dead `data-columns` card-mode removed (+ `FILE_GRID_MIN_COL`/`columns` param), `.ds-file-check` dead font/color decls dropped + `.ds-check-box` rest border -> `--fg-3`. **sessions:** stale disc own tone (was sharing `--amber` with connecting) + connecting now a hollow ring, dead duplicate `.ds-dash-status.is-running` removed + running unified on `--accent` across disc/breakdown/card, `.seg.is-idle` weight 600, reduced-motion live-disc static-ring fallback, mixed-tick thickened 1.5px->2px, card cost as emphasized `.ds-dash-stat-cost`, conv-list unread -> hollow ring (shape-distinct from running). **shell:** resizers hidden past their staging breakpoints (`@media` 1480/1100/900 — were dead handles dragging vars into a fixed drawer), coarse-pointer 16px hit target, `WS_RESIZE_CLAMP` reconciled to the CSS `clamp()` floors/ceilings, localStorage committed on pointerup (not per-move), separator `aria-valuemin/max/now`. **a11y:** voice `vx-*` added to `community.css` reduced-motion guard, status discs given non-colour SHAPE channels, `.ds-input-bare` `:focus`->`:focus-visible`+ring. **Status-disc shape rule:** live=solid+pulse(or static ring under reduced-motion), error=solid+halo, connecting=hollow ring, stale=muted solid — four channels, not colour-only. Witnessed live (localhost:3009/gm/?token, PASSWORD=`123,slam,123,slam`): 0 console/page errors, dark body surface painted by kit, 3 resizers, no h-scroll, migrated classes resolve. Kit pushed `3704876`; rebased onto a concurrent CI `v0.0.211` bump.
|
|
8
|
+
|
|
3
9
|
## Design-content consolidation — ALL design lives in the kit now (2026-06-18) — thirteenth run
|
|
4
10
|
|
|
5
11
|
The mandate: every design decision must live in the kit (`../design` = `/config/workspace/design`), none in the agentgui app. **`site/app/index.html` no longer carries an inline `<style>` block** — the ~240-line block (28 classes: `.pill`/`.cwd-bar`/`.resume-banner`/`.health-chip`/`.settings-grid`/`.history-empty`/`.boot-splash`/`.chat-controls`/`.status-dot`/`.ds-event-list` overrides + `event-flash` keyframe + scrollbar theming + focus rings + responsive + print) moved to a NEW kit file **`../design/app-surfaces.css`** (wired into `scripts/build.mjs` CSS_FILES, scoped `.ds-247420`, reads kit tokens directly with NO `--agentgui-*` fallbacks — those local color vars are deleted). `app.js` carries **zero inline `style=` props** (the 6 margin literals -> `.agentgui-field-mb`/`.agentgui-field-my` kit utilities; the `mainStyle` layout string -> `.agentgui-main`/`.agentgui-main-chat` kit rules). **Rule going forward: no design content in agentgui — new surface styling is a kit CSS rule, never an inline `<style>` or `style=`.** `app-surfaces.css` selectors are written pre-scoped `.ds-247420 ...` so the build's selector-prefixer (handles `:root`/`html`/`body`, compounds `[attr]`/`*`) leaves them untouched. Because `247420.css` is a render-blocking `<link>` in head and `<html class="ds-247420">` is static, there is NO FOUC from moving the base/boot-splash styling into the kit.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# PUNCHLIST-DESIGN-14 (14th run — design-maturity sweep)
|
|
2
|
+
|
|
3
|
+
Workflow `gui-design-14` (run wf_50751bd9-a43): 46 agents, 39 findings, 28 adversarially confirmed. All fixes land in the kit (`/config/workspace/design`), never the agentgui app. ASCII-only; kept typography (middot/ellipsis/dash) preserved.
|
|
4
|
+
|
|
5
|
+
## chat (chat.css / app-shell.css / src/components/chat.js)
|
|
6
|
+
1. [high] ThinkingNode `.chat-thinking/.chat-thinking-text/.chat-thinking-dots` have ZERO base CSS (only `.agentchat-working .chat-thinking-dots` exists) -> add base thinking rules to chat.css reusing `agentchat-dot-bounce` + reduced-motion guard.
|
|
7
|
+
2. [high] `.chat-md table/th/td/hr` unstyled -> markdown tables collapse to bare cells, `---` vanishes. Add to the `.chat-bubble.chat-md` block in app-shell.css.
|
|
8
|
+
3. [med] `.chat-tick` (inline backtick code, chat.js:47) is a dead class -> add a real rule in chat.css.
|
|
9
|
+
4. [med] Composer toolbar geometry mismatch: 40px round `.composer-btn` vs 36px square `.send` -> unify on 32px/`--r-1` in chat.css (later source order wins).
|
|
10
|
+
5. [med] Flat-layout `.chat-msg-flat .chat-md` cramped against role label + flush `.them` tint -> add flat rhythm/inset in chat.css.
|
|
11
|
+
6. [low] Streaming `.chat-stream-pre` drops the lang tab + copy chrome the settled block gets -> add minimal persistent chrome.
|
|
12
|
+
7. [low] Tool-card pre overflows inside the centered `--measure` column -> let tool/code break out wider in flat layout.
|
|
13
|
+
|
|
14
|
+
## files (app-shell.css / src/components/files.js)
|
|
15
|
+
8. [high] `FileSkeleton` markup/CSS disagree: `.ds-file-skeleton` container styled as a single 48px shimmer bar collapsing all rows + double-shimmer -> drop the container height/gradient/anim block + dead `.ds-file-grid-loading`.
|
|
16
|
+
9. [med] filter + sort/select-all/density are two stacked strips with conflicting alignment -> fold filter into one `.ds-file-controls` row.
|
|
17
|
+
10. [med] thumbnail tiles: no per-type icon tint on cells + 4:3 box wastes space for non-image -> add `.ds-file-cell[data-file-type]` tints, denser non-image media.
|
|
18
|
+
11. [med] `data-columns` card-mode is a dead half-wired third layout (flex rows in a grid) not exposed by density -> remove the dead path.
|
|
19
|
+
12. [low] `.ds-file-check` carries dead font/color decls (bracket text gone) + at-rest box too faint -> drop dead decls, strengthen `.ds-check-box` rest border.
|
|
20
|
+
|
|
21
|
+
## sessions (chat.css / src/components/sessions.js)
|
|
22
|
+
13. [med] stale and connecting discs share `var(--amber)` + neither animates -> give stale its own tone/ring.
|
|
23
|
+
14. [med] duplicate `.ds-dash-status.is-running` (green@400 then accent@475) -> delete dead rule, unify running tone across disc/breakdown/card.
|
|
24
|
+
15. [low] `.seg.is-idle` lighter weight than running/error siblings -> add `font-weight:600`.
|
|
25
|
+
16. [low] heartbeat live disc loses its cue under reduced-motion -> static concentric ring fallback.
|
|
26
|
+
17. [low] select-all mixed tick is a 1.5px sub-pixel bar -> thicken to ~2px crisp.
|
|
27
|
+
18. [med] card `.ds-dash-stat` crams elapsed/counter/tok/cost into one mono middot run -> emphasize cost, dim unit suffixes.
|
|
28
|
+
19. [low] conv-list running vs unread are same-color same-shape discs -> differentiate by shape/tone.
|
|
29
|
+
|
|
30
|
+
## shell (app-shell.css / src/components/shell.js)
|
|
31
|
+
20. [high] resizers render past their breakpoints (dead handles dragging vars that no longer affect a fixed drawer) -> media `display:none` matching the 1480/1100/900 staging.
|
|
32
|
+
21. [med] JS `WS_RESIZE_CLAMP` bounds fall below/above the CSS `clamp()` floors/ceilings -> derive from CSS clamp min/max.
|
|
33
|
+
22. [med] resize writes localStorage every pointermove + separator lacks `aria-valuenow/min/max` -> commit on pointerup, add aria-value*.
|
|
34
|
+
23. [low] resizer 8px hit target, no coarse-pointer floor -> `@media (pointer:coarse)` widen/hide.
|
|
35
|
+
|
|
36
|
+
## a11y / motion
|
|
37
|
+
24. [low] voice `vx-*` surfaces omitted from community.css reduced-motion block (infinite `vx-pulse`) -> add to the guard list.
|
|
38
|
+
25. [med] status discs differentiate by COLOR only (no shape channel like the rail tones) -> add non-color channel + disambiguate stale/connecting (overlaps 13).
|
|
39
|
+
26. [low] `.ds-input-bare:focus` (not `:focus-visible`) kills outline -> switch + `--focus-ring-inset`.
|
|
40
|
+
27. [low] conv-list indicators color-only for sighted users (overlaps 19).
|
|
41
|
+
|
|
42
|
+
## marketing site (site/theme.mjs -> kit)
|
|
43
|
+
28. [high] theme.mjs saturated with design content: inline `<style>`+hex, ~12 inline `style=`, deprecated `Btn({primary})`, `↗` glyphs -> new kit `marketing.css` `.site-*` family + base-surface rule + render-blocking CSS link; theme.mjs carries zero design CSS.
|
package/package.json
CHANGED
|
@@ -1580,12 +1580,14 @@
|
|
|
1580
1580
|
.ds-247420 .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
|
|
1581
1581
|
/* The quick filter is a compact control, not a full-width form row - a giant
|
|
1582
1582
|
input above the grid reads as a search page and costs fold height. */
|
|
1583
|
-
|
|
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). */
|
|
1584
1585
|
.ds-247420 .ds-file-filter-input {
|
|
1585
1586
|
width: min(280px, 100%); padding: 6px 12px; font-size: var(--fs-sm);
|
|
1586
1587
|
background: var(--bg); color: var(--fg);
|
|
1587
1588
|
border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
|
|
1588
1589
|
}
|
|
1590
|
+
.ds-247420 .ds-file-controls .ds-file-filter-input { flex: 0 1 220px; }
|
|
1589
1591
|
.ds-247420 .ds-file-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
|
|
1590
1592
|
.ds-247420 .ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
|
|
1591
1593
|
.ds-247420 .ds-file-sort-btn {
|
|
@@ -1715,7 +1717,7 @@
|
|
|
1715
1717
|
role=checkbox/aria-checked name+state. */
|
|
1716
1718
|
.ds-247420 .ds-check-box {
|
|
1717
1719
|
width: 15px; height: 15px; box-sizing: border-box; flex: 0 0 auto; position: relative;
|
|
1718
|
-
border: 1.5px solid var(--
|
|
1720
|
+
border: 1.5px solid var(--fg-3); border-radius: 4px;
|
|
1719
1721
|
transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
|
|
1720
1722
|
}
|
|
1721
1723
|
.ds-247420 .is-marked > .ds-check-box,
|
|
@@ -1727,14 +1729,14 @@
|
|
|
1727
1729
|
}
|
|
1728
1730
|
.ds-247420[aria-checked="mixed"] > .ds-check-box { background: var(--accent); border-color: var(--accent); }
|
|
1729
1731
|
.ds-247420[aria-checked="mixed"] > .ds-check-box::after {
|
|
1730
|
-
content: ""; position: absolute; left:
|
|
1732
|
+
content: ""; position: absolute; left: 3px; right: 3px; top: 6px; height: 2px; background: var(--bg); border-radius: 1px;
|
|
1731
1733
|
}
|
|
1732
1734
|
|
|
1733
1735
|
.ds-247420 .ds-file-check {
|
|
1734
1736
|
display: inline-flex; align-items: center; justify-content: center;
|
|
1735
1737
|
min-width: 28px; height: 28px; padding: 0 4px;
|
|
1736
1738
|
background: transparent; border: 0; border-radius: var(--r-1);
|
|
1737
|
-
|
|
1739
|
+
color: var(--fg-3);
|
|
1738
1740
|
cursor: pointer;
|
|
1739
1741
|
transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
|
|
1740
1742
|
}
|
|
@@ -1825,6 +1827,16 @@
|
|
|
1825
1827
|
}
|
|
1826
1828
|
.ds-247420 .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
|
|
1827
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); }
|
|
1828
1840
|
.ds-247420 .ds-file-cell-name {
|
|
1829
1841
|
font-size: var(--fs-tiny); text-align: left;
|
|
1830
1842
|
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
@@ -1835,13 +1847,6 @@
|
|
|
1835
1847
|
background: color-mix(in oklab, var(--bg) 78%, transparent);
|
|
1836
1848
|
}
|
|
1837
1849
|
|
|
1838
|
-
/* Card mode — opt-in via data-columns; switches the list to a grid. */
|
|
1839
|
-
.ds-247420 .ds-file-grid[data-columns] { display: grid; gap: var(--space-3); }
|
|
1840
|
-
.ds-247420 .ds-file-grid[data-columns="1"] { grid-template-columns: 1fr; }
|
|
1841
|
-
.ds-247420 .ds-file-grid[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
|
|
1842
|
-
.ds-247420 .ds-file-grid[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
|
|
1843
|
-
.ds-247420 .ds-file-grid[data-columns="4"] { grid-template-columns: repeat(4, 1fr); }
|
|
1844
|
-
|
|
1845
1850
|
/* ============================================================
|
|
1846
1851
|
File browser surface — stage, toolbar, breadcrumb, dropzone,
|
|
1847
1852
|
upload progress, empty state, modals, preview. Authored for
|
|
@@ -2165,21 +2170,12 @@
|
|
|
2165
2170
|
}
|
|
2166
2171
|
.ds-247420 .ds-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
|
|
2167
2172
|
|
|
2168
|
-
/* Loading skeleton
|
|
2169
|
-
|
|
2170
|
-
.ds-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
background-size: 200% 100%;
|
|
2175
|
-
}
|
|
2176
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
2177
|
-
.ds-247420 .ds-file-skeleton { animation: ds-skeleton-shimmer 1.2s var(--ease) infinite; }
|
|
2178
|
-
}
|
|
2179
|
-
@keyframes ds-skeleton-shimmer {
|
|
2180
|
-
0% { background-position: 200% 0; }
|
|
2181
|
-
100% { background-position: -200% 0; }
|
|
2182
|
-
}
|
|
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. */
|
|
2183
2179
|
|
|
2184
2180
|
/* Drag-to-move drop target highlight on a directory row. */
|
|
2185
2181
|
.ds-247420 .ds-file-row.ds-drop-target {
|
|
@@ -2388,6 +2384,13 @@
|
|
|
2388
2384
|
padding: 10px 12px; border-radius: 6px; overflow-x: auto;
|
|
2389
2385
|
font-family: var(--ff-mono); font-size: 0.9em; margin: 8px 0;
|
|
2390
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; }
|
|
2391
2394
|
|
|
2392
2395
|
.ds-247420 .chat-msg .chat-bubble.chat-code,
|
|
2393
2396
|
.ds-247420 .chat-msg.you .chat-bubble.chat-code,
|
|
@@ -3525,6 +3528,15 @@
|
|
|
3525
3528
|
.ds-247420 .ws-resizer.ws-resizer-rail { grid-column: 1; }
|
|
3526
3529
|
.ds-247420 .ws-resizer.ws-resizer-sessions { grid-column: 2; }
|
|
3527
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; } }
|
|
3528
3540
|
/* Ease the rail/pane collapse. Track COUNT stays stable on collapse (only a
|
|
3529
3541
|
width var flips), so grid-template-columns is animatable; reduced-motion
|
|
3530
3542
|
drops it to an instant swap. */
|
|
@@ -4965,7 +4977,11 @@
|
|
|
4965
4977
|
.ds-247420 .cm-vs-btn,
|
|
4966
4978
|
.ds-247420 .cm-user-btn,
|
|
4967
4979
|
.ds-247420 .cm-ch-spinner,
|
|
4968
|
-
.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 {
|
|
4969
4985
|
transition: none !important;
|
|
4970
4986
|
animation: none !important;
|
|
4971
4987
|
}
|
|
@@ -5595,6 +5611,23 @@
|
|
|
5595
5611
|
@media (prefers-reduced-motion: reduce) {
|
|
5596
5612
|
.ds-247420 .agentchat-working .chat-thinking-dots span { animation: none; opacity: .7; }
|
|
5597
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
|
+
}
|
|
5598
5631
|
|
|
5599
5632
|
/* Responsive: the control cluster + cwd bar must stay usable on phones/tablets.
|
|
5600
5633
|
The cwd path can't eat the row beside its label + buttons on a narrow screen. */
|
|
@@ -5622,16 +5655,20 @@
|
|
|
5622
5655
|
display: inline-block; width: 8px; height: 8px; border-radius: 50%;
|
|
5623
5656
|
background: var(--fg-3); flex: 0 0 auto;
|
|
5624
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. */
|
|
5625
5661
|
.ds-247420 .status-dot-disc.status-dot-live { background: var(--accent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
|
|
5626
|
-
.ds-247420 .status-dot-disc.status-dot-error { background: var(--flame); }
|
|
5627
|
-
.ds-247420 .status-dot-disc.status-dot-connecting { background: var(--amber); }
|
|
5628
|
-
.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)); }
|
|
5629
5665
|
@keyframes status-disc-pulse {
|
|
5630
5666
|
0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent); }
|
|
5631
5667
|
50% { box-shadow: 0 0 0 4px color-mix(in oklab, var(--accent) 0%, transparent); }
|
|
5632
5668
|
}
|
|
5633
5669
|
@media (prefers-reduced-motion: reduce) {
|
|
5634
|
-
|
|
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); }
|
|
5635
5672
|
}
|
|
5636
5673
|
|
|
5637
5674
|
/* ----------------------------------------------------------------------------
|
|
@@ -5694,7 +5731,9 @@
|
|
|
5694
5731
|
.ds-247420 .ds-session-sub { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
5695
5732
|
.ds-247420 .ds-session-meta { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
|
|
5696
5733
|
.ds-247420 .ds-session-agent { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
|
|
5697
|
-
|
|
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; }
|
|
5698
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); }
|
|
5699
5738
|
.ds-247420 .ds-session-state-error { color: var(--flame); }
|
|
5700
5739
|
|
|
@@ -5724,13 +5763,15 @@
|
|
|
5724
5763
|
.ds-247420 .ds-dash-card.is-error { border-color: var(--flame); }
|
|
5725
5764
|
.ds-247420 .ds-dash-card-head { display: flex; align-items: center; gap: var(--space-2); }
|
|
5726
5765
|
.ds-247420 .ds-dash-status { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; }
|
|
5727
|
-
|
|
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. */
|
|
5728
5768
|
.ds-247420 .ds-dash-status.is-error { color: var(--flame); }
|
|
5729
5769
|
.ds-247420 .ds-dash-agent { font-size: var(--fs-body); font-weight: 600; color: var(--fg); }
|
|
5730
5770
|
.ds-247420 .ds-dash-model { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); margin-left: auto; }
|
|
5731
5771
|
.ds-247420 .ds-dash-meta { display: flex; flex-direction: column; gap: 2px; }
|
|
5732
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; }
|
|
5733
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; }
|
|
5734
5775
|
.ds-247420 .ds-dash-activity { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
5735
5776
|
.ds-247420 .ds-dash-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
|
|
5736
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); }
|
|
@@ -5777,6 +5818,13 @@
|
|
|
5777
5818
|
/* --- B1: streaming pre shell — monospaced bubble while a fenced block streams,
|
|
5778
5819
|
so it does not reflow prose->block on settle. --- */
|
|
5779
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
|
+
}
|
|
5780
5828
|
|
|
5781
5829
|
/* --- A5: composer context line (agent / model / cwd at point of typing). --- */
|
|
5782
5830
|
.ds-247420 .chat-composer-context {
|
|
@@ -5793,6 +5841,15 @@
|
|
|
5793
5841
|
bottom-right of the flex-end composer (was unstyled, so the send button
|
|
5794
5842
|
could wrap below the textarea instead of anchoring like claude.ai/code). */
|
|
5795
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
|
+
}
|
|
5796
5853
|
|
|
5797
5854
|
/* --- B2: follow-up chips below the last settled assistant turn. --- */
|
|
5798
5855
|
.ds-247420 .agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
|
|
@@ -6031,6 +6088,25 @@
|
|
|
6031
6088
|
.ds-247420 .chat-msg-flat.you .chat-role { color: var(--accent); }
|
|
6032
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; }
|
|
6033
6090
|
.ds-247420 .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
|
|
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); }
|
|
6034
6110
|
/* Hover tint exceeds each role's REST tint so the row gives feedback (and the
|
|
6035
6111
|
ladder stays monotonic): assistant 5% > its 3% rest; user 4% > transparent. */
|
|
6036
6112
|
.ds-247420 .chat-msg-flat.them:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
|
|
@@ -6118,9 +6194,9 @@
|
|
|
6118
6194
|
.ds-247420 .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
|
|
6119
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); }
|
|
6120
6196
|
.ds-247420 .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
|
|
6121
|
-
.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; }
|
|
6122
6198
|
.ds-247420 .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
|
|
6123
|
-
.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; }
|
|
6124
6200
|
.ds-247420 .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
|
|
6125
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); }
|
|
6126
6202
|
.ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
@@ -6442,7 +6518,7 @@
|
|
|
6442
6518
|
font: var(--fs-tiny, 12px)/1.3 var(--ff-mono, monospace);
|
|
6443
6519
|
min-width: 0;
|
|
6444
6520
|
}
|
|
6445
|
-
.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); }
|
|
6446
6522
|
/* A property field whose control spans the full panel width (label above,
|
|
6447
6523
|
control below) — used for wide segmented controls that would clip in the
|
|
6448
6524
|
narrow value column. */
|
|
@@ -7732,6 +7808,31 @@
|
|
|
7732
7808
|
}
|
|
7733
7809
|
}
|
|
7734
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
|
+
|
|
7735
7836
|
/* spoint/loading-screen.css */
|
|
7736
7837
|
/* Loading-screen kit styles. Scoped under .ds-247420 at build time.
|
|
7737
7838
|
All colors reference design tokens (no raw literals) per the token-lint gate. */
|