diff --git a/src/pages/Dashboard/Dashboard.module.css b/src/pages/Dashboard/Dashboard.module.css index 29e7112..72fb682 100644 --- a/src/pages/Dashboard/Dashboard.module.css +++ b/src/pages/Dashboard/Dashboard.module.css @@ -7,14 +7,6 @@ background: var(--bg-body); } -/* Health strip */ -.healthStrip { - display: grid; - grid-template-columns: repeat(5, 1fr); - gap: 10px; - margin-bottom: 16px; -} - /* Filter bar spacing */ .filterBar { margin-bottom: 16px; diff --git a/src/pages/Dashboard/Dashboard.tsx b/src/pages/Dashboard/Dashboard.tsx index 59477c7..97ea2e4 100644 --- a/src/pages/Dashboard/Dashboard.tsx +++ b/src/pages/Dashboard/Dashboard.tsx @@ -15,9 +15,10 @@ import { ShortcutsBar } from '../../design-system/composites/ShortcutsBar/Shortc import { ProcessorTimeline } from '../../design-system/composites/ProcessorTimeline/ProcessorTimeline' import { RouteFlow } from '../../design-system/composites/RouteFlow/RouteFlow' import type { RouteNode } from '../../design-system/composites/RouteFlow/RouteFlow' +import { KpiStrip } from '../../design-system/composites/KpiStrip/KpiStrip' +import type { KpiItem } from '../../design-system/composites/KpiStrip/KpiStrip' // Primitives -import { StatCard } from '../../design-system/primitives/StatCard/StatCard' import { StatusDot } from '../../design-system/primitives/StatusDot/StatusDot' import { MonoText } from '../../design-system/primitives/MonoText/MonoText' import { Badge } from '../../design-system/primitives/Badge/Badge' @@ -27,12 +28,44 @@ import { useGlobalFilters } from '../../design-system/providers/GlobalFilterProv // Mock data import { exchanges, type Exchange } from '../../mocks/exchanges' -import { kpiMetrics } from '../../mocks/metrics' +import { kpiMetrics, type KpiMetric } from '../../mocks/metrics' import { SIDEBAR_APPS, buildRouteToAppMap } from '../../mocks/sidebar' // Route → Application lookup const ROUTE_TO_APP = buildRouteToAppMap() +// ─── KPI mapping ───────────────────────────────────────────────────────────── +const ACCENT_TO_COLOR: Record = { + amber: 'var(--amber)', + success: 'var(--success)', + error: 'var(--error)', + running: 'var(--running)', + warning: 'var(--warning)', +} + +const TREND_ICONS: Record = { + up: '\u2191', + down: '\u2193', + neutral: '\u2192', +} + +function sentimentToVariant(sentiment: KpiMetric['trendSentiment']): 'success' | 'error' | 'muted' { + switch (sentiment) { + case 'good': return 'success' + case 'bad': return 'error' + case 'neutral': return 'muted' + } +} + +const kpiItems: KpiItem[] = kpiMetrics.map((m) => ({ + label: m.label, + value: m.unit ? `${m.value} ${m.unit}` : m.value, + trend: { label: `${TREND_ICONS[m.trend]} ${m.trendValue}`, variant: sentimentToVariant(m.trendSentiment) }, + subtitle: m.detail, + sparkline: m.sparkline, + borderColor: ACCENT_TO_COLOR[m.accent], +})) + // ─── Helpers ───────────────────────────────────────────────────────────────── function formatDuration(ms: number): string { if (ms >= 60_000) return `${(ms / 1000).toFixed(0)}s` @@ -370,20 +403,7 @@ export function Dashboard() {
{/* Health strip */} -
- {kpiMetrics.map((kpi, i) => ( - - ))} -
+ {/* Exchanges table */}