matrix-builder / web /src /components /DiffView.tsx
ruslanmv
Deploy: metrics + docs (Batch 12)
22b729d
Raw
History Blame Contribute Delete
1.64 kB
"use client";
// Dependency-free unified-diff viewer (Batch 11).
//
// The web app keeps a minimal dependency footprint (next/react only), so rather
// than pull in Monaco/an editor we render the proxied diff text with line-level
// colouring. Read-only, scrollable, monospaced — enough to review a GitPilot
// change in the browser before Matrix approves it.
import { parseDiffLines, type DiffLineKind } from "@/lib/gitpilot-client";
const COLORS: Record<DiffLineKind, { color: string; bg: string }> = {
add: { color: "#22c878", bg: "rgba(34,200,120,.10)" },
del: { color: "#ff6b6b", bg: "rgba(255,107,107,.10)" },
hunk: { color: "#53b9ff", bg: "rgba(83,185,255,.08)" },
meta: { color: "#8aa0b4", bg: "transparent" },
context: { color: "#c9d4df", bg: "transparent" },
};
export default function DiffView({ diff }: { diff: string }) {
const lines = parseDiffLines(diff);
if (!diff.trim()) {
return <div className="diffview-empty">No diff to show.</div>;
}
return (
<pre
className="diffview"
style={{
maxHeight: 360,
overflow: "auto",
margin: 0,
padding: "10px 12px",
borderRadius: 10,
background: "#02140c",
border: "1px solid rgba(34,200,120,.18)",
fontSize: 12.5,
lineHeight: 1.55,
fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
}}
>
{lines.map((l, i) => {
const c = COLORS[l.kind];
return (
<div key={i} style={{ color: c.color, background: c.bg, whiteSpace: "pre-wrap" }}>
{l.text || " "}
</div>
);
})}
</pre>
);
}