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
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ import type { AdapterDescriptor } from "../core/adapter.ts";
3
+ /** Options for {@link native}. */
4
+ export interface NativeOptions {
5
+ /** Where the banner's privacy policy link goes: a page route or a URL. */
6
+ policy?: string;
7
+ }
8
+ export declare const nativeOptionsSchema: z.ZodObject<{
9
+ policy: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strict>;
11
+ export type NativeAdapter = AdapterDescriptor<"native", NativeOptions>;
12
+ export declare const nativeAdapterSchema: z.ZodObject<{
13
+ kind: z.ZodLiteral<"native">;
14
+ options: z.ZodObject<{
15
+ policy: z.ZodOptional<z.ZodString>;
16
+ }, z.core.$strict>;
17
+ requiredSecrets: z.ZodArray<z.ZodString>;
18
+ runtimeDeps: z.ZodArray<z.ZodString>;
19
+ }, z.core.$strict>;
20
+ /**
21
+ * Blume's own consent banner: a card at the foot of the page asking to use
22
+ * analytics cookies, with Accept and Decline side by side and an optional
23
+ * link to your privacy policy. The answer stays in the reader's browser, and
24
+ * the footer's Cookie settings link brings the banner back to change it. Its
25
+ * text comes from the `consent` UI strings, translated in every built-in
26
+ * language.
27
+ */
28
+ export declare const native: (options?: NativeOptions) => NativeAdapter;
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ import type { HeadScript } from "../analytics/head.ts";
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ /** Options for {@link osano}. */
5
+ export interface OsanoOptions {
6
+ /** The configuration ID from the script tag Osano gives you. */
7
+ configId: string;
8
+ /** The customer ID from the script tag Osano gives you. */
9
+ customerId: string;
10
+ }
11
+ export declare const osanoOptionsSchema: z.ZodObject<{
12
+ configId: z.ZodString;
13
+ customerId: z.ZodString;
14
+ }, z.core.$strict>;
15
+ export type OsanoAdapter = AdapterDescriptor<"osano", OsanoOptions>;
16
+ export declare const osanoAdapterSchema: z.ZodObject<{
17
+ kind: z.ZodLiteral<"osano">;
18
+ options: z.ZodObject<{
19
+ configId: z.ZodString;
20
+ customerId: z.ZodString;
21
+ }, z.core.$strict>;
22
+ requiredSecrets: z.ZodArray<z.ZodString>;
23
+ runtimeDeps: z.ZodArray<z.ZodString>;
24
+ }, z.core.$strict>;
25
+ /**
26
+ * Osano Cookie Consent. Osano shows its own banner and drawer, set up in the
27
+ * Osano dashboard, and Blume runs the analytics once Osano reports the
28
+ * reader's `ANALYTICS` consent. Both IDs come from the script tag Osano
29
+ * gives you, and neither is secret.
30
+ */
31
+ export declare const osano: (options: OsanoOptions) => OsanoAdapter;
32
+ /**
33
+ * Reports Osano's analytics consent to `window.blumeConsent` now (`Osano.cm`
34
+ * is ready as soon as its script ran) and on every Osano consent event, and
35
+ * reopens Osano's drawer from the Cookie settings link.
36
+ */
37
+ export declare const OSANO_BRIDGE = "(()=>{const o=window.Osano?.cm;const c=window.blumeConsent;if(!o||!c){return;}const sync=()=>c.set({analytics:o.analytics===true});c.open=()=>o.showDrawer();for(const e of [\"osano-cm-initialized\",\"osano-cm-consent-saved\",\"osano-cm-consent-changed\"]){o.addEventListener(e,sync);}sync();})();";
38
+ /**
39
+ * Osano's loader, synchronous as its install guide requires, then the
40
+ * bridge. The IDs are path segments, so each is encoded.
41
+ */
42
+ export declare const osanoHead: (options: OsanoOptions) => HeadScript[];
@@ -0,0 +1,110 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * The configured consent adapter, as its factory returned it. Anything that
4
+ * isn't one (`true`, a list, an unknown `kind`) fails with the adapter hint;
5
+ * an adapter's own option errors keep their messages.
6
+ */
7
+ export declare const consentAdapterSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
8
+ kind: z.ZodLiteral<"ethyca">;
9
+ options: z.ZodObject<{
10
+ notice: z.ZodOptional<z.ZodString>;
11
+ privacyCenter: z.ZodURL;
12
+ propertyId: z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strict>;
14
+ requiredSecrets: z.ZodArray<z.ZodString>;
15
+ runtimeDeps: z.ZodArray<z.ZodString>;
16
+ }, z.core.$strict>, z.ZodObject<{
17
+ kind: z.ZodLiteral<"native">;
18
+ options: z.ZodObject<{
19
+ policy: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strict>;
21
+ requiredSecrets: z.ZodArray<z.ZodString>;
22
+ runtimeDeps: z.ZodArray<z.ZodString>;
23
+ }, z.core.$strict>, z.ZodObject<{
24
+ kind: z.ZodLiteral<"osano">;
25
+ options: z.ZodObject<{
26
+ configId: z.ZodString;
27
+ customerId: z.ZodString;
28
+ }, z.core.$strict>;
29
+ requiredSecrets: z.ZodArray<z.ZodString>;
30
+ runtimeDeps: z.ZodArray<z.ZodString>;
31
+ }, z.core.$strict>], "kind">;
32
+ export type ConsentAdapter = z.output<typeof consentAdapterSchema>;
33
+ /**
34
+ * `blume.config.consent`: the adapter that asks readers before analytics
35
+ * runs. Unset (`null` once resolved) means no consent layer, and analytics
36
+ * runs as it loads.
37
+ */
38
+ export declare const consentConfigSchema: z.ZodPipe<z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
39
+ kind: z.ZodLiteral<"ethyca">;
40
+ options: z.ZodObject<{
41
+ notice: z.ZodOptional<z.ZodString>;
42
+ privacyCenter: z.ZodURL;
43
+ propertyId: z.ZodOptional<z.ZodString>;
44
+ }, z.core.$strict>;
45
+ requiredSecrets: z.ZodArray<z.ZodString>;
46
+ runtimeDeps: z.ZodArray<z.ZodString>;
47
+ }, z.core.$strict>, z.ZodObject<{
48
+ kind: z.ZodLiteral<"native">;
49
+ options: z.ZodObject<{
50
+ policy: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strict>;
52
+ requiredSecrets: z.ZodArray<z.ZodString>;
53
+ runtimeDeps: z.ZodArray<z.ZodString>;
54
+ }, z.core.$strict>, z.ZodObject<{
55
+ kind: z.ZodLiteral<"osano">;
56
+ options: z.ZodObject<{
57
+ configId: z.ZodString;
58
+ customerId: z.ZodString;
59
+ }, z.core.$strict>;
60
+ requiredSecrets: z.ZodArray<z.ZodString>;
61
+ runtimeDeps: z.ZodArray<z.ZodString>;
62
+ }, z.core.$strict>], "kind">>, z.ZodTransform<{
63
+ kind: "ethyca";
64
+ options: {
65
+ privacyCenter: string;
66
+ notice?: string | undefined;
67
+ propertyId?: string | undefined;
68
+ };
69
+ requiredSecrets: string[];
70
+ runtimeDeps: string[];
71
+ } | {
72
+ kind: "native";
73
+ options: {
74
+ policy?: string | undefined;
75
+ };
76
+ requiredSecrets: string[];
77
+ runtimeDeps: string[];
78
+ } | {
79
+ kind: "osano";
80
+ options: {
81
+ configId: string;
82
+ customerId: string;
83
+ };
84
+ requiredSecrets: string[];
85
+ runtimeDeps: string[];
86
+ } | null, {
87
+ kind: "ethyca";
88
+ options: {
89
+ privacyCenter: string;
90
+ notice?: string | undefined;
91
+ propertyId?: string | undefined;
92
+ };
93
+ requiredSecrets: string[];
94
+ runtimeDeps: string[];
95
+ } | {
96
+ kind: "native";
97
+ options: {
98
+ policy?: string | undefined;
99
+ };
100
+ requiredSecrets: string[];
101
+ runtimeDeps: string[];
102
+ } | {
103
+ kind: "osano";
104
+ options: {
105
+ configId: string;
106
+ customerId: string;
107
+ };
108
+ requiredSecrets: string[];
109
+ runtimeDeps: string[];
110
+ } | undefined>>;
@@ -1,3 +1,4 @@
1
+ import type { UIStrings } from "./i18n-ui.ts";
1
2
  import type { ResolvedConfig } from "./schema.ts";
2
3
  import type { PageRecord } from "./types.ts";
3
4
  /** Where the changelog timeline index is served. */
@@ -11,3 +12,10 @@ export declare const CHANGELOG_INDEX_ROUTE = "/changelog";
11
12
  * `/changelog` tab at the index rather than its newest entry.
12
13
  */
13
14
  export declare const hasChangelogIndex: (pages: Pick<PageRecord, "contentType" | "meta">[], config: ResolvedConfig) => boolean;
15
+ /**
16
+ * A locale's UI strings with the index's title and description taken from
17
+ * the `changelog` config where it sets them (a string, or a per-locale map
18
+ * resolved like a header label), so every surface that reads the
19
+ * `changelog` strings (the page, its OG card, its Markdown mirror) agrees.
20
+ */
21
+ export declare const withChangelogIndexText: (config: ResolvedConfig, ui: UIStrings, locale?: string) => UIStrings;
@@ -1,13 +1,18 @@
1
1
  import type { AstroIntegration } from "astro";
2
- import type { AssistantAdapter } from "../ai/ask.ts";
2
+ import type { AssistantAdapter, AssistantGatewayAdapter } from "../ai/ask.ts";
3
3
  import type { ComponentMarkdown } from "../ai/component-markdown.ts";
4
4
  import type { AnalyticsAdapter } from "../analytics/schema.ts";
5
+ import type { CaptchaAdapter } from "../captcha/schema.ts";
6
+ import type { ConsentAdapter } from "../consent/schema.ts";
5
7
  import type { DeploymentInput } from "../deploy/adapters/registry.ts";
6
8
  import type { CodeTheme } from "../markdown/themes.ts";
9
+ import type { RateLimitAdapter } from "../ratelimit/schema.ts";
10
+ import type { PlaygroundOptions } from "../reference/options.ts";
7
11
  import type { ReferenceAdapter } from "../reference/schema.ts";
8
12
  import type { AnySearchAdapter } from "../search/adapters/registry.ts";
9
13
  import type { SourceAdapterInput } from "../sources/registry.ts";
10
14
  import type { FontSlug } from "../theme/fonts.ts";
15
+ import type { FooterSocial } from "./footer.ts";
11
16
  import type { OpenInChatProvider, SidebarDisplay, SidebarItemConfig } from "./schema.ts";
12
17
  import type { StandardSchema } from "./standard-schema.ts";
13
18
  /**
@@ -67,20 +72,72 @@ export type LogoConfig = string | {
67
72
  * dismiss behavior.
68
73
  */
69
74
  export type BannerConfig = string | {
70
- /** The banner message. */
71
- content: string;
75
+ /** The banner message, or a map of locale code to message. */
76
+ content: LocalizableLabel;
72
77
  /** Show a dismiss button; the choice is remembered per visitor. */
73
78
  dismissible?: boolean;
74
- /** Stable key for remembering dismissal; defaults to the content. */
79
+ /**
80
+ * Stable key for remembering dismissal; defaults to the content (the
81
+ * default locale's, for a per-locale map).
82
+ */
75
83
  id?: string;
76
84
  /** An optional call-to-action link. */
77
85
  link?: {
78
86
  /** Link target (internal route or external URL). */
79
87
  href: string;
80
- /** Link text. */
81
- text: string;
88
+ /** Link text, or a map of locale code to text. */
89
+ text: LocalizableLabel;
82
90
  };
83
91
  };
92
+ /** Defaults for hand-written endpoint pages, the ones with `api` frontmatter. */
93
+ export interface ApiConfig {
94
+ /** How requests authenticate, unless a page sets `authMethod`. Defaults to none. */
95
+ auth?: {
96
+ method: "bearer" | "basic" | "key" | "none";
97
+ /** The header an API key goes in. Defaults to `x-api-key`. */
98
+ name?: string;
99
+ };
100
+ /**
101
+ * The Try it panel: `false` hides it, and `{ proxy }` sends requests through
102
+ * a CORS proxy, a URL or `true` for the built-in `/_api-proxy` route (server
103
+ * output only). Defaults to `true`, sending directly.
104
+ */
105
+ playground?: PlaygroundOptions;
106
+ /** The base URL an `api` path joins, like `https://api.acme.com/v1`. */
107
+ server?: string;
108
+ }
109
+ /** A link in the footer's row. */
110
+ export interface FooterLink {
111
+ /** Link target (internal route or external URL). An external href opens in a new tab. */
112
+ href: string;
113
+ /** Link text, or a map of locale code to text. */
114
+ label: LocalizableLabel;
115
+ }
116
+ /**
117
+ * The site footer, below the content on every page: a row of links on one
118
+ * side, and social profile icons on the other.
119
+ */
120
+ export interface FooterConfig {
121
+ /** Links in one row, left to right. */
122
+ links?: FooterLink[];
123
+ /**
124
+ * Social profiles, platform to URL, shown as icons in the order written:
125
+ * `{ github: "https://github.com/acme", x: "https://x.com/acme" }`.
126
+ */
127
+ socials?: Partial<Record<FooterSocial, string>>;
128
+ }
129
+ /**
130
+ * The generated `/changelog` index's heading and description. Each is a
131
+ * string, or a map of locale code to text; the index renders in the default
132
+ * locale. Unset, they're the `changelog` UI strings (`Changelog` in English),
133
+ * which `i18n.ui` translates.
134
+ */
135
+ export interface ChangelogConfig {
136
+ /** The index's description, below its heading and in its meta description. */
137
+ description?: LocalizableLabel;
138
+ /** The index's heading, page title, and OG card title. */
139
+ title?: LocalizableLabel;
140
+ }
84
141
  /**
85
142
  * Where content lives and how it's discovered. `root`/`include`/`exclude` are
86
143
  * zero-config shorthand for a single `filesystem()` source; set `sources` to
@@ -171,7 +228,8 @@ export interface ContentTypeConfig {
171
228
  frontmatter?: Record<string, StandardSchema>;
172
229
  }
173
230
  /**
174
- * A header label, optionally per locale: a plain string, or a map of locale
231
+ * A label, optionally per locale (header tabs and links, the banner, the
232
+ * footer): a plain string, or a map of locale
175
233
  * code to label (`{ en: "Docs", ja: "ドキュメント" }`). The active locale's
176
234
  * entry wins, then the default locale's, then the map's first entry.
177
235
  */
@@ -248,8 +306,8 @@ export interface FeaturedLink {
248
306
  href: string;
249
307
  /** Lucide icon name shown beside the label. */
250
308
  icon?: string;
251
- /** Link label. */
252
- label: string;
309
+ /** Link label, or a map of locale code to label. */
310
+ label: LocalizableLabel;
253
311
  }
254
312
  /**
255
313
  * The sidebar. Omit `items` to generate the sidebar from the content tree;
@@ -270,8 +328,8 @@ export type SidebarConfig = SidebarItemConfig[] | {
270
328
  export interface HeaderAction {
271
329
  /** Link target. An external href opens in a new tab. */
272
330
  href: string;
273
- /** Link label. */
274
- label: string;
331
+ /** Link label, or a map of locale code to label. */
332
+ label: LocalizableLabel;
275
333
  }
276
334
  /** Header, sidebar, tabs, and switcher configuration. */
277
335
  export interface NavigationConfig {
@@ -282,7 +340,7 @@ export interface NavigationConfig {
282
340
  /** Pinned links shown above the generated sidebar sections. */
283
341
  featured?: FeaturedLink[];
284
342
  /**
285
- * The GitHub link in the header. `true` derives it from `github` (the
343
+ * The GitHub link in the footer. `true` derives it from `github` (the
286
344
  * default), `false` hides it, and an absolute URL points it anywhere on
287
345
  * GitHub — an organization, say, when the docs repo itself is private.
288
346
  */
@@ -395,6 +453,16 @@ export interface SearchPopularLink {
395
453
  export type SearchProviderConfig = AnySearchAdapter | false;
396
454
  /** The object form of `search`: the adapter plus adapter-independent settings. */
397
455
  export interface SearchOptions {
456
+ /** What search reports to the configured analytics providers. */
457
+ analytics?: {
458
+ /**
459
+ * Send each query's text with the `search` and `search_select` events.
460
+ * Defaults to `true`. `false` sends the query's length (`queryChars`)
461
+ * instead, and the text rides only the `blume:track` DOM event, for a
462
+ * site to forward on its own terms.
463
+ */
464
+ queries?: boolean;
465
+ };
398
466
  /** Indexing behavior. */
399
467
  indexing?: {
400
468
  /**
@@ -417,7 +485,7 @@ export interface SearchOptions {
417
485
  /**
418
486
  * Search configuration. Pass an adapter directly (`search: algolia({…})`, or
419
487
  * `false`) as shorthand for the object form, which also carries `popular`
420
- * links and `indexing` settings.
488
+ * links and `indexing` and `analytics` settings.
421
489
  */
422
490
  export type SearchConfig = SearchProviderConfig | SearchOptions;
423
491
  /** An empty-state prompt shown before the first question to the assistant. */
@@ -450,6 +518,13 @@ export interface AssistantRetrievalConfig {
450
518
  }
451
519
  /** The chat assistant. */
452
520
  export interface AssistantConfig {
521
+ /**
522
+ * A bot check from `blume/captcha` — `turnstile({ siteKey })` or
523
+ * `hcaptcha({ siteKey })`. The panel sends a token with each question and
524
+ * the generated route verifies it (with `TURNSTILE_SECRET_KEY` or
525
+ * `HCAPTCHA_SECRET_KEY`) before the model runs.
526
+ */
527
+ captcha?: CaptchaAdapter;
453
528
  /**
454
529
  * Origins allowed to call the generated endpoint from another site — a
455
530
  * marketing page that embeds an ask box, for example — or `"*"` to allow
@@ -478,10 +553,10 @@ export interface AssistantConfig {
478
553
  instructions?: string;
479
554
  /**
480
555
  * Which backend answers: the descriptor an adapter factory returns —
481
- * `gateway({ model })`, `openrouter({ model, reasoning })`,
482
- * `llmgateway({ model })`, `inkeep({ model })`, or
483
- * `openaiCompatible({ baseUrl, name, model, apiKeyEnv })`, all exported
484
- * from `blume/ai`. Each adapter owns its model, key env var, reasoning
556
+ * `openai({ model, baseUrl })`, `anthropic({ model })`,
557
+ * `gemini({ model })`, `grok({ model })`, `gateway({ model })`,
558
+ * `openrouter({ model, reasoning })`, `llmgateway({ model })`, or
559
+ * `inkeep({ model })`, all exported from `blume/ai`. Each adapter owns its model, key env var, reasoning
485
560
  * mapping, and `providerOptions` passthrough. Defaults to
486
561
  * `gateway({ model: "openai/gpt-5.5" })`.
487
562
  */
@@ -492,8 +567,23 @@ export interface AssistantConfig {
492
567
  * backend — at the cost of recall. Defaults keep the built-in behavior.
493
568
  */
494
569
  retrieval?: AssistantRetrievalConfig;
570
+ /**
571
+ * A Contact support link in the panel once there's a conversation: a
572
+ * `mailto:` address starts an email with the conversation as its body; a
573
+ * URL or root-relative path gets the conversation's `thread` id, which the
574
+ * assistant's analytics events carry too.
575
+ */
576
+ support?: string;
495
577
  /** Starter prompts shown before the first question. */
496
578
  suggestions?: AssistantSuggestion[];
579
+ /**
580
+ * Let the model search the docs and read whole pages itself, over several
581
+ * steps, instead of answering only from the excerpts retrieved up front.
582
+ * Defaults to `true`, except for `openai()` with a `baseUrl`, whose model
583
+ * may not support tool calling. `inkeep()` does its own retrieval and
584
+ * ignores it.
585
+ */
586
+ tools?: boolean;
497
587
  }
498
588
  /** What the AI Catalog (ARD) manifest carries. */
499
589
  export interface AiCatalogConfig {
@@ -611,6 +701,12 @@ export interface I18nConfig {
611
701
  locales: LocaleConfigInput[];
612
702
  /** `dir`: locale directories (`fr/page.mdx`). `dot`: filename suffix (`page.fr.mdx`). */
613
703
  parser?: "dir" | "dot";
704
+ /**
705
+ * Send a visitor who lands on the default language's home page to the home
706
+ * page in their browser's preferred language, until they pick a language
707
+ * with the switcher. Defaults to `false`.
708
+ */
709
+ routeByBrowserLanguage?: boolean;
614
710
  /**
615
711
  * Per-locale UI string overrides, e.g.
616
712
  * `{ fr: { search: { button: "Rechercher" } } }`.
@@ -705,11 +801,19 @@ type RedirectStatusTemporary = 302 | 307;
705
801
  type RedirectStatus = RedirectStatusPermanent | RedirectStatusTemporary;
706
802
  /** A URL redirect rule. */
707
803
  export interface RedirectConfig {
708
- /** Path to redirect from. */
804
+ /**
805
+ * Path to redirect from: an exact path, or a pattern. `:name` matches one
806
+ * segment, `:name*` as the last segment the rest of the path
807
+ * (`/beta/:slug*`), and `*` ending a segment the rest from there
808
+ * (`/old/article-*`).
809
+ */
709
810
  from: string;
710
811
  /** HTTP status. Defaults to `301`. */
711
812
  status?: RedirectStatus;
712
- /** Path or URL to redirect to. */
813
+ /**
814
+ * Path or URL to redirect to. Reads `from`'s captures as `/:name` (or `*`
815
+ * for what `*` matched): `/v2/:slug*`.
816
+ */
713
817
  to: string;
714
818
  }
715
819
  /**
@@ -785,6 +889,13 @@ export interface AgentsConfig {
785
889
  markdownComponents?: Record<string, ComponentMarkdown>;
786
890
  /** Expose the docs as an MCP server for agents. */
787
891
  mcp?: McpConfig;
892
+ /**
893
+ * Generate the site's own agent skill: a `SKILL.md` named after the site,
894
+ * built from its navigation and page descriptions, served at `/skill.md`
895
+ * and in the skills discovery index. Needs `deployment.site`. A skill in
896
+ * `agents.skills` with the same name replaces it. Defaults to `true`.
897
+ */
898
+ skillMd?: boolean;
788
899
  /**
789
900
  * Publish Agent Skills for discovery: a directory (resolved against the
790
901
  * project root) whose subdirectories each hold a `SKILL.md`. Skills are
@@ -954,6 +1065,23 @@ export interface SoftwareConfig {
954
1065
  }
955
1066
  /** Discoverability: OG images, feeds, sitemap, robots, and structured data. */
956
1067
  export interface SeoConfig {
1068
+ /**
1069
+ * Meta tags written into every page's head, name to content: site
1070
+ * verification tokens, `theme-color`, an app banner, and anything else
1071
+ * Blume has no setting for. `og:*`, `fb:*`, and `article:*` tags render
1072
+ * with `property`, the rest with `name`. A tag Blume writes itself
1073
+ * (`description`, `robots`, `og:image`, `twitter:card`, …) is refused.
1074
+ *
1075
+ * ```ts
1076
+ * seo: {
1077
+ * metatags: {
1078
+ * "google-site-verification": "abc123",
1079
+ * "theme-color": "#0b5fff",
1080
+ * },
1081
+ * }
1082
+ * ```
1083
+ */
1084
+ metatags?: Record<string, string>;
957
1085
  /** Per-page Open Graph image generation. */
958
1086
  og?: OgConfig;
959
1087
  /**
@@ -1071,8 +1199,8 @@ export interface MarkdownConfig {
1071
1199
  export interface ReactConfig {
1072
1200
  /**
1073
1201
  * Auto-memoize React components/hooks with the React Compiler
1074
- * (`babel-plugin-react-compiler`). On by default whenever React is enabled;
1075
- * set to `false` to skip the compiler's babel pass. Defaults to `true`.
1202
+ * (`oxc-transform-react`). On by default whenever React is enabled;
1203
+ * set to `false` to skip the compiler pass. Defaults to `true`.
1076
1204
  */
1077
1205
  compiler?: boolean;
1078
1206
  }
@@ -1104,6 +1232,33 @@ export type ExportConfig = boolean | {
1104
1232
  /** Offer PDF export (via print). Defaults to `false`. */
1105
1233
  pdf?: boolean;
1106
1234
  };
1235
+ /** Page feedback: the rating, and an optional written comment after it. */
1236
+ export interface FeedbackConfig {
1237
+ /**
1238
+ * After the rating, offer a box to say more. The comment is sent as a
1239
+ * `feedback_comment` event through every analytics adapter with an event
1240
+ * API. Defaults to `false`.
1241
+ */
1242
+ comments?: boolean;
1243
+ /** Show the rating. Defaults to `true`. */
1244
+ enabled?: boolean;
1245
+ }
1246
+ /**
1247
+ * "Listen to this page". `true` reads pages aloud with the reader's browser
1248
+ * voices (no key, any host). The object form's `provider` generates neural
1249
+ * audio at build instead, one cached clip per sentence, and falls back to
1250
+ * browser voices where no clips exist. Defaults to `false`.
1251
+ */
1252
+ export type NarrationConfig = boolean | {
1253
+ /** Show the player. Defaults to `true` in the object form. */
1254
+ enabled?: boolean;
1255
+ /**
1256
+ * Generate audio at build with a speech model:
1257
+ * `gateway({ model: "openai/tts-1-hd", voice: "alloy" })` from
1258
+ * `blume/ai`. Without it, pages are read with browser voices.
1259
+ */
1260
+ provider?: AssistantGatewayAdapter;
1261
+ };
1107
1262
  /**
1108
1263
  * Opt-in custom frontmatter keys. Page frontmatter is strictly validated —
1109
1264
  * an unknown key fails the build so typos are caught — and `extend` carves
@@ -1188,6 +1343,8 @@ export interface BlumeConfig {
1188
1343
  agents?: AgentsConfig;
1189
1344
  /** Model-facing features: the assistant and the "Open in chat" action. */
1190
1345
  ai?: AiConfig;
1346
+ /** Defaults for hand-written endpoint pages (`api` frontmatter). */
1347
+ api?: ApiConfig;
1191
1348
  /**
1192
1349
  * Analytics adapters from `blume/analytics`, emitted into `<head>` of every
1193
1350
  * production page in this order: `[posthog({ key }), vercel(),
@@ -1206,6 +1363,19 @@ export interface BlumeConfig {
1206
1363
  * compose: with both set, a page lands at `{deployment.base}/{basePath}/page`.
1207
1364
  */
1208
1365
  basePath?: string;
1366
+ /**
1367
+ * The generated `/changelog` index's title and description, each a string
1368
+ * or a per-locale map. Unset, they're the `changelog` UI strings.
1369
+ */
1370
+ changelog?: ChangelogConfig;
1371
+ /**
1372
+ * Ask readers before analytics runs, with an adapter from `blume/consent`:
1373
+ * `native()` for Blume's own banner, or a hosted consent manager
1374
+ * (`osano({ customerId, configId })`, `ethyca({ privacyCenter })`). Every
1375
+ * `analytics` adapter waits until the reader allows analytics. Unset runs
1376
+ * analytics as it loads.
1377
+ */
1378
+ consent?: ConsentAdapter;
1209
1379
  /** Where content lives and how it's discovered. */
1210
1380
  content?: ContentConfig;
1211
1381
  /**
@@ -1229,8 +1399,17 @@ export interface BlumeConfig {
1229
1399
  examples?: string | ExamplesConfig;
1230
1400
  /** Reader-facing PDF/EPUB export actions. Defaults to `false`. */
1231
1401
  export?: ExportConfig;
1232
- /** Show the per-page "Was this helpful?" widget. Defaults to `true`. */
1233
- feedback?: boolean;
1402
+ /**
1403
+ * The "Was this page helpful?" rating at the foot of each page. On by
1404
+ * default; `false` hides it. `{ comments: true }` also asks for a written
1405
+ * comment after the rating, sent through your analytics adapters.
1406
+ */
1407
+ feedback?: boolean | FeedbackConfig;
1408
+ /**
1409
+ * The site footer: social profile icons and up to four link columns. Unset,
1410
+ * the site has no footer.
1411
+ */
1412
+ footer?: FooterConfig;
1234
1413
  /** Opt-in custom frontmatter keys, validated by schemas you supply. */
1235
1414
  frontmatter?: FrontmatterConfig;
1236
1415
  /** Source repository (Edit-this-page links and the header repo link). */
@@ -1247,8 +1426,17 @@ export interface BlumeConfig {
1247
1426
  logo?: LogoConfig;
1248
1427
  /** Markdown / MDX rendering behavior. */
1249
1428
  markdown?: MarkdownConfig;
1429
+ /** "Listen to this page" narration. Defaults to `false`. */
1430
+ narration?: NarrationConfig;
1250
1431
  /** Header, sidebar, tabs, and switchers. */
1251
1432
  navigation?: NavigationConfig;
1433
+ /**
1434
+ * Limit how often one reader (by IP address) can call the server routes —
1435
+ * the assistant, the API playground proxy, server-side search — with an
1436
+ * adapter from `blume/ratelimit`: `memory()` (the default, 30 requests per
1437
+ * 10 minutes), `upstash()`, or `cloudflare()`. `false` turns it off.
1438
+ */
1439
+ rateLimit?: false | RateLimitAdapter;
1252
1440
  /** React island behavior (compiler auto-memoization). */
1253
1441
  react?: ReactConfig;
1254
1442
  /** URL redirect rules. */
@@ -1269,6 +1457,12 @@ export interface BlumeConfig {
1269
1457
  title?: string;
1270
1458
  /** On-page table of contents. Defaults to on (H2–H3). */
1271
1459
  toc?: TocConfig;
1460
+ /**
1461
+ * Content variables: `{{name}}` in a page reads the value, in prose, code,
1462
+ * and links alike. Names take letters, digits, `_`, and `-`; an undefined
1463
+ * name in prose fails the build. Defaults to none.
1464
+ */
1465
+ variables?: Record<string, string>;
1272
1466
  /** Docs versioning (opt-in frozen snapshots with a version switcher). */
1273
1467
  versions?: VersionsConfig;
1274
1468
  }