History

refactor(ui): adopt Badge component consistently (#163)

* refactor(ui): adopt Badge component consistently Replaces hand-rolled `<span class="rounded ...">` pill markup with the shared `<Badge>` component in billing, team, source detail, and tools pages. Also documents the preference in AGENTS.md so new code reaches for `<Badge>` and `<CardStack>` instead of reinventing them. No behaviour change — the visual output is equivalent to the previous inline styles, just routed through the shared component so the styling stays consistent across the app. * Update AGENTS.md ---------

Moritz Meyer committed 7 months ago

Commit 060e9ff1 parent 2a6312c5 files · +22 −25Browse files

Unified · Split

5 files
  1. apps/cloud/src/routes/billing.tsx +5 −4
  2. apps/cloud/src/routes/billing_.plans.tsx +7 −6
  3. apps/cloud/src/routes/team.tsx +4 −5
  4. packages/react/src/pages/source-detail.tsx +4 −7
  5. packages/react/src/pages/tools.tsx +2 −3
apps/cloud/src/routes/billing.tsx+5−4
@@ -1,6 +1,7 @@
11 import { createFileRoute, Link } from "@tanstack/react-router";
22 import { useCustomer, useListPlans } from "autumn-js/react";
33 import { Button } from "@executor/react/components/button";
4+import { Badge } from "@executor/react/components/badge";
45
56 type Plan = NonNullable<ReturnType<typeof useListPlans>["data"]>[number];
67
@@ -68,14 +69,14 @@ function BillingPage() { · 61 unmodified lines
6869 {planName}
6970 </p>
7071 {isSwitching && (
71− <span className="rounded-full bg-amber-500/10 px-1.5 py-0.5 text-[0.625rem] font-medium text-amber-600 dark:text-amber-400 leading-none">
72+ <Badge className="bg-amber-500/10 text-amber-600 dark:text-amber-400">
7273 Switching
73− </span>
74+ </Badge>
7475 )}
7576 {isCanceling && !isSwitching && (
76− <span className="rounded-full bg-amber-500/10 px-1.5 py-0.5 text-[0.625rem] font-medium text-amber-600 dark:text-amber-400 leading-none">
77+ <Badge className="bg-amber-500/10 text-amber-600 dark:text-amber-400">
7778 Canceling
78− </span>
79+ </Badge>
7980 )}
8081 </div>
8182 <p className="mt-1 text-[0.75rem] text-muted-foreground/70 leading-none">
apps/cloud/src/routes/billing_.plans.tsx+7−6
@@ -2,6 +2,7 @@ import { useState } from "react"; · 1 unmodified line
22 import { createFileRoute, Link } from "@tanstack/react-router";
33 import { useCustomer, useListPlans } from "autumn-js/react";
44 import { Button } from "@executor/react/components/button";
5+import { Badge } from "@executor/react/components/badge";
56
67 type Plan = NonNullable<ReturnType<typeof useListPlans>["data"]>[number];
78
@@ -120,19 +121,19 @@ function PlansPage() { · 112 unmodified lines
120121 {plan.name}
121122 </p>
122123 {isCurrent && (
123− <span className="rounded-full bg-amber-500/10 px-1.5 py-0.5 text-[0.625rem] font-medium text-amber-600 dark:text-amber-400 leading-none">
124+ <Badge className="bg-amber-500/10 text-amber-600 dark:text-amber-400">
124125 Your plan
125− </span>
126+ </Badge>
126127 )}
127128 {isCanceling && (
128− <span className="rounded-full bg-amber-500/10 px-1.5 py-0.5 text-[0.625rem] font-medium text-amber-600 dark:text-amber-400 leading-none">
129+ <Badge className="bg-amber-500/10 text-amber-600 dark:text-amber-400">
129130 Canceling
130− </span>
131+ </Badge>
131132 )}
132133 {isScheduled && (
133− <span className="rounded-full bg-emerald-500/10 px-1.5 py-0.5 text-[0.625rem] font-medium text-emerald-600 dark:text-emerald-400 leading-none">
134+ <Badge className="bg-emerald-500/10 text-emerald-600 dark:text-emerald-400">
134135 Scheduled
135− </span>
136+ </Badge>
136137 )}
137138 </div>
138139 <p className="mt-1 text-[0.75rem] text-muted-foreground/70">{meta.tagline}</p>
apps/cloud/src/routes/team.tsx+4−5
@@ -13,6 +13,7 @@ import { · 12 unmodified lines
1313 DialogClose,
1414 } from "@executor/react/components/dialog";
1515 import { Button } from "@executor/react/components/button";
16+import { Badge } from "@executor/react/components/badge";
1617 import { Input } from "@executor/react/components/input";
1718 import { Label } from "@executor/react/components/label";
1819 import {
@@ -214,14 +215,12 @@ function TeamPage() { · 195 unmodified lines
214215 {member.name ?? member.email}
215216 </p>
216217 {member.isCurrentUser && (
217− <span className="rounded bg-muted px-1.5 py-0.5 text-[0.625rem] font-medium text-muted-foreground leading-none">
218− You
219− </span>
218+ <Badge className="bg-muted text-muted-foreground">You</Badge>
220219 )}
221220 {member.status === "pending" && (
222− <span className="rounded bg-amber-500/10 px-1.5 py-0.5 text-[0.625rem] font-medium text-amber-600 dark:text-amber-400 leading-none">
221+ <Badge className="bg-amber-500/10 text-amber-600 dark:text-amber-400">
223222 Invited
224− </span>
223+ </Badge>
225224 )}
226225 </div>
227226 {member.name && (
packages/react/src/pages/source-detail.tsx+4−7
@@ -14,6 +14,7 @@ import type { ToolSummary } from "../components/tool-tree"; · 13 unmodified lines
1414 import { useScope } from "../hooks/use-scope";
1515 import type { SourcePlugin } from "../plugins/source-plugin";
1616 import { Button } from "../components/button";
17+import { Badge } from "../components/badge";
1718
1819 export function SourceDetailPage(props: {
1920 namespace: string;
@@ -116,13 +117,9 @@ export function SourceDetailPage(props: { · 96 unmodified lines
116117 {sourceData?.name ?? namespace}
117118 </h2>
118119 {sourceData?.runtime && (
119− <span className="rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
120− built-in
121− </span>
120+ <Badge className="bg-muted text-muted-foreground">built-in</Badge>
122121 )}
123− <span className="rounded bg-secondary px-1.5 py-0.5 text-[10px] font-medium text-secondary-foreground">
124− {sourceData?.kind ?? "source"}
125− </span>
122+ <Badge variant="secondary">{sourceData?.kind ?? "source"}</Badge>
126123 {Result.isSuccess(tools) && !editing && (
127124 <span className="hidden text-[11px] tabular-nums text-muted-foreground/50 sm:block">
128125 {sourceTools.length} {sourceTools.length === 1 ? "tool" : "tools"}
@@ -208,7 +205,7 @@ export function SourceDetailPage(props: { · 79 unmodified lines
208205 onSuccess: () => (
209206 <div className="flex min-h-0 flex-1 overflow-hidden">
210207 {/* Left: tool tree */}
211− <div className="flex w-72 shrink-0 flex-col border-r border-border bg-card/30 lg:w-80 xl:w-[22rem]">
208+ <div className="flex w-72 shrink-0 flex-col border-r border-border/60 lg:w-80 xl:w-[22rem]">
212209 <ToolTree
213210 tools={sourceTools}
214211 selectedToolId={selectedToolId}
packages/react/src/pages/tools.tsx+2−3
@@ -1,6 +1,7 @@
11 import { useAtomValue, Result } from "@effect-atom/atom-react";
22 import { toolsAtom } from "../api/atoms";
33 import { useScope } from "../hooks/use-scope";
4+import { Badge } from "../components/badge";
45
56 export function ToolsPage() {
67 const scopeId = useScope();
@@ -61,9 +62,7 @@ export function ToolsPage() { · 54 unmodified lines
6162 </p>
6263 )}
6364 </div>
64− <span className="shrink-0 rounded bg-secondary px-1.5 py-0.5 text-[10px] font-medium text-secondary-foreground">
65− {t.sourceId}
66− </span>
65+ <Badge variant="secondary">{t.sourceId}</Badge>
6766 </div>
6867 ))}
6968 </div>

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t