"use client"; import { Donut } from "@/components/charts/donut"; import { GlassPanel } from "@/components/primitives"; import { SectionHeader } from "@/components/shared"; import { formatNumber } from "@/lib/format"; import type { ModerationTrends } from "@/lib/types"; const SEVERITY_COLOR: Record = { critical: "var(--color-vermilion)", high: "var(--color-vermilion)", medium: "var(--color-amber)", low: "var(--color-signal)", none: "var(--color-ink-faint)", }; function BarRow({ label, count, max, color = "var(--color-signal)", }: { label: string; count: number; max: number; color?: string; }) { const pct = max > 0 ? Math.max(2, (count / max) * 100) : 0; return (
{label}
{formatNumber(count)}
); } export function TopicTrends({ trends }: { trends: ModerationTrends }) { const maxCat = trends.categories.reduce((m, c) => Math.max(m, c.count), 0); const maxAct = trends.actions.reduce((m, a) => Math.max(m, a.count), 0); const totalSev = trends.severities.reduce((s, x) => s + x.count, 0); const severitySegments = trends.severities.map((s) => ({ value: s.count, color: SEVERITY_COLOR[s.level] ?? "var(--color-ink-faint)", label: s.level, })); return ( {trends.categories.length === 0 && trends.severities.length === 0 ? (

No categorized actions in the last 30 days.

) : (

Top flagged categories

{trends.categories.slice(0, 10).map((c) => ( ))} {trends.categories.length === 0 && (

No categories recorded.

)}

Severity

{totalSev > 0 ? (
{trends.severities.map((s) => (
{s.level} {formatNumber(s.count)}
))}
) : (

No severity data.

)}

Action types

{trends.actions.slice(0, 6).map((a) => ( ))}
)}
); }