import type { FieldChange } from "@/lib/api"; import { fmtPctDelta } from "@/lib/format"; /** * WHAT CHANGED — field-level before → after table (spec §21, §78). Pure server-renderable component. */ export function FieldChanges({ items, compact = false, max }: { items: FieldChange[] | null | undefined; compact?: boolean; max?: number }) { if (!items?.length) return null; const rows = max ? items.slice(0, max) : items; return (
{rows.map((f, i) => ( ))}
{f.label} {f.kind} {f.before ?? "∅"} → {f.after ?? "∅"} {f.deltaPct !== null && f.deltaPct !== undefined && 0 ? "text-high" : "text-signal"}`}>{fmtPctDelta(f.deltaPct)}}
{max && items.length > max &&
+{items.length - max} more field change{items.length - max === 1 ? "" : "s"}
}
); } /** One-line inline version for feed rows / drawer headers. */ export function FieldChangeInline({ items, max = 2 }: { items: FieldChange[] | null | undefined; max?: number }) { if (!items?.length) return null; return ( {items.slice(0, max).map((f, i) => ( {f.label.length > 22 ? f.label.slice(0, 21) + "…" : f.label} {f.before ?? "∅"} → {f.after ?? "∅"} {f.deltaPct !== null && f.deltaPct !== undefined && 0 ? "text-high" : "text-signal"}>{fmtPctDelta(f.deltaPct)}} ))} {items.length > max && +{items.length - max}} ); }