From 8a2e5203adacc8c1c56d58725670e56f74a3030e Mon Sep 17 00:00:00 2001 From: iris Date: Fri, 6 Nov 2026 17:54:24 +0100 Subject: [PATCH] swarm-ui: shared Hint, ActionRow, Toolbar, EmptyState, ExternalLink and ExpandableCard replace per-page copies Hint, ActionRow, Toolbar, EmptyState and ExternalLink replace the muted text, button row, refresh bar, empty line and _blank anchor that each page restyled under its own class. ExpandableCard (with a loading twin) holds the builds and recent-runs cards, which had identical head and body CSS. The create form's raw checkbox becomes CheckboxField. The components page shows each new piece. --- docs/swarm/ui.md | 6 +- .../agent/claude-login/ClaudeLoginDialog.css | 3 +- .../agent/claude-login/ClaudeLoginDialog.tsx | 10 +- .../swarm-ui/src/agent/detail/AgentDetail.css | 5 - .../swarm-ui/src/agent/detail/AgentDetail.tsx | 25 ++-- .../src/agent/detail/AgentInference.css | 12 +- .../src/agent/detail/AgentInference.tsx | 10 +- .../src/agent/detail/AgentInstructions.css | 6 - .../src/agent/detail/AgentInstructions.tsx | 13 +- .../swarm-ui/src/agent/detail/AgentLimits.css | 6 - .../swarm-ui/src/agent/detail/AgentLimits.tsx | 14 ++- .../src/agent/detail/AgentPermissions.tsx | 7 +- .../src/agent/detail/AllowedDomains.tsx | 5 +- .../src/agent/detail/LinkedAccounts.css | 3 +- .../src/agent/detail/LinkedAccounts.tsx | 5 +- .../swarm-ui/src/pages/AlertsPage.tsx | 10 +- .../swarm-ui/src/pages/ComponentsPage.tsx | 67 +++++++++++ .../swarm-ui/src/pages/CreateAgentForm.css | 9 -- .../swarm-ui/src/pages/CreateAgentForm.tsx | 28 +++-- .../swarm-ui/src/pages/IssueReportPage.tsx | 5 +- .../packages/swarm-ui/src/pages/JobsPage.css | 5 - .../packages/swarm-ui/src/pages/JobsPage.tsx | 5 +- .../swarm-ui/src/pages/LinkBackendEnvForm.tsx | 5 +- .../src/pages/LinkForgeAccountForm.tsx | 5 +- .../src/pages/LinkGithubAccountForm.tsx | 14 +-- .../src/pages/LinkMatrixAccountForm.css | 3 +- .../src/pages/LinkMatrixAccountForm.tsx | 5 +- .../src/pages/broadcast/BroadcastComposer.css | 7 -- .../src/pages/broadcast/BroadcastComposer.tsx | 10 +- .../swarm-ui/src/pages/builds/BuildsPage.css | 42 +------ .../swarm-ui/src/pages/builds/BuildsPage.tsx | 105 ++++++++-------- .../src/pages/messages/MessagesPage.css | 2 - .../src/pages/messages/MessagesPage.tsx | 9 +- .../src/pages/notifications/Deliveries.tsx | 3 +- .../src/pages/notifications/FlowCanvas.tsx | 5 +- .../pages/notifications/FlowEditorPage.tsx | 10 +- .../src/pages/notifications/NodeInspector.tsx | 14 ++- .../pages/notifications/NotificationsPage.css | 8 -- .../pages/notifications/NotificationsPage.tsx | 13 +- .../src/pages/reports/ReportsPage.css | 10 -- .../src/pages/review-runs/ReviewRuns.css | 42 +------ .../src/pages/review-runs/ReviewRuns.tsx | 82 +++++++------ .../review-settings/ClassifierSettings.css | 10 -- .../review-settings/ClassifierSettings.tsx | 14 +-- .../src/pages/review-tryout/ReviewTryOut.css | 6 - .../src/pages/review-tryout/ReviewTryOut.tsx | 10 +- .../src/pages/review-tryout/TryOutResult.css | 3 - .../src/pages/review-tryout/TryOutResult.tsx | 9 +- .../src/pages/schedules/ScheduleCard.css | 3 - .../src/pages/schedules/ScheduleCard.tsx | 5 +- .../src/pages/schedules/ScheduleForm.css | 6 - .../src/pages/schedules/ScheduleForm.tsx | 22 ++-- .../src/pages/schedules/SchedulesPage.tsx | 6 +- .../swarm-ui/src/pages/swarm/EgressCard.tsx | 7 +- .../swarm-ui/src/pages/swarm/HivesCard.tsx | 14 +-- .../swarm-ui/src/pages/swarm/SwarmPage.css | 7 -- .../swarm-ui/src/ui/action-row/ActionRow.css | 9 ++ .../swarm-ui/src/ui/action-row/ActionRow.tsx | 24 ++++ .../swarm-ui/src/ui/button/Button.css | 9 ++ .../swarm-ui/src/ui/button/Button.tsx | 2 +- .../src/ui/empty-state/EmptyState.css | 8 ++ .../src/ui/empty-state/EmptyState.tsx | 19 +++ .../src/ui/expandable-card/ExpandableCard.css | 43 +++++++ .../src/ui/expandable-card/ExpandableCard.tsx | 112 ++++++++++++++++++ .../src/ui/external-link/ExternalLink.tsx | 28 +++++ .../packages/swarm-ui/src/ui/hint/Hint.css | 17 +++ .../packages/swarm-ui/src/ui/hint/Hint.tsx | 39 ++++++ .../toolbar/Toolbar.css} | 7 +- .../swarm-ui/src/ui/toolbar/Toolbar.tsx | 24 ++++ 69 files changed, 689 insertions(+), 427 deletions(-) create mode 100644 frontend/packages/swarm-ui/src/ui/action-row/ActionRow.css create mode 100644 frontend/packages/swarm-ui/src/ui/action-row/ActionRow.tsx create mode 100644 frontend/packages/swarm-ui/src/ui/empty-state/EmptyState.css create mode 100644 frontend/packages/swarm-ui/src/ui/empty-state/EmptyState.tsx create mode 100644 frontend/packages/swarm-ui/src/ui/expandable-card/ExpandableCard.css create mode 100644 frontend/packages/swarm-ui/src/ui/expandable-card/ExpandableCard.tsx create mode 100644 frontend/packages/swarm-ui/src/ui/external-link/ExternalLink.tsx create mode 100644 frontend/packages/swarm-ui/src/ui/hint/Hint.css create mode 100644 frontend/packages/swarm-ui/src/ui/hint/Hint.tsx rename frontend/packages/swarm-ui/src/{pages/schedules/SchedulesPage.css => ui/toolbar/Toolbar.css} (52%) create mode 100644 frontend/packages/swarm-ui/src/ui/toolbar/Toolbar.tsx diff --git a/docs/swarm/ui.md b/docs/swarm/ui.md index 990bd90b..1306888f 100644 --- a/docs/swarm/ui.md +++ b/docs/swarm/ui.md @@ -221,7 +221,8 @@ commit, whether the run was a try-out or a requested review, how long ago it started, how long it took, how many classifications ran, and the outcome as a badge. Select a card to open it: it shows the same result table as the [try-out](#review-try-out), the overall verdict, the reason when the outcome -has one, and a link to the posted review when there is one. +has one, and a link to the posted review when there is one. While the first +answer loads, the section shows three grey placeholder cards. An outcome can be more than approve or request changes: @@ -589,7 +590,8 @@ config PR). Each card shows the repo and PR, or for a deploy's build the agent and `internal/meta`, the first seven characters of the commit, how the build ended (**built**, **failed** or **error**), when it started and how long it took. Select a card to read it: for a failed build, what `nix` printed; for a built one, the system -closure; for an error, why no build came back. +closure; for an error, why no build came back. While the first answer loads, the +card shows three grey placeholder cards. The **Details** link on a `swarm-builder` commit status opens the jobs tab as `/jobs?run=`, with the builds card open and that build's card in view. Links made before the diff --git a/frontend/packages/swarm-ui/src/agent/claude-login/ClaudeLoginDialog.css b/frontend/packages/swarm-ui/src/agent/claude-login/ClaudeLoginDialog.css index d8b07af4..40060f64 100644 --- a/frontend/packages/swarm-ui/src/agent/claude-login/ClaudeLoginDialog.css +++ b/frontend/packages/swarm-ui/src/agent/claude-login/ClaudeLoginDialog.css @@ -8,6 +8,5 @@ margin-top: 1em; } .claude-login-ok { - margin-top: 1em; - color: var(--green); + margin-block: 1em; } diff --git a/frontend/packages/swarm-ui/src/agent/claude-login/ClaudeLoginDialog.tsx b/frontend/packages/swarm-ui/src/agent/claude-login/ClaudeLoginDialog.tsx index 135bad83..3ce0167a 100644 --- a/frontend/packages/swarm-ui/src/agent/claude-login/ClaudeLoginDialog.tsx +++ b/frontend/packages/swarm-ui/src/agent/claude-login/ClaudeLoginDialog.tsx @@ -11,6 +11,8 @@ import { ApiErrorPanel } from "@hive/shared/api-error-panel.js"; import { readApiError, type ProblemDetails } from "@hive/shared/api-error.js"; import { Button } from "../../ui/button/Button.js"; import { Dialog } from "../../ui/dialog/Dialog.js"; +import { ExternalLink } from "../../ui/external-link/ExternalLink.js"; +import { Hint } from "../../ui/hint/Hint.js"; import { Panel } from "../../ui/panel/Panel.js"; import { TextField } from "../../ui/text-field/TextField.js"; import { @@ -98,9 +100,7 @@ export function ClaudeLoginDialog({ <>

Open{" "} - - the claude login page - + the claude login page , sign in with this agent's account, and paste the code it shows.