@agent-native/core 0.44.1 → 0.44.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +28 -13
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/skills.d.ts +5 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +651 -21
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.js +14 -3
- package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
- package/dist/client/blocks/library/ApiEndpointBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/ApiEndpointBlock.js +11 -7
- package/dist/client/blocks/library/ApiEndpointBlock.js.map +1 -1
- package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/DiffBlock.js +89 -5
- package/dist/client/blocks/library/DiffBlock.js.map +1 -1
- package/dist/client/blocks/library/HighlightedCode.d.ts +2 -1
- package/dist/client/blocks/library/HighlightedCode.d.ts.map +1 -1
- package/dist/client/blocks/library/HighlightedCode.js +2 -2
- package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
- package/dist/client/blocks/library/JsonExplorerBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/JsonExplorerBlock.js +57 -13
- package/dist/client/blocks/library/JsonExplorerBlock.js.map +1 -1
- package/dist/client/blocks/library/code.d.ts.map +1 -1
- package/dist/client/blocks/library/code.js +27 -6
- package/dist/client/blocks/library/code.js.map +1 -1
- package/dist/client/blocks/library/columns.d.ts.map +1 -1
- package/dist/client/blocks/library/columns.js +11 -1
- package/dist/client/blocks/library/columns.js.map +1 -1
- package/dist/client/blocks/library/narrow-container.d.ts +13 -0
- package/dist/client/blocks/library/narrow-container.d.ts.map +1 -0
- package/dist/client/blocks/library/narrow-container.js +32 -0
- package/dist/client/blocks/library/narrow-container.js.map +1 -0
- package/dist/client/blocks/library/question-form.d.ts.map +1 -1
- package/dist/client/blocks/library/question-form.js +8 -9
- package/dist/client/blocks/library/question-form.js.map +1 -1
- package/dist/client/blocks/library/tabs.d.ts.map +1 -1
- package/dist/client/blocks/library/tabs.js +6 -5
- package/dist/client/blocks/library/tabs.js.map +1 -1
- package/dist/client/blocks/types.d.ts +2 -0
- package/dist/client/blocks/types.d.ts.map +1 -1
- package/dist/client/blocks/types.js.map +1 -1
- package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
- package/dist/client/context-xray/ContextMeter.js +5 -3
- package/dist/client/context-xray/ContextMeter.js.map +1 -1
- package/dist/db/client.d.ts +11 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +20 -0
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +9 -2
- package/dist/db/migrations.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +23 -8
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/styles/blocks.css +36 -10
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +26 -3
- package/dist/vite/client.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@ import { common, createLowlight } from "lowlight";
|
|
|
5
5
|
import { cn } from "../../utils.js";
|
|
6
6
|
import { AnnotationGutterMarker, AnnotationHiddenStack, AnnotationHoverCard, anchorFromElements, buildLineMarkerMap, hasRailAnnotations, resolveAnnotations, useAnnotationHover, } from "./annotation-rail.js";
|
|
7
7
|
import { DevInput, DevLabel, DevTextarea, DevSelect } from "./dev-doc-ui.js";
|
|
8
|
+
import { useInNarrowContainer } from "./narrow-container.js";
|
|
8
9
|
/**
|
|
9
10
|
* Split text into lines, each KEEPING its trailing newline (so the change
|
|
10
11
|
* `value`s concatenate back to the original and `splitLines` below behaves the
|
|
@@ -376,6 +377,8 @@ const LINE_NO_CLASS = "select-none px-2 py-0 text-right font-mono [font-size:var
|
|
|
376
377
|
const DIFF_LINE_CLASS = "block min-w-max flex-1 whitespace-pre px-2 py-0 font-mono [font-size:var(--plan-doc-code-size)] leading-5 text-foreground";
|
|
377
378
|
const DEFAULT_VISIBLE_DIFF_LINES = 15;
|
|
378
379
|
const MAX_DIFF_LCS_CELLS = 1_000_000;
|
|
380
|
+
const DIFF_MODE_STORAGE_KEY = "agent-native:diff-view-mode";
|
|
381
|
+
const DIFF_MODE_STORAGE_EVENT = "agent-native:diff-view-mode-change";
|
|
379
382
|
/**
|
|
380
383
|
* Below this rendered container width (px) a diff drops side-by-side `split`
|
|
381
384
|
* mode and falls back to `unified`: split's two line-number gutters double the
|
|
@@ -408,6 +411,79 @@ function useContainerWidth() {
|
|
|
408
411
|
}, []);
|
|
409
412
|
return [ref, width];
|
|
410
413
|
}
|
|
414
|
+
function isDiffMode(value) {
|
|
415
|
+
return value === "unified" || value === "split";
|
|
416
|
+
}
|
|
417
|
+
function readStoredDiffMode() {
|
|
418
|
+
if (typeof window === "undefined")
|
|
419
|
+
return null;
|
|
420
|
+
try {
|
|
421
|
+
const value = window.localStorage?.getItem(DIFF_MODE_STORAGE_KEY);
|
|
422
|
+
return isDiffMode(value) ? value : null;
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
function writeStoredDiffMode(mode) {
|
|
429
|
+
if (typeof window === "undefined")
|
|
430
|
+
return;
|
|
431
|
+
try {
|
|
432
|
+
window.localStorage?.setItem(DIFF_MODE_STORAGE_KEY, mode);
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
// Storage may be unavailable in sandboxed/private contexts.
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
function dispatchDiffModeChange(mode) {
|
|
439
|
+
if (typeof window === "undefined")
|
|
440
|
+
return;
|
|
441
|
+
try {
|
|
442
|
+
window.dispatchEvent(new CustomEvent(DIFF_MODE_STORAGE_EVENT, { detail: mode }));
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
// Best-effort sync; local component state and storage already changed.
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
function usePreferredDiffMode(authoredMode) {
|
|
449
|
+
const [mode, setMode] = useState(authoredMode ?? "unified");
|
|
450
|
+
useEffect(() => {
|
|
451
|
+
if (authoredMode)
|
|
452
|
+
return;
|
|
453
|
+
const storedMode = readStoredDiffMode();
|
|
454
|
+
if (storedMode)
|
|
455
|
+
setMode(storedMode);
|
|
456
|
+
}, [authoredMode]);
|
|
457
|
+
useEffect(() => {
|
|
458
|
+
if (authoredMode)
|
|
459
|
+
return;
|
|
460
|
+
if (typeof window === "undefined")
|
|
461
|
+
return;
|
|
462
|
+
const onStorage = (event) => {
|
|
463
|
+
if (event.key !== DIFF_MODE_STORAGE_KEY)
|
|
464
|
+
return;
|
|
465
|
+
if (isDiffMode(event.newValue))
|
|
466
|
+
setMode(event.newValue);
|
|
467
|
+
};
|
|
468
|
+
const onModeChange = (event) => {
|
|
469
|
+
const mode = event.detail;
|
|
470
|
+
if (isDiffMode(mode))
|
|
471
|
+
setMode(mode);
|
|
472
|
+
};
|
|
473
|
+
window.addEventListener("storage", onStorage);
|
|
474
|
+
window.addEventListener(DIFF_MODE_STORAGE_EVENT, onModeChange);
|
|
475
|
+
return () => {
|
|
476
|
+
window.removeEventListener("storage", onStorage);
|
|
477
|
+
window.removeEventListener(DIFF_MODE_STORAGE_EVENT, onModeChange);
|
|
478
|
+
};
|
|
479
|
+
}, [authoredMode]);
|
|
480
|
+
const setPreferredMode = useCallback((nextMode) => {
|
|
481
|
+
setMode(nextMode);
|
|
482
|
+
writeStoredDiffMode(nextMode);
|
|
483
|
+
dispatchDiffModeChange(nextMode);
|
|
484
|
+
}, []);
|
|
485
|
+
return [mode, setPreferredMode];
|
|
486
|
+
}
|
|
411
487
|
function splitDiffFilename(filename) {
|
|
412
488
|
const value = filename?.trim() || "diff";
|
|
413
489
|
const segments = value.split("/").filter(Boolean);
|
|
@@ -421,7 +497,13 @@ function DiffLineText({ language, text }) {
|
|
|
421
497
|
}
|
|
422
498
|
/* ── Read ──────────────────────────────────────────────────────────────────── */
|
|
423
499
|
function DiffRead({ data, blockId, title, summary, ctx, }) {
|
|
424
|
-
|
|
500
|
+
// Default layout when none is authored is UNIFIED — a single column reads
|
|
501
|
+
// cleanly at any width, while split's doubled line-number gutters cut code off
|
|
502
|
+
// in a constrained box (a recap's vertical-tabs panel or a comparison column).
|
|
503
|
+
// An explicitly authored `mode` still wins, and the Unified/Split toggle below
|
|
504
|
+
// stays fully functional — only the starting default changes.
|
|
505
|
+
const inNarrowContainer = useInNarrowContainer();
|
|
506
|
+
const [mode, setMode] = usePreferredDiffMode(data.mode);
|
|
425
507
|
const [expanded, setExpanded] = useState(() => new Set());
|
|
426
508
|
const [showAllRows, setShowAllRows] = useState(false);
|
|
427
509
|
const [containerRef, containerWidth] = useContainerWidth();
|
|
@@ -446,10 +528,12 @@ function DiffRead({ data, blockId, title, summary, ctx, }) {
|
|
|
446
528
|
: afterLineCount), [data.annotations, beforeLineCount, afterLineCount]);
|
|
447
529
|
const hasAnnotations = hasRailAnnotations(resolved);
|
|
448
530
|
// Effective render mode. Annotations live in a SEPARATE right-hand rail (not
|
|
449
|
-
// over the code), so they no longer force a mode
|
|
450
|
-
//
|
|
451
|
-
// crush the code
|
|
452
|
-
|
|
531
|
+
// over the code), so they no longer force a mode. When no mode was authored, a
|
|
532
|
+
// narrow container falls back to unified so split's doubled gutters never
|
|
533
|
+
// crush the code; an explicitly authored `mode` wins even in a narrow host.
|
|
534
|
+
// `canSplit` only hides the toggle for auto-mode narrow fallbacks.
|
|
535
|
+
const measuredNarrow = containerWidth != null && containerWidth < SPLIT_MIN_WIDTH;
|
|
536
|
+
const narrow = data.mode == null && (measuredNarrow || inNarrowContainer);
|
|
453
537
|
const canSplit = !narrow;
|
|
454
538
|
const effectiveMode = canSplit ? mode : "unified";
|
|
455
539
|
// Annotations (diff): NO persistent column. Hovering a marked code line (or
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiffBlock.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/DiffBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n IconChevronRight,\n IconColumns,\n IconDotsVertical,\n IconFileDiff,\n IconList,\n IconPlus,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { common, createLowlight } from \"lowlight\";\nimport { cn } from \"../../utils.js\";\nimport type { BlockEditProps, BlockReadProps } from \"../types.js\";\nimport type { DiffAnnotation, DiffData, DiffMode } from \"./diff.config.js\";\nimport {\n AnnotationGutterMarker,\n AnnotationHiddenStack,\n AnnotationHoverCard,\n anchorFromElements,\n buildLineMarkerMap,\n hasRailAnnotations,\n resolveAnnotations,\n useAnnotationHover,\n type ResolvedAnnotation,\n} from \"./annotation-rail.js\";\nimport { DevInput, DevLabel, DevTextarea, DevSelect } from \"./dev-doc-ui.js\";\n\n/**\n * GitHub-style before/after diff block. The read renderer computes a line-level\n * diff, then renders it either unified (one column, `+`/`−` gutters) or split\n * (side-by-side). Long unchanged runs collapse into an expandable \"N unchanged\n * lines\" row (progressive disclosure). The read surface keeps the GitHub diff\n * shape while using the framework Tailwind theme tokens, so it follows each\n * host app's light/dark appearance instead of bringing its own palette.\n *\n * Lives in core so any app can register the dev-doc block. The line differ is\n * inlined (a small LCS-based `diffLines`) rather than pulling the `diff` package\n * into core; the output shape (`{ value, added, removed }` change records) is\n * identical to what the read renderer consumed before.\n *\n * Editing is panel-driven (config-style, like the HTML block): two monospace\n * textareas (Before / After) plus filename, language, and mode controls.\n */\n\n/* ── Inline line differ (LCS) — replaces jsdiff `diffLines` ─────────────────── */\n\ninterface Change {\n value: string;\n added?: boolean;\n removed?: boolean;\n}\n\n/**\n * Split text into lines, each KEEPING its trailing newline (so the change\n * `value`s concatenate back to the original and `splitLines` below behaves the\n * same as it did against jsdiff output).\n */\nfunction toLineTokens(text: string): string[] {\n if (text === \"\") return [];\n const out: string[] = [];\n let start = 0;\n for (let i = 0; i < text.length; i += 1) {\n if (text[i] === \"\\n\") {\n out.push(text.slice(start, i + 1));\n start = i + 1;\n }\n }\n if (start < text.length) out.push(text.slice(start));\n return out;\n}\n\n/**\n * A minimal line-level diff producing jsdiff-compatible `Change[]` records\n * (`{ value }` for context, `{ value, added: true }`, `{ value, removed: true }`).\n * Uses a classic LCS table over line tokens; the inputs here are short code\n * snippets so the O(n·m) table is fine. Removed lines are emitted before added\n * lines within a change region, matching jsdiff's ordering.\n */\nexport function diffLines(before: string, after: string): Change[] {\n const a = toLineTokens(before);\n const b = toLineTokens(after);\n const n = a.length;\n const m = b.length;\n const cells = (n + 1) * (m + 1);\n\n if (cells > MAX_DIFF_LCS_CELLS) {\n return [\n ...(before ? [{ value: before, removed: true }] : []),\n ...(after ? [{ value: after, added: true }] : []),\n ];\n }\n\n // LCS length table.\n const lcs: number[][] = Array.from({ length: n + 1 }, () =>\n new Array<number>(m + 1).fill(0),\n );\n for (let i = n - 1; i >= 0; i -= 1) {\n for (let j = m - 1; j >= 0; j -= 1) {\n lcs[i][j] =\n a[i] === b[j]\n ? lcs[i + 1][j + 1] + 1\n : Math.max(lcs[i + 1][j], lcs[i][j + 1]);\n }\n }\n\n const changes: Change[] = [];\n // Push a token onto the last change if same kind, else open a new change.\n const push = (value: string, kind: \"context\" | \"added\" | \"removed\") => {\n const last = changes[changes.length - 1];\n const sameKind =\n last &&\n Boolean(last.added) === (kind === \"added\") &&\n Boolean(last.removed) === (kind === \"removed\");\n if (sameKind) {\n last.value += value;\n } else {\n changes.push({\n value,\n added: kind === \"added\" ? true : undefined,\n removed: kind === \"removed\" ? true : undefined,\n });\n }\n };\n\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n push(a[i], \"context\");\n i += 1;\n j += 1;\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) {\n push(a[i], \"removed\");\n i += 1;\n } else {\n push(b[j], \"added\");\n j += 1;\n }\n }\n while (i < n) {\n push(a[i], \"removed\");\n i += 1;\n }\n while (j < m) {\n push(b[j], \"added\");\n j += 1;\n }\n return changes;\n}\n\n/* ── Syntax highlighting ───────────────────────────────────────────────────── */\n\nconst lowlight = createLowlight(common);\n\ntype LowlightNode = {\n type: string;\n value?: string;\n properties?: {\n className?: string[] | string;\n };\n children?: LowlightNode[];\n};\n\nconst LANGUAGE_ALIASES: Record<string, string> = {\n cjs: \"javascript\",\n cts: \"typescript\",\n htm: \"html\",\n js: \"javascript\",\n jsonc: \"json\",\n jsx: \"jsx\",\n md: \"markdown\",\n mdx: \"markdown\",\n mjs: \"javascript\",\n mts: \"typescript\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n sh: \"bash\",\n shell: \"bash\",\n ts: \"typescript\",\n tsx: \"tsx\",\n yml: \"yaml\",\n zsh: \"bash\",\n};\n\nconst TOKEN_CLASS_NAMES: Record<string, string> = {\n \"hljs-addition\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-attr\": \"text-primary\",\n \"hljs-attribute\": \"text-primary\",\n \"hljs-built_in\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-bullet\": \"text-primary\",\n \"hljs-comment\": \"text-muted-foreground italic\",\n \"hljs-deletion\": \"text-destructive\",\n \"hljs-doctag\": \"text-destructive\",\n \"hljs-emphasis\": \"italic\",\n \"hljs-formula\": \"text-destructive\",\n \"hljs-keyword\": \"text-destructive\",\n \"hljs-link\": \"text-primary underline-offset-2\",\n \"hljs-literal\": \"text-primary\",\n \"hljs-meta\": \"text-primary\",\n \"hljs-meta-string\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-name\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-number\": \"text-primary\",\n \"hljs-params\": \"text-primary\",\n \"hljs-property\": \"text-primary\",\n \"hljs-quote\": \"text-muted-foreground italic\",\n \"hljs-regexp\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-section\": \"text-violet-700 dark:text-violet-300\",\n \"hljs-selector-attr\": \"text-primary\",\n \"hljs-selector-class\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-selector-id\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-selector-pseudo\": \"text-primary\",\n \"hljs-selector-tag\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-string\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-strong\": \"font-semibold\",\n \"hljs-subst\": \"text-destructive\",\n \"hljs-symbol\": \"text-primary\",\n \"hljs-tag\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-template-variable\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-title\": \"text-violet-700 dark:text-violet-300\",\n \"hljs-type\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-variable\": \"text-amber-700 dark:text-amber-300\",\n language_: \"text-amber-700 dark:text-amber-300\",\n};\n\nfunction normalizeLanguage(value?: string | null): string | null {\n const raw = value?.trim().toLowerCase();\n if (!raw) return null;\n const normalized = LANGUAGE_ALIASES[raw] ?? raw;\n return lowlight.registered(normalized) ? normalized : null;\n}\n\nfunction getLanguageFromFilename(filename?: string): string | null {\n const basename = filename?.split(\"/\").pop()?.toLowerCase();\n if (!basename) return null;\n if (basename === \"dockerfile\") return normalizeLanguage(\"bash\");\n if (basename === \"makefile\") return normalizeLanguage(\"makefile\");\n const ext = basename.includes(\".\") ? basename.split(\".\").pop() : basename;\n return normalizeLanguage(ext);\n}\n\nfunction resolveDiffLanguage(data: DiffData): string {\n return (\n normalizeLanguage(data.language) ??\n getLanguageFromFilename(data.filename) ??\n \"plaintext\"\n );\n}\n\nfunction tokenClassName(className?: string[] | string): string | undefined {\n const classes = Array.isArray(className)\n ? className\n : className\n ? className.split(/\\s+/)\n : [];\n const mapped = classes\n .map((name) => TOKEN_CLASS_NAMES[name])\n .filter(Boolean)\n .join(\" \");\n return mapped || undefined;\n}\n\nfunction hastToReact(children: LowlightNode[], keyPrefix: string): ReactNode[] {\n return children.map((node, index) => {\n if (node.type === \"text\") return node.value ?? \"\";\n if (node.type === \"element\") {\n const key = `${keyPrefix}${index}`;\n const renderedChildren = node.children?.length\n ? hastToReact(node.children, `${key}-`)\n : null;\n const className = tokenClassName(node.properties?.className);\n if (className) {\n return (\n <span key={key} className={className}>\n {renderedChildren}\n </span>\n );\n }\n return <span key={key}>{renderedChildren}</span>;\n }\n return null;\n });\n}\n\nfunction SyntaxHighlightedLine({\n code,\n language,\n}: {\n code: string;\n language: string;\n}) {\n const highlighted = useMemo(() => {\n if (!code.trim() || language === \"plaintext\" || language === \"text\") {\n return null;\n }\n try {\n const tree = lowlight.highlight(language, code) as LowlightNode;\n return hastToReact(tree.children ?? [], `${language}-`);\n } catch {\n return null;\n }\n }, [code, language]);\n\n return <>{highlighted ?? code}</>;\n}\n\n/* ── Diff model ────────────────────────────────────────────────────────────── */\n\ntype DiffRowKind = \"context\" | \"added\" | \"removed\";\n\ninterface DiffRow {\n kind: DiffRowKind;\n /** Line number in the OLD file (omitted for added rows). */\n oldNo?: number;\n /** Line number in the NEW file (omitted for removed rows). */\n newNo?: number;\n text: string;\n}\n\n/** A contiguous run of context lines collapsed when longer than the threshold. */\ninterface CollapsedRun {\n collapsed: true;\n rows: DiffRow[];\n}\n\ntype DiffSegment = DiffRow | CollapsedRun;\n\n/** Which column a split-view row belongs to (the unified view passes nothing). */\ntype RowSide = \"old\" | \"new\";\n\n/**\n * Resolve the markers landing on a row. `side` scopes the lookup to one column\n * in the split view (so a left cell only lights from `before` annotations and a\n * right cell from `after`); the unified view omits it to merge both sides.\n */\ntype MarkersForRow = (\n row: DiffRow,\n side?: RowSide,\n) => ResolvedAnnotation<DiffAnnotation>[];\n\n/** The default side an annotation targets when `side` is omitted. */\nfunction annotationSide(annotation: DiffAnnotation): \"before\" | \"after\" {\n return annotation.side === \"before\" ? \"before\" : \"after\";\n}\n\n/**\n * Count 1-based source lines in a side's text, matching how `buildRows` numbers\n * `oldNo`/`newNo`: a trailing newline does not add a phantom final line.\n */\nfunction countLines(text: string): number {\n if (text === \"\") return 0;\n return splitLines(text).length;\n}\n\n/** Number of context lines above which an unchanged run is collapsed. */\nconst COLLAPSE_THRESHOLD = 6;\n/** Context lines kept visible at each edge of a collapsed run. */\nconst CONTEXT_EDGE = 3;\n\n/**\n * Split a change `value` into individual lines. Most hunks carry a trailing\n * newline; drop the empty final element it produces so a 2-line change does not\n * render a phantom 3rd blank line.\n */\nfunction splitLines(value: string): string[] {\n const lines = value.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\n\n/** Flatten change objects into numbered diff rows. */\nfunction buildRows(changes: Change[]): DiffRow[] {\n const rows: DiffRow[] = [];\n let oldNo = 0;\n let newNo = 0;\n for (const change of changes) {\n const lines = splitLines(change.value);\n for (const text of lines) {\n if (change.added) {\n newNo += 1;\n rows.push({ kind: \"added\", newNo, text });\n } else if (change.removed) {\n oldNo += 1;\n rows.push({ kind: \"removed\", oldNo, text });\n } else {\n oldNo += 1;\n newNo += 1;\n rows.push({ kind: \"context\", oldNo, newNo, text });\n }\n }\n }\n return rows;\n}\n\n/**\n * Group rows into segments, collapsing interior runs of >COLLAPSE_THRESHOLD\n * context rows (keeping CONTEXT_EDGE visible at each side). Leading/trailing runs\n * collapse too, but keep only the inner edge visible.\n *\n * `isAnchored` marks context rows that carry an annotation (or sit adjacent to\n * one): an anchored row is NEVER hidden inside a collapsed run, so a note that\n * targets an unchanged line stays reachable. An anchor splits its run into the\n * separately-collapsible spans on either side of it, with CONTEXT_EDGE rows kept\n * visible around the anchor.\n */\nfunction segmentRows(\n rows: DiffRow[],\n isAnchored?: (row: DiffRow) => boolean,\n): DiffSegment[] {\n const segments: DiffSegment[] = [];\n\n // Collapse one contiguous context run [from, to) that contains NO anchors.\n const collapseRun = (run: DiffRow[], atStart: boolean, atEnd: boolean) => {\n if (run.length <= COLLAPSE_THRESHOLD) {\n for (const row of run) segments.push(row);\n return;\n }\n const head = atStart ? [] : run.slice(0, CONTEXT_EDGE);\n const tail = atEnd ? [] : run.slice(run.length - CONTEXT_EDGE);\n const hidden = run.slice(head.length, run.length - tail.length);\n for (const row of head) segments.push(row);\n if (hidden.length > 0) segments.push({ collapsed: true, rows: hidden });\n for (const row of tail) segments.push(row);\n };\n\n let i = 0;\n while (i < rows.length) {\n if (rows[i].kind !== \"context\") {\n segments.push(rows[i]);\n i += 1;\n continue;\n }\n // Gather the full contiguous context run.\n let j = i;\n while (j < rows.length && rows[j].kind === \"context\") j += 1;\n const fullRun = rows.slice(i, j);\n const runAtStart = i === 0;\n const runAtEnd = j === rows.length;\n\n if (!isAnchored || !fullRun.some(isAnchored)) {\n collapseRun(fullRun, runAtStart, runAtEnd);\n } else {\n // Walk the run, emitting anchored rows verbatim and collapsing the\n // unanchored spans between them. An anchored row is always visible; the\n // spans on each side of it collapse independently.\n let spanStart = 0;\n for (let k = 0; k <= fullRun.length; k += 1) {\n const atAnchor = k < fullRun.length && isAnchored(fullRun[k]);\n if (atAnchor || k === fullRun.length) {\n const span = fullRun.slice(spanStart, k);\n if (span.length > 0) {\n collapseRun(\n span,\n runAtStart && spanStart === 0,\n runAtEnd && k === fullRun.length,\n );\n }\n if (k < fullRun.length) segments.push(fullRun[k]);\n spanStart = k + 1;\n }\n }\n }\n i = j;\n }\n return segments;\n}\n\n/* ── Theme-aware row styling (light + dark) ────────────────────────────────── */\n\nconst ROW_BG: Record<DiffRowKind, string> = {\n added: \"bg-emerald-500/10 dark:bg-emerald-500/15\",\n removed: \"bg-destructive/10\",\n context: \"bg-background\",\n};\n\nconst GUTTER_BG: Record<DiffRowKind, string> = {\n added: \"bg-emerald-500/15 dark:bg-emerald-500/20\",\n removed: \"bg-destructive/15\",\n context: \"bg-muted/60\",\n};\n\nconst SIGN_COLOR: Record<DiffRowKind, string> = {\n added: \"text-emerald-700 dark:text-emerald-300\",\n removed: \"text-destructive\",\n context: \"text-muted-foreground\",\n};\n\nconst SIGN: Record<DiffRowKind, string> = {\n added: \"+\",\n removed: \"−\",\n context: \" \",\n};\n\nconst LINE_NO_CLASS =\n \"select-none px-2 py-0 text-right font-mono [font-size:var(--plan-doc-code-size)] leading-5 text-muted-foreground tabular-nums\";\n\nconst DIFF_LINE_CLASS =\n \"block min-w-max flex-1 whitespace-pre px-2 py-0 font-mono [font-size:var(--plan-doc-code-size)] leading-5 text-foreground\";\n\nconst DEFAULT_VISIBLE_DIFF_LINES = 15;\nconst MAX_DIFF_LCS_CELLS = 1_000_000;\n\n/**\n * Below this rendered container width (px) a diff drops side-by-side `split`\n * mode and falls back to `unified`: split's two line-number gutters double the\n * width the code needs, exactly where space is tightest (e.g. a diff nested in a\n * vertical-tabs content column). Measured from the block's own box, not the\n * viewport, so the fallback fires by available width at any nesting depth.\n */\nconst SPLIT_MIN_WIDTH = 560;\n\n/**\n * Observe the rendered inline width of an element. Returns a ref to attach plus\n * the measured content-box width (null until the first ResizeObserver tick).\n * Lets the diff pick an effective mode from the width it was actually handed — a\n * measurement CSS container queries can't drive, since switching split↔unified\n * is a structural (DOM) change, not a style toggle.\n */\nfunction useContainerWidth<T extends HTMLElement>() {\n const ref = useRef<T | null>(null);\n const [width, setWidth] = useState<number | null>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setWidth(entry.contentRect.width);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n return [ref, width] as const;\n}\n\nfunction splitDiffFilename(filename?: string): {\n basename: string;\n directory: string | null;\n} {\n const value = filename?.trim() || \"diff\";\n const segments = value.split(\"/\").filter(Boolean);\n const basename = segments[segments.length - 1] ?? value;\n const directory =\n segments.length > 1 ? segments.slice(0, -1).join(\"/\") : null;\n return { basename, directory };\n}\n\nfunction DiffLineText({ language, text }: { language: string; text: string }) {\n const code = text || \" \";\n return (\n <span className={DIFF_LINE_CLASS}>\n <SyntaxHighlightedLine code={code} language={language} />\n </span>\n );\n}\n\n/* ── Read ──────────────────────────────────────────────────────────────────── */\n\nfunction DiffRead({\n data,\n blockId,\n title,\n summary,\n ctx,\n}: BlockReadProps<DiffData>) {\n const [mode, setMode] = useState<DiffMode>(data.mode ?? \"unified\");\n const [expanded, setExpanded] = useState<Set<number>>(() => new Set());\n const [showAllRows, setShowAllRows] = useState(false);\n const [containerRef, containerWidth] = useContainerWidth<HTMLElement>();\n // On-hover popover (anchored to the right of the code) replaces the old\n // persistent rail: nothing is shown when idle. `codeRef` measures the code\n // box's right edge; `hover` carries the active index + captured geometry.\n const hover = useAnnotationHover();\n const { activeIndex } = hover;\n const codeRef = useRef<HTMLDivElement | null>(null);\n\n const rows = useMemo(\n () => buildRows(diffLines(data.before, data.after)),\n [data.before, data.after],\n );\n const language = useMemo(\n () => resolveDiffLanguage(data),\n [data.filename, data.language],\n );\n const fileParts = useMemo(\n () => splitDiffFilename(data.filename),\n [data.filename],\n );\n const splitLineCount = useMemo(() => pairSplitRows(rows).length, [rows]);\n\n // Resolve annotations against the side they target. A `before` annotation's\n // `lines` ref is clamped to the OLD file's line count and matched on `oldNo`;\n // an `after` (default) ref to the NEW file and matched on `newNo`. Markers are\n // authoring-order across BOTH sides so a note ↔ row ↔ rail card share one id.\n const beforeLineCount = useMemo(() => countLines(data.before), [data.before]);\n const afterLineCount = useMemo(() => countLines(data.after), [data.after]);\n const resolved = useMemo(\n () =>\n resolveAnnotations(data.annotations, (annotation) =>\n annotationSide(annotation) === \"before\"\n ? beforeLineCount\n : afterLineCount,\n ),\n [data.annotations, beforeLineCount, afterLineCount],\n );\n const hasAnnotations = hasRailAnnotations(resolved);\n // Effective render mode. Annotations live in a SEPARATE right-hand rail (not\n // over the code), so they no longer force a mode; only a container narrower\n // than SPLIT_MIN_WIDTH falls back to unified so split's doubled gutters never\n // crush the code. `canSplit` also gates the mode toggle (hidden when narrow).\n const narrow = containerWidth != null && containerWidth < SPLIT_MIN_WIDTH;\n const canSplit = !narrow;\n const effectiveMode: DiffMode = canSplit ? mode : \"unified\";\n\n // Annotations (diff): NO persistent column. Hovering a marked code line (or\n // its numbered pip) opens THAT note's card as an on-hover popover anchored to\n // the RIGHT of the code box, never over the code. The in-code pip stays as the\n // anchor indicator + active-line highlight. `onRowEnter` captures the code\n // box's right edge + the hovered row's vertical position to place the card;\n // `onRowLeave` schedules a short-delay close so the pointer can cross the gap\n // into the card (which cancels the close while hovered).\n const onRowEnter = useCallback(\n (index: number, rowEl: HTMLElement) => {\n const anchor = anchorFromElements(codeRef.current, rowEl);\n if (anchor) hover.open(index, anchor);\n },\n [hover],\n );\n const onRowLeave = useCallback(() => hover.scheduleClose(), [hover]);\n // Side-scoped line → markers maps so a row only lights from its own side.\n const beforeMarkers = useMemo(\n () =>\n buildLineMarkerMap(\n resolved.filter((r) => annotationSide(r.annotation) === \"before\"),\n ),\n [resolved],\n );\n const afterMarkers = useMemo(\n () =>\n buildLineMarkerMap(\n resolved.filter((r) => annotationSide(r.annotation) !== \"before\"),\n ),\n [resolved],\n );\n const markersForRow = useMemo<MarkersForRow>(() => {\n return (row, side) => {\n const out: ResolvedAnnotation<DiffAnnotation>[] = [];\n if (\n (side === undefined || side === \"old\") &&\n row.oldNo != null &&\n row.kind !== \"added\"\n ) {\n out.push(...(beforeMarkers.get(row.oldNo) ?? []));\n }\n if (\n (side === undefined || side === \"new\") &&\n row.newNo != null &&\n row.kind !== \"removed\"\n ) {\n out.push(...(afterMarkers.get(row.newNo) ?? []));\n }\n return out;\n };\n }, [beforeMarkers, afterMarkers]);\n // A context row that carries a marker is an anchor: never collapse it away.\n const anchoredRow = useMemo(() => {\n if (!hasAnnotations) return undefined;\n return (row: DiffRow) => markersForRow(row).length > 0;\n }, [hasAnnotations, markersForRow]);\n\n // The resolved annotation whose card is currently shown on hover.\n const activeItem = useMemo<ResolvedAnnotation<DiffAnnotation> | null>(\n () =>\n activeIndex == null\n ? null\n : (resolved.find((item) => item.index === activeIndex) ?? null),\n [activeIndex, resolved],\n );\n\n const added = rows.filter((r) => r.kind === \"added\").length;\n const removed = rows.filter((r) => r.kind === \"removed\").length;\n const unchanged = data.before === data.after;\n const totalVisibleLineCount =\n effectiveMode === \"split\" ? splitLineCount : rows.length;\n const shouldLimitRows = totalVisibleLineCount > DEFAULT_VISIBLE_DIFF_LINES;\n // Never truncate away an annotated row: extend the window past the last one.\n const effectiveRowLimit = useMemo(() => {\n if (showAllRows || !shouldLimitRows) return undefined;\n let limit = DEFAULT_VISIBLE_DIFF_LINES;\n if (hasAnnotations) {\n for (let idx = rows.length - 1; idx >= limit; idx -= 1) {\n if (markersForRow(rows[idx]).length > 0) {\n limit = idx + 1;\n break;\n }\n }\n }\n return limit;\n }, [showAllRows, shouldLimitRows, hasAnnotations, rows, markersForRow]);\n const rowLimit = effectiveRowLimit;\n const displayedRows =\n effectiveMode === \"unified\" && rowLimit ? rows.slice(0, rowLimit) : rows;\n\n const toggleRun = (index: number) =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n\n // The bordered code box. It always spans its full width — annotations surface\n // as an on-hover popover anchored to this box's right edge, never as a column.\n // `codeRef` measures that right edge for the popover's placement.\n const diffBox = (\n <div\n ref={codeRef}\n className=\"overflow-hidden rounded-md border border-border bg-background\"\n >\n {/* Header: filename, path, +/− counts, mode toggle. */}\n <div className=\"flex min-h-10 flex-wrap items-center gap-2 border-b border-border bg-muted/60 px-3 py-1.5\">\n <IconFileDiff className=\"size-4 shrink-0 text-muted-foreground\" />\n <span\n className=\"flex min-w-0 flex-1 items-baseline gap-1.5 font-mono\"\n title={data.filename || undefined}\n >\n <span className=\"min-w-0 max-w-[16rem] truncate text-[13px] font-semibold leading-5 text-foreground\">\n {fileParts.basename}\n </span>\n {fileParts.directory && (\n <span className=\"min-w-0 flex-1 truncate text-[11px] leading-5 text-muted-foreground/70\">\n {fileParts.directory}\n </span>\n )}\n </span>\n <span className=\"ml-1 flex shrink-0 items-center gap-2 font-mono text-xs\">\n <span className=\"text-emerald-700 dark:text-emerald-300\">\n +{added}\n </span>\n <span className=\"text-destructive\">−{removed}</span>\n </span>\n {/* Mode toggle only when split is actually available: a narrow\n container forces unified (split's doubled gutters would crush the\n code), so the toggle would otherwise be a no-op. Annotations are an\n on-hover popover now, so they work in both unified and split. */}\n {canSplit && (\n <div className=\"pointer-events-none ml-auto flex shrink-0 items-center overflow-hidden rounded-md border border-border bg-background opacity-0 transition-opacity group-hover/diff-block:pointer-events-auto group-hover/diff-block:opacity-100 group-focus-within/diff-block:pointer-events-auto group-focus-within/diff-block:opacity-100\">\n <ModeButton\n active={mode === \"unified\"}\n onClick={() => setMode(\"unified\")}\n icon={<IconList className=\"size-3.5\" />}\n label=\"Unified\"\n />\n <ModeButton\n active={mode === \"split\"}\n onClick={() => setMode(\"split\")}\n icon={<IconColumns className=\"size-3.5\" />}\n label=\"Split\"\n />\n </div>\n )}\n </div>\n\n {/* Body. */}\n {unchanged ? (\n <div className=\"px-4 py-6 text-center font-mono text-sm text-muted-foreground\">\n No changes\n </div>\n ) : effectiveMode === \"split\" ? (\n <SplitView\n rows={rows}\n language={language}\n rowLimit={rowLimit}\n markersForRow={markersForRow}\n activeIndex={activeIndex}\n onRowEnter={onRowEnter}\n onRowLeave={onRowLeave}\n />\n ) : (\n <UnifiedView\n rows={displayedRows}\n language={language}\n expanded={expanded}\n onToggleRun={toggleRun}\n markersForRow={markersForRow}\n anchoredRow={anchoredRow}\n activeIndex={activeIndex}\n onRowEnter={onRowEnter}\n onRowLeave={onRowLeave}\n />\n )}\n {!unchanged && shouldLimitRows && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-expanded={showAllRows}\n onClick={() => setShowAllRows((current) => !current)}\n className=\"flex h-7 w-full items-center justify-center gap-1.5 border-t border-border bg-background px-2 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/70 hover:text-foreground\"\n >\n <IconChevronRight\n className={cn(\n \"size-3 shrink-0 transition-transform\",\n showAllRows ? \"-rotate-90\" : \"rotate-90\",\n )}\n />\n {showAllRows\n ? \"Show fewer\"\n : `Show all ${totalVisibleLineCount} lines`}\n </button>\n )}\n </div>\n );\n\n return (\n <section\n ref={containerRef}\n className=\"relative plan-block group/diff-block\"\n data-block-id={blockId}\n >\n {title && <div className=\"plan-block-label\">{title}</div>}\n {summary && (\n <p className=\"mb-3 text-sm leading-relaxed text-plan-muted\">\n {summary}\n </p>\n )}\n {/* The diff keeps its full width — no persistent annotation column. The\n in-code numbered pips remain the hover anchors; notes live in a\n visually-hidden stack (a11y + tests) and surface ONE at a time as an\n on-hover popover anchored to the right of the code box. */}\n {diffBox}\n {hasAnnotations && (\n <AnnotationHiddenStack items={resolved} ctx={ctx} showMarker />\n )}\n {hasAnnotations && activeItem && hover.anchor && (\n <AnnotationHoverCard\n item={activeItem}\n anchor={hover.anchor}\n ctx={ctx}\n showMarker\n onMouseEnter={hover.cancelClose}\n onMouseLeave={hover.scheduleClose}\n />\n )}\n </section>\n );\n}\n\nfunction ModeButton({\n active,\n onClick,\n icon,\n label,\n}: {\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n label: string;\n}) {\n return (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={onClick}\n aria-pressed={active}\n className={cn(\n \"flex cursor-pointer items-center gap-1 px-2 py-1 text-xs font-medium transition-colors\",\n active\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted/80 hover:text-foreground\",\n )}\n >\n {icon}\n {label}\n </button>\n );\n}\n\n/* ── Annotation wiring shared by both views ────────────────────────────────── */\n\n/** Marker + hover props threaded into the unified/split rows. */\ninterface RowAnnotationProps {\n markersForRow: MarkersForRow;\n anchoredRow?: (row: DiffRow) => boolean;\n activeIndex: number | null;\n /** Hovering an annotated row opens its popover, anchored to this row's box. */\n onRowEnter: (index: number, rowEl: HTMLElement) => void;\n /** Leaving an annotated row schedules the popover's close. */\n onRowLeave: () => void;\n}\n\n/**\n * The numbered marker pip(s) for a row plus the active-state it derives. Returns\n * `null` when the row carries no annotation so unannotated diffs render an empty\n * marker column (or no column at all when the whole diff is unannotated).\n */\nfunction rowMarkerInfo(\n markers: ResolvedAnnotation<DiffAnnotation>[],\n activeIndex: number | null,\n): { isActive: boolean; primaryIndex: number } | null {\n if (markers.length === 0) return null;\n const isActive = markers.some((m) => m.index === activeIndex);\n return { isActive, primaryIndex: markers[0].index };\n}\n\n/** Shared amber wash for an annotated row, brighter when active. */\nfunction annotatedRowBg(info: { isActive: boolean } | null): string | null {\n if (!info) return null;\n return info.isActive\n ? \"bg-amber-400/20 dark:bg-amber-300/15\"\n : \"bg-amber-400/[0.07] dark:bg-amber-300/[0.07]\";\n}\n\n/**\n * Whether `row` is the FIRST line of `marker`'s resolved range. The numbered pip\n * renders only on this line, so a multi-line annotation shows a single marker at\n * the top of its span instead of repeating the same number down every line it\n * covers. The amber band still washes the whole range (via `annotatedRowBg`), so\n * the span stays visually grouped without the column of duplicate numbers.\n */\nfunction isMarkerRangeStart(\n row: DiffRow,\n marker: ResolvedAnnotation<DiffAnnotation>,\n): boolean {\n if (!marker.range) return false;\n const lineNo =\n annotationSide(marker.annotation) === \"before\" ? row.oldNo : row.newNo;\n return lineNo === marker.range.start;\n}\n\n/* ── Unified view ──────────────────────────────────────────────────────────── */\n\nfunction UnifiedView({\n rows,\n language,\n expanded,\n onToggleRun,\n markersForRow,\n anchoredRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n}: {\n rows: DiffRow[];\n language: string;\n expanded: Set<number>;\n onToggleRun: (index: number) => void;\n} & RowAnnotationProps) {\n const segments = useMemo(\n () => segmentRows(rows, anchoredRow),\n [rows, anchoredRow],\n );\n // Any annotation present ⇒ reserve the marker column so rows stay aligned.\n const showMarkerColumn = useMemo(\n () => rows.some((row) => markersForRow(row).length > 0),\n [rows, markersForRow],\n );\n const rowProps = {\n language,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n showMarkerColumn,\n };\n let runIndex = 0;\n return (\n <div className=\"overflow-x-auto\" data-code-surface>\n <div className=\"w-max min-w-full font-mono [font-size:var(--plan-doc-code-size)] leading-5\">\n {segments.map((segment, idx) => {\n if (\"collapsed\" in segment) {\n const key = runIndex++;\n const open = expanded.has(key);\n return (\n <div key={`run-${key}`}>\n <CollapsedRow\n count={segment.rows.length}\n open={open}\n onClick={() => onToggleRun(key)}\n />\n {open &&\n segment.rows.map((row, ri) => (\n <UnifiedRow\n key={`run-${key}-${ri}`}\n row={row}\n {...rowProps}\n />\n ))}\n </div>\n );\n }\n return <UnifiedRow key={idx} row={segment} {...rowProps} />;\n })}\n </div>\n </div>\n );\n}\n\nfunction UnifiedRow({\n language,\n row,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n showMarkerColumn,\n}: {\n language: string;\n row: DiffRow;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onRowEnter: (index: number, rowEl: HTMLElement) => void;\n onRowLeave: () => void;\n showMarkerColumn: boolean;\n}) {\n const markers = markersForRow(row);\n const info = rowMarkerInfo(markers, activeIndex);\n const startMarker = markers.find((marker) => isMarkerRangeStart(row, marker));\n return (\n <div\n data-annot-row={startMarker ? startMarker.index : undefined}\n className={cn(\n \"flex min-h-5 min-w-full\",\n ROW_BG[row.kind],\n annotatedRowBg(info),\n )}\n onMouseEnter={\n info\n ? (event) =>\n onRowEnter(\n startMarker?.index ?? info.primaryIndex,\n event.currentTarget,\n )\n : undefined\n }\n onMouseLeave={info ? () => onRowLeave() : undefined}\n >\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>{row.oldNo ?? \"\"}</span>\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>{row.newNo ?? \"\"}</span>\n <span\n className={cn(\n \"w-6 shrink-0 select-none py-0 text-center font-semibold leading-5\",\n GUTTER_BG[row.kind],\n SIGN_COLOR[row.kind],\n )}\n >\n {SIGN[row.kind]}\n </span>\n {showMarkerColumn && (\n <MarkerCell\n startMarker={startMarker}\n active={startMarker != null && startMarker.index === activeIndex}\n />\n )}\n <DiffLineText text={row.text} language={language} />\n </div>\n );\n}\n\n/**\n * The fixed-width marker column rendered between the sign gutter and the code.\n * `startMarker` is set only on the FIRST line of an annotation's range, so the\n * numbered pip appears once at the top of a span; every other row (the rest of a\n * span, and every unannotated row in a diff that has annotations) renders an\n * empty spacer so the code text stays aligned.\n */\nfunction MarkerCell({\n startMarker,\n active,\n}: {\n startMarker?: ResolvedAnnotation<DiffAnnotation>;\n active: boolean;\n}) {\n return (\n <span className=\"flex w-6 shrink-0 select-none items-center justify-center py-0\">\n {startMarker != null && (\n <AnnotationGutterMarker marker={startMarker.marker} active={active} />\n )}\n </span>\n );\n}\n\nfunction CollapsedRow({\n count,\n open,\n onClick,\n}: {\n count: number;\n open: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={onClick}\n className=\"flex w-full cursor-pointer items-center gap-2 border-y border-border bg-muted/70 px-3 py-1 text-left text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <IconDotsVertical className=\"size-3.5 shrink-0\" />\n <span>\n {open ? \"Hide\" : \"Show\"} {count} unchanged line\n {count === 1 ? \"\" : \"s\"}\n </span>\n </button>\n );\n}\n\n/* ── Split (side-by-side) view ─────────────────────────────────────────────── */\n\ninterface SplitRow {\n left?: DiffRow;\n right?: DiffRow;\n}\n\n/**\n * Pair removed lines (left) with added lines (right) so a modification shows the\n * old and new side by side; context lines mirror on both columns. Leftover adds\n * or removes fall through as half-empty rows (GitHub split behavior).\n */\nfunction pairSplitRows(rows: DiffRow[]): SplitRow[] {\n const out: SplitRow[] = [];\n let i = 0;\n while (i < rows.length) {\n const row = rows[i];\n if (row.kind === \"context\") {\n out.push({ left: row, right: row });\n i += 1;\n continue;\n }\n // Collect a contiguous block of removed-then-added rows.\n const removed: DiffRow[] = [];\n const added: DiffRow[] = [];\n while (i < rows.length && rows[i].kind === \"removed\")\n removed.push(rows[i++]);\n while (i < rows.length && rows[i].kind === \"added\") added.push(rows[i++]);\n const max = Math.max(removed.length, added.length);\n for (let k = 0; k < max; k += 1) {\n out.push({ left: removed[k], right: added[k] });\n }\n }\n return out;\n}\n\nfunction SplitView({\n language,\n rowLimit,\n rows,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n}: {\n language: string;\n rowLimit?: number;\n rows: DiffRow[];\n} & Omit<RowAnnotationProps, \"anchoredRow\">) {\n const pairs = useMemo(() => pairSplitRows(rows), [rows]);\n const displayedPairs = rowLimit ? pairs.slice(0, rowLimit) : pairs;\n // Reserve the marker column on a side only if any visible row there has one.\n const showOldMarkers = useMemo(\n () =>\n displayedPairs.some(\n (pair) => pair.left && markersForRow(pair.left, \"old\").length > 0,\n ),\n [displayedPairs, markersForRow],\n );\n const showNewMarkers = useMemo(\n () =>\n displayedPairs.some(\n (pair) => pair.right && markersForRow(pair.right, \"new\").length > 0,\n ),\n [displayedPairs, markersForRow],\n );\n const cellProps = {\n language,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n };\n return (\n <div\n className=\"flex w-full bg-background font-mono [font-size:var(--plan-doc-code-size)] leading-5\"\n data-code-surface\n >\n <div className=\"min-w-0 flex-1 overflow-x-auto border-r border-border\">\n <div className=\"inline-block min-w-full\">\n {displayedPairs.map((pair, idx) => (\n <SplitCell\n key={`old-${idx}`}\n row={pair.left}\n side=\"old\"\n showMarkerColumn={showOldMarkers}\n {...cellProps}\n />\n ))}\n </div>\n </div>\n <div className=\"min-w-0 flex-1 overflow-x-auto\">\n <div className=\"inline-block min-w-full\">\n {displayedPairs.map((pair, idx) => (\n <SplitCell\n key={`new-${idx}`}\n row={pair.right}\n side=\"new\"\n showMarkerColumn={showNewMarkers}\n {...cellProps}\n />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SplitCell({\n language,\n row,\n side,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n showMarkerColumn,\n}: {\n language: string;\n row?: DiffRow;\n side: RowSide;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onRowEnter: (index: number, rowEl: HTMLElement) => void;\n onRowLeave: () => void;\n showMarkerColumn: boolean;\n}) {\n if (!row) {\n return (\n <div className=\"flex min-h-5 min-w-full bg-muted/40 opacity-70\">\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")} />\n <span className=\"w-6 shrink-0 bg-muted/60\" />\n {showMarkerColumn && <span className=\"w-6 shrink-0\" />}\n <span className={DIFF_LINE_CLASS}> </span>\n </div>\n );\n }\n const sign = side === \"old\" ? \"−\" : \"+\";\n const showSign = row.kind !== \"context\";\n const markers = markersForRow(row, side);\n const info = rowMarkerInfo(markers, activeIndex);\n const startMarker = markers.find((marker) => isMarkerRangeStart(row, marker));\n return (\n <div\n data-annot-row={startMarker ? startMarker.index : undefined}\n className={cn(\n \"flex min-h-5 min-w-full\",\n ROW_BG[row.kind],\n annotatedRowBg(info),\n )}\n onMouseEnter={\n info\n ? (event) =>\n onRowEnter(\n startMarker?.index ?? info.primaryIndex,\n event.currentTarget,\n )\n : undefined\n }\n onMouseLeave={info ? () => onRowLeave() : undefined}\n >\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>\n {side === \"old\" ? (row.oldNo ?? \"\") : (row.newNo ?? \"\")}\n </span>\n <span\n className={cn(\n \"w-6 shrink-0 select-none py-0 text-center font-semibold leading-5\",\n GUTTER_BG[row.kind],\n SIGN_COLOR[row.kind],\n )}\n >\n {showSign ? sign : \" \"}\n </span>\n {showMarkerColumn && (\n <MarkerCell\n startMarker={startMarker}\n active={startMarker != null && startMarker.index === activeIndex}\n />\n )}\n <DiffLineText text={row.text} language={language} />\n </div>\n );\n}\n\n/* ── Edit (panel) ──────────────────────────────────────────────────────────── */\n\nconst codeAreaClass =\n \"min-h-[140px] font-mono [font-size:var(--plan-code-size)] leading-5\";\n\nfunction DiffEdit({ data, onChange, editable }: BlockEditProps<DiffData>) {\n const patch = (next: Partial<DiffData>) => onChange({ ...data, ...next });\n const mode: DiffMode = data.mode ?? \"unified\";\n const annotations = data.annotations ?? [];\n\n const updateAnnotation = (index: number, next: Partial<DiffAnnotation>) =>\n patch({\n annotations: annotations.map((annotation, i) =>\n i === index ? { ...annotation, ...next } : annotation,\n ),\n });\n\n const removeAnnotation = (index: number) =>\n patch({ annotations: annotations.filter((_, i) => i !== index) });\n\n const addAnnotation = () => {\n if (annotations.length >= 80) return; // schema max\n patch({\n annotations: [\n ...annotations,\n { side: \"after\", lines: \"1\", label: \"\", note: \"\" },\n ],\n });\n };\n\n return (\n <div className=\"flex flex-col gap-3\" data-plan-interactive>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-filename\" className=\"text-xs\">\n Filename\n </DevLabel>\n <DevInput\n id=\"diff-filename\"\n value={data.filename ?? \"\"}\n placeholder=\"src/add.ts\"\n disabled={!editable}\n onChange={(event) =>\n patch({ filename: event.target.value || undefined })\n }\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-language\" className=\"text-xs\">\n Language\n </DevLabel>\n <DevInput\n id=\"diff-language\"\n value={data.language ?? \"\"}\n placeholder=\"ts\"\n disabled={!editable}\n onChange={(event) =>\n patch({ language: event.target.value || undefined })\n }\n />\n </div>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel className=\"text-xs\">Layout</DevLabel>\n <DevSelect\n value={mode}\n disabled={!editable}\n onValueChange={(value) => patch({ mode: value as DiffMode })}\n options={[\n { value: \"unified\", label: \"Unified\" },\n { value: \"split\", label: \"Split (side-by-side)\" },\n ]}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-before\" className=\"text-xs\">\n Before\n </DevLabel>\n <DevTextarea\n id=\"diff-before\"\n spellCheck={false}\n className={codeAreaClass}\n value={data.before}\n disabled={!editable}\n onChange={(event) => patch({ before: event.target.value })}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-after\" className=\"text-xs\">\n After\n </DevLabel>\n <DevTextarea\n id=\"diff-after\"\n spellCheck={false}\n className={codeAreaClass}\n value={data.after}\n disabled={!editable}\n onChange={(event) => patch({ after: event.target.value })}\n />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <DevLabel className=\"text-xs\">Annotations</DevLabel>\n {editable && annotations.length < 80 && (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={addAnnotation}\n className=\"flex cursor-pointer items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-plan-muted transition-colors hover:bg-plan-block/60 hover:text-plan-text\"\n >\n <IconPlus className=\"size-3.5\" />\n Add annotation\n </button>\n )}\n </div>\n {annotations.length === 0 && (\n <p className=\"text-xs text-plan-muted\">\n No annotations yet. Add one to anchor a note to a line range on the\n before or after side.\n </p>\n )}\n {annotations.map((annotation, index) => (\n <div\n key={index}\n className=\"flex flex-col gap-2 rounded-md border border-plan-line bg-plan-block/30 p-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-[110px_110px_minmax(0,1fr)_auto]\">\n <DevSelect\n aria-label={`Annotation ${index + 1} side`}\n value={annotation.side ?? \"after\"}\n disabled={!editable}\n onValueChange={(value) =>\n updateAnnotation(index, {\n side: value as DiffAnnotation[\"side\"],\n })\n }\n options={[\n { value: \"after\", label: \"After\" },\n { value: \"before\", label: \"Before\" },\n ]}\n />\n <DevInput\n aria-label={`Annotation ${index + 1} lines`}\n value={annotation.lines}\n placeholder=\"3-5\"\n disabled={!editable}\n onChange={(event) =>\n updateAnnotation(index, { lines: event.target.value })\n }\n />\n <DevInput\n aria-label={`Annotation ${index + 1} label`}\n value={annotation.label ?? \"\"}\n placeholder=\"Label (optional)\"\n disabled={!editable}\n onChange={(event) =>\n updateAnnotation(index, {\n label: event.target.value || undefined,\n })\n }\n />\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-label={`Remove annotation ${index + 1}`}\n onClick={() => removeAnnotation(index)}\n className=\"flex size-9 shrink-0 cursor-pointer items-center justify-center rounded-md text-plan-muted transition-colors hover:bg-muted hover:text-foreground\"\n >\n <IconTrash className=\"size-4\" />\n </button>\n )}\n </div>\n <DevTextarea\n aria-label={`Annotation ${index + 1} note`}\n className=\"min-h-[60px] text-sm\"\n value={annotation.note}\n placeholder=\"Explain what these lines do…\"\n disabled={!editable}\n onChange={(event) =>\n updateAnnotation(index, { note: event.target.value })\n }\n />\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport { DiffRead, DiffEdit };\n"]}
|
|
1
|
+
{"version":3,"file":"DiffBlock.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/DiffBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n IconChevronRight,\n IconColumns,\n IconDotsVertical,\n IconFileDiff,\n IconList,\n IconPlus,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { common, createLowlight } from \"lowlight\";\nimport { cn } from \"../../utils.js\";\nimport type { BlockEditProps, BlockReadProps } from \"../types.js\";\nimport type { DiffAnnotation, DiffData, DiffMode } from \"./diff.config.js\";\nimport {\n AnnotationGutterMarker,\n AnnotationHiddenStack,\n AnnotationHoverCard,\n anchorFromElements,\n buildLineMarkerMap,\n hasRailAnnotations,\n resolveAnnotations,\n useAnnotationHover,\n type ResolvedAnnotation,\n} from \"./annotation-rail.js\";\nimport { DevInput, DevLabel, DevTextarea, DevSelect } from \"./dev-doc-ui.js\";\nimport { useInNarrowContainer } from \"./narrow-container.js\";\n\n/**\n * GitHub-style before/after diff block. The read renderer computes a line-level\n * diff, then renders it either unified (one column, `+`/`−` gutters) or split\n * (side-by-side). Long unchanged runs collapse into an expandable \"N unchanged\n * lines\" row (progressive disclosure). The read surface keeps the GitHub diff\n * shape while using the framework Tailwind theme tokens, so it follows each\n * host app's light/dark appearance instead of bringing its own palette.\n *\n * Lives in core so any app can register the dev-doc block. The line differ is\n * inlined (a small LCS-based `diffLines`) rather than pulling the `diff` package\n * into core; the output shape (`{ value, added, removed }` change records) is\n * identical to what the read renderer consumed before.\n *\n * Editing is panel-driven (config-style, like the HTML block): two monospace\n * textareas (Before / After) plus filename, language, and mode controls.\n */\n\n/* ── Inline line differ (LCS) — replaces jsdiff `diffLines` ─────────────────── */\n\ninterface Change {\n value: string;\n added?: boolean;\n removed?: boolean;\n}\n\n/**\n * Split text into lines, each KEEPING its trailing newline (so the change\n * `value`s concatenate back to the original and `splitLines` below behaves the\n * same as it did against jsdiff output).\n */\nfunction toLineTokens(text: string): string[] {\n if (text === \"\") return [];\n const out: string[] = [];\n let start = 0;\n for (let i = 0; i < text.length; i += 1) {\n if (text[i] === \"\\n\") {\n out.push(text.slice(start, i + 1));\n start = i + 1;\n }\n }\n if (start < text.length) out.push(text.slice(start));\n return out;\n}\n\n/**\n * A minimal line-level diff producing jsdiff-compatible `Change[]` records\n * (`{ value }` for context, `{ value, added: true }`, `{ value, removed: true }`).\n * Uses a classic LCS table over line tokens; the inputs here are short code\n * snippets so the O(n·m) table is fine. Removed lines are emitted before added\n * lines within a change region, matching jsdiff's ordering.\n */\nexport function diffLines(before: string, after: string): Change[] {\n const a = toLineTokens(before);\n const b = toLineTokens(after);\n const n = a.length;\n const m = b.length;\n const cells = (n + 1) * (m + 1);\n\n if (cells > MAX_DIFF_LCS_CELLS) {\n return [\n ...(before ? [{ value: before, removed: true }] : []),\n ...(after ? [{ value: after, added: true }] : []),\n ];\n }\n\n // LCS length table.\n const lcs: number[][] = Array.from({ length: n + 1 }, () =>\n new Array<number>(m + 1).fill(0),\n );\n for (let i = n - 1; i >= 0; i -= 1) {\n for (let j = m - 1; j >= 0; j -= 1) {\n lcs[i][j] =\n a[i] === b[j]\n ? lcs[i + 1][j + 1] + 1\n : Math.max(lcs[i + 1][j], lcs[i][j + 1]);\n }\n }\n\n const changes: Change[] = [];\n // Push a token onto the last change if same kind, else open a new change.\n const push = (value: string, kind: \"context\" | \"added\" | \"removed\") => {\n const last = changes[changes.length - 1];\n const sameKind =\n last &&\n Boolean(last.added) === (kind === \"added\") &&\n Boolean(last.removed) === (kind === \"removed\");\n if (sameKind) {\n last.value += value;\n } else {\n changes.push({\n value,\n added: kind === \"added\" ? true : undefined,\n removed: kind === \"removed\" ? true : undefined,\n });\n }\n };\n\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n push(a[i], \"context\");\n i += 1;\n j += 1;\n } else if (lcs[i + 1][j] >= lcs[i][j + 1]) {\n push(a[i], \"removed\");\n i += 1;\n } else {\n push(b[j], \"added\");\n j += 1;\n }\n }\n while (i < n) {\n push(a[i], \"removed\");\n i += 1;\n }\n while (j < m) {\n push(b[j], \"added\");\n j += 1;\n }\n return changes;\n}\n\n/* ── Syntax highlighting ───────────────────────────────────────────────────── */\n\nconst lowlight = createLowlight(common);\n\ntype LowlightNode = {\n type: string;\n value?: string;\n properties?: {\n className?: string[] | string;\n };\n children?: LowlightNode[];\n};\n\nconst LANGUAGE_ALIASES: Record<string, string> = {\n cjs: \"javascript\",\n cts: \"typescript\",\n htm: \"html\",\n js: \"javascript\",\n jsonc: \"json\",\n jsx: \"jsx\",\n md: \"markdown\",\n mdx: \"markdown\",\n mjs: \"javascript\",\n mts: \"typescript\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n sh: \"bash\",\n shell: \"bash\",\n ts: \"typescript\",\n tsx: \"tsx\",\n yml: \"yaml\",\n zsh: \"bash\",\n};\n\nconst TOKEN_CLASS_NAMES: Record<string, string> = {\n \"hljs-addition\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-attr\": \"text-primary\",\n \"hljs-attribute\": \"text-primary\",\n \"hljs-built_in\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-bullet\": \"text-primary\",\n \"hljs-comment\": \"text-muted-foreground italic\",\n \"hljs-deletion\": \"text-destructive\",\n \"hljs-doctag\": \"text-destructive\",\n \"hljs-emphasis\": \"italic\",\n \"hljs-formula\": \"text-destructive\",\n \"hljs-keyword\": \"text-destructive\",\n \"hljs-link\": \"text-primary underline-offset-2\",\n \"hljs-literal\": \"text-primary\",\n \"hljs-meta\": \"text-primary\",\n \"hljs-meta-string\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-name\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-number\": \"text-primary\",\n \"hljs-params\": \"text-primary\",\n \"hljs-property\": \"text-primary\",\n \"hljs-quote\": \"text-muted-foreground italic\",\n \"hljs-regexp\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-section\": \"text-violet-700 dark:text-violet-300\",\n \"hljs-selector-attr\": \"text-primary\",\n \"hljs-selector-class\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-selector-id\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-selector-pseudo\": \"text-primary\",\n \"hljs-selector-tag\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-string\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-strong\": \"font-semibold\",\n \"hljs-subst\": \"text-destructive\",\n \"hljs-symbol\": \"text-primary\",\n \"hljs-tag\": \"text-emerald-700 dark:text-emerald-300\",\n \"hljs-template-variable\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-title\": \"text-violet-700 dark:text-violet-300\",\n \"hljs-type\": \"text-amber-700 dark:text-amber-300\",\n \"hljs-variable\": \"text-amber-700 dark:text-amber-300\",\n language_: \"text-amber-700 dark:text-amber-300\",\n};\n\nfunction normalizeLanguage(value?: string | null): string | null {\n const raw = value?.trim().toLowerCase();\n if (!raw) return null;\n const normalized = LANGUAGE_ALIASES[raw] ?? raw;\n return lowlight.registered(normalized) ? normalized : null;\n}\n\nfunction getLanguageFromFilename(filename?: string): string | null {\n const basename = filename?.split(\"/\").pop()?.toLowerCase();\n if (!basename) return null;\n if (basename === \"dockerfile\") return normalizeLanguage(\"bash\");\n if (basename === \"makefile\") return normalizeLanguage(\"makefile\");\n const ext = basename.includes(\".\") ? basename.split(\".\").pop() : basename;\n return normalizeLanguage(ext);\n}\n\nfunction resolveDiffLanguage(data: DiffData): string {\n return (\n normalizeLanguage(data.language) ??\n getLanguageFromFilename(data.filename) ??\n \"plaintext\"\n );\n}\n\nfunction tokenClassName(className?: string[] | string): string | undefined {\n const classes = Array.isArray(className)\n ? className\n : className\n ? className.split(/\\s+/)\n : [];\n const mapped = classes\n .map((name) => TOKEN_CLASS_NAMES[name])\n .filter(Boolean)\n .join(\" \");\n return mapped || undefined;\n}\n\nfunction hastToReact(children: LowlightNode[], keyPrefix: string): ReactNode[] {\n return children.map((node, index) => {\n if (node.type === \"text\") return node.value ?? \"\";\n if (node.type === \"element\") {\n const key = `${keyPrefix}${index}`;\n const renderedChildren = node.children?.length\n ? hastToReact(node.children, `${key}-`)\n : null;\n const className = tokenClassName(node.properties?.className);\n if (className) {\n return (\n <span key={key} className={className}>\n {renderedChildren}\n </span>\n );\n }\n return <span key={key}>{renderedChildren}</span>;\n }\n return null;\n });\n}\n\nfunction SyntaxHighlightedLine({\n code,\n language,\n}: {\n code: string;\n language: string;\n}) {\n const highlighted = useMemo(() => {\n if (!code.trim() || language === \"plaintext\" || language === \"text\") {\n return null;\n }\n try {\n const tree = lowlight.highlight(language, code) as LowlightNode;\n return hastToReact(tree.children ?? [], `${language}-`);\n } catch {\n return null;\n }\n }, [code, language]);\n\n return <>{highlighted ?? code}</>;\n}\n\n/* ── Diff model ────────────────────────────────────────────────────────────── */\n\ntype DiffRowKind = \"context\" | \"added\" | \"removed\";\n\ninterface DiffRow {\n kind: DiffRowKind;\n /** Line number in the OLD file (omitted for added rows). */\n oldNo?: number;\n /** Line number in the NEW file (omitted for removed rows). */\n newNo?: number;\n text: string;\n}\n\n/** A contiguous run of context lines collapsed when longer than the threshold. */\ninterface CollapsedRun {\n collapsed: true;\n rows: DiffRow[];\n}\n\ntype DiffSegment = DiffRow | CollapsedRun;\n\n/** Which column a split-view row belongs to (the unified view passes nothing). */\ntype RowSide = \"old\" | \"new\";\n\n/**\n * Resolve the markers landing on a row. `side` scopes the lookup to one column\n * in the split view (so a left cell only lights from `before` annotations and a\n * right cell from `after`); the unified view omits it to merge both sides.\n */\ntype MarkersForRow = (\n row: DiffRow,\n side?: RowSide,\n) => ResolvedAnnotation<DiffAnnotation>[];\n\n/** The default side an annotation targets when `side` is omitted. */\nfunction annotationSide(annotation: DiffAnnotation): \"before\" | \"after\" {\n return annotation.side === \"before\" ? \"before\" : \"after\";\n}\n\n/**\n * Count 1-based source lines in a side's text, matching how `buildRows` numbers\n * `oldNo`/`newNo`: a trailing newline does not add a phantom final line.\n */\nfunction countLines(text: string): number {\n if (text === \"\") return 0;\n return splitLines(text).length;\n}\n\n/** Number of context lines above which an unchanged run is collapsed. */\nconst COLLAPSE_THRESHOLD = 6;\n/** Context lines kept visible at each edge of a collapsed run. */\nconst CONTEXT_EDGE = 3;\n\n/**\n * Split a change `value` into individual lines. Most hunks carry a trailing\n * newline; drop the empty final element it produces so a 2-line change does not\n * render a phantom 3rd blank line.\n */\nfunction splitLines(value: string): string[] {\n const lines = value.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\n\n/** Flatten change objects into numbered diff rows. */\nfunction buildRows(changes: Change[]): DiffRow[] {\n const rows: DiffRow[] = [];\n let oldNo = 0;\n let newNo = 0;\n for (const change of changes) {\n const lines = splitLines(change.value);\n for (const text of lines) {\n if (change.added) {\n newNo += 1;\n rows.push({ kind: \"added\", newNo, text });\n } else if (change.removed) {\n oldNo += 1;\n rows.push({ kind: \"removed\", oldNo, text });\n } else {\n oldNo += 1;\n newNo += 1;\n rows.push({ kind: \"context\", oldNo, newNo, text });\n }\n }\n }\n return rows;\n}\n\n/**\n * Group rows into segments, collapsing interior runs of >COLLAPSE_THRESHOLD\n * context rows (keeping CONTEXT_EDGE visible at each side). Leading/trailing runs\n * collapse too, but keep only the inner edge visible.\n *\n * `isAnchored` marks context rows that carry an annotation (or sit adjacent to\n * one): an anchored row is NEVER hidden inside a collapsed run, so a note that\n * targets an unchanged line stays reachable. An anchor splits its run into the\n * separately-collapsible spans on either side of it, with CONTEXT_EDGE rows kept\n * visible around the anchor.\n */\nfunction segmentRows(\n rows: DiffRow[],\n isAnchored?: (row: DiffRow) => boolean,\n): DiffSegment[] {\n const segments: DiffSegment[] = [];\n\n // Collapse one contiguous context run [from, to) that contains NO anchors.\n const collapseRun = (run: DiffRow[], atStart: boolean, atEnd: boolean) => {\n if (run.length <= COLLAPSE_THRESHOLD) {\n for (const row of run) segments.push(row);\n return;\n }\n const head = atStart ? [] : run.slice(0, CONTEXT_EDGE);\n const tail = atEnd ? [] : run.slice(run.length - CONTEXT_EDGE);\n const hidden = run.slice(head.length, run.length - tail.length);\n for (const row of head) segments.push(row);\n if (hidden.length > 0) segments.push({ collapsed: true, rows: hidden });\n for (const row of tail) segments.push(row);\n };\n\n let i = 0;\n while (i < rows.length) {\n if (rows[i].kind !== \"context\") {\n segments.push(rows[i]);\n i += 1;\n continue;\n }\n // Gather the full contiguous context run.\n let j = i;\n while (j < rows.length && rows[j].kind === \"context\") j += 1;\n const fullRun = rows.slice(i, j);\n const runAtStart = i === 0;\n const runAtEnd = j === rows.length;\n\n if (!isAnchored || !fullRun.some(isAnchored)) {\n collapseRun(fullRun, runAtStart, runAtEnd);\n } else {\n // Walk the run, emitting anchored rows verbatim and collapsing the\n // unanchored spans between them. An anchored row is always visible; the\n // spans on each side of it collapse independently.\n let spanStart = 0;\n for (let k = 0; k <= fullRun.length; k += 1) {\n const atAnchor = k < fullRun.length && isAnchored(fullRun[k]);\n if (atAnchor || k === fullRun.length) {\n const span = fullRun.slice(spanStart, k);\n if (span.length > 0) {\n collapseRun(\n span,\n runAtStart && spanStart === 0,\n runAtEnd && k === fullRun.length,\n );\n }\n if (k < fullRun.length) segments.push(fullRun[k]);\n spanStart = k + 1;\n }\n }\n }\n i = j;\n }\n return segments;\n}\n\n/* ── Theme-aware row styling (light + dark) ────────────────────────────────── */\n\nconst ROW_BG: Record<DiffRowKind, string> = {\n added: \"bg-emerald-500/10 dark:bg-emerald-500/15\",\n removed: \"bg-destructive/10\",\n context: \"bg-background\",\n};\n\nconst GUTTER_BG: Record<DiffRowKind, string> = {\n added: \"bg-emerald-500/15 dark:bg-emerald-500/20\",\n removed: \"bg-destructive/15\",\n context: \"bg-muted/60\",\n};\n\nconst SIGN_COLOR: Record<DiffRowKind, string> = {\n added: \"text-emerald-700 dark:text-emerald-300\",\n removed: \"text-destructive\",\n context: \"text-muted-foreground\",\n};\n\nconst SIGN: Record<DiffRowKind, string> = {\n added: \"+\",\n removed: \"−\",\n context: \" \",\n};\n\nconst LINE_NO_CLASS =\n \"select-none px-2 py-0 text-right font-mono [font-size:var(--plan-doc-code-size)] leading-5 text-muted-foreground tabular-nums\";\n\nconst DIFF_LINE_CLASS =\n \"block min-w-max flex-1 whitespace-pre px-2 py-0 font-mono [font-size:var(--plan-doc-code-size)] leading-5 text-foreground\";\n\nconst DEFAULT_VISIBLE_DIFF_LINES = 15;\nconst MAX_DIFF_LCS_CELLS = 1_000_000;\nconst DIFF_MODE_STORAGE_KEY = \"agent-native:diff-view-mode\";\nconst DIFF_MODE_STORAGE_EVENT = \"agent-native:diff-view-mode-change\";\n\n/**\n * Below this rendered container width (px) a diff drops side-by-side `split`\n * mode and falls back to `unified`: split's two line-number gutters double the\n * width the code needs, exactly where space is tightest (e.g. a diff nested in a\n * vertical-tabs content column). Measured from the block's own box, not the\n * viewport, so the fallback fires by available width at any nesting depth.\n */\nconst SPLIT_MIN_WIDTH = 560;\n\n/**\n * Observe the rendered inline width of an element. Returns a ref to attach plus\n * the measured content-box width (null until the first ResizeObserver tick).\n * Lets the diff pick an effective mode from the width it was actually handed — a\n * measurement CSS container queries can't drive, since switching split↔unified\n * is a structural (DOM) change, not a style toggle.\n */\nfunction useContainerWidth<T extends HTMLElement>() {\n const ref = useRef<T | null>(null);\n const [width, setWidth] = useState<number | null>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setWidth(entry.contentRect.width);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n return [ref, width] as const;\n}\n\nfunction isDiffMode(value: unknown): value is DiffMode {\n return value === \"unified\" || value === \"split\";\n}\n\nfunction readStoredDiffMode(): DiffMode | null {\n if (typeof window === \"undefined\") return null;\n try {\n const value = window.localStorage?.getItem(DIFF_MODE_STORAGE_KEY);\n return isDiffMode(value) ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction writeStoredDiffMode(mode: DiffMode): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage?.setItem(DIFF_MODE_STORAGE_KEY, mode);\n } catch {\n // Storage may be unavailable in sandboxed/private contexts.\n }\n}\n\nfunction dispatchDiffModeChange(mode: DiffMode): void {\n if (typeof window === \"undefined\") return;\n try {\n window.dispatchEvent(\n new CustomEvent<DiffMode>(DIFF_MODE_STORAGE_EVENT, { detail: mode }),\n );\n } catch {\n // Best-effort sync; local component state and storage already changed.\n }\n}\n\nfunction usePreferredDiffMode(authoredMode: DiffMode | undefined) {\n const [mode, setMode] = useState<DiffMode>(authoredMode ?? \"unified\");\n\n useEffect(() => {\n if (authoredMode) return;\n const storedMode = readStoredDiffMode();\n if (storedMode) setMode(storedMode);\n }, [authoredMode]);\n\n useEffect(() => {\n if (authoredMode) return;\n if (typeof window === \"undefined\") return;\n\n const onStorage = (event: StorageEvent) => {\n if (event.key !== DIFF_MODE_STORAGE_KEY) return;\n if (isDiffMode(event.newValue)) setMode(event.newValue);\n };\n const onModeChange = (event: Event) => {\n const mode = (event as CustomEvent<unknown>).detail;\n if (isDiffMode(mode)) setMode(mode);\n };\n\n window.addEventListener(\"storage\", onStorage);\n window.addEventListener(DIFF_MODE_STORAGE_EVENT, onModeChange);\n return () => {\n window.removeEventListener(\"storage\", onStorage);\n window.removeEventListener(DIFF_MODE_STORAGE_EVENT, onModeChange);\n };\n }, [authoredMode]);\n\n const setPreferredMode = useCallback((nextMode: DiffMode) => {\n setMode(nextMode);\n writeStoredDiffMode(nextMode);\n dispatchDiffModeChange(nextMode);\n }, []);\n\n return [mode, setPreferredMode] as const;\n}\n\nfunction splitDiffFilename(filename?: string): {\n basename: string;\n directory: string | null;\n} {\n const value = filename?.trim() || \"diff\";\n const segments = value.split(\"/\").filter(Boolean);\n const basename = segments[segments.length - 1] ?? value;\n const directory =\n segments.length > 1 ? segments.slice(0, -1).join(\"/\") : null;\n return { basename, directory };\n}\n\nfunction DiffLineText({ language, text }: { language: string; text: string }) {\n const code = text || \" \";\n return (\n <span className={DIFF_LINE_CLASS}>\n <SyntaxHighlightedLine code={code} language={language} />\n </span>\n );\n}\n\n/* ── Read ──────────────────────────────────────────────────────────────────── */\n\nfunction DiffRead({\n data,\n blockId,\n title,\n summary,\n ctx,\n}: BlockReadProps<DiffData>) {\n // Default layout when none is authored is UNIFIED — a single column reads\n // cleanly at any width, while split's doubled line-number gutters cut code off\n // in a constrained box (a recap's vertical-tabs panel or a comparison column).\n // An explicitly authored `mode` still wins, and the Unified/Split toggle below\n // stays fully functional — only the starting default changes.\n const inNarrowContainer = useInNarrowContainer();\n const [mode, setMode] = usePreferredDiffMode(data.mode);\n const [expanded, setExpanded] = useState<Set<number>>(() => new Set());\n const [showAllRows, setShowAllRows] = useState(false);\n const [containerRef, containerWidth] = useContainerWidth<HTMLElement>();\n // On-hover popover (anchored to the right of the code) replaces the old\n // persistent rail: nothing is shown when idle. `codeRef` measures the code\n // box's right edge; `hover` carries the active index + captured geometry.\n const hover = useAnnotationHover();\n const { activeIndex } = hover;\n const codeRef = useRef<HTMLDivElement | null>(null);\n\n const rows = useMemo(\n () => buildRows(diffLines(data.before, data.after)),\n [data.before, data.after],\n );\n const language = useMemo(\n () => resolveDiffLanguage(data),\n [data.filename, data.language],\n );\n const fileParts = useMemo(\n () => splitDiffFilename(data.filename),\n [data.filename],\n );\n const splitLineCount = useMemo(() => pairSplitRows(rows).length, [rows]);\n\n // Resolve annotations against the side they target. A `before` annotation's\n // `lines` ref is clamped to the OLD file's line count and matched on `oldNo`;\n // an `after` (default) ref to the NEW file and matched on `newNo`. Markers are\n // authoring-order across BOTH sides so a note ↔ row ↔ rail card share one id.\n const beforeLineCount = useMemo(() => countLines(data.before), [data.before]);\n const afterLineCount = useMemo(() => countLines(data.after), [data.after]);\n const resolved = useMemo(\n () =>\n resolveAnnotations(data.annotations, (annotation) =>\n annotationSide(annotation) === \"before\"\n ? beforeLineCount\n : afterLineCount,\n ),\n [data.annotations, beforeLineCount, afterLineCount],\n );\n const hasAnnotations = hasRailAnnotations(resolved);\n // Effective render mode. Annotations live in a SEPARATE right-hand rail (not\n // over the code), so they no longer force a mode. When no mode was authored, a\n // narrow container falls back to unified so split's doubled gutters never\n // crush the code; an explicitly authored `mode` wins even in a narrow host.\n // `canSplit` only hides the toggle for auto-mode narrow fallbacks.\n const measuredNarrow =\n containerWidth != null && containerWidth < SPLIT_MIN_WIDTH;\n const narrow = data.mode == null && (measuredNarrow || inNarrowContainer);\n const canSplit = !narrow;\n const effectiveMode: DiffMode = canSplit ? mode : \"unified\";\n\n // Annotations (diff): NO persistent column. Hovering a marked code line (or\n // its numbered pip) opens THAT note's card as an on-hover popover anchored to\n // the RIGHT of the code box, never over the code. The in-code pip stays as the\n // anchor indicator + active-line highlight. `onRowEnter` captures the code\n // box's right edge + the hovered row's vertical position to place the card;\n // `onRowLeave` schedules a short-delay close so the pointer can cross the gap\n // into the card (which cancels the close while hovered).\n const onRowEnter = useCallback(\n (index: number, rowEl: HTMLElement) => {\n const anchor = anchorFromElements(codeRef.current, rowEl);\n if (anchor) hover.open(index, anchor);\n },\n [hover],\n );\n const onRowLeave = useCallback(() => hover.scheduleClose(), [hover]);\n // Side-scoped line → markers maps so a row only lights from its own side.\n const beforeMarkers = useMemo(\n () =>\n buildLineMarkerMap(\n resolved.filter((r) => annotationSide(r.annotation) === \"before\"),\n ),\n [resolved],\n );\n const afterMarkers = useMemo(\n () =>\n buildLineMarkerMap(\n resolved.filter((r) => annotationSide(r.annotation) !== \"before\"),\n ),\n [resolved],\n );\n const markersForRow = useMemo<MarkersForRow>(() => {\n return (row, side) => {\n const out: ResolvedAnnotation<DiffAnnotation>[] = [];\n if (\n (side === undefined || side === \"old\") &&\n row.oldNo != null &&\n row.kind !== \"added\"\n ) {\n out.push(...(beforeMarkers.get(row.oldNo) ?? []));\n }\n if (\n (side === undefined || side === \"new\") &&\n row.newNo != null &&\n row.kind !== \"removed\"\n ) {\n out.push(...(afterMarkers.get(row.newNo) ?? []));\n }\n return out;\n };\n }, [beforeMarkers, afterMarkers]);\n // A context row that carries a marker is an anchor: never collapse it away.\n const anchoredRow = useMemo(() => {\n if (!hasAnnotations) return undefined;\n return (row: DiffRow) => markersForRow(row).length > 0;\n }, [hasAnnotations, markersForRow]);\n\n // The resolved annotation whose card is currently shown on hover.\n const activeItem = useMemo<ResolvedAnnotation<DiffAnnotation> | null>(\n () =>\n activeIndex == null\n ? null\n : (resolved.find((item) => item.index === activeIndex) ?? null),\n [activeIndex, resolved],\n );\n\n const added = rows.filter((r) => r.kind === \"added\").length;\n const removed = rows.filter((r) => r.kind === \"removed\").length;\n const unchanged = data.before === data.after;\n const totalVisibleLineCount =\n effectiveMode === \"split\" ? splitLineCount : rows.length;\n const shouldLimitRows = totalVisibleLineCount > DEFAULT_VISIBLE_DIFF_LINES;\n // Never truncate away an annotated row: extend the window past the last one.\n const effectiveRowLimit = useMemo(() => {\n if (showAllRows || !shouldLimitRows) return undefined;\n let limit = DEFAULT_VISIBLE_DIFF_LINES;\n if (hasAnnotations) {\n for (let idx = rows.length - 1; idx >= limit; idx -= 1) {\n if (markersForRow(rows[idx]).length > 0) {\n limit = idx + 1;\n break;\n }\n }\n }\n return limit;\n }, [showAllRows, shouldLimitRows, hasAnnotations, rows, markersForRow]);\n const rowLimit = effectiveRowLimit;\n const displayedRows =\n effectiveMode === \"unified\" && rowLimit ? rows.slice(0, rowLimit) : rows;\n\n const toggleRun = (index: number) =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n\n // The bordered code box. It always spans its full width — annotations surface\n // as an on-hover popover anchored to this box's right edge, never as a column.\n // `codeRef` measures that right edge for the popover's placement.\n const diffBox = (\n <div\n ref={codeRef}\n className=\"overflow-hidden rounded-md border border-border bg-background\"\n >\n {/* Header: filename, path, +/− counts, mode toggle. */}\n <div className=\"flex min-h-10 flex-wrap items-center gap-2 border-b border-border bg-muted/60 px-3 py-1.5\">\n <IconFileDiff className=\"size-4 shrink-0 text-muted-foreground\" />\n <span\n className=\"flex min-w-0 flex-1 items-baseline gap-1.5 font-mono\"\n title={data.filename || undefined}\n >\n <span className=\"min-w-0 max-w-[16rem] truncate text-[13px] font-semibold leading-5 text-foreground\">\n {fileParts.basename}\n </span>\n {fileParts.directory && (\n <span className=\"min-w-0 flex-1 truncate text-[11px] leading-5 text-muted-foreground/70\">\n {fileParts.directory}\n </span>\n )}\n </span>\n <span className=\"ml-1 flex shrink-0 items-center gap-2 font-mono text-xs\">\n <span className=\"text-emerald-700 dark:text-emerald-300\">\n +{added}\n </span>\n <span className=\"text-destructive\">−{removed}</span>\n </span>\n {/* Mode toggle only when split is actually available: a narrow\n container forces unified (split's doubled gutters would crush the\n code), so the toggle would otherwise be a no-op. Annotations are an\n on-hover popover now, so they work in both unified and split. */}\n {canSplit && (\n <div className=\"pointer-events-none ml-auto flex shrink-0 items-center overflow-hidden rounded-md border border-border bg-background opacity-0 transition-opacity group-hover/diff-block:pointer-events-auto group-hover/diff-block:opacity-100 group-focus-within/diff-block:pointer-events-auto group-focus-within/diff-block:opacity-100\">\n <ModeButton\n active={mode === \"unified\"}\n onClick={() => setMode(\"unified\")}\n icon={<IconList className=\"size-3.5\" />}\n label=\"Unified\"\n />\n <ModeButton\n active={mode === \"split\"}\n onClick={() => setMode(\"split\")}\n icon={<IconColumns className=\"size-3.5\" />}\n label=\"Split\"\n />\n </div>\n )}\n </div>\n\n {/* Body. */}\n {unchanged ? (\n <div className=\"px-4 py-6 text-center font-mono text-sm text-muted-foreground\">\n No changes\n </div>\n ) : effectiveMode === \"split\" ? (\n <SplitView\n rows={rows}\n language={language}\n rowLimit={rowLimit}\n markersForRow={markersForRow}\n activeIndex={activeIndex}\n onRowEnter={onRowEnter}\n onRowLeave={onRowLeave}\n />\n ) : (\n <UnifiedView\n rows={displayedRows}\n language={language}\n expanded={expanded}\n onToggleRun={toggleRun}\n markersForRow={markersForRow}\n anchoredRow={anchoredRow}\n activeIndex={activeIndex}\n onRowEnter={onRowEnter}\n onRowLeave={onRowLeave}\n />\n )}\n {!unchanged && shouldLimitRows && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-expanded={showAllRows}\n onClick={() => setShowAllRows((current) => !current)}\n className=\"flex h-7 w-full items-center justify-center gap-1.5 border-t border-border bg-background px-2 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/70 hover:text-foreground\"\n >\n <IconChevronRight\n className={cn(\n \"size-3 shrink-0 transition-transform\",\n showAllRows ? \"-rotate-90\" : \"rotate-90\",\n )}\n />\n {showAllRows\n ? \"Show fewer\"\n : `Show all ${totalVisibleLineCount} lines`}\n </button>\n )}\n </div>\n );\n\n return (\n <section\n ref={containerRef}\n className=\"relative plan-block group/diff-block\"\n data-block-id={blockId}\n >\n {title && <div className=\"plan-block-label\">{title}</div>}\n {summary && (\n <p className=\"mb-3 text-sm leading-relaxed text-plan-muted\">\n {summary}\n </p>\n )}\n {/* The diff keeps its full width — no persistent annotation column. The\n in-code numbered pips remain the hover anchors; notes live in a\n visually-hidden stack (a11y + tests) and surface ONE at a time as an\n on-hover popover anchored to the right of the code box. */}\n {diffBox}\n {hasAnnotations && (\n <AnnotationHiddenStack items={resolved} ctx={ctx} showMarker />\n )}\n {hasAnnotations && activeItem && hover.anchor && (\n <AnnotationHoverCard\n item={activeItem}\n anchor={hover.anchor}\n ctx={ctx}\n showMarker\n onMouseEnter={hover.cancelClose}\n onMouseLeave={hover.scheduleClose}\n />\n )}\n </section>\n );\n}\n\nfunction ModeButton({\n active,\n onClick,\n icon,\n label,\n}: {\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n label: string;\n}) {\n return (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={onClick}\n aria-pressed={active}\n className={cn(\n \"flex cursor-pointer items-center gap-1 px-2 py-1 text-xs font-medium transition-colors\",\n active\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:bg-muted/80 hover:text-foreground\",\n )}\n >\n {icon}\n {label}\n </button>\n );\n}\n\n/* ── Annotation wiring shared by both views ────────────────────────────────── */\n\n/** Marker + hover props threaded into the unified/split rows. */\ninterface RowAnnotationProps {\n markersForRow: MarkersForRow;\n anchoredRow?: (row: DiffRow) => boolean;\n activeIndex: number | null;\n /** Hovering an annotated row opens its popover, anchored to this row's box. */\n onRowEnter: (index: number, rowEl: HTMLElement) => void;\n /** Leaving an annotated row schedules the popover's close. */\n onRowLeave: () => void;\n}\n\n/**\n * The numbered marker pip(s) for a row plus the active-state it derives. Returns\n * `null` when the row carries no annotation so unannotated diffs render an empty\n * marker column (or no column at all when the whole diff is unannotated).\n */\nfunction rowMarkerInfo(\n markers: ResolvedAnnotation<DiffAnnotation>[],\n activeIndex: number | null,\n): { isActive: boolean; primaryIndex: number } | null {\n if (markers.length === 0) return null;\n const isActive = markers.some((m) => m.index === activeIndex);\n return { isActive, primaryIndex: markers[0].index };\n}\n\n/** Shared amber wash for an annotated row, brighter when active. */\nfunction annotatedRowBg(info: { isActive: boolean } | null): string | null {\n if (!info) return null;\n return info.isActive\n ? \"bg-amber-400/20 dark:bg-amber-300/15\"\n : \"bg-amber-400/[0.07] dark:bg-amber-300/[0.07]\";\n}\n\n/**\n * Whether `row` is the FIRST line of `marker`'s resolved range. The numbered pip\n * renders only on this line, so a multi-line annotation shows a single marker at\n * the top of its span instead of repeating the same number down every line it\n * covers. The amber band still washes the whole range (via `annotatedRowBg`), so\n * the span stays visually grouped without the column of duplicate numbers.\n */\nfunction isMarkerRangeStart(\n row: DiffRow,\n marker: ResolvedAnnotation<DiffAnnotation>,\n): boolean {\n if (!marker.range) return false;\n const lineNo =\n annotationSide(marker.annotation) === \"before\" ? row.oldNo : row.newNo;\n return lineNo === marker.range.start;\n}\n\n/* ── Unified view ──────────────────────────────────────────────────────────── */\n\nfunction UnifiedView({\n rows,\n language,\n expanded,\n onToggleRun,\n markersForRow,\n anchoredRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n}: {\n rows: DiffRow[];\n language: string;\n expanded: Set<number>;\n onToggleRun: (index: number) => void;\n} & RowAnnotationProps) {\n const segments = useMemo(\n () => segmentRows(rows, anchoredRow),\n [rows, anchoredRow],\n );\n // Any annotation present ⇒ reserve the marker column so rows stay aligned.\n const showMarkerColumn = useMemo(\n () => rows.some((row) => markersForRow(row).length > 0),\n [rows, markersForRow],\n );\n const rowProps = {\n language,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n showMarkerColumn,\n };\n let runIndex = 0;\n return (\n <div className=\"overflow-x-auto\" data-code-surface>\n <div className=\"w-max min-w-full font-mono [font-size:var(--plan-doc-code-size)] leading-5\">\n {segments.map((segment, idx) => {\n if (\"collapsed\" in segment) {\n const key = runIndex++;\n const open = expanded.has(key);\n return (\n <div key={`run-${key}`}>\n <CollapsedRow\n count={segment.rows.length}\n open={open}\n onClick={() => onToggleRun(key)}\n />\n {open &&\n segment.rows.map((row, ri) => (\n <UnifiedRow\n key={`run-${key}-${ri}`}\n row={row}\n {...rowProps}\n />\n ))}\n </div>\n );\n }\n return <UnifiedRow key={idx} row={segment} {...rowProps} />;\n })}\n </div>\n </div>\n );\n}\n\nfunction UnifiedRow({\n language,\n row,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n showMarkerColumn,\n}: {\n language: string;\n row: DiffRow;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onRowEnter: (index: number, rowEl: HTMLElement) => void;\n onRowLeave: () => void;\n showMarkerColumn: boolean;\n}) {\n const markers = markersForRow(row);\n const info = rowMarkerInfo(markers, activeIndex);\n const startMarker = markers.find((marker) => isMarkerRangeStart(row, marker));\n return (\n <div\n data-annot-row={startMarker ? startMarker.index : undefined}\n className={cn(\n \"flex min-h-5 min-w-full\",\n ROW_BG[row.kind],\n annotatedRowBg(info),\n )}\n onMouseEnter={\n info\n ? (event) =>\n onRowEnter(\n startMarker?.index ?? info.primaryIndex,\n event.currentTarget,\n )\n : undefined\n }\n onMouseLeave={info ? () => onRowLeave() : undefined}\n >\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>{row.oldNo ?? \"\"}</span>\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>{row.newNo ?? \"\"}</span>\n <span\n className={cn(\n \"w-6 shrink-0 select-none py-0 text-center font-semibold leading-5\",\n GUTTER_BG[row.kind],\n SIGN_COLOR[row.kind],\n )}\n >\n {SIGN[row.kind]}\n </span>\n {showMarkerColumn && (\n <MarkerCell\n startMarker={startMarker}\n active={startMarker != null && startMarker.index === activeIndex}\n />\n )}\n <DiffLineText text={row.text} language={language} />\n </div>\n );\n}\n\n/**\n * The fixed-width marker column rendered between the sign gutter and the code.\n * `startMarker` is set only on the FIRST line of an annotation's range, so the\n * numbered pip appears once at the top of a span; every other row (the rest of a\n * span, and every unannotated row in a diff that has annotations) renders an\n * empty spacer so the code text stays aligned.\n */\nfunction MarkerCell({\n startMarker,\n active,\n}: {\n startMarker?: ResolvedAnnotation<DiffAnnotation>;\n active: boolean;\n}) {\n return (\n <span className=\"flex w-6 shrink-0 select-none items-center justify-center py-0\">\n {startMarker != null && (\n <AnnotationGutterMarker marker={startMarker.marker} active={active} />\n )}\n </span>\n );\n}\n\nfunction CollapsedRow({\n count,\n open,\n onClick,\n}: {\n count: number;\n open: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={onClick}\n className=\"flex w-full cursor-pointer items-center gap-2 border-y border-border bg-muted/70 px-3 py-1 text-left text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <IconDotsVertical className=\"size-3.5 shrink-0\" />\n <span>\n {open ? \"Hide\" : \"Show\"} {count} unchanged line\n {count === 1 ? \"\" : \"s\"}\n </span>\n </button>\n );\n}\n\n/* ── Split (side-by-side) view ─────────────────────────────────────────────── */\n\ninterface SplitRow {\n left?: DiffRow;\n right?: DiffRow;\n}\n\n/**\n * Pair removed lines (left) with added lines (right) so a modification shows the\n * old and new side by side; context lines mirror on both columns. Leftover adds\n * or removes fall through as half-empty rows (GitHub split behavior).\n */\nfunction pairSplitRows(rows: DiffRow[]): SplitRow[] {\n const out: SplitRow[] = [];\n let i = 0;\n while (i < rows.length) {\n const row = rows[i];\n if (row.kind === \"context\") {\n out.push({ left: row, right: row });\n i += 1;\n continue;\n }\n // Collect a contiguous block of removed-then-added rows.\n const removed: DiffRow[] = [];\n const added: DiffRow[] = [];\n while (i < rows.length && rows[i].kind === \"removed\")\n removed.push(rows[i++]);\n while (i < rows.length && rows[i].kind === \"added\") added.push(rows[i++]);\n const max = Math.max(removed.length, added.length);\n for (let k = 0; k < max; k += 1) {\n out.push({ left: removed[k], right: added[k] });\n }\n }\n return out;\n}\n\nfunction SplitView({\n language,\n rowLimit,\n rows,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n}: {\n language: string;\n rowLimit?: number;\n rows: DiffRow[];\n} & Omit<RowAnnotationProps, \"anchoredRow\">) {\n const pairs = useMemo(() => pairSplitRows(rows), [rows]);\n const displayedPairs = rowLimit ? pairs.slice(0, rowLimit) : pairs;\n // Reserve the marker column on a side only if any visible row there has one.\n const showOldMarkers = useMemo(\n () =>\n displayedPairs.some(\n (pair) => pair.left && markersForRow(pair.left, \"old\").length > 0,\n ),\n [displayedPairs, markersForRow],\n );\n const showNewMarkers = useMemo(\n () =>\n displayedPairs.some(\n (pair) => pair.right && markersForRow(pair.right, \"new\").length > 0,\n ),\n [displayedPairs, markersForRow],\n );\n const cellProps = {\n language,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n };\n return (\n <div\n className=\"flex w-full bg-background font-mono [font-size:var(--plan-doc-code-size)] leading-5\"\n data-code-surface\n >\n <div className=\"min-w-0 flex-1 overflow-x-auto border-r border-border\">\n <div className=\"inline-block min-w-full\">\n {displayedPairs.map((pair, idx) => (\n <SplitCell\n key={`old-${idx}`}\n row={pair.left}\n side=\"old\"\n showMarkerColumn={showOldMarkers}\n {...cellProps}\n />\n ))}\n </div>\n </div>\n <div className=\"min-w-0 flex-1 overflow-x-auto\">\n <div className=\"inline-block min-w-full\">\n {displayedPairs.map((pair, idx) => (\n <SplitCell\n key={`new-${idx}`}\n row={pair.right}\n side=\"new\"\n showMarkerColumn={showNewMarkers}\n {...cellProps}\n />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SplitCell({\n language,\n row,\n side,\n markersForRow,\n activeIndex,\n onRowEnter,\n onRowLeave,\n showMarkerColumn,\n}: {\n language: string;\n row?: DiffRow;\n side: RowSide;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onRowEnter: (index: number, rowEl: HTMLElement) => void;\n onRowLeave: () => void;\n showMarkerColumn: boolean;\n}) {\n if (!row) {\n return (\n <div className=\"flex min-h-5 min-w-full bg-muted/40 opacity-70\">\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")} />\n <span className=\"w-6 shrink-0 bg-muted/60\" />\n {showMarkerColumn && <span className=\"w-6 shrink-0\" />}\n <span className={DIFF_LINE_CLASS}> </span>\n </div>\n );\n }\n const sign = side === \"old\" ? \"−\" : \"+\";\n const showSign = row.kind !== \"context\";\n const markers = markersForRow(row, side);\n const info = rowMarkerInfo(markers, activeIndex);\n const startMarker = markers.find((marker) => isMarkerRangeStart(row, marker));\n return (\n <div\n data-annot-row={startMarker ? startMarker.index : undefined}\n className={cn(\n \"flex min-h-5 min-w-full\",\n ROW_BG[row.kind],\n annotatedRowBg(info),\n )}\n onMouseEnter={\n info\n ? (event) =>\n onRowEnter(\n startMarker?.index ?? info.primaryIndex,\n event.currentTarget,\n )\n : undefined\n }\n onMouseLeave={info ? () => onRowLeave() : undefined}\n >\n <span className={cn(LINE_NO_CLASS, \"w-[52px]\")}>\n {side === \"old\" ? (row.oldNo ?? \"\") : (row.newNo ?? \"\")}\n </span>\n <span\n className={cn(\n \"w-6 shrink-0 select-none py-0 text-center font-semibold leading-5\",\n GUTTER_BG[row.kind],\n SIGN_COLOR[row.kind],\n )}\n >\n {showSign ? sign : \" \"}\n </span>\n {showMarkerColumn && (\n <MarkerCell\n startMarker={startMarker}\n active={startMarker != null && startMarker.index === activeIndex}\n />\n )}\n <DiffLineText text={row.text} language={language} />\n </div>\n );\n}\n\n/* ── Edit (panel) ──────────────────────────────────────────────────────────── */\n\nconst codeAreaClass =\n \"min-h-[140px] font-mono [font-size:var(--plan-code-size)] leading-5\";\n\nfunction DiffEdit({ data, onChange, editable }: BlockEditProps<DiffData>) {\n const patch = (next: Partial<DiffData>) => onChange({ ...data, ...next });\n const mode: DiffMode = data.mode ?? \"unified\";\n const annotations = data.annotations ?? [];\n\n const updateAnnotation = (index: number, next: Partial<DiffAnnotation>) =>\n patch({\n annotations: annotations.map((annotation, i) =>\n i === index ? { ...annotation, ...next } : annotation,\n ),\n });\n\n const removeAnnotation = (index: number) =>\n patch({ annotations: annotations.filter((_, i) => i !== index) });\n\n const addAnnotation = () => {\n if (annotations.length >= 80) return; // schema max\n patch({\n annotations: [\n ...annotations,\n { side: \"after\", lines: \"1\", label: \"\", note: \"\" },\n ],\n });\n };\n\n return (\n <div className=\"flex flex-col gap-3\" data-plan-interactive>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-filename\" className=\"text-xs\">\n Filename\n </DevLabel>\n <DevInput\n id=\"diff-filename\"\n value={data.filename ?? \"\"}\n placeholder=\"src/add.ts\"\n disabled={!editable}\n onChange={(event) =>\n patch({ filename: event.target.value || undefined })\n }\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-language\" className=\"text-xs\">\n Language\n </DevLabel>\n <DevInput\n id=\"diff-language\"\n value={data.language ?? \"\"}\n placeholder=\"ts\"\n disabled={!editable}\n onChange={(event) =>\n patch({ language: event.target.value || undefined })\n }\n />\n </div>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel className=\"text-xs\">Layout</DevLabel>\n <DevSelect\n value={mode}\n disabled={!editable}\n onValueChange={(value) => patch({ mode: value as DiffMode })}\n options={[\n { value: \"unified\", label: \"Unified\" },\n { value: \"split\", label: \"Split (side-by-side)\" },\n ]}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-before\" className=\"text-xs\">\n Before\n </DevLabel>\n <DevTextarea\n id=\"diff-before\"\n spellCheck={false}\n className={codeAreaClass}\n value={data.before}\n disabled={!editable}\n onChange={(event) => patch({ before: event.target.value })}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <DevLabel htmlFor=\"diff-after\" className=\"text-xs\">\n After\n </DevLabel>\n <DevTextarea\n id=\"diff-after\"\n spellCheck={false}\n className={codeAreaClass}\n value={data.after}\n disabled={!editable}\n onChange={(event) => patch({ after: event.target.value })}\n />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <DevLabel className=\"text-xs\">Annotations</DevLabel>\n {editable && annotations.length < 80 && (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={addAnnotation}\n className=\"flex cursor-pointer items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-plan-muted transition-colors hover:bg-plan-block/60 hover:text-plan-text\"\n >\n <IconPlus className=\"size-3.5\" />\n Add annotation\n </button>\n )}\n </div>\n {annotations.length === 0 && (\n <p className=\"text-xs text-plan-muted\">\n No annotations yet. Add one to anchor a note to a line range on the\n before or after side.\n </p>\n )}\n {annotations.map((annotation, index) => (\n <div\n key={index}\n className=\"flex flex-col gap-2 rounded-md border border-plan-line bg-plan-block/30 p-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-[110px_110px_minmax(0,1fr)_auto]\">\n <DevSelect\n aria-label={`Annotation ${index + 1} side`}\n value={annotation.side ?? \"after\"}\n disabled={!editable}\n onValueChange={(value) =>\n updateAnnotation(index, {\n side: value as DiffAnnotation[\"side\"],\n })\n }\n options={[\n { value: \"after\", label: \"After\" },\n { value: \"before\", label: \"Before\" },\n ]}\n />\n <DevInput\n aria-label={`Annotation ${index + 1} lines`}\n value={annotation.lines}\n placeholder=\"3-5\"\n disabled={!editable}\n onChange={(event) =>\n updateAnnotation(index, { lines: event.target.value })\n }\n />\n <DevInput\n aria-label={`Annotation ${index + 1} label`}\n value={annotation.label ?? \"\"}\n placeholder=\"Label (optional)\"\n disabled={!editable}\n onChange={(event) =>\n updateAnnotation(index, {\n label: event.target.value || undefined,\n })\n }\n />\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-label={`Remove annotation ${index + 1}`}\n onClick={() => removeAnnotation(index)}\n className=\"flex size-9 shrink-0 cursor-pointer items-center justify-center rounded-md text-plan-muted transition-colors hover:bg-muted hover:text-foreground\"\n >\n <IconTrash className=\"size-4\" />\n </button>\n )}\n </div>\n <DevTextarea\n aria-label={`Annotation ${index + 1} note`}\n className=\"min-h-[60px] text-sm\"\n value={annotation.note}\n placeholder=\"Explain what these lines do…\"\n disabled={!editable}\n onChange={(event) =>\n updateAnnotation(index, { note: event.target.value })\n }\n />\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport { DiffRead, DiffEdit };\n"]}
|
|
@@ -21,10 +21,11 @@ export declare const DEFAULT_CODE_MAX_LINES = 40;
|
|
|
21
21
|
* is {@link DEFAULT_CODE_MAX_LINES}; the surface only collapses when the code is
|
|
22
22
|
* actually longer than that.
|
|
23
23
|
*/
|
|
24
|
-
export declare function CodeSurface({ code, language, maxLines, className, }: {
|
|
24
|
+
export declare function CodeSurface({ code, language, maxLines, showLanguageLabel, className, }: {
|
|
25
25
|
code: string;
|
|
26
26
|
language?: string;
|
|
27
27
|
maxLines?: number | null;
|
|
28
|
+
showLanguageLabel?: boolean;
|
|
28
29
|
className?: string;
|
|
29
30
|
}): import("react/jsx-runtime").JSX.Element;
|
|
30
31
|
//# sourceMappingURL=HighlightedCode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HighlightedCode.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/HighlightedCode.tsx"],"names":[],"mappings":"AA+GA,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAS1E;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,2CA2CA;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,QAAiC,EACjC,SAAS,GACV,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAkDA"}
|
|
1
|
+
{"version":3,"file":"HighlightedCode.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/HighlightedCode.tsx"],"names":[],"mappings":"AA+GA,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAS1E;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,2CA2CA;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,QAAiC,EACjC,iBAAwB,EACxB,SAAS,GACV,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAkDA"}
|
|
@@ -157,7 +157,7 @@ export const DEFAULT_CODE_MAX_LINES = 40;
|
|
|
157
157
|
* is {@link DEFAULT_CODE_MAX_LINES}; the surface only collapses when the code is
|
|
158
158
|
* actually longer than that.
|
|
159
159
|
*/
|
|
160
|
-
export function CodeSurface({ code, language, maxLines = DEFAULT_CODE_MAX_LINES, className, }) {
|
|
160
|
+
export function CodeSurface({ code, language, maxLines = DEFAULT_CODE_MAX_LINES, showLanguageLabel = true, className, }) {
|
|
161
161
|
const [expanded, setExpanded] = useState(false);
|
|
162
162
|
const lineCount = useMemo(() => (code ? code.replace(/\n$/, "").split("\n").length : 0), [code]);
|
|
163
163
|
const cap = typeof maxLines === "number" && maxLines > 0 ? maxLines : null;
|
|
@@ -165,7 +165,7 @@ export function CodeSurface({ code, language, maxLines = DEFAULT_CODE_MAX_LINES,
|
|
|
165
165
|
const collapsed = collapsible && !expanded;
|
|
166
166
|
const hiddenLines = collapsible ? lineCount - cap : 0;
|
|
167
167
|
const label = prettyLanguageName(language);
|
|
168
|
-
return (_jsxs("div", { className: cn("plan-code-surface", className ?? "mt-5"), "data-collapsed": collapsed ? "true" : undefined, children: [label && (_jsx("div", { className: "plan-code-surface-bar", children: _jsx("span", { className: "plan-code-surface-lang", children: label }) })), _jsxs("div", { className: "plan-code-surface-scroll", style: collapsed
|
|
168
|
+
return (_jsxs("div", { className: cn("plan-code-surface", className ?? "mt-5"), "data-collapsed": collapsed ? "true" : undefined, children: [showLanguageLabel && label && (_jsx("div", { className: "plan-code-surface-bar", children: _jsx("span", { className: "plan-code-surface-lang", children: label }) })), _jsxs("div", { className: "plan-code-surface-scroll", style: collapsed
|
|
169
169
|
? { "--plan-code-max-lines": cap }
|
|
170
170
|
: undefined, children: [_jsx(HighlightedCode, { code: code, language: language }), collapsed && (_jsx("div", { className: "plan-code-surface-fade", "aria-hidden": "true" }))] }), collapsible && (_jsx("button", { type: "button", "data-plan-interactive": true, className: "plan-code-surface-toggle", onClick: () => setExpanded((value) => !value), children: collapsed
|
|
171
171
|
? `Show ${hiddenLines} more line${hiddenLines === 1 ? "" : "s"}`
|