blume 2.1.0 → 2.1.2

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 (450) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/dist/cli/{chunk-ga0pf4aj.js → chunk-0n9xkp3d.js} +12 -3
  3. package/dist/cli/{chunk-ga0pf4aj.js.map → chunk-0n9xkp3d.js.map} +3 -3
  4. package/dist/cli/{chunk-43zcf4gz.js → chunk-0pmb4tr4.js} +541 -368
  5. package/dist/cli/chunk-0pmb4tr4.js.map +35 -0
  6. package/dist/cli/{chunk-9geymqns.js → chunk-0w6hs479.js} +15 -15
  7. package/dist/cli/{chunk-xkz5xbtv.js → chunk-124fvmzq.js} +2802 -1422
  8. package/dist/cli/chunk-124fvmzq.js.map +220 -0
  9. package/dist/cli/chunk-150jk7km.js +52 -0
  10. package/dist/cli/chunk-150jk7km.js.map +10 -0
  11. package/dist/cli/{chunk-y4ykbark.js → chunk-1f882900.js} +2 -2
  12. package/dist/cli/{chunk-5ffywsmb.js → chunk-297ajdcv.js} +8 -6
  13. package/dist/cli/{chunk-5ffywsmb.js.map → chunk-297ajdcv.js.map} +3 -3
  14. package/dist/cli/{chunk-h2a48yhd.js → chunk-32khwcb6.js} +120 -16
  15. package/dist/cli/{chunk-h2a48yhd.js.map → chunk-32khwcb6.js.map} +10 -10
  16. package/dist/cli/{chunk-5cg2rzgf.js → chunk-36bxs9c7.js} +20 -49
  17. package/dist/cli/{chunk-5cg2rzgf.js.map → chunk-36bxs9c7.js.map} +4 -5
  18. package/dist/cli/{chunk-py62fewh.js → chunk-53jqw8z0.js} +3 -3
  19. package/dist/cli/{chunk-5wj2qwn2.js → chunk-58bt3hag.js} +4 -4
  20. package/dist/cli/{chunk-e7vvk5ya.js → chunk-5cmts6dv.js} +3 -3
  21. package/dist/cli/{chunk-y5h4r2y0.js → chunk-60hz265r.js} +15 -5
  22. package/dist/cli/chunk-60hz265r.js.map +10 -0
  23. package/dist/cli/chunk-74wfhv79.js +65 -0
  24. package/dist/cli/chunk-74wfhv79.js.map +10 -0
  25. package/dist/cli/{chunk-g2z9x01v.js → chunk-9qzgg6mj.js} +3 -3
  26. package/dist/cli/{chunk-q3wxxq39.js → chunk-a57yh0h9.js} +5 -5
  27. package/dist/cli/{chunk-713mngdq.js → chunk-ave1wcbr.js} +76 -10
  28. package/dist/cli/chunk-ave1wcbr.js.map +14 -0
  29. package/dist/cli/{chunk-2n4ps1b3.js → chunk-bqxaqn5p.js} +40 -22
  30. package/dist/cli/chunk-bqxaqn5p.js.map +15 -0
  31. package/dist/cli/{chunk-jnwj5kjj.js → chunk-bxwhtvw8.js} +20 -7
  32. package/dist/cli/{chunk-jnwj5kjj.js.map → chunk-bxwhtvw8.js.map} +3 -3
  33. package/dist/cli/chunk-ckrcm08h.js +324 -0
  34. package/dist/cli/chunk-ckrcm08h.js.map +14 -0
  35. package/dist/cli/{chunk-2f3ndkpw.js → chunk-desvm72z.js} +3 -3
  36. package/dist/cli/{chunk-gp84za0h.js → chunk-dhwtqnnd.js} +2 -2
  37. package/dist/cli/{chunk-4h8z9vv5.js → chunk-dpy8qdjf.js} +93 -47
  38. package/dist/cli/chunk-dpy8qdjf.js.map +17 -0
  39. package/dist/cli/{chunk-2f7n4qzt.js → chunk-dqhg54mr.js} +1 -1
  40. package/dist/cli/{chunk-0gz36akr.js → chunk-dv2z0rzf.js} +21 -5
  41. package/dist/cli/chunk-dv2z0rzf.js.map +12 -0
  42. package/dist/cli/{chunk-cm89scdv.js → chunk-es8h0v3j.js} +9 -11
  43. package/dist/cli/{chunk-cm89scdv.js.map → chunk-es8h0v3j.js.map} +3 -3
  44. package/dist/cli/{chunk-zhvd6adm.js → chunk-gfc5fqvf.js} +14 -14
  45. package/dist/cli/{chunk-nd1821sk.js → chunk-gxtg6ed2.js} +33 -19
  46. package/dist/cli/chunk-gxtg6ed2.js.map +10 -0
  47. package/dist/cli/{chunk-p804f3pe.js → chunk-hvcxng5f.js} +6 -6
  48. package/dist/cli/{chunk-ta27feev.js → chunk-j1x92mx9.js} +21 -2
  49. package/dist/cli/chunk-j1x92mx9.js.map +10 -0
  50. package/dist/cli/{chunk-rekqz4qg.js → chunk-k3gr1nm9.js} +19 -16
  51. package/dist/cli/chunk-k3gr1nm9.js.map +10 -0
  52. package/dist/cli/{chunk-1n228xqb.js → chunk-kdpzw38a.js} +2 -2
  53. package/dist/cli/{chunk-cy5bm0j0.js → chunk-ms9z66nz.js} +2 -2
  54. package/dist/cli/{chunk-cy5bm0j0.js.map → chunk-ms9z66nz.js.map} +2 -2
  55. package/dist/cli/{chunk-zf748avv.js → chunk-nbyvgnnm.js} +193 -286
  56. package/dist/cli/chunk-nbyvgnnm.js.map +36 -0
  57. package/dist/cli/{chunk-6bm0xpgd.js → chunk-s0bdnc7v.js} +2 -2
  58. package/dist/cli/{chunk-yxmk4pec.js → chunk-sc93apfs.js} +17 -16
  59. package/dist/cli/{chunk-yxmk4pec.js.map → chunk-sc93apfs.js.map} +3 -3
  60. package/dist/cli/{chunk-cmtcnh9f.js → chunk-tfycddbt.js} +2 -2
  61. package/dist/cli/{chunk-9xr4dgee.js → chunk-twy7psdz.js} +29 -16
  62. package/dist/cli/chunk-twy7psdz.js.map +10 -0
  63. package/dist/cli/{chunk-ntv4qrt7.js → chunk-y4msrwm9.js} +15 -15
  64. package/dist/cli/{chunk-yj17vs39.js → chunk-ydp3065p.js} +5 -5
  65. package/dist/cli/index.js +24 -19
  66. package/dist/cli/index.js.map +3 -3
  67. package/dist/types/ai/ask-context.d.ts +6 -2
  68. package/dist/types/ai/ask.d.ts +24 -5
  69. package/dist/types/ai/component-markdown.d.ts +2 -0
  70. package/dist/types/ai/openapi-components.d.ts +4 -1
  71. package/dist/types/analytics/clics.d.ts +37 -0
  72. package/dist/types/analytics/index.d.ts +2 -0
  73. package/dist/types/analytics/schema.d.ts +18 -0
  74. package/dist/types/astro/integration.d.ts +11 -4
  75. package/dist/types/astro/markdown-negotiation.d.ts +3 -0
  76. package/dist/types/astro/pages.d.ts +10 -0
  77. package/dist/types/cli/init/scaffold.d.ts +1 -1
  78. package/dist/types/components/content/api-field.d.ts +4 -1
  79. package/dist/types/components/content/api-page.d.ts +6 -1
  80. package/dist/types/components/openapi/code-samples.d.ts +29 -0
  81. package/dist/types/components/openapi/helpers.d.ts +22 -1
  82. package/dist/types/components/openapi/security.d.ts +10 -0
  83. package/dist/types/components/openapi/snippets.d.ts +60 -0
  84. package/dist/types/core/changelog-index.d.ts +8 -0
  85. package/dist/types/core/config-input.d.ts +37 -6
  86. package/dist/types/core/data.d.ts +4 -0
  87. package/dist/types/core/i18n-ui.d.ts +2 -0
  88. package/dist/types/core/links.d.ts +8 -0
  89. package/dist/types/core/powered-by.d.ts +12 -0
  90. package/dist/types/core/probe.d.ts +2 -0
  91. package/dist/types/core/project-graph.d.ts +6 -0
  92. package/dist/types/core/redirect-patterns.d.ts +11 -3
  93. package/dist/types/core/schema.d.ts +228 -3
  94. package/dist/types/core/sources/cache.d.ts +3 -0
  95. package/dist/types/core/sources/contentful-rich-text.d.ts +11 -2
  96. package/dist/types/core/sources/contentful.d.ts +17 -1
  97. package/dist/types/core/sources/lexical.d.ts +5 -0
  98. package/dist/types/core/sources/lower.d.ts +10 -2
  99. package/dist/types/core/sources/normalize.d.ts +20 -1
  100. package/dist/types/core/sources/notion.d.ts +8 -0
  101. package/dist/types/core/sources/remote.d.ts +37 -10
  102. package/dist/types/core/sources/sanity.d.ts +1 -1
  103. package/dist/types/core/types.d.ts +17 -0
  104. package/dist/types/deploy/adapter-output.d.ts +2 -1
  105. package/dist/types/deploy/adapters/cloudflare.d.ts +7 -5
  106. package/dist/types/deploy/adapters/node.d.ts +58 -23
  107. package/dist/types/deploy/adapters/registry.d.ts +10 -0
  108. package/dist/types/deploy/adapters/types.d.ts +3 -2
  109. package/dist/types/deploy/cloudflare-negotiation.d.ts +5 -2
  110. package/dist/types/deploy/node-headers.d.ts +12 -4
  111. package/dist/types/deploy/platforms/cloudflare.d.ts +10 -7
  112. package/dist/types/deploy/platforms/node.d.ts +3 -1
  113. package/dist/types/deploy/platforms/types.d.ts +18 -7
  114. package/dist/types/deploy/platforms/vercel.d.ts +21 -2
  115. package/dist/types/deploy/redirects.d.ts +17 -1
  116. package/dist/types/deploy/sitemap.d.ts +2 -1
  117. package/dist/types/deploy/vercel-negotiation.d.ts +44 -21
  118. package/dist/types/narration/build.d.ts +34 -12
  119. package/dist/types/narration/provider.d.ts +96 -8
  120. package/dist/types/openapi/checks.d.ts +27 -0
  121. package/dist/types/openapi/graphql.d.ts +6 -0
  122. package/dist/types/openapi/model.d.ts +15 -4
  123. package/dist/types/openapi/parse.d.ts +3 -0
  124. package/dist/types/openapi/references.d.ts +16 -0
  125. package/dist/types/openapi/sentence.d.ts +11 -1
  126. package/dist/types/ratelimit/index.d.ts +1 -1
  127. package/dist/types/ratelimit/schema.d.ts +8 -0
  128. package/dist/types/ratelimit/upstash.d.ts +39 -14
  129. package/dist/types/reference/graphql.d.ts +76 -1
  130. package/dist/types/reference/index.d.ts +1 -1
  131. package/dist/types/reference/openapi.d.ts +2 -2
  132. package/dist/types/reference/options.d.ts +37 -1
  133. package/dist/types/reference/schema.d.ts +84 -0
  134. package/dist/types/search/adapters/registry.d.ts +3 -0
  135. package/dist/types/search/adapters/typesense.d.ts +14 -4
  136. package/dist/types/search/build.d.ts +3 -1
  137. package/dist/types/search/orama-index.d.ts +9 -9
  138. package/dist/types/search/sync/algolia.d.ts +5 -2
  139. package/dist/types/search/sync/index.d.ts +3 -1
  140. package/dist/types/search/sync/typesense.d.ts +11 -7
  141. package/dist/types/seo/jsonld.d.ts +11 -6
  142. package/dist/types/sources/contentful.d.ts +16 -0
  143. package/dist/types/sources/github-releases.d.ts +8 -1
  144. package/dist/types/sources/notion.d.ts +8 -0
  145. package/dist/types/sources/payload.d.ts +2 -0
  146. package/dist/types/sources/registry.d.ts +63 -0
  147. package/dist/types/sources/shared.d.ts +3 -0
  148. package/dist/types/sources/strapi.d.ts +2 -0
  149. package/docs/01-quickstart.mdx +4 -2
  150. package/docs/02-deployment.mdx +59 -13
  151. package/docs/03-upgrading.mdx +2 -1
  152. package/docs/04-migrating.mdx +9 -9
  153. package/docs/08-faq.mdx +12 -12
  154. package/docs/advanced/changelog.mdx +30 -2
  155. package/docs/advanced/custom-pages.mdx +1 -1
  156. package/docs/advanced/skills.mdx +1 -1
  157. package/docs/cli/audit.mdx +30 -7
  158. package/docs/cli/doctor.mdx +6 -2
  159. package/docs/cli/evals.mdx +4 -4
  160. package/docs/cli/translate.mdx +1 -0
  161. package/docs/cli/validate.mdx +4 -3
  162. package/docs/configuration/analytics.mdx +19 -1
  163. package/docs/configuration/assistant.mdx +6 -2
  164. package/docs/configuration/customization.mdx +4 -2
  165. package/docs/configuration/export.mdx +5 -3
  166. package/docs/configuration/index.mdx +4 -2
  167. package/docs/configuration/narration.mdx +43 -6
  168. package/docs/configuration/rate-limiting.mdx +23 -2
  169. package/docs/configuration/search.mdx +37 -14
  170. package/docs/content/components.mdx +2 -2
  171. package/docs/content/frontmatter.mdx +5 -3
  172. package/docs/content/i18n.mdx +2 -2
  173. package/docs/content/includes.mdx +1 -1
  174. package/docs/content/navigation.mdx +8 -6
  175. package/docs/content/sources/contentful.mdx +9 -4
  176. package/docs/content/sources/custom.mdx +7 -3
  177. package/docs/content/sources/github-releases.mdx +12 -2
  178. package/docs/content/sources/index.mdx +3 -3
  179. package/docs/content/sources/notion.mdx +17 -2
  180. package/docs/content/sources/obsidian.mdx +3 -1
  181. package/docs/content/sources/payload.mdx +5 -2
  182. package/docs/content/sources/remote-mdx.mdx +6 -0
  183. package/docs/content/sources/sanity.mdx +4 -2
  184. package/docs/content/sources/strapi.mdx +5 -2
  185. package/docs/content/syntax.mdx +2 -2
  186. package/docs/discoverability/agent-discovery.mdx +1 -1
  187. package/docs/discoverability/index.mdx +1 -1
  188. package/docs/discoverability/json-api.mdx +2 -0
  189. package/docs/discoverability/llms-txt.mdx +1 -1
  190. package/docs/discoverability/markdown.mdx +3 -1
  191. package/docs/discoverability/mcp.mdx +6 -0
  192. package/docs/discoverability/sitemap-and-robots.mdx +1 -1
  193. package/docs/discoverability/structured-data.mdx +8 -6
  194. package/docs/references/api-pages.mdx +1 -1
  195. package/docs/references/asyncapi.mdx +5 -1
  196. package/docs/references/graphql.mdx +15 -1
  197. package/docs/references/openapi.mdx +64 -8
  198. package/package.json +9 -9
  199. package/skills/blume/SKILL.md +1 -1
  200. package/skills/blume-migrate/SKILL.md +2 -2
  201. package/skills/blume-migrate/assets/{oxfmt@0.67.0.patch → oxfmt@0.71.0.patch} +7 -7
  202. package/skills/blume-migrate/references/docusaurus.md +4 -4
  203. package/skills/blume-migrate/references/fumadocs.md +17 -13
  204. package/skills/blume-migrate/references/monorepo.md +5 -5
  205. package/skills/blume-migrate/references/nextra.md +8 -5
  206. package/skills/blume-migrate/references/starlight.md +9 -7
  207. package/src/ai/ask-context.ts +33 -3
  208. package/src/ai/ask-limits.ts +13 -0
  209. package/src/ai/ask.ts +24 -6
  210. package/src/ai/changelog-markdown.ts +11 -6
  211. package/src/ai/component-markdown.ts +1 -1
  212. package/src/ai/cors.ts +12 -3
  213. package/src/ai/mcp/query.ts +14 -6
  214. package/src/ai/openapi-components.ts +28 -4
  215. package/src/ai/relative-links.ts +4 -38
  216. package/src/analytics/clics.ts +58 -0
  217. package/src/analytics/head.ts +5 -0
  218. package/src/analytics/index.ts +2 -0
  219. package/src/analytics/schema.ts +2 -0
  220. package/src/astro/generate.ts +91 -56
  221. package/src/astro/integration.ts +72 -22
  222. package/src/astro/markdown-negotiation.ts +3 -0
  223. package/src/astro/module-types.ts +3 -1
  224. package/src/astro/pages.ts +23 -0
  225. package/src/astro/render-deps.ts +10 -5
  226. package/src/astro/runtime-deps.ts +23 -2
  227. package/src/astro/templates.ts +129 -81
  228. package/src/audit/catalog.ts +19 -3
  229. package/src/audit/checks/links.ts +14 -1
  230. package/src/audit/checks/network.ts +110 -6
  231. package/src/audit/checks/redirects.ts +6 -4
  232. package/src/audit/checks/robots.ts +58 -2
  233. package/src/audit/run.ts +3 -0
  234. package/src/audit/types.ts +2 -0
  235. package/src/audit/url.ts +14 -5
  236. package/src/blume-modules.d.ts +5 -1
  237. package/src/cli/args.ts +51 -0
  238. package/src/cli/build-failure.ts +23 -0
  239. package/src/cli/commands/audit.ts +10 -1
  240. package/src/cli/commands/dev.ts +18 -2
  241. package/src/cli/commands/doctor.ts +45 -12
  242. package/src/cli/commands/eval.ts +36 -4
  243. package/src/cli/commands/init.ts +6 -4
  244. package/src/cli/commands/validate.ts +10 -1
  245. package/src/cli/init/scaffold.ts +9 -6
  246. package/src/cli/prepare.ts +6 -3
  247. package/src/cli/required-secrets.ts +3 -2
  248. package/src/components/content/ApiPlayground.astro +6 -2
  249. package/src/components/content/api-field.ts +4 -1
  250. package/src/components/content/api-page.ts +31 -7
  251. package/src/components/content/mermaid-element.ts +15 -1
  252. package/src/components/content/view-switcher.ts +7 -4
  253. package/src/components/islands/hooks.ts +27 -1
  254. package/src/components/layout/NavTree.astro +49 -5
  255. package/src/components/layout/NavTreeScript.astro +18 -0
  256. package/src/components/layout/PageActions.astro +139 -24
  257. package/src/components/layout/PageLayout.astro +13 -3
  258. package/src/components/layout/RootLayout.astro +27 -14
  259. package/src/components/layout/Search.astro +17 -3
  260. package/src/components/layout/TableOfContents.astro +24 -17
  261. package/src/components/layout/analytics-client.ts +8 -8
  262. package/src/components/layout/head-scripts.ts +6 -1
  263. package/src/components/layout/search/algolia.ts +10 -1
  264. package/src/components/layout/search/analytics.ts +42 -14
  265. package/src/components/layout/search/endpoint.ts +48 -5
  266. package/src/components/layout/search/pagefind.ts +114 -5
  267. package/src/components/layout/search/types.ts +12 -0
  268. package/src/components/layout/search/typesense.ts +18 -6
  269. package/src/components/openapi/AsyncApiOperation.astro +14 -7
  270. package/src/components/openapi/Authorization.astro +10 -0
  271. package/src/components/openapi/GraphqlOperation.astro +5 -0
  272. package/src/components/openapi/Operation.astro +24 -1
  273. package/src/components/openapi/ParametersTable.astro +8 -4
  274. package/src/components/openapi/Playground.astro +7 -1
  275. package/src/components/openapi/RequestBody.astro +19 -2
  276. package/src/components/openapi/Responses.astro +1 -0
  277. package/src/components/openapi/SchemaTable.astro +15 -3
  278. package/src/components/openapi/async-snippets.ts +61 -5
  279. package/src/components/openapi/async.ts +123 -29
  280. package/src/components/openapi/graphql-helpers.ts +35 -12
  281. package/src/components/openapi/helpers.ts +36 -2
  282. package/src/components/openapi/message-model.ts +54 -11
  283. package/src/components/openapi/message.ts +14 -4
  284. package/src/components/openapi/operation-model.ts +16 -7
  285. package/src/components/openapi/playground-client.ts +77 -58
  286. package/src/components/openapi/playground-schema.ts +1 -1
  287. package/src/components/openapi/schema-tree.ts +44 -14
  288. package/src/components/openapi/security.ts +10 -0
  289. package/src/components/openapi/snippets.ts +5 -3
  290. package/src/components/openapi/validate-json.ts +4 -3
  291. package/src/components/powered-by-middleware.ts +33 -0
  292. package/src/core/changelog-index.ts +31 -1
  293. package/src/core/component-diagnostics.ts +53 -0
  294. package/src/core/component-overrides.ts +32 -0
  295. package/src/core/config-input.ts +42 -6
  296. package/src/core/data.ts +2 -0
  297. package/src/core/diagnostics.ts +5 -0
  298. package/src/core/i18n-ui.ts +2 -0
  299. package/src/core/includes.ts +1 -1
  300. package/src/core/links.ts +47 -17
  301. package/src/core/powered-by.ts +12 -0
  302. package/src/core/probe.ts +26 -6
  303. package/src/core/project-graph.ts +59 -18
  304. package/src/core/redirect-patterns.ts +36 -7
  305. package/src/core/schema.ts +26 -6
  306. package/src/core/sources/cache.ts +6 -0
  307. package/src/core/sources/contentful-rich-text.ts +29 -6
  308. package/src/core/sources/contentful.ts +135 -25
  309. package/src/core/sources/filesystem.ts +26 -4
  310. package/src/core/sources/github-releases.ts +12 -1
  311. package/src/core/sources/lexical.ts +15 -10
  312. package/src/core/sources/lower.ts +19 -3
  313. package/src/core/sources/mdx-remote.ts +62 -10
  314. package/src/core/sources/normalize.ts +227 -41
  315. package/src/core/sources/notion.ts +34 -10
  316. package/src/core/sources/obsidian.ts +16 -3
  317. package/src/core/sources/payload.ts +38 -15
  318. package/src/core/sources/remote.ts +72 -15
  319. package/src/core/sources/resolve.ts +11 -1
  320. package/src/core/sources/sanity.ts +43 -25
  321. package/src/core/sources/strapi.ts +2 -2
  322. package/src/core/types.ts +18 -0
  323. package/src/core/ui-packs/ar.ts +1 -0
  324. package/src/core/ui-packs/bg.ts +1 -0
  325. package/src/core/ui-packs/bn.ts +1 -0
  326. package/src/core/ui-packs/ca.ts +1 -0
  327. package/src/core/ui-packs/cs.ts +1 -0
  328. package/src/core/ui-packs/da.ts +1 -0
  329. package/src/core/ui-packs/de.ts +1 -0
  330. package/src/core/ui-packs/el.ts +1 -0
  331. package/src/core/ui-packs/es.ts +1 -0
  332. package/src/core/ui-packs/fa.ts +1 -0
  333. package/src/core/ui-packs/fi.ts +1 -0
  334. package/src/core/ui-packs/fr.ts +1 -0
  335. package/src/core/ui-packs/he.ts +1 -0
  336. package/src/core/ui-packs/hi.ts +1 -0
  337. package/src/core/ui-packs/hr.ts +1 -0
  338. package/src/core/ui-packs/hu.ts +1 -0
  339. package/src/core/ui-packs/id.ts +1 -0
  340. package/src/core/ui-packs/it.ts +1 -0
  341. package/src/core/ui-packs/ja.ts +1 -0
  342. package/src/core/ui-packs/ko.ts +1 -0
  343. package/src/core/ui-packs/nl.ts +1 -0
  344. package/src/core/ui-packs/no.ts +1 -0
  345. package/src/core/ui-packs/pl.ts +1 -0
  346. package/src/core/ui-packs/pt-br.ts +1 -0
  347. package/src/core/ui-packs/pt.ts +1 -0
  348. package/src/core/ui-packs/ro.ts +1 -0
  349. package/src/core/ui-packs/ru.ts +1 -0
  350. package/src/core/ui-packs/sk.ts +1 -0
  351. package/src/core/ui-packs/sr.ts +1 -0
  352. package/src/core/ui-packs/sv.ts +1 -0
  353. package/src/core/ui-packs/th.ts +1 -0
  354. package/src/core/ui-packs/tr.ts +1 -0
  355. package/src/core/ui-packs/uk.ts +1 -0
  356. package/src/core/ui-packs/vi.ts +1 -0
  357. package/src/core/ui-packs/zh-tw.ts +1 -0
  358. package/src/core/ui-packs/zh.ts +1 -0
  359. package/src/deploy/adapter-output.ts +7 -2
  360. package/src/deploy/adapters/cloudflare.ts +7 -5
  361. package/src/deploy/adapters/node.ts +47 -9
  362. package/src/deploy/adapters/types.ts +7 -3
  363. package/src/deploy/artifacts.ts +2 -1
  364. package/src/deploy/cloudflare-negotiation.ts +36 -7
  365. package/src/deploy/headers.ts +15 -1
  366. package/src/deploy/node-headers.ts +32 -20
  367. package/src/deploy/platforms/cloudflare.ts +14 -9
  368. package/src/deploy/platforms/netlify.ts +2 -1
  369. package/src/deploy/platforms/node.ts +12 -2
  370. package/src/deploy/platforms/types.ts +21 -7
  371. package/src/deploy/platforms/vercel.ts +115 -17
  372. package/src/deploy/redirects.ts +66 -6
  373. package/src/deploy/rss.ts +3 -1
  374. package/src/deploy/sitemap.ts +39 -5
  375. package/src/deploy/vercel-negotiation.ts +325 -103
  376. package/src/eval/agents.ts +18 -1
  377. package/src/eval/prompts.ts +6 -3
  378. package/src/eval/report.ts +34 -13
  379. package/src/eval/run.ts +5 -0
  380. package/src/markdown/base-links.ts +15 -14
  381. package/src/markdown/package-commands.ts +9 -8
  382. package/src/markdown/relative-links.ts +3 -2
  383. package/src/narration/build.ts +218 -40
  384. package/src/narration/provider.ts +89 -9
  385. package/src/openapi/checks.ts +273 -0
  386. package/src/openapi/graphql-build.ts +21 -0
  387. package/src/openapi/graphql.ts +11 -0
  388. package/src/openapi/model.ts +15 -3
  389. package/src/openapi/parse.ts +127 -2
  390. package/src/openapi/references.ts +43 -3
  391. package/src/openapi/render-mdx.ts +68 -8
  392. package/src/openapi/sentence.ts +29 -2
  393. package/src/openapi/source.ts +39 -14
  394. package/src/ratelimit/index.ts +1 -1
  395. package/src/ratelimit/runtime.ts +37 -19
  396. package/src/ratelimit/upstash.ts +40 -10
  397. package/src/reference/graphql.ts +15 -1
  398. package/src/reference/index.ts +1 -0
  399. package/src/reference/openapi.ts +2 -2
  400. package/src/reference/options.ts +29 -1
  401. package/src/registry/eject.ts +8 -2
  402. package/src/search/adapters/locale-scope.ts +30 -0
  403. package/src/search/adapters/typesense.ts +14 -4
  404. package/src/search/build.ts +21 -3
  405. package/src/search/orama-index.ts +163 -31
  406. package/src/search/source-pages.ts +29 -0
  407. package/src/search/sync/algolia.ts +99 -9
  408. package/src/search/sync/index.ts +52 -13
  409. package/src/search/sync/typesense.ts +72 -27
  410. package/src/seo/jsonld.ts +38 -20
  411. package/src/sources/contentful.ts +12 -0
  412. package/src/sources/github-releases.ts +7 -1
  413. package/src/sources/notion.ts +7 -0
  414. package/src/sources/shared.ts +3 -0
  415. package/src/theme/color.ts +9 -10
  416. package/src/theme/entry.ts +43 -6
  417. package/src/translate/validate.ts +23 -1
  418. package/dist/cli/chunk-0gz36akr.js.map +0 -12
  419. package/dist/cli/chunk-2n4ps1b3.js.map +0 -15
  420. package/dist/cli/chunk-43zcf4gz.js.map +0 -36
  421. package/dist/cli/chunk-4ejxbzee.js +0 -39
  422. package/dist/cli/chunk-4ejxbzee.js.map +0 -10
  423. package/dist/cli/chunk-4h8z9vv5.js.map +0 -16
  424. package/dist/cli/chunk-713mngdq.js.map +0 -14
  425. package/dist/cli/chunk-9xr4dgee.js.map +0 -10
  426. package/dist/cli/chunk-amrb6hgh.js +0 -145
  427. package/dist/cli/chunk-amrb6hgh.js.map +0 -11
  428. package/dist/cli/chunk-nd1821sk.js.map +0 -10
  429. package/dist/cli/chunk-rekqz4qg.js.map +0 -10
  430. package/dist/cli/chunk-ta27feev.js.map +0 -10
  431. package/dist/cli/chunk-xkz5xbtv.js.map +0 -213
  432. package/dist/cli/chunk-y5h4r2y0.js.map +0 -10
  433. package/dist/cli/chunk-zf748avv.js.map +0 -37
  434. /package/dist/cli/{chunk-9geymqns.js.map → chunk-0w6hs479.js.map} +0 -0
  435. /package/dist/cli/{chunk-y4ykbark.js.map → chunk-1f882900.js.map} +0 -0
  436. /package/dist/cli/{chunk-py62fewh.js.map → chunk-53jqw8z0.js.map} +0 -0
  437. /package/dist/cli/{chunk-5wj2qwn2.js.map → chunk-58bt3hag.js.map} +0 -0
  438. /package/dist/cli/{chunk-e7vvk5ya.js.map → chunk-5cmts6dv.js.map} +0 -0
  439. /package/dist/cli/{chunk-g2z9x01v.js.map → chunk-9qzgg6mj.js.map} +0 -0
  440. /package/dist/cli/{chunk-q3wxxq39.js.map → chunk-a57yh0h9.js.map} +0 -0
  441. /package/dist/cli/{chunk-2f3ndkpw.js.map → chunk-desvm72z.js.map} +0 -0
  442. /package/dist/cli/{chunk-gp84za0h.js.map → chunk-dhwtqnnd.js.map} +0 -0
  443. /package/dist/cli/{chunk-2f7n4qzt.js.map → chunk-dqhg54mr.js.map} +0 -0
  444. /package/dist/cli/{chunk-zhvd6adm.js.map → chunk-gfc5fqvf.js.map} +0 -0
  445. /package/dist/cli/{chunk-p804f3pe.js.map → chunk-hvcxng5f.js.map} +0 -0
  446. /package/dist/cli/{chunk-1n228xqb.js.map → chunk-kdpzw38a.js.map} +0 -0
  447. /package/dist/cli/{chunk-6bm0xpgd.js.map → chunk-s0bdnc7v.js.map} +0 -0
  448. /package/dist/cli/{chunk-cmtcnh9f.js.map → chunk-tfycddbt.js.map} +0 -0
  449. /package/dist/cli/{chunk-ntv4qrt7.js.map → chunk-y4msrwm9.js.map} +0 -0
  450. /package/dist/cli/{chunk-yj17vs39.js.map → chunk-ydp3065p.js.map} +0 -0
@@ -123,7 +123,7 @@ var CHECKS = [
123
123
  },
124
124
  {
125
125
  category: "duplicates",
126
- fix: "Merge the pages, or set `seo.canonical` on all but one.",
126
+ fix: "Merge the pages, or point `seo.canonical` on all but one at the page to index.",
127
127
  id: "BLUME_AUDIT_DUPLICATE_CONTENT",
128
128
  severity: "warning",
129
129
  tier: "static",
@@ -315,7 +315,7 @@ var CHECKS = [
315
315
  },
316
316
  {
317
317
  category: "redirects",
318
- fix: "Remove the redirect, or delete the page it shadows — the page wins and the redirect never fires.",
318
+ fix: "Remove the redirect, or delete the page it shadows — a path can't be both, and which one readers get depends on the host.",
319
319
  id: "BLUME_AUDIT_REDIRECT_SOURCE_IS_PAGE",
320
320
  severity: "error",
321
321
  tier: "static",
@@ -329,6 +329,14 @@ var CHECKS = [
329
329
  tier: "network",
330
330
  title: "HTTPS to HTTP redirect"
331
331
  },
332
+ {
333
+ category: "redirects",
334
+ fix: "Deploy the redirect file your host reads (see Redirects in the deployment docs), or name the host in `deployment`.",
335
+ id: "BLUME_AUDIT_REDIRECT_NOT_SERVED",
336
+ severity: "error",
337
+ tier: "network",
338
+ title: "Live site doesn't redirect as configured"
339
+ },
332
340
  {
333
341
  category: "social",
334
342
  fix: "Add a `description` — Blume fills the rest of the Open Graph tags for you.",
@@ -515,7 +523,7 @@ var CHECKS = [
515
523
  },
516
524
  {
517
525
  category: "sitemap",
518
- fix: "Remove `draft`/`hidden`/`noindex` from the page's frontmatter if it should be indexed.",
526
+ fix: "Remove `draft`/`hidden`/`noindex` from the page's frontmatter if it should be indexed. A `public/sitemap.xml` replaces the generated sitemap, so add the page there or delete that file.",
519
527
  id: "BLUME_AUDIT_INDEXABLE_PAGE_NOT_IN_SITEMAP",
520
528
  severity: "warning",
521
529
  tier: "static",
@@ -609,6 +617,14 @@ var CHECKS = [
609
617
  tier: "static",
610
618
  title: "robots.txt disallows a page that is in the sitemap"
611
619
  },
620
+ {
621
+ category: "robots",
622
+ fix: "Narrow or remove the rule in that crawler's `User-agent` group if it should read these pages. Blocking an AI crawler on purpose is fine; skip this check.",
623
+ id: "BLUME_AUDIT_ROBOTS_BLOCKS_CRAWLER",
624
+ severity: "warning",
625
+ tier: "static",
626
+ title: "robots.txt blocks one crawler from pages in the sitemap"
627
+ },
612
628
  {
613
629
  category: "robots",
614
630
  fix: "Set `deployment.site` so robots.txt can reference the sitemap.",
@@ -993,5 +1009,5 @@ var launchInstalledAgent = async (bin, prompt, platform = process.platform) => {
993
1009
 
994
1010
  export { CHECKS, finding, formatReport, reportJson, formatCatalog, AGENTS, writeAgentReport, fixPrompt, launchAgent, launchInstalledAgent };
995
1011
 
996
- //# debugId=FF011B636C2DD0A664756E2164756E21
997
- //# sourceMappingURL=chunk-0gz36akr.js.map
1012
+ //# debugId=5656C1323785977064756E2164756E21
1013
+ //# sourceMappingURL=chunk-dv2z0rzf.js.map
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/audit/report.ts", "../src/audit/catalog.ts", "../src/audit/agent.ts"],
4
+ "sourcesContent": [
5
+ "import { colors } from \"consola/utils\";\nimport type { ColorFunction } from \"consola/utils\";\nimport { relative } from \"pathe\";\n\nimport { countBySeverity } from \"../core/diagnostics.ts\";\nimport type { Diagnostic, DiagnosticSeverity } from \"../core/types.ts\";\nimport { CHECKS, checkMeta } from \"./catalog.ts\";\nimport type { CheckId } from \"./catalog.ts\";\nimport type { AuditResult } from \"./run.ts\";\nimport type { AuditCategory, AuditTier } from \"./types.ts\";\n\nconst SEVERITY_COLOR = {\n error: colors.red,\n info: colors.blue,\n warning: colors.yellow,\n} satisfies Record<DiagnosticSeverity, ColorFunction>;\n\nconst GLYPH = {\n error: \"✖\",\n info: \"ℹ\",\n warning: \"⚠\",\n} satisfies Record<DiagnosticSeverity, string>;\n\n/** How many affected pages to list before collapsing the rest. */\nconst PREVIEW = 3;\n\n/** The skippable tiers, each with the flag that runs it. */\nconst TIER_FLAGS: { tier: AuditTier; flag: string }[] = [\n { flag: \"--external\", tier: \"external\" },\n { flag: \"--url <origin>\", tier: \"network\" },\n];\n\ninterface CheckRollup {\n id: CheckId;\n count: number;\n /** Distinct affected URLs — one page can carry several findings. */\n pages: number;\n severity: DiagnosticSeverity;\n category: AuditCategory;\n title: string;\n findings: Diagnostic[];\n}\n\nconst SEVERITY_ORDER = {\n error: 0,\n info: 2,\n warning: 1,\n} satisfies Record<DiagnosticSeverity, number>;\n\n/**\n * The group's severity: the worst of its findings'. A check can downgrade a\n * finding at runtime (an external link answering 503 is a warning, not the\n * catalog's error), and the group's glyph must agree with the summary counts.\n */\nconst worstSeverity = (findings: Diagnostic[]): DiagnosticSeverity => {\n let worst: DiagnosticSeverity = \"info\";\n for (const finding of findings) {\n if (SEVERITY_ORDER[finding.severity] < SEVERITY_ORDER[worst]) {\n worst = finding.severity;\n }\n }\n return worst;\n};\n\n/** The first finding per affected URL, in report order. */\nconst firstPerPage = (findings: Diagnostic[]): Diagnostic[] => {\n const seen = new Set<string | undefined>();\n return findings.filter((finding) => {\n if (seen.has(finding.url)) {\n return false;\n }\n seen.add(finding.url);\n return true;\n });\n};\n\n/**\n * Group findings by check. This is the difference between a report people read\n * and one they close: 214 pages × 6 findings is an unreadable wall, but \"Meta\n * description missing — 12 pages\" is a to-do list.\n */\nexport const rollup = (diagnostics: Diagnostic[]): CheckRollup[] => {\n const groups = new Map<string, Diagnostic[]>();\n for (const diagnostic of diagnostics) {\n const group = groups.get(diagnostic.code);\n if (group) {\n group.push(diagnostic);\n } else {\n groups.set(diagnostic.code, [diagnostic]);\n }\n }\n\n const checks = [...groups.entries()].map(([id, findings]) => {\n // SAFETY: audit findings are only ever created through `finding()`, whose\n // codes are the check catalog's ids.\n const checkId = id as CheckId;\n const { category, title } = checkMeta(checkId);\n return {\n category,\n count: findings.length,\n findings,\n id: checkId,\n pages: firstPerPage(findings).length,\n severity: worstSeverity(findings),\n title,\n };\n });\n\n // Rank each category by the worst thing in it, so the categories that need\n // attention lead. Sorting on severity alone would interleave the categories\n // and print \"content\" three separate times.\n const worst = new Map<AuditCategory, number>();\n for (const check of checks) {\n const rank = SEVERITY_ORDER[check.severity];\n worst.set(\n check.category,\n Math.min(worst.get(check.category) ?? rank, rank)\n );\n }\n\n return checks.toSorted(\n (a, b) =>\n (worst.get(a.category) ?? 0) - (worst.get(b.category) ?? 0) ||\n a.category.localeCompare(b.category) ||\n SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity] ||\n b.count - a.count\n );\n};\n\n/** Categories that had no findings but were never run, and the flag that runs them. */\nconst skippedTiers = (tiers: Record<AuditTier, boolean>): string[] =>\n TIER_FLAGS.filter(({ tier }) => !tiers[tier]).map(({ flag, tier }) => {\n const label = CHECKS.filter((check) => check.tier === tier).length;\n return ` ${colors.dim(`⊘ ${tier.padEnd(12)} skipped — pass ${flag} (${label} checks)`)}`;\n });\n\n/** How many checks actually ran, i.e. those whose tier was enabled. */\nconst activeChecks = (tiers: Record<AuditTier, boolean>): number =>\n CHECKS.filter((check) => tiers[check.tier]).length;\n\n/**\n * Individual checks performed: every rule that ran, against every page crawled.\n * The headline number — it's what makes \"39 warnings\" legible as a proportion\n * rather than a bare count.\n */\nexport const auditCount = (result: AuditResult): number =>\n activeChecks(result.tiers) * result.pages;\n\nconst summaryLine = (\n counts: Record<DiagnosticSeverity, number>,\n audits: number\n): string =>\n [\n `${audits.toLocaleString(\"en-US\")} audit${audits === 1 ? \"\" : \"s\"}`,\n `${counts.error} error${counts.error === 1 ? \"\" : \"s\"}`,\n `${counts.warning} warning${counts.warning === 1 ? \"\" : \"s\"}`,\n `${counts.info} note${counts.info === 1 ? \"\" : \"s\"}`,\n ].join(\" · \");\n\n/** One affected page: the URL, and the source file that fixes it. */\nconst findingLine = (diagnostic: Diagnostic, root: string): string => {\n const url = diagnostic.url ?? \"\";\n const source = diagnostic.file\n ? colors.dim(\n `${relative(root, diagnostic.file)}${\n diagnostic.line === undefined ? \"\" : `:${diagnostic.line}`\n }`\n )\n : \"\";\n // padEnd alone yields no gap once the URL reaches the column width.\n return ` ${url.padEnd(34)} ${source}`.trimEnd();\n};\n\n/**\n * Render the audit as a report grouped by check, with each check's affected\n * pages, the source file to edit, and the fix.\n */\nexport const formatReport = (\n result: AuditResult,\n root: string,\n options: { verbose?: boolean } = {}\n): string => {\n const counts = countBySeverity(result.diagnostics);\n const groups = rollup(result.diagnostics);\n const lines: string[] = [];\n\n const where = result.origin\n ? `${relative(root, result.staticDir) || \"dist\"} + ${result.origin}`\n : `${relative(root, result.staticDir) || \"dist\"} · offline`;\n lines.push(\n \"\",\n ` ${colors.bold(\"blume audit\")} ${colors.dim(`${result.pages} pages · ${where}`)}`,\n ` ${summaryLine(counts, auditCount(result))}`,\n \"\"\n );\n\n if (groups.length === 0) {\n lines.push(` ${colors.green(\"✔ No issues found.\")}`, \"\");\n }\n\n let category: AuditCategory | null = null;\n for (const group of groups) {\n const { category: next } = group;\n if (next !== category) {\n category = next;\n lines.push(` ${colors.bold(category)}`, \"\");\n }\n\n const color = SEVERITY_COLOR[group.severity];\n const pages = `${group.pages} page${group.pages === 1 ? \"\" : \"s\"}`;\n lines.push(\n ` ${color(`${GLYPH[group.severity]} ${group.title}`)} ${colors.dim(pages)}`\n );\n\n // The preview lists affected pages, each once; --verbose lists every\n // finding, since each one's message names a different specific.\n const shown = options.verbose\n ? group.findings\n : firstPerPage(group.findings).slice(0, PREVIEW);\n for (const diagnostic of shown) {\n lines.push(findingLine(diagnostic, root));\n // The message names the specifics the rolled-up line can't — which target\n // is broken, what the duplicate is — so --verbose prints it per finding.\n if (options.verbose) {\n lines.push(` ${colors.dim(diagnostic.message)}`);\n }\n }\n const hidden = options.verbose ? 0 : group.pages - shown.length;\n if (hidden > 0) {\n lines.push(` ${colors.dim(`… and ${hidden} more (--verbose)`)}`);\n }\n\n // Findings share the catalog's fix unless one overrode it (a navigation\n // entry, a page generated from an API spec), so each distinct fix is\n // printed once.\n const fixes = new Set(\n group.findings.flatMap((finding) =>\n finding.suggestion ? [finding.suggestion] : []\n )\n );\n for (const fix of fixes) {\n lines.push(` ${colors.cyan(`fix: ${fix}`)}`);\n }\n lines.push(\"\");\n }\n\n const skipped = skippedTiers(result.tiers);\n if (skipped.length > 0) {\n lines.push(...skipped, \"\");\n }\n\n return lines.join(\"\\n\");\n};\n\n/**\n * The machine-readable report. The existing `diagnostics` + `summary` shape is\n * preserved exactly — anything already parsing `blume validate --json` keeps\n * working — with the audit-specific rollup added alongside it.\n */\nexport const reportJson = (result: AuditResult, root: string): string => {\n const diagnostics = result.diagnostics.map((diagnostic) =>\n diagnostic.file\n ? { ...diagnostic, file: relative(root, diagnostic.file) }\n : diagnostic\n );\n return `${JSON.stringify(\n {\n audit: {\n /** Checks run × pages crawled — the total number of individual audits. */\n audits: auditCount(result),\n checks: rollup(result.diagnostics).map((group) => ({\n category: group.category,\n count: group.count,\n id: group.id,\n severity: group.severity,\n })),\n origin: result.origin,\n pages: result.pages,\n staticDir: relative(root, result.staticDir),\n tiers: result.tiers,\n },\n diagnostics,\n summary: countBySeverity(result.diagnostics),\n },\n null,\n 2\n )}\\n`;\n};\n\n/** `--list-checks`: the catalog, which is also the docs' source of truth. */\nexport const formatCatalog = (): string => {\n const lines: string[] = [\"\"];\n let category: AuditCategory | null = null;\n for (const check of [...CHECKS].toSorted((a, b) =>\n a.category.localeCompare(b.category)\n )) {\n const { category: next } = check;\n if (next !== category) {\n category = next;\n lines.push(` ${colors.bold(category)}`);\n }\n const tier =\n check.tier === \"static\" ? \"\" : ` ${colors.dim(`[${check.tier}]`)}`;\n lines.push(\n ` ${SEVERITY_COLOR[check.severity](GLYPH[check.severity])} ${check.id.replace(\"BLUME_AUDIT_\", \"\").toLowerCase().padEnd(34)} ${colors.dim(check.title)}${tier}`\n );\n }\n lines.push(\"\", ` ${CHECKS.length} checks.`, \"\");\n return lines.join(\"\\n\");\n};\n",
6
+ "import type { Diagnostic } from \"../core/types.ts\";\nimport type { CheckMeta } from \"./types.ts\";\n\n/**\n * Every check `blume audit` can report.\n *\n * This is deliberately ~76 checks, not the ~173 rows an Ahrefs site audit\n * lists. Ahrefs crawls the open web, so its list is padded with rows that are\n * structurally impossible for an Astro-built Blume site, and shipping those as\n * permanent zeroes teaches people to ignore the report. What was dropped, and\n * why:\n *\n * - **Every `nofollow` check** (~6 rows, including all four \"nofollow incoming\n * internal links\" variants). `RootLayout.astro` only ever emits `<meta\n * name=\"robots\" content=\"noindex\">`; Blume has no way to emit `nofollow`, so\n * they could never fire. Hand-written `rel=\"nofollow\"` in MDX is still caught\n * by `INTERNAL_LINK_NOFOLLOW`.\n * - **The whole JavaScript + CSS section** (~11 rows: \"JS redirects\", \"CSS\n * redirects\", \"page has redirected JS/CSS\", \"HTTPS page links to HTTP\n * JS/CSS\"…). Vite emits content-hashed, existent, non-redirecting bundles.\n * Collapsed into one `SUBRESOURCE_MISSING`.\n * - **Ahrefs' indexable/non-indexable duplicates** (~20 rows). Carried instead\n * by `PageSnapshot.indexable` on a single finding.\n * - **\"Only one dofollow incoming internal link\"** and **\"page has no outgoing\n * links\"**. Blume's sidebar links every page from every page, so these fire on\n * ~100% of pages. Pure noise.\n * - **\"3XX redirect\"** and **\"302 redirect\"**: having a redirect is inventory,\n * not a finding. **\"HTTP to HTTPS redirect\"** is correct behavior.\n * - **\"Font size too small\" / \"tap targets too close\" / \"content not sized\n * correctly\"**: properties of the theme, identical on every page. A regression\n * there is a Blume bug, not a user finding.\n * - **\"Document uses plugins\"** and **\"poor FID\"** (FID is deprecated; lab\n * Lighthouse cannot measure INP, so we report TBT and say so).\n * - **\"More than three parameters in URL\"**: a static docs site emits no query\n * strings in its own links.\n * - **\"Page in multiple sitemaps\"**: Blume emits exactly one sitemap.\n * - **Core Web Vitals** (LCP/CLS/INP): these need a real browser. Rather than\n * ship a `--lighthouse` flag that silently reports nothing, they are deferred\n * until Lighthouse is actually wired in. A tier the audit cannot run is worse\n * than one it openly doesn't have.\n *\n * Severity discipline: `error` means \"this is definitely broken\". Anything\n * advisory ships as `warning`/`info`. One noisy check and the whole command gets\n * switched off.\n */\nexport const CHECKS = [\n // Content\n {\n category: \"content\",\n fix: \"Add a `title` to the page's frontmatter.\",\n id: \"BLUME_AUDIT_TITLE_MISSING\",\n severity: \"error\",\n tier: \"static\",\n title: \"Title tag missing or empty\",\n },\n {\n category: \"content\",\n fix: \"Remove the extra <title> from the page's layout or MDX.\",\n id: \"BLUME_AUDIT_TITLE_MULTIPLE\",\n severity: \"error\",\n tier: \"static\",\n title: \"Multiple title tags\",\n },\n {\n category: \"content\",\n fix: \"Rewrite `title` in the frontmatter to fit the length range.\",\n id: \"BLUME_AUDIT_TITLE_LENGTH\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Title too long or too short\",\n },\n {\n category: \"content\",\n fix: \"Add a `description` to the page's frontmatter.\",\n id: \"BLUME_AUDIT_DESCRIPTION_MISSING\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Meta description missing or empty\",\n },\n {\n category: \"content\",\n fix: \"Remove the extra description <meta> from the page's layout or MDX.\",\n id: \"BLUME_AUDIT_DESCRIPTION_MULTIPLE\",\n severity: \"error\",\n tier: \"static\",\n title: \"Multiple meta description tags\",\n },\n {\n category: \"content\",\n fix: \"Rewrite `description` in the frontmatter to fit the length range.\",\n id: \"BLUME_AUDIT_DESCRIPTION_LENGTH\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Meta description too long or too short\",\n },\n {\n category: \"content\",\n fix: \"Give the page a `title` — Blume renders it as the page's <h1>.\",\n id: \"BLUME_AUDIT_H1_MISSING\",\n severity: \"warning\",\n tier: \"static\",\n title: \"H1 tag missing or empty\",\n },\n {\n category: \"content\",\n fix: \"Demote the extra `# Heading` in the body to `##` — Blume already renders `title` as the h1.\",\n id: \"BLUME_AUDIT_H1_MULTIPLE\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Multiple H1 tags\",\n },\n {\n category: \"content\",\n fix: \"Expand the page, or fold it into a larger one.\",\n id: \"BLUME_AUDIT_LOW_WORD_COUNT\",\n severity: \"info\",\n tier: \"static\",\n title: \"Low word count\",\n },\n {\n category: \"content\",\n fix: \"Adjust the heading to the next level down — skipped levels break table-of-contents nesting and screen-reader outlines.\",\n id: \"BLUME_AUDIT_HEADING_SKIP\",\n severity: \"info\",\n tier: \"static\",\n title: \"Heading levels skip (e.g. h2 to h4)\",\n },\n {\n category: \"content\",\n fix: \"Correct the `date`, or hold the page back until it is meant to be live.\",\n id: \"BLUME_AUDIT_FUTURE_DATED_PAGE\",\n severity: \"info\",\n tier: \"static\",\n title: \"Page is dated in the future\",\n },\n {\n category: \"content\",\n fix: \"Restore the viewport <meta> in your ejected layout.\",\n id: \"BLUME_AUDIT_VIEWPORT_MISSING\",\n severity: \"error\",\n tier: \"static\",\n title: \"Viewport not set\",\n },\n\n // Duplicates\n {\n category: \"duplicates\",\n fix: \"Give each page a distinct `title` — search engines show it as the result headline.\",\n id: \"BLUME_AUDIT_DUPLICATE_TITLE\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Duplicate title\",\n },\n {\n category: \"duplicates\",\n fix: \"Give each page a distinct `description`.\",\n id: \"BLUME_AUDIT_DUPLICATE_DESCRIPTION\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Duplicate meta description\",\n },\n {\n category: \"duplicates\",\n fix: \"Merge the pages, or point `seo.canonical` on all but one at the page to index.\",\n id: \"BLUME_AUDIT_DUPLICATE_CONTENT\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Duplicate pages without canonical\",\n },\n\n // Indexability\n {\n category: \"indexability\",\n fix: \"Set `deployment.site` in blume.config.ts to the site's public URL.\",\n id: \"BLUME_AUDIT_SITE_NOT_SET\",\n severity: \"warning\",\n tier: \"static\",\n title: \"deployment.site is not set\",\n },\n {\n category: \"indexability\",\n fix: \"Audit a production-like build (e.g. `VERCEL=1 VERCEL_PROJECT_PRODUCTION_URL=<host> blume build`) or the deployment itself with `--url <origin>`. Do not hardcode `deployment.site` — the platform sets it on every deploy.\",\n id: \"BLUME_AUDIT_SITE_INFERRED_AT_DEPLOY\",\n severity: \"info\",\n tier: \"static\",\n title: \"deployment.site is inferred at deploy time\",\n },\n {\n category: \"indexability\",\n fix: \"Drop the canonical from noindex pages — Google treats the pairing as contradictory and may ignore one of the two.\",\n id: \"BLUME_AUDIT_CANONICAL_ON_NOINDEX\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Page is noindex but declares a canonical\",\n },\n {\n category: \"indexability\",\n fix: \"Rebuild without `--preview` before deploying, or remove `draft: true` if the page is ready to ship.\",\n id: \"BLUME_AUDIT_DRAFT_PAGE_PUBLISHED\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Draft page is in the build\",\n },\n {\n category: \"indexability\",\n fix: \"Set `deployment.site` so Blume can emit absolute canonical URLs.\",\n id: \"BLUME_AUDIT_CANONICAL_MISSING\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Canonical URL missing\",\n },\n {\n category: \"indexability\",\n fix: \"Point `seo.canonical` at this page, or remove it to use the default self-canonical.\",\n id: \"BLUME_AUDIT_CANONICAL_NOT_SELF\",\n severity: \"info\",\n tier: \"static\",\n title: \"Non-canonical page\",\n },\n {\n category: \"indexability\",\n fix: \"Point `seo.canonical` at a page that exists and doesn't redirect.\",\n id: \"BLUME_AUDIT_CANONICAL_BAD_TARGET\",\n severity: \"error\",\n tier: \"static\",\n title: \"Canonical points to a broken or redirecting page\",\n },\n {\n category: \"indexability\",\n fix: \"Use the same protocol in `seo.canonical` as in `deployment.site`.\",\n id: \"BLUME_AUDIT_CANONICAL_PROTOCOL_MISMATCH\",\n severity: \"error\",\n tier: \"static\",\n title: \"Canonical protocol does not match the site\",\n },\n {\n category: \"indexability\",\n fix: \"Remove `noindex` from the page's frontmatter if it should be indexed.\",\n id: \"BLUME_AUDIT_ROBOTS_META_UNEXPECTED\",\n severity: \"info\",\n tier: \"static\",\n title: \"Page is not indexable\",\n },\n {\n category: \"indexability\",\n fix: \"Split the page — Googlebot stops reading an HTML document at 2 MB.\",\n id: \"BLUME_AUDIT_HTML_TOO_LARGE\",\n severity: \"error\",\n tier: \"static\",\n title: \"Page exceeds Googlebot's 2 MB crawl limit\",\n },\n {\n category: \"indexability\",\n fix: \"Remove the X-Robots-Tag header, or align it with the page's robots meta.\",\n id: \"BLUME_AUDIT_ROBOTS_HEADER_CONFLICT\",\n severity: \"error\",\n tier: \"network\",\n title: \"X-Robots-Tag header conflicts with the page's robots meta\",\n },\n\n // Links\n {\n category: \"links\",\n fix: \"Fix the link target, or create the page it points at.\",\n id: \"BLUME_AUDIT_LINK_TO_BROKEN\",\n severity: \"error\",\n tier: \"static\",\n title: \"Page has links to a broken page\",\n },\n {\n category: \"links\",\n fix: \"Link straight to the destination instead of through the redirect.\",\n id: \"BLUME_AUDIT_LINK_TO_REDIRECT\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Page has links to a redirect\",\n },\n {\n category: \"links\",\n fix: \"Link to this page from the body of a related page.\",\n id: \"BLUME_AUDIT_ORPHAN_PAGE\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Orphan page (only reachable from navigation)\",\n },\n {\n category: \"links\",\n fix: \"Use a root-relative path (`/docs/x`) so the link survives previews and `basePath`.\",\n id: \"BLUME_AUDIT_INTERNAL_LINK_ABSOLUTE\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Internal link hardcodes the site's own origin\",\n },\n {\n category: \"links\",\n fix: 'Drop `rel=\"nofollow\"` — it stops this page passing authority internally.',\n id: \"BLUME_AUDIT_INTERNAL_LINK_NOFOLLOW\",\n severity: \"info\",\n tier: \"static\",\n title: \"Page has nofollow outgoing internal links\",\n },\n {\n category: \"links\",\n fix: \"Check `basePath` / `deployment.base` — a trailing slash there produces `//`.\",\n id: \"BLUME_AUDIT_DOUBLE_SLASH_URL\",\n severity: \"error\",\n tier: \"static\",\n title: \"Double slash in URL\",\n },\n {\n category: \"links\",\n fix: \"Point the fragment at a heading that exists on the target page, or fix the heading it meant.\",\n id: \"BLUME_AUDIT_ANCHOR_BROKEN\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Link fragment matches no id on the target page\",\n },\n {\n category: \"links\",\n fix: \"Rename the source file to a lowercase, hyphenated slug — and add a redirect from the old URL if it was already published.\",\n id: \"BLUME_AUDIT_URL_STYLE\",\n severity: \"info\",\n tier: \"static\",\n title: \"URL contains uppercase, underscores, or spaces\",\n },\n\n // Redirects\n {\n category: \"redirects\",\n fix: \"Point the redirect at a page that exists.\",\n id: \"BLUME_AUDIT_REDIRECT_BROKEN\",\n severity: \"error\",\n tier: \"static\",\n title: \"Broken redirect\",\n },\n {\n category: \"redirects\",\n fix: \"Break the cycle in `redirects` — it never resolves.\",\n id: \"BLUME_AUDIT_REDIRECT_LOOP\",\n severity: \"error\",\n tier: \"static\",\n title: \"Redirect loop\",\n },\n {\n category: \"redirects\",\n fix: \"Point every hop straight at the final destination.\",\n id: \"BLUME_AUDIT_REDIRECT_CHAIN\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Redirect chain\",\n },\n {\n category: \"redirects\",\n fix: \"Use a real redirect in `blume.config.ts` instead of a meta refresh.\",\n id: \"BLUME_AUDIT_META_REFRESH\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Meta refresh redirect\",\n },\n {\n category: \"redirects\",\n fix: \"Remove the redirect, or delete the page it shadows — a path can't be both, and which one readers get depends on the host.\",\n id: \"BLUME_AUDIT_REDIRECT_SOURCE_IS_PAGE\",\n severity: \"error\",\n tier: \"static\",\n title: \"Redirect source is also a real page\",\n },\n {\n category: \"redirects\",\n fix: \"Redirect to the HTTPS URL.\",\n id: \"BLUME_AUDIT_REDIRECT_TO_HTTP\",\n severity: \"error\",\n tier: \"network\",\n title: \"HTTPS to HTTP redirect\",\n },\n {\n category: \"redirects\",\n fix: \"Deploy the redirect file your host reads (see Redirects in the deployment docs), or name the host in `deployment`.\",\n id: \"BLUME_AUDIT_REDIRECT_NOT_SERVED\",\n severity: \"error\",\n tier: \"network\",\n title: \"Live site doesn't redirect as configured\",\n },\n\n // Social\n {\n category: \"social\",\n fix: \"Add a `description` — Blume fills the rest of the Open Graph tags for you.\",\n id: \"BLUME_AUDIT_OG_INCOMPLETE\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Open Graph tags missing or incomplete\",\n },\n {\n category: \"social\",\n fix: \"Set `deployment.site` to turn on generated OG images, or set `seo.image` on the page.\",\n id: \"BLUME_AUDIT_OG_IMAGE_MISSING\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Open Graph image missing\",\n },\n {\n category: \"social\",\n fix: \"Point `seo.image` at a file that exists, or rebuild — a dead og:image renders as a blank card everywhere the page is shared.\",\n id: \"BLUME_AUDIT_OG_IMAGE_BROKEN\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Open Graph image is not in the build\",\n },\n {\n category: \"social\",\n fix: \"Use an image of at least 1200×630 — smaller ones render blurry or get cropped into small-card layouts.\",\n id: \"BLUME_AUDIT_OG_IMAGE_SMALL\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Open Graph image is too small for large cards\",\n },\n {\n category: \"social\",\n fix: \"Align `og:url` with the page's canonical URL.\",\n id: \"BLUME_AUDIT_OG_URL_MISMATCH\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Open Graph URL not matching canonical\",\n },\n {\n category: \"social\",\n fix: \"Set `seo.x.handle` in blume.config.ts so X can attribute the card.\",\n id: \"BLUME_AUDIT_TWITTER_CARD_INCOMPLETE\",\n severity: \"warning\",\n tier: \"static\",\n title: \"X (Twitter) card missing or incomplete\",\n },\n\n // Localization\n {\n category: \"i18n\",\n fix: \"Restore the `lang` attribute on <html> in your ejected layout.\",\n id: \"BLUME_AUDIT_HTML_LANG_MISSING\",\n severity: \"error\",\n tier: \"static\",\n title: \"HTML lang attribute missing\",\n },\n {\n category: \"i18n\",\n fix: \"Use a valid BCP 47 tag (e.g. `en`, `en-GB`) for the locale.\",\n id: \"BLUME_AUDIT_HTML_LANG_INVALID\",\n severity: \"error\",\n tier: \"static\",\n title: \"HTML lang attribute invalid\",\n },\n {\n category: \"i18n\",\n fix: \"The page's <html lang> must match its own hreflang annotation.\",\n id: \"BLUME_AUDIT_HREFLANG_LANG_MISMATCH\",\n severity: \"error\",\n tier: \"static\",\n title: \"Hreflang and HTML lang mismatch\",\n },\n {\n category: \"i18n\",\n fix: \"Use a valid BCP 47 tag in the hreflang annotation.\",\n id: \"BLUME_AUDIT_HREFLANG_INVALID\",\n severity: \"error\",\n tier: \"static\",\n title: \"Hreflang annotation invalid\",\n },\n {\n category: \"i18n\",\n fix: \"A page's hreflang set must include a self-reference.\",\n id: \"BLUME_AUDIT_HREFLANG_SELF_MISSING\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Self-reference hreflang annotation missing\",\n },\n {\n category: \"i18n\",\n fix: \"Add an `x-default` alternate pointing at the default-locale page.\",\n id: \"BLUME_AUDIT_HREFLANG_XDEFAULT_MISSING\",\n severity: \"info\",\n tier: \"static\",\n title: \"X-default hreflang annotation missing\",\n },\n {\n category: \"i18n\",\n fix: \"Every page in an hreflang group must link back to every other one.\",\n id: \"BLUME_AUDIT_HREFLANG_NO_RETURN_TAG\",\n severity: \"error\",\n tier: \"static\",\n title: \"Missing reciprocal hreflang (no return-tag)\",\n },\n {\n category: \"i18n\",\n fix: \"Point the hreflang alternate at a page that exists and is canonical.\",\n id: \"BLUME_AUDIT_HREFLANG_BAD_TARGET\",\n severity: \"error\",\n tier: \"static\",\n title: \"Hreflang points to a broken, redirecting, or non-canonical page\",\n },\n {\n category: \"i18n\",\n fix: \"Each language in an hreflang group must name exactly one page.\",\n id: \"BLUME_AUDIT_HREFLANG_CONFLICT\",\n severity: \"error\",\n tier: \"static\",\n title: \"Hreflang group has a language conflict\",\n },\n\n // Accessibility. Theme colors are one per site, not per page: these run\n // on the config, the way the build resolves it.\n {\n category: \"accessibility\",\n fix: \"Pick a darker shade for light mode or a lighter one for dark mode, per mode with `theme.accent: { light, dark }`.\",\n id: \"BLUME_AUDIT_THEME_CONTRAST_LOW\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Theme colors miss WCAG AA contrast\",\n },\n {\n category: \"accessibility\",\n fix: \"Write the color as hex, `rgb()`, `hsl()`, `hwb()`, `lab()`, `lch()`, `oklab()`, `oklch()`, or a named color so its contrast can be checked.\",\n id: \"BLUME_AUDIT_THEME_COLOR_UNCHECKED\",\n severity: \"info\",\n tier: \"static\",\n title: \"Theme color can't be checked for contrast\",\n },\n\n // Assets\n {\n category: \"assets\",\n fix: 'Add descriptive `alt` text, or `alt=\"\"` if the image is decorative.',\n id: \"BLUME_AUDIT_IMAGE_ALT_MISSING\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Missing alt text\",\n },\n {\n category: \"assets\",\n fix: \"Fix the image path, or add the file to public/.\",\n id: \"BLUME_AUDIT_IMAGE_BROKEN\",\n severity: \"error\",\n tier: \"static\",\n title: \"Image broken\",\n },\n {\n category: \"assets\",\n fix: \"Compress the asset, or serve a modern format (WebP/AVIF).\",\n id: \"BLUME_AUDIT_ASSET_TOO_LARGE\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Asset file size too large\",\n },\n {\n category: \"assets\",\n fix: \"Set `width` and `height` so the browser can reserve space (avoids layout shift).\",\n id: \"BLUME_AUDIT_IMAGE_MISSING_DIMENSIONS\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Image has no width/height\",\n },\n {\n category: \"assets\",\n fix: \"Fix the reference, or restore the missing file.\",\n id: \"BLUME_AUDIT_SUBRESOURCE_MISSING\",\n severity: \"error\",\n tier: \"static\",\n title: \"Referenced script, style, or asset is missing from the build\",\n },\n {\n category: \"assets\",\n fix: \"Load the subresource over HTTPS — browsers block mixed content.\",\n id: \"BLUME_AUDIT_MIXED_CONTENT\",\n severity: \"error\",\n tier: \"static\",\n title: \"HTTPS/HTTP mixed content\",\n },\n\n // Sitemap\n {\n category: \"sitemap\",\n fix: \"Remove `draft`/`hidden`/`noindex` from the page's frontmatter if it should be indexed. A `public/sitemap.xml` replaces the generated sitemap, so add the page there or delete that file.\",\n id: \"BLUME_AUDIT_INDEXABLE_PAGE_NOT_IN_SITEMAP\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Indexable page not in sitemap\",\n },\n {\n category: \"sitemap\",\n fix: \"A noindex page should not be advertised in the sitemap.\",\n id: \"BLUME_AUDIT_NOINDEX_IN_SITEMAP\",\n severity: \"error\",\n tier: \"static\",\n title: \"Noindex page in sitemap\",\n },\n {\n category: \"sitemap\",\n fix: \"List only canonical URLs in the sitemap.\",\n id: \"BLUME_AUDIT_NON_CANONICAL_IN_SITEMAP\",\n severity: \"error\",\n tier: \"static\",\n title: \"Non-canonical page in sitemap\",\n },\n {\n category: \"sitemap\",\n fix: \"Remove the URL from the sitemap, or build the page it names.\",\n id: \"BLUME_AUDIT_SITEMAP_BAD_URL\",\n severity: \"error\",\n tier: \"static\",\n title: \"Sitemap names a page that does not exist or redirects\",\n },\n {\n category: \"sitemap\",\n fix: \"Sitemaps must be valid XML in the sitemaps.org urlset or sitemap index format.\",\n id: \"BLUME_AUDIT_SITEMAP_INVALID\",\n severity: \"error\",\n tier: \"static\",\n title: \"Sitemap has a syntax error or wrong format\",\n },\n {\n category: \"sitemap\",\n fix: \"Split the sitemap — the limits are 50 MB and 50,000 URLs.\",\n id: \"BLUME_AUDIT_SITEMAP_TOO_LARGE\",\n severity: \"error\",\n tier: \"static\",\n title: \"Sitemap exceeds 50 MB or 50,000 URLs\",\n },\n {\n category: \"sitemap\",\n fix: \"Use a real W3C date that is not in the future — search engines that catch a sitemap lying about freshness stop trusting its lastmod entirely.\",\n id: \"BLUME_AUDIT_SITEMAP_LASTMOD_INVALID\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Sitemap lastmod is invalid or in the future\",\n },\n {\n category: \"sitemap\",\n fix: \"A sitemap may only list URLs on its own origin.\",\n id: \"BLUME_AUDIT_SITEMAP_OUT_OF_SCOPE\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Sitemap includes URLs out of its scope\",\n },\n {\n category: \"sitemap\",\n fix: \"Make sitemap.xml reachable at the site root.\",\n id: \"BLUME_AUDIT_SITEMAP_NOT_ACCESSIBLE\",\n severity: \"error\",\n tier: \"network\",\n title: \"Sitemap is not accessible\",\n },\n\n // robots.txt\n {\n category: \"robots\",\n fix: \"Set `seo.robots: true` to generate robots.txt.\",\n id: \"BLUME_AUDIT_ROBOTS_MISSING\",\n severity: \"warning\",\n tier: \"static\",\n title: \"robots.txt missing\",\n },\n {\n category: \"robots\",\n fix: \"Every robots.txt line must be a `Field: value` directive or a comment.\",\n id: \"BLUME_AUDIT_ROBOTS_INVALID\",\n severity: \"error\",\n tier: \"static\",\n title: \"robots.txt has a syntax error\",\n },\n {\n category: \"robots\",\n fix: \"A page can't be both disallowed in robots.txt and advertised in the sitemap.\",\n id: \"BLUME_AUDIT_ROBOTS_DISALLOWS_INDEXABLE\",\n severity: \"error\",\n tier: \"static\",\n title: \"robots.txt disallows a page that is in the sitemap\",\n },\n {\n category: \"robots\",\n fix: \"Narrow or remove the rule in that crawler's `User-agent` group if it should read these pages. Blocking an AI crawler on purpose is fine; skip this check.\",\n id: \"BLUME_AUDIT_ROBOTS_BLOCKS_CRAWLER\",\n severity: \"warning\",\n tier: \"static\",\n title: \"robots.txt blocks one crawler from pages in the sitemap\",\n },\n {\n category: \"robots\",\n fix: \"Set `deployment.site` so robots.txt can reference the sitemap.\",\n id: \"BLUME_AUDIT_ROBOTS_SITEMAP_MISSING\",\n severity: \"info\",\n tier: \"static\",\n title: \"robots.txt does not reference the sitemap\",\n },\n {\n category: \"robots\",\n fix: \"Make robots.txt reachable at the site root.\",\n id: \"BLUME_AUDIT_ROBOTS_NOT_ACCESSIBLE\",\n severity: \"error\",\n tier: \"network\",\n title: \"robots.txt is not accessible\",\n },\n\n // AI discovery. `llms.txt` is the sitemap of the AI era, and no SEO crawler\n // audits it — they audit for Google. Blume emits it, so Blume checks it.\n {\n category: \"ai\",\n fix: \"Rebuild — `agents.llmsTxt` is enabled but the build has no llms.txt. If that's intentional, set `agents.llmsTxt: false`.\",\n id: \"BLUME_AUDIT_LLMS_TXT_MISSING\",\n severity: \"warning\",\n tier: \"static\",\n title: \"llms.txt missing from the build\",\n },\n {\n category: \"ai\",\n fix: \"Rebuild so llms.txt matches the site — a stale entry sends an AI agent to a page that is not there.\",\n id: \"BLUME_AUDIT_LLMS_TXT_STALE_ENTRY\",\n severity: \"warning\",\n tier: \"static\",\n title: \"llms.txt lists a page the build does not serve\",\n },\n {\n category: \"ai\",\n fix: \"Rebuild so llms.txt matches the site; if the page is deliberately excluded, set `ai.exclude: true` in its front matter.\",\n id: \"BLUME_AUDIT_LLMS_TXT_PAGE_MISSING\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Indexable page missing from llms.txt\",\n },\n // DNS-AID (draft-mozleywilliams-dnsop-dnsaid) lives in the DNS zone, not the\n // build, so unlike the llms.txt checks these can only observe and advise —\n // hence `info`: publishing the records is a DNS-provider action Blume can't\n // take for you, and the draft is young enough that absence is the norm.\n {\n category: \"ai\",\n fix: \"Publish a ServiceMode SVCB or HTTPS record at `_index._agents.<host>` with your DNS provider so agents can discover the site via DNS (DNS-AID).\",\n id: \"BLUME_AUDIT_DNS_AID_MISSING\",\n severity: \"info\",\n tier: \"network\",\n title: \"No DNS-AID agent-discovery records\",\n },\n {\n category: \"ai\",\n fix: \"Enable DNSSEC for the zone so validating resolvers return authenticated DNS-AID answers; if your DNS provider doesn't support DNSSEC, the records still work unsigned.\",\n id: \"BLUME_AUDIT_DNS_AID_UNSIGNED\",\n severity: \"info\",\n tier: \"network\",\n title: \"DNS-AID records are not DNSSEC-authenticated\",\n },\n\n // Structured data. Note we validate only what Blume itself emits — we do not\n // claim Google-rich-results or full schema.org validation (the former is an\n // undocumented network API, the latter a vocabulary we don't bundle).\n {\n category: \"structured-data\",\n fix: \"The JSON-LD block must be valid JSON.\",\n id: \"BLUME_AUDIT_JSONLD_INVALID\",\n severity: \"error\",\n tier: \"static\",\n title: \"Structured data is not valid JSON\",\n },\n {\n category: \"structured-data\",\n fix: \"Every JSON-LD node needs `@context` and `@type`.\",\n id: \"BLUME_AUDIT_JSONLD_INCOMPLETE\",\n severity: \"warning\",\n tier: \"static\",\n title: \"Structured data is missing required properties\",\n },\n\n // Network (`--url`)\n {\n category: \"network\",\n fix: \"The page is linked or in the sitemap but the deployment 404s it.\",\n id: \"BLUME_AUDIT_HTTP_4XX\",\n severity: \"error\",\n tier: \"network\",\n title: \"4XX page\",\n },\n {\n category: \"network\",\n fix: \"The deployment is erroring on this page.\",\n id: \"BLUME_AUDIT_HTTP_5XX\",\n severity: \"error\",\n tier: \"network\",\n title: \"5XX page\",\n },\n {\n category: \"network\",\n fix: \"The page did not respond in time.\",\n id: \"BLUME_AUDIT_HTTP_TIMEOUT\",\n severity: \"error\",\n tier: \"network\",\n title: \"Timed out\",\n },\n {\n category: \"network\",\n fix: \"Enable gzip or brotli on the host.\",\n id: \"BLUME_AUDIT_NOT_COMPRESSED\",\n severity: \"warning\",\n tier: \"network\",\n title: \"Not compressed\",\n },\n {\n category: \"network\",\n fix: \"The page was slow to respond.\",\n id: \"BLUME_AUDIT_SLOW_RESPONSE\",\n severity: \"warning\",\n tier: \"network\",\n title: \"Slow page\",\n },\n\n // External (`--external`)\n {\n category: \"network\",\n fix: \"Fix or remove the outbound link.\",\n id: \"BLUME_AUDIT_EXTERNAL_LINK_BROKEN\",\n severity: \"error\",\n tier: \"external\",\n title: \"External link is broken\",\n },\n {\n category: \"network\",\n fix: \"Link straight to the destination.\",\n id: \"BLUME_AUDIT_EXTERNAL_LINK_REDIRECT\",\n severity: \"info\",\n tier: \"external\",\n title: \"External link redirects\",\n },\n] as const satisfies readonly CheckMeta[];\n\nexport type CheckId = (typeof CHECKS)[number][\"id\"];\n\nconst BY_ID = new Map<string, CheckMeta>(\n CHECKS.map((check) => [check.id, check])\n);\n\nexport const checkMeta = (id: CheckId): CheckMeta => {\n const meta = BY_ID.get(id);\n if (!meta) {\n throw new Error(`Unknown audit check: ${id}`);\n }\n return meta;\n};\n\nconst DOCS_BASE = \"https://useblume.dev/docs/cli/audit\";\n\n/** `BLUME_AUDIT_TITLE_TOO_LONG` -> `…/audit#title-too-long`. */\nexport const checkDocsUrl = (id: CheckId): string =>\n `${DOCS_BASE}#${id.replace(\"BLUME_AUDIT_\", \"\").toLowerCase().replaceAll(\"_\", \"-\")}`;\n\n/** Where a finding happened: the built URL, plus the source file that fixes it. */\nexport interface FindingSite {\n url: string;\n file?: string;\n line?: number;\n column?: number;\n}\n\n/**\n * Build a diagnostic for a check. Severity, remediation, and the docs anchor all\n * come from the catalog, so a check body only supplies what's specific to the\n * occurrence: where it happened and what was actually wrong.\n */\nexport const finding = (\n id: CheckId,\n site: FindingSite,\n detail: string,\n fix?: string\n): Diagnostic => {\n const meta = checkMeta(id);\n return {\n code: id,\n column: site.column,\n docsUrl: checkDocsUrl(id),\n file: site.file,\n line: site.line,\n message: detail,\n severity: meta.severity,\n suggestion: fix ?? meta.fix,\n url: site.url,\n };\n};\n",
7
+ "import { mkdtemp, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\n\nimport spawn from \"cross-spawn\";\nimport { join } from \"pathe\";\n\nimport { reportJson } from \"./report.ts\";\nimport type { AuditResult } from \"./run.ts\";\n\n/** A coding agent CLI the audit can hand its findings to (`--claude`, `--codex`). */\nexport interface AgentCli {\n /** The executable to look up on PATH. */\n bin: string;\n /** How to install it, shown when the executable is missing. */\n install: string;\n /** Display name for messages. */\n name: string;\n}\n\nexport type AgentKind = \"claude\" | \"codex\";\n\nexport const AGENTS = {\n claude: {\n bin: \"claude\",\n install: \"npm install -g @anthropic-ai/claude-code\",\n name: \"Claude Code\",\n },\n codex: {\n bin: \"codex\",\n install: \"npm install -g @openai/codex\",\n name: \"Codex\",\n },\n} satisfies Record<AgentKind, AgentCli>;\n\n/**\n * Write the full JSON report where the agent can read it. A file rather than\n * inline prompt text: a large site's report can exceed the platform's argv\n * limit, and the JSON already carries every finding untruncated — the terminal\n * report previews three pages per check, the file never does.\n */\nexport const writeAgentReport = async (\n result: AuditResult,\n root: string\n): Promise<string> => {\n const dir = await mkdtemp(join(tmpdir(), \"blume-audit-\"));\n const path = join(dir, \"report.json\");\n await writeFile(path, reportJson(result, root));\n return path;\n};\n\n/** The handoff prompt: where the report is, how to read it, and the ground rules. */\nexport const fixPrompt = (reportPath: string): string =>\n `Fix the issues found by \\`blume audit\\` in this project.\n\nThe full audit report is at ${reportPath}. It is JSON: each entry in \\`diagnostics\\` is one finding, with the check \\`code\\`, a \\`message\\` explaining what is wrong, the affected page \\`url\\`, the source \\`file\\` to edit (relative to the current directory, with a \\`line\\` when the finding points at a specific front matter key), and a \\`suggestion\\` describing the fix.\n\nWork through every finding:\n1. Read the report and group the findings by \\`file\\`.\n2. Apply each finding's \\`suggestion\\` by editing the named source file — most fixes are front matter edits at the cited line.\n3. Never fix a finding by deleting a page, removing content, or hiding it from the audit; if a finding genuinely needs a human decision, leave it and say so in your summary.\n\nWhen you are done, run \\`blume build\\` and then \\`blume audit\\` to verify, and repeat until the audit reports no issues.`;\n\nconst spawnAgent = (bin: string, args: string[]): Promise<number> =>\n // oxlint-disable-next-line promise/avoid-new -- adapt spawn's event callbacks\n new Promise((resolve, reject) => {\n const child = spawn(bin, args, { stdio: \"inherit\" });\n child.once(\"error\", reject);\n child.once(\"close\", (code) => resolve(code ?? 1));\n });\n\n/**\n * Run the agent CLI interactively with the handoff prompt, inheriting the\n * terminal so the user watches and steers the fixes rather than granting a\n * headless process blanket write access. Resolves with the agent's exit code;\n * rejects when the executable isn't on PATH — on every platform, since\n * cross-spawn resolves npm's `.cmd` shims itself and escapes their arguments\n * (the old `shell: true` launch left quoting to a hand-built command line and\n * reported a missing executable as cmd.exe's exit code 9009).\n *\n * cmd.exe still cannot carry the multi-line prompt as an argument (a newline\n * ends the command), so on Windows the prompt is written to a file next to\n * the report and handed over via a one-line pointer.\n */\nexport const launchAgent = async (\n bin: string,\n prompt: string,\n platform: NodeJS.Platform = process.platform\n): Promise<number> => {\n if (platform !== \"win32\") {\n return await spawnAgent(bin, [prompt]);\n }\n const dir = await mkdtemp(join(tmpdir(), \"blume-audit-\"));\n const promptPath = join(dir, \"prompt.md\");\n await writeFile(promptPath, prompt);\n return await spawnAgent(bin, [\n `Read ${promptPath} and follow its instructions exactly.`,\n ]);\n};\n\n/**\n * {@link launchAgent}, but resolving `null` instead of rejecting when the\n * executable isn't on PATH, so each command can print its own install hint.\n * Only `ENOENT` means \"not installed\" — any other spawn failure (`EACCES`,\n * `EMFILE`, …) must surface as itself, not be masked by an irrelevant hint.\n */\nexport const launchInstalledAgent = async (\n bin: string,\n prompt: string,\n platform: NodeJS.Platform = process.platform\n): Promise<number | null> => {\n try {\n return await launchAgent(bin, prompt, platform);\n } catch (error) {\n // SAFETY: only the `code` tag is inspected; a spawn failure throws an\n // ErrnoException, and any other thrown value fails the comparison and\n // rethrows unchanged.\n if ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n throw error;\n }\n return null;\n }\n};\n"
8
+ ],
9
+ "mappings": "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",
10
+ "debugId": "5656C1323785977064756E2164756E21",
11
+ "names": []
12
+ }
@@ -270,15 +270,13 @@ var rectangular = (lightness, chroma, hue) => {
270
270
  chroma * Math.sin(radians)
271
271
  ];
272
272
  };
273
- var rgb = ([red, green, blue], alpha) => {
274
- const channel = (component) => clamp(scaled(component, 255) / 255);
275
- return {
276
- alpha,
277
- blue: channel(blue),
278
- green: channel(green),
279
- red: channel(red)
280
- };
281
- };
273
+ var rgbChannel = (component) => clamp(scaled(component, 255) / 255);
274
+ var rgb = ([red, green, blue], alpha) => ({
275
+ alpha,
276
+ blue: rgbChannel(blue),
277
+ green: rgbChannel(green),
278
+ red: rgbChannel(red)
279
+ });
282
280
  var cylindrical = (convert) => ([hue, x, y], alpha) => {
283
281
  const [red = 0, green = 0, blue = 0] = convert(hueDegrees(hue), clamp(scaled(x, 100) / 100), clamp(scaled(y, 100) / 100));
284
282
  return { alpha, blue: clamp(blue), green: clamp(green), red: clamp(red) };
@@ -439,5 +437,5 @@ ${dark}`;
439
437
 
440
438
  export { parseColor, composite, contrastRatio, MIN_TEXT_CONTRAST, themeInk, labelOn, resolveAccent, resolveAction, resolveRadius, buildThemeCss };
441
439
 
442
- //# debugId=9A390AB579BDCE3E64756E2164756E21
443
- //# sourceMappingURL=chunk-cm89scdv.js.map
440
+ //# debugId=5C70C668C91C92AB64756E2164756E21
441
+ //# sourceMappingURL=chunk-es8h0v3j.js.map
@@ -2,10 +2,10 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/theme/color.ts", "../src/theme/palette.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Just enough CSS color math to check contrast at build time: parse the color\n * syntaxes a theme config takes (hex, `rgb()`, `hsl()`, `hwb()`, `lab()`,\n * `lch()`, `oklab()`, `oklch()`, and named colors) to sRGB, then measure WCAG\n * 2 relative luminance and contrast. A color outside sRGB is clipped to it,\n * which is what a browser shows on an sRGB display. Anything else — `var()`,\n * `color-mix()`, `color()` — parses to `null`, and the caller says it couldn't\n * check it rather than guessing.\n */\n\n/** An sRGB color: gamma-encoded channels and alpha, each 0–1. */\nexport interface Rgba {\n alpha: number;\n blue: number;\n green: number;\n red: number;\n}\n\n/** One parsed function argument. */\ninterface Component {\n /** `\"%\"`, an angle unit, or `\"\"` for a bare number. */\n unit: string;\n value: number;\n}\n\n/** A color function's three channel arguments. */\ntype Channels = readonly [Component, Component, Component];\n\n/** A parsed color function: its name and its channel and alpha arguments. */\ninterface ColorFunction {\n alpha?: Component;\n channels: Channels;\n name: string;\n}\n\n/** The CSS named colors, as hex. A `Map`, so `constructor` names nothing. */\nconst NAMED = new Map(\n Object.entries({\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"00ffff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000000\",\n blanchedalmond: \"ffebcd\",\n blue: \"0000ff\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"00ffff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"ff00ff\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"778899\",\n lightslategrey: \"778899\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"00ff00\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"ff00ff\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"ff0000\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n transparent: \"00000000\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"ffffff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ffff00\",\n yellowgreen: \"9acd32\",\n })\n);\n\nconst HEX = /^#(?<digits>[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/iu;\nconst FUNCTION = /^(?<name>[a-z]+)\\((?<args>[^()]*)\\)$/iu;\nconst COMPONENT =\n /^(?<value>[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?)(?<unit>%|deg|grad|rad|turn)?$/iu;\n\n/** Turns per angle unit; a bare hue is in degrees. */\nconst TURNS_PER_UNIT = new Map([\n [\"\", 1 / 360],\n [\"deg\", 1 / 360],\n [\"grad\", 1 / 400],\n [\"rad\", 1 / (2 * Math.PI)],\n [\"turn\", 1],\n]);\n\nconst clamp = (value: number): number => Math.min(1, Math.max(0, value));\n\nconst fromHex = (digits: string): Rgba => {\n const full =\n digits.length <= 4\n ? [...digits].map((digit) => `${digit}${digit}`).join(\"\")\n : digits;\n const channel = (index: number): number =>\n Number.parseInt(full.slice(index * 2, index * 2 + 2), 16) / 255;\n return {\n alpha: full.length === 8 ? channel(3) : 1,\n blue: channel(2),\n green: channel(1),\n red: channel(0),\n };\n};\n\nconst parseComponent = (token: string): Component | null => {\n if (token.toLowerCase() === \"none\") {\n return { unit: \"\", value: 0 };\n }\n const match = COMPONENT.exec(token)?.groups;\n return match?.value === undefined\n ? null\n : { unit: (match.unit ?? \"\").toLowerCase(), value: Number(match.value) };\n};\n\n/** Split a function's arguments: commas or spaces, with `/` before alpha. */\nconst parseFunction = (value: string): ColorFunction | null => {\n const match = FUNCTION.exec(value)?.groups;\n if (match?.name === undefined || match.args === undefined) {\n return null;\n }\n const [channelText = \"\", alphaText, extra] = match.args.split(\"/\");\n const tokens = channelText\n .split(/[\\s,]+/u)\n .filter(Boolean)\n .map(parseComponent);\n // The legacy comma syntax (`rgba(0, 0, 0, 0.5)`) puts alpha fourth.\n const legacyAlpha =\n alphaText === undefined && tokens.length === 4 ? tokens.pop() : undefined;\n const alpha =\n alphaText === undefined ? legacyAlpha : parseComponent(alphaText.trim());\n const [first, second, third, ...rest] = tokens;\n if (\n extra !== undefined ||\n alpha === null ||\n rest.length > 0 ||\n !first ||\n !second ||\n !third\n ) {\n return null;\n }\n return {\n alpha,\n channels: [first, second, third],\n name: match.name.toLowerCase(),\n };\n};\n\n/** A number, or a percentage of `full`. */\nconst scaled = (component: Component, full: number): number =>\n component.unit === \"%\" ? (component.value / 100) * full : component.value;\n\n/** A hue in degrees (0–360), from any angle unit. */\nconst hueDegrees = (component: Component): number => {\n const degrees =\n component.value * (TURNS_PER_UNIT.get(component.unit) ?? 0) * 360;\n return ((degrees % 360) + 360) % 360;\n};\n\n/** An sRGB channel from its linear-light value. */\nconst encode = (linear: number): number =>\n clamp(\n linear <= 0.0031308 ? 12.92 * linear : 1.055 * linear ** (1 / 2.4) - 0.055\n );\n\n/** A linear-light value from its sRGB channel. */\nconst decode = (channel: number): number =>\n channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;\n\nconst fromLinear = (\n [red, green, blue]: readonly [number, number, number],\n alpha: number\n): Rgba => ({\n alpha,\n blue: encode(blue),\n green: encode(green),\n red: encode(red),\n});\n\nconst fromHsl = (hue: number, saturation: number, lightness: number) => {\n const chroma = (1 - Math.abs(2 * lightness - 1)) * saturation;\n const channel = (offset: number): number => {\n const k = (offset + hue / 30) % 12;\n return lightness - (chroma / 2) * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n };\n return [channel(0), channel(8), channel(4)] as const;\n};\n\nconst fromHwb = (hue: number, white: number, black: number) => {\n if (white + black >= 1) {\n const gray = white / (white + black);\n return [gray, gray, gray] as const;\n }\n const [red, green, blue] = fromHsl(hue, 1, 0.5);\n const scale = 1 - white - black;\n return [\n red * scale + white,\n green * scale + white,\n blue * scale + white,\n ] as const;\n};\n\n/** Linear sRGB from OKLab (Björn Ottosson's matrices). */\nconst fromOklab = (lightness: number, a: number, b: number) => {\n const l = (lightness + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m = (lightness - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s = (lightness - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ] as const;\n};\n\n/** Linear sRGB from CIE Lab (D50), through XYZ and a Bradford adaptation. */\nconst fromLab = (lightness: number, a: number, b: number) => {\n const epsilon = 216 / 24_389;\n const kappa = 24_389 / 27;\n const fy = (lightness + 16) / 116;\n const fx = fy + a / 500;\n const fz = fy - b / 200;\n const cube = (f: number): number =>\n f ** 3 > epsilon ? f ** 3 : (116 * f - 16) / kappa;\n const x = cube(fx) * 0.96422;\n const y = lightness > kappa * epsilon ? fy ** 3 : lightness / kappa;\n const z = cube(fz) * 0.82521;\n // D50 to D65.\n const x65 =\n 0.955473421488075 * x - 0.02309845494876471 * y + 0.06325924320057072 * z;\n const y65 =\n -0.0283697093338637 * x + 1.0099953980813041 * y + 0.021041441191917323 * z;\n const z65 =\n 0.012314014864481998 * x - 0.020507649298898964 * y + 1.330365926242124 * z;\n return [\n 3.2409699419045226 * x65 -\n 1.537383177570094 * y65 -\n 0.4986107602930034 * z65,\n -0.9692436362808796 * x65 +\n 1.8759675015077202 * y65 +\n 0.04155505740717559 * z65,\n 0.05563007969699366 * x65 -\n 0.20397695888897652 * y65 +\n 1.0569715142428786 * z65,\n ] as const;\n};\n\n/** Polar (lightness, chroma, hue) to rectangular (lightness, a, b). */\nconst rectangular = (lightness: number, chroma: number, hue: number) => {\n const radians = (hue * Math.PI) / 180;\n return [\n lightness,\n chroma * Math.cos(radians),\n chroma * Math.sin(radians),\n ] as const;\n};\n\n/** A color function's channels, converted to sRGB with `alpha`. */\ntype Converter = (channels: Channels, alpha: number) => Rgba;\n\nconst rgb: Converter = ([red, green, blue], alpha) => {\n const channel = (component: Component): number =>\n clamp(scaled(component, 255) / 255);\n return {\n alpha,\n blue: channel(blue),\n green: channel(green),\n red: channel(red),\n };\n};\n\n/** A converter for a hue-and-two-percentages function (`hsl()`, `hwb()`). */\nconst cylindrical =\n (\n convert: (hue: number, x: number, y: number) => readonly number[]\n ): Converter =>\n ([hue, x, y], alpha) => {\n const [red = 0, green = 0, blue = 0] = convert(\n hueDegrees(hue),\n clamp(scaled(x, 100) / 100),\n clamp(scaled(y, 100) / 100)\n );\n return { alpha, blue: clamp(blue), green: clamp(green), red: clamp(red) };\n };\n\nconst hsl = cylindrical(fromHsl);\n\n/** The color functions this module reads, by name. */\nconst CONVERTERS = new Map<string, Converter>([\n [\"hsl\", hsl],\n [\"hsla\", hsl],\n [\"hwb\", cylindrical(fromHwb)],\n [\n \"lab\",\n ([lightness, a, b], alpha) =>\n fromLinear(\n fromLab(scaled(lightness, 100), scaled(a, 125), scaled(b, 125)),\n alpha\n ),\n ],\n [\n \"lch\",\n ([lightness, chroma, hue], alpha) =>\n fromLinear(\n fromLab(\n ...rectangular(\n scaled(lightness, 100),\n scaled(chroma, 150),\n hueDegrees(hue)\n )\n ),\n alpha\n ),\n ],\n [\n \"oklab\",\n ([lightness, a, b], alpha) =>\n fromLinear(\n fromOklab(scaled(lightness, 1), scaled(a, 0.4), scaled(b, 0.4)),\n alpha\n ),\n ],\n [\n \"oklch\",\n ([lightness, chroma, hue], alpha) =>\n fromLinear(\n fromOklab(\n ...rectangular(\n scaled(lightness, 1),\n scaled(chroma, 0.4),\n hueDegrees(hue)\n )\n ),\n alpha\n ),\n ],\n [\"rgb\", rgb],\n [\"rgba\", rgb],\n]);\n\n/** Parse a CSS color to sRGB, or `null` for syntax this module doesn't read. */\nexport const parseColor = (value: string): Rgba | null => {\n const color = value.trim().toLowerCase();\n const hex = NAMED.get(color) ?? HEX.exec(color)?.groups?.digits;\n if (hex !== undefined) {\n return fromHex(hex);\n }\n const parsed = parseFunction(color);\n const convert = parsed && CONVERTERS.get(parsed.name);\n return parsed && convert\n ? convert(\n parsed.channels,\n parsed.alpha === undefined ? 1 : clamp(scaled(parsed.alpha, 1))\n )\n : null;\n};\n\n/** `color` painted over an opaque `backdrop`. */\nexport const composite = (color: Rgba, backdrop: Rgba): Rgba => {\n const mix = (top: number, bottom: number): number =>\n top * color.alpha + bottom * (1 - color.alpha);\n return {\n alpha: 1,\n blue: mix(color.blue, backdrop.blue),\n green: mix(color.green, backdrop.green),\n red: mix(color.red, backdrop.red),\n };\n};\n\n/** WCAG 2 relative luminance of an opaque color. */\nexport const luminance = (color: Rgba): number =>\n 0.2126 * decode(color.red) +\n 0.7152 * decode(color.green) +\n 0.0722 * decode(color.blue);\n\n/**\n * WCAG 2 contrast ratio of `foreground` on an opaque `background`, from 1 to\n * 21. A translucent foreground is painted over the background first.\n */\nexport const contrastRatio = (foreground: Rgba, background: Rgba): number => {\n const top = luminance(composite(foreground, background));\n const bottom = luminance(background);\n return (Math.max(top, bottom) + 0.05) / (Math.min(top, bottom) + 0.05);\n};\n",
5
+ "/**\n * Just enough CSS color math to check contrast at build time: parse the color\n * syntaxes a theme config takes (hex, `rgb()`, `hsl()`, `hwb()`, `lab()`,\n * `lch()`, `oklab()`, `oklch()`, and named colors) to sRGB, then measure WCAG\n * 2 relative luminance and contrast. A color outside sRGB is clipped to it,\n * which is what a browser shows on an sRGB display. Anything else — `var()`,\n * `color-mix()`, `color()` — parses to `null`, and the caller says it couldn't\n * check it rather than guessing.\n */\n\n/** An sRGB color: gamma-encoded channels and alpha, each 0–1. */\nexport interface Rgba {\n alpha: number;\n blue: number;\n green: number;\n red: number;\n}\n\n/** One parsed function argument. */\ninterface Component {\n /** `\"%\"`, an angle unit, or `\"\"` for a bare number. */\n unit: string;\n value: number;\n}\n\n/** A color function's three channel arguments. */\ntype Channels = readonly [Component, Component, Component];\n\n/** A parsed color function: its name and its channel and alpha arguments. */\ninterface ColorFunction {\n alpha?: Component;\n channels: Channels;\n name: string;\n}\n\n/** The CSS named colors, as hex. A `Map`, so `constructor` names nothing. */\nconst NAMED = new Map(\n Object.entries({\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"00ffff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000000\",\n blanchedalmond: \"ffebcd\",\n blue: \"0000ff\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"00ffff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"ff00ff\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"778899\",\n lightslategrey: \"778899\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"00ff00\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"ff00ff\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"ff0000\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n transparent: \"00000000\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"ffffff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ffff00\",\n yellowgreen: \"9acd32\",\n })\n);\n\nconst HEX = /^#(?<digits>[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/iu;\nconst FUNCTION = /^(?<name>[a-z]+)\\((?<args>[^()]*)\\)$/iu;\nconst COMPONENT =\n /^(?<value>[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?)(?<unit>%|deg|grad|rad|turn)?$/iu;\n\n/** Turns per angle unit; a bare hue is in degrees. */\nconst TURNS_PER_UNIT = new Map([\n [\"\", 1 / 360],\n [\"deg\", 1 / 360],\n [\"grad\", 1 / 400],\n [\"rad\", 1 / (2 * Math.PI)],\n [\"turn\", 1],\n]);\n\nconst clamp = (value: number): number => Math.min(1, Math.max(0, value));\n\nconst fromHex = (digits: string): Rgba => {\n const full =\n digits.length <= 4\n ? [...digits].map((digit) => `${digit}${digit}`).join(\"\")\n : digits;\n const channel = (index: number): number =>\n Number.parseInt(full.slice(index * 2, index * 2 + 2), 16) / 255;\n return {\n alpha: full.length === 8 ? channel(3) : 1,\n blue: channel(2),\n green: channel(1),\n red: channel(0),\n };\n};\n\nconst parseComponent = (token: string): Component | null => {\n if (token.toLowerCase() === \"none\") {\n return { unit: \"\", value: 0 };\n }\n const match = COMPONENT.exec(token)?.groups;\n return match?.value === undefined\n ? null\n : { unit: (match.unit ?? \"\").toLowerCase(), value: Number(match.value) };\n};\n\n/** Split a function's arguments: commas or spaces, with `/` before alpha. */\nconst parseFunction = (value: string): ColorFunction | null => {\n const match = FUNCTION.exec(value)?.groups;\n if (match?.name === undefined || match.args === undefined) {\n return null;\n }\n const [channelText = \"\", alphaText, extra] = match.args.split(\"/\");\n const tokens = channelText\n .split(/[\\s,]+/u)\n .filter(Boolean)\n .map(parseComponent);\n // The legacy comma syntax (`rgba(0, 0, 0, 0.5)`) puts alpha fourth.\n const legacyAlpha =\n alphaText === undefined && tokens.length === 4 ? tokens.pop() : undefined;\n const alpha =\n alphaText === undefined ? legacyAlpha : parseComponent(alphaText.trim());\n const [first, second, third, ...rest] = tokens;\n if (\n extra !== undefined ||\n alpha === null ||\n rest.length > 0 ||\n !first ||\n !second ||\n !third\n ) {\n return null;\n }\n return {\n alpha,\n channels: [first, second, third],\n name: match.name.toLowerCase(),\n };\n};\n\n/** A number, or a percentage of `full`. */\nconst scaled = (component: Component, full: number): number =>\n component.unit === \"%\" ? (component.value / 100) * full : component.value;\n\n/** A hue in degrees (0–360), from any angle unit. */\nconst hueDegrees = (component: Component): number => {\n const degrees =\n component.value * (TURNS_PER_UNIT.get(component.unit) ?? 0) * 360;\n return ((degrees % 360) + 360) % 360;\n};\n\n/** An sRGB channel from its linear-light value. */\nconst encode = (linear: number): number =>\n clamp(\n linear <= 0.0031308 ? 12.92 * linear : 1.055 * linear ** (1 / 2.4) - 0.055\n );\n\n/** A linear-light value from its sRGB channel. */\nconst decode = (channel: number): number =>\n channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;\n\nconst fromLinear = (\n [red, green, blue]: readonly [number, number, number],\n alpha: number\n): Rgba => ({\n alpha,\n blue: encode(blue),\n green: encode(green),\n red: encode(red),\n});\n\nconst fromHsl = (hue: number, saturation: number, lightness: number) => {\n const chroma = (1 - Math.abs(2 * lightness - 1)) * saturation;\n const channel = (offset: number): number => {\n const k = (offset + hue / 30) % 12;\n return lightness - (chroma / 2) * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n };\n return [channel(0), channel(8), channel(4)] as const;\n};\n\nconst fromHwb = (hue: number, white: number, black: number) => {\n if (white + black >= 1) {\n const gray = white / (white + black);\n return [gray, gray, gray] as const;\n }\n const [red, green, blue] = fromHsl(hue, 1, 0.5);\n const scale = 1 - white - black;\n return [\n red * scale + white,\n green * scale + white,\n blue * scale + white,\n ] as const;\n};\n\n/** Linear sRGB from OKLab (Björn Ottosson's matrices). */\nconst fromOklab = (lightness: number, a: number, b: number) => {\n const l = (lightness + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m = (lightness - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s = (lightness - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ] as const;\n};\n\n/** Linear sRGB from CIE Lab (D50), through XYZ and a Bradford adaptation. */\nconst fromLab = (lightness: number, a: number, b: number) => {\n const epsilon = 216 / 24_389;\n const kappa = 24_389 / 27;\n const fy = (lightness + 16) / 116;\n const fx = fy + a / 500;\n const fz = fy - b / 200;\n const cube = (f: number): number =>\n f ** 3 > epsilon ? f ** 3 : (116 * f - 16) / kappa;\n const x = cube(fx) * 0.96422;\n const y = lightness > kappa * epsilon ? fy ** 3 : lightness / kappa;\n const z = cube(fz) * 0.82521;\n // D50 to D65.\n const x65 =\n 0.955473421488075 * x - 0.02309845494876471 * y + 0.06325924320057072 * z;\n const y65 =\n -0.0283697093338637 * x + 1.0099953980813041 * y + 0.021041441191917323 * z;\n const z65 =\n 0.012314014864481998 * x - 0.020507649298898964 * y + 1.330365926242124 * z;\n return [\n 3.2409699419045226 * x65 -\n 1.537383177570094 * y65 -\n 0.4986107602930034 * z65,\n -0.9692436362808796 * x65 +\n 1.8759675015077202 * y65 +\n 0.04155505740717559 * z65,\n 0.05563007969699366 * x65 -\n 0.20397695888897652 * y65 +\n 1.0569715142428786 * z65,\n ] as const;\n};\n\n/** Polar (lightness, chroma, hue) to rectangular (lightness, a, b). */\nconst rectangular = (lightness: number, chroma: number, hue: number) => {\n const radians = (hue * Math.PI) / 180;\n return [\n lightness,\n chroma * Math.cos(radians),\n chroma * Math.sin(radians),\n ] as const;\n};\n\n/** A color function's channels, converted to sRGB with `alpha`. */\ntype Converter = (channels: Channels, alpha: number) => Rgba;\n\nconst rgbChannel = (component: Component): number =>\n clamp(scaled(component, 255) / 255);\n\nconst rgb: Converter = ([red, green, blue], alpha) => ({\n alpha,\n blue: rgbChannel(blue),\n green: rgbChannel(green),\n red: rgbChannel(red),\n});\n\n/** A converter for a hue-and-two-percentages function (`hsl()`, `hwb()`). */\nconst cylindrical =\n (\n convert: (hue: number, x: number, y: number) => readonly number[]\n ): Converter =>\n ([hue, x, y], alpha) => {\n const [red = 0, green = 0, blue = 0] = convert(\n hueDegrees(hue),\n clamp(scaled(x, 100) / 100),\n clamp(scaled(y, 100) / 100)\n );\n return { alpha, blue: clamp(blue), green: clamp(green), red: clamp(red) };\n };\n\nconst hsl = cylindrical(fromHsl);\n\n/** The color functions this module reads, by name. */\nconst CONVERTERS = new Map<string, Converter>([\n [\"hsl\", hsl],\n [\"hsla\", hsl],\n [\"hwb\", cylindrical(fromHwb)],\n [\n \"lab\",\n ([lightness, a, b], alpha) =>\n fromLinear(\n fromLab(scaled(lightness, 100), scaled(a, 125), scaled(b, 125)),\n alpha\n ),\n ],\n [\n \"lch\",\n ([lightness, chroma, hue], alpha) =>\n fromLinear(\n fromLab(\n ...rectangular(\n scaled(lightness, 100),\n scaled(chroma, 150),\n hueDegrees(hue)\n )\n ),\n alpha\n ),\n ],\n [\n \"oklab\",\n ([lightness, a, b], alpha) =>\n fromLinear(\n fromOklab(scaled(lightness, 1), scaled(a, 0.4), scaled(b, 0.4)),\n alpha\n ),\n ],\n [\n \"oklch\",\n ([lightness, chroma, hue], alpha) =>\n fromLinear(\n fromOklab(\n ...rectangular(\n scaled(lightness, 1),\n scaled(chroma, 0.4),\n hueDegrees(hue)\n )\n ),\n alpha\n ),\n ],\n [\"rgb\", rgb],\n [\"rgba\", rgb],\n]);\n\n/** Parse a CSS color to sRGB, or `null` for syntax this module doesn't read. */\nexport const parseColor = (value: string): Rgba | null => {\n const color = value.trim().toLowerCase();\n const hex = NAMED.get(color) ?? HEX.exec(color)?.groups?.digits;\n if (hex !== undefined) {\n return fromHex(hex);\n }\n const parsed = parseFunction(color);\n const convert = parsed && CONVERTERS.get(parsed.name);\n return parsed && convert\n ? convert(\n parsed.channels,\n parsed.alpha === undefined ? 1 : clamp(scaled(parsed.alpha, 1))\n )\n : null;\n};\n\n/** `color` painted over an opaque `backdrop`. */\nexport const composite = (color: Rgba, backdrop: Rgba): Rgba => {\n const mix = (top: number, bottom: number): number =>\n top * color.alpha + bottom * (1 - color.alpha);\n return {\n alpha: 1,\n blue: mix(color.blue, backdrop.blue),\n green: mix(color.green, backdrop.green),\n red: mix(color.red, backdrop.red),\n };\n};\n\n/** WCAG 2 relative luminance of an opaque color. */\nexport const luminance = (color: Rgba): number =>\n 0.2126 * decode(color.red) +\n 0.7152 * decode(color.green) +\n 0.0722 * decode(color.blue);\n\n/**\n * WCAG 2 contrast ratio of `foreground` on an opaque `background`, from 1 to\n * 21. A translucent foreground is painted over the background first.\n */\nexport const contrastRatio = (foreground: Rgba, background: Rgba): number => {\n const top = luminance(composite(foreground, background));\n const bottom = luminance(background);\n return (Math.max(top, bottom) + 0.05) / (Math.min(top, bottom) + 0.05);\n};\n",
6
6
  "import type { ResolvedConfig } from \"../core/schema.ts\";\nimport { composite, contrastRatio, parseColor } from \"./color.ts\";\nimport type { Rgba } from \"./color.ts\";\n\n/** Per-mode CSS colors. */\nexport interface AccentColors {\n dark: string;\n light: string;\n}\n\n/** A color mode. */\nexport type ColorMode = keyof AccentColors;\n\n/**\n * Named accent presets mapped to OKLCH values, per mode. The single source of\n * truth for preset colors: the theme CSS and the OG card (og/card.ts) both\n * resolve from this table, so a site and its social cards can't disagree\n * about \"blue\". Each clears WCAG AA (4.5:1) as text on its mode's page and\n * under its button label ({@link readableOn}), with room to spare on the\n * tinted surfaces accent text also sits on: the light shades are dark enough\n * for white labels, the dark shades light enough to read on the dark page.\n */\nexport const ACCENTS = {\n blue: { dark: \"oklch(0.62 0.16 250)\", light: \"oklch(0.55 0.16 250)\" },\n green: { dark: \"oklch(0.6 0.16 150)\", light: \"oklch(0.53 0.16 150)\" },\n orange: { dark: \"oklch(0.68 0.17 50)\", light: \"oklch(0.56 0.17 50)\" },\n pink: { dark: \"oklch(0.65 0.2 350)\", light: \"oklch(0.58 0.2 350)\" },\n purple: { dark: \"oklch(0.6 0.2 290)\", light: \"oklch(0.57 0.2 290)\" },\n red: { dark: \"oklch(0.61 0.22 25)\", light: \"oklch(0.58 0.22 25)\" },\n teal: { dark: \"oklch(0.6 0.12 195)\", light: \"oklch(0.53 0.12 195)\" },\n} satisfies Record<string, AccentColors>;\n\n/** The contrast WCAG AA asks of body-size text. */\nexport const MIN_TEXT_CONTRAST = 4.5;\n\n/**\n * The theme's own colors a configured accent is drawn against: each mode's\n * page background and text, and the dark ink a filled accent can carry.\n * Mirrors the defaults in `entry.ts`.\n */\nexport const THEME_INKS = {\n dark: {\n background: \"oklch(0.085 0 0)\",\n foreground: \"oklch(0.96 0 0)\",\n ink: \"oklch(0.085 0 0)\",\n mutedForeground: \"oklch(0.68 0 0)\",\n },\n light: {\n background: \"oklch(1 0 0)\",\n foreground: \"oklch(0.145 0 0)\",\n ink: \"oklch(0.145 0 0)\",\n mutedForeground: \"oklch(0.53 0 0)\",\n },\n} satisfies Record<ColorMode, Record<string, string>>;\n\nconst WHITE = \"oklch(1 0 0)\";\n\n/** A color this module writes itself, parsed (they all parse). */\nconst own = (value: string): Rgba =>\n parseColor(value) ?? { alpha: 1, blue: 0, green: 0, red: 0 };\n\n/** {@link THEME_INKS}, parsed, for contrast math. */\nexport const themeInk = (\n mode: ColorMode,\n name: keyof (typeof THEME_INKS)[ColorMode]\n): Rgba => own(THEME_INKS[mode][name]);\n\n/**\n * The label color for text on a filled `fill` (a button, a step number): white\n * while it reaches AA, else the mode's dark ink when that reads better, so a\n * light accent (every dark-mode preset) gets dark text instead of white text\n * nobody can read.\n */\nexport const labelOn = (fill: Rgba, mode: ColorMode): string => {\n const opaque = composite(fill, themeInk(mode, \"background\"));\n const onWhite = contrastRatio(own(WHITE), opaque);\n return onWhite >= MIN_TEXT_CONTRAST ||\n onWhite >= contrastRatio(themeInk(mode, \"ink\"), opaque)\n ? WHITE\n : THEME_INKS[mode].ink;\n};\n\n/** {@link labelOn} for a CSS color; one this module can't parse keeps white. */\nexport const readableOn = (fill: string, mode: ColorMode): string => {\n const color = parseColor(fill);\n return color ? labelOn(color, mode) : WHITE;\n};\n\n/**\n * Whether a raw config value names an accent preset. `hasOwn` keeps a value\n * like \"constructor\" from resolving an Object.prototype member — which would\n * stringify a function into the generated CSS, breaking the rule (the exact\n * breakout {@link safeColor} exists to prevent).\n */\nexport const isAccentPreset = (value: string): value is keyof typeof ACCENTS =>\n Object.hasOwn(ACCENTS, value);\n\n// Characters valid in a CSS color value (hex, rgb/hsl/oklch functions, named\n// colors). Anything else — notably `;`, `{`, `}` — could break out of the\n// declaration and inject rules, so such a value is rejected.\nconst CSS_COLOR = /^[\\w\\s#%.,()/+-]+$/u;\n\n/** Pass a raw color through only if it can't break out of a CSS declaration. */\nconst safeColor = (value: string, fallback: string): string =>\n CSS_COLOR.test(value.trim()) ? value.trim() : fallback;\n\n/** Resolve a named preset in `mode`, or fall back to {@link safeColor}. */\nconst presetOrColor = (value: string, mode: ColorMode): string =>\n isAccentPreset(value)\n ? ACCENTS[value][mode]\n : safeColor(value, ACCENTS.blue[mode]);\n\n/** Like {@link safeColor} but drops an unsafe/absent value to `null`. */\nconst safeColorOrNull = (value: string | undefined): string | null =>\n value && CSS_COLOR.test(value.trim()) ? value.trim() : null;\n\nconst RADII = {\n lg: \"0.75rem\",\n md: \"0.5rem\",\n none: \"0\",\n sm: \"0.25rem\",\n} satisfies Record<ResolvedConfig[\"theme\"][\"radius\"], string>;\n\nconst cssString = (value: string): string => JSON.stringify(value);\n\nconst backgroundImageCss = (image: string): string =>\n `url(${cssString(image)})`;\n\nconst cssToken = (name: string, value?: string | null): string[] =>\n value ? [` ${name}: ${value};`] : [];\n\n/** One mode's resolved accent and action fills. */\ninterface ModeFills {\n accent: string;\n action: string | null;\n}\n\nconst themeRootCss = (\n theme: ResolvedConfig[\"theme\"],\n options: ModeFills & { radius: string }\n): string =>\n [\n ` --blume-accent: ${options.accent};`,\n ` --blume-accent-foreground: ${readableOn(options.accent, \"light\")};`,\n ...cssToken(\"--blume-action\", options.action),\n ...cssToken(\n \"--blume-action-foreground\",\n options.action ? readableOn(options.action, \"light\") : null\n ),\n ...cssToken(\"--blume-background\", safeColorOrNull(theme.background?.light)),\n ...cssToken(\n \"--blume-background-image\",\n theme.backgroundImage?.light\n ? backgroundImageCss(theme.backgroundImage.light)\n : null\n ),\n ` --blume-radius: ${options.radius};`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\nconst themeDarkCss = (\n theme: ResolvedConfig[\"theme\"],\n options: ModeFills\n): string => {\n // Mode-shared tokens (accent, action) must be re-declared here: the base\n // stylesheet's own `:root[data-theme=\"dark\"]` block outranks the `:root`\n // config tokens on specificity, so without this block dark mode would\n // silently keep its neutral defaults and ignore the config.\n const tokens = [\n ` --blume-accent: ${options.accent};`,\n ` --blume-accent-foreground: ${readableOn(options.accent, \"dark\")};`,\n ...cssToken(\"--blume-action\", options.action),\n ...cssToken(\n \"--blume-action-foreground\",\n options.action ? readableOn(options.action, \"dark\") : null\n ),\n ...cssToken(\"--blume-background\", safeColorOrNull(theme.background?.dark)),\n ...cssToken(\n \"--blume-background-image\",\n theme.backgroundImage?.dark\n ? backgroundImageCss(theme.backgroundImage.dark)\n : null\n ),\n ].filter(Boolean);\n return `:root[data-theme=\"dark\"] {\n${tokens.join(\"\\n\")}\n}\n`;\n};\n\n/**\n * Resolve the configured accent to per-mode CSS colors. A named accent\n * resolves to its preset's shade for each mode; any other value is treated as\n * a raw CSS color so users can pass arbitrary colors without a config change.\n * A string accent has already been normalized by the config schema to the\n * same value for both modes.\n */\nexport const resolveAccent = (\n theme: ResolvedConfig[\"theme\"]\n): AccentColors => ({\n dark: presetOrColor(theme.accent.dark, \"dark\"),\n light: presetOrColor(theme.accent.light, \"light\"),\n});\n\n/** Resolve the configured `action` fill per mode, or `null` when unset. */\nexport const resolveAction = (\n theme: ResolvedConfig[\"theme\"]\n): AccentColors | null =>\n theme.action\n ? {\n dark: presetOrColor(theme.action, \"dark\"),\n light: presetOrColor(theme.action, \"light\"),\n }\n : null;\n\n/** Resolve the configured radius preset to a CSS length. */\nexport const resolveRadius = (theme: ResolvedConfig[\"theme\"]): string =>\n RADII[theme.radius];\n\n/**\n * Compile theme config into CSS custom properties. A named accent resolves to\n * its preset; any other value is treated as a raw CSS color so users can pass\n * arbitrary colors without a config change. Labels on accent and action fills\n * take whichever of white or dark ink reads ({@link readableOn}).\n */\nexport const buildThemeCss = (theme: ResolvedConfig[\"theme\"]): string => {\n const accent = resolveAccent(theme);\n const action = resolveAction(theme);\n const root = themeRootCss(theme, {\n accent: accent.light,\n action: action?.light ?? null,\n radius: RADII[theme.radius],\n });\n const dark = themeDarkCss(theme, {\n accent: accent.dark,\n action: action?.dark ?? null,\n });\n\n return `/* Generated by Blume from theme config. */\n:root {\n${root}\n}\n${dark}`;\n};\n"
7
7
  ],
8
- "mappings": ";;;AAoCA,IAAM,QAAQ,IAAI,IAChB,OAAO,QAAQ;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EACf,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,eAAe;AAAA,EACf,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,EACb,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,WAAW;AAAA,EACX,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,KAAK;AAAA,EACL,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,aAAa;AACf,CAAC,CACH;AAEA,IAAM,MAAM;AACZ,IAAM,WAAW;AACjB,IAAM,YACJ;AAGF,IAAM,iBAAiB,IAAI,IAAI;AAAA,EAC7B,CAAC,IAAI,IAAI,GAAG;AAAA,EACZ,CAAC,OAAO,IAAI,GAAG;AAAA,EACf,CAAC,QAAQ,IAAI,GAAG;AAAA,EAChB,CAAC,OAAO,KAAK,IAAI,KAAK,GAAG;AAAA,EACzB,CAAC,QAAQ,CAAC;AACZ,CAAC;AAED,IAAM,QAAQ,CAAC,UAA0B,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAEvE,IAAM,UAAU,CAAC,WAAyB;AAAA,EACxC,MAAM,OACJ,OAAO,UAAU,IACb,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,QAAQ,OAAO,EAAE,KAAK,EAAE,IACtD;AAAA,EACN,MAAM,UAAU,CAAC,UACf,OAAO,SAAS,KAAK,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI;AAAA,EAC9D,OAAO;AAAA,IACL,OAAO,KAAK,WAAW,IAAI,QAAQ,CAAC,IAAI;AAAA,IACxC,MAAM,QAAQ,CAAC;AAAA,IACf,OAAO,QAAQ,CAAC;AAAA,IAChB,KAAK,QAAQ,CAAC;AAAA,EAChB;AAAA;AAGF,IAAM,iBAAiB,CAAC,UAAoC;AAAA,EAC1D,IAAI,MAAM,YAAY,MAAM,QAAQ;AAAA,IAClC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE;AAAA,EAC9B;AAAA,EACA,MAAM,QAAQ,UAAU,KAAK,KAAK,GAAG;AAAA,EACrC,OAAO,OAAO,UAAU,YACpB,OACA,EAAE,OAAO,MAAM,QAAQ,IAAI,YAAY,GAAG,OAAO,OAAO,MAAM,KAAK,EAAE;AAAA;AAI3E,IAAM,gBAAgB,CAAC,UAAwC;AAAA,EAC7D,MAAM,QAAQ,SAAS,KAAK,KAAK,GAAG;AAAA,EACpC,IAAI,OAAO,SAAS,aAAa,MAAM,SAAS,WAAW;AAAA,IACzD,OAAO;AAAA,EACT;AAAA,EACA,OAAO,cAAc,IAAI,WAAW,SAAS,MAAM,KAAK,MAAM,GAAG;AAAA,EACjE,MAAM,SAAS,YACZ,MAAM,SAAS,EACf,OAAO,OAAO,EACd,IAAI,cAAc;AAAA,EAErB,MAAM,cACJ,cAAc,aAAa,OAAO,WAAW,IAAI,OAAO,IAAI,IAAI;AAAA,EAClE,MAAM,QACJ,cAAc,YAAY,cAAc,eAAe,UAAU,KAAK,CAAC;AAAA,EACzE,OAAO,OAAO,QAAQ,UAAU,QAAQ;AAAA,EACxC,IACE,UAAU,aACV,UAAU,QACV,KAAK,SAAS,KACd,CAAC,SACD,CAAC,UACD,CAAC,OACD;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA,UAAU,CAAC,OAAO,QAAQ,KAAK;AAAA,IAC/B,MAAM,MAAM,KAAK,YAAY;AAAA,EAC/B;AAAA;AAIF,IAAM,SAAS,CAAC,WAAsB,SACpC,UAAU,SAAS,MAAO,UAAU,QAAQ,MAAO,OAAO,UAAU;AAGtE,IAAM,aAAa,CAAC,cAAiC;AAAA,EACnD,MAAM,UACJ,UAAU,SAAS,eAAe,IAAI,UAAU,IAAI,KAAK,KAAK;AAAA,EAChE,QAAS,UAAU,MAAO,OAAO;AAAA;AAInC,IAAM,SAAS,CAAC,WACd,MACE,UAAU,YAAY,QAAQ,SAAS,QAAQ,WAAW,IAAI,OAAO,KACvE;AAGF,IAAM,SAAS,CAAC,YACd,WAAW,UAAU,UAAU,UAAU,UAAU,SAAS,UAAU;AAExE,IAAM,aAAa,EAChB,KAAK,OAAO,OACb,WACU;AAAA,EACV;AAAA,EACA,MAAM,OAAO,IAAI;AAAA,EACjB,OAAO,OAAO,KAAK;AAAA,EACnB,KAAK,OAAO,GAAG;AACjB;AAEA,IAAM,UAAU,CAAC,KAAa,YAAoB,cAAsB;AAAA,EACtE,MAAM,UAAU,IAAI,KAAK,IAAI,IAAI,YAAY,CAAC,KAAK;AAAA,EACnD,MAAM,UAAU,CAAC,WAA2B;AAAA,IAC1C,MAAM,KAAK,SAAS,MAAM,MAAM;AAAA,IAChC,OAAO,YAAa,SAAS,IAAK,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;AAAA;AAAA,EAE1E,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA;AAG5C,IAAM,UAAU,CAAC,KAAa,OAAe,UAAkB;AAAA,EAC7D,IAAI,QAAQ,SAAS,GAAG;AAAA,IACtB,MAAM,OAAO,SAAS,QAAQ;AAAA,IAC9B,OAAO,CAAC,MAAM,MAAM,IAAI;AAAA,EAC1B;AAAA,EACA,OAAO,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG,GAAG;AAAA,EAC9C,MAAM,QAAQ,IAAI,QAAQ;AAAA,EAC1B,OAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,EACjB;AAAA;AAIF,IAAM,YAAY,CAAC,WAAmB,GAAW,MAAc;AAAA,EAC7D,MAAM,KAAK,YAAY,eAAe,IAAI,eAAe,MAAM;AAAA,EAC/D,MAAM,KAAK,YAAY,eAAe,IAAI,eAAe,MAAM;AAAA,EAC/D,MAAM,KAAK,YAAY,eAAe,IAAI,cAAc,MAAM;AAAA,EAC9D,OAAO;AAAA,IACL,eAAe,IAAI,eAAe,IAAI,eAAe;AAAA,IACrD,gBAAgB,IAAI,eAAe,IAAI,eAAe;AAAA,IACtD,gBAAgB,IAAI,eAAe,IAAI,cAAc;AAAA,EACvD;AAAA;AAIF,IAAM,UAAU,CAAC,WAAmB,GAAW,MAAc;AAAA,EAC3D,MAAM,UAAU,MAAM;AAAA,EACtB,MAAM,QAAQ,QAAS;AAAA,EACvB,MAAM,MAAM,YAAY,MAAM;AAAA,EAC9B,MAAM,KAAK,KAAK,IAAI;AAAA,EACpB,MAAM,KAAK,KAAK,IAAI;AAAA,EACpB,MAAM,OAAO,CAAC,MACZ,KAAK,IAAI,UAAU,KAAK,KAAK,MAAM,IAAI,MAAM;AAAA,EAC/C,MAAM,IAAI,KAAK,EAAE,IAAI;AAAA,EACrB,MAAM,IAAI,YAAY,QAAQ,UAAU,MAAM,IAAI,YAAY;AAAA,EAC9D,MAAM,IAAI,KAAK,EAAE,IAAI;AAAA,EAErB,MAAM,MACJ,oBAAoB,IAAI,sBAAsB,IAAI,sBAAsB;AAAA,EAC1E,MAAM,MACJ,sBAAsB,IAAI,qBAAqB,IAAI,uBAAuB;AAAA,EAC5E,MAAM,MACJ,uBAAuB,IAAI,uBAAuB,IAAI,oBAAoB;AAAA,EAC5E,OAAO;AAAA,IACL,qBAAqB,MACnB,oBAAoB,MACpB,qBAAqB;AAAA,IACvB,sBAAsB,MACpB,qBAAqB,MACrB,sBAAsB;AAAA,IACxB,sBAAsB,MACpB,sBAAsB,MACtB,qBAAqB;AAAA,EACzB;AAAA;AAIF,IAAM,cAAc,CAAC,WAAmB,QAAgB,QAAgB;AAAA,EACtE,MAAM,UAAW,MAAM,KAAK,KAAM;AAAA,EAClC,OAAO;AAAA,IACL;AAAA,IACA,SAAS,KAAK,IAAI,OAAO;AAAA,IACzB,SAAS,KAAK,IAAI,OAAO;AAAA,EAC3B;AAAA;AAMF,IAAM,MAAiB,EAAE,KAAK,OAAO,OAAO,UAAU;AAAA,EACpD,MAAM,UAAU,CAAC,cACf,MAAM,OAAO,WAAW,GAAG,IAAI,GAAG;AAAA,EACpC,OAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,IAAI;AAAA,IAClB,OAAO,QAAQ,KAAK;AAAA,IACpB,KAAK,QAAQ,GAAG;AAAA,EAClB;AAAA;AAIF,IAAM,cACJ,CACE,YAEF,EAAE,KAAK,GAAG,IAAI,UAAU;AAAA,EACtB,OAAO,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,QACrC,WAAW,GAAG,GACd,MAAM,OAAO,GAAG,GAAG,IAAI,GAAG,GAC1B,MAAM,OAAO,GAAG,GAAG,IAAI,GAAG,CAC5B;AAAA,EACA,OAAO,EAAE,OAAO,MAAM,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE;AAAA;AAG5E,IAAM,MAAM,YAAY,OAAO;AAG/B,IAAM,aAAa,IAAI,IAAuB;AAAA,EAC5C,CAAC,OAAO,GAAG;AAAA,EACX,CAAC,QAAQ,GAAG;AAAA,EACZ,CAAC,OAAO,YAAY,OAAO,CAAC;AAAA,EAC5B;AAAA,IACE;AAAA,IACA,EAAE,WAAW,GAAG,IAAI,UAClB,WACE,QAAQ,OAAO,WAAW,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC,GAC9D,KACF;AAAA,EACJ;AAAA,EACA;AAAA,IACE;AAAA,IACA,EAAE,WAAW,QAAQ,MAAM,UACzB,WACE,QACE,GAAG,YACD,OAAO,WAAW,GAAG,GACrB,OAAO,QAAQ,GAAG,GAClB,WAAW,GAAG,CAChB,CACF,GACA,KACF;AAAA,EACJ;AAAA,EACA;AAAA,IACE;AAAA,IACA,EAAE,WAAW,GAAG,IAAI,UAClB,WACE,UAAU,OAAO,WAAW,CAAC,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC,GAC9D,KACF;AAAA,EACJ;AAAA,EACA;AAAA,IACE;AAAA,IACA,EAAE,WAAW,QAAQ,MAAM,UACzB,WACE,UACE,GAAG,YACD,OAAO,WAAW,CAAC,GACnB,OAAO,QAAQ,GAAG,GAClB,WAAW,GAAG,CAChB,CACF,GACA,KACF;AAAA,EACJ;AAAA,EACA,CAAC,OAAO,GAAG;AAAA,EACX,CAAC,QAAQ,GAAG;AACd,CAAC;AAGM,IAAM,aAAa,CAAC,UAA+B;AAAA,EACxD,MAAM,QAAQ,MAAM,KAAK,EAAE,YAAY;AAAA,EACvC,MAAM,MAAM,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,GAAG,QAAQ;AAAA,EACzD,IAAI,QAAQ,WAAW;AAAA,IACrB,OAAO,QAAQ,GAAG;AAAA,EACpB;AAAA,EACA,MAAM,SAAS,cAAc,KAAK;AAAA,EAClC,MAAM,UAAU,UAAU,WAAW,IAAI,OAAO,IAAI;AAAA,EACpD,OAAO,UAAU,UACb,QACE,OAAO,UACP,OAAO,UAAU,YAAY,IAAI,MAAM,OAAO,OAAO,OAAO,CAAC,CAAC,CAChE,IACA;AAAA;AAIC,IAAM,YAAY,CAAC,OAAa,aAAyB;AAAA,EAC9D,MAAM,MAAM,CAAC,KAAa,WACxB,MAAM,MAAM,QAAQ,UAAU,IAAI,MAAM;AAAA,EAC1C,OAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM,IAAI,MAAM,MAAM,SAAS,IAAI;AAAA,IACnC,OAAO,IAAI,MAAM,OAAO,SAAS,KAAK;AAAA,IACtC,KAAK,IAAI,MAAM,KAAK,SAAS,GAAG;AAAA,EAClC;AAAA;AAIK,IAAM,YAAY,CAAC,UACxB,SAAS,OAAO,MAAM,GAAG,IACzB,SAAS,OAAO,MAAM,KAAK,IAC3B,SAAS,OAAO,MAAM,IAAI;AAMrB,IAAM,gBAAgB,CAAC,YAAkB,eAA6B;AAAA,EAC3E,MAAM,MAAM,UAAU,UAAU,YAAY,UAAU,CAAC;AAAA,EACvD,MAAM,SAAS,UAAU,UAAU;AAAA,EACnC,QAAQ,KAAK,IAAI,KAAK,MAAM,IAAI,SAAS,KAAK,IAAI,KAAK,MAAM,IAAI;AAAA;;;AC5d5D,IAAM,UAAU;AAAA,EACrB,MAAM,EAAE,MAAM,wBAAwB,OAAO,uBAAuB;AAAA,EACpE,OAAO,EAAE,MAAM,uBAAuB,OAAO,uBAAuB;AAAA,EACpE,QAAQ,EAAE,MAAM,uBAAuB,OAAO,sBAAsB;AAAA,EACpE,MAAM,EAAE,MAAM,uBAAuB,OAAO,sBAAsB;AAAA,EAClE,QAAQ,EAAE,MAAM,sBAAsB,OAAO,sBAAsB;AAAA,EACnE,KAAK,EAAE,MAAM,uBAAuB,OAAO,sBAAsB;AAAA,EACjE,MAAM,EAAE,MAAM,uBAAuB,OAAO,uBAAuB;AACrE;AAGO,IAAM,oBAAoB;AAO1B,IAAM,aAAa;AAAA,EACxB,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,iBAAiB;AAAA,EACnB;AACF;AAEA,IAAM,QAAQ;AAGd,IAAM,MAAM,CAAC,UACX,WAAW,KAAK,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,EAAE;AAGtD,IAAM,WAAW,CACtB,MACA,SACS,IAAI,WAAW,MAAM,KAAK;AAQ9B,IAAM,UAAU,CAAC,MAAY,SAA4B;AAAA,EAC9D,MAAM,SAAS,UAAU,MAAM,SAAS,MAAM,YAAY,CAAC;AAAA,EAC3D,MAAM,UAAU,cAAc,IAAI,KAAK,GAAG,MAAM;AAAA,EAChD,OAAO,WAAW,qBAChB,WAAW,cAAc,SAAS,MAAM,KAAK,GAAG,MAAM,IACpD,QACA,WAAW,MAAM;AAAA;AAIhB,IAAM,aAAa,CAAC,MAAc,SAA4B;AAAA,EACnE,MAAM,QAAQ,WAAW,IAAI;AAAA,EAC7B,OAAO,QAAQ,QAAQ,OAAO,IAAI,IAAI;AAAA;AASjC,IAAM,iBAAiB,CAAC,UAC7B,OAAO,OAAO,SAAS,KAAK;AAK9B,IAAM,YAAY;AAGlB,IAAM,YAAY,CAAC,OAAe,aAChC,UAAU,KAAK,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,IAAI;AAGhD,IAAM,gBAAgB,CAAC,OAAe,SACpC,eAAe,KAAK,IAChB,QAAQ,OAAO,QACf,UAAU,OAAO,QAAQ,KAAK,KAAK;AAGzC,IAAM,kBAAkB,CAAC,UACvB,SAAS,UAAU,KAAK,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,IAAI;AAEzD,IAAM,QAAQ;AAAA,EACZ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AACN;AAEA,IAAM,YAAY,CAAC,UAA0B,KAAK,UAAU,KAAK;AAEjE,IAAM,qBAAqB,CAAC,UAC1B,OAAO,UAAU,KAAK;AAExB,IAAM,WAAW,CAAC,MAAc,UAC9B,QAAQ,CAAC,KAAK,SAAS,QAAQ,IAAI,CAAC;AAQtC,IAAM,eAAe,CACnB,OACA,YAEA;AAAA,EACE,qBAAqB,QAAQ;AAAA,EAC7B,gCAAgC,WAAW,QAAQ,QAAQ,OAAO;AAAA,EAClE,GAAG,SAAS,kBAAkB,QAAQ,MAAM;AAAA,EAC5C,GAAG,SACD,6BACA,QAAQ,SAAS,WAAW,QAAQ,QAAQ,OAAO,IAAI,IACzD;AAAA,EACA,GAAG,SAAS,sBAAsB,gBAAgB,MAAM,YAAY,KAAK,CAAC;AAAA,EAC1E,GAAG,SACD,4BACA,MAAM,iBAAiB,QACnB,mBAAmB,MAAM,gBAAgB,KAAK,IAC9C,IACN;AAAA,EACA,qBAAqB,QAAQ;AAC/B,EACG,OAAO,OAAO,EACd,KAAK;AAAA,CAAI;AAEd,IAAM,eAAe,CACnB,OACA,YACW;AAAA,EAKX,MAAM,SAAS;AAAA,IACb,qBAAqB,QAAQ;AAAA,IAC7B,gCAAgC,WAAW,QAAQ,QAAQ,MAAM;AAAA,IACjE,GAAG,SAAS,kBAAkB,QAAQ,MAAM;AAAA,IAC5C,GAAG,SACD,6BACA,QAAQ,SAAS,WAAW,QAAQ,QAAQ,MAAM,IAAI,IACxD;AAAA,IACA,GAAG,SAAS,sBAAsB,gBAAgB,MAAM,YAAY,IAAI,CAAC;AAAA,IACzE,GAAG,SACD,4BACA,MAAM,iBAAiB,OACnB,mBAAmB,MAAM,gBAAgB,IAAI,IAC7C,IACN;AAAA,EACF,EAAE,OAAO,OAAO;AAAA,EAChB,OAAO;AAAA,EACP,OAAO,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA;AAYX,IAAM,gBAAgB,CAC3B,WACkB;AAAA,EAClB,MAAM,cAAc,MAAM,OAAO,MAAM,MAAM;AAAA,EAC7C,OAAO,cAAc,MAAM,OAAO,OAAO,OAAO;AAClD;AAGO,IAAM,gBAAgB,CAC3B,UAEA,MAAM,SACF;AAAA,EACE,MAAM,cAAc,MAAM,QAAQ,MAAM;AAAA,EACxC,OAAO,cAAc,MAAM,QAAQ,OAAO;AAC5C,IACA;AAGC,IAAM,gBAAgB,CAAC,UAC5B,MAAM,MAAM;AAQP,IAAM,gBAAgB,CAAC,UAA2C;AAAA,EACvE,MAAM,SAAS,cAAc,KAAK;AAAA,EAClC,MAAM,SAAS,cAAc,KAAK;AAAA,EAClC,MAAM,OAAO,aAAa,OAAO;AAAA,IAC/B,QAAQ,OAAO;AAAA,IACf,QAAQ,QAAQ,SAAS;AAAA,IACzB,QAAQ,MAAM,MAAM;AAAA,EACtB,CAAC;AAAA,EACD,MAAM,OAAO,aAAa,OAAO;AAAA,IAC/B,QAAQ,OAAO;AAAA,IACf,QAAQ,QAAQ,QAAQ;AAAA,EAC1B,CAAC;AAAA,EAED,OAAO;AAAA;AAAA,EAEP;AAAA;AAAA,EAEA;AAAA;",
9
- "debugId": "9A390AB579BDCE3E64756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "5C70C668C91C92AB64756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -8,28 +8,28 @@ import {
8
8
  import {
9
9
  commandsFor,
10
10
  detectProjectPackageManager
11
- } from "./chunk-xkz5xbtv.js";
11
+ } from "./chunk-124fvmzq.js";
12
12
  import"./chunk-zccbjcj0.js";
13
- import"./chunk-zf748avv.js";
14
- import"./chunk-2f3ndkpw.js";
15
- import"./chunk-43zcf4gz.js";
16
- import"./chunk-4h8z9vv5.js";
17
- import"./chunk-amrb6hgh.js";
18
- import"./chunk-ta27feev.js";
13
+ import"./chunk-nbyvgnnm.js";
14
+ import"./chunk-desvm72z.js";
15
+ import"./chunk-0pmb4tr4.js";
16
+ import"./chunk-dpy8qdjf.js";
17
+ import"./chunk-ckrcm08h.js";
18
+ import"./chunk-j1x92mx9.js";
19
19
  import"./chunk-jq5n4avg.js";
20
- import"./chunk-cm89scdv.js";
21
- import"./chunk-2f7n4qzt.js";
20
+ import"./chunk-es8h0v3j.js";
21
+ import"./chunk-dqhg54mr.js";
22
22
  import {
23
23
  eject
24
- } from "./chunk-rekqz4qg.js";
24
+ } from "./chunk-k3gr1nm9.js";
25
25
  import {
26
26
  refuseIfDevRunning
27
- } from "./chunk-cmtcnh9f.js";
27
+ } from "./chunk-tfycddbt.js";
28
28
  import {
29
29
  updatePackageScripts,
30
30
  isEjectedProject
31
- } from "./chunk-py62fewh.js";
32
- import"./chunk-6bm0xpgd.js";
31
+ } from "./chunk-53jqw8z0.js";
32
+ import"./chunk-s0bdnc7v.js";
33
33
 
34
34
  // src/cli/commands/eject.ts
35
35
  import { defineCommand } from "citty";
@@ -95,4 +95,4 @@ export {
95
95
  };
96
96
 
97
97
  //# debugId=31B30D27F177D0A364756E2164756E21
98
- //# sourceMappingURL=chunk-zhvd6adm.js.map
98
+ //# sourceMappingURL=chunk-gfc5fqvf.js.map
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import"./chunk-zccbjcj0.js";
3
3
  import {
4
+ referenceSpecFiles,
4
5
  resolveRuntimeDir
5
- } from "./chunk-xkz5xbtv.js";
6
+ } from "./chunk-124fvmzq.js";
6
7
  import {
7
8
  refreshBlumeContent,
8
9
  showBlumeErrorOverlay,
9
10
  generateRuntime
10
- } from "./chunk-zf748avv.js";
11
+ } from "./chunk-nbyvgnnm.js";
11
12
  import {
12
13
  commandMeta,
13
14
  normalizeHost,
@@ -15,33 +16,36 @@ import {
15
16
  logger,
16
17
  reportDiagnostics
17
18
  } from "./index.js";
18
- import"./chunk-2f3ndkpw.js";
19
+ import"./chunk-desvm72z.js";
19
20
  import {
20
21
  scanProject
21
- } from "./chunk-43zcf4gz.js";
22
- import"./chunk-ta27feev.js";
22
+ } from "./chunk-0pmb4tr4.js";
23
+ import"./chunk-ckrcm08h.js";
24
+ import"./chunk-j1x92mx9.js";
23
25
  import"./chunk-jq5n4avg.js";
24
- import"./chunk-4h8z9vv5.js";
25
- import"./chunk-cm89scdv.js";
26
- import"./chunk-2f7n4qzt.js";
27
- import"./chunk-amrb6hgh.js";
26
+ import"./chunk-dpy8qdjf.js";
27
+ import"./chunk-es8h0v3j.js";
28
+ import"./chunk-dqhg54mr.js";
28
29
  import {
29
30
  parsePort
30
- } from "./chunk-4ejxbzee.js";
31
+ } from "./chunk-74wfhv79.js";
32
+ import {
33
+ astroBuildDiagnostics
34
+ } from "./chunk-150jk7km.js";
31
35
  import {
32
36
  DevLockHeldError,
33
37
  acquireDevLock,
34
38
  updateDevLockPort,
35
39
  describeDevLock
36
- } from "./chunk-cmtcnh9f.js";
40
+ } from "./chunk-tfycddbt.js";
37
41
  import {
38
42
  refuseIfEjected
39
- } from "./chunk-py62fewh.js";
43
+ } from "./chunk-53jqw8z0.js";
40
44
  import {
41
45
  prepareProject
42
- } from "./chunk-5ffywsmb.js";
43
- import"./chunk-cy5bm0j0.js";
44
- import"./chunk-6bm0xpgd.js";
46
+ } from "./chunk-297ajdcv.js";
47
+ import"./chunk-ms9z66nz.js";
48
+ import"./chunk-s0bdnc7v.js";
45
49
 
46
50
  // src/cli/commands/dev.ts
47
51
  import { dev } from "astro";
@@ -116,7 +120,16 @@ var devCommand = defineCommand({
116
120
  root: project.context.outDir,
117
121
  server: { host: normalizeHost(args.host), open, port: listenPort }
118
122
  });
119
- let server = await createServer(explicitPort, args.open ?? false);
123
+ let server;
124
+ try {
125
+ server = await createServer(explicitPort, args.open ?? false);
126
+ } catch (error) {
127
+ if (error instanceof BlumeError || !(error instanceof Error)) {
128
+ throw error;
129
+ }
130
+ reportDiagnostics(astroBuildDiagnostics(error), root);
131
+ process.exit(1);
132
+ }
120
133
  const boundPort = boundPortOf(server, port);
121
134
  if (boundPort !== port) {
122
135
  updateDevLockPort(outDir, boundPort);
@@ -158,7 +171,8 @@ var devCommand = defineCommand({
158
171
  const fileTargets = [
159
172
  project.context.configFile,
160
173
  project.context.themeFile,
161
- project.context.componentsFile
174
+ project.context.componentsFile,
175
+ ...referenceSpecFiles(project.config, root)
162
176
  ].filter((target) => target !== null);
163
177
  const projectWatcher = watch([...dirTargets, ...fileTargets], {
164
178
  ignoreInitial: true
@@ -185,5 +199,5 @@ export {
185
199
  devCommand
186
200
  };
187
201
 
188
- //# debugId=B868244539C2BD5E64756E2164756E21
189
- //# sourceMappingURL=chunk-nd1821sk.js.map
202
+ //# debugId=A412AE4087B70D2F64756E2164756E21
203
+ //# sourceMappingURL=chunk-gxtg6ed2.js.map