@agent-native/core 0.42.0 → 0.44.0

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.
Files changed (139) hide show
  1. package/README.md +17 -56
  2. package/dist/chat-threads/store.d.ts.map +1 -1
  3. package/dist/chat-threads/store.js +71 -10
  4. package/dist/chat-threads/store.js.map +1 -1
  5. package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
  6. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  7. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  8. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  9. package/dist/cli/recap.d.ts.map +1 -1
  10. package/dist/cli/recap.js +13 -13
  11. package/dist/cli/recap.js.map +1 -1
  12. package/dist/cli/skills.d.ts +2 -6
  13. package/dist/cli/skills.d.ts.map +1 -1
  14. package/dist/cli/skills.js +21 -79
  15. package/dist/cli/skills.js.map +1 -1
  16. package/dist/client/AssistantChat.d.ts.map +1 -1
  17. package/dist/client/AssistantChat.js +76 -18
  18. package/dist/client/AssistantChat.js.map +1 -1
  19. package/dist/client/blocks/index.d.ts +9 -0
  20. package/dist/client/blocks/index.d.ts.map +1 -1
  21. package/dist/client/blocks/index.js +9 -0
  22. package/dist/client/blocks/index.js.map +1 -1
  23. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
  24. package/dist/client/blocks/library/AnnotatedCodeBlock.js +3 -3
  25. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
  26. package/dist/client/blocks/library/ApiEndpointBlock.d.ts.map +1 -1
  27. package/dist/client/blocks/library/ApiEndpointBlock.js +1 -1
  28. package/dist/client/blocks/library/ApiEndpointBlock.js.map +1 -1
  29. package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
  30. package/dist/client/blocks/library/DiffBlock.js +128 -19
  31. package/dist/client/blocks/library/DiffBlock.js.map +1 -1
  32. package/dist/client/blocks/library/FileTreeBlock.d.ts.map +1 -1
  33. package/dist/client/blocks/library/FileTreeBlock.js +31 -4
  34. package/dist/client/blocks/library/FileTreeBlock.js.map +1 -1
  35. package/dist/client/blocks/library/JsonExplorerBlock.js +1 -1
  36. package/dist/client/blocks/library/JsonExplorerBlock.js.map +1 -1
  37. package/dist/client/blocks/library/MermaidBlock.js +1 -1
  38. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  39. package/dist/client/blocks/library/callout.config.d.ts +29 -0
  40. package/dist/client/blocks/library/callout.config.d.ts.map +1 -0
  41. package/dist/client/blocks/library/callout.config.js +33 -0
  42. package/dist/client/blocks/library/callout.config.js.map +1 -0
  43. package/dist/client/blocks/library/callout.d.ts +20 -0
  44. package/dist/client/blocks/library/callout.d.ts.map +1 -0
  45. package/dist/client/blocks/library/callout.js +61 -0
  46. package/dist/client/blocks/library/callout.js.map +1 -0
  47. package/dist/client/blocks/library/checklist.d.ts.map +1 -1
  48. package/dist/client/blocks/library/checklist.js +3 -3
  49. package/dist/client/blocks/library/checklist.js.map +1 -1
  50. package/dist/client/blocks/library/code-tabs.js +1 -1
  51. package/dist/client/blocks/library/code-tabs.js.map +1 -1
  52. package/dist/client/blocks/library/diagram.config.d.ts +64 -0
  53. package/dist/client/blocks/library/diagram.config.d.ts.map +1 -0
  54. package/dist/client/blocks/library/diagram.config.js +111 -0
  55. package/dist/client/blocks/library/diagram.config.js.map +1 -0
  56. package/dist/client/blocks/library/diagram.d.ts +16 -0
  57. package/dist/client/blocks/library/diagram.d.ts.map +1 -0
  58. package/dist/client/blocks/library/diagram.js +261 -0
  59. package/dist/client/blocks/library/diagram.js.map +1 -0
  60. package/dist/client/blocks/library/question-form.config.d.ts +69 -0
  61. package/dist/client/blocks/library/question-form.config.d.ts.map +1 -0
  62. package/dist/client/blocks/library/question-form.config.js +58 -0
  63. package/dist/client/blocks/library/question-form.config.js.map +1 -0
  64. package/dist/client/blocks/library/question-form.d.ts +20 -0
  65. package/dist/client/blocks/library/question-form.d.ts.map +1 -0
  66. package/dist/client/blocks/library/question-form.js +286 -0
  67. package/dist/client/blocks/library/question-form.js.map +1 -0
  68. package/dist/client/blocks/library/sanitize-html.d.ts +5 -0
  69. package/dist/client/blocks/library/sanitize-html.d.ts.map +1 -0
  70. package/dist/client/blocks/library/sanitize-html.js +240 -0
  71. package/dist/client/blocks/library/sanitize-html.js.map +1 -0
  72. package/dist/client/blocks/library/server-specs.d.ts.map +1 -1
  73. package/dist/client/blocks/library/server-specs.js +49 -0
  74. package/dist/client/blocks/library/server-specs.js.map +1 -1
  75. package/dist/client/blocks/library/specs.d.ts.map +1 -1
  76. package/dist/client/blocks/library/specs.js +9 -0
  77. package/dist/client/blocks/library/specs.js.map +1 -1
  78. package/dist/client/blocks/library/tabs.d.ts.map +1 -1
  79. package/dist/client/blocks/library/tabs.js +12 -12
  80. package/dist/client/blocks/library/tabs.js.map +1 -1
  81. package/dist/client/blocks/library/wireframe-kit.d.ts +260 -0
  82. package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -0
  83. package/dist/client/blocks/library/wireframe-kit.js +920 -0
  84. package/dist/client/blocks/library/wireframe-kit.js.map +1 -0
  85. package/dist/client/blocks/library/wireframe.config.d.ts +123 -0
  86. package/dist/client/blocks/library/wireframe.config.d.ts.map +1 -0
  87. package/dist/client/blocks/library/wireframe.config.js +311 -0
  88. package/dist/client/blocks/library/wireframe.config.js.map +1 -0
  89. package/dist/client/blocks/library/wireframe.d.ts +15 -0
  90. package/dist/client/blocks/library/wireframe.d.ts.map +1 -0
  91. package/dist/client/blocks/library/wireframe.js +206 -0
  92. package/dist/client/blocks/library/wireframe.js.map +1 -0
  93. package/dist/client/blocks/mdx.d.ts.map +1 -1
  94. package/dist/client/blocks/mdx.js +11 -0
  95. package/dist/client/blocks/mdx.js.map +1 -1
  96. package/dist/client/blocks/registry.d.ts +9 -0
  97. package/dist/client/blocks/registry.d.ts.map +1 -1
  98. package/dist/client/blocks/registry.js +12 -5
  99. package/dist/client/blocks/registry.js.map +1 -1
  100. package/dist/client/blocks/server.d.ts +1 -0
  101. package/dist/client/blocks/server.d.ts.map +1 -1
  102. package/dist/client/blocks/server.js +1 -0
  103. package/dist/client/blocks/server.js.map +1 -1
  104. package/dist/client/blocks/types.d.ts +8 -0
  105. package/dist/client/blocks/types.d.ts.map +1 -1
  106. package/dist/client/blocks/types.js.map +1 -1
  107. package/dist/client/rich-markdown-editor/DragHandle.d.ts.map +1 -1
  108. package/dist/client/rich-markdown-editor/DragHandle.js +112 -84
  109. package/dist/client/rich-markdown-editor/DragHandle.js.map +1 -1
  110. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -1
  111. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +1 -1
  112. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  113. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +9 -1
  114. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  115. package/dist/client/rich-markdown-editor/SharedRichEditor.js +3 -1
  116. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  117. package/dist/client/rich-markdown-editor/extensions.d.ts +13 -1
  118. package/dist/client/rich-markdown-editor/extensions.d.ts.map +1 -1
  119. package/dist/client/rich-markdown-editor/extensions.js +4 -2
  120. package/dist/client/rich-markdown-editor/extensions.js.map +1 -1
  121. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  122. package/dist/client/rich-markdown-editor/useCollabReconcile.js +11 -1
  123. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  124. package/dist/server/poll.d.ts.map +1 -1
  125. package/dist/server/poll.js +30 -14
  126. package/dist/server/poll.js.map +1 -1
  127. package/dist/styles/agent-native.css +1 -0
  128. package/dist/styles/blocks.css +1388 -0
  129. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +2 -0
  130. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +141 -0
  131. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +2 -0
  132. package/docs/content/plan-plugin.md +8 -8
  133. package/docs/content/pr-visual-recap.md +2 -2
  134. package/docs/content/template-plan.md +94 -17
  135. package/package.json +2 -1
  136. package/src/templates/default/.agents/skills/storing-data/SKILL.md +2 -0
  137. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +141 -0
  138. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +2 -0
  139. package/docs/content/visual-plans.md +0 -82
@@ -1 +1 @@
1
- {"version":3,"file":"DiffBlock.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/DiffBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState, type ReactNode } 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 AnnotationNoteRail,\n buildLineMarkerMap,\n hasRailAnnotations,\n resolveAnnotations,\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 text-[12px] 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 text-[12px] leading-5 text-foreground\";\n\nconst DEFAULT_VISIBLE_DIFF_LINES = 15;\nconst MAX_DIFF_LCS_CELLS = 1_000_000;\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 [activeIndex, setActiveIndex] = useState<number | 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 // 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 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 = mode === \"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 mode === \"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 return (\n <section className=\"plan-block group/diff-block\" data-block-id={blockId}>\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 <div\n className={cn(\n hasAnnotations &&\n \"grid items-start gap-3 md:grid-cols-[minmax(0,1fr)_minmax(190px,250px)]\",\n )}\n >\n <div className=\"overflow-hidden rounded-md border border-border bg-background\">\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 <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 </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 ) : mode === \"split\" ? (\n <SplitView\n rows={rows}\n language={language}\n rowLimit={rowLimit}\n markersForRow={markersForRow}\n activeIndex={activeIndex}\n onActiveChange={setActiveIndex}\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 onActiveChange={setActiveIndex}\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 {hasAnnotations && (\n <AnnotationNoteRail\n items={resolved}\n activeIndex={activeIndex}\n onActiveChange={setActiveIndex}\n ctx={ctx}\n showMarker\n />\n )}\n </div>\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 onActiveChange: (index: number | null) => 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/* ── Unified view ──────────────────────────────────────────────────────────── */\n\nfunction UnifiedView({\n rows,\n language,\n expanded,\n onToggleRun,\n markersForRow,\n anchoredRow,\n activeIndex,\n onActiveChange,\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 onActiveChange,\n showMarkerColumn,\n };\n let runIndex = 0;\n return (\n <div className=\"overflow-x-auto\">\n <div className=\"w-max min-w-full font-mono text-[13px] 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 onActiveChange,\n showMarkerColumn,\n}: {\n language: string;\n row: DiffRow;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onActiveChange: (index: number | null) => void;\n showMarkerColumn: boolean;\n}) {\n const markers = markersForRow(row);\n const info = rowMarkerInfo(markers, activeIndex);\n return (\n <div\n className={cn(\n \"flex min-h-5 min-w-full\",\n ROW_BG[row.kind],\n annotatedRowBg(info),\n )}\n onMouseEnter={info ? () => onActiveChange(info.primaryIndex) : undefined}\n onMouseLeave={info ? () => onActiveChange(null) : 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 marker={markers[0]?.marker} info={info} />\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 * When `marker` is undefined the cell is an empty spacer so every row in a diff\n * with annotations keeps its code text aligned.\n */\nfunction MarkerCell({\n marker,\n info,\n}: {\n marker?: number;\n info: { isActive: boolean } | null;\n}) {\n return (\n <span className=\"flex w-6 shrink-0 select-none items-center justify-center py-0\">\n {marker != null && info != null && (\n <AnnotationGutterMarker marker={marker} active={info.isActive} />\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 onActiveChange,\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 = { language, markersForRow, activeIndex, onActiveChange };\n return (\n <div className=\"flex w-full bg-background font-mono text-[12px] leading-5\">\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 onActiveChange,\n showMarkerColumn,\n}: {\n language: string;\n row?: DiffRow;\n side: RowSide;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onActiveChange: (index: number | null) => 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 return (\n <div\n className={cn(\n \"flex min-h-5 min-w-full\",\n ROW_BG[row.kind],\n annotatedRowBg(info),\n )}\n onMouseEnter={info ? () => onActiveChange(info.primaryIndex) : undefined}\n onMouseLeave={info ? () => onActiveChange(null) : 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 marker={markers[0]?.marker} info={info} />\n )}\n <DiffLineText text={row.text} language={language} />\n </div>\n );\n}\n\n/* ── Edit (panel) ──────────────────────────────────────────────────────────── */\n\nconst codeAreaClass = \"min-h-[140px] font-mono text-xs 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 useLayoutEffect,\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 {\n BlockEditProps,\n BlockReadProps,\n BlockRenderContext,\n} from \"../types.js\";\nimport type { DiffAnnotation, DiffData, DiffMode } from \"./diff.config.js\";\nimport {\n AnnotationGutterMarker,\n buildLineMarkerMap,\n hasRailAnnotations,\n rangeLabel,\n resolveAnnotations,\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-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-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 [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [containerRef, containerWidth] = useContainerWidth<HTMLElement>();\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. The right-margin popover works in both unified and\n // split, so annotations no longer force a mode; only a container narrower than\n // SPLIT_MIN_WIDTH falls back to unified so split's doubled gutters never crush\n // the code. `canSplit` also gates the mode toggle (hidden when unavailable).\n const narrow = containerWidth != null && containerWidth < SPLIT_MIN_WIDTH;\n const canSplit = !narrow;\n const effectiveMode: DiffMode = canSplit ? mode : \"unified\";\n\n // Annotation popover (diff): a marked line shows its note as a hover popover\n // pinned in the diff's right margin and aligned to that line — no inline notes\n // and no permanent side rail, so the code keeps its full width. A short\n // hover-intent delay lets the pointer travel from the line into the popover.\n const clearTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const handleActiveChange = useCallback((index: number | null) => {\n if (clearTimer.current) {\n clearTimeout(clearTimer.current);\n clearTimer.current = null;\n }\n if (index == null) {\n clearTimer.current = setTimeout(() => setActiveIndex(null), 120);\n } else {\n setActiveIndex(index);\n }\n }, []);\n useEffect(\n () => () => {\n if (clearTimer.current) clearTimeout(clearTimer.current);\n },\n [],\n );\n const activeAnnotation =\n activeIndex == null\n ? null\n : (resolved.find((r) => r.index === activeIndex && r.range) ?? null);\n // Vertical center of the active marker's anchor row within the section, so the\n // popover sits beside that line. Rows are in page flow (no inner vertical\n // scroll), so a DOM measure on activeIndex change is stable.\n const [popoverTop, setPopoverTop] = useState<number | null>(null);\n useLayoutEffect(() => {\n const host = containerRef.current;\n if (activeIndex == null || !host) {\n setPopoverTop(null);\n return;\n }\n const rowEl = host.querySelector<HTMLElement>(\n `[data-annot-row=\"${activeIndex}\"]`,\n );\n if (!rowEl) {\n setPopoverTop(null);\n return;\n }\n const hostRect = host.getBoundingClientRect();\n const rowRect = rowEl.getBoundingClientRect();\n setPopoverTop(rowRect.top - hostRect.top + rowRect.height / 2);\n }, [activeIndex, containerRef]);\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 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 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 {/* Code surface spans the full width; an annotated line shows its note as\n a hover popover pinned in the right margin, so nothing competes for it. */}\n <div className=\"overflow-hidden rounded-md border border-border bg-background\">\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: annotated diffs\n are unified-only (inline notes), and a narrow container forces\n unified, so the toggle would otherwise be a no-op. */}\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 onActiveChange={handleActiveChange}\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 onActiveChange={handleActiveChange}\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 {activeAnnotation && popoverTop != null && (\n <AnnotationPopover\n item={activeAnnotation}\n top={popoverTop}\n onActiveChange={handleActiveChange}\n ctx={ctx}\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 onActiveChange: (index: number | null) => 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 onActiveChange,\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 onActiveChange,\n showMarkerColumn,\n };\n let runIndex = 0;\n return (\n <div className=\"overflow-x-auto\">\n <div className=\"w-max min-w-full font-mono [font-size:var(--plan-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 onActiveChange,\n showMarkerColumn,\n}: {\n language: string;\n row: DiffRow;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onActiveChange: (index: number | null) => 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={info ? () => onActiveChange(info.primaryIndex) : undefined}\n onMouseLeave={info ? () => onActiveChange(null) : 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\n/**\n * The hover popover for a diff annotation, pinned in the diff's right margin and\n * vertically centered on the annotated line (`top` is measured by the caller).\n * It shows the marker pip, line range, optional label, and the markdown note —\n * beside the code instead of interrupting the diff flow — and keeps the\n * annotation active while hovered so the pointer can travel from line to note.\n */\nfunction AnnotationPopover({\n item,\n top,\n onActiveChange,\n ctx,\n}: {\n item: ResolvedAnnotation<DiffAnnotation>;\n top: number;\n onActiveChange: (index: number | null) => void;\n ctx: BlockRenderContext;\n}) {\n return (\n <div\n role=\"tooltip\"\n style={{ top }}\n onMouseEnter={() => onActiveChange(item.index)}\n onMouseLeave={() => onActiveChange(null)}\n className=\"absolute right-2 z-20 w-[min(17rem,calc(100%-3rem))] -translate-y-1/2 rounded-lg border border-amber-400/70 bg-background px-3 py-2.5 shadow-xl dark:border-amber-300/45\"\n >\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5\">\n <AnnotationGutterMarker marker={item.marker} active />\n <span className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {rangeLabel(item)}\n </span>\n {item.annotation.label && (\n <span className=\"text-[13px] font-semibold text-foreground\">\n {item.annotation.label}\n </span>\n )}\n </div>\n <div className=\"plan-annotation-note mt-1 text-[13px] leading-relaxed text-foreground/85\">\n {ctx.renderMarkdown ? (\n ctx.renderMarkdown(item.annotation.note)\n ) : (\n <p>{item.annotation.note}</p>\n )}\n </div>\n </div>\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 onActiveChange,\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 = { language, markersForRow, activeIndex, onActiveChange };\n return (\n <div className=\"flex w-full bg-background font-mono [font-size:var(--plan-code-size)] leading-5\">\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 onActiveChange,\n showMarkerColumn,\n}: {\n language: string;\n row?: DiffRow;\n side: RowSide;\n markersForRow: MarkersForRow;\n activeIndex: number | null;\n onActiveChange: (index: number | null) => 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={info ? () => onActiveChange(info.primaryIndex) : undefined}\n onMouseLeave={info ? () => onActiveChange(null) : 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 +1 @@
1
- {"version":3,"file":"FileTreeBlock.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/FileTreeBlock.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAEV,YAAY,EAEb,MAAM,uBAAuB,CAAC;AAmP/B;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE,cAAc,CAAC,YAAY,CAAC,2CAgP9B;AAMD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE,cAAc,CAAC,YAAY,CAAC,2CAgI9B"}
1
+ {"version":3,"file":"FileTreeBlock.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/FileTreeBlock.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAEV,YAAY,EAEb,MAAM,uBAAuB,CAAC;AAmP/B;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE,cAAc,CAAC,YAAY,CAAC,2CAwR9B;AAMD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE,cAAc,CAAC,YAAY,CAAC,2CAgI9B"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useMemo, useState } from "react";
2
+ import { useEffect, useMemo, useRef, useState } from "react";
3
3
  import { IconChevronRight, IconFile, IconFolder, IconFolderOpen, IconPlus, IconTrash, } from "@tabler/icons-react";
4
4
  import { cn } from "../../utils.js";
5
5
  import { FILE_TREE_CHANGES } from "./file-tree.config.js";
@@ -200,6 +200,33 @@ export function FileTreeRead({ data, blockId, title, summary, ctx, }) {
200
200
  [path]: !current[path],
201
201
  }));
202
202
  const toggleFile = (index) => setOpenFiles((current) => ({ ...current, [index]: !current[index] }));
203
+ // The recap "Files touched" left rail (only) widens into the document as a
204
+ // flyout while the tree is the reader's active focus AND a file's detail is
205
+ // open, then collapses back to a slim rail when they click elsewhere or close
206
+ // the last open file. `data-files-expanded` on the root drives the rail width
207
+ // via CSS (`:has()`); it is inert anywhere the tree renders inline.
208
+ const rootRef = useRef(null);
209
+ const [active, setActive] = useState(false);
210
+ const anyFileOpen = useMemo(() => Object.values(openFiles).some(Boolean), [openFiles]);
211
+ const railExpanded = active && anyFileOpen;
212
+ useEffect(() => {
213
+ if (!railExpanded)
214
+ return;
215
+ const onPointerDown = (event) => {
216
+ const root = rootRef.current;
217
+ if (root &&
218
+ event.target instanceof Node &&
219
+ !root.contains(event.target)) {
220
+ // Clicking away collapses the rail and closes any open file detail, so
221
+ // it returns to the clean slim state rather than leaving notes open in
222
+ // the cramped width.
223
+ setActive(false);
224
+ setOpenFiles({});
225
+ }
226
+ };
227
+ document.addEventListener("pointerdown", onPointerDown, true);
228
+ return () => document.removeEventListener("pointerdown", onPointerDown, true);
229
+ }, [railExpanded]);
203
230
  // Change tally for the summary header.
204
231
  const counts = useMemo(() => {
205
232
  const tally = { added: 0, modified: 0, removed: 0, renamed: 0 };
@@ -219,15 +246,15 @@ export function FileTreeRead({ data, blockId, title, summary, ctx, }) {
219
246
  const indent = depth * INDENT_STEP;
220
247
  if (node.kind === "folder") {
221
248
  const collapsed = collapsedFolders[node.path] ?? false;
222
- return (_jsx("div", { children: _jsxs("button", { type: "button", "data-plan-interactive": true, "aria-expanded": !collapsed, onClick: () => toggleFolder(node.path), style: { paddingLeft: indent + 8 }, className: "flex w-full items-center gap-1.5 rounded-md py-1 pr-2 text-left text-sm transition-colors hover:bg-accent/40", children: [_jsx(IconChevronRight, { className: cn("size-3.5 shrink-0 text-plan-muted transition-transform", !collapsed && "rotate-90") }), collapsed ? (_jsx(IconFolder, { className: "size-4 shrink-0 text-plan-muted" })) : (_jsx(IconFolderOpen, { className: "size-4 shrink-0 text-plan-muted" })), _jsx("span", { className: "min-w-0 truncate font-medium text-plan-text", children: node.name })] }) }, `d:${node.path}`));
249
+ return (_jsx("div", { children: _jsxs("button", { type: "button", "data-plan-interactive": true, "aria-expanded": !collapsed, onClick: () => toggleFolder(node.path), style: { paddingLeft: indent + 8 }, className: "flex w-full items-center gap-1.5 rounded-md py-1 pr-2 text-left text-[13px] transition-colors hover:bg-accent/40", children: [_jsx(IconChevronRight, { className: cn("size-3.5 shrink-0 text-plan-muted transition-transform", !collapsed && "rotate-90") }), collapsed ? (_jsx(IconFolder, { className: "size-4 shrink-0 text-plan-muted" })) : (_jsx(IconFolderOpen, { className: "size-4 shrink-0 text-plan-muted" })), _jsx("span", { className: "min-w-0 truncate font-medium text-plan-text", children: node.name })] }) }, `d:${node.path}`));
223
250
  }
224
251
  const { entry } = node;
225
252
  const change = entry.change;
226
253
  const hasDetail = Boolean(entry.note?.trim() || entry.snippet?.trim());
227
254
  const isOpen = openFiles[node.index] ?? false;
228
- return (_jsxs("div", { children: [_jsxs("button", { type: "button", "data-plan-interactive": true, disabled: !hasDetail, "aria-expanded": hasDetail ? isOpen : undefined, onClick: hasDetail ? () => toggleFile(node.index) : undefined, style: { paddingLeft: indent + 8 }, className: cn("group flex w-full items-center gap-1.5 rounded-md py-1 pr-2 text-left text-sm transition-colors", hasDetail ? "hover:bg-accent/40" : "cursor-default"), children: [hasDetail ? (_jsx(IconChevronRight, { className: cn("size-3.5 shrink-0 text-plan-muted transition-transform", isOpen && "rotate-90") })) : (_jsx("span", { className: "size-3.5 shrink-0", "aria-hidden": true })), _jsx(IconFile, { className: cn("size-4 shrink-0", change === "removed" ? "text-plan-muted" : "text-plan-muted/80") }), _jsx("span", { className: cn("min-w-0 truncate font-medium", change ? CHANGE_NAME_INK[change] : "text-plan-text"), children: node.name }), change && (_jsx("span", { title: CHANGE_LABEL[change], "aria-label": CHANGE_LABEL[change], className: cn("ml-1 flex size-4 shrink-0 items-center justify-center rounded text-[10px] font-bold leading-none", CHANGE_BADGE[change]), children: CHANGE_GLYPH[change] })), entry.note?.trim() && !isOpen && (_jsx("span", { className: "ml-1 min-w-0 flex-1 truncate text-xs text-plan-muted", children: entry.note }))] }), hasDetail && isOpen && (_jsxs("div", { style: { paddingLeft: indent + 8 + 20 }, className: "pb-2 pr-2 pt-0.5", children: [entry.note?.trim() && (_jsx("p", { className: "text-xs leading-relaxed text-plan-muted", children: entry.note })), entry.snippet?.trim() && (_jsx("div", { className: "mt-2 an-file-tree-snippet", children: ctx.renderMarkdown?.(fence(entry.snippet, fenceLanguage(entry))) }))] }))] }, `f:${node.index}`));
255
+ return (_jsxs("div", { children: [_jsxs("button", { type: "button", "data-plan-interactive": true, disabled: !hasDetail, "aria-expanded": hasDetail ? isOpen : undefined, onClick: hasDetail ? () => toggleFile(node.index) : undefined, style: { paddingLeft: indent + 8 }, className: cn("group flex w-full items-center gap-1.5 rounded-md py-1 pr-2 text-left text-[13px] transition-colors", hasDetail ? "hover:bg-accent/40" : "cursor-default"), children: [hasDetail ? (_jsx(IconChevronRight, { className: cn("size-3.5 shrink-0 text-plan-muted transition-transform", isOpen && "rotate-90") })) : (_jsx("span", { className: "size-3.5 shrink-0", "aria-hidden": true })), _jsx(IconFile, { className: cn("size-4 shrink-0", change === "removed" ? "text-plan-muted" : "text-plan-muted/80") }), _jsx("span", { className: cn("min-w-0 truncate font-medium", change ? CHANGE_NAME_INK[change] : "text-plan-text"), children: node.name }), change && (_jsx("span", { title: CHANGE_LABEL[change], "aria-label": CHANGE_LABEL[change], className: cn("ml-1 flex size-4 shrink-0 items-center justify-center rounded text-[10px] font-bold leading-none", CHANGE_BADGE[change]), children: CHANGE_GLYPH[change] })), entry.note?.trim() && !isOpen && (_jsx("span", { className: "ml-1 min-w-0 flex-1 truncate text-xs text-plan-muted", children: entry.note }))] }), hasDetail && isOpen && (_jsxs("div", { style: { paddingLeft: indent + 8 + 20 }, className: "pb-2 pr-2 pt-0.5", children: [entry.note?.trim() && (_jsx("p", { className: "text-xs leading-relaxed text-plan-muted", children: entry.note })), entry.snippet?.trim() && (_jsx("div", { className: "mt-2 an-file-tree-snippet", children: ctx.renderMarkdown?.(fence(entry.snippet, fenceLanguage(entry))) }))] }))] }, `f:${node.index}`));
229
256
  };
230
- return (_jsxs("section", { className: "plan-block", "data-block-id": blockId, children: [title && _jsx("div", { className: "plan-block-label", children: title }), _jsxs("div", { className: "overflow-hidden rounded-xl border border-plan-line bg-plan-block", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 border-b border-plan-line bg-accent/20 px-3 py-2", children: [data.title && (_jsx("span", { className: "text-sm font-semibold text-plan-text", children: data.title })), _jsxs("span", { className: "text-xs text-plan-muted", children: [entries.length, " ", entries.length === 1 ? "file" : "files"] }), changeTotal > 0 && (_jsxs("span", { className: "ml-auto flex items-center gap-2 font-mono text-xs", children: [counts.added > 0 && (_jsxs("span", { className: "text-emerald-600 dark:text-emerald-300", children: ["+", counts.added] })), counts.modified > 0 && (_jsxs("span", { className: "text-blue-600 dark:text-blue-300", children: ["~", counts.modified] })), counts.removed > 0 && (_jsxs("span", { className: "text-red-600 dark:text-red-300", children: ["\u2212", counts.removed] })), counts.renamed > 0 && (_jsxs("span", { className: "text-violet-600 dark:text-violet-300", children: ["\u00BB", counts.renamed] }))] }))] }), _jsx("div", { className: "py-1.5", children: tree.length > 0 ? (_jsxs(_Fragment, { children: [displayedRows.map(renderRow), shouldLimitRows && (_jsx("div", { className: "px-2 pt-1", children: _jsxs("button", { type: "button", "data-plan-interactive": true, "aria-expanded": showAllRows, onClick: () => setShowAllRows((current) => !current), className: "flex h-8 w-full items-center justify-center gap-1.5 rounded-md text-xs font-medium text-plan-muted transition-colors hover:bg-accent/40 hover:text-plan-text", children: [_jsx(IconChevronRight, { className: cn("size-3.5 shrink-0 transition-transform", showAllRows ? "-rotate-90" : "rotate-90") }), showAllRows
257
+ return (_jsxs("section", { ref: rootRef, className: "plan-block", "data-block-id": blockId, "data-files-expanded": railExpanded ? "" : undefined, onPointerDown: () => setActive(true), children: [title && _jsx("div", { className: "plan-block-label", children: title }), _jsxs("div", { className: "overflow-hidden rounded-xl border border-plan-line bg-plan-block", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 border-b border-plan-line bg-accent/20 px-3 py-2", children: [data.title && (_jsx("span", { className: "text-[13px] font-semibold text-plan-text", children: data.title })), _jsxs("span", { className: "text-xs text-plan-muted", children: [entries.length, " ", entries.length === 1 ? "file" : "files"] }), changeTotal > 0 && (_jsxs("span", { className: "ml-auto flex items-center gap-2 font-mono text-xs", children: [counts.added > 0 && (_jsxs("span", { className: "text-emerald-600 dark:text-emerald-300", children: ["+", counts.added] })), counts.modified > 0 && (_jsxs("span", { className: "text-blue-600 dark:text-blue-300", children: ["~", counts.modified] })), counts.removed > 0 && (_jsxs("span", { className: "text-red-600 dark:text-red-300", children: ["\u2212", counts.removed] })), counts.renamed > 0 && (_jsxs("span", { className: "text-violet-600 dark:text-violet-300", children: ["\u00BB", counts.renamed] }))] }))] }), _jsx("div", { className: "py-1.5", children: tree.length > 0 ? (_jsxs(_Fragment, { children: [displayedRows.map(renderRow), shouldLimitRows && (_jsx("div", { className: "px-2 pt-1", children: _jsxs("button", { type: "button", "data-plan-interactive": true, "aria-expanded": showAllRows, onClick: () => setShowAllRows((current) => !current), className: "flex h-8 w-full items-center justify-center gap-1.5 rounded-md text-xs font-medium text-plan-muted transition-colors hover:bg-accent/40 hover:text-plan-text", children: [_jsx(IconChevronRight, { className: cn("size-3.5 shrink-0 transition-transform", showAllRows ? "-rotate-90" : "rotate-90") }), showAllRows
231
258
  ? "Show fewer"
232
259
  : `Show all ${visibleRows.length} rows`] }) }))] })) : (_jsx("p", { className: "px-3 py-2 text-xs text-plan-muted", children: "No files yet." })) })] }), summary && _jsx("p", { className: "mt-5 text-plan-muted", children: summary })] }));
233
260
  }