From 57175b827eba286382ab2e29cc3cf30473a53f18 Mon Sep 17 00:00:00 2001 From: Copilot <223556219+Copilot@users.noreply.github.com> Date: Sun, 28 Jun 2026 13:16:02 +0200 Subject: [PATCH 1/3] =?UTF-8?q?refactor(dashboard):=20command-center=20pag?= =?UTF-8?q?e=20pass=20+=20approval=20chrome=20(=C2=A71-4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slice 8. Sweep remaining pages + approval surfaces to Command Center tokens: pages (Login, Metrics, Cost, Analytics, Audit, Pipelines, Routines, Activity) and approval chrome (ApprovalBanner, AcpApprovalModal, PermissionPromptSheet). Purple -> amber; frosted surfaces -> solid navy tokens; borders -> --color-border; numeric values -> font-mono; status -> getStatusStyle where applicable. No layout/feature/state changes. tsc clean; build passes. Executed via an aegis-driven Claude Code session. Generated by Hephaestus (Aegis dev agent) --- dashboard/src/components/approvals/ApprovalBanner.tsx | 4 ++-- dashboard/src/components/session/AcpApprovalModal.tsx | 6 +++--- .../src/components/session/PermissionPromptSheet.tsx | 6 +++--- dashboard/src/pages/ActivityPage.tsx | 2 +- dashboard/src/pages/AnalyticsPage.tsx | 4 ++-- dashboard/src/pages/AuditPage.tsx | 2 +- dashboard/src/pages/CostPage.tsx | 2 +- dashboard/src/pages/LoginPage.tsx | 6 +++--- dashboard/src/pages/MetricsPage.tsx | 8 ++++---- dashboard/src/pages/PipelinesPage.tsx | 4 ++-- dashboard/src/pages/RoutinesPage.tsx | 4 ++-- 11 files changed, 24 insertions(+), 24 deletions(-) diff --git a/dashboard/src/components/approvals/ApprovalBanner.tsx b/dashboard/src/components/approvals/ApprovalBanner.tsx index 2d73f020b..3f82d6f6f 100644 --- a/dashboard/src/components/approvals/ApprovalBanner.tsx +++ b/dashboard/src/components/approvals/ApprovalBanner.tsx @@ -87,7 +87,7 @@ export function ApprovalBanner({ sessionId, sessionName }: ApprovalBannerProps) type="button" onClick={handleApprove} disabled={isApproving || isRejecting} - className="min-h-[44px] inline-flex items-center gap-1.5 rounded-lg bg-[var(--color-success)] px-4 py-2 text-sm font-medium text-white transition-colors hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-success)] disabled:cursor-not-allowed disabled:opacity-50" + className="min-h-[44px] inline-flex items-center gap-1.5 rounded border border-[var(--color-cta-bg)] bg-[var(--color-cta-bg)] px-4 py-2 text-[13px] font-semibold text-[var(--color-cta-text)] transition-colors hover:bg-[var(--color-cta-bg-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-cta-bg)] disabled:cursor-not-allowed disabled:opacity-50" aria-label={`Approve session ${sessionName ?? sessionId}`} > {isApproving ? ( @@ -101,7 +101,7 @@ export function ApprovalBanner({ sessionId, sessionName }: ApprovalBannerProps) type="button" onClick={handleReject} disabled={isApproving || isRejecting} - className="min-h-[44px] inline-flex items-center gap-1.5 rounded-lg border border-[var(--color-danger)]/30 bg-[var(--color-error-bg)]/20 px-4 py-2 text-sm font-medium text-[var(--color-danger)] transition-colors hover:bg-[var(--color-error-bg)]/35 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-danger)] disabled:cursor-not-allowed disabled:opacity-50" + className="min-h-[44px] inline-flex items-center gap-1.5 rounded border border-[var(--color-danger)] bg-transparent px-4 py-2 text-[13px] font-semibold text-[var(--color-danger)] transition-colors hover:bg-[var(--color-danger)]/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-danger)] disabled:cursor-not-allowed disabled:opacity-50" aria-label={`Reject session ${sessionName ?? sessionId}`} > {isRejecting ? ( diff --git a/dashboard/src/components/session/AcpApprovalModal.tsx b/dashboard/src/components/session/AcpApprovalModal.tsx index 15e756486..0f1692225 100644 --- a/dashboard/src/components/session/AcpApprovalModal.tsx +++ b/dashboard/src/components/session/AcpApprovalModal.tsx @@ -108,7 +108,7 @@ export function AcpApprovalModal({ ref={trapRef} aria-modal="true" aria-label={t("aria.toolApprovalRequired")} - className="flex flex-col gap-3 rounded-xl border border-[var(--color-warning)]/35 bg-[var(--color-surface)] p-4 shadow-2xl" + className="flex flex-col gap-3 rounded-xl border border-[var(--color-border)] border-l-[3px] border-l-[var(--color-warning)] bg-[var(--color-surface)] p-4 shadow-2xl" > {/* Header */}
@@ -181,7 +181,7 @@ export function AcpApprovalModal({ type="button" onClick={handleApprove} disabled={isLoading} - className="flex flex-1 items-center justify-center gap-2 rounded-xl border border-[var(--color-success)]/30 bg-[var(--color-success-bg)] px-4 py-3 text-sm font-semibold text-[var(--color-success)] transition-colors hover:bg-[var(--color-success-bg-hover)] disabled:opacity-50 disabled:cursor-not-allowed" + className="flex flex-1 items-center justify-center gap-2 rounded-xl border border-[var(--color-cta-bg)] bg-[var(--color-cta-bg)] px-4 py-3 text-sm font-semibold text-[var(--color-cta-text)] transition-colors hover:bg-[var(--color-cta-bg-hover)] disabled:opacity-50 disabled:cursor-not-allowed" aria-label={t("aria.approveTool")} > {isLoading ? : } @@ -191,7 +191,7 @@ export function AcpApprovalModal({ type="button" onClick={() => setShowRejectReason(true)} disabled={isLoading} - className="flex flex-1 items-center justify-center gap-2 rounded-xl border border-[var(--color-error)]/30 bg-[var(--color-error-bg)] px-4 py-3 text-sm font-semibold text-[var(--color-error)] transition-colors hover:bg-[var(--color-error-bg-hover)] disabled:opacity-50 disabled:cursor-not-allowed" + className="flex flex-1 items-center justify-center gap-2 rounded-xl border border-[var(--color-danger)] bg-transparent px-4 py-3 text-sm font-semibold text-[var(--color-danger)] transition-colors hover:bg-[var(--color-danger)]/10 disabled:opacity-50 disabled:cursor-not-allowed" aria-label={t("aria.rejectTool")} > {isLoading ? : } diff --git a/dashboard/src/components/session/PermissionPromptSheet.tsx b/dashboard/src/components/session/PermissionPromptSheet.tsx index b2af32926..3aa3e4f37 100644 --- a/dashboard/src/components/session/PermissionPromptSheet.tsx +++ b/dashboard/src/components/session/PermissionPromptSheet.tsx @@ -65,7 +65,7 @@ export function PermissionPromptSheet({ ref={trapRef} aria-modal="true" aria-label={t("aria.permissionPrompt")} - className="rounded-t-2xl border border-[var(--color-warning)]/35 bg-[var(--color-surface)] p-4 shadow-2xl" + className="rounded-t-2xl border border-[var(--color-border)] border-l-[3px] border-l-[var(--color-warning)] bg-[var(--color-surface)] p-4 shadow-2xl" >
@@ -99,14 +99,14 @@ export function PermissionPromptSheet({ diff --git a/dashboard/src/pages/ActivityPage.tsx b/dashboard/src/pages/ActivityPage.tsx index e589f43e1..931856290 100644 --- a/dashboard/src/pages/ActivityPage.tsx +++ b/dashboard/src/pages/ActivityPage.tsx @@ -95,7 +95,7 @@ export default function ActivityPage() { )}
-
+
{heatmapLoading ? (
diff --git a/dashboard/src/pages/AnalyticsPage.tsx b/dashboard/src/pages/AnalyticsPage.tsx index 894ee67cc..1c8437693 100644 --- a/dashboard/src/pages/AnalyticsPage.tsx +++ b/dashboard/src/pages/AnalyticsPage.tsx @@ -407,7 +407,7 @@ export default function AnalyticsPage() { {(data.topApiKeys ?? []).length > 0 ? (
{(data.topApiKeys ?? []).map((key) => ( -
+
{key.keyName}
{key.sessions} session{key.sessions !== 1 ? 's' : ''} · {key.messages} message{key.messages !== 1 ? 's' : ''}
@@ -482,7 +482,7 @@ function EmptyChart() { function MetricBox({ label, value }: { label: string; value: string }) { return ( -
+
{label}
{value}
diff --git a/dashboard/src/pages/AuditPage.tsx b/dashboard/src/pages/AuditPage.tsx index e33e69a20..aaa7d0632 100644 --- a/dashboard/src/pages/AuditPage.tsx +++ b/dashboard/src/pages/AuditPage.tsx @@ -190,7 +190,7 @@ function AuditRow({ record, index, onClick }: { record: AuditRecord; index: numb }} className="border-b border-[var(--color-void-lighter)] transition-colors hover:bg-[var(--color-void-light)]/40 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]" > - + {formatTimestamp(record.ts)} diff --git a/dashboard/src/pages/CostPage.tsx b/dashboard/src/pages/CostPage.tsx index a89ed08d6..af1b401f9 100644 --- a/dashboard/src/pages/CostPage.tsx +++ b/dashboard/src/pages/CostPage.tsx @@ -44,7 +44,7 @@ import { getBudgetSettings, type BudgetSettings } from '../utils/budgetSettings' const MODEL_COLORS: Record = { 'claude-sonnet-4.6': 'var(--color-accent-cyan)', - 'claude-opus-4.7': 'var(--color-accent-purple)', + 'claude-opus-4.7': 'var(--color-accent)', 'claude-haiku-4.5': 'var(--color-success)', 'gpt-5.4': 'var(--color-warning)', 'gpt-4.1': 'var(--color-info)', diff --git a/dashboard/src/pages/LoginPage.tsx b/dashboard/src/pages/LoginPage.tsx index c5e048cf4..9083b4c1b 100644 --- a/dashboard/src/pages/LoginPage.tsx +++ b/dashboard/src/pages/LoginPage.tsx @@ -65,7 +65,7 @@ export default function LoginPage() { return (
-
+
{/* Logo / Title */}
@@ -83,7 +83,7 @@ export default function LoginPage() { diff --git a/dashboard/src/pages/MetricsPage.tsx b/dashboard/src/pages/MetricsPage.tsx index 763eafaa5..6e907c335 100644 --- a/dashboard/src/pages/MetricsPage.tsx +++ b/dashboard/src/pages/MetricsPage.tsx @@ -188,7 +188,7 @@ export default function MetricsPage() { {/* Summary cards */}
-
+
-
+
-
+
-
+
- {pipeline.stages.length} step{pipeline.stages.length !== 1 ? 's' : ''} - {formatTimeAgo(pipeline.createdAt)} + {pipeline.stages.length} step{pipeline.stages.length !== 1 ? 's' : ''} + {formatTimeAgo(pipeline.createdAt)}
diff --git a/dashboard/src/pages/RoutinesPage.tsx b/dashboard/src/pages/RoutinesPage.tsx index dcb730cce..dd30e29e6 100644 --- a/dashboard/src/pages/RoutinesPage.tsx +++ b/dashboard/src/pages/RoutinesPage.tsx @@ -91,7 +91,7 @@ export default function RoutinesPage() {