Deletes the vanilla shell and mounts App.tsx on #root. main.ts and the 23 views it drove are gone; App.tsx composes the ported components — sidebar, multi-view, command bar, spawn modal, help and restart overlays, daemon link, drawer — around the catalog and layout stores. The pure parts of four deleted modules moved next to the components that still use them: the spawn-form model and spawnSimilar into components/spawn, the transcript's markdown/format helpers and the diff into components/structured, the help overlay's grouping into components/dialogs. Document-level event names now live in uiEvents.ts. Deduplicated two pairs the migration left side by side: the sidebar uses dialogs/KillDialog and common/ContextMenu. It also listens for the command bar's kill/rename events, which nothing had picked up since catalog.ts went away. styles.css stays as the token and base layer, with `#app` renamed to `#root` and the pane-body rules re-keyed off the classes the React panes actually carry. Closes #253
57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
// A `Diff` content block, rendered as coloured hunks. ACP hands over whole
|
||
// `oldText`/`newText`, so the lines and their `+added −removed` counts are
|
||
// computed here (diff.ts) rather than parsed out of a patch.
|
||
|
||
import { useMemo } from "react";
|
||
|
||
import { computeDiffLines, diffStats, type DiffLine } from "./diff.js";
|
||
import type { AcpDiff } from "../../types.js";
|
||
import { Copyable } from "./Copyable.js";
|
||
|
||
/** Column prefix by line kind. A `hunk` summary and an `eof` marker are their
|
||
* own complete text, so neither takes one. */
|
||
const PREFIX: Record<DiffLine["kind"], string> = {
|
||
add: "+ ",
|
||
del: "- ",
|
||
ctx: " ",
|
||
hunk: "",
|
||
eof: "",
|
||
};
|
||
|
||
export function diffLineText(line: DiffLine): string {
|
||
return PREFIX[line.kind] + line.text;
|
||
}
|
||
|
||
export interface DiffViewProps {
|
||
diff: AcpDiff;
|
||
}
|
||
|
||
export function DiffView({ diff }: DiffViewProps) {
|
||
const lines = useMemo(() => computeDiffLines(diff.oldText, diff.newText), [diff.oldText, diff.newText]);
|
||
const stats = useMemo(() => diffStats(lines), [lines]);
|
||
const plain = useMemo(() => lines.map(diffLineText).join("\n"), [lines]);
|
||
|
||
return (
|
||
<div className="st-diff-block">
|
||
<Copyable className="st-diff-path" text={diff.path} label="path" title={diff.path}>
|
||
{diff.path}
|
||
</Copyable>
|
||
<Copyable
|
||
className="st-diff"
|
||
text={plain}
|
||
label="diff"
|
||
data-added={stats.added}
|
||
data-removed={stats.removed}
|
||
>
|
||
<pre>
|
||
{lines.map((line, index) => (
|
||
<span key={index} className={`st-ln st-ln-${line.kind}`}>
|
||
{diffLineText(line)}
|
||
</span>
|
||
))}
|
||
</pre>
|
||
</Copyable>
|
||
</div>
|
||
);
|
||
}
|