blume 2.0.3 → 2.1.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 (607) hide show
  1. package/AGENTS.md +1 -0
  2. package/CHANGELOG.md +142 -0
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-5f86nr5m.js → chunk-073rdvgb.js} +21 -48
  5. package/dist/cli/{chunk-5f86nr5m.js.map → chunk-073rdvgb.js.map} +4 -5
  6. package/dist/cli/{chunk-ga0pf4aj.js → chunk-0n9xkp3d.js} +12 -3
  7. package/dist/cli/{chunk-ga0pf4aj.js.map → chunk-0n9xkp3d.js.map} +3 -3
  8. package/dist/cli/chunk-150jk7km.js +52 -0
  9. package/dist/cli/chunk-150jk7km.js.map +10 -0
  10. package/dist/cli/{chunk-9t7a85s3.js → chunk-313vnn40.js} +30 -19
  11. package/dist/cli/chunk-313vnn40.js.map +10 -0
  12. package/dist/cli/{chunk-tkacnehg.js → chunk-3v3ffbrj.js} +2 -2
  13. package/dist/cli/{chunk-q58y5e6a.js → chunk-3x6x3pph.js} +46 -24
  14. package/dist/cli/chunk-3x6x3pph.js.map +10 -0
  15. package/dist/cli/{chunk-1d7ve1dm.js → chunk-42t4jxdx.js} +37 -5
  16. package/dist/cli/chunk-42t4jxdx.js.map +12 -0
  17. package/dist/cli/{chunk-8ktnccpt.js → chunk-54ztw1nj.js} +21 -2
  18. package/dist/cli/chunk-54ztw1nj.js.map +10 -0
  19. package/dist/cli/{chunk-hm3vjy5s.js → chunk-5vjtgs6e.js} +28 -10
  20. package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-5vjtgs6e.js.map} +4 -4
  21. package/dist/cli/chunk-66w9j7p6.js +322 -0
  22. package/dist/cli/chunk-66w9j7p6.js.map +14 -0
  23. package/dist/cli/{chunk-2hsdwb9n.js → chunk-7ppf1rva.js} +34 -18
  24. package/dist/cli/chunk-7ppf1rva.js.map +10 -0
  25. package/dist/cli/{chunk-r9rcc4w7.js → chunk-8y2kmjv8.js} +7 -7
  26. package/dist/cli/{chunk-r20tn01b.js → chunk-c1y538kd.js} +8 -2
  27. package/dist/cli/{chunk-r20tn01b.js.map → chunk-c1y538kd.js.map} +3 -3
  28. package/dist/cli/{chunk-2eytanqx.js → chunk-c887fj0s.js} +2 -2
  29. package/dist/cli/{chunk-p3v96n38.js → chunk-cfyg47zg.js} +16 -6
  30. package/dist/cli/chunk-cfyg47zg.js.map +10 -0
  31. package/dist/cli/chunk-cm89scdv.js +443 -0
  32. package/dist/cli/chunk-cm89scdv.js.map +11 -0
  33. package/dist/cli/{chunk-akbpwfxc.js → chunk-dzwehpy7.js} +2 -2
  34. package/dist/cli/{chunk-wrr3j9w9.js → chunk-e6atmn4h.js} +299 -72
  35. package/dist/cli/chunk-e6atmn4h.js.map +36 -0
  36. package/dist/cli/{chunk-tzmab476.js → chunk-e8xw9qkh.js} +8 -6
  37. package/dist/cli/{chunk-tzmab476.js.map → chunk-e8xw9qkh.js.map} +3 -3
  38. package/dist/cli/{chunk-6dsbexzp.js → chunk-e9q7a2ak.js} +17 -15
  39. package/dist/cli/{chunk-6dsbexzp.js.map → chunk-e9q7a2ak.js.map} +2 -2
  40. package/dist/cli/{chunk-pv29h0wf.js → chunk-ehweg4fr.js} +5155 -1249
  41. package/dist/cli/chunk-ehweg4fr.js.map +218 -0
  42. package/dist/cli/{chunk-c8chx29p.js → chunk-ep6nd0rn.js} +390 -318
  43. package/dist/cli/chunk-ep6nd0rn.js.map +36 -0
  44. package/dist/cli/{chunk-p73c0m7w.js → chunk-fdrkhpjy.js} +18 -15
  45. package/dist/cli/{chunk-p73c0m7w.js.map → chunk-fdrkhpjy.js.map} +3 -3
  46. package/dist/cli/{chunk-2z928egk.js → chunk-ft9vfys6.js} +5 -5
  47. package/dist/cli/{chunk-5m5nmvyq.js → chunk-gb420vvz.js} +316 -79
  48. package/dist/cli/chunk-gb420vvz.js.map +17 -0
  49. package/dist/cli/{chunk-vg9r4eb9.js → chunk-hebn0tpx.js} +86 -13
  50. package/dist/cli/chunk-hebn0tpx.js.map +14 -0
  51. package/dist/cli/{chunk-35d4wj9f.js → chunk-htrwgabr.js} +41 -23
  52. package/dist/cli/chunk-htrwgabr.js.map +15 -0
  53. package/dist/cli/{chunk-g4hq16wv.js → chunk-hx3xqnk9.js} +16 -14
  54. package/dist/cli/{chunk-g4hq16wv.js.map → chunk-hx3xqnk9.js.map} +2 -2
  55. package/dist/cli/chunk-j134vrp2.js +65 -0
  56. package/dist/cli/chunk-j134vrp2.js.map +10 -0
  57. package/dist/cli/{chunk-a58773jm.js → chunk-kma9f6sf.js} +2 -2
  58. package/dist/cli/chunk-kwrg63tm.js +31 -0
  59. package/dist/cli/chunk-kwrg63tm.js.map +10 -0
  60. package/dist/cli/{chunk-ey84smr6.js → chunk-mrcccgnh.js} +6 -6
  61. package/dist/cli/{chunk-ey84smr6.js.map → chunk-mrcccgnh.js.map} +1 -1
  62. package/dist/cli/{chunk-yfyb25rh.js → chunk-n0v7m8ry.js} +24 -8
  63. package/dist/cli/chunk-n0v7m8ry.js.map +14 -0
  64. package/dist/cli/{chunk-j85vccga.js → chunk-ncj7w596.js} +576 -367
  65. package/dist/cli/chunk-ncj7w596.js.map +35 -0
  66. package/dist/cli/{chunk-5xvm6tfj.js → chunk-nq1d20w2.js} +17 -15
  67. package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-nq1d20w2.js.map} +2 -2
  68. package/dist/cli/{chunk-pehfxfta.js → chunk-nrns10mj.js} +6 -98
  69. package/dist/cli/chunk-nrns10mj.js.map +10 -0
  70. package/dist/cli/{chunk-crgn1q09.js → chunk-sds923fa.js} +4 -4
  71. package/dist/cli/chunk-t2m5j4pr.js +104 -0
  72. package/dist/cli/chunk-t2m5j4pr.js.map +11 -0
  73. package/dist/cli/{chunk-acanzt5p.js → chunk-tdqhyxfz.js} +6 -6
  74. package/dist/cli/chunk-tphac74f.js +126 -0
  75. package/dist/cli/chunk-tphac74f.js.map +11 -0
  76. package/dist/cli/chunk-w1r4vase.js +18 -0
  77. package/dist/cli/chunk-w1r4vase.js.map +10 -0
  78. package/dist/cli/{chunk-3em5wd2y.js → chunk-zccbjcj0.js} +4 -3
  79. package/dist/cli/{chunk-3em5wd2y.js.map → chunk-zccbjcj0.js.map} +2 -2
  80. package/dist/cli/index.js +31 -20
  81. package/dist/cli/index.js.map +5 -5
  82. package/dist/types/ai/agent-surface.d.ts +8 -7
  83. package/dist/types/ai/ai-catalog.d.ts +7 -0
  84. package/dist/types/ai/ask-context.d.ts +26 -0
  85. package/dist/types/ai/ask.d.ts +271 -58
  86. package/dist/types/ai/component-markdown.d.ts +2 -0
  87. package/dist/types/ai/index.d.ts +2 -2
  88. package/dist/types/ai/openapi-components.d.ts +4 -1
  89. package/dist/types/ai/site-skill.d.ts +26 -0
  90. package/dist/types/ai/skills.d.ts +16 -0
  91. package/dist/types/astro/integration.d.ts +9 -0
  92. package/dist/types/astro/markdown-negotiation.d.ts +3 -0
  93. package/dist/types/astro/pages.d.ts +10 -0
  94. package/dist/types/captcha/hcaptcha.d.ts +27 -0
  95. package/dist/types/captcha/index.d.ts +28 -0
  96. package/dist/types/captcha/schema.d.ts +29 -0
  97. package/dist/types/captcha/turnstile.d.ts +28 -0
  98. package/dist/types/cli/init/scaffold.d.ts +1 -1
  99. package/dist/types/components/content/api-field.d.ts +62 -0
  100. package/dist/types/components/content/api-page.d.ts +100 -0
  101. package/dist/types/components/layout/nav-utils.d.ts +26 -0
  102. package/dist/types/components/openapi/code-samples.d.ts +29 -0
  103. package/dist/types/components/openapi/helpers.d.ts +158 -0
  104. package/dist/types/components/openapi/security.d.ts +95 -0
  105. package/dist/types/components/openapi/snippets.d.ts +60 -0
  106. package/dist/types/consent/ethyca.d.ts +48 -0
  107. package/dist/types/consent/index.d.ts +37 -0
  108. package/dist/types/consent/native.d.ts +28 -0
  109. package/dist/types/consent/osano.d.ts +42 -0
  110. package/dist/types/consent/schema.d.ts +110 -0
  111. package/dist/types/core/changelog-index.d.ts +8 -0
  112. package/dist/types/core/config-input.d.ts +217 -23
  113. package/dist/types/core/data.d.ts +53 -4
  114. package/dist/types/core/footer.d.ts +8 -0
  115. package/dist/types/core/i18n-ui.d.ts +88 -0
  116. package/dist/types/core/includes.d.ts +8 -2
  117. package/dist/types/core/links.d.ts +8 -0
  118. package/dist/types/core/localizable.d.ts +7 -0
  119. package/dist/types/core/page-modes.d.ts +29 -0
  120. package/dist/types/core/probe.d.ts +2 -0
  121. package/dist/types/core/project-graph.d.ts +6 -0
  122. package/dist/types/core/redirect-patterns.d.ts +152 -0
  123. package/dist/types/core/related.d.ts +40 -0
  124. package/dist/types/core/schema.d.ts +670 -56
  125. package/dist/types/core/sources/cache.d.ts +3 -0
  126. package/dist/types/core/sources/contentful-rich-text.d.ts +11 -2
  127. package/dist/types/core/sources/contentful.d.ts +17 -1
  128. package/dist/types/core/sources/lexical.d.ts +5 -0
  129. package/dist/types/core/sources/normalize.d.ts +20 -1
  130. package/dist/types/core/sources/read.d.ts +5 -0
  131. package/dist/types/core/sources/remote.d.ts +37 -10
  132. package/dist/types/core/sources/sanity.d.ts +1 -1
  133. package/dist/types/core/types.d.ts +18 -1
  134. package/dist/types/core/variables.d.ts +42 -0
  135. package/dist/types/deploy/adapter-output.d.ts +2 -1
  136. package/dist/types/deploy/adapters/cloudflare.d.ts +7 -5
  137. package/dist/types/deploy/adapters/node.d.ts +58 -23
  138. package/dist/types/deploy/adapters/registry.d.ts +10 -0
  139. package/dist/types/deploy/adapters/types.d.ts +3 -2
  140. package/dist/types/deploy/node-headers.d.ts +13 -2
  141. package/dist/types/deploy/platforms/cloudflare.d.ts +15 -7
  142. package/dist/types/deploy/platforms/netlify.d.ts +7 -0
  143. package/dist/types/deploy/platforms/node.d.ts +3 -1
  144. package/dist/types/deploy/platforms/types.d.ts +18 -7
  145. package/dist/types/deploy/platforms/vercel.d.ts +26 -1
  146. package/dist/types/deploy/redirects.d.ts +55 -11
  147. package/dist/types/deploy/sitemap.d.ts +2 -1
  148. package/dist/types/deploy/vercel-negotiation.d.ts +51 -21
  149. package/dist/types/markdown/code-title.d.ts +17 -0
  150. package/dist/types/markdown/features.d.ts +3 -2
  151. package/dist/types/narration/build.d.ts +70 -0
  152. package/dist/types/narration/provider.d.ts +26 -0
  153. package/dist/types/narration/script.d.ts +154 -0
  154. package/dist/types/openapi/checks.d.ts +27 -0
  155. package/dist/types/openapi/graphql.d.ts +6 -0
  156. package/dist/types/openapi/model.d.ts +27 -10
  157. package/dist/types/openapi/overlay.d.ts +54 -0
  158. package/dist/types/openapi/parse.d.ts +16 -0
  159. package/dist/types/openapi/references.d.ts +30 -4
  160. package/dist/types/ratelimit/cloudflare.d.ts +39 -0
  161. package/dist/types/ratelimit/index.d.ts +27 -0
  162. package/dist/types/ratelimit/memory.d.ts +36 -0
  163. package/dist/types/ratelimit/schema.d.ts +119 -0
  164. package/dist/types/ratelimit/upstash.d.ts +46 -0
  165. package/dist/types/ratelimit/wrangler.d.ts +23 -0
  166. package/dist/types/reference/asyncapi.d.ts +10 -10
  167. package/dist/types/reference/graphql.d.ts +89 -11
  168. package/dist/types/reference/index.d.ts +1 -1
  169. package/dist/types/reference/openapi.d.ts +33 -12
  170. package/dist/types/reference/options.d.ts +82 -6
  171. package/dist/types/reference/scalar.d.ts +13 -0
  172. package/dist/types/reference/schema.d.ts +144 -36
  173. package/dist/types/search/adapters/registry.d.ts +3 -0
  174. package/dist/types/search/adapters/typesense.d.ts +14 -4
  175. package/dist/types/search/build.d.ts +3 -1
  176. package/dist/types/search/documents.d.ts +12 -1
  177. package/dist/types/search/orama-index.d.ts +13 -9
  178. package/dist/types/search/sync/algolia.d.ts +5 -2
  179. package/dist/types/search/sync/index.d.ts +3 -1
  180. package/dist/types/search/sync/typesense.d.ts +11 -7
  181. package/dist/types/seo/metatags.d.ts +20 -0
  182. package/dist/types/sources/contentful.d.ts +16 -0
  183. package/dist/types/sources/github-releases.d.ts +8 -1
  184. package/dist/types/sources/payload.d.ts +2 -0
  185. package/dist/types/sources/registry.d.ts +54 -0
  186. package/dist/types/sources/shared.d.ts +3 -0
  187. package/dist/types/sources/strapi.d.ts +2 -0
  188. package/docs/01-quickstart.mdx +4 -2
  189. package/docs/02-deployment.mdx +71 -17
  190. package/docs/03-upgrading.mdx +4 -4
  191. package/docs/04-migrating.mdx +1 -1
  192. package/docs/advanced/changelog.mdx +13 -2
  193. package/docs/advanced/skills.mdx +15 -1
  194. package/docs/cli/audit.mdx +51 -8
  195. package/docs/cli/doctor.mdx +5 -1
  196. package/docs/cli/evals.mdx +4 -4
  197. package/docs/cli/index.mdx +1 -0
  198. package/docs/cli/translate.mdx +1 -0
  199. package/docs/cli/validate.mdx +4 -3
  200. package/docs/configuration/analytics.mdx +3 -1
  201. package/docs/configuration/assistant.mdx +194 -38
  202. package/docs/configuration/consent.mdx +100 -0
  203. package/docs/configuration/customization.mdx +8 -6
  204. package/docs/configuration/export.mdx +5 -3
  205. package/docs/configuration/index.mdx +64 -5
  206. package/docs/configuration/meta.ts +3 -0
  207. package/docs/configuration/narration.mdx +119 -0
  208. package/docs/configuration/rate-limiting.mdx +90 -0
  209. package/docs/configuration/search.mdx +63 -12
  210. package/docs/configuration/theming.mdx +3 -1
  211. package/docs/content/components.mdx +108 -2
  212. package/docs/content/frontmatter.mdx +80 -2
  213. package/docs/content/i18n.mdx +39 -4
  214. package/docs/content/includes.mdx +16 -0
  215. package/docs/content/meta.mdx +1 -0
  216. package/docs/content/meta.ts +1 -0
  217. package/docs/content/navigation.mdx +32 -10
  218. package/docs/content/sources/contentful.mdx +35 -0
  219. package/docs/content/sources/custom.mdx +43 -0
  220. package/docs/content/sources/github-releases.mdx +39 -0
  221. package/docs/content/sources/index.mdx +91 -0
  222. package/docs/content/sources/meta.ts +16 -0
  223. package/docs/content/sources/notion.mdx +32 -0
  224. package/docs/content/sources/obsidian.mdx +37 -0
  225. package/docs/content/sources/payload.mdx +31 -0
  226. package/docs/content/sources/remote-mdx.mdx +44 -0
  227. package/docs/content/sources/sanity.mdx +29 -0
  228. package/docs/content/sources/strapi.mdx +32 -0
  229. package/docs/content/syntax.mdx +69 -4
  230. package/docs/content/variables.mdx +41 -0
  231. package/docs/discoverability/agent-discovery.mdx +29 -2
  232. package/docs/discoverability/index.mdx +2 -2
  233. package/docs/discoverability/json-api.mdx +2 -0
  234. package/docs/discoverability/llms-txt.mdx +2 -2
  235. package/docs/discoverability/markdown.mdx +3 -1
  236. package/docs/discoverability/mcp.mdx +4 -0
  237. package/docs/discoverability/metadata.mdx +17 -0
  238. package/docs/discoverability/sitemap-and-robots.mdx +1 -1
  239. package/docs/references/api-pages.mdx +74 -0
  240. package/docs/references/asyncapi.mdx +4 -2
  241. package/docs/references/graphql.mdx +14 -2
  242. package/docs/references/meta.ts +1 -1
  243. package/docs/references/openapi.mdx +148 -7
  244. package/docs/references/scalar.mdx +3 -1
  245. package/package.json +43 -8
  246. package/skills/blume/SKILL.md +3 -0
  247. package/skills/blume-migrate/SKILL.md +6 -6
  248. package/skills/blume-migrate/references/docusaurus.md +7 -7
  249. package/skills/blume-migrate/references/fumadocs.md +17 -13
  250. package/skills/blume-migrate/references/mintlify.md +37 -19
  251. package/skills/blume-migrate/references/nextra.md +10 -7
  252. package/skills/blume-migrate/references/starlight.md +11 -8
  253. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +60 -14
  254. package/skills/blume-write-skill/SKILL.md +82 -0
  255. package/src/ai/agent-readability.ts +2 -1
  256. package/src/ai/agent-surface.ts +9 -7
  257. package/src/ai/ai-catalog.ts +6 -3
  258. package/src/ai/ask-context.ts +103 -20
  259. package/src/ai/ask-data.ts +6 -0
  260. package/src/ai/ask-limits.ts +13 -0
  261. package/src/ai/ask-tools.ts +142 -0
  262. package/src/ai/ask.ts +354 -76
  263. package/src/ai/changelog-markdown.ts +11 -6
  264. package/src/ai/component-markdown.ts +76 -1
  265. package/src/ai/cors.ts +14 -3
  266. package/src/ai/index.ts +12 -0
  267. package/src/ai/llms.ts +6 -2
  268. package/src/ai/markdown.ts +2 -1
  269. package/src/ai/mcp/data.ts +6 -0
  270. package/src/ai/mcp/query.ts +14 -6
  271. package/src/ai/openapi-components.ts +36 -6
  272. package/src/ai/relative-links.ts +4 -38
  273. package/src/ai/site-skill.ts +274 -0
  274. package/src/ai/skills.ts +35 -2
  275. package/src/ai/write-skill.ts +97 -0
  276. package/src/astro/generate.ts +210 -66
  277. package/src/astro/index.ts +1 -0
  278. package/src/astro/integration.ts +42 -4
  279. package/src/astro/markdown-negotiation.ts +3 -0
  280. package/src/astro/module-types.ts +9 -1
  281. package/src/astro/pages.ts +23 -0
  282. package/src/astro/templates.ts +406 -108
  283. package/src/astro/variables.ts +31 -0
  284. package/src/audit/catalog.ts +38 -3
  285. package/src/audit/checks/contrast.ts +183 -0
  286. package/src/audit/checks/i18n.ts +2 -3
  287. package/src/audit/checks/indexability.ts +2 -3
  288. package/src/audit/checks/links.ts +19 -13
  289. package/src/audit/checks/network.ts +110 -6
  290. package/src/audit/checks/redirects.ts +6 -4
  291. package/src/audit/checks/robots.ts +58 -2
  292. package/src/audit/checks/sitemap.ts +2 -3
  293. package/src/audit/redirects.ts +46 -15
  294. package/src/audit/run.ts +5 -0
  295. package/src/audit/types.ts +4 -1
  296. package/src/audit/url.ts +14 -5
  297. package/src/blume-modules.d.ts +12 -1
  298. package/src/captcha/client.ts +152 -0
  299. package/src/captcha/hcaptcha.ts +36 -0
  300. package/src/captcha/index.ts +28 -0
  301. package/src/captcha/schema.ts +32 -0
  302. package/src/captcha/turnstile.ts +38 -0
  303. package/src/captcha/verify.ts +71 -0
  304. package/src/cli/args.ts +51 -0
  305. package/src/cli/build-failure.ts +23 -0
  306. package/src/cli/command-meta.ts +5 -0
  307. package/src/cli/commands/audit.ts +10 -1
  308. package/src/cli/commands/dev.ts +18 -2
  309. package/src/cli/commands/doctor.ts +67 -28
  310. package/src/cli/commands/eval.ts +36 -4
  311. package/src/cli/commands/init.ts +6 -4
  312. package/src/cli/commands/skill.ts +96 -0
  313. package/src/cli/commands/validate.ts +10 -1
  314. package/src/cli/index.ts +5 -0
  315. package/src/cli/init/scaffold.ts +3 -3
  316. package/src/cli/prepare.ts +6 -3
  317. package/src/cli/required-secrets.ts +72 -30
  318. package/src/components/BlumePage.astro +2 -0
  319. package/src/components/content/ApiEndpoint.astro +18 -0
  320. package/src/components/content/ApiField.astro +79 -0
  321. package/src/components/content/ApiPlayground.astro +66 -0
  322. package/src/components/content/ApiRail.astro +19 -0
  323. package/src/components/content/Color.astro +1 -0
  324. package/src/components/content/FileTree.astro +1 -0
  325. package/src/components/content/GithubInfo.astro +1 -0
  326. package/src/components/content/Panel.astro +1 -0
  327. package/src/components/content/ParamField.astro +25 -0
  328. package/src/components/content/RequestExample.astro +17 -0
  329. package/src/components/content/ResponseExample.astro +17 -0
  330. package/src/components/content/ResponseField.astro +32 -0
  331. package/src/components/content/Step.astro +1 -0
  332. package/src/components/content/Tile.astro +1 -0
  333. package/src/components/content/Tooltip.astro +1 -0
  334. package/src/components/content/Tree.astro +1 -0
  335. package/src/components/content/TypeTable.astro +4 -1
  336. package/src/components/content/View.astro +21 -0
  337. package/src/components/content/ViewSwitcher.astro +168 -0
  338. package/src/components/content/api-field.ts +103 -0
  339. package/src/components/content/api-page.ts +248 -0
  340. package/src/components/content/mermaid-element.ts +15 -1
  341. package/src/components/content/view-switcher.ts +71 -0
  342. package/src/components/index.ts +2 -0
  343. package/src/components/islands/Assistant.astro +10 -1
  344. package/src/components/islands/assistant.tsx +104 -14
  345. package/src/components/islands/code-question.ts +62 -0
  346. package/src/components/islands/hooks.ts +136 -21
  347. package/src/components/islands/support-link.ts +68 -0
  348. package/src/components/layout/Analytics.astro +11 -2
  349. package/src/components/layout/Banner.astro +14 -10
  350. package/src/components/layout/Breadcrumbs.astro +6 -2
  351. package/src/components/layout/ConsentBanner.astro +62 -0
  352. package/src/components/layout/ConsentHead.astro +38 -0
  353. package/src/components/layout/Directory.astro +94 -0
  354. package/src/components/layout/DrawerSwitchers.astro +51 -0
  355. package/src/components/layout/Empty.astro +2 -2
  356. package/src/components/layout/Header.astro +122 -80
  357. package/src/components/layout/LanguageSwitcher.astro +48 -15
  358. package/src/components/layout/NarrationPlayer.astro +1085 -0
  359. package/src/components/layout/NavSelector.astro +33 -7
  360. package/src/components/layout/PageActions.astro +139 -24
  361. package/src/components/layout/PageFeedback.astro +54 -49
  362. package/src/components/layout/PageLayout.astro +71 -3
  363. package/src/components/layout/ReferenceLayout.astro +17 -6
  364. package/src/components/layout/RelatedPages.astro +42 -0
  365. package/src/components/layout/RootLayout.astro +318 -47
  366. package/src/components/layout/Search.astro +47 -19
  367. package/src/components/layout/SiteFooter.astro +124 -0
  368. package/src/components/layout/SiteMetatags.astro +16 -0
  369. package/src/components/layout/TableOfContents.astro +24 -17
  370. package/src/components/layout/consent/native.ts +79 -0
  371. package/src/components/layout/consent/types.ts +37 -0
  372. package/src/components/layout/footer-links.ts +53 -0
  373. package/src/components/layout/footer-socials.ts +87 -0
  374. package/src/components/layout/head-scripts.ts +6 -1
  375. package/src/components/layout/locale-redirect.ts +107 -0
  376. package/src/components/layout/nav-utils.ts +83 -0
  377. package/src/components/layout/page-feedback.ts +96 -0
  378. package/src/components/layout/search/algolia.ts +10 -1
  379. package/src/components/layout/search/analytics.ts +126 -0
  380. package/src/components/layout/search/endpoint.ts +48 -5
  381. package/src/components/layout/search/flexsearch.ts +17 -5
  382. package/src/components/layout/search/orama-cloud.ts +26 -14
  383. package/src/components/layout/search/pagefind.ts +114 -5
  384. package/src/components/layout/search/types.ts +32 -0
  385. package/src/components/layout/search/typesense.ts +19 -3
  386. package/src/components/openapi/AsyncApiOperation.astro +14 -7
  387. package/src/components/openapi/Authorization.astro +10 -0
  388. package/src/components/openapi/GraphqlOperation.astro +5 -0
  389. package/src/components/openapi/Operation.astro +184 -13
  390. package/src/components/openapi/ParametersTable.astro +8 -4
  391. package/src/components/openapi/Playground.astro +7 -1
  392. package/src/components/openapi/RequestBody.astro +24 -5
  393. package/src/components/openapi/RequestPanel.astro +59 -7
  394. package/src/components/openapi/Responses.astro +7 -4
  395. package/src/components/openapi/SchemaTable.astro +15 -3
  396. package/src/components/openapi/async-snippets.ts +65 -9
  397. package/src/components/openapi/async.ts +123 -29
  398. package/src/components/openapi/code-samples.ts +97 -0
  399. package/src/components/openapi/graphql-helpers.ts +35 -12
  400. package/src/components/openapi/helpers.ts +36 -2
  401. package/src/components/openapi/message-model.ts +54 -11
  402. package/src/components/openapi/message.ts +14 -4
  403. package/src/components/openapi/operation-model.ts +16 -7
  404. package/src/components/openapi/playground-client.ts +24 -5
  405. package/src/components/openapi/playground-schema.ts +1 -1
  406. package/src/components/openapi/schema-tree.ts +44 -14
  407. package/src/components/openapi/security.ts +16 -3
  408. package/src/components/openapi/snippets.ts +873 -10
  409. package/src/components/openapi/validate-json.ts +4 -3
  410. package/src/components/props.ts +6 -0
  411. package/src/consent/client.ts +95 -0
  412. package/src/consent/clients.ts +19 -0
  413. package/src/consent/ethyca.ts +71 -0
  414. package/src/consent/head.ts +24 -0
  415. package/src/consent/index.ts +37 -0
  416. package/src/consent/init.ts +29 -0
  417. package/src/consent/native.ts +36 -0
  418. package/src/consent/osano.ts +59 -0
  419. package/src/consent/schema.ts +30 -0
  420. package/src/core/builtin-tags.ts +5 -0
  421. package/src/core/changelog-index.ts +31 -1
  422. package/src/core/client-address.ts +19 -0
  423. package/src/core/component-diagnostics.ts +53 -0
  424. package/src/core/component-overrides.ts +32 -0
  425. package/src/core/config-input.ts +225 -23
  426. package/src/core/data.ts +46 -4
  427. package/src/core/diagnostics.ts +8 -2
  428. package/src/core/footer.ts +26 -0
  429. package/src/core/graph.ts +39 -36
  430. package/src/core/i18n-ui.ts +84 -2
  431. package/src/core/includes.ts +21 -4
  432. package/src/core/links.ts +63 -19
  433. package/src/core/localizable.ts +26 -0
  434. package/src/core/navigation.ts +43 -12
  435. package/src/core/page-modes.ts +56 -0
  436. package/src/core/probe.ts +26 -6
  437. package/src/core/project-graph.ts +163 -16
  438. package/src/core/redirect-patterns.ts +520 -0
  439. package/src/core/related.ts +131 -0
  440. package/src/core/schema.ts +339 -66
  441. package/src/core/sources/cache.ts +6 -0
  442. package/src/core/sources/contentful-rich-text.ts +29 -6
  443. package/src/core/sources/contentful.ts +135 -25
  444. package/src/core/sources/filesystem.ts +26 -4
  445. package/src/core/sources/github-releases.ts +12 -1
  446. package/src/core/sources/lexical.ts +15 -10
  447. package/src/core/sources/mdx-remote.ts +62 -10
  448. package/src/core/sources/normalize.ts +228 -41
  449. package/src/core/sources/notion.ts +7 -1
  450. package/src/core/sources/obsidian.ts +16 -3
  451. package/src/core/sources/payload.ts +38 -15
  452. package/src/core/sources/read.ts +8 -3
  453. package/src/core/sources/remote.ts +72 -15
  454. package/src/core/sources/resolve.ts +11 -1
  455. package/src/core/sources/sanity.ts +43 -25
  456. package/src/core/sources/strapi.ts +2 -2
  457. package/src/core/types.ts +19 -1
  458. package/src/core/ui-packs/ar.ts +44 -0
  459. package/src/core/ui-packs/bg.ts +46 -0
  460. package/src/core/ui-packs/bn.ts +44 -0
  461. package/src/core/ui-packs/ca.ts +47 -0
  462. package/src/core/ui-packs/cs.ts +45 -0
  463. package/src/core/ui-packs/da.ts +46 -0
  464. package/src/core/ui-packs/de.ts +47 -0
  465. package/src/core/ui-packs/el.ts +46 -0
  466. package/src/core/ui-packs/es.ts +47 -0
  467. package/src/core/ui-packs/fa.ts +46 -0
  468. package/src/core/ui-packs/fi.ts +46 -0
  469. package/src/core/ui-packs/fr.ts +47 -0
  470. package/src/core/ui-packs/he.ts +44 -0
  471. package/src/core/ui-packs/hi.ts +45 -0
  472. package/src/core/ui-packs/hr.ts +46 -0
  473. package/src/core/ui-packs/hu.ts +45 -0
  474. package/src/core/ui-packs/id.ts +46 -0
  475. package/src/core/ui-packs/it.ts +46 -0
  476. package/src/core/ui-packs/ja.ts +46 -0
  477. package/src/core/ui-packs/ko.ts +45 -0
  478. package/src/core/ui-packs/nl.ts +47 -0
  479. package/src/core/ui-packs/no.ts +45 -0
  480. package/src/core/ui-packs/pl.ts +46 -0
  481. package/src/core/ui-packs/pt-br.ts +47 -0
  482. package/src/core/ui-packs/pt.ts +46 -0
  483. package/src/core/ui-packs/ro.ts +46 -0
  484. package/src/core/ui-packs/ru.ts +46 -0
  485. package/src/core/ui-packs/sk.ts +45 -0
  486. package/src/core/ui-packs/sr.ts +46 -0
  487. package/src/core/ui-packs/sv.ts +45 -0
  488. package/src/core/ui-packs/th.ts +44 -0
  489. package/src/core/ui-packs/tr.ts +46 -0
  490. package/src/core/ui-packs/uk.ts +46 -0
  491. package/src/core/ui-packs/vi.ts +46 -0
  492. package/src/core/ui-packs/zh-tw.ts +44 -0
  493. package/src/core/ui-packs/zh.ts +44 -0
  494. package/src/core/variables.ts +103 -0
  495. package/src/deploy/adapter-output.ts +7 -2
  496. package/src/deploy/adapters/cloudflare.ts +7 -5
  497. package/src/deploy/adapters/node.ts +47 -9
  498. package/src/deploy/adapters/types.ts +7 -3
  499. package/src/deploy/artifacts.ts +79 -9
  500. package/src/deploy/cloudflare-negotiation.ts +35 -5
  501. package/src/deploy/headers.ts +2 -1
  502. package/src/deploy/node-headers.ts +63 -9
  503. package/src/deploy/platforms/cloudflare.ts +45 -9
  504. package/src/deploy/platforms/netlify.ts +35 -2
  505. package/src/deploy/platforms/node.ts +12 -2
  506. package/src/deploy/platforms/types.ts +21 -7
  507. package/src/deploy/platforms/vercel.ts +149 -17
  508. package/src/deploy/redirects.ts +151 -24
  509. package/src/deploy/rss.ts +3 -1
  510. package/src/deploy/sitemap.ts +39 -5
  511. package/src/deploy/vercel-negotiation.ts +326 -102
  512. package/src/eval/agents.ts +18 -1
  513. package/src/eval/prompts.ts +6 -3
  514. package/src/eval/report.ts +34 -13
  515. package/src/eval/run.ts +5 -0
  516. package/src/markdown/api-rail.ts +259 -0
  517. package/src/markdown/code-title.ts +35 -9
  518. package/src/markdown/features.ts +3 -2
  519. package/src/markdown/fence-meta.ts +2 -0
  520. package/src/markdown/include.ts +11 -1
  521. package/src/markdown/index.ts +28 -5
  522. package/src/markdown/math.ts +4 -4
  523. package/src/markdown/relative-links.ts +3 -2
  524. package/src/markdown/variables.ts +56 -0
  525. package/src/markdown/views.ts +82 -0
  526. package/src/narration/build.ts +412 -0
  527. package/src/narration/player.ts +249 -0
  528. package/src/narration/provider.ts +29 -0
  529. package/src/narration/script.ts +592 -0
  530. package/src/og/card.ts +7 -6
  531. package/src/openapi/checks.ts +273 -0
  532. package/src/openapi/graphql-build.ts +21 -0
  533. package/src/openapi/graphql.ts +11 -0
  534. package/src/openapi/model.ts +72 -27
  535. package/src/openapi/overlay.ts +256 -0
  536. package/src/openapi/parse.ts +182 -4
  537. package/src/openapi/references.ts +64 -8
  538. package/src/openapi/render-mdx.ts +5 -1
  539. package/src/openapi/scalar.ts +40 -6
  540. package/src/openapi/source.ts +40 -15
  541. package/src/ratelimit/cloudflare.ts +54 -0
  542. package/src/ratelimit/index.ts +30 -0
  543. package/src/ratelimit/memory.ts +45 -0
  544. package/src/ratelimit/runtime.ts +247 -0
  545. package/src/ratelimit/schema.ts +28 -0
  546. package/src/ratelimit/upstash.ts +60 -0
  547. package/src/ratelimit/wrangler.ts +70 -0
  548. package/src/reference/asyncapi.ts +2 -2
  549. package/src/reference/graphql.ts +20 -3
  550. package/src/reference/index.ts +1 -0
  551. package/src/reference/openapi.ts +21 -7
  552. package/src/reference/options.ts +80 -8
  553. package/src/reference/scalar.ts +33 -8
  554. package/src/registry/eject.ts +23 -5
  555. package/src/registry/registry.ts +7 -0
  556. package/src/search/adapters/locale-scope.ts +30 -0
  557. package/src/search/adapters/typesense.ts +14 -4
  558. package/src/search/build.ts +21 -3
  559. package/src/search/documents.ts +26 -2
  560. package/src/search/orama-index.ts +191 -34
  561. package/src/search/pagefind-ranking.ts +39 -0
  562. package/src/search/source-pages.ts +29 -0
  563. package/src/search/sync/algolia.ts +111 -10
  564. package/src/search/sync/index.ts +52 -13
  565. package/src/search/sync/orama-cloud.ts +3 -0
  566. package/src/search/sync/typesense.ts +76 -26
  567. package/src/seo/metatags.ts +67 -0
  568. package/src/sources/contentful.ts +12 -0
  569. package/src/sources/github-releases.ts +7 -1
  570. package/src/sources/shared.ts +3 -0
  571. package/src/theme/chrome-icons.ts +1 -0
  572. package/src/theme/color.ts +500 -0
  573. package/src/theme/entry.ts +85 -6
  574. package/src/theme/palette.ts +121 -45
  575. package/src/translate/prompts.ts +1 -0
  576. package/src/translate/validate.ts +31 -3
  577. package/src/upgrade/upgrade.ts +4 -171
  578. package/dist/cli/chunk-1d7ve1dm.js.map +0 -12
  579. package/dist/cli/chunk-2hsdwb9n.js.map +0 -10
  580. package/dist/cli/chunk-35d4wj9f.js.map +0 -15
  581. package/dist/cli/chunk-364znk6q.js +0 -75
  582. package/dist/cli/chunk-364znk6q.js.map +0 -11
  583. package/dist/cli/chunk-5m5nmvyq.js.map +0 -13
  584. package/dist/cli/chunk-8ktnccpt.js.map +0 -10
  585. package/dist/cli/chunk-9t7a85s3.js.map +0 -10
  586. package/dist/cli/chunk-b07cmahc.js +0 -145
  587. package/dist/cli/chunk-b07cmahc.js.map +0 -11
  588. package/dist/cli/chunk-c8chx29p.js.map +0 -36
  589. package/dist/cli/chunk-e04dxsz1.js +0 -39
  590. package/dist/cli/chunk-e04dxsz1.js.map +0 -10
  591. package/dist/cli/chunk-j85vccga.js.map +0 -36
  592. package/dist/cli/chunk-p3v96n38.js.map +0 -10
  593. package/dist/cli/chunk-pehfxfta.js.map +0 -10
  594. package/dist/cli/chunk-pv29h0wf.js.map +0 -190
  595. package/dist/cli/chunk-q58y5e6a.js.map +0 -10
  596. package/dist/cli/chunk-vg9r4eb9.js.map +0 -14
  597. package/dist/cli/chunk-wrr3j9w9.js.map +0 -35
  598. package/dist/cli/chunk-yfyb25rh.js.map +0 -14
  599. package/docs/content/sources.mdx +0 -334
  600. /package/dist/cli/{chunk-tkacnehg.js.map → chunk-3v3ffbrj.js.map} +0 -0
  601. /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-8y2kmjv8.js.map} +0 -0
  602. /package/dist/cli/{chunk-2eytanqx.js.map → chunk-c887fj0s.js.map} +0 -0
  603. /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-dzwehpy7.js.map} +0 -0
  604. /package/dist/cli/{chunk-2z928egk.js.map → chunk-ft9vfys6.js.map} +0 -0
  605. /package/dist/cli/{chunk-a58773jm.js.map → chunk-kma9f6sf.js.map} +0 -0
  606. /package/dist/cli/{chunk-crgn1q09.js.map → chunk-sds923fa.js.map} +0 -0
  607. /package/dist/cli/{chunk-acanzt5p.js.map → chunk-tdqhyxfz.js.map} +0 -0
@@ -2,12 +2,66 @@ import { resolveAskBackend } from "../ai/ask.ts";
2
2
  import type { ResolvedConfig } from "../core/schema.ts";
3
3
  import type { Diagnostic } from "../core/types.ts";
4
4
 
5
+ /** A feature, and the secrets the adapter behind it reads. */
6
+ interface SecretOwner {
7
+ feature: string;
8
+ note?: string;
9
+ secrets: string[];
10
+ }
11
+
12
+ /**
13
+ * The adapters that name their own secrets. The built-ins mostly declare
14
+ * none: analytics ships public tokens in the page, consent managers load
15
+ * public scripts, reference adapters read public specs, and host adapters
16
+ * read platform-injected env.
17
+ */
18
+ const adapterSecretOwners = (config: ResolvedConfig): SecretOwner[] => {
19
+ const { consent, deployment, rateLimit } = config;
20
+ const { provider } = config.search;
21
+ const owners: SecretOwner[] = [
22
+ // Each search adapter declares the secrets its generated runtime reads.
23
+ { feature: `Search (${provider.kind})`, secrets: provider.requiredSecrets },
24
+ ...config.analytics.map((adapter) => ({
25
+ feature: `Analytics (${adapter.kind})`,
26
+ secrets: adapter.requiredSecrets,
27
+ })),
28
+ // Each content source adapter declares the env vars its fetch reads.
29
+ ...config.content.sources.map((source) => ({
30
+ feature: `Content source (${source.kind})`,
31
+ secrets: source.requiredSecrets,
32
+ })),
33
+ ...config.reference.map((adapter) => ({
34
+ feature: `API reference (${adapter.kind})`,
35
+ secrets: adapter.requiredSecrets,
36
+ })),
37
+ {
38
+ feature: `Deployment (${deployment.kind})`,
39
+ secrets: deployment.requiredSecrets,
40
+ },
41
+ ];
42
+ if (consent) {
43
+ owners.push({
44
+ feature: `Consent (${consent.kind})`,
45
+ secrets: consent.requiredSecrets,
46
+ });
47
+ }
48
+ // Upstash's endpoint and token.
49
+ if (rateLimit) {
50
+ owners.push({
51
+ feature: `Rate limiting (${rateLimit.kind})`,
52
+ note: "read at request time; without it the routes count in memory",
53
+ secrets: rateLimit.requiredSecrets,
54
+ });
55
+ }
56
+ return owners;
57
+ };
58
+
5
59
  /**
6
60
  * Warn early when an enabled feature needs a secret env var that isn't set, so
7
61
  * the failure surfaces at `blume dev`/`build` instead of at the first request in
8
62
  * production. These are runtime secrets (the endpoint reads them on the server),
9
63
  * so this warns rather than hard-fails — the value may live only in the deploy
10
- * environment. Build-time secrets (search-index sync) already warn during sync.
64
+ * environment. Build-time secrets (search-index sync) are checked by the sync.
11
65
  */
12
66
  export const checkRequiredSecrets = (config: ResolvedConfig): Diagnostic[] => {
13
67
  const diagnostics: Diagnostic[] = [];
@@ -26,47 +80,35 @@ export const checkRequiredSecrets = (config: ResolvedConfig): Diagnostic[] => {
26
80
 
27
81
  if (config.ai.assistant?.enabled && !config.ai.assistant.endpoint) {
28
82
  // The adapter descriptor names the env vars its route reads.
29
- const { provider } = config.ai.assistant;
83
+ const { captcha, provider } = config.ai.assistant;
30
84
  const backend = resolveAskBackend(provider);
31
85
  for (const env of provider.requiredSecrets) {
32
86
  requireSecret(`Assistant (${backend.label})`, env, backend.secretNote);
33
87
  }
34
- }
35
-
36
- // Each search adapter declares the secrets its generated runtime reads.
37
- const { provider } = config.search;
38
- for (const env of provider.requiredSecrets) {
39
- requireSecret(`Search (${provider.kind})`, env);
40
- }
41
-
42
- // Adapters name their own secrets; the built-in analytics adapters ship
43
- // public tokens in the page and declare none.
44
- for (const adapter of config.analytics) {
45
- for (const env of adapter.requiredSecrets) {
46
- requireSecret(`Analytics (${adapter.kind})`, env);
88
+ // The bot check's secret key, which the route verifies tokens with.
89
+ for (const env of captcha?.requiredSecrets ?? []) {
90
+ requireSecret(`Assistant bot check (${captcha?.kind})`, env);
47
91
  }
48
92
  }
49
93
 
50
- // Each content source adapter declares the env vars its fetch reads.
51
- for (const source of config.content.sources) {
52
- for (const env of source.requiredSecrets) {
53
- requireSecret(`Content source (${source.kind})`, env);
94
+ // Generated narration reads its key at build, not at runtime; without it the
95
+ // build skips the audio and pages read with browser voices.
96
+ const { narration } = config;
97
+ if (narration.enabled && narration.provider) {
98
+ for (const env of narration.provider.requiredSecrets) {
99
+ requireSecret(
100
+ "Narration audio",
101
+ env,
102
+ "read at build; without it pages use browser voices"
103
+ );
54
104
  }
55
105
  }
56
106
 
57
- // Adapters name their own secrets; the built-in reference adapters read
58
- // public specs and declare none.
59
- for (const adapter of config.reference) {
60
- for (const env of adapter.requiredSecrets) {
61
- requireSecret(`API reference (${adapter.kind})`, env);
107
+ for (const owner of adapterSecretOwners(config)) {
108
+ for (const env of owner.secrets) {
109
+ requireSecret(owner.feature, env, owner.note);
62
110
  }
63
111
  }
64
112
 
65
- // The deployment adapter names its own secrets; the built-in host adapters
66
- // read platform-injected env and declare none.
67
- for (const env of config.deployment.requiredSecrets) {
68
- requireSecret(`Deployment (${config.deployment.kind})`, env);
69
- }
70
-
71
113
  return diagnostics;
72
114
  };
@@ -49,6 +49,7 @@ import TreeRoot from "./content/Tree.astro";
49
49
  import TreeFile from "./content/TreeFile.astro";
50
50
  import TreeFolder from "./content/TreeFolder.astro";
51
51
  import TypeTable from "./content/TypeTable.astro";
52
+ import View from "./content/View.astro";
52
53
  import Visibility from "./content/Visibility.astro";
53
54
  import YouTube from "./content/YouTube.astro";
54
55
 
@@ -96,6 +97,7 @@ const components = {
96
97
  Tooltip,
97
98
  Tree,
98
99
  TypeTable,
100
+ View,
99
101
  Visibility,
100
102
  YouTube,
101
103
  ...extra,
@@ -0,0 +1,18 @@
1
+ ---
2
+ // The method and path at the top of a page with `api` frontmatter, as an
3
+ // OpenAPI operation page shows them. `markdown/api-rail.ts` places it.
4
+ import MethodBadge from "../openapi/MethodBadge.astro";
5
+ import { readEndpointSpec } from "./api-page.ts";
6
+
7
+ interface Props {
8
+ /** The endpoint, as the page's plugin wrote it. */
9
+ spec: string;
10
+ }
11
+
12
+ const { method, target } = readEndpointSpec(Astro.props.spec);
13
+ ---
14
+
15
+ <div class="not-prose mb-6 flex flex-wrap items-center gap-3">
16
+ <MethodBadge method={method} />
17
+ <code class="break-all font-mono text-foreground text-sm">{target}</code>
18
+ </div>
@@ -0,0 +1,79 @@
1
+ ---
2
+ // The row behind `<ParamField>` and `<ResponseField>`: the name with its
3
+ // labels, location, type, and flags, the default, then the description from
4
+ // the slot, which may hold any MDX, nested fields in an `<Expandable>`
5
+ // included. Styled like the OpenAPI reference's rows, so a hand-written API
6
+ // page reads like a generated one. Narration skips it, as it does type tables.
7
+ import { defaultLabel, isOn } from "./api-field.ts";
8
+ import type { FieldValue, FlagProp } from "./api-field.ts";
9
+
10
+ interface Props {
11
+ default?: FieldValue;
12
+ deprecated?: FlagProp;
13
+ location?: string;
14
+ name?: string;
15
+ post?: string[];
16
+ pre?: string[];
17
+ required?: FlagProp;
18
+ type?: string;
19
+ }
20
+
21
+ const {
22
+ default: value,
23
+ deprecated,
24
+ location,
25
+ name,
26
+ post = [],
27
+ pre = [],
28
+ required,
29
+ type,
30
+ } = Astro.props;
31
+ const shownDefault = defaultLabel(value);
32
+ const labelClass =
33
+ "rounded bg-muted px-1.5 py-0.5 font-medium text-[0.625rem] text-muted-foreground uppercase tracking-wide";
34
+ ---
35
+
36
+ <div
37
+ class="border-border border-b py-4"
38
+ data-blume-field
39
+ data-blume-narration="skip"
40
+ >
41
+ <div class="not-prose flex flex-wrap items-baseline gap-x-2 gap-y-1">
42
+ {pre.map((label) => <span class={labelClass}>{label}</span>)}
43
+ {name && <code class="font-mono text-foreground text-sm">{name}</code>}
44
+ {post.map((label) => <span class={labelClass}>{label}</span>)}
45
+ {location && <span class={labelClass}>{location}</span>}
46
+ {type && <span class="text-muted-foreground text-xs">{type}</span>}
47
+ {
48
+ isOn(required) && (
49
+ <span class="font-medium text-[0.625rem] text-red-600 uppercase tracking-wide dark:text-red-400">
50
+ required
51
+ </span>
52
+ )
53
+ }
54
+ {
55
+ isOn(deprecated) && (
56
+ <span class="font-medium text-[0.625rem] text-muted-foreground uppercase tracking-wide line-through">
57
+ deprecated
58
+ </span>
59
+ )
60
+ }
61
+ </div>
62
+ {
63
+ shownDefault !== null && (
64
+ <div class="not-prose mt-2 text-muted-foreground text-xs">
65
+ Default:{" "}
66
+ <code class="rounded bg-muted px-1 py-0.5 text-foreground">
67
+ {shownDefault}
68
+ </code>
69
+ </div>
70
+ )
71
+ }
72
+ {
73
+ Astro.slots.has("default") && (
74
+ <div class="mt-2 text-muted-foreground text-sm [&>:first-child]:mt-0 [&>:last-child]:mb-0">
75
+ <slot />
76
+ </div>
77
+ )
78
+ }
79
+ </div>
@@ -0,0 +1,66 @@
1
+ ---
2
+ // A hand-written endpoint's Try it panel and request samples, at the head of
3
+ // its rail: the page's `<ParamField>`s become the parameters and body of an
4
+ // operation model like a spec'd operation's (see `api-page.ts`), so the
5
+ // playground and the samples are the OpenAPI reference's own. A page's own
6
+ // `<RequestExample>` stands in for the generated samples, and its
7
+ // `playground` frontmatter can drop the Try it panel (`simple`).
8
+ import data from "blume:data";
9
+
10
+ import { operationModel } from "../openapi/operation-model.ts";
11
+ import Playground from "../openapi/Playground.astro";
12
+ import { buildRequest, defaultValues } from "../openapi/request.ts";
13
+ import RequestPanel from "../openapi/RequestPanel.astro";
14
+ import {
15
+ DEFAULT_SAMPLE_LANGUAGES,
16
+ sampleLanguages,
17
+ } from "../openapi/snippets.ts";
18
+ import {
19
+ endpointBody,
20
+ endpointParameters,
21
+ endpointSecurity,
22
+ endpointTarget,
23
+ readEndpointSpec,
24
+ } from "./api-page.ts";
25
+
26
+ interface Props {
27
+ /** The endpoint, as the page's plugin wrote it. */
28
+ spec: string;
29
+ }
30
+
31
+ const spec = readEndpointSpec(Astro.props.spec);
32
+ const { api } = data.config;
33
+ const { path, servers } = endpointTarget(spec.target, api.server);
34
+ const model = operationModel({
35
+ method: spec.method,
36
+ parameters: endpointParameters(spec.fields),
37
+ path,
38
+ requestBody: endpointBody(spec.fields),
39
+ schemas: {},
40
+ security: endpointSecurity(spec.authMethod, api.auth),
41
+ servers,
42
+ });
43
+ const tryIt = spec.playground !== "simple" && api.playground.enabled;
44
+ ---
45
+
46
+ {
47
+ tryIt && (
48
+ <Playground
49
+ model={model}
50
+ operation={`${spec.method} ${spec.target}`}
51
+ proxy={api.playground.proxy}
52
+ proxyConfig="api"
53
+ slug="api-pages"
54
+ />
55
+ )
56
+ }
57
+ {
58
+ !spec.requestExample && (
59
+ <RequestPanel
60
+ languages={sampleLanguages(DEFAULT_SAMPLE_LANGUAGES)}
61
+ responses={{}}
62
+ sample={buildRequest(model, defaultValues(model))}
63
+ schemas={{}}
64
+ />
65
+ )
66
+ }
@@ -0,0 +1,19 @@
1
+ ---
2
+ // The column `<RequestExample>` and `<ResponseExample>` pin to, which
3
+ // `markdown/api-rail.ts` gathers at the end of the page. At `xl` it sits
4
+ // beside the page's content, which the layout pads to make room, and sticks
5
+ // under the header like an OpenAPI operation's sample panel; below `xl` it
6
+ // follows the content.
7
+ import OperationPanel from "../openapi/OperationPanel.astro";
8
+ ---
9
+
10
+ <div
11
+ class="not-prose mt-10 xl:absolute xl:inset-y-0 xl:end-0 xl:mt-0 xl:w-[28rem]"
12
+ data-blume-api-rail
13
+ >
14
+ <OperationPanel>
15
+ <div class="flex flex-col gap-4 [&>*]:my-0">
16
+ <slot />
17
+ </div>
18
+ </OperationPanel>
19
+ </div>
@@ -10,6 +10,7 @@ const { variant = "compact" } = Astro.props;
10
10
  : "grid grid-cols-2 gap-x-5 gap-y-4 sm:grid-cols-4",
11
11
  ]}
12
12
  data-blume-color={variant}
13
+ data-blume-narration="skip"
13
14
  >
14
15
  <slot />
15
16
  </div>
@@ -3,6 +3,7 @@
3
3
 
4
4
  <div
5
5
  class="not-prose my-6 rounded-blume border border-border p-5 text-sm [&_ul]:m-0! [&_ul]:list-none [&_ul]:ps-4 [&>ul]:ps-0"
6
+ data-blume-narration="skip"
6
7
  >
7
8
  <slot />
8
9
  </div>
@@ -73,6 +73,7 @@ const { content: strings } = contentStrings(data, Astro.currentLocale);
73
73
  owner && repo && (
74
74
  <a
75
75
  class="not-prose my-6 flex flex-col gap-2 rounded-blume border border-border p-4 no-underline! transition-colors hover:border-foreground/30 hover:bg-muted/40"
76
+ data-blume-narration="skip"
76
77
  href={`${host}/${owner}/${repo}`}
77
78
  {...NEW_TAB_ATTRS}
78
79
  >
@@ -4,6 +4,7 @@ const { title } = Astro.props;
4
4
 
5
5
  <aside
6
6
  class="not-prose my-6 overflow-hidden rounded-blume border border-border/80 bg-background shadow-sm shadow-border/30"
7
+ data-blume-narration="skip"
7
8
  data-blume-panel
8
9
  data-blume-right-rail-item
9
10
  >
@@ -0,0 +1,25 @@
1
+ ---
2
+ // `<ParamField query="limit" type="integer" required>`: a request parameter,
3
+ // named by the attribute that says where it goes (`path`, `query`, `header`,
4
+ // or `body`), with its description in the slot. On a page with `api`
5
+ // frontmatter the fields also build that page's playground.
6
+ import ApiField from "./ApiField.astro";
7
+ import { paramField } from "./api-field.ts";
8
+ import type { ParamFieldProps } from "./api-field.ts";
9
+
10
+ type Props = ParamFieldProps;
11
+
12
+ const { location, name } = paramField(Astro.props);
13
+ const { default: value, deprecated, required, type } = Astro.props;
14
+ ---
15
+
16
+ <ApiField
17
+ default={value}
18
+ deprecated={deprecated}
19
+ location={location}
20
+ name={name}
21
+ required={required}
22
+ type={type}
23
+ >
24
+ <slot />
25
+ </ApiField>
@@ -0,0 +1,17 @@
1
+ ---
2
+ // `<RequestExample>`: code blocks showing a request, one tab per titled
3
+ // fence (or a language menu with `dropdown`). On a wide screen it pins to the
4
+ // column beside the page (see `ApiRail.astro`), above any `<ResponseExample>`.
5
+ import CodeGroup from "./CodeGroup.astro";
6
+
7
+ interface Props {
8
+ /** A language menu in place of tabs. */
9
+ dropdown?: boolean;
10
+ }
11
+
12
+ const { dropdown = false } = Astro.props;
13
+ ---
14
+
15
+ <CodeGroup dropdown={dropdown}>
16
+ <slot />
17
+ </CodeGroup>
@@ -0,0 +1,17 @@
1
+ ---
2
+ // `<ResponseExample>`: code blocks showing a response, one tab per titled
3
+ // fence (or a language menu with `dropdown`). On a wide screen it pins to the
4
+ // column beside the page (see `ApiRail.astro`), below any `<RequestExample>`.
5
+ import CodeGroup from "./CodeGroup.astro";
6
+
7
+ interface Props {
8
+ /** A language menu in place of tabs. */
9
+ dropdown?: boolean;
10
+ }
11
+
12
+ const { dropdown = false } = Astro.props;
13
+ ---
14
+
15
+ <CodeGroup dropdown={dropdown}>
16
+ <slot />
17
+ </CodeGroup>
@@ -0,0 +1,32 @@
1
+ ---
2
+ // `<ResponseField name="id" type="string" required>`: a field of the
3
+ // response, with optional `pre` and `post` labels around its name and its
4
+ // description in the slot.
5
+ import ApiField from "./ApiField.astro";
6
+ import { fieldLabels } from "./api-field.ts";
7
+ import type { ResponseFieldProps } from "./api-field.ts";
8
+
9
+ type Props = ResponseFieldProps;
10
+
11
+ const {
12
+ default: value,
13
+ deprecated,
14
+ name,
15
+ post,
16
+ pre,
17
+ required,
18
+ type,
19
+ } = Astro.props;
20
+ ---
21
+
22
+ <ApiField
23
+ default={value}
24
+ deprecated={deprecated}
25
+ name={name}
26
+ post={fieldLabels(post)}
27
+ pre={fieldLabels(pre)}
28
+ required={required}
29
+ type={type}
30
+ >
31
+ <slot />
32
+ </ApiField>
@@ -17,6 +17,7 @@ const canRenderIcon =
17
17
 
18
18
  <div
19
19
  class="relative [counter-increment:blume-step]"
20
+ data-blume-step
20
21
  >
21
22
  <span class:list={[markerClass, !canRenderIcon && "before:[content:counter(blume-step)]"]}>
22
23
  {canRenderIcon && <Icon name={icon} size={14} />}
@@ -17,6 +17,7 @@ const previewPattern =
17
17
  >
18
18
  <div
19
19
  class="flex aspect-[16/9] min-h-32 items-center justify-center bg-muted/40 p-4 text-muted-foreground [&_img]:max-h-full [&_img]:max-w-full [&_svg]:max-h-full [&_svg]:max-w-full"
20
+ data-blume-narration="skip"
20
21
  data-blume-tile-preview
21
22
  style={previewPattern}
22
23
  >
@@ -39,6 +39,7 @@ const tooltipId = tooltipIdFor(Astro.locals, [
39
39
  />
40
40
  <span
41
41
  class="absolute bottom-full left-1/2 z-20 mb-2 w-max max-w-[min(20rem,calc(100vw-1rem))] -translate-x-1/2 rounded-blume border border-border bg-background p-3 text-start font-sans text-foreground text-sm shadow-lg"
42
+ data-blume-narration="skip"
42
43
  data-blume-tooltip-panel
43
44
  id={tooltipId}
44
45
  role="tooltip"
@@ -3,6 +3,7 @@
3
3
 
4
4
  <blume-tree
5
5
  class="not-prose my-6 block rounded-blume border border-border bg-background p-3 text-sm"
6
+ data-blume-narration="skip"
6
7
  data-blume-tree
7
8
  role="tree"
8
9
  >
@@ -37,7 +37,10 @@ const columns = "grid grid-cols-[1fr_2fr_auto] items-center gap-4";
37
37
 
38
38
  {
39
39
  entries.length > 0 && (
40
- <div class="not-prose my-6 rounded-blume border border-border bg-muted/30 p-1.5">
40
+ <div
41
+ class="not-prose my-6 rounded-blume border border-border bg-muted/30 p-1.5"
42
+ data-blume-narration="skip"
43
+ >
41
44
  <div class={`${columns} px-3 py-2 font-medium text-muted-foreground text-xs`}>
42
45
  <span>{strings.prop}</span>
43
46
  <span>{strings.type}</span>
@@ -0,0 +1,21 @@
1
+ ---
2
+ /**
3
+ * One view of a page written for several (`<View title="Python">`), as
4
+ * Mintlify writes them. Each distinct title is an option of the page's view
5
+ * picker, and blocks sharing a title show and hide together, so a page can
6
+ * alternate between prose everyone reads and view-specific sections. The
7
+ * picker and the hiding live in `ViewSwitcher.astro`; `icon` shows beside
8
+ * the view's name there.
9
+ */
10
+ interface Props {
11
+ class?: string;
12
+ icon?: string;
13
+ title: string;
14
+ }
15
+
16
+ const { class: className, title } = Astro.props;
17
+ ---
18
+
19
+ <div class={className} data-blume-view={title}>
20
+ <slot />
21
+ </div>