From 39f8d38528e0378814dfba5e8ea81eddf8f1d027 Mon Sep 17 00:00:00 2001 From: Forgotten Date: Fri, 20 Feb 2026 11:29:13 -0600 Subject: [PATCH] UI: mobile responsive layout, streamline agent budget display, and xs avatar size Make agents list force list view on mobile with condensed trailing info. Add mobile bottom bar for config save/cancel and live run indicator on agent detail. Make MetricCard, PageTabBar, Dashboard tasks, and ActivityRow responsive for small screens. Add xs avatar size for inline text flow. Remove redundant budget displays from agent overview, properties panel, costs tab, and config form. Add attachment activity verb labels. Co-Authored-By: Claude Opus 4.6 --- ui/src/components/ActivityRow.tsx | 25 ++-- ui/src/components/AgentConfigForm.tsx | 20 --- ui/src/components/AgentProperties.tsx | 20 +-- ui/src/components/Identity.tsx | 7 +- ui/src/components/MetricCard.tsx | 14 +- ui/src/components/PageTabBar.tsx | 2 +- ui/src/components/ui/avatar.tsx | 6 +- ui/src/pages/AgentDetail.tsx | 151 ++++++++++---------- ui/src/pages/Agents.tsx | 194 ++++++++++++-------------- ui/src/pages/Dashboard.tsx | 34 +++-- ui/src/pages/IssueDetail.tsx | 2 + 11 files changed, 217 insertions(+), 258 deletions(-) diff --git a/ui/src/components/ActivityRow.tsx b/ui/src/components/ActivityRow.tsx index 26fc5db293..1bfc466bb4 100644 --- a/ui/src/components/ActivityRow.tsx +++ b/ui/src/components/ActivityRow.tsx @@ -11,6 +11,8 @@ const ACTION_VERBS: Record = { "issue.checked_out": "checked out", "issue.released": "released", "issue.comment_added": "commented on", + "issue.attachment_added": "attached file to", + "issue.attachment_removed": "removed attachment from", "issue.commented": "commented on", "issue.deleted": "deleted", "agent.created": "created", @@ -105,23 +107,24 @@ export function ActivityRow({ event, agentMap, entityNameMap, className }: Activ return (
navigate(link) : undefined} > -
- - {verb} - {name && {name}} +
+

+ + {verb} + {name && {name}} +

+ {timeAgo(event.createdAt)}
- - {timeAgo(event.createdAt)} -
); } diff --git a/ui/src/components/AgentConfigForm.tsx b/ui/src/components/AgentConfigForm.tsx index a6640b3f14..5c71e311e5 100644 --- a/ui/src/components/AgentConfigForm.tsx +++ b/ui/src/components/AgentConfigForm.tsx @@ -716,26 +716,6 @@ export function AgentConfigForm(props: AgentConfigFormProps) {
)} - {/* ---- Runtime (edit only) ---- */} - {!isCreate && ( -
-
Runtime
-
- - mark("runtime", "budgetMonthlyCents", v)} - immediate - className={inputClass} - /> - -
-
- )} ); } diff --git a/ui/src/components/AgentProperties.tsx b/ui/src/components/AgentProperties.tsx index 4375610709..1d10834200 100644 --- a/ui/src/components/AgentProperties.tsx +++ b/ui/src/components/AgentProperties.tsx @@ -6,7 +6,7 @@ import { useCompany } from "../context/CompanyContext"; import { queryKeys } from "../lib/queryKeys"; import { StatusBadge } from "./StatusBadge"; import { Identity } from "./Identity"; -import { formatCents, formatDate } from "../lib/utils"; +import { formatDate } from "../lib/utils"; import { Separator } from "@/components/ui/separator"; interface AgentPropertiesProps { @@ -62,24 +62,6 @@ export function AgentProperties({ agent, runtimeState }: AgentPropertiesProps) { -
- - - {formatCents(agent.spentMonthlyCents)} / {formatCents(agent.budgetMonthlyCents)} - - - - - {agent.budgetMonthlyCents > 0 - ? Math.round((agent.spentMonthlyCents / agent.budgetMonthlyCents) * 100) - : 0} - % - - -
- - -
{(runtimeState?.sessionDisplayId ?? runtimeState?.sessionId) && ( diff --git a/ui/src/components/Identity.tsx b/ui/src/components/Identity.tsx index 65a6dd0257..79ba86de56 100644 --- a/ui/src/components/Identity.tsx +++ b/ui/src/components/Identity.tsx @@ -1,7 +1,7 @@ import { cn } from "@/lib/utils"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -type IdentitySize = "sm" | "default" | "lg"; +type IdentitySize = "xs" | "sm" | "default" | "lg"; export interface IdentityProps { name: string; @@ -18,6 +18,7 @@ function deriveInitials(name: string): string { } const textSize: Record = { + xs: "text-sm", sm: "text-xs", default: "text-sm", lg: "text-sm", @@ -27,8 +28,8 @@ export function Identity({ name, avatarUrl, initials, size = "default", classNam const displayInitials = initials ?? deriveInitials(name); return ( - - + + {avatarUrl && } {displayInitials} diff --git a/ui/src/components/MetricCard.tsx b/ui/src/components/MetricCard.tsx index 399a20332a..798ad19784 100644 --- a/ui/src/components/MetricCard.tsx +++ b/ui/src/components/MetricCard.tsx @@ -13,27 +13,27 @@ interface MetricCardProps { export function MetricCard({ icon: Icon, value, label, description, onClick }: MetricCardProps) { return ( - -
+ +

{value}

{label}

{description && ( -
{description}
+
{description}
)}
-
- +
+
diff --git a/ui/src/components/PageTabBar.tsx b/ui/src/components/PageTabBar.tsx index 971ec9aa01..f0b6c9d251 100644 --- a/ui/src/components/PageTabBar.tsx +++ b/ui/src/components/PageTabBar.tsx @@ -21,7 +21,7 @@ export function PageTabBar({ items, value, onValueChange }: PageTabBarProps) {