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,15 +2,20 @@ import type { AstroIntegration } from "astro";
2
2
  import type { z } from "zod";
3
3
 
4
4
  import type { AskRetrievalOptions } from "../ai/ask-context.ts";
5
- import type { AssistantAdapter } from "../ai/ask.ts";
5
+ import type { AssistantAdapter, AssistantGatewayAdapter } from "../ai/ask.ts";
6
6
  import type { ComponentMarkdown } from "../ai/component-markdown.ts";
7
7
  import type { AnalyticsAdapter } from "../analytics/schema.ts";
8
+ import type { CaptchaAdapter } from "../captcha/schema.ts";
9
+ import type { ConsentAdapter } from "../consent/schema.ts";
8
10
  import type { DeploymentInput } from "../deploy/adapters/registry.ts";
9
11
  import type { CodeTheme } from "../markdown/themes.ts";
12
+ import type { RateLimitAdapter } from "../ratelimit/schema.ts";
13
+ import type { PlaygroundOptions } from "../reference/options.ts";
10
14
  import type { ReferenceAdapter } from "../reference/schema.ts";
11
15
  import type { AnySearchAdapter } from "../search/adapters/registry.ts";
12
16
  import type { SourceAdapterInput } from "../sources/registry.ts";
13
17
  import type { FontSlug } from "../theme/fonts.ts";
18
+ import type { FooterSocial } from "./footer.ts";
14
19
  import type {
15
20
  blumeConfigSchema,
16
21
  OpenInChatProvider,
@@ -92,21 +97,77 @@ export type LogoConfig =
92
97
  export type BannerConfig =
93
98
  | string
94
99
  | {
95
- /** The banner message. */
96
- content: string;
100
+ /** The banner message, or a map of locale code to message. */
101
+ content: LocalizableLabel;
97
102
  /** Show a dismiss button; the choice is remembered per visitor. */
98
103
  dismissible?: boolean;
99
- /** Stable key for remembering dismissal; defaults to the content. */
104
+ /**
105
+ * Stable key for remembering dismissal; defaults to the content (the
106
+ * default locale's, for a per-locale map).
107
+ */
100
108
  id?: string;
101
109
  /** An optional call-to-action link. */
102
110
  link?: {
103
111
  /** Link target (internal route or external URL). */
104
112
  href: string;
105
- /** Link text. */
106
- text: string;
113
+ /** Link text, or a map of locale code to text. */
114
+ text: LocalizableLabel;
107
115
  };
108
116
  };
109
117
 
118
+ /** Defaults for hand-written endpoint pages, the ones with `api` frontmatter. */
119
+ export interface ApiConfig {
120
+ /** How requests authenticate, unless a page sets `authMethod`. Defaults to none. */
121
+ auth?: {
122
+ method: "bearer" | "basic" | "key" | "none";
123
+ /** The header an API key goes in. Defaults to `x-api-key`. */
124
+ name?: string;
125
+ };
126
+ /**
127
+ * The Try it panel: `false` hides it, and `{ proxy }` sends requests through
128
+ * a CORS proxy, a URL or `true` for the built-in `/_api-proxy` route (server
129
+ * output only). Defaults to `true`, sending directly.
130
+ */
131
+ playground?: PlaygroundOptions;
132
+ /** The base URL an `api` path joins, like `https://api.acme.com/v1`. */
133
+ server?: string;
134
+ }
135
+
136
+ /** A link in the footer's row. */
137
+ export interface FooterLink {
138
+ /** Link target (internal route or external URL). An external href opens in a new tab. */
139
+ href: string;
140
+ /** Link text, or a map of locale code to text. */
141
+ label: LocalizableLabel;
142
+ }
143
+
144
+ /**
145
+ * The site footer, below the content on every page: a row of links on one
146
+ * side, and social profile icons on the other.
147
+ */
148
+ export interface FooterConfig {
149
+ /** Links in one row, left to right. */
150
+ links?: FooterLink[];
151
+ /**
152
+ * Social profiles, platform to URL, shown as icons in the order written:
153
+ * `{ github: "https://github.com/acme", x: "https://x.com/acme" }`.
154
+ */
155
+ socials?: Partial<Record<FooterSocial, string>>;
156
+ }
157
+
158
+ /**
159
+ * The generated `/changelog` index's heading and description. Each is a
160
+ * string, or a map of locale code to text; the index renders in the default
161
+ * locale. Unset, they're the `changelog` UI strings (`Changelog` in English),
162
+ * which `i18n.ui` translates.
163
+ */
164
+ export interface ChangelogConfig {
165
+ /** The index's description, below its heading and in its meta description. */
166
+ description?: LocalizableLabel;
167
+ /** The index's heading, page title, and OG card title. */
168
+ title?: LocalizableLabel;
169
+ }
170
+
110
171
  /**
111
172
  * Where content lives and how it's discovered. `root`/`include`/`exclude` are
112
173
  * zero-config shorthand for a single `filesystem()` source; set `sources` to
@@ -203,7 +264,8 @@ export interface ContentTypeConfig {
203
264
  // ---------------------------------------------------------------------------
204
265
 
205
266
  /**
206
- * A header label, optionally per locale: a plain string, or a map of locale
267
+ * A label, optionally per locale (header tabs and links, the banner, the
268
+ * footer): a plain string, or a map of locale
207
269
  * code to label (`{ en: "Docs", ja: "ドキュメント" }`). The active locale's
208
270
  * entry wins, then the default locale's, then the map's first entry.
209
271
  */
@@ -286,8 +348,8 @@ export interface FeaturedLink {
286
348
  href: string;
287
349
  /** Lucide icon name shown beside the label. */
288
350
  icon?: string;
289
- /** Link label. */
290
- label: string;
351
+ /** Link label, or a map of locale code to label. */
352
+ label: LocalizableLabel;
291
353
  }
292
354
 
293
355
  /**
@@ -312,8 +374,8 @@ export type SidebarConfig =
312
374
  export interface HeaderAction {
313
375
  /** Link target. An external href opens in a new tab. */
314
376
  href: string;
315
- /** Link label. */
316
- label: string;
377
+ /** Link label, or a map of locale code to label. */
378
+ label: LocalizableLabel;
317
379
  }
318
380
 
319
381
  /** Header, sidebar, tabs, and switcher configuration. */
@@ -325,7 +387,7 @@ export interface NavigationConfig {
325
387
  /** Pinned links shown above the generated sidebar sections. */
326
388
  featured?: FeaturedLink[];
327
389
  /**
328
- * The GitHub link in the header. `true` derives it from `github` (the
390
+ * The GitHub link in the footer. `true` derives it from `github` (the
329
391
  * default), `false` hides it, and an absolute URL points it anywhere on
330
392
  * GitHub — an organization, say, when the docs repo itself is private.
331
393
  */
@@ -457,6 +519,16 @@ export type SearchProviderConfig = AnySearchAdapter | false;
457
519
 
458
520
  /** The object form of `search`: the adapter plus adapter-independent settings. */
459
521
  export interface SearchOptions {
522
+ /** What search reports to the configured analytics providers. */
523
+ analytics?: {
524
+ /**
525
+ * Send each query's text with the `search` and `search_select` events.
526
+ * Defaults to `true`. `false` sends the query's length (`queryChars`)
527
+ * instead, and the text rides only the `blume:track` DOM event, for a
528
+ * site to forward on its own terms.
529
+ */
530
+ queries?: boolean;
531
+ };
460
532
  /** Indexing behavior. */
461
533
  indexing?: {
462
534
  /**
@@ -480,7 +552,7 @@ export interface SearchOptions {
480
552
  /**
481
553
  * Search configuration. Pass an adapter directly (`search: algolia({…})`, or
482
554
  * `false`) as shorthand for the object form, which also carries `popular`
483
- * links and `indexing` settings.
555
+ * links and `indexing` and `analytics` settings.
484
556
  */
485
557
  export type SearchConfig = SearchProviderConfig | SearchOptions;
486
558
 
@@ -520,6 +592,13 @@ export interface AssistantRetrievalConfig {
520
592
 
521
593
  /** The chat assistant. */
522
594
  export interface AssistantConfig {
595
+ /**
596
+ * A bot check from `blume/captcha` — `turnstile({ siteKey })` or
597
+ * `hcaptcha({ siteKey })`. The panel sends a token with each question and
598
+ * the generated route verifies it (with `TURNSTILE_SECRET_KEY` or
599
+ * `HCAPTCHA_SECRET_KEY`) before the model runs.
600
+ */
601
+ captcha?: CaptchaAdapter;
523
602
  /**
524
603
  * Origins allowed to call the generated endpoint from another site — a
525
604
  * marketing page that embeds an ask box, for example — or `"*"` to allow
@@ -548,10 +627,10 @@ export interface AssistantConfig {
548
627
  instructions?: string;
549
628
  /**
550
629
  * Which backend answers: the descriptor an adapter factory returns —
551
- * `gateway({ model })`, `openrouter({ model, reasoning })`,
552
- * `llmgateway({ model })`, `inkeep({ model })`, or
553
- * `openaiCompatible({ baseUrl, name, model, apiKeyEnv })`, all exported
554
- * from `blume/ai`. Each adapter owns its model, key env var, reasoning
630
+ * `openai({ model, baseUrl })`, `anthropic({ model })`,
631
+ * `gemini({ model })`, `grok({ model })`, `gateway({ model })`,
632
+ * `openrouter({ model, reasoning })`, `llmgateway({ model })`, or
633
+ * `inkeep({ model })`, all exported from `blume/ai`. Each adapter owns its model, key env var, reasoning
555
634
  * mapping, and `providerOptions` passthrough. Defaults to
556
635
  * `gateway({ model: "openai/gpt-5.5" })`.
557
636
  */
@@ -562,8 +641,23 @@ export interface AssistantConfig {
562
641
  * backend — at the cost of recall. Defaults keep the built-in behavior.
563
642
  */
564
643
  retrieval?: AssistantRetrievalConfig;
644
+ /**
645
+ * A Contact support link in the panel once there's a conversation: a
646
+ * `mailto:` address starts an email with the conversation as its body; a
647
+ * URL or root-relative path gets the conversation's `thread` id, which the
648
+ * assistant's analytics events carry too.
649
+ */
650
+ support?: string;
565
651
  /** Starter prompts shown before the first question. */
566
652
  suggestions?: AssistantSuggestion[];
653
+ /**
654
+ * Let the model search the docs and read whole pages itself, over several
655
+ * steps, instead of answering only from the excerpts retrieved up front.
656
+ * Defaults to `true`, except for `openai()` with a `baseUrl`, whose model
657
+ * may not support tool calling. `inkeep()` does its own retrieval and
658
+ * ignores it.
659
+ */
660
+ tools?: boolean;
567
661
  }
568
662
 
569
663
  /** What the AI Catalog (ARD) manifest carries. */
@@ -693,6 +787,12 @@ export interface I18nConfig {
693
787
  locales: LocaleConfigInput[];
694
788
  /** `dir`: locale directories (`fr/page.mdx`). `dot`: filename suffix (`page.fr.mdx`). */
695
789
  parser?: "dir" | "dot";
790
+ /**
791
+ * Send a visitor who lands on the default language's home page to the home
792
+ * page in their browser's preferred language, until they pick a language
793
+ * with the switcher. Defaults to `false`.
794
+ */
795
+ routeByBrowserLanguage?: boolean;
696
796
  /**
697
797
  * Per-locale UI string overrides, e.g.
698
798
  * `{ fr: { search: { button: "Rechercher" } } }`.
@@ -802,11 +902,19 @@ type RedirectStatus = RedirectStatusPermanent | RedirectStatusTemporary;
802
902
 
803
903
  /** A URL redirect rule. */
804
904
  export interface RedirectConfig {
805
- /** Path to redirect from. */
905
+ /**
906
+ * Path to redirect from: an exact path, or a pattern. `:name` matches one
907
+ * segment, `:name*` as the last segment the rest of the path
908
+ * (`/beta/:slug*`), and `*` ending a segment the rest from there
909
+ * (`/old/article-*`).
910
+ */
806
911
  from: string;
807
912
  /** HTTP status. Defaults to `301`. */
808
913
  status?: RedirectStatus;
809
- /** Path or URL to redirect to. */
914
+ /**
915
+ * Path or URL to redirect to. Reads `from`'s captures as `/:name` (or `*`
916
+ * for what `*` matched): `/v2/:slug*`.
917
+ */
810
918
  to: string;
811
919
  }
812
920
 
@@ -890,6 +998,13 @@ export interface AgentsConfig {
890
998
  markdownComponents?: Record<string, ComponentMarkdown>;
891
999
  /** Expose the docs as an MCP server for agents. */
892
1000
  mcp?: McpConfig;
1001
+ /**
1002
+ * Generate the site's own agent skill: a `SKILL.md` named after the site,
1003
+ * built from its navigation and page descriptions, served at `/skill.md`
1004
+ * and in the skills discovery index. Needs `deployment.site`. A skill in
1005
+ * `agents.skills` with the same name replaces it. Defaults to `true`.
1006
+ */
1007
+ skillMd?: boolean;
893
1008
  /**
894
1009
  * Publish Agent Skills for discovery: a directory (resolved against the
895
1010
  * project root) whose subdirectories each hold a `SKILL.md`. Skills are
@@ -1070,6 +1185,23 @@ export interface SoftwareConfig {
1070
1185
 
1071
1186
  /** Discoverability: OG images, feeds, sitemap, robots, and structured data. */
1072
1187
  export interface SeoConfig {
1188
+ /**
1189
+ * Meta tags written into every page's head, name to content: site
1190
+ * verification tokens, `theme-color`, an app banner, and anything else
1191
+ * Blume has no setting for. `og:*`, `fb:*`, and `article:*` tags render
1192
+ * with `property`, the rest with `name`. A tag Blume writes itself
1193
+ * (`description`, `robots`, `og:image`, `twitter:card`, …) is refused.
1194
+ *
1195
+ * ```ts
1196
+ * seo: {
1197
+ * metatags: {
1198
+ * "google-site-verification": "abc123",
1199
+ * "theme-color": "#0b5fff",
1200
+ * },
1201
+ * }
1202
+ * ```
1203
+ */
1204
+ metatags?: Record<string, string>;
1073
1205
  /** Per-page Open Graph image generation. */
1074
1206
  og?: OgConfig;
1075
1207
  /**
@@ -1199,8 +1331,8 @@ export interface MarkdownConfig {
1199
1331
  export interface ReactConfig {
1200
1332
  /**
1201
1333
  * Auto-memoize React components/hooks with the React Compiler
1202
- * (`babel-plugin-react-compiler`). On by default whenever React is enabled;
1203
- * set to `false` to skip the compiler's babel pass. Defaults to `true`.
1334
+ * (`oxc-transform-react`). On by default whenever React is enabled;
1335
+ * set to `false` to skip the compiler pass. Defaults to `true`.
1204
1336
  */
1205
1337
  compiler?: boolean;
1206
1338
  }
@@ -1241,6 +1373,37 @@ export type ExportConfig =
1241
1373
  pdf?: boolean;
1242
1374
  };
1243
1375
 
1376
+ /** Page feedback: the rating, and an optional written comment after it. */
1377
+ export interface FeedbackConfig {
1378
+ /**
1379
+ * After the rating, offer a box to say more. The comment is sent as a
1380
+ * `feedback_comment` event through every analytics adapter with an event
1381
+ * API. Defaults to `false`.
1382
+ */
1383
+ comments?: boolean;
1384
+ /** Show the rating. Defaults to `true`. */
1385
+ enabled?: boolean;
1386
+ }
1387
+
1388
+ /**
1389
+ * "Listen to this page". `true` reads pages aloud with the reader's browser
1390
+ * voices (no key, any host). The object form's `provider` generates neural
1391
+ * audio at build instead, one cached clip per sentence, and falls back to
1392
+ * browser voices where no clips exist. Defaults to `false`.
1393
+ */
1394
+ export type NarrationConfig =
1395
+ | boolean
1396
+ | {
1397
+ /** Show the player. Defaults to `true` in the object form. */
1398
+ enabled?: boolean;
1399
+ /**
1400
+ * Generate audio at build with a speech model:
1401
+ * `gateway({ model: "openai/tts-1-hd", voice: "alloy" })` from
1402
+ * `blume/ai`. Without it, pages are read with browser voices.
1403
+ */
1404
+ provider?: AssistantGatewayAdapter;
1405
+ };
1406
+
1244
1407
  /**
1245
1408
  * Opt-in custom frontmatter keys. Page frontmatter is strictly validated —
1246
1409
  * an unknown key fails the build so typos are caught — and `extend` carves
@@ -1335,6 +1498,8 @@ export interface BlumeConfig {
1335
1498
  agents?: AgentsConfig;
1336
1499
  /** Model-facing features: the assistant and the "Open in chat" action. */
1337
1500
  ai?: AiConfig;
1501
+ /** Defaults for hand-written endpoint pages (`api` frontmatter). */
1502
+ api?: ApiConfig;
1338
1503
  /**
1339
1504
  * Analytics adapters from `blume/analytics`, emitted into `<head>` of every
1340
1505
  * production page in this order: `[posthog({ key }), vercel(),
@@ -1353,6 +1518,19 @@ export interface BlumeConfig {
1353
1518
  * compose: with both set, a page lands at `{deployment.base}/{basePath}/page`.
1354
1519
  */
1355
1520
  basePath?: string;
1521
+ /**
1522
+ * The generated `/changelog` index's title and description, each a string
1523
+ * or a per-locale map. Unset, they're the `changelog` UI strings.
1524
+ */
1525
+ changelog?: ChangelogConfig;
1526
+ /**
1527
+ * Ask readers before analytics runs, with an adapter from `blume/consent`:
1528
+ * `native()` for Blume's own banner, or a hosted consent manager
1529
+ * (`osano({ customerId, configId })`, `ethyca({ privacyCenter })`). Every
1530
+ * `analytics` adapter waits until the reader allows analytics. Unset runs
1531
+ * analytics as it loads.
1532
+ */
1533
+ consent?: ConsentAdapter;
1356
1534
  /** Where content lives and how it's discovered. */
1357
1535
  content?: ContentConfig;
1358
1536
  /**
@@ -1376,8 +1554,17 @@ export interface BlumeConfig {
1376
1554
  examples?: string | ExamplesConfig;
1377
1555
  /** Reader-facing PDF/EPUB export actions. Defaults to `false`. */
1378
1556
  export?: ExportConfig;
1379
- /** Show the per-page "Was this helpful?" widget. Defaults to `true`. */
1380
- feedback?: boolean;
1557
+ /**
1558
+ * The "Was this page helpful?" rating at the foot of each page. On by
1559
+ * default; `false` hides it. `{ comments: true }` also asks for a written
1560
+ * comment after the rating, sent through your analytics adapters.
1561
+ */
1562
+ feedback?: boolean | FeedbackConfig;
1563
+ /**
1564
+ * The site footer: social profile icons and up to four link columns. Unset,
1565
+ * the site has no footer.
1566
+ */
1567
+ footer?: FooterConfig;
1381
1568
  /** Opt-in custom frontmatter keys, validated by schemas you supply. */
1382
1569
  frontmatter?: FrontmatterConfig;
1383
1570
  /** Source repository (Edit-this-page links and the header repo link). */
@@ -1394,8 +1581,17 @@ export interface BlumeConfig {
1394
1581
  logo?: LogoConfig;
1395
1582
  /** Markdown / MDX rendering behavior. */
1396
1583
  markdown?: MarkdownConfig;
1584
+ /** "Listen to this page" narration. Defaults to `false`. */
1585
+ narration?: NarrationConfig;
1397
1586
  /** Header, sidebar, tabs, and switchers. */
1398
1587
  navigation?: NavigationConfig;
1588
+ /**
1589
+ * Limit how often one reader (by IP address) can call the server routes —
1590
+ * the assistant, the API playground proxy, server-side search — with an
1591
+ * adapter from `blume/ratelimit`: `memory()` (the default, 30 requests per
1592
+ * 10 minutes), `upstash()`, or `cloudflare()`. `false` turns it off.
1593
+ */
1594
+ rateLimit?: false | RateLimitAdapter;
1399
1595
  /** React island behavior (compiler auto-memoization). */
1400
1596
  react?: ReactConfig;
1401
1597
  /** URL redirect rules. */
@@ -1416,6 +1612,12 @@ export interface BlumeConfig {
1416
1612
  title?: string;
1417
1613
  /** On-page table of contents. Defaults to on (H2–H3). */
1418
1614
  toc?: TocConfig;
1615
+ /**
1616
+ * Content variables: `{{name}}` in a page reads the value, in prose, code,
1617
+ * and links alike. Names take letters, digits, `_`, and `-`; an undefined
1618
+ * name in prose fails the build. Defaults to none.
1619
+ */
1620
+ variables?: Record<string, string>;
1419
1621
  /** Docs versioning (opt-in frozen snapshots with a version switcher). */
1420
1622
  versions?: VersionsConfig;
1421
1623
  }
package/src/core/data.ts CHANGED
@@ -1,8 +1,10 @@
1
+ import type { CaptchaSettings } from "../captcha/schema.ts";
2
+ import type { EndpointAuth } from "../components/content/api-page.ts";
1
3
  import type { SearchAdapterKind } from "../search/adapters/registry.ts";
2
4
  import type { StructuredDataIdentity } from "../seo/jsonld.ts";
3
5
  import type { FontHead } from "../theme/fonts.ts";
4
6
  import type { UIStrings } from "./i18n-ui.ts";
5
- import type { ResolvedConfig } from "./schema.ts";
7
+ import type { LocalizableLabel, ResolvedConfig } from "./schema.ts";
6
8
  import type { Navigation, RouteAlternate, VersionAlternate } from "./types.ts";
7
9
 
8
10
  /**
@@ -42,10 +44,14 @@ export interface BlumeFavicon {
42
44
  dark?: { href: string; type?: string };
43
45
  }
44
46
 
45
- /** Announcement banner, normalized from its config (string shorthand or object). */
47
+ /**
48
+ * Announcement banner, normalized from its config (string shorthand or
49
+ * object). `content` and the link's `text` may be per-locale maps, resolved
50
+ * when the banner renders (see `core/localizable.ts`).
51
+ */
46
52
  export interface BlumeBanner {
47
- content: string;
48
- link?: { href: string; text: string };
53
+ content: LocalizableLabel;
54
+ link?: { href: string; text: LocalizableLabel };
49
55
  dismissible: boolean;
50
56
  /** Dismissal key: the configured id, else the content itself. */
51
57
  key: string;
@@ -71,6 +77,8 @@ export interface BlumeDataI18n {
71
77
  fallbackLocale: string | null;
72
78
  hideDefaultLocalePrefix: boolean;
73
79
  locales: BlumeDataLocale[];
80
+ /** Send visitors from the default home page to their browser's language. */
81
+ routeByBrowserLanguage: boolean;
74
82
  }
75
83
 
76
84
  /** A single content route, with the metadata custom pages can read. */
@@ -124,9 +132,23 @@ export interface BlumeDataConfig {
124
132
  appleIcon: BlumeFavicon | null;
125
133
  /** The assistant's empty-state suggestions, or `null` when the assistant is off. */
126
134
  assistant: {
135
+ /** The bot check's public settings, or `null` without one. */
136
+ captcha: CaptchaSettings | null;
127
137
  endpoint: string | null;
128
138
  suggestions: NonNullable<ResolvedConfig["ai"]["assistant"]>["suggestions"];
139
+ /** The Contact support link (`ai.assistant.support`), or `null`. */
140
+ support: string | null;
129
141
  } | null;
142
+ /**
143
+ * Defaults for hand-written endpoint pages (`api` frontmatter): the server a
144
+ * path joins, the default auth, and the playground, its `proxy` resolved to
145
+ * the URL sends go through (the built-in route under `basePath`) or `false`.
146
+ */
147
+ api: {
148
+ auth?: EndpointAuth;
149
+ playground: { enabled: boolean; proxy: string | false };
150
+ server?: string;
151
+ };
130
152
  banner: BlumeBanner | null;
131
153
  /** Site-wide route mount point, normalized to `""` or `/seg` (see config). */
132
154
  basePath: string;
@@ -134,6 +156,11 @@ export interface BlumeDataConfig {
134
156
  codeThemes: ResolvedConfig["markdown"]["code"]["theme"];
135
157
  /** `markdown.code.wrap`: wrap long code lines instead of scrolling. */
136
158
  codeWrap: boolean;
159
+ /**
160
+ * The consent adapter's descriptor, or `null` without one. When set, the
161
+ * layouts hold analytics until the reader allows it.
162
+ */
163
+ consent: ResolvedConfig["consent"];
137
164
  /** `dateFormat`: `Intl.DateTimeFormat` options for the date stamps. */
138
165
  dateFormat: ResolvedConfig["dateFormat"];
139
166
  description: string | undefined;
@@ -156,7 +183,12 @@ export interface BlumeDataConfig {
156
183
  sitemap: boolean;
157
184
  };
158
185
  favicon: BlumeFavicon;
186
+ /** Whether pages end with the "Was this page helpful?" rating. */
159
187
  feedback: boolean;
188
+ /** Whether the rating asks for a written comment after it (`feedback.comments`). */
189
+ feedbackComments: boolean;
190
+ /** `footer`: social profile icons and link columns, or `null` when unset. */
191
+ footer: ResolvedConfig["footer"] | null;
160
192
  /**
161
193
  * Repo coordinates for content components that address the API or build
162
194
  * their own repo links (`<GithubInfo>`, the OG card's footer slug), carrying
@@ -176,6 +208,14 @@ export interface BlumeDataConfig {
176
208
  logo: BlumeLogo | null;
177
209
  /** Hosted MCP server, or `null` when MCP is off. */
178
210
  mcp: { name: string; route: string } | null;
211
+ /** `seo.metatags`: the site's own tags for every page's head, or `null`. */
212
+ metatags: Record<string, string> | null;
213
+ /**
214
+ * "Listen to this page": `generated` when a `narration.provider` makes
215
+ * `blume build` write audio clips the player should look for, else the
216
+ * player reads with browser voices. `null` when narration is off.
217
+ */
218
+ narration: { generated: boolean } | null;
179
219
  /**
180
220
  * Open Graph image generation. Card fonts are baked into the generated OG
181
221
  * endpoint (they can carry absolute build-machine paths) and deliberately
@@ -208,6 +248,8 @@ export interface BlumeDataConfig {
208
248
  /** Repository URL for header/edit links, or `null`. */
209
249
  repoUrl: string | null;
210
250
  search: {
251
+ /** `search.analytics`: whether the dialog's events carry each query's text. */
252
+ analytics: { queries: boolean };
211
253
  enabled: boolean;
212
254
  /** Resolved empty-state links; empty when unset (Search falls back to sidebar). */
213
255
  popular: { icon?: string; label: string; route: string }[];
@@ -24,6 +24,7 @@ const DOCS_BASE = "https://useblume.dev";
24
24
  const DOCS_DEPLOYMENT = "/docs/deployment";
25
25
  const DOCS_CLI_VALIDATE = "/docs/cli/validate";
26
26
  const DOCS_CONTENT_SOURCES = "/docs/content/sources";
27
+ const DOCS_CONTENT_SOURCES_OBSIDIAN = "/docs/content/sources/obsidian";
27
28
  const DOCS_CONTENT_NAVIGATION = "/docs/content/navigation";
28
29
  const DOCS_CONTENT_INCLUDES = "/docs/content/includes";
29
30
 
@@ -44,6 +45,7 @@ const DOCS_PATHS = new Map(
44
45
  BLUME_DEPENDENCY_MISSING: "/docs/cli/doctor",
45
46
  BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,
46
47
  BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,
48
+ BLUME_EXAMPLE_NOT_FOUND: "/docs/content/components#component",
47
49
  BLUME_FRONTMATTER_INVALID: "/docs/content/frontmatter",
48
50
  BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,
49
51
  BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,
@@ -59,13 +61,17 @@ const DOCS_PATHS = new Map(
59
61
  BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,
60
62
  BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,
61
63
  BLUME_NODE_VERSION: "/docs/quickstart",
64
+ BLUME_SEARCH_SYNC_FAILED: "/docs/configuration/search",
62
65
  BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,
63
66
  BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,
64
67
  BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,
65
68
  BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,
66
69
  BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,
70
+ BLUME_SOURCE_PATH_MISSING: "/docs/content/sources/remote-mdx",
67
71
  BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,
68
72
  BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,
73
+ BLUME_SOURCE_UNRESOLVED_LINK: "/docs/content/sources/contentful",
74
+ BLUME_SOURCE_UNSUPPORTED_NODE: "/docs/content/sources/payload",
69
75
  BLUME_TRANSLATE_MISSING: "/docs/cli/translate",
70
76
  BLUME_TRANSLATE_STALE: "/docs/cli/translate",
71
77
  BLUME_UNKNOWN_COMPONENT: "/docs/configuration/customization",
@@ -73,8 +79,8 @@ const DOCS_PATHS = new Map(
73
79
  BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,
74
80
  BLUME_UNKNOWN_OPTION: "/docs/cli",
75
81
  BLUME_UNLOADABLE_FILE_NAME: "/docs/content",
76
- BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES,
77
- BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES,
82
+ BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES_OBSIDIAN,
83
+ BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES_OBSIDIAN,
78
84
  BLUME_YARN_PNP: "/docs/quickstart",
79
85
  })
80
86
  );
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The social platforms `footer.socials` links to, each shown by its brand
3
+ * icon: Mintlify's set, without its aliases (`twitter` and `x-twitter` are
4
+ * `x`, `earth-americas` is `website`).
5
+ */
6
+ export const FOOTER_SOCIALS = [
7
+ "bluesky",
8
+ "discord",
9
+ "facebook",
10
+ "github",
11
+ "hacker-news",
12
+ "instagram",
13
+ "linkedin",
14
+ "medium",
15
+ "podcast",
16
+ "reddit",
17
+ "slack",
18
+ "telegram",
19
+ "threads",
20
+ "website",
21
+ "x",
22
+ "youtube",
23
+ ] as const;
24
+
25
+ /** A platform `footer.socials` links to. */
26
+ export type FooterSocial = (typeof FOOTER_SOCIALS)[number];