blume 2.0.0 → 2.0.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 (454) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +110 -0
  3. package/README.md +2 -2
  4. package/dist/cli/{chunk-f2972sbt.js → chunk-00gs3wqs.js} +1 -1
  5. package/dist/cli/{chunk-fa25z98p.js → chunk-273ygyr4.js} +4 -3
  6. package/dist/cli/chunk-273ygyr4.js.map +11 -0
  7. package/dist/cli/{chunk-pat2zzwc.js → chunk-3yce002v.js} +21 -8
  8. package/dist/cli/{chunk-pat2zzwc.js.map → chunk-3yce002v.js.map} +4 -4
  9. package/dist/cli/{chunk-d1tadaw7.js → chunk-4e9b9ra6.js} +17 -7
  10. package/dist/cli/chunk-4e9b9ra6.js.map +10 -0
  11. package/dist/cli/{chunk-zg2gtj10.js → chunk-5r8g91qn.js} +352 -676
  12. package/dist/cli/chunk-5r8g91qn.js.map +34 -0
  13. package/dist/cli/{chunk-11j0384y.js → chunk-6dtt0zfn.js} +14 -14
  14. package/dist/cli/{chunk-11j0384y.js.map → chunk-6dtt0zfn.js.map} +3 -3
  15. package/dist/cli/{chunk-bw22s759.js → chunk-6k4ftwze.js} +38 -19
  16. package/dist/cli/{chunk-bw22s759.js.map → chunk-6k4ftwze.js.map} +4 -4
  17. package/dist/cli/{chunk-sqn5t4q0.js → chunk-7mbqtmgb.js} +16 -7
  18. package/dist/cli/chunk-7mbqtmgb.js.map +10 -0
  19. package/dist/cli/{chunk-79njf86q.js → chunk-7vtckvaw.js} +21 -19
  20. package/dist/cli/chunk-7vtckvaw.js.map +11 -0
  21. package/dist/cli/{chunk-fh5hj5jt.js → chunk-8g8ytmgx.js} +17 -18
  22. package/dist/cli/{chunk-fh5hj5jt.js.map → chunk-8g8ytmgx.js.map} +2 -2
  23. package/dist/cli/{chunk-1w8dp3qb.js → chunk-91ws1n6j.js} +18 -15
  24. package/dist/cli/chunk-91ws1n6j.js.map +10 -0
  25. package/dist/cli/{chunk-7ez8ny0t.js → chunk-bbnwccaz.js} +2 -2
  26. package/dist/cli/{chunk-5a2z0198.js → chunk-bfwp9vp6.js} +18 -10
  27. package/dist/cli/chunk-bfwp9vp6.js.map +10 -0
  28. package/dist/cli/{chunk-ernrthtr.js → chunk-d1v5rhy0.js} +14 -15
  29. package/dist/cli/{chunk-ernrthtr.js.map → chunk-d1v5rhy0.js.map} +2 -2
  30. package/dist/cli/{chunk-a9kptbw5.js → chunk-ddndchfr.js} +21 -6
  31. package/dist/cli/chunk-ddndchfr.js.map +14 -0
  32. package/dist/cli/{chunk-zxccj738.js → chunk-esh98wmb.js} +1 -1
  33. package/dist/cli/{chunk-88cpgt6h.js → chunk-fsmrqk8a.js} +1 -1
  34. package/dist/cli/{chunk-b5aj94ah.js → chunk-g698a744.js} +5 -5
  35. package/dist/cli/{chunk-jts8mvcz.js → chunk-gs7r695n.js} +9 -3
  36. package/dist/cli/{chunk-jts8mvcz.js.map → chunk-gs7r695n.js.map} +3 -3
  37. package/dist/cli/{chunk-41za066z.js → chunk-h2ez8dzb.js} +4 -4
  38. package/dist/cli/{chunk-by2290sx.js → chunk-h7k3nq3v.js} +2 -2
  39. package/dist/cli/{chunk-j8mw0za6.js → chunk-hqp2ajnh.js} +252 -123
  40. package/dist/cli/chunk-hqp2ajnh.js.map +35 -0
  41. package/dist/cli/{chunk-mnqj32sj.js → chunk-hr8ne106.js} +119 -50
  42. package/dist/cli/chunk-hr8ne106.js.map +13 -0
  43. package/dist/cli/{chunk-mwt1k8n7.js → chunk-j85scx15.js} +74 -30
  44. package/dist/cli/chunk-j85scx15.js.map +10 -0
  45. package/dist/cli/{chunk-z01ze5c1.js → chunk-k7pj68a8.js} +63 -22
  46. package/dist/cli/chunk-k7pj68a8.js.map +11 -0
  47. package/dist/cli/{chunk-2q1dwty4.js → chunk-mqc662a6.js} +8 -8
  48. package/dist/cli/{chunk-2q1dwty4.js.map → chunk-mqc662a6.js.map} +4 -4
  49. package/dist/cli/{chunk-y3e45rc8.js → chunk-n1yg3tj3.js} +4 -4
  50. package/dist/cli/{chunk-bctazmbk.js → chunk-nfcyttvj.js} +17 -6
  51. package/dist/cli/chunk-nfcyttvj.js.map +10 -0
  52. package/dist/cli/{chunk-6k8vp3ta.js → chunk-pbg5a4s3.js} +60 -28
  53. package/dist/cli/chunk-pbg5a4s3.js.map +19 -0
  54. package/dist/cli/{chunk-d80hr03s.js → chunk-ppzjqwx2.js} +24 -17
  55. package/dist/cli/{chunk-d80hr03s.js.map → chunk-ppzjqwx2.js.map} +4 -4
  56. package/dist/cli/{chunk-beat36xx.js → chunk-qkb5a8sa.js} +25 -10
  57. package/dist/cli/chunk-qkb5a8sa.js.map +10 -0
  58. package/dist/cli/{chunk-bnbmcwfb.js → chunk-sqw4ekg1.js} +5 -5
  59. package/dist/cli/{chunk-bnbmcwfb.js.map → chunk-sqw4ekg1.js.map} +3 -3
  60. package/dist/cli/{chunk-xaz13gwg.js → chunk-v6ya5kcb.js} +3268 -1150
  61. package/dist/cli/chunk-v6ya5kcb.js.map +189 -0
  62. package/dist/cli/{chunk-tzne8qfq.js → chunk-w4bxdvsa.js} +18 -15
  63. package/dist/cli/chunk-w4bxdvsa.js.map +10 -0
  64. package/dist/cli/{chunk-f7t03s3g.js → chunk-wdrt2k2v.js} +2 -2
  65. package/dist/cli/{chunk-z1f5arsg.js → chunk-xh43dwgw.js} +170 -55
  66. package/dist/cli/chunk-xh43dwgw.js.map +36 -0
  67. package/dist/cli/{chunk-pnnvybbk.js → chunk-zp79m0ts.js} +5 -5
  68. package/dist/cli/{chunk-pnnvybbk.js.map → chunk-zp79m0ts.js.map} +2 -2
  69. package/dist/cli/index.js +160 -35
  70. package/dist/cli/index.js.map +4 -4
  71. package/dist/types/ai/agent-readability.d.ts +1 -1
  72. package/dist/types/ai/agent-surface.d.ts +32 -0
  73. package/dist/types/ai/api/paths.d.ts +1 -1
  74. package/dist/types/ai/api-catalog.d.ts +7 -1
  75. package/dist/types/ai/ask-context.d.ts +14 -7
  76. package/dist/types/ai/ask.d.ts +43 -43
  77. package/dist/types/ai/component-markdown.d.ts +4 -4
  78. package/dist/types/ai/index.d.ts +3 -3
  79. package/dist/types/ai/openapi-components.d.ts +1 -1
  80. package/dist/types/ai/relative-links.d.ts +9 -4
  81. package/dist/types/ai/serializers.d.ts +1 -1
  82. package/dist/types/ai/static-expression.d.ts +28 -0
  83. package/dist/types/ai/visibility.d.ts +1 -1
  84. package/dist/types/analytics/databuddy.d.ts +43 -0
  85. package/dist/types/analytics/index.d.ts +2 -0
  86. package/dist/types/analytics/schema.d.ts +14 -0
  87. package/dist/types/cli/env.d.ts +5 -0
  88. package/dist/types/cli/init/scaffold.d.ts +19 -3
  89. package/dist/types/cli/init/starter-spec.d.ts +11 -0
  90. package/dist/types/core/base-path.d.ts +9 -0
  91. package/dist/types/core/config-input.d.ts +21 -21
  92. package/dist/types/core/config.d.ts +5 -5
  93. package/dist/types/core/data.d.ts +3 -3
  94. package/dist/types/core/graph.d.ts +2 -0
  95. package/dist/types/core/i18n-ui.d.ts +37 -8
  96. package/dist/types/core/i18n.d.ts +7 -1
  97. package/dist/types/core/links.d.ts +3 -1
  98. package/dist/types/core/load-module.d.ts +10 -0
  99. package/dist/types/core/locale-links.d.ts +12 -2
  100. package/dist/types/core/meta.d.ts +5 -1
  101. package/dist/types/core/nav-diagnostics.d.ts +10 -0
  102. package/dist/types/core/navigation.d.ts +38 -0
  103. package/dist/types/core/ordering-prefix.d.ts +4 -0
  104. package/dist/types/core/safe-links.d.ts +3 -1
  105. package/dist/types/core/schema.d.ts +57 -18
  106. package/dist/types/core/sources/github-releases.d.ts +5 -0
  107. package/dist/types/core/sources/lower.d.ts +14 -2
  108. package/dist/types/core/sources/normalize.d.ts +10 -1
  109. package/dist/types/core/sources/remote.d.ts +11 -1
  110. package/dist/types/core/sources/resolve.d.ts +12 -0
  111. package/dist/types/core/sources/types.d.ts +31 -0
  112. package/dist/types/core/types.d.ts +9 -0
  113. package/dist/types/core/unrecognized-keys.d.ts +1 -1
  114. package/dist/types/deploy/adapters/node.d.ts +5 -2
  115. package/dist/types/deploy/adapters/types.d.ts +7 -0
  116. package/dist/types/deploy/cloudflare-negotiation.d.ts +3 -2
  117. package/dist/types/deploy/headers.d.ts +31 -7
  118. package/dist/types/deploy/node-headers.d.ts +43 -8
  119. package/dist/types/deploy/platforms/netlify.d.ts +27 -2
  120. package/dist/types/deploy/platforms/node.d.ts +6 -5
  121. package/dist/types/deploy/platforms/types.d.ts +7 -0
  122. package/dist/types/deploy/platforms/vercel.d.ts +3 -2
  123. package/dist/types/deploy/redirects.d.ts +7 -2
  124. package/dist/types/deploy/vercel-negotiation.d.ts +3 -2
  125. package/dist/types/openapi/model.d.ts +20 -6
  126. package/dist/types/search/documents.d.ts +1 -1
  127. package/dist/types/search/orama-index.d.ts +1 -1
  128. package/dist/types/search/sync/algolia.d.ts +3 -1
  129. package/docs/01-quickstart.mdx +3 -2
  130. package/docs/02-deployment.mdx +21 -12
  131. package/docs/03-upgrading.mdx +22 -9
  132. package/docs/04-migrating.mdx +4 -4
  133. package/docs/08-faq.mdx +12 -5
  134. package/docs/advanced/changelog.mdx +1 -1
  135. package/docs/advanced/custom-pages.mdx +5 -3
  136. package/docs/advanced/skills.mdx +1 -1
  137. package/docs/cli/audit.mdx +5 -5
  138. package/docs/cli/doctor.mdx +4 -4
  139. package/docs/cli/evals.mdx +9 -9
  140. package/docs/cli/index.mdx +6 -3
  141. package/docs/cli/translate.mdx +8 -8
  142. package/docs/configuration/analytics.mdx +23 -2
  143. package/docs/configuration/{ask-ai.mdx → assistant.mdx} +20 -20
  144. package/docs/configuration/customization.mdx +5 -4
  145. package/docs/configuration/index.mdx +7 -5
  146. package/docs/configuration/meta.ts +1 -1
  147. package/docs/configuration/search.mdx +2 -2
  148. package/docs/content/components.mdx +1 -1
  149. package/docs/content/frontmatter.mdx +5 -1
  150. package/docs/content/i18n.mdx +3 -3
  151. package/docs/content/index.mdx +4 -2
  152. package/docs/content/islands.mdx +1 -1
  153. package/docs/content/meta.mdx +5 -3
  154. package/docs/content/navigation.mdx +29 -4
  155. package/docs/content/sources.mdx +18 -12
  156. package/docs/content/versioning.mdx +1 -0
  157. package/docs/discoverability/agent-discovery.mdx +22 -8
  158. package/docs/discoverability/index.mdx +3 -3
  159. package/docs/discoverability/llms-txt.mdx +2 -5
  160. package/docs/discoverability/markdown.mdx +5 -3
  161. package/docs/discoverability/mcp.mdx +4 -0
  162. package/docs/discoverability/metadata.mdx +3 -2
  163. package/docs/discoverability/open-graph.mdx +6 -4
  164. package/docs/discoverability/rss.mdx +3 -1
  165. package/docs/index.mdx +2 -2
  166. package/docs/references/asyncapi.mdx +1 -1
  167. package/docs/references/graphql.mdx +2 -2
  168. package/docs/references/openapi.mdx +3 -3
  169. package/package.json +1 -1
  170. package/skills/blume/SKILL.md +5 -5
  171. package/skills/blume-migrate/SKILL.md +6 -6
  172. package/skills/blume-migrate/references/docusaurus.md +6 -6
  173. package/skills/blume-migrate/references/mintlify.md +3 -3
  174. package/skills/blume-migrate/references/monorepo.md +1 -1
  175. package/skills/blume-migrate/references/nextra.md +1 -1
  176. package/skills/blume-migrate/references/starlight.md +5 -5
  177. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +2 -2
  178. package/skills/blume-update-docs/references/audit-checklist.md +1 -1
  179. package/src/ai/agent-readability.ts +4 -4
  180. package/src/ai/agent-surface.ts +56 -0
  181. package/src/ai/api/paths.ts +1 -1
  182. package/src/ai/api/spec.ts +15 -2
  183. package/src/ai/api-catalog.ts +7 -1
  184. package/src/ai/ask-context.ts +21 -9
  185. package/src/ai/ask-data.ts +28 -14
  186. package/src/ai/ask.ts +84 -71
  187. package/src/ai/component-markdown.ts +43 -37
  188. package/src/ai/cors.ts +3 -3
  189. package/src/ai/index.ts +16 -16
  190. package/src/ai/link-headers.ts +8 -3
  191. package/src/ai/llms.ts +4 -3
  192. package/src/ai/markdown.ts +23 -11
  193. package/src/ai/mcp/server.ts +78 -7
  194. package/src/ai/openapi-components.ts +1 -1
  195. package/src/ai/relative-links.ts +78 -10
  196. package/src/ai/serializers.ts +1 -1
  197. package/src/ai/static-expression.ts +416 -0
  198. package/src/ai/visibility.ts +46 -15
  199. package/src/analytics/databuddy.ts +67 -0
  200. package/src/analytics/head.ts +4 -0
  201. package/src/analytics/index.ts +2 -0
  202. package/src/analytics/posthog.ts +21 -3
  203. package/src/analytics/schema.ts +2 -0
  204. package/src/astro/generate.ts +90 -45
  205. package/src/astro/module-types.ts +1 -1
  206. package/src/astro/runtime-deps.ts +6 -6
  207. package/src/astro/templates.ts +87 -49
  208. package/src/audit/catalog.ts +2 -2
  209. package/src/audit/checks/assets.ts +25 -5
  210. package/src/audit/checks/content.ts +20 -2
  211. package/src/audit/checks/i18n.ts +46 -8
  212. package/src/audit/checks/indexability.ts +39 -19
  213. package/src/audit/checks/links.ts +14 -0
  214. package/src/audit/checks/llms.ts +6 -3
  215. package/src/audit/checks/network.ts +3 -1
  216. package/src/audit/checks/og-image.ts +10 -0
  217. package/src/audit/checks/robots.ts +6 -1
  218. package/src/audit/checks/sitemap.ts +56 -31
  219. package/src/audit/checks/social.ts +21 -2
  220. package/src/audit/crawl.ts +88 -15
  221. package/src/audit/report.ts +54 -17
  222. package/src/audit/run.ts +1 -0
  223. package/src/audit/types.ts +18 -0
  224. package/src/audit/url.ts +37 -6
  225. package/src/blume-modules.d.ts +2 -2
  226. package/src/cli/build-failure.ts +50 -0
  227. package/src/cli/commands/audit.ts +8 -1
  228. package/src/cli/commands/build.ts +19 -5
  229. package/src/cli/commands/check.ts +2 -0
  230. package/src/cli/commands/doctor.ts +7 -5
  231. package/src/cli/commands/eval.ts +4 -10
  232. package/src/cli/commands/init.ts +15 -5
  233. package/src/cli/commands/migrate.ts +2 -2
  234. package/src/cli/commands/preview.ts +15 -0
  235. package/src/cli/commands/sync.ts +2 -0
  236. package/src/cli/commands/translate.ts +12 -9
  237. package/src/cli/commands/upgrade.ts +13 -2
  238. package/src/cli/eject-scripts.ts +32 -7
  239. package/src/cli/env.ts +12 -1
  240. package/src/cli/init/scaffold.ts +117 -11
  241. package/src/cli/init/starter-spec.ts +235 -0
  242. package/src/cli/required-secrets.ts +3 -3
  243. package/src/components/content/AccordionItem.astro +26 -22
  244. package/src/components/content/Badge.astro +2 -9
  245. package/src/components/content/Card.astro +2 -2
  246. package/src/components/content/Component.astro +9 -3
  247. package/src/components/content/Expandable.astro +5 -1
  248. package/src/components/content/Frame.astro +2 -7
  249. package/src/components/content/GithubInfo.astro +12 -2
  250. package/src/components/content/Prompt.astro +2 -7
  251. package/src/components/content/Tabs.astro +54 -5
  252. package/src/components/content/Tile.astro +1 -1
  253. package/src/components/content/Tooltip.astro +69 -7
  254. package/src/components/content/Tree.astro +7 -2
  255. package/src/components/content/TypeTable.astro +10 -5
  256. package/src/components/content/Update.astro +8 -2
  257. package/src/components/content/auto-type-table.ts +4 -1
  258. package/src/components/content/badge-color.ts +17 -0
  259. package/src/components/content/base-href.ts +18 -3
  260. package/src/components/content/inline-markdown.ts +27 -7
  261. package/src/components/copy-feedback.ts +36 -9
  262. package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
  263. package/src/components/islands/{ask-ai.tsx → assistant.tsx} +39 -25
  264. package/src/components/islands/hooks.ts +21 -14
  265. package/src/components/islands/webmcp.ts +12 -8
  266. package/src/components/layout/Banner.astro +23 -4
  267. package/src/components/layout/Header.astro +32 -19
  268. package/src/components/layout/Logo.astro +5 -0
  269. package/src/components/layout/NavSelector.astro +6 -1
  270. package/src/components/layout/NavTabMenu.astro +133 -0
  271. package/src/components/layout/NavTree.astro +15 -6
  272. package/src/components/layout/NavTreeCache.astro +5 -2
  273. package/src/components/layout/NavTreeScript.astro +45 -5
  274. package/src/components/layout/PageLayout.astro +28 -14
  275. package/src/components/layout/Pagination.astro +7 -7
  276. package/src/components/layout/ReferenceLayout.astro +5 -2
  277. package/src/components/layout/RootLayout.astro +27 -14
  278. package/src/components/layout/Search.astro +18 -14
  279. package/src/components/layout/analytics-client.ts +3 -1
  280. package/src/components/layout/drawer-inert.ts +1 -1
  281. package/src/components/openapi/GraphqlType.astro +11 -3
  282. package/src/components/openapi/MessageComposer.astro +1 -1
  283. package/src/components/openapi/Operation.astro +21 -5
  284. package/src/components/openapi/PanelTabs.astro +4 -1
  285. package/src/components/openapi/Playground.astro +8 -2
  286. package/src/components/openapi/RequestPanel.astro +9 -5
  287. package/src/components/openapi/SchemaProperty.astro +11 -33
  288. package/src/components/openapi/SchemaTable.astro +27 -52
  289. package/src/components/openapi/description.ts +2 -2
  290. package/src/components/openapi/helpers.ts +90 -12
  291. package/src/components/openapi/message-composer.ts +8 -0
  292. package/src/components/openapi/message-model.ts +12 -2
  293. package/src/components/openapi/message.ts +4 -1
  294. package/src/components/openapi/operation-model.ts +40 -8
  295. package/src/components/openapi/panel.ts +29 -5
  296. package/src/components/openapi/playground-client.ts +37 -7
  297. package/src/components/openapi/playground-schema.ts +25 -6
  298. package/src/components/openapi/request.ts +2 -0
  299. package/src/components/openapi/schema-tree.ts +203 -0
  300. package/src/components/openapi/snippets.ts +30 -15
  301. package/src/components/openapi/validate-json.ts +1 -1
  302. package/src/core/base-path.ts +15 -0
  303. package/src/core/code-fences.ts +1 -1
  304. package/src/core/config-input.ts +23 -23
  305. package/src/core/config.ts +21 -7
  306. package/src/core/data.ts +3 -3
  307. package/src/core/diagnostics.ts +217 -30
  308. package/src/core/graph.ts +120 -11
  309. package/src/core/i18n-ui.ts +74 -11
  310. package/src/core/i18n.ts +13 -2
  311. package/src/core/links.ts +7 -4
  312. package/src/core/load-module.ts +20 -0
  313. package/src/core/locale-links.ts +17 -17
  314. package/src/core/manifest.ts +3 -2
  315. package/src/core/meta.ts +69 -6
  316. package/src/core/nav-diagnostics.ts +56 -1
  317. package/src/core/navigation.ts +245 -76
  318. package/src/core/ordering-prefix.ts +27 -0
  319. package/src/core/project-graph.ts +23 -1
  320. package/src/core/request-body.ts +1 -1
  321. package/src/core/safe-href.ts +53 -1
  322. package/src/core/safe-links.ts +11 -2
  323. package/src/core/schema.ts +95 -34
  324. package/src/core/server-features.ts +2 -2
  325. package/src/core/sources/assets.ts +83 -41
  326. package/src/core/sources/contentful-rich-text.ts +3 -2
  327. package/src/core/sources/contentful.ts +25 -12
  328. package/src/core/sources/filesystem.ts +5 -1
  329. package/src/core/sources/github-releases.ts +106 -5
  330. package/src/core/sources/lexical.ts +9 -4
  331. package/src/core/sources/lower.ts +79 -26
  332. package/src/core/sources/mdx-remote.ts +1 -0
  333. package/src/core/sources/normalize.ts +132 -30
  334. package/src/core/sources/notion.ts +26 -10
  335. package/src/core/sources/obsidian.ts +17 -3
  336. package/src/core/sources/payload.ts +1 -0
  337. package/src/core/sources/portable-text.ts +63 -44
  338. package/src/core/sources/remote.ts +18 -2
  339. package/src/core/sources/resolve.ts +52 -33
  340. package/src/core/sources/sanity.ts +1 -0
  341. package/src/core/sources/strapi-blocks.ts +9 -4
  342. package/src/core/sources/strapi.ts +1 -0
  343. package/src/core/sources/types.ts +31 -0
  344. package/src/core/types.ts +9 -0
  345. package/src/core/ui-packs/ar.ts +17 -5
  346. package/src/core/ui-packs/bg.ts +17 -5
  347. package/src/core/ui-packs/bn.ts +17 -5
  348. package/src/core/ui-packs/ca.ts +17 -5
  349. package/src/core/ui-packs/cs.ts +17 -5
  350. package/src/core/ui-packs/da.ts +17 -5
  351. package/src/core/ui-packs/de.ts +17 -5
  352. package/src/core/ui-packs/el.ts +17 -5
  353. package/src/core/ui-packs/es.ts +17 -5
  354. package/src/core/ui-packs/fa.ts +17 -5
  355. package/src/core/ui-packs/fi.ts +17 -5
  356. package/src/core/ui-packs/fr.ts +17 -5
  357. package/src/core/ui-packs/he.ts +17 -5
  358. package/src/core/ui-packs/hi.ts +17 -5
  359. package/src/core/ui-packs/hr.ts +17 -5
  360. package/src/core/ui-packs/hu.ts +17 -5
  361. package/src/core/ui-packs/id.ts +17 -5
  362. package/src/core/ui-packs/it.ts +17 -5
  363. package/src/core/ui-packs/ja.ts +17 -5
  364. package/src/core/ui-packs/ko.ts +17 -5
  365. package/src/core/ui-packs/nl.ts +17 -5
  366. package/src/core/ui-packs/no.ts +17 -5
  367. package/src/core/ui-packs/pl.ts +17 -5
  368. package/src/core/ui-packs/pt-br.ts +17 -5
  369. package/src/core/ui-packs/pt.ts +17 -5
  370. package/src/core/ui-packs/ro.ts +17 -5
  371. package/src/core/ui-packs/ru.ts +17 -5
  372. package/src/core/ui-packs/sk.ts +17 -5
  373. package/src/core/ui-packs/sr.ts +17 -5
  374. package/src/core/ui-packs/sv.ts +17 -5
  375. package/src/core/ui-packs/th.ts +17 -5
  376. package/src/core/ui-packs/tr.ts +17 -5
  377. package/src/core/ui-packs/uk.ts +17 -5
  378. package/src/core/ui-packs/vi.ts +17 -5
  379. package/src/core/ui-packs/zh-tw.ts +17 -5
  380. package/src/core/ui-packs/zh.ts +17 -5
  381. package/src/core/unrecognized-keys.ts +1 -1
  382. package/src/core/version-cut.ts +17 -2
  383. package/src/core/versions.ts +4 -1
  384. package/src/deploy/adapters/node.ts +5 -2
  385. package/src/deploy/adapters/registry.ts +2 -1
  386. package/src/deploy/adapters/types.ts +13 -1
  387. package/src/deploy/artifacts.ts +25 -5
  388. package/src/deploy/cloudflare-negotiation.ts +23 -4
  389. package/src/deploy/headers.ts +67 -51
  390. package/src/deploy/node-headers.ts +148 -27
  391. package/src/deploy/platforms/cloudflare.ts +1 -0
  392. package/src/deploy/platforms/netlify.ts +82 -5
  393. package/src/deploy/platforms/node.ts +7 -5
  394. package/src/deploy/platforms/static.ts +1 -0
  395. package/src/deploy/platforms/types.ts +7 -0
  396. package/src/deploy/platforms/vercel.ts +9 -3
  397. package/src/deploy/redirects.ts +14 -3
  398. package/src/deploy/vercel-negotiation.ts +35 -3
  399. package/src/eval/agents.ts +10 -2
  400. package/src/eval/run.ts +25 -0
  401. package/src/markdown/base-links.ts +55 -8
  402. package/src/markdown/index.ts +6 -3
  403. package/src/markdown/relative-links.ts +3 -23
  404. package/src/markdown/route-snapshot.ts +37 -0
  405. package/src/og/card.ts +20 -4
  406. package/src/og/derive.ts +145 -4
  407. package/src/openapi/graphql-build.ts +28 -2
  408. package/src/openapi/model.ts +77 -13
  409. package/src/openapi/render-mdx.ts +10 -1
  410. package/src/registry/eject.ts +135 -37
  411. package/src/search/documents.ts +24 -3
  412. package/src/search/orama-index.ts +1 -1
  413. package/src/search/sync/algolia.ts +36 -2
  414. package/src/sources/registry.ts +5 -0
  415. package/src/theme/entry.ts +11 -4
  416. package/src/translate/agents.ts +6 -1
  417. package/src/translate/ledger.ts +26 -3
  418. package/src/translate/meta.ts +11 -3
  419. package/src/translate/report.ts +1 -1
  420. package/src/translate/run.ts +11 -5
  421. package/src/translate/validate.ts +10 -1
  422. package/src/translate/work-list.ts +36 -3
  423. package/src/upgrade/upgrade.ts +37 -5
  424. package/dist/cli/chunk-1w8dp3qb.js.map +0 -10
  425. package/dist/cli/chunk-5a2z0198.js.map +0 -10
  426. package/dist/cli/chunk-6k8vp3ta.js.map +0 -19
  427. package/dist/cli/chunk-79njf86q.js.map +0 -11
  428. package/dist/cli/chunk-a9kptbw5.js.map +0 -14
  429. package/dist/cli/chunk-abh8yjkn.js +0 -31
  430. package/dist/cli/chunk-abh8yjkn.js.map +0 -10
  431. package/dist/cli/chunk-bctazmbk.js.map +0 -10
  432. package/dist/cli/chunk-beat36xx.js.map +0 -10
  433. package/dist/cli/chunk-d1tadaw7.js.map +0 -10
  434. package/dist/cli/chunk-fa25z98p.js.map +0 -11
  435. package/dist/cli/chunk-j8mw0za6.js.map +0 -35
  436. package/dist/cli/chunk-mnqj32sj.js.map +0 -12
  437. package/dist/cli/chunk-mwt1k8n7.js.map +0 -10
  438. package/dist/cli/chunk-nk3ts2xk.js +0 -51
  439. package/dist/cli/chunk-nk3ts2xk.js.map +0 -10
  440. package/dist/cli/chunk-sqn5t4q0.js.map +0 -10
  441. package/dist/cli/chunk-tzne8qfq.js.map +0 -10
  442. package/dist/cli/chunk-xaz13gwg.js.map +0 -182
  443. package/dist/cli/chunk-z01ze5c1.js.map +0 -10
  444. package/dist/cli/chunk-z1f5arsg.js.map +0 -36
  445. package/dist/cli/chunk-zg2gtj10.js.map +0 -35
  446. /package/dist/cli/{chunk-f2972sbt.js.map → chunk-00gs3wqs.js.map} +0 -0
  447. /package/dist/cli/{chunk-7ez8ny0t.js.map → chunk-bbnwccaz.js.map} +0 -0
  448. /package/dist/cli/{chunk-zxccj738.js.map → chunk-esh98wmb.js.map} +0 -0
  449. /package/dist/cli/{chunk-88cpgt6h.js.map → chunk-fsmrqk8a.js.map} +0 -0
  450. /package/dist/cli/{chunk-b5aj94ah.js.map → chunk-g698a744.js.map} +0 -0
  451. /package/dist/cli/{chunk-41za066z.js.map → chunk-h2ez8dzb.js.map} +0 -0
  452. /package/dist/cli/{chunk-by2290sx.js.map → chunk-h7k3nq3v.js.map} +0 -0
  453. /package/dist/cli/{chunk-y3e45rc8.js.map → chunk-n1yg3tj3.js.map} +0 -0
  454. /package/dist/cli/{chunk-f7t03s3g.js.map → chunk-wdrt2k2v.js.map} +0 -0
@@ -1,6 +1,7 @@
1
1
  import { join } from "pathe";
2
2
 
3
3
  import matter from "../frontmatter.ts";
4
+ import { neutralizeUnsafeLinks } from "../safe-links.ts";
4
5
  import {
5
6
  hashText,
6
7
  loadWithCache,
@@ -19,12 +20,21 @@ import type {
19
20
 
20
21
  /** What every REST-backed CMS source needs to be a staged, cached source. */
21
22
  export interface RemoteSourceOptions {
23
+ /**
24
+ * Throw a `BlumeError` when the source cannot load as configured. Runs
25
+ * before the cache is consulted: thrown from `fetchEntries` instead, a
26
+ * misconfiguration would be served over by a stale snapshot with only an
27
+ * offline warning.
28
+ */
29
+ assertConfigured?: () => void;
22
30
  /** Pull every entry from the API; called on refresh and on each poll. */
23
31
  fetchEntries: () => Promise<SourceEntry[]>;
24
32
  name: string;
25
33
  /** Opt-in dev polling interval (seconds); omit to freeze for the session. */
26
34
  pollInterval?: number;
27
35
  prefix?: string;
36
+ /** The adapter rebuilt on another context (`ContentSource.withContext`). */
37
+ withContext?: (ctx: SourceContext) => ContentSource;
28
38
  }
29
39
 
30
40
  /**
@@ -45,6 +55,7 @@ export const remoteSource = (
45
55
  const load = async (
46
56
  refresh = ctx?.refresh ?? true
47
57
  ): Promise<SourceLoadResult> => {
58
+ options.assertConfigured?.();
48
59
  const result = await loadWithCache(
49
60
  options.name,
50
61
  cache,
@@ -77,6 +88,7 @@ export const remoteSource = (
77
88
  () => load()
78
89
  )
79
90
  : undefined,
91
+ withContext: options.withContext,
80
92
  };
81
93
  };
82
94
 
@@ -182,7 +194,8 @@ export interface RemoteFieldMap {
182
194
  * when the slug field is missing or slugifies to nothing (pure punctuation),
183
195
  * so distinct documents never collapse onto one `untitled.md`; a slashed
184
196
  * slug keeps its segments. A string body is Markdown and passes through as
185
- * `.md`; any other shape goes to the CMS's lowerer, and is written as `.mdx`
197
+ * `.md`, its unsafe links reduced to their labels; any other shape goes to
198
+ * the CMS's lowerer, and is written as `.mdx`
186
199
  * when `lowersToMdx` (the source has serializers, see `writesMdx`).
187
200
  */
188
201
  export const documentEntry = (
@@ -211,7 +224,10 @@ export const documentEntry = (
211
224
  let markdown = "";
212
225
  let format: "md" | "mdx" = "md";
213
226
  if (isStringValue(body)) {
214
- markdown = `${body.trimEnd()}\n`;
227
+ // The CMS's Markdown is its editors', not the site author's: a link whose
228
+ // destination isn't a web, mail, or relative address (`javascript:`)
229
+ // keeps only its label, as release notes do (see `safe-links.ts`).
230
+ markdown = neutralizeUnsafeLinks(`${body.trimEnd()}\n`);
215
231
  } else if (body !== undefined) {
216
232
  markdown = lower(body);
217
233
  format = lowersToMdx ? "mdx" : "md";
@@ -4,7 +4,9 @@ import { blumeReferences } from "../../openapi/references.ts";
4
4
  import { openApiSource } from "../../openapi/source.ts";
5
5
  import type { ContentSourceAdapter } from "../../sources/registry.ts";
6
6
  import type { ResolvedConfig } from "../schema.ts";
7
+ import { trimChar } from "../trim.ts";
7
8
  import type { ProjectContext } from "../types.ts";
9
+ import { hashText } from "./cache.ts";
8
10
  import { contentfulSource } from "./contentful.ts";
9
11
  import { filesystemSource } from "./filesystem.ts";
10
12
  import { githubReleasesSource } from "./github-releases.ts";
@@ -45,14 +47,40 @@ export interface SourceRuntime {
45
47
  refresh?: boolean;
46
48
  }
47
49
 
50
+ /**
51
+ * The directory under `.blume/cache/<source>/` a source keeps its snapshot in:
52
+ * one per preview mode and set of adapter options. A preview snapshot holds
53
+ * drafts, so a published load must never read it, neither as dev's cache-first
54
+ * snapshot nor as a build's offline fallback; and a snapshot fetched with
55
+ * another `query` or `fields` is another result, not a cached copy of this
56
+ * one. `pollInterval` only paces dev re-fetches, so it is left out. A
57
+ * `custom()` source is a live instance rather than options, so its snapshot
58
+ * is keyed by preview mode alone.
59
+ */
60
+ export const snapshotKey = (
61
+ adapter: ContentSourceAdapter,
62
+ runtime: SourceRuntime
63
+ ): string => {
64
+ const mode = runtime.preview ? "preview" : "published";
65
+ if (adapter.kind === "custom") {
66
+ return mode;
67
+ }
68
+ const { pollInterval: _paced, ...fetched } = adapter.options;
69
+ return `${mode}-${hashText(JSON.stringify(fetched))}`;
70
+ };
71
+
48
72
  const sourceContext = (
49
73
  context: ProjectContext,
50
74
  name: string,
51
- runtime: SourceRuntime
75
+ runtime: SourceRuntime,
76
+ snapshot?: string
52
77
  ): SourceContext => ({
53
78
  assetsBaseUrl: `/blume-assets/${name}`,
54
79
  assetsDir: join(context.outDir, "public", "blume-assets", name),
55
- cacheDir: join(context.outDir, "cache", name),
80
+ cacheDir:
81
+ snapshot === undefined
82
+ ? join(context.outDir, "cache", name)
83
+ : join(context.outDir, "cache", name, snapshot),
56
84
  mode: runtime.mode,
57
85
  preview: runtime.preview,
58
86
  projectRoot: context.root,
@@ -86,46 +114,37 @@ const buildSource = (
86
114
  context: ProjectContext,
87
115
  runtime: SourceRuntime
88
116
  ): ContentSource => {
117
+ const ctx = (): SourceContext =>
118
+ sourceContext(context, name, runtime, snapshotKey(adapter, runtime));
89
119
  switch (adapter.kind) {
90
120
  case "filesystem": {
91
121
  const { pollInterval: _ignored, ...options } = adapter.options;
92
122
  return filesystemSource({ ...options, name, projectRoot: context.root });
93
123
  }
94
124
  case "custom": {
95
- // A user-provided instance manages its own context/caching; we only ensure
96
- // its name is unique across the project for id namespacing.
97
- const source = adapter.options;
125
+ // An instance built by one of Blume's engine factories rebuilds itself
126
+ // on this scan's context, so `custom(sanitySource({…}))` reads drafts
127
+ // under `--preview` and caches in the runtime directory like the
128
+ // built-in adapter. Any other instance manages its own context and
129
+ // caching. Either way its name is made unique across the project for
130
+ // id namespacing.
131
+ const source = adapter.options.withContext?.(ctx()) ?? adapter.options;
98
132
  return source.name === name ? source : { ...source, name };
99
133
  }
100
134
  case "sanity": {
101
- return sanitySource(
102
- { ...adapter.options, name },
103
- sourceContext(context, name, runtime)
104
- );
135
+ return sanitySource({ ...adapter.options, name }, ctx());
105
136
  }
106
137
  case "notion": {
107
- return notionSource(
108
- { ...adapter.options, name },
109
- sourceContext(context, name, runtime)
110
- );
138
+ return notionSource({ ...adapter.options, name }, ctx());
111
139
  }
112
140
  case "contentful": {
113
- return contentfulSource(
114
- { ...adapter.options, name },
115
- sourceContext(context, name, runtime)
116
- );
141
+ return contentfulSource({ ...adapter.options, name }, ctx());
117
142
  }
118
143
  case "payload": {
119
- return payloadSource(
120
- { ...adapter.options, name },
121
- sourceContext(context, name, runtime)
122
- );
144
+ return payloadSource({ ...adapter.options, name }, ctx());
123
145
  }
124
146
  case "strapi": {
125
- return strapiSource(
126
- { ...adapter.options, name },
127
- sourceContext(context, name, runtime)
128
- );
147
+ return strapiSource({ ...adapter.options, name }, ctx());
129
148
  }
130
149
  case "obsidian": {
131
150
  const { pollInterval: _ignored, ...options } = adapter.options;
@@ -139,13 +158,13 @@ const buildSource = (
139
158
  typeFrontmatterKeys: typeFrontmatterKeys(config),
140
159
  versions: config.versions,
141
160
  },
142
- sourceContext(context, name, runtime)
161
+ ctx()
143
162
  );
144
163
  }
145
164
  case "github-releases": {
146
165
  return githubReleasesSource(
147
- { ...adapter.options, name },
148
- sourceContext(context, name, runtime)
166
+ { ...adapter.options, name, site: config.deployment.options.site },
167
+ ctx()
149
168
  );
150
169
  }
151
170
  default: {
@@ -156,10 +175,7 @@ const buildSource = (
156
175
  break;
157
176
  }
158
177
  }
159
- return mdxRemoteSource(
160
- { ...adapter.options, name },
161
- sourceContext(context, name, runtime)
162
- );
178
+ return mdxRemoteSource({ ...adapter.options, name }, ctx());
163
179
  };
164
180
 
165
181
  /** The base name to allocate for a descriptor (before deduplication). */
@@ -167,7 +183,10 @@ const baseName = (adapter: ContentSourceAdapter): string => {
167
183
  if (adapter.kind === "custom") {
168
184
  return adapter.options.name;
169
185
  }
170
- return adapter.options.prefix ?? adapter.kind;
186
+ // The name is the prefix as a route spells it: `/guides` and `guides/`
187
+ // route under `guides`, so the source's staged entry ids, cache directory,
188
+ // and asset URLs must use `guides` too.
189
+ return trimChar(adapter.options.prefix ?? "", "/") || adapter.kind;
171
190
  };
172
191
 
173
192
  /**
@@ -247,5 +247,6 @@ export const sanitySource = (
247
247
  () => load()
248
248
  )
249
249
  : undefined,
250
+ withContext: (next) => sanitySource(options, next),
250
251
  };
251
252
  };
@@ -9,6 +9,7 @@ import {
9
9
  absoluteUrl,
10
10
  blockquote,
11
11
  codeFence,
12
+ guardBlockStart,
12
13
  headingPrefix,
13
14
  image,
14
15
  listItem,
@@ -52,12 +53,16 @@ const renderInlineNode = (node: JsonObject): string => {
52
53
  }
53
54
  };
54
55
 
56
+ /** A text block's inline nodes, joined and guarded as one block. */
57
+ const blockText = (nodes: JsonObject[]): string =>
58
+ guardBlockStart(renderInlines(nodes));
59
+
55
60
  const renderList = (node: JsonObject): string => {
56
61
  const ordered = asString(node.format) === "ordered";
57
62
  return children(node)
58
63
  .map((item, index) => {
59
64
  const kids = children(item);
60
- const line = renderInlines(kids.filter((kid) => typeOf(kid) !== "list"));
65
+ const line = blockText(kids.filter((kid) => typeOf(kid) !== "list"));
61
66
  const sub = kids
62
67
  .filter((kid) => typeOf(kid) === "list")
63
68
  .map((list) => renderList(list))
@@ -89,13 +94,13 @@ const renderBlock = (
89
94
  ): string => {
90
95
  switch (typeOf(node)) {
91
96
  case "paragraph": {
92
- return renderInlines(children(node));
97
+ return blockText(children(node));
93
98
  }
94
99
  case "heading": {
95
- return `${headingPrefix(asNumber(node.level) ?? 1)}${renderInlines(children(node))}`;
100
+ return `${headingPrefix(asNumber(node.level) ?? 1)}${blockText(children(node))}`;
96
101
  }
97
102
  case "quote": {
98
- return blockquote(renderInlines(children(node)));
103
+ return blockquote(blockText(children(node)));
99
104
  }
100
105
  case "list": {
101
106
  return renderList(node);
@@ -185,6 +185,7 @@ export const strapiSource = (
185
185
  name: options.name,
186
186
  pollInterval: options.pollInterval,
187
187
  prefix: options.prefix,
188
+ withContext: (next) => strapiSource(options, next),
188
189
  },
189
190
  ctx
190
191
  );
@@ -39,6 +39,13 @@ export interface SourceEntry {
39
39
  * the owning source to expose a `contentRoot` to bound the log's pathspec.
40
40
  */
41
41
  sourcePath?: string;
42
+ /**
43
+ * How many lines of the file at `sourcePath` sit above `body.text`, when
44
+ * `raw` is not that file's text: a source that rewrites a local file's
45
+ * front matter (an Obsidian note) sets it, so a diagnostic points at the
46
+ * line the author wrote. Otherwise the height of `raw`'s front matter.
47
+ */
48
+ bodyLineOffset?: number;
42
49
  /** Optional provenance for "edit this page". */
43
50
  editUrl?: string;
44
51
  /** Optional last-modified ISO date supplied by the adapter (non-filesystem). */
@@ -123,6 +130,14 @@ export interface ContentSource {
123
130
  * switcher, since every other locale would only repeat the same text.
124
131
  */
125
132
  readonly monolingual?: boolean;
133
+ /**
134
+ * True for a staged source whose entry refs are file and folder names (an
135
+ * Obsidian vault), so their ordering prefixes (`01 Intro`) sort the sidebar
136
+ * and drop from the route the way a filesystem source's do. Filesystem
137
+ * sources always do; other staged refs are slugs and release tags, kept
138
+ * whole.
139
+ */
140
+ readonly orderedNames?: boolean;
126
141
  /**
127
142
  * Resolved on-disk root, set by sources whose entries live on disk. For
128
143
  * filesystem sources it drives folder-meta discovery (scan under this root)
@@ -132,6 +147,13 @@ export interface ContentSource {
132
147
  * no local tree.
133
148
  */
134
149
  readonly contentRoot?: string;
150
+ /**
151
+ * The globs a filesystem source reads under `contentRoot`, and the ones it
152
+ * skips. Folder-meta discovery honors them, so a `meta.ts` outside the
153
+ * content the source reads is never imported.
154
+ */
155
+ readonly include?: readonly string[];
156
+ readonly exclude?: readonly string[];
135
157
  /** Pull every entry. Called once per scan. */
136
158
  load: () => Promise<SourceLoadResult>;
137
159
  /** Validate the source is usable; throws a BlumeError when not. */
@@ -143,6 +165,14 @@ export interface ContentSource {
143
165
  * remote/static sources omit it (content is frozen for the session).
144
166
  */
145
167
  watch?: (onChange: () => void) => () => void;
168
+ /**
169
+ * This source rebuilt on another runtime context. A source passed to
170
+ * `custom()` is constructed before Blume knows the scan's preview flag,
171
+ * refresh policy, or runtime directory; Blume rebuilds it on them through
172
+ * this, so it previews and caches the way the built-in adapter does. The
173
+ * engine factories (`sanitySource`, `contentfulSource`, …) all set it.
174
+ */
175
+ withContext?: (ctx: SourceContext) => ContentSource;
146
176
  }
147
177
 
148
178
  /** Context passed to `normalizeEntry`, describing the owning source. */
@@ -150,6 +180,7 @@ export interface NormalizeContext {
150
180
  source: {
151
181
  monolingual?: boolean;
152
182
  name: string;
183
+ orderedNames?: boolean;
153
184
  prefix?: string;
154
185
  staged: boolean;
155
186
  };
package/src/core/types.ts CHANGED
@@ -325,6 +325,13 @@ export interface Navigation {
325
325
  * locale trees.
326
326
  */
327
327
  brandHref?: string;
328
+ /**
329
+ * Where the banner's link points in this locale: `banner.link.href`
330
+ * localized like a featured link, then mounted under `basePath` (a route
331
+ * served outside the content tree keeps its own path). Set when the banner
332
+ * has a link.
333
+ */
334
+ bannerHref?: string;
328
335
  }
329
336
 
330
337
  /** The full content graph: the source of truth for generated modules. */
@@ -413,6 +420,8 @@ export interface RouteManifestEntry {
413
420
  fallback?: boolean;
414
421
  /** True when the page's source publishes one language only (no switcher). */
415
422
  monolingual?: boolean;
423
+ /** True when front matter `ai.exclude` keeps the page out of llms.txt. */
424
+ aiExclude?: boolean;
416
425
  /** Resolved "last updated" ISO date, when the feature is enabled. */
417
426
  lastModified?: string;
418
427
  }
@@ -5,7 +5,6 @@ export const ar: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "إضافة إلى Cursor",
7
7
  addToVscode: "إضافة إلى VS Code",
8
- askAI: "اسأل الذكاء الاصطناعي عن هذه الصفحة",
9
8
  connectMcp: "الاتصال بـ MCP",
10
9
  copied: "تم النسخ!",
11
10
  copyClaudeCode: "نسخ أمر Claude Code",
@@ -24,7 +23,7 @@ export const ar: UIStringsOverride = {
24
23
  openInChatPrompt: "اقرأ {url} حتى أتمكن من طرح أسئلة حول هذه الصفحة.",
25
24
  scrollToTop: "العودة إلى الأعلى",
26
25
  },
27
- ask: {
26
+ assistant: {
28
27
  ai: "الذكاء الاصطناعي",
29
28
  clear: "مسح المحادثة",
30
29
  close: "إغلاق",
@@ -35,7 +34,7 @@ export const ar: UIStringsOverride = {
35
34
  placeholder: "اطرح سؤالاً…",
36
35
  send: "إرسال",
37
36
  tip: "نصيحة: يمكنك فتح المحادثة وإغلاقها باستخدام",
38
- title: "اسأل الذكاء الاصطناعي",
37
+ title: "المساعد",
39
38
  you: "أنت",
40
39
  },
41
40
  banner: { dismiss: "إغلاق الإعلان" },
@@ -44,9 +43,20 @@ export const ar: UIStringsOverride = {
44
43
  title: "سجل التغييرات",
45
44
  },
46
45
  content: {
46
+ code: "الكود",
47
47
  copyColor: "نسخ اللون {name} {value}",
48
48
  copyPrompt: "نسخ الموجّه",
49
+ default: "الافتراضي",
49
50
  diagramError: "تعذّر عرض هذا المخطط.",
51
+ forks: "التفرعات",
52
+ preview: "معاينة",
53
+ prop: "الخاصية",
54
+ selectTab: "اختيار علامة تبويب",
55
+ showMore: "عرض المزيد",
56
+ stars: "النجوم",
57
+ tab: "علامة التبويب {n}",
58
+ type: "النوع",
59
+ update: "تحديث",
50
60
  },
51
61
  feedback: {
52
62
  no: "لا",
@@ -84,12 +94,14 @@ export const ar: UIStringsOverride = {
84
94
  search: {
85
95
  all: "الكل",
86
96
  allLanguages: "جميع اللغات",
87
- askAi: "اسأل الذكاء الاصطناعي",
88
- askAiHint: "احصل على إجابة فورية من الذكاء الاصطناعي",
97
+ assistant: "المساعد",
98
+ assistantHint: "احصل على إجابة فورية من الذكاء الاصطناعي",
89
99
  button: "بحث",
90
100
  devOnly: "البحث متاح في إصدار الإنتاج.",
101
+ docs: "الوثائق",
91
102
  error: "حدث خطأ ما. يرجى المحاولة مرة أخرى.",
92
103
  label: "البحث في الوثائق",
104
+ latest: "الأحدث",
93
105
  navigate: "تنقل",
94
106
  noResults: "لم يتم العثور على نتائج.",
95
107
  open: "فتح",
@@ -5,7 +5,6 @@ export const bg: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "Добави в Cursor",
7
7
  addToVscode: "Добави във VS Code",
8
- askAI: "Попитай ИИ за тази страница",
9
8
  connectMcp: "Свържи се с MCP",
10
9
  copied: "Копирано!",
11
10
  copyClaudeCode: "Копирай командата на Claude Code",
@@ -25,7 +24,7 @@ export const bg: UIStringsOverride = {
25
24
  "Прочетете {url}, за да мога да задавам въпроси за тази страница.",
26
25
  scrollToTop: "Нагоре",
27
26
  },
28
- ask: {
27
+ assistant: {
29
28
  ai: "ИИ",
30
29
  clear: "Изчисти разговора",
31
30
  close: "Затвори",
@@ -36,7 +35,7 @@ export const bg: UIStringsOverride = {
36
35
  placeholder: "Задайте въпрос…",
37
36
  send: "Изпрати",
38
37
  tip: "Съвет: Можете да отваряте и затваряте чата с",
39
- title: "Попитай ИИ",
38
+ title: "Асистент",
40
39
  you: "Вие",
41
40
  },
42
41
  banner: { dismiss: "Затваряне на съобщението" },
@@ -45,9 +44,20 @@ export const bg: UIStringsOverride = {
45
44
  title: "Дневник на промените",
46
45
  },
47
46
  content: {
47
+ code: "Код",
48
48
  copyColor: "Копирай цвета {name} {value}",
49
49
  copyPrompt: "Копирай подканата",
50
+ default: "По подразбиране",
50
51
  diagramError: "Тази диаграма не можа да бъде показана.",
52
+ forks: "Разклонения",
53
+ preview: "Преглед",
54
+ prop: "Свойство",
55
+ selectTab: "Избери раздел",
56
+ showMore: "Покажи още",
57
+ stars: "Звезди",
58
+ tab: "Раздел {n}",
59
+ type: "Тип",
60
+ update: "Актуализация",
51
61
  },
52
62
  feedback: {
53
63
  no: "Не",
@@ -85,12 +95,14 @@ export const bg: UIStringsOverride = {
85
95
  search: {
86
96
  all: "Всички",
87
97
  allLanguages: "Всички езици",
88
- askAi: "Попитай ИИ",
89
- askAiHint: "Получете незабавен отговор от ИИ",
98
+ assistant: "Асистент",
99
+ assistantHint: "Получете незабавен отговор от ИИ",
90
100
  button: "Търсене",
91
101
  devOnly: "Търсенето е достъпно в производствената компилация.",
102
+ docs: "Документация",
92
103
  error: "Нещо се обърка. Моля, опитайте отново.",
93
104
  label: "Търсене в документацията",
105
+ latest: "най-нова",
94
106
  navigate: "навигация",
95
107
  noResults: "Няма намерени резултати.",
96
108
  open: "отвори",
@@ -5,7 +5,6 @@ export const bn: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "Cursor-এ যোগ করুন",
7
7
  addToVscode: "VS Code-এ যোগ করুন",
8
- askAI: "এই পৃষ্ঠা সম্পর্কে AI-কে জিজ্ঞাসা করুন",
9
8
  connectMcp: "MCP-তে সংযোগ করুন",
10
9
  copied: "অনুলিপি করা হয়েছে!",
11
10
  copyClaudeCode: "Claude Code কমান্ড অনুলিপি করুন",
@@ -24,7 +23,7 @@ export const bn: UIStringsOverride = {
24
23
  openInChatPrompt: "{url} পড়ুন, যাতে আমি এই পৃষ্ঠা সম্পর্কে প্রশ্ন করতে পারি।",
25
24
  scrollToTop: "উপরে যান",
26
25
  },
27
- ask: {
26
+ assistant: {
28
27
  ai: "AI",
29
28
  clear: "কথোপকথন মুছুন",
30
29
  close: "বন্ধ করুন",
@@ -35,7 +34,7 @@ export const bn: UIStringsOverride = {
35
34
  placeholder: "একটি প্রশ্ন করুন…",
36
35
  send: "পাঠান",
37
36
  tip: "টিপ: চ্যাট খুলতে ও বন্ধ করতে চাপুন",
38
- title: "AI-কে জিজ্ঞাসা করুন",
37
+ title: "সহকারী",
39
38
  you: "আপনি",
40
39
  },
41
40
  banner: { dismiss: "ঘোষণা বন্ধ করুন" },
@@ -44,9 +43,20 @@ export const bn: UIStringsOverride = {
44
43
  title: "পরিবর্তন লগ",
45
44
  },
46
45
  content: {
46
+ code: "কোড",
47
47
  copyColor: "{name} রং {value} অনুলিপি করুন",
48
48
  copyPrompt: "প্রম্পট অনুলিপি করুন",
49
+ default: "ডিফল্ট",
49
50
  diagramError: "এই ডায়াগ্রামটি রেন্ডার করা যায়নি।",
51
+ forks: "ফর্ক",
52
+ preview: "প্রিভিউ",
53
+ prop: "প্রপ",
54
+ selectTab: "ট্যাব নির্বাচন করুন",
55
+ showMore: "আরও দেখান",
56
+ stars: "স্টার",
57
+ tab: "ট্যাব {n}",
58
+ type: "টাইপ",
59
+ update: "আপডেট",
50
60
  },
51
61
  feedback: {
52
62
  no: "না",
@@ -84,12 +94,14 @@ export const bn: UIStringsOverride = {
84
94
  search: {
85
95
  all: "সব",
86
96
  allLanguages: "সব ভাষা",
87
- askAi: "AI-কে জিজ্ঞাসা করুন",
88
- askAiHint: "AI থেকে তাৎক্ষণিক উত্তর পান",
97
+ assistant: "সহকারী",
98
+ assistantHint: "AI থেকে তাৎক্ষণিক উত্তর পান",
89
99
  button: "অনুসন্ধান",
90
100
  devOnly: "অনুসন্ধান প্রোডাকশন বিল্ডে উপলব্ধ।",
101
+ docs: "ডকুমেন্টেশন",
91
102
  error: "কিছু একটা ভুল হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।",
92
103
  label: "ডকুমেন্টেশন অনুসন্ধান করুন",
104
+ latest: "সর্বশেষ",
93
105
  navigate: "নেভিগেট",
94
106
  noResults: "কোনো ফলাফল পাওয়া যায়নি।",
95
107
  open: "খুলুন",
@@ -5,7 +5,6 @@ export const ca: UIStringsOverride = {
5
5
  actions: {
6
6
  addToCursor: "Afegeix a Cursor",
7
7
  addToVscode: "Afegeix a VS Code",
8
- askAI: "Pregunta a la IA sobre aquesta pàgina",
9
8
  connectMcp: "Connecta a MCP",
10
9
  copied: "Copiat!",
11
10
  copyClaudeCode: "Copia l'ordre de Claude Code",
@@ -25,7 +24,7 @@ export const ca: UIStringsOverride = {
25
24
  "Llegeix {url} perquè pugui fer-te preguntes sobre aquesta pàgina.",
26
25
  scrollToTop: "Torna a dalt",
27
26
  },
28
- ask: {
27
+ assistant: {
29
28
  ai: "IA",
30
29
  clear: "Esborra la conversa",
31
30
  close: "Tanca",
@@ -36,7 +35,7 @@ export const ca: UIStringsOverride = {
36
35
  placeholder: "Fes una pregunta…",
37
36
  send: "Envia",
38
37
  tip: "Consell: pots obrir i tancar el xat amb",
39
- title: "Pregunta a la IA",
38
+ title: "Assistent",
40
39
  you: "Tu",
41
40
  },
42
41
  banner: { dismiss: "Tanca l'anunci" },
@@ -45,9 +44,20 @@ export const ca: UIStringsOverride = {
45
44
  title: "Registre de canvis",
46
45
  },
47
46
  content: {
47
+ code: "Codi",
48
48
  copyColor: "Copia el color {name} {value}",
49
49
  copyPrompt: "Copia la indicació",
50
+ default: "Per defecte",
50
51
  diagramError: "No s'ha pogut mostrar aquest diagrama.",
52
+ forks: "Forks",
53
+ preview: "Previsualització",
54
+ prop: "Propietat",
55
+ selectTab: "Selecciona una pestanya",
56
+ showMore: "Mostra'n més",
57
+ stars: "Estrelles",
58
+ tab: "Pestanya {n}",
59
+ type: "Tipus",
60
+ update: "Actualització",
51
61
  },
52
62
  feedback: {
53
63
  no: "No",
@@ -85,12 +95,14 @@ export const ca: UIStringsOverride = {
85
95
  search: {
86
96
  all: "Tots",
87
97
  allLanguages: "Tots els idiomes",
88
- askAi: "Pregunta a la IA",
89
- askAiHint: "Obtén una resposta instantània de la IA",
98
+ assistant: "Assistent",
99
+ assistantHint: "Obtén una resposta instantània de la IA",
90
100
  button: "Cerca",
91
101
  devOnly: "La cerca està disponible a la compilació de producció.",
102
+ docs: "Documentació",
92
103
  error: "Alguna cosa ha anat malament. Torna-ho a provar.",
93
104
  label: "Cerca a la documentació",
105
+ latest: "darrera",
94
106
  navigate: "navega",
95
107
  noResults: "No s'ha trobat cap resultat.",
96
108
  open: "obre",