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
@@ -14,20 +14,25 @@ import {
14
14
  API_SEARCH_PATH,
15
15
  apiNamePhrase,
16
16
  resolveReferences,
17
- referenceRoutes,
18
17
  hasScalarReferences,
19
18
  builtinProxyReferences,
19
+ apiPagesUseBuiltinProxy,
20
20
  needsPlaygroundProxy,
21
21
  buildMcpDiscovery,
22
22
  buildMcpServerCard,
23
23
  hasAiCatalog,
24
24
  buildHomeLinkHeader,
25
+ resolveLocalizable,
25
26
  resolveDocsCollection,
27
+ withChangelogIndexText,
26
28
  discoverPages,
27
29
  routeIsTaken,
28
30
  hasGeneratedChangelog,
31
+ navTargetRoutes,
29
32
  customOgRoutes,
30
33
  resolveAskBackend,
34
+ captchaSettings,
35
+ parseApiEndpoint,
31
36
  GOOGLE_FONTS,
32
37
  isFontSlug,
33
38
  fontLocaleCodes,
@@ -46,10 +51,11 @@ import {
46
51
  renderRssFeed,
47
52
  HTTP_METHODS,
48
53
  withServerDefaults,
54
+ readOverlaidSpec,
49
55
  isOpenApiSource,
50
56
  buildRawMarkdown,
51
57
  markdownRoutePaths
52
- } from "./chunk-pv29h0wf.js";
58
+ } from "./chunk-ehweg4fr.js";
53
59
  import {
54
60
  trimChar,
55
61
  normalizeBasePath,
@@ -57,15 +63,16 @@ import {
57
63
  mountBasePath,
58
64
  siteRoot,
59
65
  absoluteUrl2
60
- } from "./chunk-3em5wd2y.js";
66
+ } from "./chunk-zccbjcj0.js";
61
67
  import {
62
68
  validateSearchPopularIcons,
63
69
  validateNavTargets
64
- } from "./chunk-j85vccga.js";
70
+ } from "./chunk-ncj7w596.js";
65
71
  import {
72
+ EXPANDABLE_VISIBLE_LINES,
66
73
  buildSearchDocuments,
67
74
  buildMcpData
68
- } from "./chunk-yfyb25rh.js";
75
+ } from "./chunk-n0v7m8ry.js";
69
76
  import {
70
77
  planComponentSlots,
71
78
  publishRuntimeModules,
@@ -77,6 +84,7 @@ import {
77
84
  askComponentTemplate,
78
85
  searchEndpointTemplate,
79
86
  featuresTemplate,
87
+ consentClientTemplate,
80
88
  searchClientTemplate,
81
89
  mixedbreadSearchEndpointTemplate,
82
90
  rawMarkdownEndpointTemplate,
@@ -105,32 +113,138 @@ import {
105
113
  examplesPageTemplate,
106
114
  runtimePackageTemplate,
107
115
  runtimeTsconfigTemplate
108
- } from "./chunk-5m5nmvyq.js";
116
+ } from "./chunk-gb420vvz.js";
117
+ import {
118
+ validateUsedComponents,
119
+ missingExampleDiagnostics,
120
+ discoverIslands,
121
+ EXAMPLE_SCAN_GLOB,
122
+ exampleScanRoots,
123
+ discoverExamples,
124
+ exampleMarkdownLookup,
125
+ missingDependencyDiagnostic
126
+ } from "./chunk-66w9j7p6.js";
109
127
  import {
110
128
  emptyComponentOverrides,
111
129
  analyzeComponentOverrides
112
- } from "./chunk-8ktnccpt.js";
130
+ } from "./chunk-54ztw1nj.js";
113
131
  import {
114
132
  writeTextAtomic
115
133
  } from "./chunk-jq5n4avg.js";
116
134
  import {
117
- registry
118
- } from "./chunk-r20tn01b.js";
135
+ resolveAccent,
136
+ resolveRadius,
137
+ buildThemeCss
138
+ } from "./chunk-cm89scdv.js";
119
139
  import {
120
- readClientMode,
121
- discoverIslands,
122
- missingDependencyDiagnostic
123
- } from "./chunk-b07cmahc.js";
140
+ registry
141
+ } from "./chunk-c1y538kd.js";
124
142
 
125
143
  // src/astro/integration.ts
126
- import { join as join3, relative, resolve as resolve2 } from "pathe";
144
+ import { join as join4, relative, resolve as resolve2 } from "pathe";
127
145
 
128
146
  // src/deploy/artifacts.ts
129
- import { dirname as dirname2, join as join2, resolve } from "pathe";
147
+ import { dirname as dirname3, join as join3, resolve } from "pathe";
148
+
149
+ // src/narration/build.ts
150
+ import { createGateway, generateSpeech } from "ai";
151
+ import { HTMLElement, parse, TextNode } from "node-html-parser";
152
+ import { dirname, join } from "pathe";
153
+
154
+ // src/narration/script.ts
155
+ var INLINE_TAGS = new Set([
156
+ "a",
157
+ "abbr",
158
+ "audio",
159
+ "button",
160
+ "canvas",
161
+ "embed",
162
+ "iframe",
163
+ "img",
164
+ "input",
165
+ "math",
166
+ "noscript",
167
+ "object",
168
+ "picture",
169
+ "script",
170
+ "select",
171
+ "style",
172
+ "svg",
173
+ "template",
174
+ "textarea",
175
+ "video",
176
+ "b",
177
+ "bdi",
178
+ "bdo",
179
+ "cite",
180
+ "code",
181
+ "data",
182
+ "del",
183
+ "dfn",
184
+ "em",
185
+ "font",
186
+ "i",
187
+ "ins",
188
+ "kbd",
189
+ "label",
190
+ "mark",
191
+ "q",
192
+ "s",
193
+ "samp",
194
+ "small",
195
+ "span",
196
+ "strong",
197
+ "sub",
198
+ "sup",
199
+ "time",
200
+ "u",
201
+ "var",
202
+ "wbr"
203
+ ]);
204
+ var SKIPPED_TAGS = new Set([
205
+ "audio",
206
+ "blume-diff",
207
+ "blume-mermaid",
208
+ "button",
209
+ "canvas",
210
+ "dialog",
211
+ "embed",
212
+ "figure",
213
+ "iframe",
214
+ "img",
215
+ "input",
216
+ "math",
217
+ "nav",
218
+ "noscript",
219
+ "object",
220
+ "picture",
221
+ "pre",
222
+ "script",
223
+ "select",
224
+ "style",
225
+ "svg",
226
+ "table",
227
+ "template",
228
+ "textarea",
229
+ "video"
230
+ ]);
231
+ var CALLOUT_KINDS = new Set([
232
+ "danger",
233
+ "info",
234
+ "note",
235
+ "success",
236
+ "tip",
237
+ "warning"
238
+ ]);
239
+ var DENSE_SCRIPT_LANGS = new Set(["ja", "ko", "zh"]);
130
240
 
131
241
  // src/search/build.ts
132
242
  import { close, createIndex } from "pagefind";
133
- import { dirname, join } from "pathe";
243
+ import { dirname as dirname2, join as join2 } from "pathe";
244
+
245
+ // src/search/sync/algolia.ts
246
+ var jsonBytes = (value) => Buffer.byteLength(JSON.stringify(value), "utf-8");
247
+ var WIDEST_CHARACTER = jsonBytes("\x00");
134
248
 
135
249
  // src/deploy/sitemap.ts
136
250
  import { escape as escapeXml } from "html-escaper";
@@ -226,8 +340,8 @@ import {
226
340
  rm,
227
341
  writeFile
228
342
  } from "node:fs/promises";
229
- import { dirname as dirname3, join as join4 } from "pathe";
230
- var ogCacheDir = (context) => existsSync(join4(context.root, "node_modules")) ? join4(context.root, "node_modules", ".cache", "blume", "og") : join4(context.outDir, ".cache", "og");
343
+ import { dirname as dirname4, join as join5 } from "pathe";
344
+ var ogCacheDir = (context) => existsSync(join5(context.root, "node_modules")) ? join5(context.root, "node_modules", ".cache", "blume", "og") : join5(context.outDir, ".cache", "og");
231
345
  var REGISTRY_KEY2 = Symbol.for("blume.og-cache");
232
346
  var registry3 = () => {
233
347
  const host = globalThis;
@@ -245,7 +359,7 @@ var pruneCardCache = async (dir) => {
245
359
  return 0;
246
360
  }
247
361
  const stale = entries.filter((name) => name.endsWith(".tmp") || name.endsWith(".png") && !used.has(name.slice(0, -".png".length)));
248
- await Promise.all(stale.map((name) => rm(join4(dir, name), { force: true })));
362
+ await Promise.all(stale.map((name) => rm(join5(dir, name), { force: true })));
249
363
  return stale.length;
250
364
  };
251
365
  var cardCacheTally = () => {
@@ -259,7 +373,7 @@ import { existsSync as existsSync6, readFileSync as readFileSync3, realpathSync
259
373
  import {
260
374
  lstat,
261
375
  mkdir as mkdir2,
262
- readFile as readFile4,
376
+ readFile as readFile3,
263
377
  readlink,
264
378
  realpath,
265
379
  rm as rm2,
@@ -267,9 +381,9 @@ import {
267
381
  } from "node:fs/promises";
268
382
  import { createRequire as createRequire2 } from "node:module";
269
383
  import { pathToFileURL } from "node:url";
270
- import pMap2 from "p-map";
271
- import { dirname as dirname7, isAbsolute as isAbsolute6, join as join11, normalize as normalize2, relative as relative5, resolve as resolve6 } from "pathe";
272
- import { glob as glob2 } from "tinyglobby";
384
+ import pMap from "p-map";
385
+ import { dirname as dirname8, isAbsolute as isAbsolute5, join as join11, normalize as normalize2, relative as relative5, resolve as resolve6 } from "pathe";
386
+ import { glob } from "tinyglobby";
273
387
 
274
388
  // src/ai/api/problem.ts
275
389
  var PROBLEM_TYPE = "application/problem+json";
@@ -813,6 +927,12 @@ var buildAskData = async (project) => {
813
927
  if (versioned) {
814
928
  document.version = doc.version;
815
929
  }
930
+ if (doc.boost !== undefined) {
931
+ document.boost = doc.boost;
932
+ }
933
+ if (doc.keywords) {
934
+ document.keywords = doc.keywords;
935
+ }
816
936
  return document;
817
937
  }),
818
938
  site: project.config.deployment.options.site ?? null
@@ -839,70 +959,6 @@ var navVariants = (data, hiddenDefault = null) => [
839
959
  })))
840
960
  ];
841
961
 
842
- // src/core/builtin-tags.ts
843
- var BUILTIN_MDX_TAGS = new Set([
844
- "Accordion",
845
- "AccordionItem",
846
- "ApiOverview",
847
- "ApiTagOperations",
848
- "AutoTypeTable",
849
- "Badge",
850
- "Callout",
851
- "Card",
852
- "CardGroup",
853
- "CodeBlock",
854
- "CodeGroup",
855
- "Color",
856
- "Column",
857
- "Columns",
858
- "Component",
859
- "Diff",
860
- "Expandable",
861
- "FileTree",
862
- "Frame",
863
- "GithubInfo",
864
- "Icon",
865
- "Math",
866
- "Operation",
867
- "Panel",
868
- "Prompt",
869
- "Step",
870
- "Steps",
871
- "Tab",
872
- "Tabs",
873
- "Tile",
874
- "Tooltip",
875
- "Tree",
876
- "TypeTable",
877
- "Visibility",
878
- "YouTube"
879
- ]);
880
-
881
- // src/core/component-diagnostics.ts
882
- var toKebab = (tag) => tag.replaceAll(/(?<lower>[a-z0-9])(?<upper>[A-Z])/gu, "$<lower>-$<upper>").toLowerCase();
883
- var validateUsedComponents = (pages, extraTags, registryNames) => {
884
- const diagnostics = [];
885
- const seen = new Set;
886
- for (const page of pages) {
887
- for (const tag of page.componentsUsed ?? []) {
888
- if (BUILTIN_MDX_TAGS.has(tag) || extraTags.has(tag) || seen.has(tag)) {
889
- continue;
890
- }
891
- seen.add(tag);
892
- const name = toKebab(tag);
893
- const suggestion = registryNames.has(name) ? `Run \`blume add ${name}\` to install it, or register <${tag}> in components.ts (mdx).` : `Register <${tag}> in components.ts (mdx), or add an islands/${tag}.tsx component.`;
894
- diagnostics.push({
895
- code: "BLUME_UNKNOWN_COMPONENT",
896
- file: page.sourcePath ?? page.id,
897
- message: `<${tag}> is used in ${page.route} but isn't a known component.`,
898
- severity: "warning",
899
- suggestion
900
- });
901
- }
902
- }
903
- return diagnostics;
904
- };
905
-
906
962
  // src/core/svg-dimensions.ts
907
963
  var ROOT = /<svg\s(?:[^>"']|"[^"]*"|'[^']*')*>/u;
908
964
  var WIDTH = /\swidth=(?<quote>['"])(?<value>[^%]+?)\k<quote>/u;
@@ -968,7 +1024,7 @@ var svgDimensions = (svg) => {
968
1024
 
969
1025
  // src/core/tsconfig-aliases.ts
970
1026
  import { existsSync as existsSync2 } from "node:fs";
971
- import { dirname as dirname4, join as join5, resolve as resolve3 } from "pathe";
1027
+ import { dirname as dirname5, join as join6, resolve as resolve3 } from "pathe";
972
1028
  import ts from "typescript";
973
1029
  var PARSE_HOST = {
974
1030
  fileExists: ts.sys.fileExists,
@@ -990,7 +1046,7 @@ var toAlias = (key, value, baseDir) => {
990
1046
  return { find, replacement: resolve3(baseDir, target) };
991
1047
  };
992
1048
  var resolveTsconfigAliases = (root) => {
993
- const entry = ["tsconfig.json", "jsconfig.json"].map((name) => join5(root, name)).find((file) => existsSync2(file));
1049
+ const entry = ["tsconfig.json", "jsconfig.json"].map((name) => join6(root, name)).find((file) => existsSync2(file));
994
1050
  if (!entry) {
995
1051
  return {};
996
1052
  }
@@ -998,7 +1054,7 @@ var resolveTsconfigAliases = (root) => {
998
1054
  if (error) {
999
1055
  return {};
1000
1056
  }
1001
- const configDir = dirname4(entry);
1057
+ const configDir = dirname5(entry);
1002
1058
  const { options } = ts.parseJsonConfigFileContent(config, PARSE_HOST, configDir, undefined, entry);
1003
1059
  const { paths } = options;
1004
1060
  if (!paths) {
@@ -1151,9 +1207,9 @@ var hasMermaidFence = (text) => MERMAID_FENCE.test(text);
1151
1207
 
1152
1208
  // src/og/derive.ts
1153
1209
  import { existsSync as existsSync3 } from "node:fs";
1154
- import { isAbsolute, join as join6 } from "pathe";
1210
+ import { isAbsolute, join as join7 } from "pathe";
1155
1211
  var CARD_WEIGHTS = [400, 600];
1156
- var absoluteSrc = (root, src) => isAbsolute(src) ? src : join6(root, src);
1212
+ var absoluteSrc = (root, src) => isAbsolute(src) ? src : join7(root, src);
1157
1213
  var isNumericWeight = (weight) => typeof weight === "number";
1158
1214
  var isRangeWeight = (weight) => typeof weight === "string";
1159
1215
  var isFontName = (value) => typeof value === "string";
@@ -1334,98 +1390,22 @@ var missingFontFiles = (options, root) => {
1334
1390
 
1335
1391
  // src/og/logo.ts
1336
1392
  import { existsSync as existsSync4, readFileSync } from "node:fs";
1337
- import { join as join7 } from "pathe";
1393
+ import { join as join8 } from "pathe";
1338
1394
  var resolveOgLogo = (project, source) => {
1339
1395
  if (!source?.toLowerCase().endsWith(".svg")) {
1340
1396
  return;
1341
1397
  }
1342
1398
  const relative = source.replace(/^\//u, "");
1343
1399
  const file = [
1344
- join7(project.context.root, "public", relative),
1345
- join7(project.context.root, relative)
1400
+ join8(project.context.root, "public", relative),
1401
+ join8(project.context.root, relative)
1346
1402
  ].find((path) => existsSync4(path));
1347
1403
  return file ? readFileSync(file, "utf-8") : undefined;
1348
1404
  };
1349
1405
 
1350
1406
  // src/openapi/scalar.ts
1351
1407
  import { readFile as readFile2 } from "node:fs/promises";
1352
- import { isAbsolute as isAbsolute2, join as join8 } from "pathe";
1353
-
1354
- // src/theme/palette.ts
1355
- var FALLBACK_ACCENT = "oklch(0.62 0.16 250)";
1356
- var ACCENTS = {
1357
- blue: FALLBACK_ACCENT,
1358
- green: "oklch(0.6 0.16 150)",
1359
- orange: "oklch(0.68 0.17 50)",
1360
- pink: "oklch(0.65 0.2 350)",
1361
- purple: "oklch(0.58 0.2 290)",
1362
- red: "oklch(0.58 0.22 25)",
1363
- teal: "oklch(0.6 0.12 195)"
1364
- };
1365
- var isAccentPreset = (value) => Object.hasOwn(ACCENTS, value);
1366
- var CSS_COLOR = /^[\w\s#%.,()/+-]+$/u;
1367
- var safeColor = (value, fallback) => CSS_COLOR.test(value.trim()) ? value.trim() : fallback;
1368
- var presetOrColor = (value) => isAccentPreset(value) ? ACCENTS[value] : safeColor(value, FALLBACK_ACCENT);
1369
- var safeColorOrNull = (value) => value && CSS_COLOR.test(value.trim()) ? value.trim() : null;
1370
- var RADII = {
1371
- lg: "0.75rem",
1372
- md: "0.5rem",
1373
- none: "0",
1374
- sm: "0.25rem"
1375
- };
1376
- var cssString = (value) => JSON.stringify(value);
1377
- var backgroundImageCss = (image) => `url(${cssString(image)})`;
1378
- var cssToken = (name, value) => value ? [` ${name}: ${value};`] : [];
1379
- var themeRootCss = (theme, options) => [
1380
- ` --blume-accent: ${options.accent};`,
1381
- ...cssToken("--blume-action", options.action),
1382
- ...cssToken("--blume-action-foreground", options.action ? "oklch(1 0 0)" : null),
1383
- ...cssToken("--blume-background", safeColorOrNull(theme.background?.light)),
1384
- ...cssToken("--blume-background-image", theme.backgroundImage?.light ? backgroundImageCss(theme.backgroundImage.light) : null),
1385
- ` --blume-radius: ${options.radius};`
1386
- ].filter(Boolean).join(`
1387
- `);
1388
- var themeDarkCss = (theme, options) => {
1389
- const tokens = [
1390
- ` --blume-accent: ${options.accent};`,
1391
- " --blume-accent-foreground: oklch(1 0 0);",
1392
- ...cssToken("--blume-action", options.action),
1393
- ...cssToken("--blume-action-foreground", options.action ? "oklch(1 0 0)" : null),
1394
- ...cssToken("--blume-background", safeColorOrNull(theme.background?.dark)),
1395
- ...cssToken("--blume-background-image", theme.backgroundImage?.dark ? backgroundImageCss(theme.backgroundImage.dark) : null)
1396
- ].filter(Boolean);
1397
- return `:root[data-theme="dark"] {
1398
- ${tokens.join(`
1399
- `)}
1400
- }
1401
- `;
1402
- };
1403
- var resolveAccent = (theme) => ({
1404
- dark: presetOrColor(theme.accent.dark),
1405
- light: presetOrColor(theme.accent.light)
1406
- });
1407
- var resolveRadius = (theme) => RADII[theme.radius];
1408
- var buildThemeCss = (theme) => {
1409
- const accent = resolveAccent(theme);
1410
- const action = theme.action ? presetOrColor(theme.action) : null;
1411
- const radius = RADII[theme.radius];
1412
- const root = themeRootCss(theme, {
1413
- accent: accent.light,
1414
- action,
1415
- radius
1416
- });
1417
- const dark = themeDarkCss(theme, {
1418
- accent: accent.dark,
1419
- action
1420
- });
1421
- return `/* Generated by Blume from theme config. */
1422
- :root {
1423
- ${root}
1424
- }
1425
- ${dark}`;
1426
- };
1427
-
1428
- // src/openapi/scalar.ts
1408
+ import { isAbsolute as isAbsolute2, join as join9 } from "pathe";
1429
1409
  var URL_SPEC = /^https?:\/\//u;
1430
1410
  var referencePagePath = (route) => {
1431
1411
  const segments = trimChar(route, "/");
@@ -1441,11 +1421,28 @@ var themeConfiguration = (config, override) => {
1441
1421
  customCss: `:root,.light-mode,.dark-mode{--scalar-color-accent:${accent.light};--scalar-radius:${radius};}.dark-mode{--scalar-color-accent:${accent.dark};}`
1442
1422
  };
1443
1423
  };
1444
- var specConfiguration = async (spec, root) => {
1424
+ var overlaidConfiguration = async (ref, root) => {
1425
+ try {
1426
+ const { text, warnings } = await readOverlaidSpec(ref.spec, root, {
1427
+ overlays: ref.overlays
1428
+ });
1429
+ return { config: { content: text }, warning: warnings[0] };
1430
+ } catch (error) {
1431
+ const { message } = error;
1432
+ return {
1433
+ warning: `API reference ${ref.route} was skipped: its overlays couldn't be applied to "${ref.spec}" (${message}).`
1434
+ };
1435
+ }
1436
+ };
1437
+ var specConfiguration = async (ref, root) => {
1438
+ const { spec } = ref;
1439
+ if (ref.overlays?.length) {
1440
+ return await overlaidConfiguration(ref, root);
1441
+ }
1445
1442
  if (URL_SPEC.test(spec)) {
1446
1443
  return { config: { url: spec } };
1447
1444
  }
1448
- const absolute = isAbsolute2(spec) ? spec : join8(root, spec);
1445
+ const absolute = isAbsolute2(spec) ? spec : join9(root, spec);
1449
1446
  try {
1450
1447
  return { config: { content: await readFile2(absolute, "utf-8") } };
1451
1448
  } catch {
@@ -1483,13 +1480,16 @@ var buildReferenceFiles = async (options) => {
1483
1480
  }
1484
1481
  const built = await Promise.all(accepted.map(async (ref) => ({
1485
1482
  ref,
1486
- spec: await specConfiguration(ref.spec, root)
1483
+ spec: await specConfiguration(ref, root)
1487
1484
  })));
1488
1485
  const files = [];
1489
1486
  for (const { ref, spec } of built) {
1490
1487
  if (spec.warning) {
1491
1488
  warnings.push(spec.warning);
1492
1489
  }
1490
+ if (!spec.config) {
1491
+ continue;
1492
+ }
1493
1493
  const pagePath = referencePagePath(ref.route);
1494
1494
  const { theme, ...passthrough } = ref.scalar ?? {};
1495
1495
  files.push({
@@ -1521,6 +1521,15 @@ var resolveSearchPopular = (popular, basePath) => popular.map(({ href, icon, lab
1521
1521
  return page;
1522
1522
  });
1523
1523
 
1524
+ // src/search/source-pages.ts
1525
+ import { relative as relative2 } from "pathe";
1526
+ var sourcePages = (project) => project.manifest.routes.flatMap((route) => route.indexable && route.sourcePath ? [
1527
+ [
1528
+ relative2(project.context.root, route.sourcePath),
1529
+ { title: route.title, url: route.path }
1530
+ ]
1531
+ ] : []);
1532
+
1524
1533
  // src/theme/code-block-padding.ts
1525
1534
  var CODE_PADDING_BLOCK_REM = 1;
1526
1535
 
@@ -2077,14 +2086,60 @@ ${options.languageIcons ?? ""}
2077
2086
  transparent;
2078
2087
  }
2079
2088
 
2080
- /* Word wrap (markdown.code.wrap): long lines wrap instead of scrolling. The
2081
- attribute is set on <body> from config; default code keeps \`white-space: pre\`. */
2089
+ /* Word wrap: long lines wrap instead of scrolling, on every block
2090
+ (markdown.code.wrap, an attribute on <body>) or on one (\`\`\`ts wrap, which
2091
+ Shiki's fence-meta reader sets as data-wrap). Default code keeps
2092
+ \`white-space: pre\`. */
2082
2093
  [data-blume-code-wrap] pre,
2083
- [data-blume-code-wrap] pre code {
2094
+ [data-blume-code-wrap] pre code,
2095
+ pre[data-wrap],
2096
+ pre[data-wrap] code {
2084
2097
  overflow-wrap: break-word;
2085
2098
  white-space: pre-wrap;
2086
2099
  }
2087
2100
 
2101
+ /* An expandable block (\`\`\`ts expandable) starts collapsed to its first lines,
2102
+ faded out toward the cut, with a toggle under it (added by the layout
2103
+ script). Opened, it shows in full: no height cap and no inner scroll. The
2104
+ collapse needs that script to undo it, so a page without scripting shows
2105
+ the block the ordinary way. */
2106
+ @media (scripting: enabled) {
2107
+ .prose pre[data-expandable]:not([data-expanded]) > code {
2108
+ max-height: calc(${EXPANDABLE_VISIBLE_LINES}lh + ${CODE_SCROLL_INSET_REM}rem);
2109
+ mask-image: linear-gradient(to bottom, #000 calc(100% - 3lh), transparent);
2110
+ overflow-y: hidden;
2111
+ }
2112
+ }
2113
+
2114
+ .prose pre[data-expandable][data-expanded] > code {
2115
+ max-height: none;
2116
+ }
2117
+
2118
+ [data-blume-code-expand] {
2119
+ align-items: center;
2120
+ color: var(--blume-muted-foreground);
2121
+ display: flex;
2122
+ font-family: var(--font-sans);
2123
+ font-size: 0.75rem;
2124
+ font-weight: 500;
2125
+ gap: 0.25rem;
2126
+ justify-content: center;
2127
+ padding-top: 0.5rem;
2128
+ width: 100%;
2129
+ }
2130
+
2131
+ [data-blume-code-expand]:hover {
2132
+ color: var(--blume-foreground);
2133
+ }
2134
+
2135
+ [data-blume-code-expand] svg {
2136
+ transition: transform 150ms;
2137
+ }
2138
+
2139
+ [data-blume-code-expand][aria-expanded="true"] svg {
2140
+ transform: rotate(180deg);
2141
+ }
2142
+
2088
2143
  .prose :where(table) {
2089
2144
  font-size: 0.8125rem;
2090
2145
  }
@@ -2196,6 +2251,12 @@ blume-tabs pre[data-language],
2196
2251
  padding-inline-end: 3.5rem;
2197
2252
  }
2198
2253
 
2254
+ /* With the assistant on, an Ask button sits beside the copy button, so the
2255
+ line's tail clears both. */
2256
+ .prose :is(blume-tabs pre, .not-prose pre, pre:not([data-language])):not(.twoslash, .twoslash pre, blume-panel-tabs *):has(> [data-blume-ask]) > code {
2257
+ padding-inline-end: 5.75rem;
2258
+ }
2259
+
2199
2260
  blume-tabs pre[data-language]::before,
2200
2261
  .not-prose pre[data-language]::before {
2201
2262
  content: none;
@@ -2363,8 +2424,11 @@ pre:has(.line.focused):hover .line:not(.focused) {
2363
2424
  Strip the surrounding chrome so the printout is just the article. Scoped to
2364
2425
  the chrome itself, never bare \`header\`/\`aside\`: content renders those too
2365
2426
  (every Callout and Panel is an <aside>, every changelog Update has a
2366
- <header>), and they belong in the printout. \`body > header\` keeps a
2367
- \`layout.Header\` override out as well. */
2427
+ <header>), and they belong in the printout. \`body > header\` and
2428
+ \`body > footer\` keep \`layout.Header\` and \`layout.Footer\` overrides out
2429
+ as well. Everything after the article (directory and related-page cards,
2430
+ last updated, feedback, prev/next) is page chrome too, and so are the
2431
+ copy, ask, and expand buttons on code blocks. */
2368
2432
  @media print {
2369
2433
  [data-blume-banner],
2370
2434
  [data-blume-header],
@@ -2374,7 +2438,13 @@ pre:has(.line.focused):hover .line:not(.focused) {
2374
2438
  [data-blume-assistant-panel],
2375
2439
  [data-blume-page-actions],
2376
2440
  #blume-content > nav,
2377
- #blume-content > details {
2441
+ #blume-content > details,
2442
+ [data-blume-page-end],
2443
+ [data-blume-footer],
2444
+ body > footer,
2445
+ [data-blume-copy],
2446
+ [data-blume-ask],
2447
+ [data-blume-code-expand] {
2378
2448
  display: none !important;
2379
2449
  }
2380
2450
 
@@ -2385,6 +2455,23 @@ pre:has(.line.focused):hover .line:not(.focused) {
2385
2455
  overflow: visible;
2386
2456
  }
2387
2457
 
2458
+ /* A collapsed \`expandable\` block prints open: its toggle is hidden above,
2459
+ so the collapse would cut the block off at its first lines. Same
2460
+ selector as the collapse, so this later rule wins. */
2461
+ .prose pre[data-expandable]:not([data-expanded]) > code {
2462
+ mask-image: none;
2463
+ max-height: none;
2464
+ overflow-y: visible;
2465
+ }
2466
+
2467
+ /* The theme script switches a dark page to light for printing
2468
+ (\`beforeprint\`); a color transition would print mid-fade. */
2469
+ *,
2470
+ *::before,
2471
+ *::after {
2472
+ transition: none !important;
2473
+ }
2474
+
2388
2475
  #blume-content {
2389
2476
  padding: 0 !important;
2390
2477
  }
@@ -2446,15 +2533,15 @@ ${options.userCss}
2446
2533
  `;
2447
2534
 
2448
2535
  // src/theme/sources.ts
2449
- import { dirname as dirname5, isAbsolute as isAbsolute3, relative as relative2, resolve as resolve4 } from "pathe";
2536
+ import { dirname as dirname6, isAbsolute as isAbsolute3, relative as relative3, resolve as resolve4 } from "pathe";
2450
2537
  var SOURCE_DIRECTIVE = /@source(?<not>\s+not)?\s+(?<quote>["'])(?<path>[^"']+)\k<quote>/gu;
2451
2538
  var rebaseSourceDirectives = (css, options) => {
2452
- const base = dirname5(options.from);
2539
+ const base = dirname6(options.from);
2453
2540
  return css.replace(SOURCE_DIRECTIVE, (directive, not, quote, path) => {
2454
2541
  if (isAbsolute3(path)) {
2455
2542
  return directive;
2456
2543
  }
2457
- const rebased = relative2(options.to, resolve4(base, path));
2544
+ const rebased = relative3(options.to, resolve4(base, path));
2458
2545
  return `@source${not ?? ""} ${quote}${rebased}${quote}`;
2459
2546
  });
2460
2547
  };
@@ -2541,89 +2628,12 @@ var twoslashCss = () => {
2541
2628
  ${OVERRIDES}`;
2542
2629
  };
2543
2630
 
2544
- // src/astro/examples.ts
2545
- import { readFile as readFile3 } from "node:fs/promises";
2546
- import pMap from "p-map";
2547
- import { isAbsolute as isAbsolute4, join as join9, relative as relative3 } from "pathe";
2548
- import { glob } from "tinyglobby";
2549
- var FRAMEWORK_BY_EXT = {
2550
- astro: "astro",
2551
- jsx: "react",
2552
- svelte: "svelte",
2553
- tsx: "react",
2554
- vue: "vue"
2555
- };
2556
- var EXAMPLE_FILE = /\.(?<ext>astro|jsx|svelte|tsx|vue)$/u;
2557
- var DEFAULT_EXAMPLE_GLOB = "**/*.{astro,jsx,svelte,tsx,vue}";
2558
- var READ_CONCURRENCY = 16;
2559
- var EXAMPLE_SCAN_GLOB = "**/*.{astro,jsx,svelte,ts,tsx,vue}";
2560
- var exampleScanRoots = (root, examplesDir) => {
2561
- const path = relative3(root, examplesDir);
2562
- const outside = path.startsWith("..") || isAbsolute4(path);
2563
- return outside ? [root, examplesDir] : [root];
2564
- };
2565
- var GLOB_MAGIC = /[!*?[\]{}]/u;
2566
- var splitGlobBase = (pattern) => {
2567
- const segments = pattern.split("/");
2568
- const firstMagic = segments.findIndex((segment) => GLOB_MAGIC.test(segment));
2569
- return {
2570
- base: segments.slice(0, firstMagic).join("/"),
2571
- rest: segments.slice(firstMagic).join("/")
2572
- };
2573
- };
2574
- var discoverExamples = async (root, pattern = "examples") => {
2575
- const { base, rest } = GLOB_MAGIC.test(pattern) ? splitGlobBase(pattern) : { base: pattern, rest: DEFAULT_EXAMPLE_GLOB };
2576
- const dir = join9(root, base);
2577
- const matches = await glob([rest], {
2578
- absolute: true,
2579
- cwd: dir,
2580
- onlyFiles: true
2581
- });
2582
- const files = matches.toSorted();
2583
- const sources = await pMap(files, (file) => readFile3(file, "utf-8"), {
2584
- concurrency: READ_CONCURRENCY
2585
- });
2586
- const examples = [];
2587
- const warnings = [];
2588
- const seen = new Map;
2589
- const collectExample = (file, source) => {
2590
- const ext = file.match(EXAMPLE_FILE)?.groups?.ext;
2591
- const framework = ext ? FRAMEWORK_BY_EXT[ext] : undefined;
2592
- if (!(ext && framework)) {
2593
- return;
2594
- }
2595
- const path = relative3(dir, file).slice(0, -(ext.length + 1));
2596
- const existing = seen.get(path);
2597
- if (existing) {
2598
- warnings.push(`Two examples both resolve to "${path}" ("${existing}" and "${file}"); ignoring the second. Give them distinct paths.`);
2599
- return;
2600
- }
2601
- seen.set(path, file);
2602
- examples.push({
2603
- client: framework === "astro" ? undefined : readClientMode(source, file, warnings),
2604
- file,
2605
- framework,
2606
- lang: ext,
2607
- path,
2608
- source
2609
- });
2610
- };
2611
- for (const [index, file] of files.entries()) {
2612
- collectExample(file, sources[index] ?? "");
2613
- }
2614
- return { dir, examples, warnings };
2615
- };
2616
- var exampleMarkdownLookup = (examples) => Object.fromEntries(examples.map((example) => [
2617
- example.path,
2618
- { lang: example.lang, source: example.source }
2619
- ]));
2620
-
2621
2631
  // src/astro/render-deps.ts
2622
2632
  import { existsSync as existsSync5, realpathSync } from "node:fs";
2623
2633
  import {
2624
2634
  basename,
2625
- dirname as dirname6,
2626
- isAbsolute as isAbsolute5,
2635
+ dirname as dirname7,
2636
+ isAbsolute as isAbsolute4,
2627
2637
  join as join10,
2628
2638
  normalize,
2629
2639
  relative as relative4,
@@ -2631,7 +2641,7 @@ import {
2631
2641
  } from "pathe";
2632
2642
  var depsCandidates = (pkgDir) => [
2633
2643
  join10(pkgDir, "node_modules"),
2634
- dirname6(pkgDir)
2644
+ dirname7(pkgDir)
2635
2645
  ];
2636
2646
  var candidateHolding = (pkgDir, ...segments) => depsCandidates(pkgDir).find((dir) => existsSync5(join10(dir, ...segments))) ?? null;
2637
2647
  var packageDirFrom = (name, fromDir) => {
@@ -2641,7 +2651,7 @@ var packageDirFrom = (name, fromDir) => {
2641
2651
  if (existsSync5(join10(candidate, "package.json"))) {
2642
2652
  return normalize(realpathSync(candidate));
2643
2653
  }
2644
- const parent = dirname6(dir);
2654
+ const parent = dirname7(dir);
2645
2655
  if (parent === dir) {
2646
2656
  return null;
2647
2657
  }
@@ -2653,16 +2663,19 @@ var packageDirFrom = (name, fromDir) => {
2653
2663
  var BLUME_SRC = join11(packageRoot(), "src");
2654
2664
  var resolveReactCompiler = (config, needsReact, pkgDir = packageRoot()) => {
2655
2665
  if (!(needsReact && config.react.compiler)) {
2656
- return null;
2666
+ return false;
2657
2667
  }
2658
2668
  try {
2659
- return createRequire2(pathToFileURL(join11(pkgDir, "_.js")).href).resolve("babel-plugin-react-compiler");
2669
+ const astroReact = createRequire2(pathToFileURL(join11(pkgDir, "_.js")).href).resolve("@astrojs/react");
2670
+ const pluginReact = createRequire2(astroReact).resolve("@vitejs/plugin-react");
2671
+ createRequire2(pluginReact).resolve("oxc-transform-react");
2672
+ return true;
2660
2673
  } catch {
2661
- return null;
2674
+ return false;
2662
2675
  }
2663
2676
  };
2664
- var reactCompilerWarnings = (config, needsReact, compilerPath) => needsReact && config.react.compiler && !compilerPath ? [
2665
- "React Compiler is enabled but `babel-plugin-react-compiler` could not be resolved; falling back to an uncompiled build. Reinstall Blume, or set `react: { compiler: false }` to silence this."
2677
+ var reactCompilerWarnings = (config, needsReact, compiler) => needsReact && config.react.compiler && !compiler ? [
2678
+ "React Compiler is enabled but `oxc-transform-react` could not be resolved; falling back to an uncompiled build. Reinstall Blume, or set `react: { compiler: false }` to silence this."
2666
2679
  ] : [];
2667
2680
  var resolveAstroPackageJson = (modulesDir) => {
2668
2681
  try {
@@ -2679,7 +2692,7 @@ var resolvedAstroHit = (fromDir) => {
2679
2692
  if (pkg) {
2680
2693
  return { modulesDir, pkg };
2681
2694
  }
2682
- const parent = dirname7(dir);
2695
+ const parent = dirname8(dir);
2683
2696
  if (parent === dir) {
2684
2697
  return null;
2685
2698
  }
@@ -2712,13 +2725,13 @@ var linkDepsJunction = async (link, depsDir) => {
2712
2725
  return;
2713
2726
  }
2714
2727
  try {
2715
- if (resolve6(dirname7(link), await readlink(link)) === resolve6(depsDir)) {
2728
+ if (resolve6(dirname8(link), await readlink(link)) === resolve6(depsDir)) {
2716
2729
  return;
2717
2730
  }
2718
2731
  } catch {}
2719
2732
  await rm2(link, { force: true });
2720
2733
  }
2721
- await mkdir2(dirname7(link), { recursive: true });
2734
+ await mkdir2(dirname8(link), { recursive: true });
2722
2735
  await symlinkDir(depsDir, link);
2723
2736
  };
2724
2737
  var readPkgVersion = (pkgJsonPath) => {
@@ -2796,7 +2809,7 @@ var readOptional = async (path) => {
2796
2809
  return "";
2797
2810
  }
2798
2811
  try {
2799
- return await readFile4(path, "utf-8");
2812
+ return await readFile3(path, "utf-8");
2800
2813
  } catch {
2801
2814
  return "";
2802
2815
  }
@@ -2806,7 +2819,7 @@ var readUserCss = async (file, outputDir) => {
2806
2819
  return file ? rebaseSourceDirectives(css, { from: file, to: outputDir }) : css;
2807
2820
  };
2808
2821
  var detectNeedsReact = async (root) => {
2809
- const matches = await glob2(["**/*.{tsx,jsx}"], {
2822
+ const matches = await glob(["**/*.{tsx,jsx}"], {
2810
2823
  cwd: root,
2811
2824
  ignore: ["**/node_modules/**", "**/.blume/**", "**/dist/**"],
2812
2825
  onlyFiles: true
@@ -2814,15 +2827,15 @@ var detectNeedsReact = async (root) => {
2814
2827
  return matches.length > 0;
2815
2828
  };
2816
2829
  var containsMath = (content) => content.includes("$$") || content.includes("<Math");
2817
- var READ_CONCURRENCY2 = 16;
2830
+ var READ_CONCURRENCY = 16;
2818
2831
  var detectUsesMath = async (root, staged = []) => {
2819
- const files = await glob2(["**/*.{md,mdx}"], {
2832
+ const files = await glob(["**/*.{md,mdx}"], {
2820
2833
  cwd: root,
2821
2834
  ignore: ["**/node_modules/**", "**/.blume/**", "**/dist/**"],
2822
2835
  onlyFiles: true
2823
2836
  });
2824
- const contents = await pMap2(files, (file) => readOptional(join11(root, file)), {
2825
- concurrency: READ_CONCURRENCY2
2837
+ const contents = await pMap(files, (file) => readOptional(join11(root, file)), {
2838
+ concurrency: READ_CONCURRENCY
2826
2839
  });
2827
2840
  return [...contents, ...staged].some(containsMath);
2828
2841
  };
@@ -2839,7 +2852,7 @@ var loadIntegrationBridge = async (config, context) => {
2839
2852
  var writeIfChanged = async (path, content) => {
2840
2853
  let existing = null;
2841
2854
  try {
2842
- existing = await readFile4(path, "utf-8");
2855
+ existing = await readFile3(path, "utf-8");
2843
2856
  } catch {
2844
2857
  existing = null;
2845
2858
  }
@@ -2850,7 +2863,7 @@ var writeIfChanged = async (path, content) => {
2850
2863
  return true;
2851
2864
  };
2852
2865
  var pruneOrphans = async (srcDir, written) => {
2853
- const existing = await glob2("**/*", {
2866
+ const existing = await glob("**/*", {
2854
2867
  absolute: true,
2855
2868
  cwd: srcDir,
2856
2869
  onlyFiles: true
@@ -2904,7 +2917,7 @@ var readLogoSvg = (project, source) => {
2904
2917
  return file ? readFileSync3(file, "utf-8") : undefined;
2905
2918
  };
2906
2919
  var isStringShorthand = (value) => typeof value === "string";
2907
- var headerRepoUrl = (repo, derived) => {
2920
+ var footerRepoUrl = (repo, derived) => {
2908
2921
  if (isStringShorthand(repo)) {
2909
2922
  return repo;
2910
2923
  }
@@ -3019,10 +3032,31 @@ var resolveBanner = (config) => {
3019
3032
  return {
3020
3033
  content: banner.content,
3021
3034
  dismissible: banner.dismissible,
3022
- key: banner.id ?? banner.content,
3035
+ key: banner.id ?? resolveLocalizable(banner.content, undefined, config.i18n?.defaultLocale),
3023
3036
  link: banner.link
3024
3037
  };
3025
3038
  };
3039
+ var playgroundProxyPattern = (config) => withBasePath(config.basePath, "/_api-proxy");
3040
+ var resolveApiPages = (config) => {
3041
+ const { auth, playground, server } = config.api;
3042
+ const resolved = {
3043
+ playground: {
3044
+ enabled: playground.enabled,
3045
+ proxy: playground.proxy === true ? playgroundProxyPattern(config) : playground.proxy
3046
+ }
3047
+ };
3048
+ if (auth) {
3049
+ resolved.auth = auth;
3050
+ }
3051
+ if (server) {
3052
+ resolved.server = server;
3053
+ }
3054
+ return resolved;
3055
+ };
3056
+ var resolveFooter = (config) => {
3057
+ const { footer } = config;
3058
+ return footer && (footer.links.length > 0 || Object.keys(footer.socials).length > 0) ? footer : null;
3059
+ };
3026
3060
  var resolveOgMark = (project, siteLogo) => {
3027
3061
  const configured = project.config.seo.og.logo;
3028
3062
  if (configured === false) {
@@ -3056,6 +3090,18 @@ var resolveGithubData = (github) => github ? {
3056
3090
  owner: github.owner,
3057
3091
  repo: github.repo
3058
3092
  } : null;
3093
+ var resolveAssistant = (config) => {
3094
+ const { assistant } = config.ai;
3095
+ if (!assistant?.enabled) {
3096
+ return null;
3097
+ }
3098
+ return {
3099
+ captcha: assistant.captcha ? captchaSettings(assistant.captcha) : null,
3100
+ endpoint: assistant.endpoint ?? null,
3101
+ suggestions: assistant.suggestions,
3102
+ support: assistant.support ?? null
3103
+ };
3104
+ };
3059
3105
  var buildRuntimeData = (project) => {
3060
3106
  const { config, context, graph, manifest } = project;
3061
3107
  const { github } = config;
@@ -3070,28 +3116,28 @@ var buildRuntimeData = (project) => {
3070
3116
  const rel = relative5(context.root, sourcePath).split("\\").join("/");
3071
3117
  const editDir = trimChar(github?.dir ?? "", "/");
3072
3118
  const editPath = normalize2(editDir ? join11(editDir, rel) : rel);
3073
- if (editPath.startsWith("..") || isAbsolute6(editPath)) {
3119
+ if (editPath.startsWith("..") || isAbsolute5(editPath)) {
3074
3120
  return null;
3075
3121
  }
3076
3122
  return `${editBase}/${editPath}`;
3077
3123
  };
3078
3124
  const { i18n } = config;
3079
- const markUrl = headerRepoUrl(config.navigation.repo, repoUrl2);
3125
+ const markUrl = footerRepoUrl(config.navigation.repo, repoUrl2);
3080
3126
  const withRepoUrl = (nav) => ({
3081
3127
  ...nav,
3082
3128
  repoUrl: markUrl
3083
3129
  });
3084
3130
  const uiByLocale = i18n ? Object.fromEntries(i18n.locales.map(({ code }) => [
3085
3131
  code,
3086
- resolveUIStrings(code, {
3132
+ withChangelogIndexText(config, resolveUIStrings(code, {
3087
3133
  defaultLocale: i18n.defaultLocale,
3088
3134
  overrides: i18n.ui
3089
- })
3135
+ }), code)
3090
3136
  ])) : {};
3091
- const defaultUi = i18n ? resolveUIStrings(i18n.defaultLocale, {
3137
+ const defaultUi = withChangelogIndexText(config, i18n ? resolveUIStrings(i18n.defaultLocale, {
3092
3138
  defaultLocale: i18n.defaultLocale,
3093
3139
  overrides: i18n.ui
3094
- }) : EN_UI;
3140
+ }) : EN_UI, i18n?.defaultLocale);
3095
3141
  const navigationByLocale = i18n ? Object.fromEntries(i18n.locales.map(({ code }) => [
3096
3142
  code,
3097
3143
  withRepoUrl(graph.navigationByLocale[code] ?? {
@@ -3106,15 +3152,14 @@ var buildRuntimeData = (project) => {
3106
3152
  const data = {
3107
3153
  config: {
3108
3154
  analytics: config.analytics,
3155
+ api: resolveApiPages(config),
3109
3156
  appleIcon: resolveAppleIcon(project),
3110
- assistant: config.ai.assistant?.enabled ? {
3111
- endpoint: config.ai.assistant.endpoint ?? null,
3112
- suggestions: config.ai.assistant.suggestions
3113
- } : null,
3157
+ assistant: resolveAssistant(config),
3114
3158
  banner: resolveBanner(config),
3115
3159
  basePath: config.basePath,
3116
3160
  codeThemes: config.markdown.code.theme,
3117
3161
  codeWrap: config.markdown.code.wrap,
3162
+ consent: config.consent,
3118
3163
  dateFormat: config.dateFormat,
3119
3164
  description: config.description,
3120
3165
  discovery: {
@@ -3125,7 +3170,9 @@ var buildRuntimeData = (project) => {
3125
3170
  sitemap: config.seo.sitemap && Boolean(config.deployment.options.site)
3126
3171
  },
3127
3172
  favicon: resolveFavicon(project),
3128
- feedback: config.feedback,
3173
+ feedback: config.feedback.enabled,
3174
+ feedbackComments: config.feedback.comments,
3175
+ footer: resolveFooter(config),
3129
3176
  github: resolveGithubData(github),
3130
3177
  i18n: i18n ? {
3131
3178
  defaultLocale: i18n.defaultLocale,
@@ -3135,7 +3182,8 @@ var buildRuntimeData = (project) => {
3135
3182
  code,
3136
3183
  dir,
3137
3184
  label
3138
- }))
3185
+ })),
3186
+ routeByBrowserLanguage: i18n.routeByBrowserLanguage
3139
3187
  } : null,
3140
3188
  identity: config.seo.organization || config.seo.software ? {
3141
3189
  organization: config.seo.organization,
@@ -3147,6 +3195,8 @@ var buildRuntimeData = (project) => {
3147
3195
  name: config.agents.mcp.name ?? config.title,
3148
3196
  route: config.agents.mcp.route
3149
3197
  } : null,
3198
+ metatags: config.seo.metatags ?? null,
3199
+ narration: config.narration.enabled ? { generated: config.narration.provider !== null } : null,
3150
3200
  og: {
3151
3201
  description: resolveOgDescription(config),
3152
3202
  enabled: config.seo.og.enabled ?? false,
@@ -3157,6 +3207,7 @@ var buildRuntimeData = (project) => {
3157
3207
  openInChat: config.ai.openInChat,
3158
3208
  repoUrl: repoUrl2,
3159
3209
  search: {
3210
+ analytics: config.search.analytics,
3160
3211
  enabled: config.search.provider.mode !== "none",
3161
3212
  popular: resolveSearchPopular(config.search.popular, config.basePath),
3162
3213
  provider: config.search.provider.kind
@@ -3322,7 +3373,6 @@ var writeApiFiles = async (project, plan, write, data, mcp) => {
3322
3373
  await Promise.all(writes);
3323
3374
  };
3324
3375
  var PLAYGROUND_PROXY_ENTRY = join11("blume-openapi", "api-proxy.ts");
3325
- var playgroundProxyPattern = (config) => withBasePath(config.basePath, "/_api-proxy");
3326
3376
  var planPlaygroundProxy = (config, srcDir) => ({
3327
3377
  enabled: needsPlaygroundProxy(config),
3328
3378
  entrypoint: join11(srcDir, PLAYGROUND_PROXY_ENTRY),
@@ -3357,6 +3407,27 @@ var specOriginsOf = (spec) => {
3357
3407
  return [...origins];
3358
3408
  };
3359
3409
  var specOrigins = (data) => [...new Set(Object.values(data).flatMap(specOriginsOf))].toSorted();
3410
+ var originOf = (url) => {
3411
+ try {
3412
+ return new URL(url).origin;
3413
+ } catch {
3414
+ return null;
3415
+ }
3416
+ };
3417
+ var apiPageOrigins = (project) => {
3418
+ const { config } = project;
3419
+ if (!apiPagesUseBuiltinProxy(config)) {
3420
+ return [];
3421
+ }
3422
+ const targets = project.graph.pages.map((page) => parseApiEndpoint(page.meta.api ?? "")?.target ?? "");
3423
+ return [config.api.server ?? "", ...targets].flatMap((target) => {
3424
+ const origin = originOf(target);
3425
+ return origin ? [origin] : [];
3426
+ });
3427
+ };
3428
+ var apiPageProxyWarnings = (project) => apiPagesUseBuiltinProxy(project.config) && apiPageOrigins(project).length === 0 ? [
3429
+ "api.playground.proxy is true, but api.server isn't an absolute URL and no page's api frontmatter names one, so the built-in proxy has no origin to allow and will refuse every request the endpoint pages send. Set api.server to the API's URL, like https://api.acme.com/v1."
3430
+ ] : [];
3360
3431
  var proxyAllowlistWarnings = (config, data) => {
3361
3432
  const proxied = new Set(builtinProxyReferences(config).map((reference) => reference.slug));
3362
3433
  const warnings = [];
@@ -3378,9 +3449,12 @@ var writeAskFiles = async (project, srcDir, write, modules) => {
3378
3449
  modules.set("blume:ask-data", JSON.stringify(await buildAskData(project)));
3379
3450
  }
3380
3451
  await write(join11(srcDir, "pages", "api", "ask.ts"), askEndpointTemplate(backend, {
3452
+ captcha: assistant.captcha,
3381
3453
  cors: assistant.cors,
3382
3454
  instructions: assistant.instructions,
3383
- retrieval: assistant.retrieval
3455
+ rateLimit: project.config.rateLimit,
3456
+ retrieval: assistant.retrieval,
3457
+ tools: assistant.tools ?? backend.toolsByDefault
3384
3458
  }));
3385
3459
  };
3386
3460
  var writeNotFoundPage = async (write, srcDir, pages, contentPages) => {
@@ -3405,7 +3479,7 @@ var dependencyPreflight = async (project, frameworks) => {
3405
3479
  }
3406
3480
  return [diagnosticWarning(diagnostic)];
3407
3481
  };
3408
- var analyzeComponentsFile = async (componentsFile) => componentsFile ? analyzeComponentOverrides(await readFile4(componentsFile, "utf-8"), componentsFile) : emptyComponentOverrides();
3482
+ var analyzeComponentsFile = async (componentsFile) => componentsFile ? analyzeComponentOverrides(await readFile3(componentsFile, "utf-8"), componentsFile) : emptyComponentOverrides();
3409
3483
  var projectOgFonts = (project) => resolveOgFonts({
3410
3484
  locales: fontLocaleCodes(project.config.i18n),
3411
3485
  ogFonts: project.config.seo.og.fonts,
@@ -3444,6 +3518,7 @@ var generateRuntime = async (project) => {
3444
3518
  const askPath = join11(srcDir, "generated", "Ask.astro");
3445
3519
  const themePath = join11(srcDir, "generated", "app.css");
3446
3520
  const searchClientPath = join11(srcDir, "generated", "search-client.ts");
3521
+ const consentClientPath = join11(srcDir, "generated", "consent-client.ts");
3447
3522
  const featuresPath = join11(srcDir, "generated", "features.ts");
3448
3523
  const examplesPath = join11(srcDir, "generated", "examples.ts");
3449
3524
  const examplesThemePath = join11(srcDir, "generated", "examples.css");
@@ -3497,7 +3572,7 @@ var generateRuntime = async (project) => {
3497
3572
  const needsReact = detectedReact || assistantEnabled || frameworks.has("react");
3498
3573
  const needsVue = frameworks.has("vue");
3499
3574
  const needsSvelte = frameworks.has("svelte");
3500
- const reactCompilerPath = resolveReactCompiler(config, needsReact);
3575
+ const reactCompiler = resolveReactCompiler(config, needsReact);
3501
3576
  const ogRoutes = customOgRoutes(pages, config.title, config.seo.og.titles);
3502
3577
  const changelogIndex = hasGeneratedChangelog(project, pages);
3503
3578
  const mcp = planMcp(project, srcDir, pages);
@@ -3513,7 +3588,9 @@ var generateRuntime = async (project) => {
3513
3588
  pattern: playgroundProxy.pattern
3514
3589
  });
3515
3590
  }
3516
- const proxyOrigins = specOrigins(openApiData);
3591
+ const proxyOrigins = [
3592
+ ...new Set([...specOrigins(openApiData), ...apiPageOrigins(project)])
3593
+ ].toSorted();
3517
3594
  const hasStaged = staged.size > 0;
3518
3595
  const hasFilesystemSource = project.sources.some((source) => !source.staged);
3519
3596
  const docsCollection = resolveDocsCollection(config, context.root);
@@ -3523,6 +3600,7 @@ var generateRuntime = async (project) => {
3523
3600
  aliases: resolveTsconfigAliases(context.root),
3524
3601
  askPath,
3525
3602
  config,
3603
+ consentClientPath,
3526
3604
  contentRoot: docsCollection.base,
3527
3605
  contentRoutes,
3528
3606
  context,
@@ -3535,7 +3613,7 @@ var generateRuntime = async (project) => {
3535
3613
  needsSvelte,
3536
3614
  needsVue,
3537
3615
  pages,
3538
- reactCompilerPath,
3616
+ reactCompiler,
3539
3617
  searchClientPath,
3540
3618
  themePath
3541
3619
  })),
@@ -3569,7 +3647,7 @@ var generateRuntime = async (project) => {
3569
3647
  languageIcons,
3570
3648
  sources: [
3571
3649
  `${BLUME_SRC}/**/*.{astro,ts,tsx}`,
3572
- `${context.root}/**/*.{astro,mdx,ts,tsx}`
3650
+ `${context.root}/**/*.{astro,jsx,mdx,ts,tsx}`
3573
3651
  ],
3574
3652
  twoslashCss: twoslashCss(),
3575
3653
  userTheme
@@ -3580,7 +3658,7 @@ var generateRuntime = async (project) => {
3580
3658
  writeAskFiles(project, srcDir, write, modules),
3581
3659
  writeMcpFiles(mcp, write, agentData),
3582
3660
  writeApiFiles(project, api, write, agentData, mcp),
3583
- playgroundProxy.enabled ? write(playgroundProxy.entrypoint, playgroundProxyTemplate(proxyOrigins)) : Promise.resolve(false)
3661
+ playgroundProxy.enabled ? write(playgroundProxy.entrypoint, playgroundProxyTemplate(proxyOrigins, config.rateLimit)) : Promise.resolve(false)
3584
3662
  ]);
3585
3663
  if (config.seo.og.enabled) {
3586
3664
  await write(join11(srcDir, "pages", "og", "[...slug].png.ts"), ogEndpointTemplate(ogRoutes, {
@@ -3610,6 +3688,7 @@ var generateRuntime = async (project) => {
3610
3688
  }),
3611
3689
  writeNotFoundPage(write, srcDir, pages, project.graph.pages),
3612
3690
  write(searchClientPath, searchClientTemplate(config)),
3691
+ write(consentClientPath, consentClientTemplate(config.consent)),
3613
3692
  write(featuresPath, featuresTemplate(clientFeatures))
3614
3693
  ]);
3615
3694
  const searchAdapter = config.search.provider;
@@ -3619,7 +3698,7 @@ var generateRuntime = async (project) => {
3619
3698
  await write(join11(srcDir, "pages", "blume-search.json.ts"), searchEndpointTemplate());
3620
3699
  }
3621
3700
  if (searchAdapter.kind === "mixedbread") {
3622
- await write(join11(srcDir, "pages", "api", "search.ts"), mixedbreadSearchEndpointTemplate(searchAdapter.options));
3701
+ await write(join11(srcDir, "pages", "api", "search.ts"), mixedbreadSearchEndpointTemplate(searchAdapter.options, sourcePages(project), config.rateLimit));
3623
3702
  }
3624
3703
  await write(join11(srcDir, "generated", "includes.json"), `${JSON.stringify(buildIncludeGraph(project.graph.pages))}
3625
3704
  `);
@@ -3640,30 +3719,23 @@ var generateRuntime = async (project) => {
3640
3719
  const warnings = [
3641
3720
  ...depsLinkWarning ? [depsLinkWarning] : [],
3642
3721
  ...proxyAllowlistWarnings(config, openApiData),
3643
- ...reactCompilerWarnings(config, needsReact, reactCompilerPath),
3722
+ ...apiPageProxyWarnings(project),
3723
+ ...reactCompilerWarnings(config, needsReact, reactCompiler),
3644
3724
  ...mcp.warnings,
3645
3725
  ...islandDiscovery.warnings,
3646
3726
  ...exampleDiscovery.warnings,
3647
3727
  ...examplesWarnings,
3648
3728
  ...overrideWarnings
3649
3729
  ];
3650
- const navTargetRoutes = new Set([
3651
- ...project.graph.routes.keys(),
3652
- ...pages.map((page) => page.pattern),
3653
- ...referenceRoutes(config)
3654
- ]);
3655
- if (changelogIndex) {
3656
- navTargetRoutes.add("/changelog");
3657
- }
3658
3730
  warnings.push(...[
3659
- ...validateNavTargets(project.graph.navigation, navTargetRoutes),
3731
+ ...validateNavTargets(project.graph.navigation, navTargetRoutes(project, pages)),
3660
3732
  ...validateSearchPopularIcons(config.search.popular)
3661
3733
  ].map(diagnosticWarning));
3662
3734
  const knownComponentTags = new Set([
3663
3735
  ...islandDiscovery.islands.map((island) => island.name),
3664
3736
  ...overrideAnalysis.mdx.map((entry) => entry.key)
3665
3737
  ]);
3666
- warnings.push(...validateUsedComponents(project.graph.pages, knownComponentTags, new Set(registry.map((item) => item.name))).map(diagnosticWarning), ...dependencyWarnings);
3738
+ warnings.push(...validateUsedComponents(project.graph.pages, knownComponentTags, new Set(registry.map((item) => item.name))).map(diagnosticWarning), ...missingExampleDiagnostics(project.graph.pages, exampleDiscovery, context.root, knownComponentTags).map(diagnosticWarning), ...dependencyWarnings);
3667
3739
  if (hasScalarReferences(config)) {
3668
3740
  const references = await buildReferenceFiles({
3669
3741
  config,
@@ -3686,7 +3758,7 @@ var generateRuntime = async (project) => {
3686
3758
  return { structuralChange: structural.some(Boolean), warnings };
3687
3759
  };
3688
3760
 
3689
- export { publishBuildProject, refreshBlumeContent, showBlumeErrorOverlay, ogCacheDir, pruneCardCache, cardCacheTally, buildApiSpec, buildAskData, resolveOgFonts, buildThemeCss, buildReferenceFiles, tailwindEntryTemplate, examplesEntryTemplate, rebaseSourceDirectives, twoslashCss, EXAMPLE_SCAN_GLOB, exampleScanRoots, discoverExamples, exampleMarkdownLookup, packageDirFrom, detectNeedsReact, detectUsesMath, collectStaged, buildRuntimeData, PLAYGROUND_PROXY_ENTRY, playgroundProxyPattern, specOrigins, proxyAllowlistWarnings, analyzeComponentsFile, languageIconCssFor, clientFeaturesFor, generateRuntime };
3761
+ export { publishBuildProject, refreshBlumeContent, showBlumeErrorOverlay, ogCacheDir, pruneCardCache, cardCacheTally, buildApiSpec, buildAskData, resolveOgFonts, buildReferenceFiles, sourcePages, tailwindEntryTemplate, examplesEntryTemplate, rebaseSourceDirectives, twoslashCss, packageDirFrom, detectNeedsReact, detectUsesMath, collectStaged, playgroundProxyPattern, buildRuntimeData, PLAYGROUND_PROXY_ENTRY, specOrigins, proxyAllowlistWarnings, analyzeComponentsFile, languageIconCssFor, clientFeaturesFor, generateRuntime };
3690
3762
 
3691
- //# debugId=067C177A5C0052FA64756E2164756E21
3692
- //# sourceMappingURL=chunk-c8chx29p.js.map
3763
+ //# debugId=06510295E6F5A8F264756E2164756E21
3764
+ //# sourceMappingURL=chunk-ep6nd0rn.js.map