"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 (