blume 2.0.3 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -0
- package/CHANGELOG.md +48 -0
- package/README.md +1 -1
- package/dist/cli/{chunk-1d7ve1dm.js → chunk-0gz36akr.js} +18 -2
- package/dist/cli/{chunk-1d7ve1dm.js.map → chunk-0gz36akr.js.map} +3 -3
- package/dist/cli/{chunk-2eytanqx.js → chunk-1n228xqb.js} +2 -2
- package/dist/cli/{chunk-yfyb25rh.js → chunk-2f3ndkpw.js} +24 -8
- package/dist/cli/chunk-2f3ndkpw.js.map +14 -0
- package/dist/cli/{chunk-r20tn01b.js → chunk-2f7n4qzt.js} +8 -2
- package/dist/cli/{chunk-r20tn01b.js.map → chunk-2f7n4qzt.js.map} +3 -3
- package/dist/cli/{chunk-35d4wj9f.js → chunk-2n4ps1b3.js} +7 -7
- package/dist/cli/{chunk-j85vccga.js → chunk-43zcf4gz.js} +97 -57
- package/dist/cli/{chunk-j85vccga.js.map → chunk-43zcf4gz.js.map} +6 -6
- package/dist/cli/{chunk-e04dxsz1.js → chunk-4ejxbzee.js} +1 -1
- package/dist/cli/{chunk-5m5nmvyq.js → chunk-4h8z9vv5.js} +233 -39
- package/dist/cli/chunk-4h8z9vv5.js.map +16 -0
- package/dist/cli/{chunk-5f86nr5m.js → chunk-5cg2rzgf.js} +18 -16
- package/dist/cli/{chunk-5f86nr5m.js.map → chunk-5cg2rzgf.js.map} +2 -2
- package/dist/cli/{chunk-tzmab476.js → chunk-5ffywsmb.js} +4 -4
- package/dist/cli/{chunk-2z928egk.js → chunk-5wj2qwn2.js} +5 -5
- package/dist/cli/chunk-6bm0xpgd.js +18 -0
- package/dist/cli/chunk-6bm0xpgd.js.map +10 -0
- package/dist/cli/{chunk-vg9r4eb9.js → chunk-713mngdq.js} +12 -5
- package/dist/cli/{chunk-vg9r4eb9.js.map → chunk-713mngdq.js.map} +3 -3
- package/dist/cli/{chunk-5xvm6tfj.js → chunk-9geymqns.js} +17 -15
- package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-9geymqns.js.map} +2 -2
- package/dist/cli/{chunk-q58y5e6a.js → chunk-9xr4dgee.js} +26 -17
- package/dist/cli/chunk-9xr4dgee.js.map +10 -0
- package/dist/cli/{chunk-b07cmahc.js → chunk-amrb6hgh.js} +2 -2
- package/dist/cli/chunk-cm89scdv.js +443 -0
- package/dist/cli/chunk-cm89scdv.js.map +11 -0
- package/dist/cli/{chunk-akbpwfxc.js → chunk-cmtcnh9f.js} +2 -2
- package/dist/cli/chunk-cy5bm0j0.js +104 -0
- package/dist/cli/chunk-cy5bm0j0.js.map +11 -0
- package/dist/cli/{chunk-crgn1q09.js → chunk-e7vvk5ya.js} +4 -4
- package/dist/cli/{chunk-pehfxfta.js → chunk-g2z9x01v.js} +6 -98
- package/dist/cli/chunk-g2z9x01v.js.map +10 -0
- package/dist/cli/{chunk-tkacnehg.js → chunk-gp84za0h.js} +2 -2
- package/dist/cli/{chunk-wrr3j9w9.js → chunk-h2a48yhd.js} +186 -63
- package/dist/cli/chunk-h2a48yhd.js.map +36 -0
- package/dist/cli/{chunk-hm3vjy5s.js → chunk-jnwj5kjj.js} +14 -9
- package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-jnwj5kjj.js.map} +4 -4
- package/dist/cli/chunk-kwrg63tm.js +31 -0
- package/dist/cli/chunk-kwrg63tm.js.map +10 -0
- package/dist/cli/{chunk-2hsdwb9n.js → chunk-nd1821sk.js} +18 -16
- package/dist/cli/{chunk-2hsdwb9n.js.map → chunk-nd1821sk.js.map} +2 -2
- package/dist/cli/{chunk-6dsbexzp.js → chunk-ntv4qrt7.js} +17 -15
- package/dist/cli/{chunk-6dsbexzp.js.map → chunk-ntv4qrt7.js.map} +2 -2
- package/dist/cli/{chunk-r9rcc4w7.js → chunk-p804f3pe.js} +7 -7
- package/dist/cli/{chunk-ey84smr6.js → chunk-py62fewh.js} +6 -6
- package/dist/cli/{chunk-ey84smr6.js.map → chunk-py62fewh.js.map} +1 -1
- package/dist/cli/chunk-q3wxxq39.js +126 -0
- package/dist/cli/chunk-q3wxxq39.js.map +11 -0
- package/dist/cli/{chunk-9t7a85s3.js → chunk-rekqz4qg.js} +23 -13
- package/dist/cli/chunk-rekqz4qg.js.map +10 -0
- package/dist/cli/{chunk-8ktnccpt.js → chunk-ta27feev.js} +1 -1
- package/dist/cli/{chunk-pv29h0wf.js → chunk-xkz5xbtv.js} +3476 -822
- package/dist/cli/chunk-xkz5xbtv.js.map +213 -0
- package/dist/cli/{chunk-a58773jm.js → chunk-y4ykbark.js} +2 -2
- package/dist/cli/{chunk-p3v96n38.js → chunk-y5h4r2y0.js} +4 -4
- package/dist/cli/{chunk-acanzt5p.js → chunk-yj17vs39.js} +6 -6
- package/dist/cli/{chunk-p73c0m7w.js → chunk-yxmk4pec.js} +16 -14
- package/dist/cli/{chunk-p73c0m7w.js.map → chunk-yxmk4pec.js.map} +2 -2
- package/dist/cli/{chunk-3em5wd2y.js → chunk-zccbjcj0.js} +4 -3
- package/dist/cli/{chunk-3em5wd2y.js.map → chunk-zccbjcj0.js.map} +2 -2
- package/dist/cli/{chunk-c8chx29p.js → chunk-zf748avv.js} +384 -207
- package/dist/cli/chunk-zf748avv.js.map +37 -0
- package/dist/cli/{chunk-g4hq16wv.js → chunk-zhvd6adm.js} +16 -14
- package/dist/cli/{chunk-g4hq16wv.js.map → chunk-zhvd6adm.js.map} +2 -2
- package/dist/cli/index.js +26 -20
- package/dist/cli/index.js.map +5 -5
- package/dist/types/ai/agent-surface.d.ts +8 -7
- package/dist/types/ai/ai-catalog.d.ts +7 -0
- package/dist/types/ai/ask-context.d.ts +22 -0
- package/dist/types/ai/ask.d.ts +271 -58
- package/dist/types/ai/index.d.ts +2 -2
- package/dist/types/ai/site-skill.d.ts +26 -0
- package/dist/types/ai/skills.d.ts +16 -0
- package/dist/types/astro/integration.d.ts +8 -0
- package/dist/types/captcha/hcaptcha.d.ts +27 -0
- package/dist/types/captcha/index.d.ts +28 -0
- package/dist/types/captcha/schema.d.ts +29 -0
- package/dist/types/captcha/turnstile.d.ts +28 -0
- package/dist/types/components/content/api-field.d.ts +59 -0
- package/dist/types/components/content/api-page.d.ts +95 -0
- package/dist/types/components/layout/nav-utils.d.ts +26 -0
- package/dist/types/components/openapi/helpers.d.ts +137 -0
- package/dist/types/components/openapi/security.d.ts +85 -0
- package/dist/types/consent/ethyca.d.ts +48 -0
- package/dist/types/consent/index.d.ts +37 -0
- package/dist/types/consent/native.d.ts +28 -0
- package/dist/types/consent/osano.d.ts +42 -0
- package/dist/types/consent/schema.d.ts +110 -0
- package/dist/types/core/config-input.d.ts +187 -20
- package/dist/types/core/data.d.ts +49 -4
- package/dist/types/core/footer.d.ts +8 -0
- package/dist/types/core/i18n-ui.d.ts +86 -0
- package/dist/types/core/includes.d.ts +8 -2
- package/dist/types/core/localizable.d.ts +7 -0
- package/dist/types/core/page-modes.d.ts +29 -0
- package/dist/types/core/redirect-patterns.d.ts +144 -0
- package/dist/types/core/related.d.ts +40 -0
- package/dist/types/core/schema.d.ts +551 -56
- package/dist/types/core/sources/read.d.ts +5 -0
- package/dist/types/core/types.d.ts +1 -1
- package/dist/types/core/variables.d.ts +42 -0
- package/dist/types/deploy/node-headers.d.ts +13 -2
- package/dist/types/deploy/platforms/cloudflare.d.ts +5 -0
- package/dist/types/deploy/platforms/netlify.d.ts +7 -0
- package/dist/types/deploy/platforms/vercel.d.ts +6 -0
- package/dist/types/deploy/redirects.d.ts +39 -11
- package/dist/types/deploy/vercel-negotiation.d.ts +9 -0
- package/dist/types/markdown/code-title.d.ts +17 -0
- package/dist/types/markdown/features.d.ts +3 -2
- package/dist/types/narration/build.d.ts +70 -0
- package/dist/types/narration/provider.d.ts +26 -0
- package/dist/types/narration/script.d.ts +154 -0
- package/dist/types/openapi/model.d.ts +12 -6
- package/dist/types/openapi/overlay.d.ts +54 -0
- package/dist/types/openapi/parse.d.ts +13 -0
- package/dist/types/openapi/references.d.ts +14 -4
- package/dist/types/ratelimit/cloudflare.d.ts +39 -0
- package/dist/types/ratelimit/index.d.ts +27 -0
- package/dist/types/ratelimit/memory.d.ts +36 -0
- package/dist/types/ratelimit/schema.d.ts +111 -0
- package/dist/types/ratelimit/upstash.d.ts +21 -0
- package/dist/types/ratelimit/wrangler.d.ts +23 -0
- package/dist/types/reference/asyncapi.d.ts +10 -10
- package/dist/types/reference/graphql.d.ts +13 -10
- package/dist/types/reference/openapi.d.ts +33 -12
- package/dist/types/reference/options.d.ts +45 -5
- package/dist/types/reference/scalar.d.ts +13 -0
- package/dist/types/reference/schema.d.ts +60 -36
- package/dist/types/search/documents.d.ts +12 -1
- package/dist/types/search/orama-index.d.ts +4 -0
- package/dist/types/seo/metatags.d.ts +20 -0
- package/docs/02-deployment.mdx +41 -5
- package/docs/03-upgrading.mdx +4 -4
- package/docs/04-migrating.mdx +1 -1
- package/docs/advanced/changelog.mdx +2 -2
- package/docs/advanced/skills.mdx +14 -0
- package/docs/cli/audit.mdx +21 -1
- package/docs/cli/index.mdx +1 -0
- package/docs/configuration/analytics.mdx +3 -1
- package/docs/configuration/assistant.mdx +188 -36
- package/docs/configuration/consent.mdx +100 -0
- package/docs/configuration/customization.mdx +4 -4
- package/docs/configuration/index.mdx +63 -5
- package/docs/configuration/meta.ts +3 -0
- package/docs/configuration/narration.mdx +119 -0
- package/docs/configuration/rate-limiting.mdx +69 -0
- package/docs/configuration/search.mdx +29 -1
- package/docs/configuration/theming.mdx +3 -1
- package/docs/content/components.mdx +106 -0
- package/docs/content/frontmatter.mdx +76 -0
- package/docs/content/i18n.mdx +38 -3
- package/docs/content/includes.mdx +16 -0
- package/docs/content/meta.mdx +1 -0
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +28 -6
- package/docs/content/sources/contentful.mdx +32 -0
- package/docs/content/sources/custom.mdx +39 -0
- package/docs/content/sources/github-releases.mdx +31 -0
- package/docs/content/sources/index.mdx +91 -0
- package/docs/content/sources/meta.ts +16 -0
- package/docs/content/sources/notion.mdx +32 -0
- package/docs/content/sources/obsidian.mdx +37 -0
- package/docs/content/sources/payload.mdx +30 -0
- package/docs/content/sources/remote-mdx.mdx +40 -0
- package/docs/content/sources/sanity.mdx +29 -0
- package/docs/content/sources/strapi.mdx +31 -0
- package/docs/content/syntax.mdx +67 -2
- package/docs/content/variables.mdx +41 -0
- package/docs/discoverability/agent-discovery.mdx +29 -2
- package/docs/discoverability/index.mdx +1 -1
- package/docs/discoverability/llms-txt.mdx +1 -1
- package/docs/discoverability/metadata.mdx +17 -0
- package/docs/references/api-pages.mdx +74 -0
- package/docs/references/asyncapi.mdx +1 -1
- package/docs/references/graphql.mdx +2 -2
- package/docs/references/meta.ts +1 -1
- package/docs/references/openapi.mdx +102 -3
- package/docs/references/scalar.mdx +3 -1
- package/package.json +36 -1
- package/skills/blume/SKILL.md +3 -0
- package/skills/blume-migrate/SKILL.md +5 -5
- package/skills/blume-migrate/references/docusaurus.md +3 -3
- package/skills/blume-migrate/references/mintlify.md +37 -19
- package/skills/blume-migrate/references/nextra.md +2 -2
- package/skills/blume-migrate/references/starlight.md +2 -1
- package/skills/blume-migrate/scripts/mintlify-codemod.mjs +60 -14
- package/skills/blume-write-skill/SKILL.md +82 -0
- package/src/ai/agent-readability.ts +2 -1
- package/src/ai/agent-surface.ts +9 -7
- package/src/ai/ai-catalog.ts +6 -3
- package/src/ai/ask-context.ts +73 -20
- package/src/ai/ask-data.ts +6 -0
- package/src/ai/ask-tools.ts +142 -0
- package/src/ai/ask.ts +354 -76
- package/src/ai/component-markdown.ts +75 -0
- package/src/ai/cors.ts +2 -0
- package/src/ai/index.ts +12 -0
- package/src/ai/llms.ts +6 -2
- package/src/ai/markdown.ts +2 -1
- package/src/ai/mcp/data.ts +6 -0
- package/src/ai/openapi-components.ts +9 -3
- package/src/ai/site-skill.ts +274 -0
- package/src/ai/skills.ts +35 -2
- package/src/ai/write-skill.ts +97 -0
- package/src/astro/generate.ts +132 -18
- package/src/astro/index.ts +1 -0
- package/src/astro/integration.ts +35 -0
- package/src/astro/module-types.ts +6 -0
- package/src/astro/templates.ts +283 -30
- package/src/astro/variables.ts +31 -0
- package/src/audit/catalog.ts +19 -0
- package/src/audit/checks/contrast.ts +183 -0
- package/src/audit/checks/i18n.ts +2 -3
- package/src/audit/checks/indexability.ts +2 -3
- package/src/audit/checks/links.ts +5 -12
- package/src/audit/checks/sitemap.ts +2 -3
- package/src/audit/redirects.ts +46 -15
- package/src/audit/run.ts +2 -0
- package/src/audit/types.ts +2 -1
- package/src/blume-modules.d.ts +7 -0
- package/src/captcha/client.ts +152 -0
- package/src/captcha/hcaptcha.ts +36 -0
- package/src/captcha/index.ts +28 -0
- package/src/captcha/schema.ts +32 -0
- package/src/captcha/turnstile.ts +38 -0
- package/src/captcha/verify.ts +71 -0
- package/src/cli/command-meta.ts +5 -0
- package/src/cli/commands/doctor.ts +22 -16
- package/src/cli/commands/skill.ts +96 -0
- package/src/cli/index.ts +5 -0
- package/src/cli/required-secrets.ts +71 -29
- package/src/components/BlumePage.astro +2 -0
- package/src/components/content/ApiEndpoint.astro +18 -0
- package/src/components/content/ApiField.astro +79 -0
- package/src/components/content/ApiPlayground.astro +62 -0
- package/src/components/content/ApiRail.astro +19 -0
- package/src/components/content/Color.astro +1 -0
- package/src/components/content/FileTree.astro +1 -0
- package/src/components/content/GithubInfo.astro +1 -0
- package/src/components/content/Panel.astro +1 -0
- package/src/components/content/ParamField.astro +25 -0
- package/src/components/content/RequestExample.astro +17 -0
- package/src/components/content/ResponseExample.astro +17 -0
- package/src/components/content/ResponseField.astro +32 -0
- package/src/components/content/Step.astro +1 -0
- package/src/components/content/Tile.astro +1 -0
- package/src/components/content/Tooltip.astro +1 -0
- package/src/components/content/Tree.astro +1 -0
- package/src/components/content/TypeTable.astro +4 -1
- package/src/components/content/View.astro +21 -0
- package/src/components/content/ViewSwitcher.astro +168 -0
- package/src/components/content/api-field.ts +100 -0
- package/src/components/content/api-page.ts +224 -0
- package/src/components/content/view-switcher.ts +71 -0
- package/src/components/index.ts +2 -0
- package/src/components/islands/Assistant.astro +10 -1
- package/src/components/islands/assistant.tsx +104 -14
- package/src/components/islands/code-question.ts +62 -0
- package/src/components/islands/hooks.ts +110 -21
- package/src/components/islands/support-link.ts +68 -0
- package/src/components/layout/Analytics.astro +11 -2
- package/src/components/layout/Banner.astro +14 -10
- package/src/components/layout/Breadcrumbs.astro +6 -2
- package/src/components/layout/ConsentBanner.astro +62 -0
- package/src/components/layout/ConsentHead.astro +38 -0
- package/src/components/layout/Directory.astro +94 -0
- package/src/components/layout/DrawerSwitchers.astro +51 -0
- package/src/components/layout/Empty.astro +2 -2
- package/src/components/layout/Header.astro +122 -80
- package/src/components/layout/LanguageSwitcher.astro +48 -15
- package/src/components/layout/NarrationPlayer.astro +1085 -0
- package/src/components/layout/NavSelector.astro +33 -7
- package/src/components/layout/PageFeedback.astro +54 -49
- package/src/components/layout/PageLayout.astro +71 -3
- package/src/components/layout/ReferenceLayout.astro +17 -6
- package/src/components/layout/RelatedPages.astro +42 -0
- package/src/components/layout/RootLayout.astro +308 -45
- package/src/components/layout/Search.astro +31 -17
- package/src/components/layout/SiteFooter.astro +124 -0
- package/src/components/layout/SiteMetatags.astro +16 -0
- package/src/components/layout/consent/native.ts +79 -0
- package/src/components/layout/consent/types.ts +37 -0
- package/src/components/layout/footer-links.ts +53 -0
- package/src/components/layout/footer-socials.ts +87 -0
- package/src/components/layout/locale-redirect.ts +107 -0
- package/src/components/layout/nav-utils.ts +83 -0
- package/src/components/layout/page-feedback.ts +96 -0
- package/src/components/layout/search/analytics.ts +98 -0
- package/src/components/layout/search/flexsearch.ts +17 -5
- package/src/components/layout/search/orama-cloud.ts +26 -14
- package/src/components/layout/search/types.ts +20 -0
- package/src/components/layout/search/typesense.ts +5 -1
- package/src/components/openapi/Operation.astro +161 -13
- package/src/components/openapi/RequestBody.astro +6 -4
- package/src/components/openapi/RequestPanel.astro +59 -7
- package/src/components/openapi/Responses.astro +6 -4
- package/src/components/openapi/async-snippets.ts +4 -4
- package/src/components/openapi/code-samples.ts +97 -0
- package/src/components/openapi/security.ts +6 -3
- package/src/components/openapi/snippets.ts +869 -8
- package/src/components/props.ts +6 -0
- package/src/consent/client.ts +95 -0
- package/src/consent/clients.ts +19 -0
- package/src/consent/ethyca.ts +71 -0
- package/src/consent/head.ts +24 -0
- package/src/consent/index.ts +37 -0
- package/src/consent/init.ts +29 -0
- package/src/consent/native.ts +36 -0
- package/src/consent/osano.ts +59 -0
- package/src/consent/schema.ts +30 -0
- package/src/core/builtin-tags.ts +5 -0
- package/src/core/client-address.ts +19 -0
- package/src/core/config-input.ts +194 -20
- package/src/core/data.ts +44 -4
- package/src/core/diagnostics.ts +3 -2
- package/src/core/footer.ts +26 -0
- package/src/core/graph.ts +39 -36
- package/src/core/i18n-ui.ts +82 -2
- package/src/core/includes.ts +20 -3
- package/src/core/links.ts +16 -2
- package/src/core/localizable.ts +26 -0
- package/src/core/navigation.ts +43 -12
- package/src/core/page-modes.ts +56 -0
- package/src/core/project-graph.ts +111 -5
- package/src/core/redirect-patterns.ts +491 -0
- package/src/core/related.ts +131 -0
- package/src/core/schema.ts +318 -64
- package/src/core/sources/normalize.ts +2 -1
- package/src/core/sources/read.ts +8 -3
- package/src/core/types.ts +1 -1
- package/src/core/ui-packs/ar.ts +43 -0
- package/src/core/ui-packs/bg.ts +45 -0
- package/src/core/ui-packs/bn.ts +43 -0
- package/src/core/ui-packs/ca.ts +46 -0
- package/src/core/ui-packs/cs.ts +44 -0
- package/src/core/ui-packs/da.ts +45 -0
- package/src/core/ui-packs/de.ts +46 -0
- package/src/core/ui-packs/el.ts +45 -0
- package/src/core/ui-packs/es.ts +46 -0
- package/src/core/ui-packs/fa.ts +45 -0
- package/src/core/ui-packs/fi.ts +45 -0
- package/src/core/ui-packs/fr.ts +46 -0
- package/src/core/ui-packs/he.ts +43 -0
- package/src/core/ui-packs/hi.ts +44 -0
- package/src/core/ui-packs/hr.ts +45 -0
- package/src/core/ui-packs/hu.ts +44 -0
- package/src/core/ui-packs/id.ts +45 -0
- package/src/core/ui-packs/it.ts +45 -0
- package/src/core/ui-packs/ja.ts +45 -0
- package/src/core/ui-packs/ko.ts +44 -0
- package/src/core/ui-packs/nl.ts +46 -0
- package/src/core/ui-packs/no.ts +44 -0
- package/src/core/ui-packs/pl.ts +45 -0
- package/src/core/ui-packs/pt-br.ts +46 -0
- package/src/core/ui-packs/pt.ts +45 -0
- package/src/core/ui-packs/ro.ts +45 -0
- package/src/core/ui-packs/ru.ts +45 -0
- package/src/core/ui-packs/sk.ts +44 -0
- package/src/core/ui-packs/sr.ts +45 -0
- package/src/core/ui-packs/sv.ts +44 -0
- package/src/core/ui-packs/th.ts +43 -0
- package/src/core/ui-packs/tr.ts +45 -0
- package/src/core/ui-packs/uk.ts +45 -0
- package/src/core/ui-packs/vi.ts +45 -0
- package/src/core/ui-packs/zh-tw.ts +43 -0
- package/src/core/ui-packs/zh.ts +43 -0
- package/src/core/variables.ts +103 -0
- package/src/deploy/artifacts.ts +77 -8
- package/src/deploy/cloudflare-negotiation.ts +35 -5
- package/src/deploy/headers.ts +2 -1
- package/src/deploy/node-headers.ts +63 -9
- package/src/deploy/platforms/cloudflare.ts +32 -0
- package/src/deploy/platforms/netlify.ts +33 -1
- package/src/deploy/platforms/vercel.ts +37 -2
- package/src/deploy/redirects.ts +91 -24
- package/src/deploy/vercel-negotiation.ts +36 -0
- package/src/markdown/api-rail.ts +259 -0
- package/src/markdown/code-title.ts +35 -9
- package/src/markdown/features.ts +3 -2
- package/src/markdown/fence-meta.ts +2 -0
- package/src/markdown/include.ts +11 -1
- package/src/markdown/index.ts +28 -5
- package/src/markdown/math.ts +4 -4
- package/src/markdown/variables.ts +56 -0
- package/src/markdown/views.ts +82 -0
- package/src/narration/build.ts +412 -0
- package/src/narration/player.ts +249 -0
- package/src/narration/provider.ts +29 -0
- package/src/narration/script.ts +592 -0
- package/src/og/card.ts +7 -6
- package/src/openapi/model.ts +57 -24
- package/src/openapi/overlay.ts +256 -0
- package/src/openapi/parse.ts +55 -2
- package/src/openapi/references.ts +21 -5
- package/src/openapi/render-mdx.ts +5 -1
- package/src/openapi/scalar.ts +40 -6
- package/src/openapi/source.ts +1 -1
- package/src/ratelimit/cloudflare.ts +54 -0
- package/src/ratelimit/index.ts +30 -0
- package/src/ratelimit/memory.ts +45 -0
- package/src/ratelimit/runtime.ts +229 -0
- package/src/ratelimit/schema.ts +28 -0
- package/src/ratelimit/upstash.ts +30 -0
- package/src/ratelimit/wrangler.ts +70 -0
- package/src/reference/asyncapi.ts +2 -2
- package/src/reference/graphql.ts +5 -2
- package/src/reference/openapi.ts +21 -7
- package/src/reference/options.ts +51 -7
- package/src/reference/scalar.ts +33 -8
- package/src/registry/eject.ts +20 -4
- package/src/registry/registry.ts +7 -0
- package/src/search/documents.ts +26 -2
- package/src/search/orama-index.ts +28 -3
- package/src/search/pagefind-ranking.ts +39 -0
- package/src/search/sync/algolia.ts +15 -4
- package/src/search/sync/orama-cloud.ts +3 -0
- package/src/search/sync/typesense.ts +5 -0
- package/src/seo/metatags.ts +67 -0
- package/src/theme/chrome-icons.ts +1 -0
- package/src/theme/color.ts +500 -0
- package/src/theme/entry.ts +56 -3
- package/src/theme/palette.ts +121 -45
- package/src/translate/prompts.ts +1 -0
- package/src/translate/validate.ts +8 -2
- package/src/upgrade/upgrade.ts +4 -171
- package/dist/cli/chunk-364znk6q.js +0 -75
- package/dist/cli/chunk-364znk6q.js.map +0 -11
- package/dist/cli/chunk-5m5nmvyq.js.map +0 -13
- package/dist/cli/chunk-9t7a85s3.js.map +0 -10
- package/dist/cli/chunk-c8chx29p.js.map +0 -36
- package/dist/cli/chunk-pehfxfta.js.map +0 -10
- package/dist/cli/chunk-pv29h0wf.js.map +0 -190
- package/dist/cli/chunk-q58y5e6a.js.map +0 -10
- package/dist/cli/chunk-wrr3j9w9.js.map +0 -35
- package/dist/cli/chunk-yfyb25rh.js.map +0 -14
- package/docs/content/sources.mdx +0 -334
- /package/dist/cli/{chunk-2eytanqx.js.map → chunk-1n228xqb.js.map} +0 -0
- /package/dist/cli/{chunk-35d4wj9f.js.map → chunk-2n4ps1b3.js.map} +0 -0
- /package/dist/cli/{chunk-e04dxsz1.js.map → chunk-4ejxbzee.js.map} +0 -0
- /package/dist/cli/{chunk-tzmab476.js.map → chunk-5ffywsmb.js.map} +0 -0
- /package/dist/cli/{chunk-2z928egk.js.map → chunk-5wj2qwn2.js.map} +0 -0
- /package/dist/cli/{chunk-b07cmahc.js.map → chunk-amrb6hgh.js.map} +0 -0
- /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-cmtcnh9f.js.map} +0 -0
- /package/dist/cli/{chunk-crgn1q09.js.map → chunk-e7vvk5ya.js.map} +0 -0
- /package/dist/cli/{chunk-tkacnehg.js.map → chunk-gp84za0h.js.map} +0 -0
- /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-p804f3pe.js.map} +0 -0
- /package/dist/cli/{chunk-8ktnccpt.js.map → chunk-ta27feev.js.map} +0 -0
- /package/dist/cli/{chunk-a58773jm.js.map → chunk-y4ykbark.js.map} +0 -0
- /package/dist/cli/{chunk-p3v96n38.js.map → chunk-y5h4r2y0.js.map} +0 -0
- /package/dist/cli/{chunk-acanzt5p.js.map → chunk-yj17vs39.js.map} +0 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The narration player's decisions, kept apart from the DOM so they can be
|
|
3
|
+
* tested: which clip or sentence comes next, which browser voice reads a
|
|
4
|
+
* language, how far to scroll to keep the sentence in view, and what the
|
|
5
|
+
* progress readout says. `NarrationPlayer.astro` owns the elements, the audio,
|
|
6
|
+
* and the listeners, and asks these helpers what to do.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { narrationCharsPerSecond } from "./script.ts";
|
|
10
|
+
import type { NarrationManifest, NarrationSegment } from "./script.ts";
|
|
11
|
+
|
|
12
|
+
/** The playback speeds the player offers. */
|
|
13
|
+
export const NARRATION_SPEEDS = [0.8, 1, 1.25, 1.5, 1.75, 2] as const;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* One thing the player reads: its text, the page block and range to
|
|
17
|
+
* highlight (`block: -1` when there is none, like a cue), and the clip to play
|
|
18
|
+
* (`null` to speak `text` with a browser voice).
|
|
19
|
+
*/
|
|
20
|
+
export interface NarrationStep {
|
|
21
|
+
audio: string | null;
|
|
22
|
+
block: number;
|
|
23
|
+
end: number;
|
|
24
|
+
start: number;
|
|
25
|
+
text: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The steps for browser voices: every segment the page's own extract yielded,
|
|
30
|
+
* spoken as text.
|
|
31
|
+
*/
|
|
32
|
+
export const stepsFromSegments = (
|
|
33
|
+
segments: readonly NarrationSegment[]
|
|
34
|
+
): NarrationStep[] =>
|
|
35
|
+
segments.map((segment) => ({
|
|
36
|
+
audio: null,
|
|
37
|
+
block: segment.block ?? -1,
|
|
38
|
+
end: segment.end,
|
|
39
|
+
start: segment.start,
|
|
40
|
+
text: segment.text,
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The steps for generated audio: one per manifest clip, with its sentence
|
|
45
|
+
* mapped onto the live page through `aligned` (see `alignBlocks`). A clip whose
|
|
46
|
+
* block didn't align plays without a highlight. `text` is kept so a clip that
|
|
47
|
+
* fails to load can still be spoken by a browser voice.
|
|
48
|
+
*/
|
|
49
|
+
export const stepsFromManifest = (
|
|
50
|
+
manifest: NarrationManifest,
|
|
51
|
+
aligned: readonly number[],
|
|
52
|
+
audioBase: string
|
|
53
|
+
): NarrationStep[] =>
|
|
54
|
+
manifest.segments.map((segment) => {
|
|
55
|
+
const audio = `${audioBase}${segment.audio}`;
|
|
56
|
+
if ("text" in segment) {
|
|
57
|
+
return { audio, block: -1, end: 0, start: 0, text: segment.text };
|
|
58
|
+
}
|
|
59
|
+
const text = manifest.blocks[segment.block] ?? "";
|
|
60
|
+
return {
|
|
61
|
+
audio,
|
|
62
|
+
block: aligned[segment.block] ?? -1,
|
|
63
|
+
end: segment.end,
|
|
64
|
+
start: segment.start,
|
|
65
|
+
text: text.slice(segment.start, segment.end),
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
/** A speed read back from storage, or `1` when it isn't one the player offers. */
|
|
70
|
+
export const parseSpeed = (value: string | null): number => {
|
|
71
|
+
const speed = Number(value);
|
|
72
|
+
return NARRATION_SPEEDS.find((offered) => offered === speed) ?? 1;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/** The parts of a `SpeechSynthesisVoice` the choice depends on. */
|
|
76
|
+
export interface VoiceChoice {
|
|
77
|
+
default: boolean;
|
|
78
|
+
lang: string;
|
|
79
|
+
localService: boolean;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const normalizeLang = (lang: string): string =>
|
|
83
|
+
lang.toLowerCase().replaceAll("_", "-");
|
|
84
|
+
|
|
85
|
+
const primaryTag = (lang: string): string =>
|
|
86
|
+
normalizeLang(lang).split("-")[0] ?? "";
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The browser voice that reads `lang`: among voices for the exact locale
|
|
90
|
+
* (else any voice for the language), the browser's default, else an
|
|
91
|
+
* on-device voice, else the first. `null` when the browser has no voice for
|
|
92
|
+
* the language, in which case the player stays hidden rather than reading the
|
|
93
|
+
* page in the wrong accent.
|
|
94
|
+
*/
|
|
95
|
+
export const pickVoice = <Voice extends VoiceChoice>(
|
|
96
|
+
voices: readonly Voice[],
|
|
97
|
+
lang: string
|
|
98
|
+
): Voice | null => {
|
|
99
|
+
const wanted = normalizeLang(lang);
|
|
100
|
+
const exact = voices.filter((voice) => normalizeLang(voice.lang) === wanted);
|
|
101
|
+
const pool =
|
|
102
|
+
exact.length > 0
|
|
103
|
+
? exact
|
|
104
|
+
: voices.filter((voice) => primaryTag(voice.lang) === primaryTag(wanted));
|
|
105
|
+
return (
|
|
106
|
+
pool.find((voice) => voice.default) ??
|
|
107
|
+
pool.find((voice) => voice.localService) ??
|
|
108
|
+
pool[0] ??
|
|
109
|
+
null
|
|
110
|
+
);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
/** A sentence's box, as `Range.getBoundingClientRect()` reports it. */
|
|
114
|
+
export interface FollowRect {
|
|
115
|
+
bottom: number;
|
|
116
|
+
top: number;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* How far to scroll so the sentence being read sits a quarter of the way down
|
|
121
|
+
* the visible area below `inset` (the sticky header and player), or `0` when it
|
|
122
|
+
* is already comfortably in view.
|
|
123
|
+
*/
|
|
124
|
+
export const followScroll = (
|
|
125
|
+
rect: FollowRect,
|
|
126
|
+
inset: number,
|
|
127
|
+
viewport: number
|
|
128
|
+
): number => {
|
|
129
|
+
const margin = 24;
|
|
130
|
+
if (rect.top >= inset + margin && rect.bottom <= viewport - margin) {
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
const target = inset + (viewport - inset) * 0.25;
|
|
134
|
+
return Math.round(rect.top - target);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/** Whether any of the sentence is visible below `inset`. */
|
|
138
|
+
export const isInView = (
|
|
139
|
+
rect: FollowRect,
|
|
140
|
+
inset: number,
|
|
141
|
+
viewport: number
|
|
142
|
+
): boolean => rect.bottom > inset && rect.top < viewport;
|
|
143
|
+
|
|
144
|
+
/** `m:ss`, for the progress readout. */
|
|
145
|
+
export const formatClock = (seconds: number): string => {
|
|
146
|
+
const whole = Math.max(0, Math.round(seconds));
|
|
147
|
+
const minutes = Math.floor(whole / 60);
|
|
148
|
+
return `${minutes}:${String(whole % 60).padStart(2, "0")}`;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* How much of the page `steps` read, in characters. Progress is measured in
|
|
153
|
+
* characters rather than steps, so a long sentence moves the seek bar and the
|
|
154
|
+
* readout further than a short one.
|
|
155
|
+
*/
|
|
156
|
+
export const progressTotal = (steps: readonly NarrationStep[]): number =>
|
|
157
|
+
steps.reduce((total, step) => total + step.text.length, 0);
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Where playback is, in characters: every step before `index` in full, plus
|
|
161
|
+
* `fraction` (0 to 1) of the step being read.
|
|
162
|
+
*/
|
|
163
|
+
export const progressAt = (
|
|
164
|
+
steps: readonly NarrationStep[],
|
|
165
|
+
index: number,
|
|
166
|
+
fraction: number
|
|
167
|
+
): number => {
|
|
168
|
+
const current = steps[index]?.text.length ?? 0;
|
|
169
|
+
return (
|
|
170
|
+
progressTotal(steps.slice(0, Math.max(0, index))) +
|
|
171
|
+
current * Math.min(1, Math.max(0, fraction))
|
|
172
|
+
);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
/** The step being read at `position` characters (the last step past the end). */
|
|
176
|
+
export const stepAtProgress = (
|
|
177
|
+
steps: readonly NarrationStep[],
|
|
178
|
+
position: number
|
|
179
|
+
): number => {
|
|
180
|
+
let end = 0;
|
|
181
|
+
for (const [index, step] of steps.entries()) {
|
|
182
|
+
end += step.text.length;
|
|
183
|
+
if (position < end) {
|
|
184
|
+
return index;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return Math.max(0, steps.length - 1);
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* How far a browser voice is through `length` characters, `elapsedMs` after it
|
|
192
|
+
* started them at `speed`. An estimate from the reading rate, since a voice
|
|
193
|
+
* reports no duration; it holds at the end until the next sentence starts.
|
|
194
|
+
*/
|
|
195
|
+
export const spokenFraction = (
|
|
196
|
+
length: number,
|
|
197
|
+
elapsedMs: number,
|
|
198
|
+
speed: number,
|
|
199
|
+
lang: string
|
|
200
|
+
): number =>
|
|
201
|
+
length > 0
|
|
202
|
+
? Math.min(
|
|
203
|
+
1,
|
|
204
|
+
((elapsedMs / 1000) * narrationCharsPerSecond(lang) * speed) / length
|
|
205
|
+
)
|
|
206
|
+
: 1;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* The step a key on the seek bar moves to: one sentence per arrow key (the
|
|
210
|
+
* horizontal ones flipped for right-to-left pages), or the first or last with
|
|
211
|
+
* Home and End. `null` for any other key, which the bar handles itself.
|
|
212
|
+
*/
|
|
213
|
+
export const seekKeyTarget = (
|
|
214
|
+
key: string,
|
|
215
|
+
index: number,
|
|
216
|
+
count: number,
|
|
217
|
+
rtl: boolean
|
|
218
|
+
): number | null => {
|
|
219
|
+
const forward = rtl ? "ArrowLeft" : "ArrowRight";
|
|
220
|
+
const back = rtl ? "ArrowRight" : "ArrowLeft";
|
|
221
|
+
const targets = new Map([
|
|
222
|
+
["ArrowDown", index - 1],
|
|
223
|
+
["ArrowUp", index + 1],
|
|
224
|
+
["End", count - 1],
|
|
225
|
+
["Home", 0],
|
|
226
|
+
[back, index - 1],
|
|
227
|
+
[forward, index + 1],
|
|
228
|
+
]);
|
|
229
|
+
const target = targets.get(key);
|
|
230
|
+
return target === undefined
|
|
231
|
+
? null
|
|
232
|
+
: Math.min(Math.max(0, count - 1), Math.max(0, target));
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* The progress readout at `position` characters: the estimated time read so
|
|
237
|
+
* far and in total at `speed`, as `m:ss / m:ss`. An estimate from character
|
|
238
|
+
* counts, since a browser voice reports no duration and a clip's is only
|
|
239
|
+
* known once loaded.
|
|
240
|
+
*/
|
|
241
|
+
export const progressLabel = (
|
|
242
|
+
steps: readonly NarrationStep[],
|
|
243
|
+
position: number,
|
|
244
|
+
speed: number,
|
|
245
|
+
lang: string
|
|
246
|
+
): string => {
|
|
247
|
+
const rate = narrationCharsPerSecond(lang) * speed;
|
|
248
|
+
return `${formatClock(position / rate)} / ${formatClock(progressTotal(steps) / rate)}`;
|
|
249
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import { GATEWAY_API_KEY_ENV, sharedOptions } from "../ai/ask.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
|
|
6
|
+
/** The speech model narration uses when `gateway()` names none. */
|
|
7
|
+
export const DEFAULT_NARRATION_MODEL = "openai/tts-1-hd";
|
|
8
|
+
|
|
9
|
+
/** The voice narration uses when `gateway()` names none. */
|
|
10
|
+
export const DEFAULT_NARRATION_VOICE = "alloy";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* `narration.provider`: the `gateway()` descriptor from `blume/ai`, read with
|
|
14
|
+
* speech defaults. `reasoning` is an assistant option and is rejected here;
|
|
15
|
+
* `voice` and `instructions` are narration options and are rejected by the
|
|
16
|
+
* assistant.
|
|
17
|
+
*/
|
|
18
|
+
export const narrationProviderSchema = adapterDescriptorSchema(
|
|
19
|
+
"gateway",
|
|
20
|
+
z.strictObject({
|
|
21
|
+
...sharedOptions(GATEWAY_API_KEY_ENV),
|
|
22
|
+
instructions: z.string().min(1).optional(),
|
|
23
|
+
model: z.string().min(1).default(DEFAULT_NARRATION_MODEL),
|
|
24
|
+
voice: z.string().min(1).default(DEFAULT_NARRATION_VOICE),
|
|
25
|
+
})
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
/** A validated narration provider, defaults filled in. */
|
|
29
|
+
export type NarrationProvider = z.output<typeof narrationProviderSchema>;
|