Spaces:
Sleeping
Sleeping
| import type { Recommendation, Severity } from "./types"; | |
| // Full literal class strings (not built dynamically) so Tailwind's content scanner keeps them. | |
| // Decision colors stay semantic and legible (green/red/amber), with dark variants; the brand | |
| // pine/gold is reserved for chrome so the verdict never competes with the brand. | |
| export const REC: Record< | |
| Recommendation, | |
| { bg: string; text: string; border: string; solid: string; label: string } | |
| > = { | |
| APPROVE: { | |
| bg: "bg-emerald-50 dark:bg-emerald-500/10", | |
| text: "text-emerald-800 dark:text-emerald-300", | |
| border: "border-emerald-300 dark:border-emerald-500/30", | |
| solid: "bg-emerald-600", | |
| label: "Approve", | |
| }, | |
| REJECT: { | |
| bg: "bg-rose-50 dark:bg-rose-500/10", | |
| text: "text-rose-800 dark:text-rose-300", | |
| border: "border-rose-300 dark:border-rose-500/30", | |
| solid: "bg-rose-600", | |
| label: "Reject", | |
| }, | |
| ESCALATE: { | |
| bg: "bg-amber-50 dark:bg-amber-500/10", | |
| text: "text-amber-800 dark:text-amber-300", | |
| border: "border-amber-300 dark:border-amber-500/30", | |
| solid: "bg-amber-500", | |
| label: "Escalate", | |
| }, | |
| }; | |
| export const SEV: Record<Severity, { dot: string; text: string }> = { | |
| high: { dot: "bg-rose-500", text: "text-rose-700 dark:text-rose-300" }, | |
| medium: { dot: "bg-amber-500", text: "text-amber-700 dark:text-amber-300" }, | |
| low: { dot: "bg-stone-400 dark:bg-stone-500", text: "text-muted" }, | |
| }; | |
| // "9,978 in / 928 out · 1.2s" — compact run telemetry for the verdict footer. | |
| export function fmtTokens(n?: number | null): string | null { | |
| return n == null ? null : n.toLocaleString(); | |
| } | |
| export function fmtLatency(ms?: number | null): string | null { | |
| if (ms == null) return null; | |
| return ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(1)}s`; | |
| } | |