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 26fc5db..1bfc466 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 a6640b3..5c71e31 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 4375610..1d10834 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 65a6dd0..79ba86d 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 399a203..798ad19 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 971ec9a..f0b6c9d 100644 --- a/ui/src/components/PageTabBar.tsx +++ b/ui/src/components/PageTabBar.tsx @@ -21,7 +21,7 @@ export function PageTabBar({ items, value, onValueChange }: PageTabBarProps) {