From 5d5df29687d0d392adacca79a56d16fc31fd6802 Mon Sep 17 00:00:00 2001 From: iris Date: Fri, 6 Nov 2026 19:09:18 +0100 Subject: [PATCH] swarm-ui: shared code leaves page folders; SectionHeading and Preformatted replace per-page copies durationLabel moves to util.ts, termPaths to agent/terminal/term-paths.ts, StateBadges and tokenTotal to agent/state, and TryOutResult to pages/review-common, so the builds, runs and agent pages no longer import across page folders. SectionHeading is the body-size section heading the create form and the egress card each styled; Preformatted is the scrolling text block of the builds tail and the AGENTS.md view, which now share one chrome and are both keyboard-scrollable. The components page shows both. --- .../src/agent/detail/AgentInstructions.css | 12 +- .../src/agent/detail/AgentInstructions.tsx | 5 +- .../src/agent/detail/AgentStateRow.tsx | 7 +- .../swarm-ui/src/agent/roster/AgentCard.tsx | 2 +- .../swarm-ui/src/agent/state/StateBadges.tsx | 112 ++++++++++++++ .../src/agent/terminal/AgentTermPreview.tsx | 142 +----------------- .../src/agent/terminal/SubagentsMenu.tsx | 2 +- .../swarm-ui/src/agent/terminal/term-paths.ts | 27 ++++ .../swarm-ui/src/pages/ComponentsPage.tsx | 20 +++ .../swarm-ui/src/pages/CreateAgentForm.css | 3 +- .../swarm-ui/src/pages/CreateAgentForm.tsx | 13 +- .../src/pages/agents/AgentGroupPage.tsx | 6 +- .../src/pages/agents/AgentTerminalPage.tsx | 6 +- .../swarm-ui/src/pages/builds/BuildsPage.css | 9 -- .../swarm-ui/src/pages/builds/BuildsPage.tsx | 5 +- .../TryOutResult.css | 0 .../TryOutResult.tsx | 5 +- .../src/pages/review-runs/ReviewRuns.tsx | 4 +- .../src/pages/review-runs/RunsTypes.ts | 10 -- .../src/pages/review-tryout/ReviewTryOut.tsx | 2 +- .../swarm-ui/src/pages/swarm/EgressCard.tsx | 3 +- .../swarm-ui/src/pages/swarm/SwarmPage.css | 3 +- .../src/ui/preformatted/Preformatted.css | 13 ++ .../src/ui/preformatted/Preformatted.tsx | 26 ++++ .../src/ui/section-heading/SectionHeading.css | 4 + .../src/ui/section-heading/SectionHeading.tsx | 18 +++ frontend/packages/swarm-ui/src/util.ts | 10 ++ .../swarm-ui/test/tidy-helpers.test.mjs | 26 ++++ 28 files changed, 295 insertions(+), 200 deletions(-) create mode 100644 frontend/packages/swarm-ui/src/agent/state/StateBadges.tsx create mode 100644 frontend/packages/swarm-ui/src/agent/terminal/term-paths.ts rename frontend/packages/swarm-ui/src/pages/{review-tryout => review-common}/TryOutResult.css (100%) rename frontend/packages/swarm-ui/src/pages/{review-tryout => review-common}/TryOutResult.tsx (97%) create mode 100644 frontend/packages/swarm-ui/src/ui/preformatted/Preformatted.css create mode 100644 frontend/packages/swarm-ui/src/ui/preformatted/Preformatted.tsx create mode 100644 frontend/packages/swarm-ui/src/ui/section-heading/SectionHeading.css create mode 100644 frontend/packages/swarm-ui/src/ui/section-heading/SectionHeading.tsx create mode 100644 frontend/packages/swarm-ui/test/tidy-helpers.test.mjs diff --git a/frontend/packages/swarm-ui/src/agent/detail/AgentInstructions.css b/frontend/packages/swarm-ui/src/agent/detail/AgentInstructions.css index 5e6ed150..3bcf2cde 100644 --- a/frontend/packages/swarm-ui/src/agent/detail/AgentInstructions.css +++ b/frontend/packages/swarm-ui/src/agent/detail/AgentInstructions.css @@ -9,22 +9,12 @@ .ui-agent-instructions-body { margin-top: 1em; } -.ui-agent-instructions-text textarea, -.ui-agent-instructions-theirs { +.ui-agent-instructions-text textarea { font-family: var(--mono, ui-monospace, monospace); font-size: 0.9em; width: 100%; box-sizing: border-box; } -.ui-agent-instructions-theirs { - margin: 0; - max-height: 16em; - overflow: auto; - white-space: pre-wrap; - padding: 0.5em; - border: 1px solid var(--border, currentColor); - border-radius: 4px; -} .ui-agent-instructions-status { margin: 0; color: var(--muted); diff --git a/frontend/packages/swarm-ui/src/agent/detail/AgentInstructions.tsx b/frontend/packages/swarm-ui/src/agent/detail/AgentInstructions.tsx index e8577d14..8f45cf8e 100644 --- a/frontend/packages/swarm-ui/src/agent/detail/AgentInstructions.tsx +++ b/frontend/packages/swarm-ui/src/agent/detail/AgentInstructions.tsx @@ -18,6 +18,7 @@ import { readApiError, type ProblemDetails } from "@hive/shared/api-error.js"; import { Badge } from "@hive/shared/badge.js"; import { ActionRow } from "../../ui/action-row/ActionRow.js"; import { Button } from "../../ui/button/Button.js"; +import { Preformatted } from "../../ui/preformatted/Preformatted.js"; import { Dialog } from "../../ui/dialog/Dialog.js"; import { Panel } from "../../ui/panel/Panel.js"; import { TextAreaField } from "../../ui/text-area-field/TextAreaField.js"; @@ -261,9 +262,9 @@ function InstructionsForm({ {agent} changed AGENTS.md since you started. Your text is kept above. Here is the file now:

-
+                
                   {theirs.content === "" ? "(empty)" : theirs.content}
-                
+