@agent-native/core 0.38.0 → 0.39.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 (158) hide show
  1. package/dist/cli/create.d.ts.map +1 -1
  2. package/dist/cli/create.js +8 -1
  3. package/dist/cli/create.js.map +1 -1
  4. package/dist/cli/index.js +1 -1
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/skills.d.ts +6 -4
  7. package/dist/cli/skills.d.ts.map +1 -1
  8. package/dist/cli/skills.js +587 -126
  9. package/dist/cli/skills.js.map +1 -1
  10. package/dist/client/blocks/BlockView.d.ts +13 -4
  11. package/dist/client/blocks/BlockView.d.ts.map +1 -1
  12. package/dist/client/blocks/BlockView.js +34 -13
  13. package/dist/client/blocks/BlockView.js.map +1 -1
  14. package/dist/client/blocks/SchemaBlockEditor.d.ts.map +1 -1
  15. package/dist/client/blocks/SchemaBlockEditor.js +96 -3
  16. package/dist/client/blocks/SchemaBlockEditor.js.map +1 -1
  17. package/dist/client/blocks/index.d.ts +18 -1
  18. package/dist/client/blocks/index.d.ts.map +1 -1
  19. package/dist/client/blocks/index.js +26 -1
  20. package/dist/client/blocks/index.js.map +1 -1
  21. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts +6 -0
  22. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -0
  23. package/dist/client/blocks/library/AnnotatedCodeBlock.js +135 -0
  24. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -0
  25. package/dist/client/blocks/library/ApiEndpointBlock.d.ts +20 -0
  26. package/dist/client/blocks/library/ApiEndpointBlock.d.ts.map +1 -0
  27. package/dist/client/blocks/library/ApiEndpointBlock.js +131 -0
  28. package/dist/client/blocks/library/ApiEndpointBlock.js.map +1 -0
  29. package/dist/client/blocks/library/DataModelBlock.d.ts +28 -0
  30. package/dist/client/blocks/library/DataModelBlock.d.ts.map +1 -0
  31. package/dist/client/blocks/library/DataModelBlock.js +222 -0
  32. package/dist/client/blocks/library/DataModelBlock.js.map +1 -0
  33. package/dist/client/blocks/library/DiffBlock.d.ts +6 -0
  34. package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -0
  35. package/dist/client/blocks/library/DiffBlock.js +293 -0
  36. package/dist/client/blocks/library/DiffBlock.js.map +1 -0
  37. package/dist/client/blocks/library/FileTreeBlock.d.ts +23 -0
  38. package/dist/client/blocks/library/FileTreeBlock.d.ts.map +1 -0
  39. package/dist/client/blocks/library/FileTreeBlock.js +225 -0
  40. package/dist/client/blocks/library/FileTreeBlock.js.map +1 -0
  41. package/dist/client/blocks/library/JsonExplorerBlock.d.ts +19 -0
  42. package/dist/client/blocks/library/JsonExplorerBlock.d.ts.map +1 -0
  43. package/dist/client/blocks/library/JsonExplorerBlock.js +171 -0
  44. package/dist/client/blocks/library/JsonExplorerBlock.js.map +1 -0
  45. package/dist/client/blocks/library/MermaidBlock.d.ts +17 -0
  46. package/dist/client/blocks/library/MermaidBlock.d.ts.map +1 -0
  47. package/dist/client/blocks/library/MermaidBlock.js +131 -0
  48. package/dist/client/blocks/library/MermaidBlock.js.map +1 -0
  49. package/dist/client/blocks/library/OpenApiSpecBlock.d.ts +19 -0
  50. package/dist/client/blocks/library/OpenApiSpecBlock.d.ts.map +1 -0
  51. package/dist/client/blocks/library/OpenApiSpecBlock.js +494 -0
  52. package/dist/client/blocks/library/OpenApiSpecBlock.js.map +1 -0
  53. package/dist/client/blocks/library/annotated-code.config.d.ts +58 -0
  54. package/dist/client/blocks/library/annotated-code.config.d.ts.map +1 -0
  55. package/dist/client/blocks/library/annotated-code.config.js +53 -0
  56. package/dist/client/blocks/library/annotated-code.config.js.map +1 -0
  57. package/dist/client/blocks/library/api-endpoint.config.d.ts +71 -0
  58. package/dist/client/blocks/library/api-endpoint.config.d.ts.map +1 -0
  59. package/dist/client/blocks/library/api-endpoint.config.js +91 -0
  60. package/dist/client/blocks/library/api-endpoint.config.js.map +1 -0
  61. package/dist/client/blocks/library/checklist.d.ts.map +1 -1
  62. package/dist/client/blocks/library/checklist.js +3 -1
  63. package/dist/client/blocks/library/checklist.js.map +1 -1
  64. package/dist/client/blocks/library/code-tabs.js +1 -1
  65. package/dist/client/blocks/library/code-tabs.js.map +1 -1
  66. package/dist/client/blocks/library/data-model.config.d.ts +72 -0
  67. package/dist/client/blocks/library/data-model.config.d.ts.map +1 -0
  68. package/dist/client/blocks/library/data-model.config.js +59 -0
  69. package/dist/client/blocks/library/data-model.config.js.map +1 -0
  70. package/dist/client/blocks/library/dev-doc-ui.d.ts +49 -0
  71. package/dist/client/blocks/library/dev-doc-ui.d.ts.map +1 -0
  72. package/dist/client/blocks/library/dev-doc-ui.js +50 -0
  73. package/dist/client/blocks/library/dev-doc-ui.js.map +1 -0
  74. package/dist/client/blocks/library/diff.config.d.ts +41 -0
  75. package/dist/client/blocks/library/diff.config.d.ts.map +1 -0
  76. package/dist/client/blocks/library/diff.config.js +34 -0
  77. package/dist/client/blocks/library/diff.config.js.map +1 -0
  78. package/dist/client/blocks/library/file-tree.config.d.ts +59 -0
  79. package/dist/client/blocks/library/file-tree.config.d.ts.map +1 -0
  80. package/dist/client/blocks/library/file-tree.config.js +45 -0
  81. package/dist/client/blocks/library/file-tree.config.js.map +1 -0
  82. package/dist/client/blocks/library/html.d.ts.map +1 -1
  83. package/dist/client/blocks/library/html.js +4 -1
  84. package/dist/client/blocks/library/html.js.map +1 -1
  85. package/dist/client/blocks/library/json-explorer.config.d.ts +46 -0
  86. package/dist/client/blocks/library/json-explorer.config.d.ts.map +1 -0
  87. package/dist/client/blocks/library/json-explorer.config.js +28 -0
  88. package/dist/client/blocks/library/json-explorer.config.js.map +1 -0
  89. package/dist/client/blocks/library/mermaid.config.d.ts +32 -0
  90. package/dist/client/blocks/library/mermaid.config.d.ts.map +1 -0
  91. package/dist/client/blocks/library/mermaid.config.js +24 -0
  92. package/dist/client/blocks/library/mermaid.config.js.map +1 -0
  93. package/dist/client/blocks/library/openapi-spec.config.d.ts +49 -0
  94. package/dist/client/blocks/library/openapi-spec.config.d.ts.map +1 -0
  95. package/dist/client/blocks/library/openapi-spec.config.js +24 -0
  96. package/dist/client/blocks/library/openapi-spec.config.js.map +1 -0
  97. package/dist/client/blocks/library/server-specs.d.ts +35 -0
  98. package/dist/client/blocks/library/server-specs.d.ts.map +1 -0
  99. package/dist/client/blocks/library/server-specs.js +171 -0
  100. package/dist/client/blocks/library/server-specs.js.map +1 -0
  101. package/dist/client/blocks/library/specs.d.ts +29 -0
  102. package/dist/client/blocks/library/specs.d.ts.map +1 -0
  103. package/dist/client/blocks/library/specs.js +229 -0
  104. package/dist/client/blocks/library/specs.js.map +1 -0
  105. package/dist/client/blocks/library/table.d.ts.map +1 -1
  106. package/dist/client/blocks/library/table.js +3 -1
  107. package/dist/client/blocks/library/table.js.map +1 -1
  108. package/dist/client/blocks/library/tabs.js +1 -1
  109. package/dist/client/blocks/library/tabs.js.map +1 -1
  110. package/dist/client/blocks/registry.d.ts +8 -0
  111. package/dist/client/blocks/registry.d.ts.map +1 -1
  112. package/dist/client/blocks/registry.js +15 -0
  113. package/dist/client/blocks/registry.js.map +1 -1
  114. package/dist/client/blocks/server.d.ts +9 -0
  115. package/dist/client/blocks/server.d.ts.map +1 -1
  116. package/dist/client/blocks/server.js +16 -0
  117. package/dist/client/blocks/server.js.map +1 -1
  118. package/dist/client/blocks/types.d.ts +40 -0
  119. package/dist/client/blocks/types.d.ts.map +1 -1
  120. package/dist/client/blocks/types.js.map +1 -1
  121. package/dist/client/index.d.ts +2 -1
  122. package/dist/client/index.d.ts.map +1 -1
  123. package/dist/client/index.js +10 -1
  124. package/dist/client/index.js.map +1 -1
  125. package/dist/client/rich-markdown-editor/DragHandle.d.ts +52 -0
  126. package/dist/client/rich-markdown-editor/DragHandle.d.ts.map +1 -0
  127. package/dist/client/rich-markdown-editor/DragHandle.js +403 -0
  128. package/dist/client/rich-markdown-editor/DragHandle.js.map +1 -0
  129. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts +97 -0
  130. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -0
  131. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +214 -0
  132. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -0
  133. package/dist/client/rich-markdown-editor/RunId.d.ts +28 -0
  134. package/dist/client/rich-markdown-editor/RunId.d.ts.map +1 -0
  135. package/dist/client/rich-markdown-editor/RunId.js +60 -0
  136. package/dist/client/rich-markdown-editor/RunId.js.map +1 -0
  137. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +25 -1
  138. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  139. package/dist/client/rich-markdown-editor/SharedRichEditor.js +14 -5
  140. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  141. package/dist/client/rich-markdown-editor/gfmDoc.d.ts +24 -0
  142. package/dist/client/rich-markdown-editor/gfmDoc.d.ts.map +1 -0
  143. package/dist/client/rich-markdown-editor/gfmDoc.js +83 -0
  144. package/dist/client/rich-markdown-editor/gfmDoc.js.map +1 -0
  145. package/dist/client/rich-markdown-editor/index.d.ts +5 -0
  146. package/dist/client/rich-markdown-editor/index.d.ts.map +1 -1
  147. package/dist/client/rich-markdown-editor/index.js +5 -0
  148. package/dist/client/rich-markdown-editor/index.js.map +1 -1
  149. package/dist/client/rich-markdown-editor/registrySlashCommands.d.ts +46 -0
  150. package/dist/client/rich-markdown-editor/registrySlashCommands.d.ts.map +1 -0
  151. package/dist/client/rich-markdown-editor/registrySlashCommands.js +13 -0
  152. package/dist/client/rich-markdown-editor/registrySlashCommands.js.map +1 -0
  153. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  154. package/dist/client/rich-markdown-editor/useCollabReconcile.js +33 -0
  155. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  156. package/docs/content/template-plan.md +19 -4
  157. package/docs/content/visual-plans.md +3 -1
  158. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenApiSpecBlock.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/OpenApiSpecBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useId, useMemo, useState } from \"react\";\nimport { IconChevronRight, IconLock } from \"@tabler/icons-react\";\nimport { cn } from \"../../utils.js\";\nimport type { BlockEditProps, BlockReadProps } from \"../types.js\";\nimport type { OpenApiSpecData } from \"./openapi-spec.config.js\";\nimport { DevInput, DevLabel, DevTextarea } from \"./dev-doc-ui.js\";\n\n/**\n * Read + Edit renderers for an `openapi-spec` block — a Redoc / Swagger-UI-style\n * API reference rendered from a whole OpenAPI 3 / Swagger 2 document. The raw\n * `spec` TEXT (`data.spec`) is the source of truth; the Read renderer parses it\n * defensively and, on any parse error, falls back to the raw text plus the error\n * message (it never throws). Lives in core so any app can register the dev-doc\n * block (no shadcn import).\n *\n * Operations are grouped by tag; each operation is a collapsed-by-default row\n * (colored method pill + monospace path + summary) that expands to its\n * description, params table, request body, and per-status responses — the SAME\n * per-operation house style as the single-endpoint `api-endpoint` block. `$ref`\n * model references are resolved against `components.schemas` (OpenAPI 3) or\n * top-level `definitions` (Swagger 2), with a cycle guard.\n *\n * v1 parses JSON specs only (no `yaml` dependency is declared). `parseSpec` is\n * the single seam to extend when a YAML parser is added.\n *\n * DARK/LIGHT: the plan editor toggles a `.dark` class on <html>. Every color\n * token (method/status/location pills, chrome) uses Tailwind `dark:` variants or\n * the theme-aware plan CSS-var utilities, so the reference reads correctly in\n * BOTH modes (no hardcoded dark-only palette). SSR-safe: rendering derives only\n * from props (no window/document access at module or render time).\n */\n\n/* ── Theme-aware color tokens (mirrors ApiEndpointBlock) ────────────────────── */\n\nconst METHOD_PILL: Record<string, 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 TRACE: \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\",\n};\n\nconst PARAM_IN_BADGE: Record<string, 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 cookie:\n \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-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 return \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\";\n}\n\n/* ── Defensive spec parsing + normalization ────────────────────────────────── */\n\ntype Json = unknown;\ntype JsonObject = Record<string, Json>;\n\nconst HTTP_METHODS = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"head\",\n \"options\",\n \"trace\",\n] as const;\n\ninterface NormalizedParam {\n name: string;\n in: string;\n type?: string;\n required?: boolean;\n description?: string;\n}\n\ninterface NormalizedResponse {\n status: string;\n description?: string;\n /** Inline JSON example/schema preview, when derivable. */\n example?: string;\n}\n\ninterface NormalizedOperation {\n id: string;\n method: string;\n path: string;\n summary?: string;\n description?: string;\n deprecated?: boolean;\n secured?: boolean;\n tags: string[];\n params: NormalizedParam[];\n requestContentType?: string;\n requestExample?: string;\n responses: NormalizedResponse[];\n}\n\ninterface NormalizedTagGroup {\n tag: string;\n description?: string;\n operations: NormalizedOperation[];\n}\n\ninterface NormalizedSpec {\n title?: string;\n version?: string;\n description?: string;\n format: \"OpenAPI 3\" | \"Swagger 2\" | \"Unknown\";\n groups: NormalizedTagGroup[];\n operationCount: number;\n}\n\ninterface ParseResult {\n ok: boolean;\n spec?: NormalizedSpec;\n error?: string;\n}\n\nfunction isObject(value: Json): value is JsonObject {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction asString(value: Json): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Parse the raw spec text into a JSON object. v1 supports JSON only — a YAML\n * parser is not a declared dependency. This is the single seam to extend with\n * YAML once `yaml` is a real dependency.\n */\nfunction parseSpec(raw: string): ParseResult {\n const trimmed = raw.trim();\n if (!trimmed) {\n return {\n ok: false,\n error: \"Empty spec — paste an OpenAPI 3 / Swagger 2 document.\",\n };\n }\n let doc: Json;\n try {\n doc = JSON.parse(trimmed);\n } catch (error) {\n const hint =\n /^[A-Za-z][\\w-]*\\s*:/.test(trimmed) || trimmed.startsWith(\"---\")\n ? \" (YAML is not supported yet — paste JSON, or convert the spec to JSON.)\"\n : \"\";\n return {\n ok: false,\n error: `${error instanceof Error ? error.message : \"Invalid JSON\"}${hint}`,\n };\n }\n if (!isObject(doc)) {\n return { ok: false, error: \"Spec must be a JSON object.\" };\n }\n try {\n return { ok: true, spec: normalizeSpec(doc) };\n } catch (error) {\n return {\n ok: false,\n error:\n error instanceof Error\n ? error.message\n : \"Could not interpret the spec document.\",\n };\n }\n}\n\n/** Resolve a local `$ref` (e.g. `#/components/schemas/User`) against the root. */\nfunction resolveRef(\n root: JsonObject,\n ref: string,\n seen: Set<string>,\n): Json | undefined {\n if (!ref.startsWith(\"#/\")) return undefined;\n if (seen.has(ref)) return undefined; // cycle guard\n seen.add(ref);\n const segments = ref\n .slice(2)\n .split(\"/\")\n .map((seg) => seg.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n let current: Json = root;\n for (const segment of segments) {\n if (!isObject(current)) return undefined;\n current = current[segment];\n }\n return current;\n}\n\n/** Follow a single `$ref` hop on a schema/param object if present. */\nfunction deref(root: JsonObject, value: Json, seen: Set<string>): Json {\n let current = value;\n let guard = 0;\n while (isObject(current) && typeof current.$ref === \"string\" && guard < 20) {\n const resolved = resolveRef(root, current.$ref, seen);\n if (resolved === undefined) return current;\n current = resolved;\n guard += 1;\n }\n return current;\n}\n\n/** Short human type label for a (deref'd) schema object. */\nfunction schemaTypeLabel(\n root: JsonObject,\n schema: Json,\n seen: Set<string>,\n): string | undefined {\n const resolved = deref(root, schema, new Set(seen));\n if (!isObject(resolved)) return undefined;\n if (typeof resolved.type === \"string\") {\n if (resolved.type === \"array\" && resolved.items) {\n const inner = schemaTypeLabel(root, resolved.items, seen);\n return inner ? `${inner}[]` : \"array\";\n }\n return resolved.type;\n }\n if (resolved.$ref && typeof resolved.$ref === \"string\") {\n return resolved.$ref.split(\"/\").pop();\n }\n if (resolved.enum) return \"enum\";\n if (resolved.properties) return \"object\";\n if (resolved.oneOf || resolved.anyOf || resolved.allOf) return \"object\";\n return undefined;\n}\n\n/**\n * Build a compact JSON skeleton from a (resolved) schema so the request/response\n * panels can show a Swagger-UI-style model preview. Bounded depth + a cycle\n * guard keep it safe on recursive models.\n */\nfunction schemaExample(\n root: JsonObject,\n schema: Json,\n seen: Set<string>,\n depth: number,\n): Json {\n if (depth > 6) return \"…\";\n const resolved = deref(root, schema, new Set(seen));\n if (!isObject(resolved)) return resolved ?? null;\n if (resolved.example !== undefined) return resolved.example;\n if (resolved.default !== undefined) return resolved.default;\n if (Array.isArray(resolved.enum) && resolved.enum.length > 0) {\n return resolved.enum[0];\n }\n\n const allOf = Array.isArray(resolved.allOf) ? resolved.allOf : null;\n if (allOf) {\n const merged: JsonObject = {};\n for (const part of allOf) {\n const value = schemaExample(root, part, seen, depth + 1);\n if (isObject(value)) Object.assign(merged, value);\n }\n if (Object.keys(merged).length > 0) return merged;\n }\n const oneOf =\n (Array.isArray(resolved.oneOf) && resolved.oneOf) ||\n (Array.isArray(resolved.anyOf) && resolved.anyOf) ||\n null;\n if (oneOf && oneOf.length > 0) {\n return schemaExample(root, oneOf[0], seen, depth + 1);\n }\n\n const type = resolved.type;\n if (type === \"object\" || resolved.properties) {\n const props = isObject(resolved.properties) ? resolved.properties : {};\n const out: JsonObject = {};\n for (const [key, propSchema] of Object.entries(props).slice(0, 30)) {\n out[key] = schemaExample(root, propSchema, seen, depth + 1);\n }\n return out;\n }\n if (type === \"array\") {\n return [schemaExample(root, resolved.items ?? {}, seen, depth + 1)];\n }\n if (type === \"integer\" || type === \"number\") return 0;\n if (type === \"boolean\") return true;\n if (type === \"string\") {\n if (resolved.format === \"date-time\") return \"2020-01-01T00:00:00Z\";\n if (resolved.format === \"uuid\")\n return \"00000000-0000-0000-0000-000000000000\";\n return \"string\";\n }\n return null;\n}\n\n/** Stringify a derived example, guarding against oversized payloads. */\nfunction stringifyExample(value: Json): string | undefined {\n try {\n const text = JSON.stringify(value, null, 2);\n if (!text || text === \"null\" || text === \"{}\" || text === \"[]\")\n return undefined;\n return text.length > 8_000 ? `${text.slice(0, 8_000)}\\n…` : text;\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeParam(\n root: JsonObject,\n raw: Json,\n seen: Set<string>,\n): NormalizedParam | undefined {\n const param = deref(root, raw, new Set(seen));\n if (!isObject(param)) return undefined;\n const name = asString(param.name);\n const location = asString(param.in);\n if (!name || !location) return undefined;\n // OpenAPI 3 nests type under `schema`; Swagger 2 puts it on the param.\n const type =\n schemaTypeLabel(root, param.schema, seen) ?? asString(param.type);\n return {\n name,\n in: location,\n type,\n required: param.required === true,\n description: asString(param.description),\n };\n}\n\nfunction normalizeOperation(\n root: JsonObject,\n path: string,\n method: string,\n rawOp: Json,\n pathLevelParams: NormalizedParam[],\n seen: Set<string>,\n): NormalizedOperation | undefined {\n if (!isObject(rawOp)) return undefined;\n\n const params: NormalizedParam[] = [...pathLevelParams];\n if (Array.isArray(rawOp.parameters)) {\n for (const rawParam of rawOp.parameters) {\n const normalized = normalizeParam(root, rawParam, seen);\n if (normalized) params.push(normalized);\n }\n }\n\n // Request body: OpenAPI 3 `requestBody.content[*].schema`; Swagger 2 `body` param.\n let requestContentType: string | undefined;\n let requestExample: string | undefined;\n const requestBody = deref(root, rawOp.requestBody, new Set(seen));\n if (isObject(requestBody) && isObject(requestBody.content)) {\n const [contentType, media] = Object.entries(requestBody.content)[0] ?? [];\n requestContentType = contentType;\n if (isObject(media)) {\n requestExample =\n stringifyExample(media.example) ??\n stringifyExample(schemaExample(root, media.schema, seen, 0));\n }\n } else {\n const bodyParam = params.find((p) => p.in === \"body\");\n if (bodyParam) {\n // Swagger 2 body param carries its schema on the raw parameter.\n const rawBody = Array.isArray(rawOp.parameters)\n ? rawOp.parameters.find(\n (p) =>\n isObject(deref(root, p, new Set(seen))) &&\n asString((deref(root, p, new Set(seen)) as JsonObject).in) ===\n \"body\",\n )\n : undefined;\n const resolvedBody = isObject(deref(root, rawBody, new Set(seen)))\n ? (deref(root, rawBody, new Set(seen)) as JsonObject)\n : undefined;\n requestContentType = \"application/json\";\n requestExample = stringifyExample(\n schemaExample(root, resolvedBody?.schema, seen, 0),\n );\n }\n }\n // Swagger 2 `body` params are represented via requestBody above; drop them\n // from the visible param table so they don't double-render.\n const visibleParams = params.filter((p) => p.in !== \"body\");\n\n const responses: NormalizedResponse[] = [];\n if (isObject(rawOp.responses)) {\n for (const [status, rawResponse] of Object.entries(rawOp.responses)) {\n const response = deref(root, rawResponse, new Set(seen));\n let example: string | undefined;\n if (isObject(response)) {\n // OpenAPI 3: response.content[*].schema; Swagger 2: response.schema.\n if (isObject(response.content)) {\n const media = Object.values(response.content)[0];\n if (isObject(media)) {\n example =\n stringifyExample(media.example) ??\n stringifyExample(schemaExample(root, media.schema, seen, 0));\n }\n } else if (response.schema) {\n example = stringifyExample(\n schemaExample(root, response.schema, seen, 0),\n );\n }\n }\n responses.push({\n status,\n description: isObject(response)\n ? asString(response.description)\n : undefined,\n example,\n });\n }\n }\n\n const tags =\n Array.isArray(rawOp.tags) && rawOp.tags.length > 0\n ? rawOp.tags.filter((t): t is string => typeof t === \"string\")\n : [];\n\n const secured =\n Array.isArray(rawOp.security) && rawOp.security.length > 0\n ? rawOp.security.some(\n (req) => isObject(req) && Object.keys(req).length > 0,\n )\n : undefined;\n\n return {\n id: `${method}-${path}`,\n method: method.toUpperCase(),\n path,\n summary: asString(rawOp.summary),\n description: asString(rawOp.description),\n deprecated: rawOp.deprecated === true,\n secured,\n tags: tags.length > 0 ? tags : [\"default\"],\n params: visibleParams,\n requestContentType,\n requestExample,\n responses: responses.sort((a, b) => a.status.localeCompare(b.status)),\n };\n}\n\nfunction normalizeSpec(doc: JsonObject): NormalizedSpec {\n const format: NormalizedSpec[\"format\"] =\n typeof doc.openapi === \"string\"\n ? \"OpenAPI 3\"\n : typeof doc.swagger === \"string\"\n ? \"Swagger 2\"\n : \"Unknown\";\n\n const info = isObject(doc.info) ? doc.info : undefined;\n\n // Global security requirement → every operation without its own override is\n // secured. Operation-level `security: []` opts out; we treat presence here as\n // the default-secured signal.\n const globalSecured =\n Array.isArray(doc.security) &&\n doc.security.some((req) => isObject(req) && Object.keys(req).length > 0);\n\n // Tag order + descriptions from the document's top-level `tags`.\n const tagOrder: string[] = [];\n const tagDescriptions = new Map<string, string>();\n if (Array.isArray(doc.tags)) {\n for (const tag of doc.tags) {\n if (isObject(tag) && typeof tag.name === \"string\") {\n tagOrder.push(tag.name);\n if (typeof tag.description === \"string\") {\n tagDescriptions.set(tag.name, tag.description);\n }\n }\n }\n }\n\n const groups = new Map<string, NormalizedOperation[]>();\n let operationCount = 0;\n\n const paths = isObject(doc.paths) ? doc.paths : {};\n for (const [path, rawPathItem] of Object.entries(paths)) {\n const seen = new Set<string>();\n const pathItem = deref(doc, rawPathItem, seen);\n if (!isObject(pathItem)) continue;\n\n const pathLevelParams: NormalizedParam[] = [];\n if (Array.isArray(pathItem.parameters)) {\n for (const rawParam of pathItem.parameters) {\n const normalized = normalizeParam(doc, rawParam, new Set());\n if (normalized) pathLevelParams.push(normalized);\n }\n }\n\n for (const method of HTTP_METHODS) {\n const rawOp = pathItem[method];\n if (!isObject(rawOp)) continue;\n const operation = normalizeOperation(\n doc,\n path,\n method,\n rawOp,\n pathLevelParams,\n new Set(),\n );\n if (!operation) continue;\n if (operation.secured === undefined && globalSecured) {\n operation.secured = true;\n }\n operationCount += 1;\n for (const tag of operation.tags) {\n const list = groups.get(tag) ?? [];\n list.push(operation);\n groups.set(tag, list);\n }\n }\n }\n\n // Order: documented tags first (in their declared order), then any remaining\n // tags alphabetically.\n const orderedTagNames = [\n ...tagOrder.filter((tag) => groups.has(tag)),\n ...[...groups.keys()]\n .filter((tag) => !tagOrder.includes(tag))\n .sort((a, b) => a.localeCompare(b)),\n ];\n\n const groupList: NormalizedTagGroup[] = orderedTagNames.map((tag) => ({\n tag,\n description: tagDescriptions.get(tag),\n operations: groups.get(tag) ?? [],\n }));\n\n return {\n title: info ? asString(info.title) : undefined,\n version: info ? asString(info.version) : undefined,\n description: info ? asString(info.description) : undefined,\n format,\n groups: groupList,\n operationCount,\n };\n}\n\n/* ── Operation row (collapsed-by-default, mirrors api-endpoint) ─────────────── */\n\nfunction OperationRow({\n operation,\n renderMarkdown,\n}: {\n operation: NormalizedOperation;\n renderMarkdown?: (markdown: string) => React.ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n\n const hasBody =\n Boolean(operation.description?.trim()) ||\n operation.params.length > 0 ||\n Boolean(operation.requestExample || operation.requestContentType) ||\n operation.responses.length > 0;\n\n return (\n <div className=\"overflow-hidden border-t border-plan-line first:border-t-0\">\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-2.5 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[operation.method] ??\n \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\",\n )}\n >\n {operation.method}\n </span>\n <span\n className={cn(\n \"min-w-0 truncate font-mono text-sm font-semibold text-plan-text\",\n operation.deprecated && \"text-plan-muted line-through\",\n )}\n >\n {operation.path}\n </span>\n {operation.summary && (\n <span className=\"ml-1 min-w-0 flex-1 truncate text-sm text-plan-muted\">\n {operation.summary}\n </span>\n )}\n {operation.secured && (\n <IconLock\n className=\"size-3.5 shrink-0 text-plan-muted\"\n aria-label=\"Requires authentication\"\n />\n )}\n </button>\n\n {open && hasBody && (\n <div className=\"border-t border-plan-line bg-plan-block px-4 py-4\">\n {operation.description?.trim() && (\n <div className=\"an-api-endpoint-desc\">\n {renderMarkdown ? (\n renderMarkdown(operation.description)\n ) : (\n <p className=\"text-sm text-plan-muted\">\n {operation.description}\n </p>\n )}\n </div>\n )}\n\n {operation.params.length > 0 && (\n <div className=\"mt-4\">\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 {operation.params.map((param, index) => (\n <tr\n key={`${param.name}-${param.in}-${index}`}\n className=\"border-t border-plan-line align-top\"\n >\n <td className=\"px-3 py-2 font-mono text-xs font-semibold text-plan-text\">\n {param.name}\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 \"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300\",\n )}\n >\n {param.in}\n </span>\n </td>\n <td className=\"px-3 py-2 font-mono text-xs text-plan-muted\">\n {param.type || \"—\"}\n </td>\n <td className=\"px-3 py-2 text-xs\">\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\">optional</span>\n )}\n </td>\n <td className=\"px-3 py-2 text-xs text-plan-muted\">\n {param.description || \"—\"}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {(operation.requestExample || operation.requestContentType) && (\n <div className=\"mt-4\">\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 {operation.requestContentType && (\n <span className=\"rounded bg-accent/40 px-1.5 py-0.5 font-mono text-[11px] text-plan-muted\">\n {operation.requestContentType}\n </span>\n )}\n </div>\n {operation.requestExample && (\n <pre className=\"mt-2 overflow-auto rounded-lg border border-plan-line bg-plan-code px-3 py-2 font-mono text-xs text-plan-code-text\">\n {operation.requestExample}\n </pre>\n )}\n </div>\n )}\n\n {operation.responses.length > 0 && (\n <div className=\"mt-4\">\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 {operation.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 className=\"text-sm text-plan-muted\">\n {response.description}\n </span>\n )}\n </div>\n {response.example && (\n <pre className=\"overflow-auto border-t border-plan-line bg-plan-code px-3 py-2 font-mono text-xs text-plan-code-text\">\n {response.example}\n </pre>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/* ── Tag group (collapsed-by-default) ──────────────────────────────────────── */\n\nfunction TagGroup({\n group,\n defaultOpen,\n renderMarkdown,\n}: {\n group: NormalizedTagGroup;\n defaultOpen: boolean;\n renderMarkdown?: (markdown: string) => React.ReactNode;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <div className=\"overflow-hidden rounded-xl border border-plan-line bg-plan-block\">\n <button\n type=\"button\"\n data-plan-interactive\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-center gap-2 px-4 py-3 text-left transition-colors hover:bg-accent/40\"\n >\n <IconChevronRight\n className={cn(\n \"size-4 shrink-0 text-plan-muted transition-transform\",\n open && \"rotate-90\",\n )}\n />\n <span className=\"font-semibold text-plan-text\">{group.tag}</span>\n <span className=\"rounded-full bg-accent/40 px-2 py-0.5 text-[11px] font-medium text-plan-muted\">\n {group.operations.length}\n </span>\n {group.description && (\n <span className=\"ml-1 min-w-0 flex-1 truncate text-sm text-plan-muted\">\n {group.description}\n </span>\n )}\n </button>\n {open && (\n <div className=\"border-t border-plan-line\">\n {group.operations.map((operation) => (\n <OperationRow\n key={operation.id}\n operation={operation}\n renderMarkdown={renderMarkdown}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/* ── Read (Redoc / Swagger-UI-style reference) ─────────────────────────────── */\n\n/**\n * Read-only renderer for an `openapi-spec` block. Parses `data.spec` defensively\n * and renders a Redoc / Swagger-UI-style reference: a header (title + version +\n * format badge), then operations grouped by tag, each a collapsed-by-default row\n * that expands to the full per-operation reference. On a parse error it shows the\n * error plus the raw payload (never throws).\n */\nexport function OpenApiSpecRead({\n data,\n blockId,\n title,\n summary,\n ctx,\n}: BlockReadProps<OpenApiSpecData>) {\n const parsed = useMemo(() => parseSpec(data.spec), [data.spec]);\n const heading = data.title ?? title;\n const renderMarkdown = ctx.renderMarkdown;\n\n return (\n <section className=\"plan-block\" data-block-id={blockId}>\n {heading && <div className=\"plan-block-label\">{heading}</div>}\n\n {parsed.ok && parsed.spec ? (\n <div className=\"flex flex-col gap-3\">\n <div className=\"overflow-hidden rounded-xl border border-plan-line bg-plan-block px-4 py-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-semibold text-plan-text\">\n {parsed.spec.title || \"API reference\"}\n </span>\n {parsed.spec.version && (\n <span className=\"rounded bg-accent/40 px-1.5 py-0.5 font-mono text-[11px] text-plan-muted\">\n v{parsed.spec.version}\n </span>\n )}\n <span className=\"rounded-full border border-plan-line px-2 py-0.5 text-[11px] font-medium text-plan-muted\">\n {parsed.spec.format}\n </span>\n <span className=\"text-xs text-plan-muted\">\n {parsed.spec.operationCount}{\" \"}\n {parsed.spec.operationCount === 1 ? \"operation\" : \"operations\"}\n </span>\n </div>\n {parsed.spec.description?.trim() && (\n <div className=\"mt-2 an-api-endpoint-desc\">\n {renderMarkdown ? (\n renderMarkdown(parsed.spec.description)\n ) : (\n <p className=\"text-sm text-plan-muted\">\n {parsed.spec.description}\n </p>\n )}\n </div>\n )}\n </div>\n\n {parsed.spec.groups.length === 0 ? (\n <div className=\"rounded-xl border border-plan-line bg-plan-block px-4 py-6 text-center text-sm text-plan-muted\">\n No operations found in this spec.\n </div>\n ) : (\n parsed.spec.groups.map((group, index) => (\n <TagGroup\n key={group.tag}\n group={group}\n // Open the first group by default so the reference is not a wall\n // of collapsed accordions on first paint.\n defaultOpen={index === 0}\n renderMarkdown={renderMarkdown}\n />\n ))\n )}\n </div>\n ) : (\n <div className=\"overflow-hidden rounded-xl border border-plan-line bg-plan-code\">\n <div className=\"border-b border-plan-line px-3 py-1.5\">\n <span className=\"font-mono text-xs uppercase tracking-wide text-plan-muted\">\n OpenAPI\n </span>\n </div>\n <div className=\"space-y-2 px-3 py-2.5\">\n <p className=\"text-xs text-red-600 dark:text-red-300\">\n Could not parse spec: {parsed.error}\n </p>\n <pre className=\"overflow-auto whitespace-pre-wrap break-words font-mono text-xs text-plan-code-text\">\n {data.spec || \"—\"}\n </pre>\n </div>\n </div>\n )}\n\n {summary && <p className=\"mt-5 text-plan-muted\">{summary}</p>}\n </section>\n );\n}\n\n/* ── Edit (panel form) ─────────────────────────────────────────────────────── */\n\n/**\n * Panel editor for an `openapi-spec` block: a `title` input plus a monospace\n * textarea bound to the raw `spec`, with a \"Format\" button that pretty-prints via\n * `JSON.parse` → `JSON.stringify(_, null, 2)` (guarded — shows an INLINE error,\n * never `window.alert`). Renders BARE content (no `<section>`); the registry's\n * panel surface supplies the popover chrome.\n */\nexport function OpenApiSpecEdit({\n data,\n onChange,\n editable,\n}: BlockEditProps<OpenApiSpecData>) {\n const titleId = useId();\n const specId = useId();\n const [formatError, setFormatError] = useState<string | null>(null);\n\n const handleFormat = () => {\n try {\n const formatted = JSON.stringify(JSON.parse(data.spec), null, 2);\n setFormatError(null);\n onChange({ ...data, spec: formatted });\n } catch (error) {\n setFormatError(\n error instanceof Error ? error.message : \"Invalid JSON — cannot format\",\n );\n }\n };\n\n return (\n <div className=\"grid gap-3\" data-plan-interactive>\n <div className=\"grid gap-1.5\">\n <DevLabel htmlFor={titleId}>Title</DevLabel>\n <DevInput\n id={titleId}\n value={data.title ?? \"\"}\n readOnly={!editable}\n onChange={(event) =>\n onChange({ ...data, title: event.target.value || undefined })\n }\n placeholder=\"Optional heading\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <DevLabel htmlFor={specId}>OpenAPI / Swagger spec</DevLabel>\n {editable && (\n <button\n type=\"button\"\n data-plan-interactive\n onClick={handleFormat}\n className=\"inline-flex h-7 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md border border-input bg-background px-2 text-xs font-medium ring-offset-background transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n >\n Format\n </button>\n )}\n </div>\n <DevTextarea\n id={specId}\n value={data.spec}\n readOnly={!editable}\n spellCheck={false}\n onChange={(event) => {\n setFormatError(null);\n onChange({ ...data, spec: event.target.value });\n }}\n className=\"min-h-72 font-mono text-xs\"\n placeholder={\n '{\\n \"openapi\": \"3.0.0\",\\n \"info\": { \"title\": \"My API\", \"version\": \"1.0.0\" },\\n \"paths\": {}\\n}'\n }\n />\n {formatError && (\n <p className=\"text-xs text-red-600 dark:text-red-300\">\n {formatError}\n </p>\n )}\n <p className=\"text-xs text-muted-foreground\">\n Paste a complete OpenAPI 3 or Swagger 2 document. v1 supports JSON\n specs only — convert YAML to JSON first.\n </p>\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import type { BlockMdxConfig } from "../types.js";
3
+ /**
4
+ * Pure (React-free) part of the PLAN-SPECIFIC `annotated-code` block: its data
5
+ * schema and MDX round-trip config. Shared by the server MDX adapter
6
+ * (`plan-mdx.ts` via `plan-block-registry.ts`) and the client spec
7
+ * (`planBlocks.tsx`). Keeping this React-free means importing it into a server
8
+ * module never pulls React into the Nitro/SSR bundle.
9
+ *
10
+ * The block renders a Stripe-docs / Sourcegraph "explain this code" style
11
+ * walkthrough: a line-numbered monospace code surface where annotated line
12
+ * ranges get a highlight band + numbered gutter marker, paired with a list of
13
+ * line-anchored notes (each note targets a 1-based `lines` ref like `"3"` or
14
+ * `"3-5"`). Hovering a note highlights its lines, and vice-versa.
15
+ *
16
+ * The schema MUST stay data-compatible with the `annotated-code` branch of
17
+ * `planBlockSchema` (`plan-content.ts`), and the MDX `tag` (`AnnotatedCode`) +
18
+ * flat attribute shape MUST match that inline member so stored `.mdx`
19
+ * round-trips. `code` is a multiline string ATTRIBUTE (the shared `prop()`
20
+ * encoder round-trips multiline strings cleanly, and keeping it an attribute —
21
+ * not MDX children — avoids the source being reflowed as prose); `annotations`
22
+ * is a JSON array attribute.
23
+ */
24
+ /** One line-anchored note over the code. */
25
+ export interface AnnotatedCodeAnnotation {
26
+ /** 1-based line reference: a single line `"3"` or an inclusive range `"3-5"`. */
27
+ lines: string;
28
+ /** Optional short label shown before the note (e.g. "Lookup"). */
29
+ label?: string;
30
+ /** The note prose (markdown), rendered through `ctx.renderMarkdown`. */
31
+ note: string;
32
+ }
33
+ export interface AnnotatedCodeData {
34
+ /** Optional file path shown in the header (e.g. `src/server/auth.ts`). */
35
+ filename?: string;
36
+ /** Optional language label (e.g. `ts`). Cosmetic chip + future highlighting. */
37
+ language?: string;
38
+ /** The source the walkthrough annotates. Rendered line-numbered. */
39
+ code: string;
40
+ /** Line-anchored notes. */
41
+ annotations?: AnnotatedCodeAnnotation[];
42
+ }
43
+ /**
44
+ * Data-compatible with the inline `annotated-code` member of `planBlockSchema`
45
+ * (`plan-content.ts`). `code` is the only required field; `annotations` defaults
46
+ * to omitted so a fresh block validates from `{ code: "…" }`.
47
+ */
48
+ export declare const annotatedCodeSchema: z.ZodType<AnnotatedCodeData>;
49
+ /**
50
+ * MDX config: `<AnnotatedCode filename language code annotations />` self-closing
51
+ * form. Insertion order of `toAttrs` is the on-disk attribute order. `code` is a
52
+ * multiline string attribute (round-trips through the shared `prop()` encoder);
53
+ * `annotations` is a JSON array attribute. `fromAttrs` mirrors a forgiving parse
54
+ * (`code ?? ""`, `annotations ?? []`, optional `filename`/`language` undefined
55
+ * when absent) so a plan missing an attribute still parses.
56
+ */
57
+ export declare const annotatedCodeMdx: BlockMdxConfig<AnnotatedCodeData>;
58
+ //# sourceMappingURL=annotated-code.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotated-code.config.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/annotated-code.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,4CAA4C;AAC5C,MAAM,WAAW,uBAAuB;IACtC,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACzC;AAqBD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAKf,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,iBAAiB,CAc9D,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * A 1-based line reference: `"3"` or `"3-5"` (inclusive). Whitespace tolerant.
4
+ * The renderer parses this defensively too, but the schema rejects clearly
5
+ * malformed refs so authored/agent-generated data stays clean.
6
+ */
7
+ const lineRefSchema = z
8
+ .string()
9
+ .trim()
10
+ .regex(/^\d+(\s*-\s*\d+)?$/, {
11
+ message: 'lines must be a 1-based line ref like "3" or "3-5"',
12
+ })
13
+ .max(40);
14
+ const annotationSchema = z.object({
15
+ lines: lineRefSchema,
16
+ label: z.string().trim().max(160).optional(),
17
+ note: z.string().trim().min(1).max(4_000),
18
+ });
19
+ /**
20
+ * Data-compatible with the inline `annotated-code` member of `planBlockSchema`
21
+ * (`plan-content.ts`). `code` is the only required field; `annotations` defaults
22
+ * to omitted so a fresh block validates from `{ code: "…" }`.
23
+ */
24
+ export const annotatedCodeSchema = z.object({
25
+ filename: z.string().trim().max(400).optional(),
26
+ language: z.string().trim().max(40).optional(),
27
+ code: z.string().max(100_000),
28
+ annotations: z.array(annotationSchema).max(80).optional(),
29
+ });
30
+ /**
31
+ * MDX config: `<AnnotatedCode filename language code annotations />` self-closing
32
+ * form. Insertion order of `toAttrs` is the on-disk attribute order. `code` is a
33
+ * multiline string attribute (round-trips through the shared `prop()` encoder);
34
+ * `annotations` is a JSON array attribute. `fromAttrs` mirrors a forgiving parse
35
+ * (`code ?? ""`, `annotations ?? []`, optional `filename`/`language` undefined
36
+ * when absent) so a plan missing an attribute still parses.
37
+ */
38
+ export const annotatedCodeMdx = {
39
+ tag: "AnnotatedCode",
40
+ toAttrs: (data) => ({
41
+ filename: data.filename,
42
+ language: data.language,
43
+ code: data.code,
44
+ annotations: data.annotations,
45
+ }),
46
+ fromAttrs: (attrs) => ({
47
+ filename: attrs.string("filename"),
48
+ language: attrs.string("language"),
49
+ code: attrs.string("code") ?? "",
50
+ annotations: attrs.array("annotations") ?? [],
51
+ }),
52
+ };
53
+ //# sourceMappingURL=annotated-code.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotated-code.config.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/annotated-code.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8CxB;;;;GAIG;AACH,MAAM,aAAa,GAAG,CAAC;KACpB,MAAM,EAAE;KACR,IAAI,EAAE;KACN,KAAK,CAAC,oBAAoB,EAAE;IAC3B,OAAO,EAAE,oDAAoD;CAC9D,CAAC;KACD,GAAG,CAAC,EAAE,CAAC,CAAC;AAEX,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;CAC1C,CAAuC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC;IAC7B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC1D,CAA4C,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAsC;IACjE,GAAG,EAAE,eAAe;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC;IACF,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrB,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;QAClC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;QAClC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAChC,WAAW,EAAE,KAAK,CAAC,KAAK,CAA0B,aAAa,CAAC,IAAI,EAAE;KACvE,CAAC;CACH,CAAC","sourcesContent":["import { z } from \"zod\";\nimport type { BlockMdxConfig } from \"../types.js\";\n\n/**\n * Pure (React-free) part of the PLAN-SPECIFIC `annotated-code` block: its data\n * schema and MDX round-trip config. Shared by the server MDX adapter\n * (`plan-mdx.ts` via `plan-block-registry.ts`) and the client spec\n * (`planBlocks.tsx`). Keeping this React-free means importing it into a server\n * module never pulls React into the Nitro/SSR bundle.\n *\n * The block renders a Stripe-docs / Sourcegraph \"explain this code\" style\n * walkthrough: a line-numbered monospace code surface where annotated line\n * ranges get a highlight band + numbered gutter marker, paired with a list of\n * line-anchored notes (each note targets a 1-based `lines` ref like `\"3\"` or\n * `\"3-5\"`). Hovering a note highlights its lines, and vice-versa.\n *\n * The schema MUST stay data-compatible with the `annotated-code` branch of\n * `planBlockSchema` (`plan-content.ts`), and the MDX `tag` (`AnnotatedCode`) +\n * flat attribute shape MUST match that inline member so stored `.mdx`\n * round-trips. `code` is a multiline string ATTRIBUTE (the shared `prop()`\n * encoder round-trips multiline strings cleanly, and keeping it an attribute —\n * not MDX children — avoids the source being reflowed as prose); `annotations`\n * is a JSON array attribute.\n */\n\n/** One line-anchored note over the code. */\nexport interface AnnotatedCodeAnnotation {\n /** 1-based line reference: a single line `\"3\"` or an inclusive range `\"3-5\"`. */\n lines: string;\n /** Optional short label shown before the note (e.g. \"Lookup\"). */\n label?: string;\n /** The note prose (markdown), rendered through `ctx.renderMarkdown`. */\n note: string;\n}\n\nexport interface AnnotatedCodeData {\n /** Optional file path shown in the header (e.g. `src/server/auth.ts`). */\n filename?: string;\n /** Optional language label (e.g. `ts`). Cosmetic chip + future highlighting. */\n language?: string;\n /** The source the walkthrough annotates. Rendered line-numbered. */\n code: string;\n /** Line-anchored notes. */\n annotations?: AnnotatedCodeAnnotation[];\n}\n\n/**\n * A 1-based line reference: `\"3\"` or `\"3-5\"` (inclusive). Whitespace tolerant.\n * The renderer parses this defensively too, but the schema rejects clearly\n * malformed refs so authored/agent-generated data stays clean.\n */\nconst lineRefSchema = z\n .string()\n .trim()\n .regex(/^\\d+(\\s*-\\s*\\d+)?$/, {\n message: 'lines must be a 1-based line ref like \"3\" or \"3-5\"',\n })\n .max(40);\n\nconst annotationSchema = z.object({\n lines: lineRefSchema,\n label: z.string().trim().max(160).optional(),\n note: z.string().trim().min(1).max(4_000),\n}) as z.ZodType<AnnotatedCodeAnnotation>;\n\n/**\n * Data-compatible with the inline `annotated-code` member of `planBlockSchema`\n * (`plan-content.ts`). `code` is the only required field; `annotations` defaults\n * to omitted so a fresh block validates from `{ code: \"…\" }`.\n */\nexport const annotatedCodeSchema = z.object({\n filename: z.string().trim().max(400).optional(),\n language: z.string().trim().max(40).optional(),\n code: z.string().max(100_000),\n annotations: z.array(annotationSchema).max(80).optional(),\n}) as unknown as z.ZodType<AnnotatedCodeData>;\n\n/**\n * MDX config: `<AnnotatedCode filename language code annotations />` self-closing\n * form. Insertion order of `toAttrs` is the on-disk attribute order. `code` is a\n * multiline string attribute (round-trips through the shared `prop()` encoder);\n * `annotations` is a JSON array attribute. `fromAttrs` mirrors a forgiving parse\n * (`code ?? \"\"`, `annotations ?? []`, optional `filename`/`language` undefined\n * when absent) so a plan missing an attribute still parses.\n */\nexport const annotatedCodeMdx: BlockMdxConfig<AnnotatedCodeData> = {\n tag: \"AnnotatedCode\",\n toAttrs: (data) => ({\n filename: data.filename,\n language: data.language,\n code: data.code,\n annotations: data.annotations,\n }),\n fromAttrs: (attrs) => ({\n filename: attrs.string(\"filename\"),\n language: attrs.string(\"language\"),\n code: attrs.string(\"code\") ?? \"\",\n annotations: attrs.array<AnnotatedCodeAnnotation>(\"annotations\") ?? [],\n }),\n};\n"]}
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ import type { BlockMdxConfig } from "../types.js";
3
+ /**
4
+ * Pure (React-free) part of the PLAN-SPECIFIC `api-endpoint` block: its data
5
+ * schema and MDX round-trip config. Shared by the server MDX adapter
6
+ * (`plan-mdx.ts` via `plan-block-registry.ts`) and the client spec
7
+ * (`planBlocks.tsx`). Keeping this React-free means importing it into a server
8
+ * module never pulls React into the Nitro/SSR bundle.
9
+ *
10
+ * The block renders a Swagger / Stripe-style API reference row: a colored method
11
+ * pill + monospace path + summary, collapsed by default, expanding to a params
12
+ * table, a request body example, and per-status response examples.
13
+ *
14
+ * The schema MUST stay data-compatible with the `api-endpoint` branch of
15
+ * `planBlockSchema` (`plan-content.ts`), and the MDX `tag` (`Endpoint`) +
16
+ * attribute/children shape MUST match the inline planBlockSchema member so
17
+ * stored `.mdx` round-trips. `description` is MDX *children* (prose body);
18
+ * every other field is an attribute.
19
+ */
20
+ export type ApiEndpointMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
21
+ export declare const API_ENDPOINT_METHODS: ApiEndpointMethod[];
22
+ export type ApiParamLocation = "path" | "query" | "header" | "body";
23
+ export declare const API_PARAM_LOCATIONS: ApiParamLocation[];
24
+ export interface ApiEndpointParam {
25
+ name: string;
26
+ in: ApiParamLocation;
27
+ type?: string;
28
+ required?: boolean;
29
+ description?: string;
30
+ }
31
+ export interface ApiEndpointRequest {
32
+ contentType?: string;
33
+ example?: string;
34
+ }
35
+ export interface ApiEndpointResponse {
36
+ status: string;
37
+ description?: string;
38
+ example?: string;
39
+ }
40
+ export interface ApiEndpointData {
41
+ method: ApiEndpointMethod;
42
+ path: string;
43
+ summary?: string;
44
+ /** Markdown prose body. Serialized as MDX children, not an attribute. */
45
+ description?: string;
46
+ auth?: string;
47
+ deprecated?: boolean;
48
+ params?: ApiEndpointParam[];
49
+ request?: ApiEndpointRequest;
50
+ responses?: ApiEndpointResponse[];
51
+ }
52
+ /**
53
+ * Data-compatible with the inline `api-endpoint` member of `planBlockSchema`
54
+ * (`plan-content.ts`). `method` + `path` are required; everything else is
55
+ * optional and defaults to omitted so a fresh endpoint validates from
56
+ * `{ method: "GET", path: "/api/resource" }`.
57
+ */
58
+ export declare const apiEndpointSchema: z.ZodType<ApiEndpointData>;
59
+ /**
60
+ * MDX config: `<Endpoint method path summary auth deprecated params request
61
+ * responses>\n\n{description}\n\n</Endpoint>`. `description` is the prose body
62
+ * (`childrenField`), so it is excluded from the attribute bag and survives as
63
+ * real inline-editable MDX prose. The remaining keys are emitted in a STABLE
64
+ * order (method, path, summary, auth, deprecated, params, request, responses);
65
+ * `undefined` values are dropped by the shared `prop()` encoder.
66
+ *
67
+ * `fromAttrs` tolerates missing/partial attributes for backward-compat, mirrors
68
+ * the schema defaults, and reads the prose `children` into `description`.
69
+ */
70
+ export declare const apiEndpointMdx: BlockMdxConfig<ApiEndpointData>;
71
+ //# sourceMappingURL=api-endpoint.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-endpoint.config.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/api-endpoint.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,QAAQ,GACR,MAAM,GACN,SAAS,CAAC;AAEd,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAQnD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpE,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,EAKjD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,gBAAgB,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAqBD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAUb,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,eAAe,CA6B1D,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { z } from "zod";
2
+ export const API_ENDPOINT_METHODS = [
3
+ "GET",
4
+ "POST",
5
+ "PUT",
6
+ "PATCH",
7
+ "DELETE",
8
+ "HEAD",
9
+ "OPTIONS",
10
+ ];
11
+ export const API_PARAM_LOCATIONS = [
12
+ "path",
13
+ "query",
14
+ "header",
15
+ "body",
16
+ ];
17
+ const apiParamSchema = z.object({
18
+ name: z.string().trim().min(1).max(160),
19
+ in: z.enum(["path", "query", "header", "body"]),
20
+ type: z.string().trim().max(120).optional(),
21
+ required: z.boolean().optional(),
22
+ description: z.string().trim().max(1_000).optional(),
23
+ });
24
+ const apiRequestSchema = z.object({
25
+ contentType: z.string().trim().max(160).optional(),
26
+ example: z.string().max(20_000).optional(),
27
+ });
28
+ const apiResponseSchema = z.object({
29
+ status: z.string().trim().min(1).max(40),
30
+ description: z.string().trim().max(1_000).optional(),
31
+ example: z.string().max(20_000).optional(),
32
+ });
33
+ /**
34
+ * Data-compatible with the inline `api-endpoint` member of `planBlockSchema`
35
+ * (`plan-content.ts`). `method` + `path` are required; everything else is
36
+ * optional and defaults to omitted so a fresh endpoint validates from
37
+ * `{ method: "GET", path: "/api/resource" }`.
38
+ */
39
+ export const apiEndpointSchema = z.object({
40
+ method: z.enum(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]),
41
+ path: z.string().trim().min(1).max(500),
42
+ summary: z.string().trim().max(400).optional(),
43
+ description: z.string().max(20_000).optional(),
44
+ auth: z.string().trim().max(200).optional(),
45
+ deprecated: z.boolean().optional(),
46
+ params: z.array(apiParamSchema).max(60).optional(),
47
+ request: apiRequestSchema.optional(),
48
+ responses: z.array(apiResponseSchema).max(40).optional(),
49
+ });
50
+ /**
51
+ * MDX config: `<Endpoint method path summary auth deprecated params request
52
+ * responses>\n\n{description}\n\n</Endpoint>`. `description` is the prose body
53
+ * (`childrenField`), so it is excluded from the attribute bag and survives as
54
+ * real inline-editable MDX prose. The remaining keys are emitted in a STABLE
55
+ * order (method, path, summary, auth, deprecated, params, request, responses);
56
+ * `undefined` values are dropped by the shared `prop()` encoder.
57
+ *
58
+ * `fromAttrs` tolerates missing/partial attributes for backward-compat, mirrors
59
+ * the schema defaults, and reads the prose `children` into `description`.
60
+ */
61
+ export const apiEndpointMdx = {
62
+ tag: "Endpoint",
63
+ childrenField: "description",
64
+ toAttrs: (data) => ({
65
+ method: data.method,
66
+ path: data.path,
67
+ summary: data.summary,
68
+ auth: data.auth,
69
+ deprecated: data.deprecated,
70
+ params: data.params,
71
+ request: data.request,
72
+ responses: data.responses,
73
+ }),
74
+ fromAttrs: (attrs, children) => {
75
+ const method = (attrs.string("method") ?? "GET");
76
+ const request = attrs.object("request");
77
+ const description = children.trim();
78
+ return {
79
+ method: API_ENDPOINT_METHODS.includes(method) ? method : "GET",
80
+ path: attrs.string("path") ?? "",
81
+ summary: attrs.string("summary"),
82
+ description: description.length > 0 ? description : undefined,
83
+ auth: attrs.string("auth"),
84
+ deprecated: attrs.bool("deprecated"),
85
+ params: attrs.array("params"),
86
+ request: request ?? undefined,
87
+ responses: attrs.array("responses"),
88
+ };
89
+ },
90
+ };
91
+ //# sourceMappingURL=api-endpoint.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-endpoint.config.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/api-endpoint.config.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport type { BlockMdxConfig } from \"../types.js\";\n\n/**\n * Pure (React-free) part of the PLAN-SPECIFIC `api-endpoint` block: its data\n * schema and MDX round-trip config. Shared by the server MDX adapter\n * (`plan-mdx.ts` via `plan-block-registry.ts`) and the client spec\n * (`planBlocks.tsx`). Keeping this React-free means importing it into a server\n * module never pulls React into the Nitro/SSR bundle.\n *\n * The block renders a Swagger / Stripe-style API reference row: a colored method\n * pill + monospace path + summary, collapsed by default, expanding to a params\n * table, a request body example, and per-status response examples.\n *\n * The schema MUST stay data-compatible with the `api-endpoint` branch of\n * `planBlockSchema` (`plan-content.ts`), and the MDX `tag` (`Endpoint`) +\n * attribute/children shape MUST match the inline planBlockSchema member so\n * stored `.mdx` round-trips. `description` is MDX *children* (prose body);\n * every other field is an attribute.\n */\n\nexport type ApiEndpointMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"PATCH\"\n | \"DELETE\"\n | \"HEAD\"\n | \"OPTIONS\";\n\nexport const API_ENDPOINT_METHODS: ApiEndpointMethod[] = [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n];\n\nexport type ApiParamLocation = \"path\" | \"query\" | \"header\" | \"body\";\n\nexport const API_PARAM_LOCATIONS: ApiParamLocation[] = [\n \"path\",\n \"query\",\n \"header\",\n \"body\",\n];\n\nexport interface ApiEndpointParam {\n name: string;\n in: ApiParamLocation;\n type?: string;\n required?: boolean;\n description?: string;\n}\n\nexport interface ApiEndpointRequest {\n contentType?: string;\n example?: string;\n}\n\nexport interface ApiEndpointResponse {\n status: string;\n description?: string;\n example?: string;\n}\n\nexport interface ApiEndpointData {\n method: ApiEndpointMethod;\n path: string;\n summary?: string;\n /** Markdown prose body. Serialized as MDX children, not an attribute. */\n description?: string;\n auth?: string;\n deprecated?: boolean;\n params?: ApiEndpointParam[];\n request?: ApiEndpointRequest;\n responses?: ApiEndpointResponse[];\n}\n\nconst apiParamSchema = z.object({\n name: z.string().trim().min(1).max(160),\n in: z.enum([\"path\", \"query\", \"header\", \"body\"]),\n type: z.string().trim().max(120).optional(),\n required: z.boolean().optional(),\n description: z.string().trim().max(1_000).optional(),\n}) as z.ZodType<ApiEndpointParam>;\n\nconst apiRequestSchema = z.object({\n contentType: z.string().trim().max(160).optional(),\n example: z.string().max(20_000).optional(),\n}) as z.ZodType<ApiEndpointRequest>;\n\nconst apiResponseSchema = z.object({\n status: z.string().trim().min(1).max(40),\n description: z.string().trim().max(1_000).optional(),\n example: z.string().max(20_000).optional(),\n}) as z.ZodType<ApiEndpointResponse>;\n\n/**\n * Data-compatible with the inline `api-endpoint` member of `planBlockSchema`\n * (`plan-content.ts`). `method` + `path` are required; everything else is\n * optional and defaults to omitted so a fresh endpoint validates from\n * `{ method: \"GET\", path: \"/api/resource\" }`.\n */\nexport const apiEndpointSchema = z.object({\n method: z.enum([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\", \"OPTIONS\"]),\n path: z.string().trim().min(1).max(500),\n summary: z.string().trim().max(400).optional(),\n description: z.string().max(20_000).optional(),\n auth: z.string().trim().max(200).optional(),\n deprecated: z.boolean().optional(),\n params: z.array(apiParamSchema).max(60).optional(),\n request: apiRequestSchema.optional(),\n responses: z.array(apiResponseSchema).max(40).optional(),\n}) as unknown as z.ZodType<ApiEndpointData>;\n\n/**\n * MDX config: `<Endpoint method path summary auth deprecated params request\n * responses>\\n\\n{description}\\n\\n</Endpoint>`. `description` is the prose body\n * (`childrenField`), so it is excluded from the attribute bag and survives as\n * real inline-editable MDX prose. The remaining keys are emitted in a STABLE\n * order (method, path, summary, auth, deprecated, params, request, responses);\n * `undefined` values are dropped by the shared `prop()` encoder.\n *\n * `fromAttrs` tolerates missing/partial attributes for backward-compat, mirrors\n * the schema defaults, and reads the prose `children` into `description`.\n */\nexport const apiEndpointMdx: BlockMdxConfig<ApiEndpointData> = {\n tag: \"Endpoint\",\n childrenField: \"description\",\n toAttrs: (data) => ({\n method: data.method,\n path: data.path,\n summary: data.summary,\n auth: data.auth,\n deprecated: data.deprecated,\n params: data.params,\n request: data.request as Record<string, unknown> | undefined,\n responses: data.responses,\n }),\n fromAttrs: (attrs, children) => {\n const method = (attrs.string(\"method\") ?? \"GET\") as ApiEndpointMethod;\n const request = attrs.object<ApiEndpointRequest>(\"request\");\n const description = children.trim();\n return {\n method: API_ENDPOINT_METHODS.includes(method) ? method : \"GET\",\n path: attrs.string(\"path\") ?? \"\",\n summary: attrs.string(\"summary\"),\n description: description.length > 0 ? description : undefined,\n auth: attrs.string(\"auth\"),\n deprecated: attrs.bool(\"deprecated\"),\n params: attrs.array<ApiEndpointParam>(\"params\"),\n request: request ?? undefined,\n responses: attrs.array<ApiEndpointResponse>(\"responses\"),\n };\n },\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"checklist.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/checklist.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,uBAAuB,CAAC;AAsB/B;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE,cAAc,CAAC,aAAa,CAAC,GAAG;IACjC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,2CA8BA;AA0BD,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE,cAAc,CAAC,aAAa,CAAC,2CAuE/B;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,gDAYzB,CAAC"}
1
+ {"version":3,"file":"checklist.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/checklist.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,uBAAuB,CAAC;AAsB/B;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE,cAAc,CAAC,aAAa,CAAC,GAAG;IACjC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,2CA8BA;AA0BD,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE,cAAc,CAAC,aAAa,CAAC,2CAuE/B;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,gDAczB,CAAC"}
@@ -27,7 +27,7 @@ function newItemId() {
27
27
  * the markers render statically.
28
28
  */
29
29
  export function ChecklistBlock({ data, blockId, title, onToggle, }) {
30
- return (_jsxs("section", { className: "plan-block", "data-block-id": blockId, children: [title && _jsx("h2", { children: title }), _jsx("div", { className: "grid gap-3", children: data.items.map((item) => onToggle ? (_jsxs("button", { type: "button", "data-plan-interactive": true, className: "flex items-start gap-3 text-left text-plan-muted", onClick: () => onToggle(item.id), children: [_jsx(ChecklistMarker, { checked: item.checked }), _jsx(ChecklistItemBody, { item: item })] }, item.id)) : (_jsxs("div", { className: "flex items-start gap-3 text-left text-plan-muted", children: [_jsx(ChecklistMarker, { checked: item.checked }), _jsx(ChecklistItemBody, { item: item })] }, item.id))) })] }));
30
+ return (_jsxs("section", { className: "plan-block", "data-block-id": blockId, children: [title && _jsx("div", { className: "plan-block-label", children: title }), _jsx("div", { className: "grid gap-3", children: data.items.map((item) => onToggle ? (_jsxs("button", { type: "button", "data-plan-interactive": true, className: "flex items-start gap-3 text-left text-plan-muted", onClick: () => onToggle(item.id), children: [_jsx(ChecklistMarker, { checked: item.checked }), _jsx(ChecklistItemBody, { item: item })] }, item.id)) : (_jsxs("div", { className: "flex items-start gap-3 text-left text-plan-muted", children: [_jsx(ChecklistMarker, { checked: item.checked }), _jsx(ChecklistItemBody, { item: item })] }, item.id))) })] }));
31
31
  }
32
32
  function ChecklistMarker({ checked }) {
33
33
  return (_jsx("span", { className: cn("mt-1 flex size-5 items-center justify-center rounded border", checked
@@ -68,6 +68,8 @@ export const checklistBlock = defineBlock({
68
68
  Read: ChecklistBlock,
69
69
  Edit: ChecklistEditor,
70
70
  placement: ["block"],
71
+ // A checklist maps to NFM to-do items, so it round-trips to Notion.
72
+ notionCompatible: true,
71
73
  label: "Checklist",
72
74
  icon: IconCheck,
73
75
  description: "A list of toggleable items, each with a label and an optional note.",
@@ -1 +1 @@
1
- {"version":3,"file":"checklist.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/checklist.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IconCheck, IconPlus, IconX } from \"@tabler/icons-react\";\nimport { cn } from \"../../utils.js\";\nimport { defineBlock } from \"../types.js\";\nimport type { BlockReadProps, BlockEditProps } from \"../types.js\";\nimport {\n checklistSchema,\n checklistMdx,\n type ChecklistData,\n type ChecklistItem,\n} from \"./checklist.config.js\";\n\n/**\n * Standard `checklist` block. A list of toggleable items, each with a label and\n * an optional note. Lives in core so any app can register it.\n *\n * `Read` mirrors the legacy plan `PlanBlockView` checklist branch byte-for-byte\n * (same `plan-block` section, toggle buttons, `IconCheck` marker, and the\n * existing toggle-via-`onChange` behavior) so converting the block to the\n * registry does not change rendered output. The plan CSS classes\n * (`plan-block`, `text-plan-*`, `border-plan-line`) resolve against the plan\n * app's stylesheet at render time, exactly as before.\n *\n * `Edit` is a custom editor (the schema auto-editor can't edit an array of\n * objects): it lets you add, remove, toggle, and relabel items inline.\n */\n\n/** Mint a reasonably-unique item id without pulling a dep into core. */\nfunction newItemId(): string {\n return `item-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * Read renderer. Note `onToggle` is supplied by the block dispatcher for the\n * historical click-to-toggle behavior; in pure read contexts it is omitted and\n * the markers render statically.\n */\nexport function ChecklistBlock({\n data,\n blockId,\n title,\n onToggle,\n}: BlockReadProps<ChecklistData> & {\n onToggle?: (itemId: string) => void;\n}) {\n return (\n <section className=\"plan-block\" data-block-id={blockId}>\n {title && <h2>{title}</h2>}\n <div className=\"grid gap-3\">\n {data.items.map((item) =>\n onToggle ? (\n <button\n key={item.id}\n type=\"button\"\n data-plan-interactive\n className=\"flex items-start gap-3 text-left text-plan-muted\"\n onClick={() => onToggle(item.id)}\n >\n <ChecklistMarker checked={item.checked} />\n <ChecklistItemBody item={item} />\n </button>\n ) : (\n <div\n key={item.id}\n className=\"flex items-start gap-3 text-left text-plan-muted\"\n >\n <ChecklistMarker checked={item.checked} />\n <ChecklistItemBody item={item} />\n </div>\n ),\n )}\n </div>\n </section>\n );\n}\n\nfunction ChecklistMarker({ checked }: { checked?: boolean }) {\n return (\n <span\n className={cn(\n \"mt-1 flex size-5 items-center justify-center rounded border\",\n checked\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-plan-line\",\n )}\n >\n {checked && <IconCheck className=\"size-3.5\" />}\n </span>\n );\n}\n\nfunction ChecklistItemBody({ item }: { item: ChecklistItem }) {\n return (\n <span>\n <span className=\"block text-plan-text\">{item.label}</span>\n {item.note && <span className=\"block text-sm\">{item.note}</span>}\n </span>\n );\n}\n\n/** Custom editor: toggle, relabel, add, and remove items. */\nexport function ChecklistEditor({\n data,\n onChange,\n editable,\n}: BlockEditProps<ChecklistData>) {\n const items = data.items;\n\n const update = (next: ChecklistItem[]) => onChange({ items: next });\n\n const toggle = (id: string) =>\n update(\n items.map((item) =>\n item.id === id ? { ...item, checked: !item.checked } : item,\n ),\n );\n\n const setLabel = (id: string, label: string) =>\n update(items.map((item) => (item.id === id ? { ...item, label } : item)));\n\n const remove = (id: string) => update(items.filter((item) => item.id !== id));\n\n const add = () =>\n update([...items, { id: newItemId(), label: \"\", checked: false }]);\n\n return (\n <div className=\"grid gap-2\">\n {items.map((item) => (\n <div key={item.id} className=\"flex items-start gap-2\">\n <button\n type=\"button\"\n data-plan-interactive\n aria-label={item.checked ? \"Mark incomplete\" : \"Mark complete\"}\n className={cn(\n \"mt-1 flex size-5 shrink-0 items-center justify-center rounded border\",\n item.checked\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-plan-line\",\n )}\n onClick={() => toggle(item.id)}\n >\n {item.checked && <IconCheck className=\"size-3.5\" />}\n </button>\n <input\n type=\"text\"\n data-plan-interactive\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n placeholder=\"Checklist item\"\n value={item.label}\n disabled={!editable}\n onChange={(event) => setLabel(item.id, event.target.value)}\n />\n <button\n type=\"button\"\n data-plan-interactive\n aria-label=\"Remove item\"\n className=\"mt-1 flex size-7 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n disabled={!editable}\n onClick={() => remove(item.id)}\n >\n <IconX className=\"size-4\" />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n data-plan-interactive\n className=\"flex items-center gap-1.5 self-start rounded-md px-2 py-1 text-sm text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n disabled={!editable}\n onClick={add}\n >\n <IconPlus className=\"size-4\" />\n Add item\n </button>\n </div>\n );\n}\n\n/**\n * The standard checklist block spec (with React `Read`/`Edit`). Apps register\n * this in their browser registry. The schema + MDX config come from\n * `./checklist.config.ts`, the exact same object server / agent code registers,\n * so rendering and source round-trip never drift.\n *\n * `Read` is typed against `BlockReadProps<ChecklistData>`; the optional\n * `onToggle` the dispatcher injects for the legacy click-to-toggle behavior is\n * an extra prop the registry's `BlockView` passes through harmlessly when\n * present (it lives outside `BlockReadProps`, so it's wired by the app's block\n * dispatch rather than the generic `BlockView`).\n */\nexport const checklistBlock = defineBlock<ChecklistData>({\n type: \"checklist\",\n schema: checklistSchema,\n mdx: checklistMdx,\n Read: ChecklistBlock as never,\n Edit: ChecklistEditor,\n placement: [\"block\"],\n label: \"Checklist\",\n icon: IconCheck,\n description:\n \"A list of toggleable items, each with a label and an optional note.\",\n empty: () => ({ items: [] }),\n});\n"]}
1
+ {"version":3,"file":"checklist.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/checklist.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IconCheck, IconPlus, IconX } from \"@tabler/icons-react\";\nimport { cn } from \"../../utils.js\";\nimport { defineBlock } from \"../types.js\";\nimport type { BlockReadProps, BlockEditProps } from \"../types.js\";\nimport {\n checklistSchema,\n checklistMdx,\n type ChecklistData,\n type ChecklistItem,\n} from \"./checklist.config.js\";\n\n/**\n * Standard `checklist` block. A list of toggleable items, each with a label and\n * an optional note. Lives in core so any app can register it.\n *\n * `Read` mirrors the legacy plan `PlanBlockView` checklist branch byte-for-byte\n * (same `plan-block` section, toggle buttons, `IconCheck` marker, and the\n * existing toggle-via-`onChange` behavior) so converting the block to the\n * registry does not change rendered output. The plan CSS classes\n * (`plan-block`, `text-plan-*`, `border-plan-line`) resolve against the plan\n * app's stylesheet at render time, exactly as before.\n *\n * `Edit` is a custom editor (the schema auto-editor can't edit an array of\n * objects): it lets you add, remove, toggle, and relabel items inline.\n */\n\n/** Mint a reasonably-unique item id without pulling a dep into core. */\nfunction newItemId(): string {\n return `item-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * Read renderer. Note `onToggle` is supplied by the block dispatcher for the\n * historical click-to-toggle behavior; in pure read contexts it is omitted and\n * the markers render statically.\n */\nexport function ChecklistBlock({\n data,\n blockId,\n title,\n onToggle,\n}: BlockReadProps<ChecklistData> & {\n onToggle?: (itemId: string) => void;\n}) {\n return (\n <section className=\"plan-block\" data-block-id={blockId}>\n {title && <div className=\"plan-block-label\">{title}</div>}\n <div className=\"grid gap-3\">\n {data.items.map((item) =>\n onToggle ? (\n <button\n key={item.id}\n type=\"button\"\n data-plan-interactive\n className=\"flex items-start gap-3 text-left text-plan-muted\"\n onClick={() => onToggle(item.id)}\n >\n <ChecklistMarker checked={item.checked} />\n <ChecklistItemBody item={item} />\n </button>\n ) : (\n <div\n key={item.id}\n className=\"flex items-start gap-3 text-left text-plan-muted\"\n >\n <ChecklistMarker checked={item.checked} />\n <ChecklistItemBody item={item} />\n </div>\n ),\n )}\n </div>\n </section>\n );\n}\n\nfunction ChecklistMarker({ checked }: { checked?: boolean }) {\n return (\n <span\n className={cn(\n \"mt-1 flex size-5 items-center justify-center rounded border\",\n checked\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-plan-line\",\n )}\n >\n {checked && <IconCheck className=\"size-3.5\" />}\n </span>\n );\n}\n\nfunction ChecklistItemBody({ item }: { item: ChecklistItem }) {\n return (\n <span>\n <span className=\"block text-plan-text\">{item.label}</span>\n {item.note && <span className=\"block text-sm\">{item.note}</span>}\n </span>\n );\n}\n\n/** Custom editor: toggle, relabel, add, and remove items. */\nexport function ChecklistEditor({\n data,\n onChange,\n editable,\n}: BlockEditProps<ChecklistData>) {\n const items = data.items;\n\n const update = (next: ChecklistItem[]) => onChange({ items: next });\n\n const toggle = (id: string) =>\n update(\n items.map((item) =>\n item.id === id ? { ...item, checked: !item.checked } : item,\n ),\n );\n\n const setLabel = (id: string, label: string) =>\n update(items.map((item) => (item.id === id ? { ...item, label } : item)));\n\n const remove = (id: string) => update(items.filter((item) => item.id !== id));\n\n const add = () =>\n update([...items, { id: newItemId(), label: \"\", checked: false }]);\n\n return (\n <div className=\"grid gap-2\">\n {items.map((item) => (\n <div key={item.id} className=\"flex items-start gap-2\">\n <button\n type=\"button\"\n data-plan-interactive\n aria-label={item.checked ? \"Mark incomplete\" : \"Mark complete\"}\n className={cn(\n \"mt-1 flex size-5 shrink-0 items-center justify-center rounded border\",\n item.checked\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-plan-line\",\n )}\n onClick={() => toggle(item.id)}\n >\n {item.checked && <IconCheck className=\"size-3.5\" />}\n </button>\n <input\n type=\"text\"\n data-plan-interactive\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n placeholder=\"Checklist item\"\n value={item.label}\n disabled={!editable}\n onChange={(event) => setLabel(item.id, event.target.value)}\n />\n <button\n type=\"button\"\n data-plan-interactive\n aria-label=\"Remove item\"\n className=\"mt-1 flex size-7 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n disabled={!editable}\n onClick={() => remove(item.id)}\n >\n <IconX className=\"size-4\" />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n data-plan-interactive\n className=\"flex items-center gap-1.5 self-start rounded-md px-2 py-1 text-sm text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n disabled={!editable}\n onClick={add}\n >\n <IconPlus className=\"size-4\" />\n Add item\n </button>\n </div>\n );\n}\n\n/**\n * The standard checklist block spec (with React `Read`/`Edit`). Apps register\n * this in their browser registry. The schema + MDX config come from\n * `./checklist.config.ts`, the exact same object server / agent code registers,\n * so rendering and source round-trip never drift.\n *\n * `Read` is typed against `BlockReadProps<ChecklistData>`; the optional\n * `onToggle` the dispatcher injects for the legacy click-to-toggle behavior is\n * an extra prop the registry's `BlockView` passes through harmlessly when\n * present (it lives outside `BlockReadProps`, so it's wired by the app's block\n * dispatch rather than the generic `BlockView`).\n */\nexport const checklistBlock = defineBlock<ChecklistData>({\n type: \"checklist\",\n schema: checklistSchema,\n mdx: checklistMdx,\n Read: ChecklistBlock as never,\n Edit: ChecklistEditor,\n placement: [\"block\"],\n // A checklist maps to NFM to-do items, so it round-trips to Notion.\n notionCompatible: true,\n label: \"Checklist\",\n icon: IconCheck,\n description:\n \"A list of toggleable items, each with a label and an optional note.\",\n empty: () => ({ items: [] }),\n});\n"]}
@@ -20,7 +20,7 @@ import { codeTabsSchema, codeTabsMdx, } from "./code-tabs.config.js";
20
20
  function CodeTabsRead({ data, blockId, title }) {
21
21
  const [activeId, setActiveId] = useState(data.tabs[0]?.id ?? "");
22
22
  const active = data.tabs.find((tab) => tab.id === activeId) ?? data.tabs[0];
23
- return (_jsxs("section", { className: "plan-block", "data-block-id": blockId, children: [title && _jsx("h2", { children: title }), _jsxs("div", { className: "grid overflow-hidden border-y border-plan-line md:grid-cols-[300px_minmax(0,1fr)]", children: [_jsx("div", { className: "border-plan-line md:border-r", children: data.tabs.map((tab) => (_jsxs("button", { type: "button", "data-plan-interactive": true, className: cn("flex w-full items-start gap-3 border-b border-plan-line px-4 py-4 text-left", tab.id === active?.id
23
+ return (_jsxs("section", { className: "plan-block", "data-block-id": blockId, children: [title && _jsx("div", { className: "plan-block-label", children: title }), _jsxs("div", { className: "grid overflow-hidden border-y border-plan-line md:grid-cols-[300px_minmax(0,1fr)]", children: [_jsx("div", { className: "border-plan-line md:border-r", children: data.tabs.map((tab) => (_jsxs("button", { type: "button", "data-plan-interactive": true, className: cn("flex w-full items-start gap-3 border-b border-plan-line px-4 py-4 text-left", tab.id === active?.id
24
24
  ? "bg-plan-block text-plan-text shadow-[inset_3px_0_0_hsl(var(--ring))]"
25
25
  : "text-plan-muted hover:bg-accent/30"), onClick: () => setActiveId(tab.id), children: [_jsx(IconCode, { className: "mt-0.5 size-4 shrink-0" }), _jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "block truncate font-mono text-sm font-semibold", children: tab.label }), tab.caption && (_jsx("span", { className: "mt-1 block text-xs leading-5", children: tab.caption }))] })] }, tab.id))) }), _jsx("div", { className: "min-w-0 p-5", children: active && (_jsxs(_Fragment, { children: [_jsx("h3", { className: "text-2xl font-semibold tracking-tight", children: active.label }), active.caption && (_jsx("p", { className: "mt-2 text-plan-muted", children: active.caption })), _jsx(CodeSurface, { code: active.code, language: active.language })] })) })] })] }));
26
26
  }