"use client"; import { useState } from "react"; import { diffLineClassName, diffLinePrefix, pairDiffLines, type DiffFile, type DiffViewMode, } from "@/features/agent/ui/git-diff-panel-model"; export function DiffFileList({ files, viewMode, onViewMode, }: { files: DiffFile[]; viewMode: DiffViewMode; onViewMode: (mode: DiffViewMode) => void; }) { return (
onViewMode("unified")}> Unified onViewMode("side-by-side")} > Side by side onViewMode("stacked")}> Top / bottom
{files.map((file, fileIndex) => ( ))}
); } // Render a file's diff body only while its
is open. A collapsed //
keeps its children in the DOM, so without this a large diff (a // lockfile, a big refactor) would materialize every file's full line list at // once — tens of thousands of grid rows — and freeze the pane. function DiffFileEntry({ file, viewMode, defaultOpen, }: { file: DiffFile; viewMode: DiffViewMode; defaultOpen: boolean; }) { const [open, setOpen] = useState(defaultOpen); return (
setOpen((event.currentTarget as HTMLDetailsElement).open)} > {file.path} +{file.additions}{" "} -{file.deletions} {open ? ( viewMode === "side-by-side" ? ( ) : viewMode === "stacked" ? ( ) : ( ) ) : null}
); } function DiffModeButton({ active, onClick, children, }: { active: boolean; onClick: () => void; children: string; }) { return ( ); } function UnifiedDiff({ file }: { file: DiffFile }) { return (
{file.lines.map((line, index) => (
{line.oldLine ?? ""} {line.newLine ?? ""} {diffLinePrefix(line.kind)} {line.text}
))}
); } function SideBySideDiff({ file }: { file: DiffFile }) { const rows = pairDiffLines(file); return (
{rows.map((row, index) => (
))}
); } function StackedDiff({ file }: { file: DiffFile }) { const oldLines = file.lines.filter((line) => line.kind !== "add"); const newLines = file.lines.filter((line) => line.kind !== "del"); return (
Before
{oldLines.map((line, index) => ( ))}
After
{newLines.map((line, index) => ( ))}
); } function DiffCell({ line, side }: { line?: DiffFile["lines"][number]; side: "old" | "new" }) { if (!line) { return
; } const lineNumber = side === "old" ? line.oldLine : line.newLine; return (
{lineNumber ?? ""} {diffLinePrefix(line.kind)} {line.text}
); } function DiffStackLine({ line }: { line: DiffFile["lines"][number] }) { return (
{line.kind === "del" ? line.oldLine : (line.newLine ?? line.oldLine ?? "")} {diffLinePrefix(line.kind)} {line.text}
); }