blume 2.0.2 → 2.1.0

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 (601) hide show
  1. package/AGENTS.md +1 -0
  2. package/CHANGELOG.md +113 -0
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-6k4ftwze.js → chunk-0gz36akr.js} +18 -2
  5. package/dist/cli/{chunk-6k4ftwze.js.map → chunk-0gz36akr.js.map} +3 -3
  6. package/dist/cli/{chunk-zp79m0ts.js → chunk-1n228xqb.js} +2 -2
  7. package/dist/cli/{chunk-ddndchfr.js → chunk-2f3ndkpw.js} +57 -29
  8. package/dist/cli/chunk-2f3ndkpw.js.map +14 -0
  9. package/dist/cli/{chunk-fsmrqk8a.js → chunk-2f7n4qzt.js} +8 -2
  10. package/dist/cli/{chunk-fsmrqk8a.js.map → chunk-2f7n4qzt.js.map} +3 -3
  11. package/dist/cli/{chunk-ppzjqwx2.js → chunk-2n4ps1b3.js} +17 -18
  12. package/dist/cli/{chunk-ppzjqwx2.js.map → chunk-2n4ps1b3.js.map} +3 -3
  13. package/dist/cli/{chunk-5r8g91qn.js → chunk-43zcf4gz.js} +398 -159
  14. package/dist/cli/chunk-43zcf4gz.js.map +36 -0
  15. package/dist/cli/chunk-4ejxbzee.js +39 -0
  16. package/dist/cli/chunk-4ejxbzee.js.map +10 -0
  17. package/dist/cli/{chunk-hr8ne106.js → chunk-4h8z9vv5.js} +296 -77
  18. package/dist/cli/chunk-4h8z9vv5.js.map +16 -0
  19. package/dist/cli/{chunk-k7pj68a8.js → chunk-5cg2rzgf.js} +18 -16
  20. package/dist/cli/{chunk-k7pj68a8.js.map → chunk-5cg2rzgf.js.map} +2 -2
  21. package/dist/cli/{chunk-h2ez8dzb.js → chunk-5ffywsmb.js} +4 -4
  22. package/dist/cli/{chunk-g698a744.js → chunk-5wj2qwn2.js} +5 -5
  23. package/dist/cli/chunk-6bm0xpgd.js +18 -0
  24. package/dist/cli/chunk-6bm0xpgd.js.map +10 -0
  25. package/dist/cli/{chunk-3yce002v.js → chunk-713mngdq.js} +15 -8
  26. package/dist/cli/chunk-713mngdq.js.map +14 -0
  27. package/dist/cli/{chunk-91ws1n6j.js → chunk-9geymqns.js} +17 -15
  28. package/dist/cli/{chunk-91ws1n6j.js.map → chunk-9geymqns.js.map} +2 -2
  29. package/dist/cli/{chunk-6dtt0zfn.js → chunk-9xr4dgee.js} +27 -18
  30. package/dist/cli/chunk-9xr4dgee.js.map +10 -0
  31. package/dist/cli/{chunk-sqw4ekg1.js → chunk-amrb6hgh.js} +2 -2
  32. package/dist/cli/chunk-cm89scdv.js +443 -0
  33. package/dist/cli/chunk-cm89scdv.js.map +11 -0
  34. package/dist/cli/{chunk-wdrt2k2v.js → chunk-cmtcnh9f.js} +90 -26
  35. package/dist/cli/chunk-cmtcnh9f.js.map +10 -0
  36. package/dist/cli/chunk-cy5bm0j0.js +104 -0
  37. package/dist/cli/chunk-cy5bm0j0.js.map +11 -0
  38. package/dist/cli/{chunk-7mbqtmgb.js → chunk-e7vvk5ya.js} +21 -12
  39. package/dist/cli/chunk-e7vvk5ya.js.map +10 -0
  40. package/dist/cli/{chunk-qkb5a8sa.js → chunk-g2z9x01v.js} +6 -98
  41. package/dist/cli/chunk-g2z9x01v.js.map +10 -0
  42. package/dist/cli/{chunk-273ygyr4.js → chunk-ga0pf4aj.js} +7 -7
  43. package/dist/cli/{chunk-273ygyr4.js.map → chunk-ga0pf4aj.js.map} +3 -3
  44. package/dist/cli/{chunk-h7k3nq3v.js → chunk-gp84za0h.js} +2 -2
  45. package/dist/cli/{chunk-hqp2ajnh.js → chunk-h2a48yhd.js} +195 -73
  46. package/dist/cli/chunk-h2a48yhd.js.map +36 -0
  47. package/dist/cli/{chunk-pbg5a4s3.js → chunk-jnwj5kjj.js} +71 -47
  48. package/dist/cli/chunk-jnwj5kjj.js.map +19 -0
  49. package/dist/cli/chunk-kwrg63tm.js +31 -0
  50. package/dist/cli/chunk-kwrg63tm.js.map +10 -0
  51. package/dist/cli/{chunk-8g8ytmgx.js → chunk-nd1821sk.js} +21 -19
  52. package/dist/cli/{chunk-8g8ytmgx.js.map → chunk-nd1821sk.js.map} +2 -2
  53. package/dist/cli/{chunk-w4bxdvsa.js → chunk-ntv4qrt7.js} +17 -15
  54. package/dist/cli/{chunk-w4bxdvsa.js.map → chunk-ntv4qrt7.js.map} +2 -2
  55. package/dist/cli/{chunk-bfwp9vp6.js → chunk-p804f3pe.js} +7 -7
  56. package/dist/cli/{chunk-4e9b9ra6.js → chunk-py62fewh.js} +6 -6
  57. package/dist/cli/{chunk-4e9b9ra6.js.map → chunk-py62fewh.js.map} +1 -1
  58. package/dist/cli/chunk-q3wxxq39.js +126 -0
  59. package/dist/cli/chunk-q3wxxq39.js.map +11 -0
  60. package/dist/cli/{chunk-j85scx15.js → chunk-rekqz4qg.js} +142 -46
  61. package/dist/cli/chunk-rekqz4qg.js.map +10 -0
  62. package/dist/cli/{chunk-00gs3wqs.js → chunk-ta27feev.js} +1 -1
  63. package/dist/cli/{chunk-v6ya5kcb.js → chunk-xkz5xbtv.js} +4031 -1132
  64. package/dist/cli/chunk-xkz5xbtv.js.map +213 -0
  65. package/dist/cli/{chunk-bbnwccaz.js → chunk-y4ykbark.js} +2 -2
  66. package/dist/cli/{chunk-n1yg3tj3.js → chunk-y5h4r2y0.js} +6 -6
  67. package/dist/cli/{chunk-n1yg3tj3.js.map → chunk-y5h4r2y0.js.map} +3 -3
  68. package/dist/cli/{chunk-nfcyttvj.js → chunk-yj17vs39.js} +9 -9
  69. package/dist/cli/{chunk-nfcyttvj.js.map → chunk-yj17vs39.js.map} +1 -1
  70. package/dist/cli/{chunk-7vtckvaw.js → chunk-yxmk4pec.js} +16 -14
  71. package/dist/cli/{chunk-7vtckvaw.js.map → chunk-yxmk4pec.js.map} +2 -2
  72. package/dist/cli/{chunk-gs7r695n.js → chunk-zccbjcj0.js} +22 -8
  73. package/dist/cli/{chunk-gs7r695n.js.map → chunk-zccbjcj0.js.map} +3 -3
  74. package/dist/cli/{chunk-xh43dwgw.js → chunk-zf748avv.js} +415 -225
  75. package/dist/cli/chunk-zf748avv.js.map +37 -0
  76. package/dist/cli/{chunk-d1v5rhy0.js → chunk-zhvd6adm.js} +16 -14
  77. package/dist/cli/{chunk-d1v5rhy0.js.map → chunk-zhvd6adm.js.map} +2 -2
  78. package/dist/cli/index.js +28 -20
  79. package/dist/cli/index.js.map +5 -5
  80. package/dist/types/ai/agent-surface.d.ts +8 -7
  81. package/dist/types/ai/ai-catalog.d.ts +7 -0
  82. package/dist/types/ai/ask-context.d.ts +22 -0
  83. package/dist/types/ai/ask.d.ts +271 -58
  84. package/dist/types/ai/index.d.ts +2 -2
  85. package/dist/types/ai/link-headers.d.ts +8 -1
  86. package/dist/types/ai/openapi-components.d.ts +5 -2
  87. package/dist/types/ai/relative-links.d.ts +9 -7
  88. package/dist/types/ai/site-skill.d.ts +26 -0
  89. package/dist/types/ai/skills.d.ts +20 -1
  90. package/dist/types/ai/tar.d.ts +1 -3
  91. package/dist/types/analytics/index.d.ts +2 -0
  92. package/dist/types/analytics/one-dollar-stats.d.ts +48 -0
  93. package/dist/types/analytics/schema.d.ts +14 -0
  94. package/dist/types/astro/integration.d.ts +11 -2
  95. package/dist/types/captcha/hcaptcha.d.ts +27 -0
  96. package/dist/types/captcha/index.d.ts +28 -0
  97. package/dist/types/captcha/schema.d.ts +29 -0
  98. package/dist/types/captcha/turnstile.d.ts +28 -0
  99. package/dist/types/components/content/api-field.d.ts +59 -0
  100. package/dist/types/components/content/api-page.d.ts +95 -0
  101. package/dist/types/components/layout/nav-utils.d.ts +26 -0
  102. package/dist/types/components/openapi/helpers.d.ts +137 -0
  103. package/dist/types/components/openapi/security.d.ts +85 -0
  104. package/dist/types/consent/ethyca.d.ts +48 -0
  105. package/dist/types/consent/index.d.ts +37 -0
  106. package/dist/types/consent/native.d.ts +28 -0
  107. package/dist/types/consent/osano.d.ts +42 -0
  108. package/dist/types/consent/schema.d.ts +110 -0
  109. package/dist/types/core/base-path.d.ts +21 -7
  110. package/dist/types/core/config-input.d.ts +196 -27
  111. package/dist/types/core/data.d.ts +49 -4
  112. package/dist/types/core/directive-diagnostics.d.ts +12 -0
  113. package/dist/types/core/footer.d.ts +8 -0
  114. package/dist/types/core/heading-markers.d.ts +5 -7
  115. package/dist/types/core/i18n-ui.d.ts +86 -0
  116. package/dist/types/core/i18n.d.ts +2 -0
  117. package/dist/types/core/includes.d.ts +8 -2
  118. package/dist/types/core/last-modified.d.ts +10 -0
  119. package/dist/types/core/localizable.d.ts +7 -0
  120. package/dist/types/core/meta.d.ts +8 -0
  121. package/dist/types/core/page-modes.d.ts +29 -0
  122. package/dist/types/core/redirect-patterns.d.ts +144 -0
  123. package/dist/types/core/related.d.ts +40 -0
  124. package/dist/types/core/schema.d.ts +558 -56
  125. package/dist/types/core/sources/lower.d.ts +29 -16
  126. package/dist/types/core/sources/normalize.d.ts +13 -1
  127. package/dist/types/core/sources/read.d.ts +5 -0
  128. package/dist/types/core/sources/watch.d.ts +12 -5
  129. package/dist/types/core/standard-schema.d.ts +5 -0
  130. package/dist/types/core/types.d.ts +1 -1
  131. package/dist/types/core/variables.d.ts +42 -0
  132. package/dist/types/deploy/artifacts.d.ts +6 -4
  133. package/dist/types/deploy/headers.d.ts +5 -0
  134. package/dist/types/deploy/node-headers.d.ts +13 -2
  135. package/dist/types/deploy/platforms/cloudflare.d.ts +5 -0
  136. package/dist/types/deploy/platforms/netlify.d.ts +7 -0
  137. package/dist/types/deploy/platforms/types.d.ts +8 -0
  138. package/dist/types/deploy/platforms/vercel.d.ts +6 -0
  139. package/dist/types/deploy/redirects.d.ts +61 -22
  140. package/dist/types/deploy/vercel-negotiation.d.ts +9 -0
  141. package/dist/types/markdown/code-title.d.ts +17 -0
  142. package/dist/types/markdown/directives.d.ts +62 -0
  143. package/dist/types/markdown/features.d.ts +24 -2
  144. package/dist/types/markdown/mdast.d.ts +63 -0
  145. package/dist/types/narration/build.d.ts +70 -0
  146. package/dist/types/narration/provider.d.ts +26 -0
  147. package/dist/types/narration/script.d.ts +154 -0
  148. package/dist/types/openapi/asyncapi.d.ts +4 -2
  149. package/dist/types/openapi/model.d.ts +12 -6
  150. package/dist/types/openapi/overlay.d.ts +54 -0
  151. package/dist/types/openapi/parse.d.ts +13 -0
  152. package/dist/types/openapi/references.d.ts +14 -4
  153. package/dist/types/ratelimit/cloudflare.d.ts +39 -0
  154. package/dist/types/ratelimit/index.d.ts +27 -0
  155. package/dist/types/ratelimit/memory.d.ts +36 -0
  156. package/dist/types/ratelimit/schema.d.ts +111 -0
  157. package/dist/types/ratelimit/upstash.d.ts +21 -0
  158. package/dist/types/ratelimit/wrangler.d.ts +23 -0
  159. package/dist/types/reference/asyncapi.d.ts +10 -10
  160. package/dist/types/reference/graphql.d.ts +13 -10
  161. package/dist/types/reference/openapi.d.ts +33 -12
  162. package/dist/types/reference/options.d.ts +45 -5
  163. package/dist/types/reference/scalar.d.ts +13 -0
  164. package/dist/types/reference/schema.d.ts +60 -36
  165. package/dist/types/search/documents.d.ts +12 -1
  166. package/dist/types/search/orama-index.d.ts +4 -0
  167. package/dist/types/seo/metatags.d.ts +20 -0
  168. package/docs/02-deployment.mdx +44 -6
  169. package/docs/03-upgrading.mdx +4 -4
  170. package/docs/04-migrating.mdx +1 -1
  171. package/docs/08-faq.mdx +1 -1
  172. package/docs/advanced/changelog.mdx +2 -2
  173. package/docs/advanced/custom-pages.mdx +3 -3
  174. package/docs/advanced/skills.mdx +14 -0
  175. package/docs/cli/audit.mdx +38 -2
  176. package/docs/cli/evals.mdx +3 -3
  177. package/docs/cli/index.mdx +1 -0
  178. package/docs/cli/translate.mdx +3 -3
  179. package/docs/cli/version.mdx +1 -1
  180. package/docs/configuration/analytics.mdx +22 -1
  181. package/docs/configuration/assistant.mdx +188 -36
  182. package/docs/configuration/consent.mdx +100 -0
  183. package/docs/configuration/customization.mdx +6 -4
  184. package/docs/configuration/index.mdx +63 -5
  185. package/docs/configuration/meta.ts +3 -0
  186. package/docs/configuration/narration.mdx +119 -0
  187. package/docs/configuration/rate-limiting.mdx +69 -0
  188. package/docs/configuration/search.mdx +30 -2
  189. package/docs/configuration/theming.mdx +3 -1
  190. package/docs/content/components.mdx +107 -1
  191. package/docs/content/frontmatter.mdx +77 -1
  192. package/docs/content/i18n.mdx +40 -3
  193. package/docs/content/includes.mdx +16 -0
  194. package/docs/content/index.mdx +4 -2
  195. package/docs/content/islands.mdx +1 -1
  196. package/docs/content/meta.mdx +4 -1
  197. package/docs/content/meta.ts +1 -0
  198. package/docs/content/navigation.mdx +28 -6
  199. package/docs/content/sources/contentful.mdx +32 -0
  200. package/docs/content/sources/custom.mdx +39 -0
  201. package/docs/content/sources/github-releases.mdx +31 -0
  202. package/docs/content/sources/index.mdx +91 -0
  203. package/docs/content/sources/meta.ts +16 -0
  204. package/docs/content/sources/notion.mdx +32 -0
  205. package/docs/content/sources/obsidian.mdx +37 -0
  206. package/docs/content/sources/payload.mdx +30 -0
  207. package/docs/content/sources/remote-mdx.mdx +40 -0
  208. package/docs/content/sources/sanity.mdx +29 -0
  209. package/docs/content/sources/strapi.mdx +31 -0
  210. package/docs/content/syntax.mdx +81 -2
  211. package/docs/content/variables.mdx +41 -0
  212. package/docs/content/versioning.mdx +1 -1
  213. package/docs/discoverability/agent-discovery.mdx +30 -3
  214. package/docs/discoverability/index.mdx +3 -2
  215. package/docs/discoverability/llms-txt.mdx +1 -1
  216. package/docs/discoverability/markdown.mdx +2 -2
  217. package/docs/discoverability/metadata.mdx +17 -0
  218. package/docs/discoverability/open-graph.mdx +5 -3
  219. package/docs/discoverability/rss.mdx +1 -1
  220. package/docs/references/api-pages.mdx +74 -0
  221. package/docs/references/asyncapi.mdx +2 -2
  222. package/docs/references/graphql.mdx +3 -3
  223. package/docs/references/meta.ts +1 -1
  224. package/docs/references/openapi.mdx +106 -5
  225. package/docs/references/scalar.mdx +3 -1
  226. package/package.json +36 -1
  227. package/skills/blume/SKILL.md +3 -0
  228. package/skills/blume-migrate/SKILL.md +5 -5
  229. package/skills/blume-migrate/references/docusaurus.md +3 -3
  230. package/skills/blume-migrate/references/fumadocs.md +1 -1
  231. package/skills/blume-migrate/references/mintlify.md +37 -19
  232. package/skills/blume-migrate/references/nextra.md +3 -3
  233. package/skills/blume-migrate/references/starlight.md +2 -1
  234. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +67 -16
  235. package/skills/blume-write-skill/SKILL.md +82 -0
  236. package/src/ai/agent-readability.ts +4 -3
  237. package/src/ai/agent-surface.ts +9 -7
  238. package/src/ai/ai-catalog.ts +12 -5
  239. package/src/ai/api/handlers.ts +2 -2
  240. package/src/ai/api/spec.ts +2 -2
  241. package/src/ai/api-catalog.ts +6 -2
  242. package/src/ai/ask-context.ts +73 -20
  243. package/src/ai/ask-data.ts +6 -0
  244. package/src/ai/ask-tools.ts +142 -0
  245. package/src/ai/ask.ts +354 -76
  246. package/src/ai/changelog-markdown.ts +2 -2
  247. package/src/ai/component-markdown.ts +75 -0
  248. package/src/ai/cors.ts +2 -0
  249. package/src/ai/index.ts +12 -0
  250. package/src/ai/link-headers.ts +14 -5
  251. package/src/ai/llms.ts +24 -9
  252. package/src/ai/markdown.ts +2 -1
  253. package/src/ai/mcp/data.ts +6 -0
  254. package/src/ai/mcp/discovery.ts +2 -2
  255. package/src/ai/mcp/query.ts +2 -2
  256. package/src/ai/mcp/server.ts +2 -2
  257. package/src/ai/openapi-components.ts +31 -9
  258. package/src/ai/relative-links.ts +42 -26
  259. package/src/ai/serializers.ts +2 -1
  260. package/src/ai/site-skill.ts +274 -0
  261. package/src/ai/skills.ts +49 -3
  262. package/src/ai/tar.ts +139 -12
  263. package/src/ai/write-skill.ts +97 -0
  264. package/src/analytics/head.ts +4 -0
  265. package/src/analytics/index.ts +5 -0
  266. package/src/analytics/one-dollar-stats.ts +86 -0
  267. package/src/analytics/schema.ts +2 -0
  268. package/src/astro/generate.ts +133 -19
  269. package/src/astro/include-hmr.ts +31 -12
  270. package/src/astro/include-refresh.ts +19 -8
  271. package/src/astro/index.ts +1 -0
  272. package/src/astro/integration.ts +143 -14
  273. package/src/astro/module-types.ts +6 -0
  274. package/src/astro/runtime-modules.ts +28 -13
  275. package/src/astro/templates.ts +364 -67
  276. package/src/astro/variables.ts +31 -0
  277. package/src/audit/catalog.ts +19 -0
  278. package/src/audit/checks/contrast.ts +183 -0
  279. package/src/audit/checks/i18n.ts +2 -3
  280. package/src/audit/checks/indexability.ts +2 -3
  281. package/src/audit/checks/links.ts +13 -13
  282. package/src/audit/checks/sitemap.ts +2 -3
  283. package/src/audit/graph.ts +3 -1
  284. package/src/audit/redirects.ts +46 -15
  285. package/src/audit/run.ts +14 -9
  286. package/src/audit/snapshot.ts +5 -0
  287. package/src/audit/types.ts +2 -1
  288. package/src/blume-modules.d.ts +7 -0
  289. package/src/captcha/client.ts +152 -0
  290. package/src/captcha/hcaptcha.ts +36 -0
  291. package/src/captcha/index.ts +28 -0
  292. package/src/captcha/schema.ts +32 -0
  293. package/src/captcha/turnstile.ts +38 -0
  294. package/src/captcha/verify.ts +71 -0
  295. package/src/cli/args.ts +32 -0
  296. package/src/cli/command-meta.ts +5 -0
  297. package/src/cli/commands/audit.ts +4 -1
  298. package/src/cli/commands/doctor.ts +25 -17
  299. package/src/cli/commands/eval.ts +19 -11
  300. package/src/cli/commands/skill.ts +96 -0
  301. package/src/cli/commands/translate.ts +9 -12
  302. package/src/cli/commands/validate.ts +3 -1
  303. package/src/cli/dev-lock.ts +157 -37
  304. package/src/cli/index.ts +5 -0
  305. package/src/cli/report-format.ts +11 -6
  306. package/src/cli/required-secrets.ts +71 -29
  307. package/src/components/BlumePage.astro +2 -0
  308. package/src/components/colors.ts +19 -0
  309. package/src/components/content/ApiEndpoint.astro +18 -0
  310. package/src/components/content/ApiField.astro +79 -0
  311. package/src/components/content/ApiPlayground.astro +62 -0
  312. package/src/components/content/ApiRail.astro +19 -0
  313. package/src/components/content/Badge.astro +5 -3
  314. package/src/components/content/Color.astro +1 -0
  315. package/src/components/content/Component.astro +2 -2
  316. package/src/components/content/FileTree.astro +1 -0
  317. package/src/components/content/GithubInfo.astro +1 -0
  318. package/src/components/content/Panel.astro +1 -0
  319. package/src/components/content/ParamField.astro +25 -0
  320. package/src/components/content/RequestExample.astro +17 -0
  321. package/src/components/content/ResponseExample.astro +17 -0
  322. package/src/components/content/ResponseField.astro +32 -0
  323. package/src/components/content/Step.astro +1 -0
  324. package/src/components/content/Tab.astro +0 -1
  325. package/src/components/content/Tabs.astro +4 -0
  326. package/src/components/content/Tile.astro +1 -0
  327. package/src/components/content/Tooltip.astro +1 -0
  328. package/src/components/content/Tree.astro +1 -0
  329. package/src/components/content/TypeTable.astro +4 -1
  330. package/src/components/content/View.astro +21 -0
  331. package/src/components/content/ViewSwitcher.astro +168 -0
  332. package/src/components/content/api-field.ts +100 -0
  333. package/src/components/content/api-page.ts +224 -0
  334. package/src/components/content/badge-color.ts +5 -2
  335. package/src/components/content/base-href.ts +13 -36
  336. package/src/components/content/view-switcher.ts +71 -0
  337. package/src/components/index.ts +2 -0
  338. package/src/components/islands/Assistant.astro +10 -1
  339. package/src/components/islands/assistant.tsx +125 -18
  340. package/src/components/islands/base-path.ts +47 -10
  341. package/src/components/islands/code-question.ts +62 -0
  342. package/src/components/islands/hooks.ts +145 -40
  343. package/src/components/islands/support-link.ts +68 -0
  344. package/src/components/islands/webmcp.ts +4 -2
  345. package/src/components/layout/Analytics.astro +11 -2
  346. package/src/components/layout/Banner.astro +14 -10
  347. package/src/components/layout/Breadcrumbs.astro +11 -4
  348. package/src/components/layout/ConsentBanner.astro +62 -0
  349. package/src/components/layout/ConsentHead.astro +38 -0
  350. package/src/components/layout/Directory.astro +94 -0
  351. package/src/components/layout/DiscoveryLinks.astro +9 -5
  352. package/src/components/layout/DrawerSwitchers.astro +51 -0
  353. package/src/components/layout/Empty.astro +2 -2
  354. package/src/components/layout/Header.astro +124 -82
  355. package/src/components/layout/LanguageSwitcher.astro +50 -17
  356. package/src/components/layout/NarrationPlayer.astro +1085 -0
  357. package/src/components/layout/NavSelector.astro +35 -9
  358. package/src/components/layout/NavTabMenu.astro +3 -3
  359. package/src/components/layout/NavTree.astro +16 -6
  360. package/src/components/layout/PageActions.astro +4 -3
  361. package/src/components/layout/PageFeedback.astro +54 -49
  362. package/src/components/layout/PageLayout.astro +78 -9
  363. package/src/components/layout/Pagination.astro +3 -3
  364. package/src/components/layout/ReferenceLayout.astro +17 -6
  365. package/src/components/layout/RelatedPages.astro +42 -0
  366. package/src/components/layout/RootLayout.astro +313 -50
  367. package/src/components/layout/Search.astro +64 -30
  368. package/src/components/layout/SiteFooter.astro +124 -0
  369. package/src/components/layout/SiteMetatags.astro +16 -0
  370. package/src/components/layout/VersionBanner.astro +2 -2
  371. package/src/components/layout/analytics-client.ts +12 -0
  372. package/src/components/layout/consent/native.ts +79 -0
  373. package/src/components/layout/consent/types.ts +37 -0
  374. package/src/components/layout/footer-links.ts +53 -0
  375. package/src/components/layout/footer-socials.ts +87 -0
  376. package/src/components/layout/locale-redirect.ts +107 -0
  377. package/src/components/layout/nav-utils.ts +83 -0
  378. package/src/components/layout/page-feedback.ts +96 -0
  379. package/src/components/layout/search/analytics.ts +98 -0
  380. package/src/components/layout/search/flexsearch.ts +17 -5
  381. package/src/components/layout/search/orama-cloud.ts +26 -14
  382. package/src/components/layout/search/types.ts +20 -0
  383. package/src/components/layout/search/typesense.ts +5 -1
  384. package/src/components/layout/toc-active.ts +41 -0
  385. package/src/components/layout/toc-element.ts +8 -14
  386. package/src/components/openapi/ApiTagOperations.astro +2 -2
  387. package/src/components/openapi/AsyncApiOperation.astro +7 -4
  388. package/src/components/openapi/GraphqlChip.astro +2 -2
  389. package/src/components/openapi/Operation.astro +163 -13
  390. package/src/components/openapi/Playground.astro +4 -4
  391. package/src/components/openapi/RequestBody.astro +6 -4
  392. package/src/components/openapi/RequestPanel.astro +63 -8
  393. package/src/components/openapi/Responses.astro +6 -4
  394. package/src/components/openapi/SchemaTable.astro +7 -0
  395. package/src/components/openapi/async-snippets.ts +4 -4
  396. package/src/components/openapi/async.ts +38 -6
  397. package/src/components/openapi/code-samples.ts +97 -0
  398. package/src/components/openapi/helpers.ts +19 -9
  399. package/src/components/openapi/message-composer.ts +6 -1
  400. package/src/components/openapi/message.ts +17 -2
  401. package/src/components/openapi/operation-model.ts +81 -11
  402. package/src/components/openapi/panel.ts +4 -2
  403. package/src/components/openapi/param-style.ts +181 -0
  404. package/src/components/openapi/playground-client.ts +73 -16
  405. package/src/components/openapi/request.ts +190 -26
  406. package/src/components/openapi/schema-tree.ts +30 -24
  407. package/src/components/openapi/security.ts +6 -3
  408. package/src/components/openapi/snippets.ts +953 -13
  409. package/src/components/openapi/ws-client.ts +18 -2
  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/base-path.ts +62 -16
  421. package/src/core/builtin-tags.ts +5 -0
  422. package/src/core/client-address.ts +19 -0
  423. package/src/core/config-input.ts +203 -27
  424. package/src/core/data.ts +44 -4
  425. package/src/core/diagnostics.ts +5 -2
  426. package/src/core/directive-diagnostics.ts +99 -0
  427. package/src/core/footer.ts +26 -0
  428. package/src/core/frontmatter.ts +21 -18
  429. package/src/core/graph.ts +39 -36
  430. package/src/core/heading-markers.ts +5 -18
  431. package/src/core/i18n-ui.ts +82 -2
  432. package/src/core/i18n.ts +31 -3
  433. package/src/core/includes.ts +20 -3
  434. package/src/core/last-modified.ts +25 -3
  435. package/src/core/links.ts +16 -2
  436. package/src/core/locale-links.ts +5 -1
  437. package/src/core/localizable.ts +26 -0
  438. package/src/core/meta.ts +33 -19
  439. package/src/core/navigation.ts +71 -20
  440. package/src/core/page-modes.ts +56 -0
  441. package/src/core/project-graph.ts +138 -10
  442. package/src/core/redirect-patterns.ts +491 -0
  443. package/src/core/related.ts +131 -0
  444. package/src/core/schema.ts +342 -68
  445. package/src/core/sources/contentful-rich-text.ts +27 -20
  446. package/src/core/sources/filesystem.ts +20 -2
  447. package/src/core/sources/github-releases.ts +25 -6
  448. package/src/core/sources/lexical.ts +23 -18
  449. package/src/core/sources/lower.ts +201 -34
  450. package/src/core/sources/mdx-remote.ts +51 -16
  451. package/src/core/sources/normalize.ts +327 -91
  452. package/src/core/sources/notion.ts +52 -25
  453. package/src/core/sources/obsidian.ts +23 -6
  454. package/src/core/sources/portable-text.ts +38 -21
  455. package/src/core/sources/read.ts +8 -3
  456. package/src/core/sources/strapi-blocks.ts +20 -16
  457. package/src/core/sources/watch.ts +20 -7
  458. package/src/core/standard-schema.ts +10 -6
  459. package/src/core/types.ts +1 -1
  460. package/src/core/ui-packs/ar.ts +43 -0
  461. package/src/core/ui-packs/bg.ts +45 -0
  462. package/src/core/ui-packs/bn.ts +43 -0
  463. package/src/core/ui-packs/ca.ts +46 -0
  464. package/src/core/ui-packs/cs.ts +44 -0
  465. package/src/core/ui-packs/da.ts +45 -0
  466. package/src/core/ui-packs/de.ts +46 -0
  467. package/src/core/ui-packs/el.ts +45 -0
  468. package/src/core/ui-packs/es.ts +46 -0
  469. package/src/core/ui-packs/fa.ts +45 -0
  470. package/src/core/ui-packs/fi.ts +45 -0
  471. package/src/core/ui-packs/fr.ts +46 -0
  472. package/src/core/ui-packs/he.ts +43 -0
  473. package/src/core/ui-packs/hi.ts +44 -0
  474. package/src/core/ui-packs/hr.ts +45 -0
  475. package/src/core/ui-packs/hu.ts +44 -0
  476. package/src/core/ui-packs/id.ts +45 -0
  477. package/src/core/ui-packs/it.ts +45 -0
  478. package/src/core/ui-packs/ja.ts +45 -0
  479. package/src/core/ui-packs/ko.ts +44 -0
  480. package/src/core/ui-packs/nl.ts +46 -0
  481. package/src/core/ui-packs/no.ts +44 -0
  482. package/src/core/ui-packs/pl.ts +45 -0
  483. package/src/core/ui-packs/pt-br.ts +46 -0
  484. package/src/core/ui-packs/pt.ts +45 -0
  485. package/src/core/ui-packs/ro.ts +45 -0
  486. package/src/core/ui-packs/ru.ts +45 -0
  487. package/src/core/ui-packs/sk.ts +44 -0
  488. package/src/core/ui-packs/sr.ts +45 -0
  489. package/src/core/ui-packs/sv.ts +44 -0
  490. package/src/core/ui-packs/th.ts +43 -0
  491. package/src/core/ui-packs/tr.ts +45 -0
  492. package/src/core/ui-packs/uk.ts +45 -0
  493. package/src/core/ui-packs/vi.ts +45 -0
  494. package/src/core/ui-packs/zh-tw.ts +43 -0
  495. package/src/core/ui-packs/zh.ts +43 -0
  496. package/src/core/variables.ts +103 -0
  497. package/src/core/version-cut.ts +52 -15
  498. package/src/deploy/artifacts.ts +104 -14
  499. package/src/deploy/cloudflare-negotiation.ts +39 -17
  500. package/src/deploy/headers.ts +10 -5
  501. package/src/deploy/node-headers.ts +64 -10
  502. package/src/deploy/platforms/cloudflare.ts +44 -3
  503. package/src/deploy/platforms/netlify.ts +34 -1
  504. package/src/deploy/platforms/node.ts +1 -0
  505. package/src/deploy/platforms/static.ts +1 -0
  506. package/src/deploy/platforms/types.ts +8 -0
  507. package/src/deploy/platforms/vercel.ts +38 -2
  508. package/src/deploy/redirects.ts +139 -36
  509. package/src/deploy/robots.ts +2 -2
  510. package/src/deploy/rss.ts +4 -3
  511. package/src/deploy/sitemap.ts +7 -5
  512. package/src/deploy/vercel-negotiation.ts +36 -0
  513. package/src/markdown/api-rail.ts +259 -0
  514. package/src/markdown/base-links.ts +34 -36
  515. package/src/markdown/code-title.ts +35 -9
  516. package/src/markdown/directives.ts +242 -36
  517. package/src/markdown/features.ts +20 -2
  518. package/src/markdown/fence-meta.ts +2 -0
  519. package/src/markdown/include.ts +11 -1
  520. package/src/markdown/index.ts +35 -11
  521. package/src/markdown/math.ts +4 -4
  522. package/src/markdown/mdast.ts +5 -2
  523. package/src/markdown/relative-links.ts +12 -4
  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 +136 -11
  531. package/src/og/derive.ts +41 -31
  532. package/src/og/index.ts +1 -0
  533. package/src/openapi/asyncapi.ts +4 -2
  534. package/src/openapi/model.ts +77 -36
  535. package/src/openapi/overlay.ts +256 -0
  536. package/src/openapi/parse.ts +55 -2
  537. package/src/openapi/proxy.ts +63 -10
  538. package/src/openapi/references.ts +21 -5
  539. package/src/openapi/render-mdx.ts +46 -3
  540. package/src/openapi/scalar.ts +40 -6
  541. package/src/openapi/source.ts +1 -1
  542. package/src/ratelimit/cloudflare.ts +54 -0
  543. package/src/ratelimit/index.ts +30 -0
  544. package/src/ratelimit/memory.ts +45 -0
  545. package/src/ratelimit/runtime.ts +229 -0
  546. package/src/ratelimit/schema.ts +28 -0
  547. package/src/ratelimit/upstash.ts +30 -0
  548. package/src/ratelimit/wrangler.ts +70 -0
  549. package/src/reference/asyncapi.ts +2 -2
  550. package/src/reference/graphql.ts +5 -2
  551. package/src/reference/openapi.ts +21 -7
  552. package/src/reference/options.ts +51 -7
  553. package/src/reference/scalar.ts +33 -8
  554. package/src/registry/eject.ts +201 -28
  555. package/src/registry/registry.ts +7 -0
  556. package/src/search/adapters/version-scope.ts +30 -0
  557. package/src/search/documents.ts +93 -28
  558. package/src/search/orama-index.ts +28 -3
  559. package/src/search/pagefind-ranking.ts +39 -0
  560. package/src/search/popular.ts +2 -1
  561. package/src/search/sync/algolia.ts +15 -4
  562. package/src/search/sync/orama-cloud.ts +3 -0
  563. package/src/search/sync/typesense.ts +5 -0
  564. package/src/seo/jsonld.ts +7 -3
  565. package/src/seo/metatags.ts +67 -0
  566. package/src/theme/chrome-icons.ts +1 -0
  567. package/src/theme/color.ts +500 -0
  568. package/src/theme/entry.ts +56 -3
  569. package/src/theme/palette.ts +121 -45
  570. package/src/translate/meta.ts +68 -24
  571. package/src/translate/prompts.ts +1 -0
  572. package/src/translate/run.ts +3 -3
  573. package/src/translate/validate.ts +12 -3
  574. package/src/translate/work-list.ts +56 -17
  575. package/src/upgrade/upgrade.ts +4 -171
  576. package/dist/cli/chunk-3yce002v.js.map +0 -14
  577. package/dist/cli/chunk-5r8g91qn.js.map +0 -34
  578. package/dist/cli/chunk-6dtt0zfn.js.map +0 -10
  579. package/dist/cli/chunk-7mbqtmgb.js.map +0 -10
  580. package/dist/cli/chunk-ddndchfr.js.map +0 -14
  581. package/dist/cli/chunk-esh98wmb.js +0 -23
  582. package/dist/cli/chunk-esh98wmb.js.map +0 -10
  583. package/dist/cli/chunk-hqp2ajnh.js.map +0 -35
  584. package/dist/cli/chunk-hr8ne106.js.map +0 -13
  585. package/dist/cli/chunk-j85scx15.js.map +0 -10
  586. package/dist/cli/chunk-mqc662a6.js +0 -75
  587. package/dist/cli/chunk-mqc662a6.js.map +0 -11
  588. package/dist/cli/chunk-pbg5a4s3.js.map +0 -19
  589. package/dist/cli/chunk-qkb5a8sa.js.map +0 -10
  590. package/dist/cli/chunk-v6ya5kcb.js.map +0 -189
  591. package/dist/cli/chunk-wdrt2k2v.js.map +0 -10
  592. package/dist/cli/chunk-xh43dwgw.js.map +0 -36
  593. package/docs/content/sources.mdx +0 -338
  594. /package/dist/cli/{chunk-zp79m0ts.js.map → chunk-1n228xqb.js.map} +0 -0
  595. /package/dist/cli/{chunk-h2ez8dzb.js.map → chunk-5ffywsmb.js.map} +0 -0
  596. /package/dist/cli/{chunk-g698a744.js.map → chunk-5wj2qwn2.js.map} +0 -0
  597. /package/dist/cli/{chunk-sqw4ekg1.js.map → chunk-amrb6hgh.js.map} +0 -0
  598. /package/dist/cli/{chunk-h7k3nq3v.js.map → chunk-gp84za0h.js.map} +0 -0
  599. /package/dist/cli/{chunk-bfwp9vp6.js.map → chunk-p804f3pe.js.map} +0 -0
  600. /package/dist/cli/{chunk-00gs3wqs.js.map → chunk-ta27feev.js.map} +0 -0
  601. /package/dist/cli/{chunk-bbnwccaz.js.map → chunk-y4ykbark.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>>;
@@ -48,16 +48,18 @@ export declare const isExternalUrl: (target: string) => boolean;
48
48
  /**
49
49
  * Idempotently prepend `basePath` to a root-relative route. A route already
50
50
  * equal to or nested under the base is returned unchanged, so authors who write
51
- * the base by hand (`/docs/x`) aren't double-prefixed to `/docs/docs/x`.
51
+ * the base by hand (`/docs/x`, `/docs#install`) aren't double-prefixed to
52
+ * `/docs/docs/x`.
52
53
  */
53
54
  export declare const withBasePath: (basePath: string, route: string) => string;
54
55
  /**
55
- * Mount a route Blume generates from content under `basePath`,
56
- * unconditionally. {@link withBasePath} leaves a route that already starts
57
- * with the base alone, which is right for a link an author based by hand but
58
- * wrong for a content route: with `basePath: "/docs"`, `docs/guide.md` routes
59
- * to `/docs/guide` before the base and publishes at `/docs/docs/guide`, not on
60
- * top of the root `guide.md`.
56
+ * Mount a route Blume generates under a base, unconditionally: `basePath` for
57
+ * a content route, `deployment.base` for any generated URL (a sitemap entry,
58
+ * a feed item). {@link withBasePath} leaves a route that already starts with
59
+ * the base alone, which is right for a link an author based by hand but wrong
60
+ * for a generated route: with `basePath: "/docs"`, `docs/guide.md` routes to
61
+ * `/docs/guide` before the base and publishes at `/docs/docs/guide`, not on
62
+ * top of the root `guide.md` — and likewise under `deployment.base: "/docs"`.
61
63
  */
62
64
  export declare const mountBasePath: (basePath: string, route: string) => string;
63
65
  /**
@@ -69,6 +71,18 @@ export declare const mountBasePath: (basePath: string, route: string) => string;
69
71
  * and a route already under the full composite is returned unchanged.
70
72
  */
71
73
  export declare const withComposedBasePath: (deployBase: string, basePath: string, route: string) => string;
74
+ /**
75
+ * Base a root-relative link an author wrote as if mounted at root — a content
76
+ * link (`markdown/base-links.ts`, `components/content/base-href.ts`) or a
77
+ * redirect target (`deploy/redirects.ts`) — by what it names. A page gains the
78
+ * composed stack ({@link withComposedBasePath}). A public asset — a path whose
79
+ * final segment carries a file extension, with no page served there (a dotted
80
+ * route like `/releases/v1.2` is still a page) — gains the deployment base
81
+ * alone: Astro serves `public/` under `deployment.base`, but never under
82
+ * `basePath`. `servesPage` answers whether a page is served at a
83
+ * `basePath`-prefixed, fragment-less path. Other targets pass through.
84
+ */
85
+ export declare const withAuthoredBasePath: (deployBase: string, basePath: string, target: string, servesPage: (route: string) => boolean) => string;
72
86
  /**
73
87
  * Remove `basePath` from the front of a route (`/docs/guide` -> `/guide`,
74
88
  * `/docs` -> `/`). A route not under the base is returned unchanged. Inverse of
@@ -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,60 @@ 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
+ }
84
129
  /**
85
130
  * Where content lives and how it's discovered. `root`/`include`/`exclude` are
86
131
  * zero-config shorthand for a single `filesystem()` source; set `sources` to
@@ -171,7 +216,8 @@ export interface ContentTypeConfig {
171
216
  frontmatter?: Record<string, StandardSchema>;
172
217
  }
173
218
  /**
174
- * A header label, optionally per locale: a plain string, or a map of locale
219
+ * A label, optionally per locale (header tabs and links, the banner, the
220
+ * footer): a plain string, or a map of locale
175
221
  * code to label (`{ en: "Docs", ja: "ドキュメント" }`). The active locale's
176
222
  * entry wins, then the default locale's, then the map's first entry.
177
223
  */
@@ -248,8 +294,8 @@ export interface FeaturedLink {
248
294
  href: string;
249
295
  /** Lucide icon name shown beside the label. */
250
296
  icon?: string;
251
- /** Link label. */
252
- label: string;
297
+ /** Link label, or a map of locale code to label. */
298
+ label: LocalizableLabel;
253
299
  }
254
300
  /**
255
301
  * The sidebar. Omit `items` to generate the sidebar from the content tree;
@@ -270,8 +316,8 @@ export type SidebarConfig = SidebarItemConfig[] | {
270
316
  export interface HeaderAction {
271
317
  /** Link target. An external href opens in a new tab. */
272
318
  href: string;
273
- /** Link label. */
274
- label: string;
319
+ /** Link label, or a map of locale code to label. */
320
+ label: LocalizableLabel;
275
321
  }
276
322
  /** Header, sidebar, tabs, and switcher configuration. */
277
323
  export interface NavigationConfig {
@@ -282,7 +328,7 @@ export interface NavigationConfig {
282
328
  /** Pinned links shown above the generated sidebar sections. */
283
329
  featured?: FeaturedLink[];
284
330
  /**
285
- * The GitHub link in the header. `true` derives it from `github` (the
331
+ * The GitHub link in the footer. `true` derives it from `github` (the
286
332
  * default), `false` hides it, and an absolute URL points it anywhere on
287
333
  * GitHub — an organization, say, when the docs repo itself is private.
288
334
  */
@@ -450,6 +496,13 @@ export interface AssistantRetrievalConfig {
450
496
  }
451
497
  /** The chat assistant. */
452
498
  export interface AssistantConfig {
499
+ /**
500
+ * A bot check from `blume/captcha` — `turnstile({ siteKey })` or
501
+ * `hcaptcha({ siteKey })`. The panel sends a token with each question and
502
+ * the generated route verifies it (with `TURNSTILE_SECRET_KEY` or
503
+ * `HCAPTCHA_SECRET_KEY`) before the model runs.
504
+ */
505
+ captcha?: CaptchaAdapter;
453
506
  /**
454
507
  * Origins allowed to call the generated endpoint from another site — a
455
508
  * marketing page that embeds an ask box, for example — or `"*"` to allow
@@ -478,10 +531,10 @@ export interface AssistantConfig {
478
531
  instructions?: string;
479
532
  /**
480
533
  * 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
534
+ * `openai({ model, baseUrl })`, `anthropic({ model })`,
535
+ * `gemini({ model })`, `grok({ model })`, `gateway({ model })`,
536
+ * `openrouter({ model, reasoning })`, `llmgateway({ model })`, or
537
+ * `inkeep({ model })`, all exported from `blume/ai`. Each adapter owns its model, key env var, reasoning
485
538
  * mapping, and `providerOptions` passthrough. Defaults to
486
539
  * `gateway({ model: "openai/gpt-5.5" })`.
487
540
  */
@@ -492,8 +545,23 @@ export interface AssistantConfig {
492
545
  * backend — at the cost of recall. Defaults keep the built-in behavior.
493
546
  */
494
547
  retrieval?: AssistantRetrievalConfig;
548
+ /**
549
+ * A Contact support link in the panel once there's a conversation: a
550
+ * `mailto:` address starts an email with the conversation as its body; a
551
+ * URL or root-relative path gets the conversation's `thread` id, which the
552
+ * assistant's analytics events carry too.
553
+ */
554
+ support?: string;
495
555
  /** Starter prompts shown before the first question. */
496
556
  suggestions?: AssistantSuggestion[];
557
+ /**
558
+ * Let the model search the docs and read whole pages itself, over several
559
+ * steps, instead of answering only from the excerpts retrieved up front.
560
+ * Defaults to `true`, except for `openai()` with a `baseUrl`, whose model
561
+ * may not support tool calling. `inkeep()` does its own retrieval and
562
+ * ignores it.
563
+ */
564
+ tools?: boolean;
497
565
  }
498
566
  /** What the AI Catalog (ARD) manifest carries. */
499
567
  export interface AiCatalogConfig {
@@ -611,6 +679,12 @@ export interface I18nConfig {
611
679
  locales: LocaleConfigInput[];
612
680
  /** `dir`: locale directories (`fr/page.mdx`). `dot`: filename suffix (`page.fr.mdx`). */
613
681
  parser?: "dir" | "dot";
682
+ /**
683
+ * Send a visitor who lands on the default language's home page to the home
684
+ * page in their browser's preferred language, until they pick a language
685
+ * with the switcher. Defaults to `false`.
686
+ */
687
+ routeByBrowserLanguage?: boolean;
614
688
  /**
615
689
  * Per-locale UI string overrides, e.g.
616
690
  * `{ fr: { search: { button: "Rechercher" } } }`.
@@ -705,11 +779,19 @@ type RedirectStatusTemporary = 302 | 307;
705
779
  type RedirectStatus = RedirectStatusPermanent | RedirectStatusTemporary;
706
780
  /** A URL redirect rule. */
707
781
  export interface RedirectConfig {
708
- /** Path to redirect from. */
782
+ /**
783
+ * Path to redirect from: an exact path, or a pattern. `:name` matches one
784
+ * segment, `:name*` as the last segment the rest of the path
785
+ * (`/beta/:slug*`), and `*` ending a segment the rest from there
786
+ * (`/old/article-*`).
787
+ */
709
788
  from: string;
710
789
  /** HTTP status. Defaults to `301`. */
711
790
  status?: RedirectStatus;
712
- /** Path or URL to redirect to. */
791
+ /**
792
+ * Path or URL to redirect to. Reads `from`'s captures as `/:name` (or `*`
793
+ * for what `*` matched): `/v2/:slug*`.
794
+ */
713
795
  to: string;
714
796
  }
715
797
  /**
@@ -785,6 +867,13 @@ export interface AgentsConfig {
785
867
  markdownComponents?: Record<string, ComponentMarkdown>;
786
868
  /** Expose the docs as an MCP server for agents. */
787
869
  mcp?: McpConfig;
870
+ /**
871
+ * Generate the site's own agent skill: a `SKILL.md` named after the site,
872
+ * built from its navigation and page descriptions, served at `/skill.md`
873
+ * and in the skills discovery index. Needs `deployment.site`. A skill in
874
+ * `agents.skills` with the same name replaces it. Defaults to `true`.
875
+ */
876
+ skillMd?: boolean;
788
877
  /**
789
878
  * Publish Agent Skills for discovery: a directory (resolved against the
790
879
  * project root) whose subdirectories each hold a `SKILL.md`. Skills are
@@ -850,13 +939,15 @@ export interface OgConfig {
850
939
  */
851
940
  enabled?: boolean;
852
941
  /**
853
- * Fonts for the generated card, extending Takumi's Latin-only default so
854
- * non-Latin titles (CJK, and so on) render instead of tofu. A bare string is
855
- * a Google Fonts family fetched at build; the name-only object form pins
856
- * weights (`700`, `[400, 700]`, or a `"100..900"` variable range) and
857
- * styles; the `src` form reads a local font file from the project instead.
858
- * When omitted and `theme.fonts` is explicitly configured, the theme's
859
- * display and body fonts are used automatically — pass `[]` to opt out.
942
+ * Fonts for the generated card, replacing the default stack: Takumi's
943
+ * Latin-only built-in font plus a Noto fallback per script, which a card
944
+ * fetches only when its text needs one. A bare string is a Google Fonts
945
+ * family fetched at build; the name-only object form pins weights (`700`,
946
+ * `[400, 700]`, or a `"100..900"` variable range) and styles; the `src`
947
+ * form reads a local font file from the project instead. When omitted and
948
+ * `theme.fonts` is explicitly configured, the theme's display and body
949
+ * fonts are used automatically, ahead of the fallbacks — pass `[]` to opt
950
+ * out of both.
860
951
  */
861
952
  fonts?: (string | {
862
953
  name: string;
@@ -952,6 +1043,23 @@ export interface SoftwareConfig {
952
1043
  }
953
1044
  /** Discoverability: OG images, feeds, sitemap, robots, and structured data. */
954
1045
  export interface SeoConfig {
1046
+ /**
1047
+ * Meta tags written into every page's head, name to content: site
1048
+ * verification tokens, `theme-color`, an app banner, and anything else
1049
+ * Blume has no setting for. `og:*`, `fb:*`, and `article:*` tags render
1050
+ * with `property`, the rest with `name`. A tag Blume writes itself
1051
+ * (`description`, `robots`, `og:image`, `twitter:card`, …) is refused.
1052
+ *
1053
+ * ```ts
1054
+ * seo: {
1055
+ * metatags: {
1056
+ * "google-site-verification": "abc123",
1057
+ * "theme-color": "#0b5fff",
1058
+ * },
1059
+ * }
1060
+ * ```
1061
+ */
1062
+ metatags?: Record<string, string>;
955
1063
  /** Per-page Open Graph image generation. */
956
1064
  og?: OgConfig;
957
1065
  /**
@@ -1102,6 +1210,33 @@ export type ExportConfig = boolean | {
1102
1210
  /** Offer PDF export (via print). Defaults to `false`. */
1103
1211
  pdf?: boolean;
1104
1212
  };
1213
+ /** Page feedback: the rating, and an optional written comment after it. */
1214
+ export interface FeedbackConfig {
1215
+ /**
1216
+ * After the rating, offer a box to say more. The comment is sent as a
1217
+ * `feedback_comment` event through every analytics adapter with an event
1218
+ * API. Defaults to `false`.
1219
+ */
1220
+ comments?: boolean;
1221
+ /** Show the rating. Defaults to `true`. */
1222
+ enabled?: boolean;
1223
+ }
1224
+ /**
1225
+ * "Listen to this page". `true` reads pages aloud with the reader's browser
1226
+ * voices (no key, any host). The object form's `provider` generates neural
1227
+ * audio at build instead, one cached clip per sentence, and falls back to
1228
+ * browser voices where no clips exist. Defaults to `false`.
1229
+ */
1230
+ export type NarrationConfig = boolean | {
1231
+ /** Show the player. Defaults to `true` in the object form. */
1232
+ enabled?: boolean;
1233
+ /**
1234
+ * Generate audio at build with a speech model:
1235
+ * `gateway({ model: "openai/tts-1-hd", voice: "alloy" })` from
1236
+ * `blume/ai`. Without it, pages are read with browser voices.
1237
+ */
1238
+ provider?: AssistantGatewayAdapter;
1239
+ };
1105
1240
  /**
1106
1241
  * Opt-in custom frontmatter keys. Page frontmatter is strictly validated —
1107
1242
  * an unknown key fails the build so typos are caught — and `extend` carves
@@ -1186,6 +1321,8 @@ export interface BlumeConfig {
1186
1321
  agents?: AgentsConfig;
1187
1322
  /** Model-facing features: the assistant and the "Open in chat" action. */
1188
1323
  ai?: AiConfig;
1324
+ /** Defaults for hand-written endpoint pages (`api` frontmatter). */
1325
+ api?: ApiConfig;
1189
1326
  /**
1190
1327
  * Analytics adapters from `blume/analytics`, emitted into `<head>` of every
1191
1328
  * production page in this order: `[posthog({ key }), vercel(),
@@ -1204,6 +1341,14 @@ export interface BlumeConfig {
1204
1341
  * compose: with both set, a page lands at `{deployment.base}/{basePath}/page`.
1205
1342
  */
1206
1343
  basePath?: string;
1344
+ /**
1345
+ * Ask readers before analytics runs, with an adapter from `blume/consent`:
1346
+ * `native()` for Blume's own banner, or a hosted consent manager
1347
+ * (`osano({ customerId, configId })`, `ethyca({ privacyCenter })`). Every
1348
+ * `analytics` adapter waits until the reader allows analytics. Unset runs
1349
+ * analytics as it loads.
1350
+ */
1351
+ consent?: ConsentAdapter;
1207
1352
  /** Where content lives and how it's discovered. */
1208
1353
  content?: ContentConfig;
1209
1354
  /**
@@ -1227,8 +1372,17 @@ export interface BlumeConfig {
1227
1372
  examples?: string | ExamplesConfig;
1228
1373
  /** Reader-facing PDF/EPUB export actions. Defaults to `false`. */
1229
1374
  export?: ExportConfig;
1230
- /** Show the per-page "Was this helpful?" widget. Defaults to `true`. */
1231
- feedback?: boolean;
1375
+ /**
1376
+ * The "Was this page helpful?" rating at the foot of each page. On by
1377
+ * default; `false` hides it. `{ comments: true }` also asks for a written
1378
+ * comment after the rating, sent through your analytics adapters.
1379
+ */
1380
+ feedback?: boolean | FeedbackConfig;
1381
+ /**
1382
+ * The site footer: social profile icons and up to four link columns. Unset,
1383
+ * the site has no footer.
1384
+ */
1385
+ footer?: FooterConfig;
1232
1386
  /** Opt-in custom frontmatter keys, validated by schemas you supply. */
1233
1387
  frontmatter?: FrontmatterConfig;
1234
1388
  /** Source repository (Edit-this-page links and the header repo link). */
@@ -1245,8 +1399,17 @@ export interface BlumeConfig {
1245
1399
  logo?: LogoConfig;
1246
1400
  /** Markdown / MDX rendering behavior. */
1247
1401
  markdown?: MarkdownConfig;
1402
+ /** "Listen to this page" narration. Defaults to `false`. */
1403
+ narration?: NarrationConfig;
1248
1404
  /** Header, sidebar, tabs, and switchers. */
1249
1405
  navigation?: NavigationConfig;
1406
+ /**
1407
+ * Limit how often one reader (by IP address) can call the server routes —
1408
+ * the assistant, the API playground proxy, server-side search — with an
1409
+ * adapter from `blume/ratelimit`: `memory()` (the default, 30 requests per
1410
+ * 10 minutes), `upstash()`, or `cloudflare()`. `false` turns it off.
1411
+ */
1412
+ rateLimit?: false | RateLimitAdapter;
1250
1413
  /** React island behavior (compiler auto-memoization). */
1251
1414
  react?: ReactConfig;
1252
1415
  /** URL redirect rules. */
@@ -1267,6 +1430,12 @@ export interface BlumeConfig {
1267
1430
  title?: string;
1268
1431
  /** On-page table of contents. Defaults to on (H2–H3). */
1269
1432
  toc?: TocConfig;
1433
+ /**
1434
+ * Content variables: `{{name}}` in a page reads the value, in prose, code,
1435
+ * and links alike. Names take letters, digits, `_`, and `-`; an undefined
1436
+ * name in prose fails the build. Defaults to none.
1437
+ */
1438
+ variables?: Record<string, string>;
1270
1439
  /** Docs versioning (opt-in frozen snapshots with a version switcher). */
1271
1440
  versions?: VersionsConfig;
1272
1441
  }