From 5657dad29dabc1fa500ace934bba1df5986e7e66 Mon Sep 17 00:00:00 2001 From: duy Date: Thu, 29 Jan 2026 15:39:40 -0800 Subject: [PATCH] =?UTF-8?q?fix(boltbot):=20address=20UI=20skills=20review?= =?UTF-8?q?=20=E2=80=94=2016=20violations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - min-h-screen → min-h-dvh for dynamic viewport - arbitrary z-[100] → z-50 (fixed scale) - removed tracking-tight/tracking-wide (letter-spacing not requested) - replaced 3 URL-sync useEffects with inline wrapper functions - initialParams moved to useRef (prevent re-computation per render) - removed backdrop-blur-sm on full-screen overlay (perf) - added text-balance on headings - added min-w-0 on SessionView tool name truncate - empty states now include guidance text with clear next action --- extensions/boltbot/dashboard/src/App.tsx | 42 +++++++++---------- .../dashboard/src/components/Header.tsx | 2 +- .../src/components/ReceiptDetail.tsx | 4 +- .../dashboard/src/components/ReceiptList.tsx | 4 +- .../dashboard/src/components/SessionView.tsx | 6 +-- .../dashboard/src/components/StatsCards.tsx | 2 +- 6 files changed, 28 insertions(+), 32 deletions(-) diff --git a/extensions/boltbot/dashboard/src/App.tsx b/extensions/boltbot/dashboard/src/App.tsx index 1e8528cf6..b34b917b7 100644 --- a/extensions/boltbot/dashboard/src/App.tsx +++ b/extensions/boltbot/dashboard/src/App.tsx @@ -12,10 +12,6 @@ import SessionView from "./components/SessionView"; const LIMIT = 50; -function getSearchParams() { - return new URLSearchParams(window.location.search); -} - function setSearchParams(params: Record) { const url = new URL(window.location.href); for (const [k, v] of Object.entries(params)) { @@ -26,7 +22,7 @@ function setSearchParams(params: Record) { } export default function App() { - const initialParams = getSearchParams(); + const initialParams = useRef(new URLSearchParams(window.location.search)).current; const [selectedTiers, setSelectedTiers] = useState(() => { const tiers = initialParams.get("tiers"); return tiers ? tiers.split(",").filter(Boolean) : []; @@ -47,18 +43,18 @@ export default function App() { const { stats, isLoading: statsLoading, error: statsError } = useStats(); const { receipts, isLoading: receiptsLoading, error: receiptsError } = useReceipts(LIMIT, 0); - // Sync URL with state changes - useEffect(() => { - setSearchParams({ view: viewMode === "list" ? "" : viewMode }); - }, [viewMode]); - - useEffect(() => { - setSearchParams({ tiers: selectedTiers.join(",") }); - }, [selectedTiers]); - - useEffect(() => { - setSearchParams({ anomalies: anomalyOnly ? "1" : "" }); - }, [anomalyOnly]); + function updateViewMode(v: "list" | "sessions") { + setViewMode(v); + setSearchParams({ view: v === "list" ? "" : v }); + } + function updateSelectedTiers(tiers: string[]) { + setSelectedTiers(tiers); + setSearchParams({ tiers: tiers.join(",") }); + } + function updateAnomalyOnly(v: boolean) { + setAnomalyOnly(v); + setSearchParams({ anomalies: v ? "1" : "" }); + } // Polling: merge new receipts at the top, do NOT touch loadedCount or hasMore useEffect(() => { @@ -114,8 +110,8 @@ export default function App() { }); return ( -
- +
+ Skip to main content
@@ -126,7 +122,7 @@ export default function App() {
); } return (
-
+
Tool Tier Time diff --git a/extensions/boltbot/dashboard/src/components/SessionView.tsx b/extensions/boltbot/dashboard/src/components/SessionView.tsx index d7f637c82..a8942783d 100644 --- a/extensions/boltbot/dashboard/src/components/SessionView.tsx +++ b/extensions/boltbot/dashboard/src/components/SessionView.tsx @@ -103,7 +103,7 @@ function SessionCard({ {expanded && (
-
+
Tool Tier Time @@ -124,7 +124,7 @@ function SessionCard({ }} className="grid grid-cols-[1fr_80px_90px_40px_40px] gap-2 items-center px-3 py-2 rounded-lg cursor-pointer hover:bg-neutral-800/30 transition-colors" > - {r.toolName} + {r.toolName} {r.tier} @@ -162,7 +162,7 @@ export default function SessionView({ receipts, onSelectReceipt }: Props) { if (groups.length === 0) { return (
- No sessions recorded yet + No sessions recorded yet. Sessions appear here when your agent processes conversations.
); } diff --git a/extensions/boltbot/dashboard/src/components/StatsCards.tsx b/extensions/boltbot/dashboard/src/components/StatsCards.tsx index 36a546173..af20f4a7b 100644 --- a/extensions/boltbot/dashboard/src/components/StatsCards.tsx +++ b/extensions/boltbot/dashboard/src/components/StatsCards.tsx @@ -38,7 +38,7 @@ export default function StatsCards({ stats, isLoading, error }: Props) { >