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}}
);
}