@agent-native/core 0.43.0 → 0.44.1

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 (124) hide show
  1. package/dist/chat-threads/store.d.ts.map +1 -1
  2. package/dist/chat-threads/store.js +71 -10
  3. package/dist/chat-threads/store.js.map +1 -1
  4. package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
  5. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  6. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  7. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  8. package/dist/cli/recap.d.ts +23 -0
  9. package/dist/cli/recap.d.ts.map +1 -1
  10. package/dist/cli/recap.js +177 -13
  11. package/dist/cli/recap.js.map +1 -1
  12. package/dist/cli/skills.d.ts +3 -3
  13. package/dist/cli/skills.d.ts.map +1 -1
  14. package/dist/cli/skills.js +67 -20
  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 +0 -2
  20. package/dist/client/blocks/index.d.ts.map +1 -1
  21. package/dist/client/blocks/index.js +0 -2
  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 +22 -9
  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 +113 -13
  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 +63 -35
  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 +4 -0
  34. package/dist/client/blocks/library/FileTreeBlock.js.map +1 -1
  35. package/dist/client/blocks/library/JsonExplorerBlock.d.ts.map +1 -1
  36. package/dist/client/blocks/library/JsonExplorerBlock.js +1 -1
  37. package/dist/client/blocks/library/JsonExplorerBlock.js.map +1 -1
  38. package/dist/client/blocks/library/MermaidBlock.d.ts.map +1 -1
  39. package/dist/client/blocks/library/MermaidBlock.js +22 -3
  40. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  41. package/dist/client/blocks/library/annotation-rail.d.ts +85 -19
  42. package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
  43. package/dist/client/blocks/library/annotation-rail.js +149 -27
  44. package/dist/client/blocks/library/annotation-rail.js.map +1 -1
  45. package/dist/client/blocks/library/code-tabs.js +1 -1
  46. package/dist/client/blocks/library/code-tabs.js.map +1 -1
  47. package/dist/client/blocks/library/diagram.d.ts +17 -0
  48. package/dist/client/blocks/library/diagram.d.ts.map +1 -1
  49. package/dist/client/blocks/library/diagram.js +47 -2
  50. package/dist/client/blocks/library/diagram.js.map +1 -1
  51. package/dist/client/blocks/library/server-specs.d.ts.map +1 -1
  52. package/dist/client/blocks/library/server-specs.js +0 -10
  53. package/dist/client/blocks/library/server-specs.js.map +1 -1
  54. package/dist/client/blocks/library/specs.d.ts.map +1 -1
  55. package/dist/client/blocks/library/specs.js +0 -2
  56. package/dist/client/blocks/library/specs.js.map +1 -1
  57. package/dist/client/blocks/library/wireframe.config.d.ts.map +1 -1
  58. package/dist/client/blocks/library/wireframe.config.js +19 -2
  59. package/dist/client/blocks/library/wireframe.config.js.map +1 -1
  60. package/dist/client/blocks/mdx.d.ts.map +1 -1
  61. package/dist/client/blocks/mdx.js +11 -0
  62. package/dist/client/blocks/mdx.js.map +1 -1
  63. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  64. package/dist/client/composer/TiptapComposer.js +13 -8
  65. package/dist/client/composer/TiptapComposer.js.map +1 -1
  66. package/dist/client/composer/pasted-text.d.ts +25 -0
  67. package/dist/client/composer/pasted-text.d.ts.map +1 -1
  68. package/dist/client/composer/pasted-text.js +86 -4
  69. package/dist/client/composer/pasted-text.js.map +1 -1
  70. package/dist/client/rich-markdown-editor/DragHandle.d.ts.map +1 -1
  71. package/dist/client/rich-markdown-editor/DragHandle.js +35 -72
  72. package/dist/client/rich-markdown-editor/DragHandle.js.map +1 -1
  73. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -1
  74. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +1 -1
  75. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  76. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +9 -1
  77. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  78. package/dist/client/rich-markdown-editor/SharedRichEditor.js +3 -1
  79. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  80. package/dist/client/rich-markdown-editor/extensions.d.ts +13 -1
  81. package/dist/client/rich-markdown-editor/extensions.d.ts.map +1 -1
  82. package/dist/client/rich-markdown-editor/extensions.js +4 -2
  83. package/dist/client/rich-markdown-editor/extensions.js.map +1 -1
  84. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  85. package/dist/client/rich-markdown-editor/useCollabReconcile.js +11 -1
  86. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  87. package/dist/db/migrations.d.ts +10 -0
  88. package/dist/db/migrations.d.ts.map +1 -1
  89. package/dist/db/migrations.js +32 -0
  90. package/dist/db/migrations.js.map +1 -1
  91. package/dist/server/og-fonts-data.d.ts +3 -0
  92. package/dist/server/og-fonts-data.d.ts.map +1 -0
  93. package/dist/server/og-fonts-data.js +9 -0
  94. package/dist/server/og-fonts-data.js.map +1 -0
  95. package/dist/server/og-fonts.d.ts +10 -0
  96. package/dist/server/og-fonts.d.ts.map +1 -0
  97. package/dist/server/og-fonts.js +58 -0
  98. package/dist/server/og-fonts.js.map +1 -0
  99. package/dist/server/poll.d.ts.map +1 -1
  100. package/dist/server/poll.js +30 -14
  101. package/dist/server/poll.js.map +1 -1
  102. package/dist/server/social-og-image.d.ts.map +1 -1
  103. package/dist/server/social-og-image.js +16 -5
  104. package/dist/server/social-og-image.js.map +1 -1
  105. package/dist/styles/blocks.css +121 -2
  106. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +2 -0
  107. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +141 -0
  108. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +2 -0
  109. package/dist/usage/store.d.ts +12 -0
  110. package/dist/usage/store.d.ts.map +1 -1
  111. package/dist/usage/store.js +35 -5
  112. package/dist/usage/store.js.map +1 -1
  113. package/package.json +1 -1
  114. package/src/templates/default/.agents/skills/storing-data/SKILL.md +2 -0
  115. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +141 -0
  116. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +2 -0
  117. package/dist/client/blocks/library/decision.config.d.ts +0 -37
  118. package/dist/client/blocks/library/decision.config.d.ts.map +0 -1
  119. package/dist/client/blocks/library/decision.config.js +0 -32
  120. package/dist/client/blocks/library/decision.config.js.map +0 -1
  121. package/dist/client/blocks/library/decision.d.ts +0 -19
  122. package/dist/client/blocks/library/decision.d.ts.map +0 -1
  123. package/dist/client/blocks/library/decision.js +0 -119
  124. package/dist/client/blocks/library/decision.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ApiEndpointBlock.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/ApiEndpointBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport {\n IconArrowNarrowRight,\n IconChevronRight,\n IconLock,\n IconPlus,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../../utils.js\";\nimport type { BlockEditProps, BlockReadProps } from \"../types.js\";\nimport type {\n ApiEndpointChange,\n ApiEndpointData,\n ApiEndpointMethod,\n ApiEndpointParam,\n ApiEndpointResponse,\n ApiParamLocation,\n} from \"./api-endpoint.config.js\";\nimport {\n API_ENDPOINT_CHANGES,\n API_ENDPOINT_METHODS,\n API_PARAM_LOCATIONS,\n} from \"./api-endpoint.config.js\";\nimport { JsonExplorerSurface } from \"./JsonExplorerBlock.js\";\nimport {\n DevBadge,\n DevInput,\n DevSwitch,\n DevTextarea,\n DevSelect,\n} from \"./dev-doc-ui.js\";\nimport { CodeSurface } from \"./HighlightedCode.js\";\n\n/**\n * Read + Edit renderers for an `api-endpoint` block — a Swagger / Stripe-style\n * API reference. Lives in core so any app can register the dev-doc block (no\n * shadcn import).\n */\n\n/* ── Theme-aware color tokens ──────────────────────────────────────────────── */\n\n/**\n * Method-pill palette. Tinted background + saturated text in BOTH modes (the\n * reference HTML hardcoded a dark-only palette — we deliberately avoid that).\n * Each entry keeps legible contrast against the plan surface under `.dark` and\n * light via Tailwind `dark:` variants.\n */\nconst METHOD_PILL: Record<ApiEndpointMethod, string> = {\n GET: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300\",\n POST: \"bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-300\",\n PUT: \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300\",\n PATCH:\n \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-300\",\n DELETE: \"bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-300\",\n HEAD: \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\",\n OPTIONS:\n \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\",\n};\n\n/** Location-badge palette for the params table `in` column. */\nconst PARAM_IN_BADGE: Record<ApiParamLocation, string> = {\n path: \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-300\",\n query: \"bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-300\",\n header:\n \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300\",\n body: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300\",\n};\n\n/** Status-pill palette keyed by the leading status digit (2xx/3xx/4xx/5xx). */\nfunction statusPillClass(status: string): string {\n const lead = status.trim().charAt(0);\n if (lead === \"2\")\n return \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300\";\n if (lead === \"4\")\n return \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300\";\n if (lead === \"5\")\n return \"bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-300\";\n // 3xx and everything else → neutral slate.\n return \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\";\n}\n\n/* ── Theme-aware change tokens (shared vocabulary with file-tree/data-model) ── */\n\n/**\n * Change-chip palette — IDENTICAL to `FileTreeBlock`'s `CHANGE_BADGE` so a route /\n * param / response chip reads the same as a file or field change chip elsewhere\n * in the recap. Tinted background + saturated text in BOTH the `.dark` plan theme\n * and light mode via Tailwind `dark:` variants (never a dark-only palette).\n */\nconst CHANGE_BADGE: Record<ApiEndpointChange, string> = {\n added:\n \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300\",\n modified: \"bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-300\",\n removed: \"bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-300\",\n renamed:\n \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-300\",\n};\n\n/** Single-letter glyph shown in the compact chip (VS Code gutter convention). */\nconst CHANGE_GLYPH: Record<ApiEndpointChange, string> = {\n added: \"A\",\n modified: \"M\",\n removed: \"D\",\n renamed: \"R\",\n};\n\n/** Human label for the chip text + its `title` / `aria-label`. */\nconst CHANGE_LABEL: Record<ApiEndpointChange, string> = {\n added: \"Added\",\n modified: \"Modified\",\n removed: \"Removed\",\n renamed: \"Renamed\",\n};\n\n/** Accent ink echoing a change color, for the name/path it applies to. */\nconst CHANGE_INK: Record<ApiEndpointChange, string> = {\n added: \"text-emerald-700 dark:text-emerald-300\",\n modified: \"text-blue-700 dark:text-blue-300\",\n removed: \"text-red-600 line-through dark:text-red-300\",\n renamed: \"text-violet-700 dark:text-violet-300\",\n};\n\n/**\n * A change chip: compact single-glyph badge (A/M/D/R) by default, or a labeled\n * pill (`variant=\"label\"`) for the endpoint header where there is room. Matches\n * the file-tree change badge so the recap reads consistently.\n */\nfunction ChangeChip({\n change,\n variant = \"glyph\",\n className,\n}: {\n change: ApiEndpointChange;\n variant?: \"glyph\" | \"label\";\n className?: string;\n}) {\n if (variant === \"label\") {\n return (\n <span\n title={CHANGE_LABEL[change]}\n className={cn(\n \"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-bold uppercase tracking-wide\",\n CHANGE_BADGE[change],\n className,\n )}\n >\n {CHANGE_LABEL[change]}\n </span>\n );\n }\n return (\n <span\n title={CHANGE_LABEL[change]}\n aria-label={CHANGE_LABEL[change]}\n className={cn(\n \"flex size-4 shrink-0 items-center justify-center rounded text-[10px] font-bold leading-none\",\n CHANGE_BADGE[change],\n className,\n )}\n >\n {CHANGE_GLYPH[change]}\n </span>\n );\n}\n\n/**\n * Before → after for a modified param: the prior `was` value struck through, a\n * narrow arrow, then the current value (e.g. `optional → required`, or the old\n * type → the new type). When `was` is absent we just show the current value.\n */\nfunction WasArrowCurrent({\n was,\n current,\n}: {\n was?: string;\n current: React.ReactNode;\n}) {\n if (!was) return <>{current}</>;\n return (\n <span className=\"inline-flex items-center gap-1\">\n <span className=\"text-plan-muted line-through\">{was}</span>\n <IconArrowNarrowRight className=\"size-3 shrink-0 text-plan-muted\" />\n {current}\n </span>\n );\n}\n\n/**\n * A param carries a single `was` (prior value) for a `modified` change, but that\n * value may describe either the required flag or the type. Decide which column\n * the before→after belongs to: a `was` of `required`/`optional` is a required\n * flag flip; anything else is treated as the prior type.\n */\nfunction wasIsRequiredFlag(was: string): boolean {\n const v = was.trim().toLowerCase();\n return v === \"required\" || v === \"optional\";\n}\n\n/** Guess a fence language from a content type so examples highlight nicely. */\nfunction fenceLangForContentType(contentType?: string): string {\n const ct = (contentType ?? \"\").toLowerCase();\n if (ct.includes(\"json\")) return \"json\";\n if (ct.includes(\"xml\") || ct.includes(\"html\")) return \"html\";\n if (ct.includes(\"yaml\") || ct.includes(\"yml\")) return \"yaml\";\n return \"json\";\n}\n\nfunction shouldUseJsonExplorer(example: string, contentType?: string): boolean {\n const ct = (contentType ?? \"\").toLowerCase();\n if (contentType && !ct.includes(\"json\")) return false;\n try {\n JSON.parse(example);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction ApiExample({\n example,\n contentType,\n className,\n}: {\n example: string;\n contentType?: string;\n className?: string;\n}) {\n if (shouldUseJsonExplorer(example, contentType)) {\n return (\n <JsonExplorerSurface\n data={{ json: example, collapsedDepth: 2 }}\n className={className}\n />\n );\n }\n\n return (\n <CodeSurface\n code={example}\n language={fenceLangForContentType(contentType)}\n className={className}\n />\n );\n}\n\n/* ── Read (collapsed-by-default swagger row) ───────────────────────────────── */\n\n/**\n * Read-only renderer for an `api-endpoint` block. Collapsed by default: a single\n * row with a colored method pill, monospace path, muted summary, and a chevron.\n * Clicking the row expands the full reference (description, params table,\n * request body, responses) — the Swagger / Stripe house style. Every colored\n * element is theme-aware (`dark:` variants), so it reads correctly in both the\n * `.dark` plan theme and light mode.\n */\nexport function ApiEndpointRead({\n data,\n blockId,\n title,\n summary,\n ctx,\n}: BlockReadProps<ApiEndpointData>) {\n const [open, setOpen] = useState(false);\n\n const params = data.params ?? [];\n const responses = data.responses ?? [];\n const hasRequest = Boolean(\n data.request?.example || data.request?.contentType,\n );\n const hasBody =\n Boolean(data.description?.trim()) ||\n params.length > 0 ||\n hasRequest ||\n responses.length > 0 ||\n Boolean(data.auth);\n\n return (\n <section className=\"plan-block\" data-block-id={blockId}>\n {title && <div className=\"plan-block-label\">{title}</div>}\n <div className=\"overflow-hidden rounded-xl border border-plan-line bg-plan-block\">\n {/* Collapsed summary row — the whole row toggles. */}\n <button\n type=\"button\"\n data-plan-interactive\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className={cn(\n \"flex w-full items-center gap-3 px-4 py-3 text-left transition-colors\",\n \"hover:bg-accent/40\",\n )}\n >\n <IconChevronRight\n className={cn(\n \"size-4 shrink-0 text-plan-muted transition-transform\",\n open && \"rotate-90\",\n )}\n />\n <span\n className={cn(\n \"shrink-0 rounded-md px-2 py-1 font-mono text-xs font-bold uppercase tracking-wide\",\n METHOD_PILL[data.method],\n )}\n >\n {data.method}\n </span>\n <span\n className={cn(\n \"min-w-0 truncate font-mono text-sm font-semibold\",\n // `change` ink composes with `deprecated`: a deprecated route\n // still mutes/strikes its path; a changed route tints it (a\n // removed route also strikes via CHANGE_INK).\n data.change ? CHANGE_INK[data.change] : \"text-plan-text\",\n data.deprecated && \"text-plan-muted line-through\",\n )}\n >\n {data.path}\n </span>\n {data.change && <ChangeChip change={data.change} variant=\"label\" />}\n {data.deprecated && (\n <DevBadge className=\"shrink-0 border-amber-500/40 text-amber-600 dark:text-amber-300\">\n Deprecated\n </DevBadge>\n )}\n {(data.summary || summary) && (\n <span className=\"ml-1 min-w-0 flex-1 truncate text-sm text-plan-muted\">\n {data.summary || summary}\n </span>\n )}\n {data.auth && (\n <IconLock\n className=\"size-3.5 shrink-0 text-plan-muted\"\n aria-label=\"Requires authentication\"\n />\n )}\n </button>\n\n {/* Expanded body. */}\n {open && hasBody && (\n <div className=\"border-t border-plan-line px-4 py-4\">\n {data.auth && (\n <div className=\"mb-4 flex items-center gap-2 text-xs text-plan-muted\">\n <IconLock className=\"size-3.5 shrink-0\" />\n <span>\n <span className=\"font-medium text-plan-text\">Auth:</span>{\" \"}\n {data.auth}\n </span>\n </div>\n )}\n\n {data.description?.trim() && (\n <div className=\"an-api-endpoint-desc\">\n {ctx.renderMarkdown?.(data.description)}\n </div>\n )}\n\n {params.length > 0 && (\n <div className=\"mt-5\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-plan-muted\">\n Parameters\n </div>\n <div className=\"mt-2 overflow-hidden rounded-lg border border-plan-line\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"bg-accent/30 text-left text-xs uppercase tracking-wide text-plan-muted\">\n <th className=\"px-3 py-2 font-medium\">Name</th>\n <th className=\"px-3 py-2 font-medium\">In</th>\n <th className=\"px-3 py-2 font-medium\">Type</th>\n <th className=\"px-3 py-2 font-medium\">Required</th>\n <th className=\"px-3 py-2 font-medium\">Description</th>\n </tr>\n </thead>\n <tbody>\n {params.map((param, index) => {\n const change = param.change;\n // A `modified` `was` describes either the required flag\n // or the prior type; route it to the right column.\n const wasForRequired =\n change === \"modified\" &&\n param.was &&\n wasIsRequiredFlag(param.was)\n ? param.was\n : undefined;\n const wasForType =\n change === \"modified\" &&\n param.was &&\n !wasIsRequiredFlag(param.was)\n ? param.was\n : undefined;\n return (\n <tr\n key={`${param.name}-${index}`}\n className=\"border-t border-plan-line align-top\"\n >\n <td className=\"px-3 py-2 font-mono text-xs font-semibold\">\n <span className=\"flex items-center gap-1.5\">\n <span\n className={cn(\n change\n ? CHANGE_INK[change]\n : \"text-plan-text\",\n )}\n >\n {param.name}\n </span>\n {change && <ChangeChip change={change} />}\n </span>\n </td>\n <td className=\"px-3 py-2\">\n <span\n className={cn(\n \"rounded px-1.5 py-0.5 font-mono text-[11px] font-semibold\",\n PARAM_IN_BADGE[param.in],\n )}\n >\n {param.in}\n </span>\n </td>\n <td className=\"px-3 py-2 font-mono text-xs text-plan-muted\">\n <WasArrowCurrent\n was={wasForType}\n current={\n <span\n className={cn(\n wasForType && \"text-plan-text\",\n )}\n >\n {param.type || \"—\"}\n </span>\n }\n />\n </td>\n <td className=\"px-3 py-2 text-xs\">\n <WasArrowCurrent\n was={wasForRequired}\n current={\n param.required ? (\n <span className=\"font-medium text-red-600 dark:text-red-300\">\n required\n </span>\n ) : (\n <span className=\"text-plan-muted\">\n optional\n </span>\n )\n }\n />\n </td>\n <td className=\"px-3 py-2 text-xs text-plan-muted\">\n {param.description || \"—\"}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {hasRequest && (\n <div className=\"mt-5\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-plan-muted\">\n Request body\n </span>\n {data.request?.contentType && (\n <span className=\"rounded bg-accent/40 px-1.5 py-0.5 font-mono text-[11px] text-plan-muted\">\n {data.request.contentType}\n </span>\n )}\n </div>\n {data.request?.example && (\n <ApiExample\n example={data.request.example}\n contentType={data.request.contentType}\n className=\"mt-2 an-api-endpoint-example\"\n />\n )}\n </div>\n )}\n\n {responses.length > 0 && (\n <div className=\"mt-5\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-plan-muted\">\n Responses\n </div>\n <div className=\"mt-2 flex flex-col gap-3\">\n {responses.map((response, index) => (\n <div\n key={`${response.status}-${index}`}\n className=\"rounded-lg border border-plan-line\"\n >\n <div className=\"flex items-center gap-2 px-3 py-2\">\n <span\n className={cn(\n \"rounded px-2 py-0.5 font-mono text-xs font-bold\",\n statusPillClass(response.status),\n )}\n >\n {response.status}\n </span>\n {response.description && (\n <span\n className={cn(\n \"text-sm\",\n response.change\n ? CHANGE_INK[response.change]\n : \"text-plan-muted\",\n )}\n >\n {response.description}\n </span>\n )}\n {response.change && (\n <ChangeChip\n change={response.change}\n variant=\"label\"\n className=\"ml-auto\"\n />\n )}\n </div>\n {response.example && (\n <div className=\"border-t border-plan-line px-3 pb-3 pt-3 an-api-endpoint-example\">\n <ApiExample\n example={response.example}\n className=\"mt-0\"\n />\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </section>\n );\n}\n\n/* ── Edit (panel form) ─────────────────────────────────────────────────────── */\n\nconst fieldLabelClass = \"text-xs font-medium text-muted-foreground\";\n\n/**\n * Options for a change `DevSelect` — a leading \"No change\" entry (decodes to\n * `undefined`) plus the four diff states, mirroring the file-tree editor.\n */\nconst CHANGE_SELECT_OPTIONS = [\n { value: \"none\", label: \"No change\" },\n ...API_ENDPOINT_CHANGES.map((change) => ({\n value: change,\n label: CHANGE_LABEL[change],\n })),\n];\n\n/**\n * Panel editor for an `api-endpoint` block. A property form: method (Select),\n * path/summary/auth (Input), description (Textarea), deprecated (Switch), plus\n * repeatable rows for params and responses (add/remove) and a request-body\n * textarea. Renders BARE content (no `<section>`); the registry's panel surface\n * supplies the popover chrome.\n */\nexport function ApiEndpointEdit({\n data,\n onChange,\n editable,\n}: BlockEditProps<ApiEndpointData>) {\n const params = data.params ?? [];\n const responses = data.responses ?? [];\n\n const patch = (next: Partial<ApiEndpointData>) =>\n onChange({ ...data, ...next });\n\n const updateParam = (index: number, next: Partial<ApiEndpointParam>) =>\n patch({\n params: params.map((param, i) =>\n i === index ? { ...param, ...next } : param,\n ),\n });\n\n const removeParam = (index: number) =>\n patch({ params: params.filter((_, i) => i !== index) });\n\n const addParam = () =>\n patch({\n params: [...params, { name: \"param\", in: \"query\" as ApiParamLocation }],\n });\n\n const updateResponse = (index: number, next: Partial<ApiEndpointResponse>) =>\n patch({\n responses: responses.map((response, i) =>\n i === index ? { ...response, ...next } : response,\n ),\n });\n\n const removeResponse = (index: number) =>\n patch({ responses: responses.filter((_, i) => i !== index) });\n\n const addResponse = () =>\n patch({ responses: [...responses, { status: \"200\" }] });\n\n const updateRequest = (next: Partial<ApiEndpointData[\"request\"]>) => {\n const merged = { ...(data.request ?? {}), ...next };\n const empty = !merged.contentType && !merged.example;\n patch({ request: empty ? undefined : merged });\n };\n\n return (\n <div className=\"flex flex-col gap-4\" data-plan-interactive>\n <div className=\"grid grid-cols-[120px_minmax(0,1fr)] gap-2\">\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Method</span>\n <DevSelect\n className=\"h-9\"\n value={data.method}\n disabled={!editable}\n onValueChange={(value) =>\n patch({ method: value as ApiEndpointMethod })\n }\n options={API_ENDPOINT_METHODS.map((method) => ({\n value: method,\n label: method,\n }))}\n />\n </label>\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Path</span>\n <DevInput\n className=\"h-9 font-mono\"\n value={data.path}\n disabled={!editable}\n placeholder=\"/api/resource\"\n onChange={(event) => patch({ path: event.target.value })}\n />\n </label>\n </div>\n\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Summary</span>\n <DevInput\n className=\"h-9\"\n value={data.summary ?? \"\"}\n disabled={!editable}\n placeholder=\"Short one-line description\"\n onChange={(event) =>\n patch({ summary: event.target.value || undefined })\n }\n />\n </label>\n\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Description (markdown)</span>\n <DevTextarea\n className=\"min-h-[80px]\"\n value={data.description ?? \"\"}\n disabled={!editable}\n placeholder=\"Longer description, rendered as markdown\"\n onChange={(event) =>\n patch({ description: event.target.value || undefined })\n }\n />\n </label>\n\n <div className=\"grid grid-cols-[minmax(0,1fr)_120px_auto] items-end gap-3\">\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Auth</span>\n <DevInput\n className=\"h-9\"\n value={data.auth ?? \"\"}\n disabled={!editable}\n placeholder=\"e.g. Bearer token\"\n onChange={(event) =>\n patch({ auth: event.target.value || undefined })\n }\n />\n </label>\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Change</span>\n <DevSelect\n className=\"h-9\"\n value={data.change ?? \"none\"}\n disabled={!editable}\n onValueChange={(value) =>\n patch({\n change:\n value === \"none\" ? undefined : (value as ApiEndpointChange),\n })\n }\n options={CHANGE_SELECT_OPTIONS}\n />\n </label>\n <label className=\"flex items-center gap-2 pb-2\">\n <DevSwitch\n checked={Boolean(data.deprecated)}\n disabled={!editable}\n onCheckedChange={(checked) =>\n patch({ deprecated: checked || undefined })\n }\n />\n <span className={fieldLabelClass}>Deprecated</span>\n </label>\n </div>\n\n {/* Params */}\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <span className={fieldLabelClass}>Parameters</span>\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n className=\"flex items-center gap-1 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n onClick={addParam}\n >\n <IconPlus className=\"size-3.5\" />\n Add\n </button>\n )}\n </div>\n {params.map((param, index) => (\n <div\n key={index}\n className=\"flex flex-col gap-2 rounded-md border border-input p-2\"\n >\n <div className=\"grid grid-cols-[minmax(0,1fr)_96px_auto] gap-2\">\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={param.name}\n disabled={!editable}\n placeholder=\"name\"\n onChange={(event) =>\n updateParam(index, { name: event.target.value })\n }\n />\n <DevSelect\n className=\"h-8\"\n value={param.in}\n disabled={!editable}\n onValueChange={(value) =>\n updateParam(index, { in: value as ApiParamLocation })\n }\n options={API_PARAM_LOCATIONS.map((location) => ({\n value: location,\n label: location,\n }))}\n />\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-label=\"Remove parameter\"\n className=\"flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n onClick={() => removeParam(index)}\n >\n <IconTrash className=\"size-4\" />\n </button>\n )}\n </div>\n <div className=\"grid grid-cols-[minmax(0,1fr)_auto] items-center gap-2\">\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={param.type ?? \"\"}\n disabled={!editable}\n placeholder=\"type (e.g. string)\"\n onChange={(event) =>\n updateParam(index, { type: event.target.value || undefined })\n }\n />\n <label className=\"flex items-center gap-1.5 whitespace-nowrap text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 cursor-pointer accent-primary\"\n checked={Boolean(param.required)}\n disabled={!editable}\n onChange={(event) =>\n updateParam(index, {\n required: event.target.checked || undefined,\n })\n }\n />\n Required\n </label>\n </div>\n <DevInput\n className=\"h-8 text-xs\"\n value={param.description ?? \"\"}\n disabled={!editable}\n placeholder=\"description\"\n onChange={(event) =>\n updateParam(index, {\n description: event.target.value || undefined,\n })\n }\n />\n {/* Diff state: change kind + the prior value (`was`) shown\n struck-through before the current one when \"modified\". */}\n <div className=\"grid grid-cols-[120px_minmax(0,1fr)] gap-2\">\n <DevSelect\n className=\"h-8\"\n value={param.change ?? \"none\"}\n disabled={!editable}\n onValueChange={(value) =>\n updateParam(index, {\n change:\n value === \"none\"\n ? undefined\n : (value as ApiEndpointChange),\n })\n }\n options={CHANGE_SELECT_OPTIONS}\n />\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={param.was ?? \"\"}\n disabled={!editable || param.change !== \"modified\"}\n placeholder=\"was (e.g. optional, or old type)\"\n onChange={(event) =>\n updateParam(index, { was: event.target.value || undefined })\n }\n />\n </div>\n </div>\n ))}\n </div>\n\n {/* Request body */}\n <div className=\"flex flex-col gap-2\">\n <span className={fieldLabelClass}>Request body</span>\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={data.request?.contentType ?? \"\"}\n disabled={!editable}\n placeholder=\"content type (e.g. application/json)\"\n onChange={(event) =>\n updateRequest({ contentType: event.target.value || undefined })\n }\n />\n <DevTextarea\n className=\"min-h-[80px] font-mono text-xs\"\n value={data.request?.example ?? \"\"}\n disabled={!editable}\n placeholder='{ \"example\": \"request body\" }'\n onChange={(event) =>\n updateRequest({ example: event.target.value || undefined })\n }\n />\n </div>\n\n {/* Responses */}\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <span className={fieldLabelClass}>Responses</span>\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n className=\"flex items-center gap-1 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n onClick={addResponse}\n >\n <IconPlus className=\"size-3.5\" />\n Add\n </button>\n )}\n </div>\n {responses.map((response, index) => (\n <div\n key={index}\n className=\"flex flex-col gap-2 rounded-md border border-input p-2\"\n >\n <div className=\"grid grid-cols-[96px_minmax(0,1fr)_auto] gap-2\">\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={response.status}\n disabled={!editable}\n placeholder=\"200\"\n onChange={(event) =>\n updateResponse(index, { status: event.target.value })\n }\n />\n <DevInput\n className=\"h-8 text-xs\"\n value={response.description ?? \"\"}\n disabled={!editable}\n placeholder=\"description\"\n onChange={(event) =>\n updateResponse(index, {\n description: event.target.value || undefined,\n })\n }\n />\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-label=\"Remove response\"\n className=\"flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n onClick={() => removeResponse(index)}\n >\n <IconTrash className=\"size-4\" />\n </button>\n )}\n </div>\n <DevTextarea\n className=\"min-h-[64px] font-mono text-xs\"\n value={response.example ?? \"\"}\n disabled={!editable}\n placeholder='{ \"example\": \"response body\" }'\n onChange={(event) =>\n updateResponse(index, {\n example: event.target.value || undefined,\n })\n }\n />\n <label className=\"flex items-center gap-2\">\n <span className={fieldLabelClass}>Change</span>\n <DevSelect\n className=\"h-8 w-[120px]\"\n value={response.change ?? \"none\"}\n disabled={!editable}\n onValueChange={(value) =>\n updateResponse(index, {\n change:\n value === \"none\"\n ? undefined\n : (value as ApiEndpointChange),\n })\n }\n options={CHANGE_SELECT_OPTIONS}\n />\n </label>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ApiEndpointBlock.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/ApiEndpointBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport {\n IconArrowNarrowRight,\n IconChevronRight,\n IconLock,\n IconPlus,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../../utils.js\";\nimport type { BlockEditProps, BlockReadProps } from \"../types.js\";\nimport type {\n ApiEndpointChange,\n ApiEndpointData,\n ApiEndpointMethod,\n ApiEndpointParam,\n ApiEndpointResponse,\n ApiParamLocation,\n} from \"./api-endpoint.config.js\";\nimport {\n API_ENDPOINT_CHANGES,\n API_ENDPOINT_METHODS,\n API_PARAM_LOCATIONS,\n} from \"./api-endpoint.config.js\";\nimport { JsonExplorerSurface } from \"./JsonExplorerBlock.js\";\nimport {\n DevBadge,\n DevInput,\n DevSwitch,\n DevTextarea,\n DevSelect,\n} from \"./dev-doc-ui.js\";\n\n/**\n * Read + Edit renderers for an `api-endpoint` block — a Swagger / Stripe-style\n * API reference. Lives in core so any app can register the dev-doc block (no\n * shadcn import).\n */\n\n/* ── Theme-aware color tokens ──────────────────────────────────────────────── */\n\n/**\n * Method-pill palette. Tinted background + saturated text in BOTH modes (the\n * reference HTML hardcoded a dark-only palette — we deliberately avoid that).\n * Each entry keeps legible contrast against the plan surface under `.dark` and\n * light via Tailwind `dark:` variants.\n */\nconst METHOD_PILL: Record<ApiEndpointMethod, string> = {\n GET: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300\",\n POST: \"bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-300\",\n PUT: \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300\",\n PATCH:\n \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-300\",\n DELETE: \"bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-300\",\n HEAD: \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\",\n OPTIONS:\n \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\",\n};\n\n/** Location-badge palette for the params table `in` column. */\nconst PARAM_IN_BADGE: Record<ApiParamLocation, string> = {\n path: \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-300\",\n query: \"bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-300\",\n header:\n \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300\",\n body: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300\",\n};\n\n/** Status-pill palette keyed by the leading status digit (2xx/3xx/4xx/5xx). */\nfunction statusPillClass(status: string): string {\n const lead = status.trim().charAt(0);\n if (lead === \"2\")\n return \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300\";\n if (lead === \"4\")\n return \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300\";\n if (lead === \"5\")\n return \"bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-300\";\n // 3xx and everything else → neutral slate.\n return \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\";\n}\n\n/* ── Theme-aware change tokens (shared vocabulary with file-tree/data-model) ── */\n\n/**\n * Change-chip palette — IDENTICAL to `FileTreeBlock`'s `CHANGE_BADGE` so a route /\n * param / response chip reads the same as a file or field change chip elsewhere\n * in the recap. Tinted background + saturated text in BOTH the `.dark` plan theme\n * and light mode via Tailwind `dark:` variants (never a dark-only palette).\n */\nconst CHANGE_BADGE: Record<ApiEndpointChange, string> = {\n added:\n \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300\",\n modified: \"bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-300\",\n removed: \"bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-300\",\n renamed:\n \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-300\",\n};\n\n/** Single-letter glyph shown in the compact chip (VS Code gutter convention). */\nconst CHANGE_GLYPH: Record<ApiEndpointChange, string> = {\n added: \"A\",\n modified: \"M\",\n removed: \"D\",\n renamed: \"R\",\n};\n\n/** Human label for the chip text + its `title` / `aria-label`. */\nconst CHANGE_LABEL: Record<ApiEndpointChange, string> = {\n added: \"Added\",\n modified: \"Modified\",\n removed: \"Removed\",\n renamed: \"Renamed\",\n};\n\n/** Accent ink echoing a change color, for the name/path it applies to. */\nconst CHANGE_INK: Record<ApiEndpointChange, string> = {\n added: \"text-emerald-700 dark:text-emerald-300\",\n modified: \"text-blue-700 dark:text-blue-300\",\n removed: \"text-red-600 line-through dark:text-red-300\",\n renamed: \"text-violet-700 dark:text-violet-300\",\n};\n\n/**\n * A change chip: compact single-glyph badge (A/M/D/R) by default, or a labeled\n * pill (`variant=\"label\"`) for the endpoint header where there is room. Matches\n * the file-tree change badge so the recap reads consistently.\n */\nfunction ChangeChip({\n change,\n variant = \"glyph\",\n className,\n}: {\n change: ApiEndpointChange;\n variant?: \"glyph\" | \"label\";\n className?: string;\n}) {\n if (variant === \"label\") {\n return (\n <span\n title={CHANGE_LABEL[change]}\n className={cn(\n \"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-bold uppercase tracking-wide\",\n CHANGE_BADGE[change],\n className,\n )}\n >\n {CHANGE_LABEL[change]}\n </span>\n );\n }\n return (\n <span\n title={CHANGE_LABEL[change]}\n aria-label={CHANGE_LABEL[change]}\n className={cn(\n \"flex size-4 shrink-0 items-center justify-center rounded text-[10px] font-bold leading-none\",\n CHANGE_BADGE[change],\n className,\n )}\n >\n {CHANGE_GLYPH[change]}\n </span>\n );\n}\n\n/**\n * Before → after for a modified param: the prior `was` value struck through, a\n * narrow arrow, then the current value (e.g. `optional → required`, or the old\n * type → the new type). When `was` is absent we just show the current value.\n */\nfunction WasArrowCurrent({\n was,\n current,\n}: {\n was?: string;\n current: React.ReactNode;\n}) {\n if (!was) return <>{current}</>;\n return (\n <span className=\"inline-flex items-center gap-1\">\n <span className=\"text-plan-muted line-through\">{was}</span>\n <IconArrowNarrowRight className=\"size-3 shrink-0 text-plan-muted\" />\n {current}\n </span>\n );\n}\n\n/**\n * A param carries a single `was` (prior value) for a `modified` change, but that\n * value may describe either the required flag or the type. Decide which column\n * the before→after belongs to: a `was` of `required`/`optional` is a required\n * flag flip; anything else is treated as the prior type.\n */\nfunction wasIsRequiredFlag(was: string): boolean {\n const v = was.trim().toLowerCase();\n return v === \"required\" || v === \"optional\";\n}\n\n/** Guess a fence language from a content type so examples highlight nicely. */\nfunction fenceLangForContentType(contentType?: string): string {\n const ct = (contentType ?? \"\").toLowerCase();\n if (ct.includes(\"xml\") || ct.includes(\"html\")) return \"html\";\n if (ct.includes(\"yaml\") || ct.includes(\"yml\")) return \"yaml\";\n return \"json\";\n}\n\n/**\n * Strip JSONC niceties so an otherwise-valid-but-commented example still parses\n * as JSON and earns the collapsible JsonExplorer (instead of falling back to a\n * plain code block). Removes `//` line comments and `/* … *​/` block comments,\n * then trailing commas before `}`/`]`. String contents are preserved: `//`\n * inside a quoted string (e.g. a URL) is NOT treated as a comment.\n */\nfunction stripJsonComments(source: string): string {\n let out = \"\";\n let inString = false;\n let stringQuote = \"\";\n let inLineComment = false;\n let inBlockComment = false;\n\n for (let i = 0; i < source.length; i += 1) {\n const char = source[i];\n const next = source[i + 1];\n\n if (inLineComment) {\n if (char === \"\\n\") {\n inLineComment = false;\n out += char;\n }\n continue;\n }\n\n if (inBlockComment) {\n if (char === \"*\" && next === \"/\") {\n inBlockComment = false;\n i += 1;\n }\n continue;\n }\n\n if (inString) {\n out += char;\n if (char === \"\\\\\") {\n // Copy the escaped char verbatim so an escaped quote can't end the\n // string early.\n if (next !== undefined) {\n out += next;\n i += 1;\n }\n } else if (char === stringQuote) {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n inString = true;\n stringQuote = char;\n out += char;\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n inLineComment = true;\n i += 1;\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n inBlockComment = true;\n i += 1;\n continue;\n }\n\n // Drop a trailing comma before a closing bracket so the result is strict\n // JSON. Done here (not via a post-pass regex) so it stays string-aware: we\n // only reach this branch outside strings/comments, and the structural comma\n // is the last non-whitespace char already emitted. A comma inside a string\n // value like `\"hello,}\"` is followed by its closing quote, not the bracket,\n // so it is never stripped.\n if (char === \"}\" || char === \"]\") {\n out = out.replace(/,\\s*$/, \"\");\n }\n out += char;\n }\n\n return out;\n}\n\n/**\n * Decide whether an example should render with the collapsible JsonExplorer.\n * Returns the strict-JSON text to feed the explorer (comment-stripped when the\n * raw example was JSONC), or `null` when the example is not parseable as JSON\n * (e.g. an explicitly non-JSON content type, or free-form/XML/YAML text) and\n * should fall back to the styled code surface.\n */\nfunction jsonExplorerSource(\n example: string,\n contentType?: string,\n): string | null {\n const ct = (contentType ?? \"\").toLowerCase();\n if (contentType && !ct.includes(\"json\")) return null;\n try {\n JSON.parse(example);\n return example;\n } catch {\n // Tolerate JSONC: a commented-but-otherwise-valid body still gets the nice\n // explorer. Feed the explorer the stripped (strict-JSON) text so it parses.\n const stripped = stripJsonComments(example);\n try {\n JSON.parse(stripped);\n return stripped;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Plain (non-JSON) example fallback. Renders inside the SAME surface chrome as\n * {@link JsonExplorerSurface} — one `rounded-xl border bg-plan-code` box with a\n * label bar and an `overflow-auto` scroll body — so a JSONC / free-form example\n * reads consistently with the JSON-explorer examples instead of as a separate,\n * differently-styled code box (no extra background tint, no clipped overflow).\n * Font-size is inherited from `--plan-code-size` (the same token the global code\n * rule manages); we never hardcode it here.\n */\nfunction ApiCodeExample({\n code,\n label = \"JSON\",\n className,\n}: {\n code: string;\n label?: string;\n className?: string;\n}) {\n return (\n <div\n data-code-surface\n className={cn(\n \"overflow-hidden rounded-xl border border-plan-line bg-plan-code\",\n className,\n )}\n >\n <div className=\"flex items-center gap-2 border-b border-plan-line px-3 py-1.5\">\n <span className=\"font-mono text-xs uppercase tracking-wide text-plan-muted\">\n {label}\n </span>\n </div>\n <pre className=\"overflow-x-auto px-3 py-2.5 font-mono [font-size:var(--plan-doc-code-size)] leading-relaxed text-plan-code-text\">\n {code}\n </pre>\n </div>\n );\n}\n\nfunction ApiExample({\n example,\n contentType,\n className,\n}: {\n example: string;\n contentType?: string;\n className?: string;\n}) {\n const jsonSource = jsonExplorerSource(example, contentType);\n if (jsonSource !== null) {\n return (\n <JsonExplorerSurface\n data={{ json: jsonSource, collapsedDepth: 2 }}\n className={className}\n />\n );\n }\n\n return (\n <ApiCodeExample\n code={example}\n label={fenceLangForContentType(contentType).toUpperCase()}\n className={className}\n />\n );\n}\n\n/* ── Read (collapsed-by-default swagger row) ───────────────────────────────── */\n\n/**\n * Read-only renderer for an `api-endpoint` block. Collapsed by default: a single\n * row with a colored method pill, monospace path, muted summary, and a chevron.\n * Clicking the row expands the full reference (description, params table,\n * request body, responses) — the Swagger / Stripe house style. Every colored\n * element is theme-aware (`dark:` variants), so it reads correctly in both the\n * `.dark` plan theme and light mode.\n */\nexport function ApiEndpointRead({\n data,\n blockId,\n title,\n summary,\n ctx,\n}: BlockReadProps<ApiEndpointData>) {\n const [open, setOpen] = useState(false);\n\n const params = data.params ?? [];\n const responses = data.responses ?? [];\n const hasRequest = Boolean(\n data.request?.example || data.request?.contentType,\n );\n const hasBody =\n Boolean(data.description?.trim()) ||\n params.length > 0 ||\n hasRequest ||\n responses.length > 0 ||\n Boolean(data.auth);\n\n return (\n // `data-block-type` lets the document flow detect a RUN of consecutive\n // api-endpoint blocks and collapse the divider + gap between them (see\n // `.plan-document-flow` rules in the plan template's global.css), so a list\n // of endpoints reads as one tight scannable group instead of separate\n // full-width cards. `an-api-endpoint-card` is the flush-able card surface\n // those rules round/merge at the run's edges.\n <section\n className=\"plan-block\"\n data-block-id={blockId}\n data-block-type=\"api-endpoint\"\n >\n {title && <div className=\"plan-block-label\">{title}</div>}\n <div className=\"an-api-endpoint-card overflow-hidden rounded-xl border border-plan-line bg-plan-block\">\n {/* Collapsed summary row — the whole row toggles. */}\n <button\n type=\"button\"\n data-plan-interactive\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className={cn(\n \"flex w-full items-center gap-3 px-4 py-3 text-left transition-colors\",\n \"hover:bg-accent/40\",\n )}\n >\n <IconChevronRight\n className={cn(\n \"size-4 shrink-0 text-plan-muted transition-transform\",\n open && \"rotate-90\",\n )}\n />\n <span\n className={cn(\n \"shrink-0 rounded-md px-2 py-1 font-mono text-xs font-bold uppercase tracking-wide\",\n METHOD_PILL[data.method],\n )}\n >\n {data.method}\n </span>\n <span\n className={cn(\n \"min-w-0 truncate font-mono text-sm font-semibold\",\n // `change` ink composes with `deprecated`: a deprecated route\n // still mutes/strikes its path; a changed route tints it (a\n // removed route also strikes via CHANGE_INK).\n data.change ? CHANGE_INK[data.change] : \"text-plan-text\",\n data.deprecated && \"text-plan-muted line-through\",\n )}\n >\n {data.path}\n </span>\n {data.change && <ChangeChip change={data.change} variant=\"label\" />}\n {data.deprecated && (\n <DevBadge className=\"shrink-0 border-amber-500/40 text-amber-600 dark:text-amber-300\">\n Deprecated\n </DevBadge>\n )}\n {(data.summary || summary) && (\n <span className=\"ml-1 min-w-0 flex-1 truncate text-sm text-plan-muted\">\n {data.summary || summary}\n </span>\n )}\n {data.auth && (\n <IconLock\n className=\"size-3.5 shrink-0 text-plan-muted\"\n aria-label=\"Requires authentication\"\n />\n )}\n </button>\n\n {/* Expanded body. No top divider: the title/summary row flows into the\n content separated by padding alone (the user finds mid-card dividers\n distracting; the outer card border + run-flush behavior stay). */}\n {open && hasBody && (\n <div className=\"px-4 pb-4 pt-1\">\n {data.auth && (\n <div className=\"mb-4 flex items-center gap-2 text-xs text-plan-muted\">\n <IconLock className=\"size-3.5 shrink-0\" />\n <span>\n <span className=\"font-medium text-plan-text\">Auth:</span>{\" \"}\n {data.auth}\n </span>\n </div>\n )}\n\n {data.description?.trim() && (\n <div className=\"an-api-endpoint-desc\">\n {ctx.renderMarkdown?.(data.description)}\n </div>\n )}\n\n {params.length > 0 && (\n <div className=\"mt-5\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-plan-muted\">\n Parameters\n </div>\n <div className=\"mt-2 overflow-hidden rounded-lg border border-plan-line\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"bg-accent/30 text-left text-xs uppercase tracking-wide text-plan-muted\">\n <th className=\"px-3 py-2 font-medium\">Name</th>\n <th className=\"px-3 py-2 font-medium\">In</th>\n <th className=\"px-3 py-2 font-medium\">Type</th>\n <th className=\"px-3 py-2 font-medium\">Required</th>\n <th className=\"px-3 py-2 font-medium\">Description</th>\n </tr>\n </thead>\n <tbody>\n {params.map((param, index) => {\n const change = param.change;\n // A `modified` `was` describes either the required flag\n // or the prior type; route it to the right column.\n const wasForRequired =\n change === \"modified\" &&\n param.was &&\n wasIsRequiredFlag(param.was)\n ? param.was\n : undefined;\n const wasForType =\n change === \"modified\" &&\n param.was &&\n !wasIsRequiredFlag(param.was)\n ? param.was\n : undefined;\n return (\n <tr\n key={`${param.name}-${index}`}\n className=\"border-t border-plan-line align-top\"\n >\n <td className=\"px-3 py-2 font-mono text-xs font-semibold\">\n <span className=\"flex items-center gap-1.5\">\n <span\n className={cn(\n change\n ? CHANGE_INK[change]\n : \"text-plan-text\",\n )}\n >\n {param.name}\n </span>\n {change && <ChangeChip change={change} />}\n </span>\n </td>\n <td className=\"px-3 py-2\">\n <span\n className={cn(\n \"rounded px-1.5 py-0.5 font-mono text-[11px] font-semibold\",\n PARAM_IN_BADGE[param.in],\n )}\n >\n {param.in}\n </span>\n </td>\n <td className=\"px-3 py-2 font-mono text-xs text-plan-muted\">\n <WasArrowCurrent\n was={wasForType}\n current={\n <span\n className={cn(\n wasForType && \"text-plan-text\",\n )}\n >\n {param.type || \"—\"}\n </span>\n }\n />\n </td>\n <td className=\"px-3 py-2 text-xs\">\n <WasArrowCurrent\n was={wasForRequired}\n current={\n param.required ? (\n <span className=\"font-medium text-red-600 dark:text-red-300\">\n required\n </span>\n ) : (\n <span className=\"text-plan-muted\">\n optional\n </span>\n )\n }\n />\n </td>\n <td className=\"px-3 py-2 text-xs text-plan-muted\">\n {param.description || \"—\"}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {hasRequest && (\n <div className=\"mt-5\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-plan-muted\">\n Request body\n </span>\n {data.request?.contentType && (\n <span className=\"rounded bg-accent/40 px-1.5 py-0.5 font-mono text-[11px] text-plan-muted\">\n {data.request.contentType}\n </span>\n )}\n </div>\n {data.request?.example && (\n <ApiExample\n example={data.request.example}\n contentType={data.request.contentType}\n className=\"mt-2 an-api-endpoint-example\"\n />\n )}\n </div>\n )}\n\n {responses.length > 0 && (\n <div className=\"mt-5\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-plan-muted\">\n Responses\n </div>\n <div className=\"mt-2 flex flex-col gap-3\">\n {responses.map((response, index) => (\n <div\n key={`${response.status}-${index}`}\n className=\"rounded-lg border border-plan-line\"\n >\n <div className=\"flex items-center gap-2 px-3 py-2\">\n <span\n className={cn(\n \"rounded px-2 py-0.5 font-mono text-xs font-bold\",\n statusPillClass(response.status),\n )}\n >\n {response.status}\n </span>\n {response.description && (\n <span\n className={cn(\n \"text-sm\",\n response.change\n ? CHANGE_INK[response.change]\n : \"text-plan-muted\",\n )}\n >\n {response.description}\n </span>\n )}\n {response.change && (\n <ChangeChip\n change={response.change}\n variant=\"label\"\n className=\"ml-auto\"\n />\n )}\n </div>\n {response.example && (\n <div className=\"px-3 pb-3 pt-0 an-api-endpoint-example\">\n <ApiExample\n example={response.example}\n className=\"mt-0\"\n />\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </section>\n );\n}\n\n/* ── Edit (panel form) ─────────────────────────────────────────────────────── */\n\nconst fieldLabelClass = \"text-xs font-medium text-muted-foreground\";\n\n/**\n * Options for a change `DevSelect` — a leading \"No change\" entry (decodes to\n * `undefined`) plus the four diff states, mirroring the file-tree editor.\n */\nconst CHANGE_SELECT_OPTIONS = [\n { value: \"none\", label: \"No change\" },\n ...API_ENDPOINT_CHANGES.map((change) => ({\n value: change,\n label: CHANGE_LABEL[change],\n })),\n];\n\n/**\n * Panel editor for an `api-endpoint` block. A property form: method (Select),\n * path/summary/auth (Input), description (Textarea), deprecated (Switch), plus\n * repeatable rows for params and responses (add/remove) and a request-body\n * textarea. Renders BARE content (no `<section>`); the registry's panel surface\n * supplies the popover chrome.\n */\nexport function ApiEndpointEdit({\n data,\n onChange,\n editable,\n}: BlockEditProps<ApiEndpointData>) {\n const params = data.params ?? [];\n const responses = data.responses ?? [];\n\n const patch = (next: Partial<ApiEndpointData>) =>\n onChange({ ...data, ...next });\n\n const updateParam = (index: number, next: Partial<ApiEndpointParam>) =>\n patch({\n params: params.map((param, i) =>\n i === index ? { ...param, ...next } : param,\n ),\n });\n\n const removeParam = (index: number) =>\n patch({ params: params.filter((_, i) => i !== index) });\n\n const addParam = () =>\n patch({\n params: [...params, { name: \"param\", in: \"query\" as ApiParamLocation }],\n });\n\n const updateResponse = (index: number, next: Partial<ApiEndpointResponse>) =>\n patch({\n responses: responses.map((response, i) =>\n i === index ? { ...response, ...next } : response,\n ),\n });\n\n const removeResponse = (index: number) =>\n patch({ responses: responses.filter((_, i) => i !== index) });\n\n const addResponse = () =>\n patch({ responses: [...responses, { status: \"200\" }] });\n\n const updateRequest = (next: Partial<ApiEndpointData[\"request\"]>) => {\n const merged = { ...(data.request ?? {}), ...next };\n const empty = !merged.contentType && !merged.example;\n patch({ request: empty ? undefined : merged });\n };\n\n return (\n <div className=\"flex flex-col gap-4\" data-plan-interactive>\n <div className=\"grid grid-cols-[120px_minmax(0,1fr)] gap-2\">\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Method</span>\n <DevSelect\n className=\"h-9\"\n value={data.method}\n disabled={!editable}\n onValueChange={(value) =>\n patch({ method: value as ApiEndpointMethod })\n }\n options={API_ENDPOINT_METHODS.map((method) => ({\n value: method,\n label: method,\n }))}\n />\n </label>\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Path</span>\n <DevInput\n className=\"h-9 font-mono\"\n value={data.path}\n disabled={!editable}\n placeholder=\"/api/resource\"\n onChange={(event) => patch({ path: event.target.value })}\n />\n </label>\n </div>\n\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Summary</span>\n <DevInput\n className=\"h-9\"\n value={data.summary ?? \"\"}\n disabled={!editable}\n placeholder=\"Short one-line description\"\n onChange={(event) =>\n patch({ summary: event.target.value || undefined })\n }\n />\n </label>\n\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Description (markdown)</span>\n <DevTextarea\n className=\"min-h-[80px]\"\n value={data.description ?? \"\"}\n disabled={!editable}\n placeholder=\"Longer description, rendered as markdown\"\n onChange={(event) =>\n patch({ description: event.target.value || undefined })\n }\n />\n </label>\n\n <div className=\"grid grid-cols-[minmax(0,1fr)_120px_auto] items-end gap-3\">\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Auth</span>\n <DevInput\n className=\"h-9\"\n value={data.auth ?? \"\"}\n disabled={!editable}\n placeholder=\"e.g. Bearer token\"\n onChange={(event) =>\n patch({ auth: event.target.value || undefined })\n }\n />\n </label>\n <label className=\"flex flex-col gap-1.5\">\n <span className={fieldLabelClass}>Change</span>\n <DevSelect\n className=\"h-9\"\n value={data.change ?? \"none\"}\n disabled={!editable}\n onValueChange={(value) =>\n patch({\n change:\n value === \"none\" ? undefined : (value as ApiEndpointChange),\n })\n }\n options={CHANGE_SELECT_OPTIONS}\n />\n </label>\n <label className=\"flex items-center gap-2 pb-2\">\n <DevSwitch\n checked={Boolean(data.deprecated)}\n disabled={!editable}\n onCheckedChange={(checked) =>\n patch({ deprecated: checked || undefined })\n }\n />\n <span className={fieldLabelClass}>Deprecated</span>\n </label>\n </div>\n\n {/* Params */}\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <span className={fieldLabelClass}>Parameters</span>\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n className=\"flex items-center gap-1 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n onClick={addParam}\n >\n <IconPlus className=\"size-3.5\" />\n Add\n </button>\n )}\n </div>\n {params.map((param, index) => (\n <div\n key={index}\n className=\"flex flex-col gap-2 rounded-md border border-input p-2\"\n >\n <div className=\"grid grid-cols-[minmax(0,1fr)_96px_auto] gap-2\">\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={param.name}\n disabled={!editable}\n placeholder=\"name\"\n onChange={(event) =>\n updateParam(index, { name: event.target.value })\n }\n />\n <DevSelect\n className=\"h-8\"\n value={param.in}\n disabled={!editable}\n onValueChange={(value) =>\n updateParam(index, { in: value as ApiParamLocation })\n }\n options={API_PARAM_LOCATIONS.map((location) => ({\n value: location,\n label: location,\n }))}\n />\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-label=\"Remove parameter\"\n className=\"flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n onClick={() => removeParam(index)}\n >\n <IconTrash className=\"size-4\" />\n </button>\n )}\n </div>\n <div className=\"grid grid-cols-[minmax(0,1fr)_auto] items-center gap-2\">\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={param.type ?? \"\"}\n disabled={!editable}\n placeholder=\"type (e.g. string)\"\n onChange={(event) =>\n updateParam(index, { type: event.target.value || undefined })\n }\n />\n <label className=\"flex items-center gap-1.5 whitespace-nowrap text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 cursor-pointer accent-primary\"\n checked={Boolean(param.required)}\n disabled={!editable}\n onChange={(event) =>\n updateParam(index, {\n required: event.target.checked || undefined,\n })\n }\n />\n Required\n </label>\n </div>\n <DevInput\n className=\"h-8 text-xs\"\n value={param.description ?? \"\"}\n disabled={!editable}\n placeholder=\"description\"\n onChange={(event) =>\n updateParam(index, {\n description: event.target.value || undefined,\n })\n }\n />\n {/* Diff state: change kind + the prior value (`was`) shown\n struck-through before the current one when \"modified\". */}\n <div className=\"grid grid-cols-[120px_minmax(0,1fr)] gap-2\">\n <DevSelect\n className=\"h-8\"\n value={param.change ?? \"none\"}\n disabled={!editable}\n onValueChange={(value) =>\n updateParam(index, {\n change:\n value === \"none\"\n ? undefined\n : (value as ApiEndpointChange),\n })\n }\n options={CHANGE_SELECT_OPTIONS}\n />\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={param.was ?? \"\"}\n disabled={!editable || param.change !== \"modified\"}\n placeholder=\"was (e.g. optional, or old type)\"\n onChange={(event) =>\n updateParam(index, { was: event.target.value || undefined })\n }\n />\n </div>\n </div>\n ))}\n </div>\n\n {/* Request body */}\n <div className=\"flex flex-col gap-2\">\n <span className={fieldLabelClass}>Request body</span>\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={data.request?.contentType ?? \"\"}\n disabled={!editable}\n placeholder=\"content type (e.g. application/json)\"\n onChange={(event) =>\n updateRequest({ contentType: event.target.value || undefined })\n }\n />\n <DevTextarea\n className=\"min-h-[80px] font-mono text-xs\"\n value={data.request?.example ?? \"\"}\n disabled={!editable}\n placeholder='{ \"example\": \"request body\" }'\n onChange={(event) =>\n updateRequest({ example: event.target.value || undefined })\n }\n />\n </div>\n\n {/* Responses */}\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <span className={fieldLabelClass}>Responses</span>\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n className=\"flex items-center gap-1 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n onClick={addResponse}\n >\n <IconPlus className=\"size-3.5\" />\n Add\n </button>\n )}\n </div>\n {responses.map((response, index) => (\n <div\n key={index}\n className=\"flex flex-col gap-2 rounded-md border border-input p-2\"\n >\n <div className=\"grid grid-cols-[96px_minmax(0,1fr)_auto] gap-2\">\n <DevInput\n className=\"h-8 font-mono text-xs\"\n value={response.status}\n disabled={!editable}\n placeholder=\"200\"\n onChange={(event) =>\n updateResponse(index, { status: event.target.value })\n }\n />\n <DevInput\n className=\"h-8 text-xs\"\n value={response.description ?? \"\"}\n disabled={!editable}\n placeholder=\"description\"\n onChange={(event) =>\n updateResponse(index, {\n description: event.target.value || undefined,\n })\n }\n />\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-label=\"Remove response\"\n className=\"flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n onClick={() => removeResponse(index)}\n >\n <IconTrash className=\"size-4\" />\n </button>\n )}\n </div>\n <DevTextarea\n className=\"min-h-[64px] font-mono text-xs\"\n value={response.example ?? \"\"}\n disabled={!editable}\n placeholder='{ \"example\": \"response body\" }'\n onChange={(event) =>\n updateResponse(index, {\n example: event.target.value || undefined,\n })\n }\n />\n <label className=\"flex items-center gap-2\">\n <span className={fieldLabelClass}>Change</span>\n <DevSelect\n className=\"h-8 w-[120px]\"\n value={response.change ?? \"none\"}\n disabled={!editable}\n onValueChange={(value) =>\n updateResponse(index, {\n change:\n value === \"none\"\n ? undefined\n : (value as ApiEndpointChange),\n })\n }\n options={CHANGE_SELECT_OPTIONS}\n />\n </label>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DiffBlock.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/DiffBlock.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAkB,QAAQ,EAAY,MAAM,kBAAkB,CAAC;AAW3E;;;;;;;;;;;;;;;GAeG;AAIH,UAAU,MAAM;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAqBD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsEjE;AAyZD,iBAAS,QAAQ,CAAC,EAChB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAiO1B;AAibD,iBAAS,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,2CA2LvE;AAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"DiffBlock.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/DiffBlock.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAkB,QAAQ,EAAY,MAAM,kBAAkB,CAAC;AAc3E;;;;;;;;;;;;;;;GAeG;AAIH,UAAU,MAAM;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAqBD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsEjE;AAyZD,iBAAS,QAAQ,CAAC,EAChB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAyR1B;AAkcD,iBAAS,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,2CA2LvE;AAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useMemo, useRef, useState } from "react";
2
+ import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
3
3
  import { IconChevronRight, IconColumns, IconDotsVertical, IconFileDiff, IconList, IconPlus, IconTrash, } from "@tabler/icons-react";
4
4
  import { common, createLowlight } from "lowlight";
5
5
  import { cn } from "../../utils.js";
6
- import { AnnotationGutterMarker, InlineAnnotationNote, buildLineMarkerMap, hasRailAnnotations, resolveAnnotations, } from "./annotation-rail.js";
6
+ import { AnnotationGutterMarker, AnnotationHiddenStack, AnnotationHoverCard, anchorFromElements, buildLineMarkerMap, hasRailAnnotations, resolveAnnotations, useAnnotationHover, } from "./annotation-rail.js";
7
7
  import { DevInput, DevLabel, DevTextarea, DevSelect } from "./dev-doc-ui.js";
8
8
  /**
9
9
  * Split text into lines, each KEEPING its trailing newline (so the change
@@ -372,8 +372,8 @@ const SIGN = {
372
372
  removed: "−",
373
373
  context: " ",
374
374
  };
375
- const LINE_NO_CLASS = "select-none px-2 py-0 text-right font-mono [font-size:var(--plan-code-size)] leading-5 text-muted-foreground tabular-nums";
376
- const DIFF_LINE_CLASS = "block min-w-max flex-1 whitespace-pre px-2 py-0 font-mono [font-size:var(--plan-code-size)] leading-5 text-foreground";
375
+ const LINE_NO_CLASS = "select-none px-2 py-0 text-right font-mono [font-size:var(--plan-doc-code-size)] leading-5 text-muted-foreground tabular-nums";
376
+ const DIFF_LINE_CLASS = "block min-w-max flex-1 whitespace-pre px-2 py-0 font-mono [font-size:var(--plan-doc-code-size)] leading-5 text-foreground";
377
377
  const DEFAULT_VISIBLE_DIFF_LINES = 15;
378
378
  const MAX_DIFF_LCS_CELLS = 1_000_000;
379
379
  /**
@@ -424,8 +424,13 @@ function DiffRead({ data, blockId, title, summary, ctx, }) {
424
424
  const [mode, setMode] = useState(data.mode ?? "unified");
425
425
  const [expanded, setExpanded] = useState(() => new Set());
426
426
  const [showAllRows, setShowAllRows] = useState(false);
427
- const [activeIndex, setActiveIndex] = useState(null);
428
427
  const [containerRef, containerWidth] = useContainerWidth();
428
+ // On-hover popover (anchored to the right of the code) replaces the old
429
+ // persistent rail: nothing is shown when idle. `codeRef` measures the code
430
+ // box's right edge; `hover` carries the active index + captured geometry.
431
+ const hover = useAnnotationHover();
432
+ const { activeIndex } = hover;
433
+ const codeRef = useRef(null);
429
434
  const rows = useMemo(() => buildRows(diffLines(data.before, data.after)), [data.before, data.after]);
430
435
  const language = useMemo(() => resolveDiffLanguage(data), [data.filename, data.language]);
431
436
  const fileParts = useMemo(() => splitDiffFilename(data.filename), [data.filename]);
@@ -440,14 +445,26 @@ function DiffRead({ data, blockId, title, summary, ctx, }) {
440
445
  ? beforeLineCount
441
446
  : afterLineCount), [data.annotations, beforeLineCount, afterLineCount]);
442
447
  const hasAnnotations = hasRailAnnotations(resolved);
443
- // Effective render mode. Annotated diffs always render unified so the inline
444
- // notes read in flow (there is no side rail); and any diff in a container
445
- // narrower than SPLIT_MIN_WIDTH falls back to unified so split's doubled
446
- // gutters never crush the code. `canSplit` also gates the mode toggle so it is
447
- // hidden whenever split is unavailable.
448
+ // Effective render mode. Annotations live in a SEPARATE right-hand rail (not
449
+ // over the code), so they no longer force a mode; only a container narrower
450
+ // than SPLIT_MIN_WIDTH falls back to unified so split's doubled gutters never
451
+ // crush the code. `canSplit` also gates the mode toggle (hidden when narrow).
448
452
  const narrow = containerWidth != null && containerWidth < SPLIT_MIN_WIDTH;
449
- const canSplit = !hasAnnotations && !narrow;
453
+ const canSplit = !narrow;
450
454
  const effectiveMode = canSplit ? mode : "unified";
455
+ // Annotations (diff): NO persistent column. Hovering a marked code line (or
456
+ // its numbered pip) opens THAT note's card as an on-hover popover anchored to
457
+ // the RIGHT of the code box, never over the code. The in-code pip stays as the
458
+ // anchor indicator + active-line highlight. `onRowEnter` captures the code
459
+ // box's right edge + the hovered row's vertical position to place the card;
460
+ // `onRowLeave` schedules a short-delay close so the pointer can cross the gap
461
+ // into the card (which cancels the close while hovered).
462
+ const onRowEnter = useCallback((index, rowEl) => {
463
+ const anchor = anchorFromElements(codeRef.current, rowEl);
464
+ if (anchor)
465
+ hover.open(index, anchor);
466
+ }, [hover]);
467
+ const onRowLeave = useCallback(() => hover.scheduleClose(), [hover]);
451
468
  // Side-scoped line → markers maps so a row only lights from its own side.
452
469
  const beforeMarkers = useMemo(() => buildLineMarkerMap(resolved.filter((r) => annotationSide(r.annotation) === "before")), [resolved]);
453
470
  const afterMarkers = useMemo(() => buildLineMarkerMap(resolved.filter((r) => annotationSide(r.annotation) !== "before")), [resolved]);
@@ -473,6 +490,10 @@ function DiffRead({ data, blockId, title, summary, ctx, }) {
473
490
  return undefined;
474
491
  return (row) => markersForRow(row).length > 0;
475
492
  }, [hasAnnotations, markersForRow]);
493
+ // The resolved annotation whose card is currently shown on hover.
494
+ const activeItem = useMemo(() => activeIndex == null
495
+ ? null
496
+ : (resolved.find((item) => item.index === activeIndex) ?? null), [activeIndex, resolved]);
476
497
  const added = rows.filter((r) => r.kind === "added").length;
477
498
  const removed = rows.filter((r) => r.kind === "removed").length;
478
499
  const unchanged = data.before === data.after;
@@ -503,9 +524,13 @@ function DiffRead({ data, blockId, title, summary, ctx, }) {
503
524
  next.add(index);
504
525
  return next;
505
526
  });
506
- return (_jsxs("section", { ref: containerRef, className: "plan-block group/diff-block", "data-block-id": blockId, children: [title && _jsx("div", { className: "plan-block-label", children: title }), summary && (_jsx("p", { className: "mb-3 text-sm leading-relaxed text-plan-muted", children: summary })), _jsxs("div", { className: "overflow-hidden rounded-md border border-border bg-background", children: [_jsxs("div", { className: "flex min-h-10 flex-wrap items-center gap-2 border-b border-border bg-muted/60 px-3 py-1.5", children: [_jsx(IconFileDiff, { className: "size-4 shrink-0 text-muted-foreground" }), _jsxs("span", { className: "flex min-w-0 flex-1 items-baseline gap-1.5 font-mono", title: data.filename || undefined, children: [_jsx("span", { className: "min-w-0 max-w-[16rem] truncate text-[13px] font-semibold leading-5 text-foreground", children: fileParts.basename }), fileParts.directory && (_jsx("span", { className: "min-w-0 flex-1 truncate text-[11px] leading-5 text-muted-foreground/70", children: fileParts.directory }))] }), _jsxs("span", { className: "ml-1 flex shrink-0 items-center gap-2 font-mono text-xs", children: [_jsxs("span", { className: "text-emerald-700 dark:text-emerald-300", children: ["+", added] }), _jsxs("span", { className: "text-destructive", children: ["\u2212", removed] })] }), canSplit && (_jsxs("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", children: [_jsx(ModeButton, { active: mode === "unified", onClick: () => setMode("unified"), icon: _jsx(IconList, { className: "size-3.5" }), label: "Unified" }), _jsx(ModeButton, { active: mode === "split", onClick: () => setMode("split"), icon: _jsx(IconColumns, { className: "size-3.5" }), label: "Split" })] }))] }), unchanged ? (_jsx("div", { className: "px-4 py-6 text-center font-mono text-sm text-muted-foreground", children: "No changes" })) : effectiveMode === "split" ? (_jsx(SplitView, { rows: rows, language: language, rowLimit: rowLimit, markersForRow: markersForRow, activeIndex: activeIndex, onActiveChange: setActiveIndex })) : (_jsx(UnifiedView, { rows: displayedRows, language: language, expanded: expanded, onToggleRun: toggleRun, markersForRow: markersForRow, anchoredRow: anchoredRow, activeIndex: activeIndex, onActiveChange: setActiveIndex, ctx: ctx })), !unchanged && shouldLimitRows && (_jsxs("button", { type: "button", "data-plan-interactive": true, "aria-expanded": showAllRows, onClick: () => setShowAllRows((current) => !current), 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", children: [_jsx(IconChevronRight, { className: cn("size-3 shrink-0 transition-transform", showAllRows ? "-rotate-90" : "rotate-90") }), showAllRows
507
- ? "Show fewer"
508
- : `Show all ${totalVisibleLineCount} lines`] }))] })] }));
527
+ // The bordered code box. It always spans its full width annotations surface
528
+ // as an on-hover popover anchored to this box's right edge, never as a column.
529
+ // `codeRef` measures that right edge for the popover's placement.
530
+ const diffBox = (_jsxs("div", { ref: codeRef, className: "overflow-hidden rounded-md border border-border bg-background", children: [_jsxs("div", { className: "flex min-h-10 flex-wrap items-center gap-2 border-b border-border bg-muted/60 px-3 py-1.5", children: [_jsx(IconFileDiff, { className: "size-4 shrink-0 text-muted-foreground" }), _jsxs("span", { className: "flex min-w-0 flex-1 items-baseline gap-1.5 font-mono", title: data.filename || undefined, children: [_jsx("span", { className: "min-w-0 max-w-[16rem] truncate text-[13px] font-semibold leading-5 text-foreground", children: fileParts.basename }), fileParts.directory && (_jsx("span", { className: "min-w-0 flex-1 truncate text-[11px] leading-5 text-muted-foreground/70", children: fileParts.directory }))] }), _jsxs("span", { className: "ml-1 flex shrink-0 items-center gap-2 font-mono text-xs", children: [_jsxs("span", { className: "text-emerald-700 dark:text-emerald-300", children: ["+", added] }), _jsxs("span", { className: "text-destructive", children: ["\u2212", removed] })] }), canSplit && (_jsxs("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", children: [_jsx(ModeButton, { active: mode === "unified", onClick: () => setMode("unified"), icon: _jsx(IconList, { className: "size-3.5" }), label: "Unified" }), _jsx(ModeButton, { active: mode === "split", onClick: () => setMode("split"), icon: _jsx(IconColumns, { className: "size-3.5" }), label: "Split" })] }))] }), unchanged ? (_jsx("div", { className: "px-4 py-6 text-center font-mono text-sm text-muted-foreground", children: "No changes" })) : effectiveMode === "split" ? (_jsx(SplitView, { rows: rows, language: language, rowLimit: rowLimit, markersForRow: markersForRow, activeIndex: activeIndex, onRowEnter: onRowEnter, onRowLeave: onRowLeave })) : (_jsx(UnifiedView, { rows: displayedRows, language: language, expanded: expanded, onToggleRun: toggleRun, markersForRow: markersForRow, anchoredRow: anchoredRow, activeIndex: activeIndex, onRowEnter: onRowEnter, onRowLeave: onRowLeave })), !unchanged && shouldLimitRows && (_jsxs("button", { type: "button", "data-plan-interactive": true, "aria-expanded": showAllRows, onClick: () => setShowAllRows((current) => !current), 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", children: [_jsx(IconChevronRight, { className: cn("size-3 shrink-0 transition-transform", showAllRows ? "-rotate-90" : "rotate-90") }), showAllRows
531
+ ? "Show fewer"
532
+ : `Show all ${totalVisibleLineCount} lines`] }))] }));
533
+ return (_jsxs("section", { ref: containerRef, className: "relative plan-block group/diff-block", "data-block-id": blockId, children: [title && _jsx("div", { className: "plan-block-label", children: title }), summary && (_jsx("p", { className: "mb-3 text-sm leading-relaxed text-plan-muted", children: summary })), diffBox, hasAnnotations && (_jsx(AnnotationHiddenStack, { items: resolved, ctx: ctx, showMarker: true })), hasAnnotations && activeItem && hover.anchor && (_jsx(AnnotationHoverCard, { item: activeItem, anchor: hover.anchor, ctx: ctx, showMarker: true, onMouseEnter: hover.cancelClose, onMouseLeave: hover.scheduleClose }))] }));
509
534
  }
510
535
  function ModeButton({ active, onClick, icon, label, }) {
511
536
  return (_jsxs("button", { type: "button", "data-plan-interactive": true, onClick: onClick, "aria-pressed": active, className: cn("flex cursor-pointer items-center gap-1 px-2 py-1 text-xs font-medium transition-colors", active
@@ -545,7 +570,7 @@ function isMarkerRangeStart(row, marker) {
545
570
  return lineNo === marker.range.start;
546
571
  }
547
572
  /* ── Unified view ──────────────────────────────────────────────────────────── */
548
- function UnifiedView({ rows, language, expanded, onToggleRun, markersForRow, anchoredRow, activeIndex, onActiveChange, ctx, }) {
573
+ function UnifiedView({ rows, language, expanded, onToggleRun, markersForRow, anchoredRow, activeIndex, onRowEnter, onRowLeave, }) {
549
574
  const segments = useMemo(() => segmentRows(rows, anchoredRow), [rows, anchoredRow]);
550
575
  // Any annotation present ⇒ reserve the marker column so rows stay aligned.
551
576
  const showMarkerColumn = useMemo(() => rows.some((row) => markersForRow(row).length > 0), [rows, markersForRow]);
@@ -553,33 +578,28 @@ function UnifiedView({ rows, language, expanded, onToggleRun, markersForRow, anc
553
578
  language,
554
579
  markersForRow,
555
580
  activeIndex,
556
- onActiveChange,
581
+ onRowEnter,
582
+ onRowLeave,
557
583
  showMarkerColumn,
558
584
  };
559
- // A diff row plus any notes anchored to it: each annotation renders ONE
560
- // full-width inline note directly under the FIRST line of its range (matched
561
- // by `isMarkerRangeStart`), so the row's numbered pip and its note read as a
562
- // single GitHub-style unit and the note never repeats down a multi-line span.
563
- const renderRow = (row, key) => {
564
- const notes = markersForRow(row).filter((marker) => isMarkerRangeStart(row, marker));
565
- return (_jsxs("div", { children: [_jsx(UnifiedRow, { row: row, ...rowProps }), notes.map((item) => (_jsx(InlineAnnotationNote, { item: item, active: item.index === activeIndex, onActiveChange: onActiveChange, ctx: ctx }, `note-${item.index}`)))] }, key));
566
- };
567
585
  let runIndex = 0;
568
- return (_jsx("div", { className: "overflow-x-auto", children: _jsx("div", { className: "w-max min-w-full font-mono [font-size:var(--plan-code-size)] leading-5", children: segments.map((segment, idx) => {
586
+ return (_jsx("div", { className: "overflow-x-auto", "data-code-surface": true, children: _jsx("div", { className: "w-max min-w-full font-mono [font-size:var(--plan-doc-code-size)] leading-5", children: segments.map((segment, idx) => {
569
587
  if ("collapsed" in segment) {
570
588
  const key = runIndex++;
571
589
  const open = expanded.has(key);
572
590
  return (_jsxs("div", { children: [_jsx(CollapsedRow, { count: segment.rows.length, open: open, onClick: () => onToggleRun(key) }), open &&
573
- segment.rows.map((row, ri) => renderRow(row, `run-${key}-${ri}`))] }, `run-${key}`));
591
+ segment.rows.map((row, ri) => (_jsx(UnifiedRow, { row: row, ...rowProps }, `run-${key}-${ri}`)))] }, `run-${key}`));
574
592
  }
575
- return renderRow(segment, String(idx));
593
+ return _jsx(UnifiedRow, { row: segment, ...rowProps }, idx);
576
594
  }) }) }));
577
595
  }
578
- function UnifiedRow({ language, row, markersForRow, activeIndex, onActiveChange, showMarkerColumn, }) {
596
+ function UnifiedRow({ language, row, markersForRow, activeIndex, onRowEnter, onRowLeave, showMarkerColumn, }) {
579
597
  const markers = markersForRow(row);
580
598
  const info = rowMarkerInfo(markers, activeIndex);
581
599
  const startMarker = markers.find((marker) => isMarkerRangeStart(row, marker));
582
- return (_jsxs("div", { className: cn("flex min-h-5 min-w-full", ROW_BG[row.kind], annotatedRowBg(info)), onMouseEnter: info ? () => onActiveChange(info.primaryIndex) : undefined, onMouseLeave: info ? () => onActiveChange(null) : undefined, children: [_jsx("span", { className: cn(LINE_NO_CLASS, "w-[52px]"), children: row.oldNo ?? "" }), _jsx("span", { className: cn(LINE_NO_CLASS, "w-[52px]"), children: row.newNo ?? "" }), _jsx("span", { className: cn("w-6 shrink-0 select-none py-0 text-center font-semibold leading-5", GUTTER_BG[row.kind], SIGN_COLOR[row.kind]), children: SIGN[row.kind] }), showMarkerColumn && (_jsx(MarkerCell, { startMarker: startMarker, active: startMarker != null && startMarker.index === activeIndex })), _jsx(DiffLineText, { text: row.text, language: language })] }));
600
+ return (_jsxs("div", { "data-annot-row": startMarker ? startMarker.index : undefined, className: cn("flex min-h-5 min-w-full", ROW_BG[row.kind], annotatedRowBg(info)), onMouseEnter: info
601
+ ? (event) => onRowEnter(startMarker?.index ?? info.primaryIndex, event.currentTarget)
602
+ : undefined, onMouseLeave: info ? () => onRowLeave() : undefined, children: [_jsx("span", { className: cn(LINE_NO_CLASS, "w-[52px]"), children: row.oldNo ?? "" }), _jsx("span", { className: cn(LINE_NO_CLASS, "w-[52px]"), children: row.newNo ?? "" }), _jsx("span", { className: cn("w-6 shrink-0 select-none py-0 text-center font-semibold leading-5", GUTTER_BG[row.kind], SIGN_COLOR[row.kind]), children: SIGN[row.kind] }), showMarkerColumn && (_jsx(MarkerCell, { startMarker: startMarker, active: startMarker != null && startMarker.index === activeIndex })), _jsx(DiffLineText, { text: row.text, language: language })] }));
583
603
  }
584
604
  /**
585
605
  * The fixed-width marker column rendered between the sign gutter and the code.
@@ -623,16 +643,22 @@ function pairSplitRows(rows) {
623
643
  }
624
644
  return out;
625
645
  }
626
- function SplitView({ language, rowLimit, rows, markersForRow, activeIndex, onActiveChange, }) {
646
+ function SplitView({ language, rowLimit, rows, markersForRow, activeIndex, onRowEnter, onRowLeave, }) {
627
647
  const pairs = useMemo(() => pairSplitRows(rows), [rows]);
628
648
  const displayedPairs = rowLimit ? pairs.slice(0, rowLimit) : pairs;
629
649
  // Reserve the marker column on a side only if any visible row there has one.
630
650
  const showOldMarkers = useMemo(() => displayedPairs.some((pair) => pair.left && markersForRow(pair.left, "old").length > 0), [displayedPairs, markersForRow]);
631
651
  const showNewMarkers = useMemo(() => displayedPairs.some((pair) => pair.right && markersForRow(pair.right, "new").length > 0), [displayedPairs, markersForRow]);
632
- const cellProps = { language, markersForRow, activeIndex, onActiveChange };
633
- return (_jsxs("div", { className: "flex w-full bg-background font-mono [font-size:var(--plan-code-size)] leading-5", children: [_jsx("div", { className: "min-w-0 flex-1 overflow-x-auto border-r border-border", children: _jsx("div", { className: "inline-block min-w-full", children: displayedPairs.map((pair, idx) => (_jsx(SplitCell, { row: pair.left, side: "old", showMarkerColumn: showOldMarkers, ...cellProps }, `old-${idx}`))) }) }), _jsx("div", { className: "min-w-0 flex-1 overflow-x-auto", children: _jsx("div", { className: "inline-block min-w-full", children: displayedPairs.map((pair, idx) => (_jsx(SplitCell, { row: pair.right, side: "new", showMarkerColumn: showNewMarkers, ...cellProps }, `new-${idx}`))) }) })] }));
652
+ const cellProps = {
653
+ language,
654
+ markersForRow,
655
+ activeIndex,
656
+ onRowEnter,
657
+ onRowLeave,
658
+ };
659
+ return (_jsxs("div", { className: "flex w-full bg-background font-mono [font-size:var(--plan-doc-code-size)] leading-5", "data-code-surface": true, children: [_jsx("div", { className: "min-w-0 flex-1 overflow-x-auto border-r border-border", children: _jsx("div", { className: "inline-block min-w-full", children: displayedPairs.map((pair, idx) => (_jsx(SplitCell, { row: pair.left, side: "old", showMarkerColumn: showOldMarkers, ...cellProps }, `old-${idx}`))) }) }), _jsx("div", { className: "min-w-0 flex-1 overflow-x-auto", children: _jsx("div", { className: "inline-block min-w-full", children: displayedPairs.map((pair, idx) => (_jsx(SplitCell, { row: pair.right, side: "new", showMarkerColumn: showNewMarkers, ...cellProps }, `new-${idx}`))) }) })] }));
634
660
  }
635
- function SplitCell({ language, row, side, markersForRow, activeIndex, onActiveChange, showMarkerColumn, }) {
661
+ function SplitCell({ language, row, side, markersForRow, activeIndex, onRowEnter, onRowLeave, showMarkerColumn, }) {
636
662
  if (!row) {
637
663
  return (_jsxs("div", { className: "flex min-h-5 min-w-full bg-muted/40 opacity-70", children: [_jsx("span", { className: cn(LINE_NO_CLASS, "w-[52px]") }), _jsx("span", { className: "w-6 shrink-0 bg-muted/60" }), showMarkerColumn && _jsx("span", { className: "w-6 shrink-0" }), _jsx("span", { className: DIFF_LINE_CLASS, children: " " })] }));
638
664
  }
@@ -641,10 +667,12 @@ function SplitCell({ language, row, side, markersForRow, activeIndex, onActiveCh
641
667
  const markers = markersForRow(row, side);
642
668
  const info = rowMarkerInfo(markers, activeIndex);
643
669
  const startMarker = markers.find((marker) => isMarkerRangeStart(row, marker));
644
- return (_jsxs("div", { className: cn("flex min-h-5 min-w-full", ROW_BG[row.kind], annotatedRowBg(info)), onMouseEnter: info ? () => onActiveChange(info.primaryIndex) : undefined, onMouseLeave: info ? () => onActiveChange(null) : undefined, children: [_jsx("span", { className: cn(LINE_NO_CLASS, "w-[52px]"), children: side === "old" ? (row.oldNo ?? "") : (row.newNo ?? "") }), _jsx("span", { className: cn("w-6 shrink-0 select-none py-0 text-center font-semibold leading-5", GUTTER_BG[row.kind], SIGN_COLOR[row.kind]), children: showSign ? sign : " " }), showMarkerColumn && (_jsx(MarkerCell, { startMarker: startMarker, active: startMarker != null && startMarker.index === activeIndex })), _jsx(DiffLineText, { text: row.text, language: language })] }));
670
+ return (_jsxs("div", { "data-annot-row": startMarker ? startMarker.index : undefined, className: cn("flex min-h-5 min-w-full", ROW_BG[row.kind], annotatedRowBg(info)), onMouseEnter: info
671
+ ? (event) => onRowEnter(startMarker?.index ?? info.primaryIndex, event.currentTarget)
672
+ : undefined, onMouseLeave: info ? () => onRowLeave() : undefined, children: [_jsx("span", { className: cn(LINE_NO_CLASS, "w-[52px]"), children: side === "old" ? (row.oldNo ?? "") : (row.newNo ?? "") }), _jsx("span", { className: cn("w-6 shrink-0 select-none py-0 text-center font-semibold leading-5", GUTTER_BG[row.kind], SIGN_COLOR[row.kind]), children: showSign ? sign : " " }), showMarkerColumn && (_jsx(MarkerCell, { startMarker: startMarker, active: startMarker != null && startMarker.index === activeIndex })), _jsx(DiffLineText, { text: row.text, language: language })] }));
645
673
  }
646
674
  /* ── Edit (panel) ──────────────────────────────────────────────────────────── */
647
- const codeAreaClass = "min-h-[140px] font-mono text-xs leading-5";
675
+ const codeAreaClass = "min-h-[140px] font-mono [font-size:var(--plan-code-size)] leading-5";
648
676
  function DiffEdit({ data, onChange, editable }) {
649
677
  const patch = (next) => onChange({ ...data, ...next });
650
678
  const mode = data.mode ?? "unified";