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 26fc5db2..1bfc466b 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 a6640b3f..5c71e311 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 43756107..1d108342 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 65a6dd02..79ba86de 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 399a2033..798ad197 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 971ec9aa..f0b6c9d2 100644 --- a/ui/src/components/PageTabBar.tsx +++ b/ui/src/components/PageTabBar.tsx @@ -21,7 +21,7 @@ export function PageTabBar({ items, value, onValueChange }: PageTabBarProps) {