From bf206334e3eb9aa7a1ced7b93207670c210b1a16 Mon Sep 17 00:00:00 2001 From: Logan Cusano Date: Sun, 25 Oct 2026 21:29:13 -0400 Subject: [PATCH] =?UTF-8?q?fix(frontend):=20finish=20the=20token=20migrati?= =?UTF-8?q?on=20=E2=80=94=20raw=20grey=20classes=20->=20theme=20tokens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UI_REDESIGN chunk 4 was never finished: 39 app/component files still used raw Tailwind greys, kept readable in light mode only by the !important override sheet. In dark mode text-gray-600 is ~2.3:1 on surface, and the light override maps it to #94a3b8 (~2.6:1 on white) — unreadable in both. Mechanical mapping (886 classes): gray-100/200 -> ink, 300/400 -> ink-2, 500/600/700 -> ink-muted, bg 950/900/800 -> page/surface/raised, border 800 -> line, 700/600 -> line-strong, plus hover/divide/placeholder. Alpha suffixes kept (tokens are color-mix, so /60 works). bg-gray-700, text-white and marketing pages left alone. text-[9px] -> text-[10px]. Frontend unverified: no Node on the authoring box (#207). Co-Authored-By: Claude Opus 5.5 --- drb-frontend/app/admin/page.tsx | 218 ++++++++--------- drb-frontend/app/alerts/page.tsx | 60 ++--- drb-frontend/app/faq/page.tsx | 8 +- drb-frontend/app/features/page.tsx | 8 +- drb-frontend/app/login/page.tsx | 14 +- drb-frontend/app/nodes/[id]/page.tsx | 26 +- drb-frontend/app/nodes/page.tsx | 8 +- drb-frontend/app/onboarding/page.tsx | 8 +- drb-frontend/app/page.tsx | 18 +- drb-frontend/app/pricing/page.tsx | 6 +- drb-frontend/app/privacy/page.tsx | 6 +- drb-frontend/app/profile/page.tsx | 32 +-- drb-frontend/app/settings/api-keys/page.tsx | 26 +- drb-frontend/app/settings/billing/page.tsx | 24 +- drb-frontend/app/settings/layout.tsx | 6 +- drb-frontend/app/settings/members/page.tsx | 26 +- drb-frontend/app/settings/nodes/page.tsx | 28 +-- .../app/settings/organization/page.tsx | 10 +- drb-frontend/app/signup/page.tsx | 14 +- drb-frontend/app/systems/page.tsx | 226 +++++++++--------- drb-frontend/app/terms/page.tsx | 6 +- drb-frontend/app/trips/[id]/page.tsx | 144 +++++------ drb-frontend/app/trips/page.tsx | 42 ++-- drb-frontend/app/waitlist/page.tsx | 18 +- drb-frontend/components/CallRow.tsx | 62 ++--- drb-frontend/components/CameraFeed.tsx | 4 +- drb-frontend/components/LiveView.tsx | 2 +- drb-frontend/components/MapView.tsx | 24 +- drb-frontend/components/NodeCard.tsx | 20 +- drb-frontend/components/NodeConfigModal.tsx | 30 +-- drb-frontend/components/RadioChannels.tsx | 10 +- drb-frontend/components/SdrSettings.tsx | 30 +-- drb-frontend/components/StatusBadge.tsx | 2 +- .../components/admin/CameraProvidersTab.tsx | 26 +- .../components/admin/OutageProvidersTab.tsx | 28 +-- drb-frontend/components/admin/ReplayTab.tsx | 78 +++--- drb-frontend/components/live/WallPanels.tsx | 8 +- drb-frontend/components/ui/EmptyState.tsx | 2 +- .../components/ui/MachineOutputNotice.tsx | 2 +- 39 files changed, 655 insertions(+), 655 deletions(-) diff --git a/drb-frontend/app/admin/page.tsx b/drb-frontend/app/admin/page.tsx index 6b83723..05a2bfc 100644 --- a/drb-frontend/app/admin/page.tsx +++ b/drb-frontend/app/admin/page.tsx @@ -85,7 +85,7 @@ function fmtDatetime(iso: string | null | undefined) { const ROLE_COLORS: Record = { admin: "bg-indigo-900 text-indigo-300", operator: "bg-green-900 text-green-300", - viewer: "bg-gray-800 text-gray-400", + viewer: "bg-raised text-ink-2", }; function RoleBadge({ role }: { role: UserRole }) { @@ -136,14 +136,14 @@ function FeaturesTab() { )} {loading ? ( -

Loading…

+

Loading…

) : ( -
+
{FLAG_META.map(({ key, label, description }) => (

{label}

-

{description}

+

{description}

-

+

Fetches recent incidents with per-call correlation debug fields, plus orphaned calls. Copy the JSON and paste it to Claude to diagnose correlation problems.

- + setLimit(Math.min(100, Math.max(1, Number(e.target.value))))} - className="w-24 bg-gray-800 border border-gray-700 rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" + className="w-24 bg-raised border border-line-strong rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" />
- + setOrphanHours(Math.min(168, Math.max(1, Number(e.target.value))))} - className="w-28 bg-gray-800 border border-gray-700 rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" + className="w-28 bg-raised border border-line-strong rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" />
@@ -295,22 +295,22 @@ function CorrelationDebugTab() { {meta && Object.keys(pathCounts).length > 0 && (
-
-

corr_path distribution

+
+

corr_path distribution

{Object.entries(pathCounts).sort((a, b) => b[1] - a[1]).map(([path, n]) => (
- {path} + {path} {n}
))}
-
-

fit_signal distribution

+
+

fit_signal distribution

{Object.keys(signalCounts).length === 0 - ?

No signal data yet — deploy correlator update first

+ ?

No signal data yet — deploy correlator update first

: Object.entries(signalCounts).sort((a, b) => b[1] - a[1]).map(([sig, n]) => (
- {sig} + {sig} {n}
)) @@ -320,13 +320,13 @@ function CorrelationDebugTab() { )} {meta?.orphans_by_talkgroup && meta.orphans_by_talkgroup.length > 0 && ( -
-

orphans by talkgroup

+
+

orphans by talkgroup

{meta.orphans_by_talkgroup.map((tg) => (
- {tg.talkgroup_name} ({tg.talkgroup_id}) - - {tg.count} total · {tg.no_type_count} no-type · {tg.sweep_exhausted_count} exhausted + {tg.talkgroup_name} ({tg.talkgroup_id}) + + {tg.count} total · {tg.no_type_count} no-type · {tg.sweep_exhausted_count} exhausted
))} @@ -336,7 +336,7 @@ function CorrelationDebugTab() { {json && (
           {json}
         
@@ -455,13 +455,13 @@ function UserDetailPanel({ const isSelf = user.uid === currentUid; return ( -
+

{detail.email}

-

{detail.uid}

+

{detail.uid}

- +
{error && ( @@ -472,21 +472,21 @@ function UserDetailPanel({
- + setEditName(e.target.value)} - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-1.5 text-white text-sm focus:outline-none focus:border-indigo-500" + className="w-full bg-raised border border-line-strong rounded-lg px-3 py-1.5 text-white text-sm focus:outline-none focus:border-indigo-500" placeholder="Full name" />
- + setEditNodes(e.target.value)} - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" + className="w-full bg-raised border border-line-strong rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" placeholder="node-abc123, node-def456" />
@@ -517,10 +517,10 @@ function UserDetailPanel({
-
+
- Organization - + Organization + {!detail.org_id ? "None: sees no data" : detail.org_id === myOrgId @@ -538,34 +538,34 @@ function UserDetailPanel({ )}
- Status + Status {detail.disabled ? "Disabled" : "Active"}
- Discord - + Discord + {detail.discord_linked ? `@${detail.discord_username ?? detail.discord_user_id}` : "Not linked"}
- Created - {fmtDate(detail.creation_time)} + Created + {fmtDate(detail.creation_time)}
- Last sign-in - {fmtDate(detail.last_sign_in)} + Last sign-in + {fmtDate(detail.last_sign_in)}
{(detail.sessions?.length ?? 0) > 0 && ( -
+
@@ -667,19 +667,19 @@ function CreateUserModal({ if (inviteLink) { return (
-
+

User Created

-

+

Share this one-time invite link with the new user so they can set their password. It expires after use.

-
+

{inviteLink}

@@ -697,37 +697,37 @@ function CreateUserModal({ return (
-
+

Create User

- + setEmail(e.target.value)} required - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-indigo-500" + className="w-full bg-raised border border-line-strong rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-indigo-500" placeholder="user@example.com" />
-
- + setNodeIds(e.target.value)} required - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" + className="w-full bg-raised border border-line-strong rounded-lg px-3 py-2 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" placeholder="node-abc123, node-def456" />
@@ -760,7 +760,7 @@ function CreateUserModal({ @@ -820,7 +820,7 @@ function UsersTab({ currentUid }: { currentUid: string }) { )}
-

{users.length} user{users.length !== 1 ? "s" : ""}

+

{users.length} user{users.length !== 1 ? "s" : ""}