amana / frontend /src /lib.ts
Misbahuddin's picture
feat(ui): first-run welcome modal + Light/Auto/Dark theme
61cdd31
Raw
History Blame Contribute Delete
1.77 kB
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`;
}