blume 2.0.3 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -0
- package/CHANGELOG.md +142 -0
- package/README.md +1 -1
- package/dist/cli/{chunk-5f86nr5m.js → chunk-073rdvgb.js} +21 -48
- package/dist/cli/{chunk-5f86nr5m.js.map → chunk-073rdvgb.js.map} +4 -5
- package/dist/cli/{chunk-ga0pf4aj.js → chunk-0n9xkp3d.js} +12 -3
- package/dist/cli/{chunk-ga0pf4aj.js.map → chunk-0n9xkp3d.js.map} +3 -3
- package/dist/cli/chunk-150jk7km.js +52 -0
- package/dist/cli/chunk-150jk7km.js.map +10 -0
- package/dist/cli/{chunk-9t7a85s3.js → chunk-313vnn40.js} +30 -19
- package/dist/cli/chunk-313vnn40.js.map +10 -0
- package/dist/cli/{chunk-tkacnehg.js → chunk-3v3ffbrj.js} +2 -2
- package/dist/cli/{chunk-q58y5e6a.js → chunk-3x6x3pph.js} +46 -24
- package/dist/cli/chunk-3x6x3pph.js.map +10 -0
- package/dist/cli/{chunk-1d7ve1dm.js → chunk-42t4jxdx.js} +37 -5
- package/dist/cli/chunk-42t4jxdx.js.map +12 -0
- package/dist/cli/{chunk-8ktnccpt.js → chunk-54ztw1nj.js} +21 -2
- package/dist/cli/chunk-54ztw1nj.js.map +10 -0
- package/dist/cli/{chunk-hm3vjy5s.js → chunk-5vjtgs6e.js} +28 -10
- package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-5vjtgs6e.js.map} +4 -4
- package/dist/cli/chunk-66w9j7p6.js +322 -0
- package/dist/cli/chunk-66w9j7p6.js.map +14 -0
- package/dist/cli/{chunk-2hsdwb9n.js → chunk-7ppf1rva.js} +34 -18
- package/dist/cli/chunk-7ppf1rva.js.map +10 -0
- package/dist/cli/{chunk-r9rcc4w7.js → chunk-8y2kmjv8.js} +7 -7
- package/dist/cli/{chunk-r20tn01b.js → chunk-c1y538kd.js} +8 -2
- package/dist/cli/{chunk-r20tn01b.js.map → chunk-c1y538kd.js.map} +3 -3
- package/dist/cli/{chunk-2eytanqx.js → chunk-c887fj0s.js} +2 -2
- package/dist/cli/{chunk-p3v96n38.js → chunk-cfyg47zg.js} +16 -6
- package/dist/cli/chunk-cfyg47zg.js.map +10 -0
- package/dist/cli/chunk-cm89scdv.js +443 -0
- package/dist/cli/chunk-cm89scdv.js.map +11 -0
- package/dist/cli/{chunk-akbpwfxc.js → chunk-dzwehpy7.js} +2 -2
- package/dist/cli/{chunk-wrr3j9w9.js → chunk-e6atmn4h.js} +299 -72
- package/dist/cli/chunk-e6atmn4h.js.map +36 -0
- package/dist/cli/{chunk-tzmab476.js → chunk-e8xw9qkh.js} +8 -6
- package/dist/cli/{chunk-tzmab476.js.map → chunk-e8xw9qkh.js.map} +3 -3
- package/dist/cli/{chunk-6dsbexzp.js → chunk-e9q7a2ak.js} +17 -15
- package/dist/cli/{chunk-6dsbexzp.js.map → chunk-e9q7a2ak.js.map} +2 -2
- package/dist/cli/{chunk-pv29h0wf.js → chunk-ehweg4fr.js} +5155 -1249
- package/dist/cli/chunk-ehweg4fr.js.map +218 -0
- package/dist/cli/{chunk-c8chx29p.js → chunk-ep6nd0rn.js} +390 -318
- package/dist/cli/chunk-ep6nd0rn.js.map +36 -0
- package/dist/cli/{chunk-p73c0m7w.js → chunk-fdrkhpjy.js} +18 -15
- package/dist/cli/{chunk-p73c0m7w.js.map → chunk-fdrkhpjy.js.map} +3 -3
- package/dist/cli/{chunk-2z928egk.js → chunk-ft9vfys6.js} +5 -5
- package/dist/cli/{chunk-5m5nmvyq.js → chunk-gb420vvz.js} +316 -79
- package/dist/cli/chunk-gb420vvz.js.map +17 -0
- package/dist/cli/{chunk-vg9r4eb9.js → chunk-hebn0tpx.js} +86 -13
- package/dist/cli/chunk-hebn0tpx.js.map +14 -0
- package/dist/cli/{chunk-35d4wj9f.js → chunk-htrwgabr.js} +41 -23
- package/dist/cli/chunk-htrwgabr.js.map +15 -0
- package/dist/cli/{chunk-g4hq16wv.js → chunk-hx3xqnk9.js} +16 -14
- package/dist/cli/{chunk-g4hq16wv.js.map → chunk-hx3xqnk9.js.map} +2 -2
- package/dist/cli/chunk-j134vrp2.js +65 -0
- package/dist/cli/chunk-j134vrp2.js.map +10 -0
- package/dist/cli/{chunk-a58773jm.js → chunk-kma9f6sf.js} +2 -2
- package/dist/cli/chunk-kwrg63tm.js +31 -0
- package/dist/cli/chunk-kwrg63tm.js.map +10 -0
- package/dist/cli/{chunk-ey84smr6.js → chunk-mrcccgnh.js} +6 -6
- package/dist/cli/{chunk-ey84smr6.js.map → chunk-mrcccgnh.js.map} +1 -1
- package/dist/cli/{chunk-yfyb25rh.js → chunk-n0v7m8ry.js} +24 -8
- package/dist/cli/chunk-n0v7m8ry.js.map +14 -0
- package/dist/cli/{chunk-j85vccga.js → chunk-ncj7w596.js} +576 -367
- package/dist/cli/chunk-ncj7w596.js.map +35 -0
- package/dist/cli/{chunk-5xvm6tfj.js → chunk-nq1d20w2.js} +17 -15
- package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-nq1d20w2.js.map} +2 -2
- package/dist/cli/{chunk-pehfxfta.js → chunk-nrns10mj.js} +6 -98
- package/dist/cli/chunk-nrns10mj.js.map +10 -0
- package/dist/cli/{chunk-crgn1q09.js → chunk-sds923fa.js} +4 -4
- package/dist/cli/chunk-t2m5j4pr.js +104 -0
- package/dist/cli/chunk-t2m5j4pr.js.map +11 -0
- package/dist/cli/{chunk-acanzt5p.js → chunk-tdqhyxfz.js} +6 -6
- package/dist/cli/chunk-tphac74f.js +126 -0
- package/dist/cli/chunk-tphac74f.js.map +11 -0
- package/dist/cli/chunk-w1r4vase.js +18 -0
- package/dist/cli/chunk-w1r4vase.js.map +10 -0
- 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/index.js +31 -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 +26 -0
- package/dist/types/ai/ask.d.ts +271 -58
- package/dist/types/ai/component-markdown.d.ts +2 -0
- package/dist/types/ai/index.d.ts +2 -2
- package/dist/types/ai/openapi-components.d.ts +4 -1
- 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 +9 -0
- package/dist/types/astro/markdown-negotiation.d.ts +3 -0
- package/dist/types/astro/pages.d.ts +10 -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/cli/init/scaffold.d.ts +1 -1
- package/dist/types/components/content/api-field.d.ts +62 -0
- package/dist/types/components/content/api-page.d.ts +100 -0
- package/dist/types/components/layout/nav-utils.d.ts +26 -0
- package/dist/types/components/openapi/code-samples.d.ts +29 -0
- package/dist/types/components/openapi/helpers.d.ts +158 -0
- package/dist/types/components/openapi/security.d.ts +95 -0
- package/dist/types/components/openapi/snippets.d.ts +60 -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/changelog-index.d.ts +8 -0
- package/dist/types/core/config-input.d.ts +217 -23
- package/dist/types/core/data.d.ts +53 -4
- package/dist/types/core/footer.d.ts +8 -0
- package/dist/types/core/i18n-ui.d.ts +88 -0
- package/dist/types/core/includes.d.ts +8 -2
- package/dist/types/core/links.d.ts +8 -0
- package/dist/types/core/localizable.d.ts +7 -0
- package/dist/types/core/page-modes.d.ts +29 -0
- package/dist/types/core/probe.d.ts +2 -0
- package/dist/types/core/project-graph.d.ts +6 -0
- package/dist/types/core/redirect-patterns.d.ts +152 -0
- package/dist/types/core/related.d.ts +40 -0
- package/dist/types/core/schema.d.ts +670 -56
- package/dist/types/core/sources/cache.d.ts +3 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +11 -2
- package/dist/types/core/sources/contentful.d.ts +17 -1
- package/dist/types/core/sources/lexical.d.ts +5 -0
- package/dist/types/core/sources/normalize.d.ts +20 -1
- package/dist/types/core/sources/read.d.ts +5 -0
- package/dist/types/core/sources/remote.d.ts +37 -10
- package/dist/types/core/sources/sanity.d.ts +1 -1
- package/dist/types/core/types.d.ts +18 -1
- package/dist/types/core/variables.d.ts +42 -0
- package/dist/types/deploy/adapter-output.d.ts +2 -1
- package/dist/types/deploy/adapters/cloudflare.d.ts +7 -5
- package/dist/types/deploy/adapters/node.d.ts +58 -23
- package/dist/types/deploy/adapters/registry.d.ts +10 -0
- package/dist/types/deploy/adapters/types.d.ts +3 -2
- package/dist/types/deploy/node-headers.d.ts +13 -2
- package/dist/types/deploy/platforms/cloudflare.d.ts +15 -7
- package/dist/types/deploy/platforms/netlify.d.ts +7 -0
- package/dist/types/deploy/platforms/node.d.ts +3 -1
- package/dist/types/deploy/platforms/types.d.ts +18 -7
- package/dist/types/deploy/platforms/vercel.d.ts +26 -1
- package/dist/types/deploy/redirects.d.ts +55 -11
- package/dist/types/deploy/sitemap.d.ts +2 -1
- package/dist/types/deploy/vercel-negotiation.d.ts +51 -21
- 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/checks.d.ts +27 -0
- package/dist/types/openapi/graphql.d.ts +6 -0
- package/dist/types/openapi/model.d.ts +27 -10
- package/dist/types/openapi/overlay.d.ts +54 -0
- package/dist/types/openapi/parse.d.ts +16 -0
- package/dist/types/openapi/references.d.ts +30 -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 +119 -0
- package/dist/types/ratelimit/upstash.d.ts +46 -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 +89 -11
- package/dist/types/reference/index.d.ts +1 -1
- package/dist/types/reference/openapi.d.ts +33 -12
- package/dist/types/reference/options.d.ts +82 -6
- package/dist/types/reference/scalar.d.ts +13 -0
- package/dist/types/reference/schema.d.ts +144 -36
- package/dist/types/search/adapters/registry.d.ts +3 -0
- package/dist/types/search/adapters/typesense.d.ts +14 -4
- package/dist/types/search/build.d.ts +3 -1
- package/dist/types/search/documents.d.ts +12 -1
- package/dist/types/search/orama-index.d.ts +13 -9
- package/dist/types/search/sync/algolia.d.ts +5 -2
- package/dist/types/search/sync/index.d.ts +3 -1
- package/dist/types/search/sync/typesense.d.ts +11 -7
- package/dist/types/seo/metatags.d.ts +20 -0
- package/dist/types/sources/contentful.d.ts +16 -0
- package/dist/types/sources/github-releases.d.ts +8 -1
- package/dist/types/sources/payload.d.ts +2 -0
- package/dist/types/sources/registry.d.ts +54 -0
- package/dist/types/sources/shared.d.ts +3 -0
- package/dist/types/sources/strapi.d.ts +2 -0
- package/docs/01-quickstart.mdx +4 -2
- package/docs/02-deployment.mdx +71 -17
- package/docs/03-upgrading.mdx +4 -4
- package/docs/04-migrating.mdx +1 -1
- package/docs/advanced/changelog.mdx +13 -2
- package/docs/advanced/skills.mdx +15 -1
- package/docs/cli/audit.mdx +51 -8
- package/docs/cli/doctor.mdx +5 -1
- package/docs/cli/evals.mdx +4 -4
- package/docs/cli/index.mdx +1 -0
- package/docs/cli/translate.mdx +1 -0
- package/docs/cli/validate.mdx +4 -3
- package/docs/configuration/analytics.mdx +3 -1
- package/docs/configuration/assistant.mdx +194 -38
- package/docs/configuration/consent.mdx +100 -0
- package/docs/configuration/customization.mdx +8 -6
- package/docs/configuration/export.mdx +5 -3
- package/docs/configuration/index.mdx +64 -5
- package/docs/configuration/meta.ts +3 -0
- package/docs/configuration/narration.mdx +119 -0
- package/docs/configuration/rate-limiting.mdx +90 -0
- package/docs/configuration/search.mdx +63 -12
- package/docs/configuration/theming.mdx +3 -1
- package/docs/content/components.mdx +108 -2
- package/docs/content/frontmatter.mdx +80 -2
- package/docs/content/i18n.mdx +39 -4
- 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 +32 -10
- package/docs/content/sources/contentful.mdx +35 -0
- package/docs/content/sources/custom.mdx +43 -0
- package/docs/content/sources/github-releases.mdx +39 -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 +31 -0
- package/docs/content/sources/remote-mdx.mdx +44 -0
- package/docs/content/sources/sanity.mdx +29 -0
- package/docs/content/sources/strapi.mdx +32 -0
- package/docs/content/syntax.mdx +69 -4
- package/docs/content/variables.mdx +41 -0
- package/docs/discoverability/agent-discovery.mdx +29 -2
- package/docs/discoverability/index.mdx +2 -2
- package/docs/discoverability/json-api.mdx +2 -0
- package/docs/discoverability/llms-txt.mdx +2 -2
- package/docs/discoverability/markdown.mdx +3 -1
- package/docs/discoverability/mcp.mdx +4 -0
- package/docs/discoverability/metadata.mdx +17 -0
- package/docs/discoverability/sitemap-and-robots.mdx +1 -1
- package/docs/references/api-pages.mdx +74 -0
- package/docs/references/asyncapi.mdx +4 -2
- package/docs/references/graphql.mdx +14 -2
- package/docs/references/meta.ts +1 -1
- package/docs/references/openapi.mdx +148 -7
- package/docs/references/scalar.mdx +3 -1
- package/package.json +43 -8
- package/skills/blume/SKILL.md +3 -0
- package/skills/blume-migrate/SKILL.md +6 -6
- package/skills/blume-migrate/references/docusaurus.md +7 -7
- package/skills/blume-migrate/references/fumadocs.md +17 -13
- package/skills/blume-migrate/references/mintlify.md +37 -19
- package/skills/blume-migrate/references/nextra.md +10 -7
- package/skills/blume-migrate/references/starlight.md +11 -8
- 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 +103 -20
- package/src/ai/ask-data.ts +6 -0
- package/src/ai/ask-limits.ts +13 -0
- package/src/ai/ask-tools.ts +142 -0
- package/src/ai/ask.ts +354 -76
- package/src/ai/changelog-markdown.ts +11 -6
- package/src/ai/component-markdown.ts +76 -1
- package/src/ai/cors.ts +14 -3
- 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/mcp/query.ts +14 -6
- package/src/ai/openapi-components.ts +36 -6
- package/src/ai/relative-links.ts +4 -38
- 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 +210 -66
- package/src/astro/index.ts +1 -0
- package/src/astro/integration.ts +42 -4
- package/src/astro/markdown-negotiation.ts +3 -0
- package/src/astro/module-types.ts +9 -1
- package/src/astro/pages.ts +23 -0
- package/src/astro/templates.ts +406 -108
- package/src/astro/variables.ts +31 -0
- package/src/audit/catalog.ts +38 -3
- 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 +19 -13
- package/src/audit/checks/network.ts +110 -6
- package/src/audit/checks/redirects.ts +6 -4
- package/src/audit/checks/robots.ts +58 -2
- package/src/audit/checks/sitemap.ts +2 -3
- package/src/audit/redirects.ts +46 -15
- package/src/audit/run.ts +5 -0
- package/src/audit/types.ts +4 -1
- package/src/audit/url.ts +14 -5
- package/src/blume-modules.d.ts +12 -1
- 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/args.ts +51 -0
- package/src/cli/build-failure.ts +23 -0
- package/src/cli/command-meta.ts +5 -0
- package/src/cli/commands/audit.ts +10 -1
- package/src/cli/commands/dev.ts +18 -2
- package/src/cli/commands/doctor.ts +67 -28
- package/src/cli/commands/eval.ts +36 -4
- package/src/cli/commands/init.ts +6 -4
- package/src/cli/commands/skill.ts +96 -0
- package/src/cli/commands/validate.ts +10 -1
- package/src/cli/index.ts +5 -0
- package/src/cli/init/scaffold.ts +3 -3
- package/src/cli/prepare.ts +6 -3
- package/src/cli/required-secrets.ts +72 -30
- 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 +66 -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 +103 -0
- package/src/components/content/api-page.ts +248 -0
- package/src/components/content/mermaid-element.ts +15 -1
- 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 +136 -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/PageActions.astro +139 -24
- 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 +318 -47
- package/src/components/layout/Search.astro +47 -19
- package/src/components/layout/SiteFooter.astro +124 -0
- package/src/components/layout/SiteMetatags.astro +16 -0
- package/src/components/layout/TableOfContents.astro +24 -17
- 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/head-scripts.ts +6 -1
- 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/algolia.ts +10 -1
- package/src/components/layout/search/analytics.ts +126 -0
- package/src/components/layout/search/endpoint.ts +48 -5
- package/src/components/layout/search/flexsearch.ts +17 -5
- package/src/components/layout/search/orama-cloud.ts +26 -14
- package/src/components/layout/search/pagefind.ts +114 -5
- package/src/components/layout/search/types.ts +32 -0
- package/src/components/layout/search/typesense.ts +19 -3
- package/src/components/openapi/AsyncApiOperation.astro +14 -7
- package/src/components/openapi/Authorization.astro +10 -0
- package/src/components/openapi/GraphqlOperation.astro +5 -0
- package/src/components/openapi/Operation.astro +184 -13
- package/src/components/openapi/ParametersTable.astro +8 -4
- package/src/components/openapi/Playground.astro +7 -1
- package/src/components/openapi/RequestBody.astro +24 -5
- package/src/components/openapi/RequestPanel.astro +59 -7
- package/src/components/openapi/Responses.astro +7 -4
- package/src/components/openapi/SchemaTable.astro +15 -3
- package/src/components/openapi/async-snippets.ts +65 -9
- package/src/components/openapi/async.ts +123 -29
- package/src/components/openapi/code-samples.ts +97 -0
- package/src/components/openapi/graphql-helpers.ts +35 -12
- package/src/components/openapi/helpers.ts +36 -2
- package/src/components/openapi/message-model.ts +54 -11
- package/src/components/openapi/message.ts +14 -4
- package/src/components/openapi/operation-model.ts +16 -7
- package/src/components/openapi/playground-client.ts +24 -5
- package/src/components/openapi/playground-schema.ts +1 -1
- package/src/components/openapi/schema-tree.ts +44 -14
- package/src/components/openapi/security.ts +16 -3
- package/src/components/openapi/snippets.ts +873 -10
- package/src/components/openapi/validate-json.ts +4 -3
- 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/changelog-index.ts +31 -1
- package/src/core/client-address.ts +19 -0
- package/src/core/component-diagnostics.ts +53 -0
- package/src/core/component-overrides.ts +32 -0
- package/src/core/config-input.ts +225 -23
- package/src/core/data.ts +46 -4
- package/src/core/diagnostics.ts +8 -2
- package/src/core/footer.ts +26 -0
- package/src/core/graph.ts +39 -36
- package/src/core/i18n-ui.ts +84 -2
- package/src/core/includes.ts +21 -4
- package/src/core/links.ts +63 -19
- 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/probe.ts +26 -6
- package/src/core/project-graph.ts +163 -16
- package/src/core/redirect-patterns.ts +520 -0
- package/src/core/related.ts +131 -0
- package/src/core/schema.ts +339 -66
- package/src/core/sources/cache.ts +6 -0
- package/src/core/sources/contentful-rich-text.ts +29 -6
- package/src/core/sources/contentful.ts +135 -25
- package/src/core/sources/filesystem.ts +26 -4
- package/src/core/sources/github-releases.ts +12 -1
- package/src/core/sources/lexical.ts +15 -10
- package/src/core/sources/mdx-remote.ts +62 -10
- package/src/core/sources/normalize.ts +228 -41
- package/src/core/sources/notion.ts +7 -1
- package/src/core/sources/obsidian.ts +16 -3
- package/src/core/sources/payload.ts +38 -15
- package/src/core/sources/read.ts +8 -3
- package/src/core/sources/remote.ts +72 -15
- package/src/core/sources/resolve.ts +11 -1
- package/src/core/sources/sanity.ts +43 -25
- package/src/core/sources/strapi.ts +2 -2
- package/src/core/types.ts +19 -1
- package/src/core/ui-packs/ar.ts +44 -0
- package/src/core/ui-packs/bg.ts +46 -0
- package/src/core/ui-packs/bn.ts +44 -0
- package/src/core/ui-packs/ca.ts +47 -0
- package/src/core/ui-packs/cs.ts +45 -0
- package/src/core/ui-packs/da.ts +46 -0
- package/src/core/ui-packs/de.ts +47 -0
- package/src/core/ui-packs/el.ts +46 -0
- package/src/core/ui-packs/es.ts +47 -0
- package/src/core/ui-packs/fa.ts +46 -0
- package/src/core/ui-packs/fi.ts +46 -0
- package/src/core/ui-packs/fr.ts +47 -0
- package/src/core/ui-packs/he.ts +44 -0
- package/src/core/ui-packs/hi.ts +45 -0
- package/src/core/ui-packs/hr.ts +46 -0
- package/src/core/ui-packs/hu.ts +45 -0
- package/src/core/ui-packs/id.ts +46 -0
- package/src/core/ui-packs/it.ts +46 -0
- package/src/core/ui-packs/ja.ts +46 -0
- package/src/core/ui-packs/ko.ts +45 -0
- package/src/core/ui-packs/nl.ts +47 -0
- package/src/core/ui-packs/no.ts +45 -0
- package/src/core/ui-packs/pl.ts +46 -0
- package/src/core/ui-packs/pt-br.ts +47 -0
- package/src/core/ui-packs/pt.ts +46 -0
- package/src/core/ui-packs/ro.ts +46 -0
- package/src/core/ui-packs/ru.ts +46 -0
- package/src/core/ui-packs/sk.ts +45 -0
- package/src/core/ui-packs/sr.ts +46 -0
- package/src/core/ui-packs/sv.ts +45 -0
- package/src/core/ui-packs/th.ts +44 -0
- package/src/core/ui-packs/tr.ts +46 -0
- package/src/core/ui-packs/uk.ts +46 -0
- package/src/core/ui-packs/vi.ts +46 -0
- package/src/core/ui-packs/zh-tw.ts +44 -0
- package/src/core/ui-packs/zh.ts +44 -0
- package/src/core/variables.ts +103 -0
- package/src/deploy/adapter-output.ts +7 -2
- package/src/deploy/adapters/cloudflare.ts +7 -5
- package/src/deploy/adapters/node.ts +47 -9
- package/src/deploy/adapters/types.ts +7 -3
- package/src/deploy/artifacts.ts +79 -9
- 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 +45 -9
- package/src/deploy/platforms/netlify.ts +35 -2
- package/src/deploy/platforms/node.ts +12 -2
- package/src/deploy/platforms/types.ts +21 -7
- package/src/deploy/platforms/vercel.ts +149 -17
- package/src/deploy/redirects.ts +151 -24
- package/src/deploy/rss.ts +3 -1
- package/src/deploy/sitemap.ts +39 -5
- package/src/deploy/vercel-negotiation.ts +326 -102
- package/src/eval/agents.ts +18 -1
- package/src/eval/prompts.ts +6 -3
- package/src/eval/report.ts +34 -13
- package/src/eval/run.ts +5 -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/relative-links.ts +3 -2
- 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/checks.ts +273 -0
- package/src/openapi/graphql-build.ts +21 -0
- package/src/openapi/graphql.ts +11 -0
- package/src/openapi/model.ts +72 -27
- package/src/openapi/overlay.ts +256 -0
- package/src/openapi/parse.ts +182 -4
- package/src/openapi/references.ts +64 -8
- package/src/openapi/render-mdx.ts +5 -1
- package/src/openapi/scalar.ts +40 -6
- package/src/openapi/source.ts +40 -15
- 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 +247 -0
- package/src/ratelimit/schema.ts +28 -0
- package/src/ratelimit/upstash.ts +60 -0
- package/src/ratelimit/wrangler.ts +70 -0
- package/src/reference/asyncapi.ts +2 -2
- package/src/reference/graphql.ts +20 -3
- package/src/reference/index.ts +1 -0
- package/src/reference/openapi.ts +21 -7
- package/src/reference/options.ts +80 -8
- package/src/reference/scalar.ts +33 -8
- package/src/registry/eject.ts +23 -5
- package/src/registry/registry.ts +7 -0
- package/src/search/adapters/locale-scope.ts +30 -0
- package/src/search/adapters/typesense.ts +14 -4
- package/src/search/build.ts +21 -3
- package/src/search/documents.ts +26 -2
- package/src/search/orama-index.ts +191 -34
- package/src/search/pagefind-ranking.ts +39 -0
- package/src/search/source-pages.ts +29 -0
- package/src/search/sync/algolia.ts +111 -10
- package/src/search/sync/index.ts +52 -13
- package/src/search/sync/orama-cloud.ts +3 -0
- package/src/search/sync/typesense.ts +76 -26
- package/src/seo/metatags.ts +67 -0
- package/src/sources/contentful.ts +12 -0
- package/src/sources/github-releases.ts +7 -1
- package/src/sources/shared.ts +3 -0
- package/src/theme/chrome-icons.ts +1 -0
- package/src/theme/color.ts +500 -0
- package/src/theme/entry.ts +85 -6
- package/src/theme/palette.ts +121 -45
- package/src/translate/prompts.ts +1 -0
- package/src/translate/validate.ts +31 -3
- package/src/upgrade/upgrade.ts +4 -171
- package/dist/cli/chunk-1d7ve1dm.js.map +0 -12
- package/dist/cli/chunk-2hsdwb9n.js.map +0 -10
- package/dist/cli/chunk-35d4wj9f.js.map +0 -15
- 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-8ktnccpt.js.map +0 -10
- package/dist/cli/chunk-9t7a85s3.js.map +0 -10
- package/dist/cli/chunk-b07cmahc.js +0 -145
- package/dist/cli/chunk-b07cmahc.js.map +0 -11
- package/dist/cli/chunk-c8chx29p.js.map +0 -36
- package/dist/cli/chunk-e04dxsz1.js +0 -39
- package/dist/cli/chunk-e04dxsz1.js.map +0 -10
- package/dist/cli/chunk-j85vccga.js.map +0 -36
- package/dist/cli/chunk-p3v96n38.js.map +0 -10
- 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-vg9r4eb9.js.map +0 -14
- 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-tkacnehg.js.map → chunk-3v3ffbrj.js.map} +0 -0
- /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-8y2kmjv8.js.map} +0 -0
- /package/dist/cli/{chunk-2eytanqx.js.map → chunk-c887fj0s.js.map} +0 -0
- /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-dzwehpy7.js.map} +0 -0
- /package/dist/cli/{chunk-2z928egk.js.map → chunk-ft9vfys6.js.map} +0 -0
- /package/dist/cli/{chunk-a58773jm.js.map → chunk-kma9f6sf.js.map} +0 -0
- /package/dist/cli/{chunk-crgn1q09.js.map → chunk-sds923fa.js.map} +0 -0
- /package/dist/cli/{chunk-acanzt5p.js.map → chunk-tdqhyxfz.js.map} +0 -0
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
import data from "blume:data";
|
|
3
|
+
import type { BlumeBanner } from "../../core/data.ts";
|
|
3
4
|
import { EN_UI } from "../../core/i18n-ui.ts";
|
|
4
5
|
import type { UIStrings } from "../../core/i18n-ui.ts";
|
|
6
|
+
import { resolveLocalizable } from "../../core/localizable.ts";
|
|
5
7
|
import { withBase } from "../islands/base-path.ts";
|
|
6
8
|
import Icon from "../Icon.astro";
|
|
7
9
|
|
|
@@ -9,14 +11,11 @@ import Icon from "../Icon.astro";
|
|
|
9
11
|
// every shell shows the same bar. The pre-paint hide for a dismissed banner and
|
|
10
12
|
// the dismiss click handler live in the layout/Header, not here.
|
|
11
13
|
interface Props {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
key: string;
|
|
18
|
-
}
|
|
19
|
-
| null;
|
|
14
|
+
/**
|
|
15
|
+
* The banner. Its `content` and link `text` may be per-locale maps, shown
|
|
16
|
+
* in `locale` (else the default locale, else the map's first entry).
|
|
17
|
+
*/
|
|
18
|
+
banner: BlumeBanner | null;
|
|
20
19
|
/** Localized banner labels. */
|
|
21
20
|
strings?: UIStrings["banner"];
|
|
22
21
|
/**
|
|
@@ -40,6 +39,11 @@ const b = { ...EN_UI.banner, ...strings };
|
|
|
40
39
|
const navigation =
|
|
41
40
|
(locale === undefined ? undefined : data.navigationByLocale[locale]) ??
|
|
42
41
|
data.navigation;
|
|
42
|
+
const defaultLocale = data.config.i18n?.defaultLocale;
|
|
43
|
+
const content =
|
|
44
|
+
banner && resolveLocalizable(banner.content, locale, defaultLocale);
|
|
45
|
+
const linkText =
|
|
46
|
+
banner?.link && resolveLocalizable(banner.link.text, locale, defaultLocale);
|
|
43
47
|
const linkHref =
|
|
44
48
|
banner?.link && banner.link.href === data.config.banner?.link?.href
|
|
45
49
|
? (navigation.bannerHref ?? banner.link.href)
|
|
@@ -55,13 +59,13 @@ const linkHref =
|
|
|
55
59
|
>
|
|
56
60
|
{/* The message is authored in one language, whatever the page's
|
|
57
61
|
direction: `dir="auto"` keeps its punctuation where it was typed. */}
|
|
58
|
-
<span dir="auto">{
|
|
62
|
+
<span dir="auto">{content}</span>
|
|
59
63
|
{banner.link && linkHref && (
|
|
60
64
|
<a
|
|
61
65
|
class="inline-flex items-center gap-1 font-medium underline underline-offset-2"
|
|
62
66
|
href={withBase(linkHref)}
|
|
63
67
|
>
|
|
64
|
-
{
|
|
68
|
+
{linkText}
|
|
65
69
|
<Icon class="rtl:-scale-x-100" name="arrow-right" size={14} />
|
|
66
70
|
</a>
|
|
67
71
|
)}
|
|
@@ -11,9 +11,11 @@ interface Props {
|
|
|
11
11
|
strings?: UIStrings["nav"];
|
|
12
12
|
/** Left-align full width (for the wide API layout) instead of the prose measure. */
|
|
13
13
|
wide?: boolean;
|
|
14
|
+
/** Match a `center` page's wider centered column instead of the prose measure. */
|
|
15
|
+
centered?: boolean;
|
|
14
16
|
}
|
|
15
17
|
|
|
16
|
-
const { crumbs, strings, wide = false } = Astro.props;
|
|
18
|
+
const { crumbs, strings, wide = false, centered = false } = Astro.props;
|
|
17
19
|
|
|
18
20
|
// Merge over the English defaults so a label missing from a translation (or
|
|
19
21
|
// from a not-yet-regenerated snapshot) still renders instead of coming out
|
|
@@ -31,7 +33,9 @@ const eyebrowCrumb = crumbs.length > 1 ? crumbs[crumbs.length - 2] : null;
|
|
|
31
33
|
aria-label={n.breadcrumb}
|
|
32
34
|
class:list={[
|
|
33
35
|
"mb-2 text-muted-foreground text-sm",
|
|
34
|
-
wide
|
|
36
|
+
wide
|
|
37
|
+
? "max-w-none"
|
|
38
|
+
: ["mx-auto", centered ? "max-w-[54rem]" : "max-w-content"],
|
|
35
39
|
]}
|
|
36
40
|
>
|
|
37
41
|
{eyebrowCrumb.route ? (
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { EN_UI } from "../../core/i18n-ui.ts";
|
|
3
|
+
import type { UIStrings } from "../../core/i18n-ui.ts";
|
|
4
|
+
import { newTabAttrs } from "../../core/new-tab.ts";
|
|
5
|
+
import { withBase } from "../islands/base-path.ts";
|
|
6
|
+
|
|
7
|
+
// The `native()` consent banner: a card at the foot of the viewport asking to
|
|
8
|
+
// use analytics cookies. It renders hidden, and the consent runtime
|
|
9
|
+
// (`consent/client.ts`) shows it until the reader answers, stores the answer,
|
|
10
|
+
// and shows it again from the footer's Cookie settings link. Accept and
|
|
11
|
+
// Decline carry the same weight, so declining is as easy as accepting.
|
|
12
|
+
interface Props {
|
|
13
|
+
/** The privacy policy link: a page route or a URL. */
|
|
14
|
+
policy?: string;
|
|
15
|
+
/** Localized banner labels. */
|
|
16
|
+
strings?: UIStrings["consent"];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const { policy, strings } = Astro.props;
|
|
20
|
+
const c = { ...EN_UI.consent, ...strings };
|
|
21
|
+
const buttonClass =
|
|
22
|
+
"flex-1 rounded-blume border border-border px-4 py-2 text-foreground text-sm transition-colors hover:border-foreground";
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
<div
|
|
26
|
+
aria-label={c.label}
|
|
27
|
+
class="fixed inset-x-4 bottom-4 z-50 rounded-blume border border-border bg-background p-4 shadow-lg sm:start-auto sm:end-4 sm:w-96"
|
|
28
|
+
data-blume-consent-banner
|
|
29
|
+
hidden
|
|
30
|
+
role="region"
|
|
31
|
+
>
|
|
32
|
+
<p class="text-foreground text-sm">
|
|
33
|
+
{c.message}{" "}
|
|
34
|
+
{
|
|
35
|
+
policy && (
|
|
36
|
+
<a
|
|
37
|
+
class="text-muted-foreground underline underline-offset-2 transition-colors hover:text-foreground"
|
|
38
|
+
href={withBase(policy)}
|
|
39
|
+
{...newTabAttrs(policy)}
|
|
40
|
+
>
|
|
41
|
+
{c.policy}
|
|
42
|
+
</a>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
</p>
|
|
46
|
+
<div class="mt-3 flex gap-2">
|
|
47
|
+
<button
|
|
48
|
+
class={buttonClass}
|
|
49
|
+
data-blume-consent-choice="decline"
|
|
50
|
+
type="button"
|
|
51
|
+
>
|
|
52
|
+
{c.decline}
|
|
53
|
+
</button>
|
|
54
|
+
<button
|
|
55
|
+
class={buttonClass}
|
|
56
|
+
data-blume-consent-choice="accept"
|
|
57
|
+
type="button"
|
|
58
|
+
>
|
|
59
|
+
{c.accept}
|
|
60
|
+
</button>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { consentHead } from "../../consent/head.ts";
|
|
3
|
+
import { CONSENT_INIT_SCRIPT } from "../../consent/init.ts";
|
|
4
|
+
import type { BlumeDataConfig } from "../../core/data.ts";
|
|
5
|
+
|
|
6
|
+
// The consent layer's <head> output, rendered ahead of `Analytics.astro` by
|
|
7
|
+
// every layout when `consent` is configured: the inline script that creates
|
|
8
|
+
// `window.blumeConsent` (`consent/init.ts`), the adapter's own tags — a
|
|
9
|
+
// hosted consent manager's loader and the bridge that reports its answers —
|
|
10
|
+
// and the runtime that runs the held analytics (`consent/client.ts`), which
|
|
11
|
+
// starts the adapter's browser module, if it has one (`blume:consent-client`,
|
|
12
|
+
// see `consent/clients.ts`). Like analytics, a hosted manager loads in
|
|
13
|
+
// production builds only; a browser module (`native()`'s banner) works in
|
|
14
|
+
// `blume dev` too.
|
|
15
|
+
interface Props {
|
|
16
|
+
consent: NonNullable<BlumeDataConfig["consent"]>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const { consent } = Astro.props;
|
|
20
|
+
const tags = import.meta.env.PROD ? consentHead(consent) : [];
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
<script data-kind={consent.kind} is:inline set:html={CONSENT_INIT_SCRIPT} />
|
|
24
|
+
{
|
|
25
|
+
tags.map((tag) =>
|
|
26
|
+
tag.content === null ? (
|
|
27
|
+
<script is:inline {...tag.attributes} />
|
|
28
|
+
) : (
|
|
29
|
+
<script is:inline set:html={tag.content} {...tag.attributes} />
|
|
30
|
+
)
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
<script>
|
|
34
|
+
import { startConsentClient } from "blume:consent-client";
|
|
35
|
+
import { startConsent } from "../../consent/client.ts";
|
|
36
|
+
|
|
37
|
+
startConsent(startConsentClient);
|
|
38
|
+
</script>
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
import AccordionItem from "../content/AccordionItem.astro";
|
|
3
|
+
import Card from "../content/Card.astro";
|
|
4
|
+
import CardGroup from "../content/CardGroup.astro";
|
|
5
|
+
import Icon from "../Icon.astro";
|
|
6
|
+
import { directoryEntries } from "./nav-utils.ts";
|
|
7
|
+
import type { NavGroup } from "./nav-utils.ts";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A group page's directory: the group's other pages listed below the page's
|
|
11
|
+
* content, as cards or as an accordion whose subgroups open to their pages
|
|
12
|
+
* (the group's `directory`, see `core/schema.ts`).
|
|
13
|
+
*/
|
|
14
|
+
interface Props {
|
|
15
|
+
group: NavGroup;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const { group } = Astro.props;
|
|
19
|
+
const entries = directoryEntries(group);
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
{
|
|
23
|
+
entries.length > 0 && (
|
|
24
|
+
<nav
|
|
25
|
+
aria-label={group.label}
|
|
26
|
+
class="mx-auto mt-6 max-w-content"
|
|
27
|
+
data-blume-directory={group.directory}
|
|
28
|
+
>
|
|
29
|
+
{group.directory === "card" ? (
|
|
30
|
+
<CardGroup>
|
|
31
|
+
{entries.map((entry) => (
|
|
32
|
+
<Card href={entry.href} icon={entry.icon} title={entry.label}>
|
|
33
|
+
{entry.description}
|
|
34
|
+
</Card>
|
|
35
|
+
))}
|
|
36
|
+
</CardGroup>
|
|
37
|
+
) : (
|
|
38
|
+
<div class="not-prose my-6 divide-y divide-border overflow-hidden rounded-blume border border-border">
|
|
39
|
+
{entries.map((entry, index) =>
|
|
40
|
+
entry.pages ? (
|
|
41
|
+
<AccordionItem
|
|
42
|
+
description={entry.description}
|
|
43
|
+
icon={entry.icon}
|
|
44
|
+
id={`blume-directory-${index + 1}`}
|
|
45
|
+
title={entry.label}
|
|
46
|
+
>
|
|
47
|
+
<ul class="grid gap-2 text-sm">
|
|
48
|
+
{entry.pages.map((page) => (
|
|
49
|
+
<li>
|
|
50
|
+
<a
|
|
51
|
+
class="text-muted-foreground no-underline transition-colors hover:text-foreground"
|
|
52
|
+
href={page.route}
|
|
53
|
+
>
|
|
54
|
+
{page.label}
|
|
55
|
+
</a>
|
|
56
|
+
</li>
|
|
57
|
+
))}
|
|
58
|
+
</ul>
|
|
59
|
+
</AccordionItem>
|
|
60
|
+
) : (
|
|
61
|
+
<a
|
|
62
|
+
class="flex items-center justify-between gap-4 p-4 font-medium text-foreground no-underline transition-colors hover:bg-muted/40"
|
|
63
|
+
href={entry.href}
|
|
64
|
+
>
|
|
65
|
+
<span class="flex items-start gap-2">
|
|
66
|
+
{entry.icon && (
|
|
67
|
+
<Icon
|
|
68
|
+
class="mt-0.5 shrink-0 text-muted-foreground"
|
|
69
|
+
name={entry.icon}
|
|
70
|
+
size={16}
|
|
71
|
+
/>
|
|
72
|
+
)}
|
|
73
|
+
<span>
|
|
74
|
+
<span class="block">{entry.label}</span>
|
|
75
|
+
{entry.description && (
|
|
76
|
+
<span class="block font-normal text-muted-foreground text-sm">
|
|
77
|
+
{entry.description}
|
|
78
|
+
</span>
|
|
79
|
+
)}
|
|
80
|
+
</span>
|
|
81
|
+
</span>
|
|
82
|
+
<Icon
|
|
83
|
+
class="shrink-0 text-muted-foreground rtl:-scale-x-100"
|
|
84
|
+
name="arrow-right"
|
|
85
|
+
size={16}
|
|
86
|
+
/>
|
|
87
|
+
</a>
|
|
88
|
+
)
|
|
89
|
+
)}
|
|
90
|
+
</div>
|
|
91
|
+
)}
|
|
92
|
+
</nav>
|
|
93
|
+
)
|
|
94
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
// The header's selectors, version selector, and language switcher, as a row
|
|
3
|
+
// at the top of the nav drawer. Below `lg` the sidebar is this drawer, and the
|
|
4
|
+
// header has no room for them beside the logo, tabs, search, and icon
|
|
5
|
+
// buttons, so it hides them whenever there's a drawer to open and this row
|
|
6
|
+
// takes over; from `lg` up the row hides and the header shows them again.
|
|
7
|
+
import type { UIStrings } from "../../core/i18n-ui.ts";
|
|
8
|
+
import type {
|
|
9
|
+
LocaleSwitchOption,
|
|
10
|
+
NavSelector as NavSelectorConfig,
|
|
11
|
+
} from "../../core/types.ts";
|
|
12
|
+
import LanguageSwitcher from "./LanguageSwitcher.astro";
|
|
13
|
+
import NavSelector from "./NavSelector.astro";
|
|
14
|
+
|
|
15
|
+
interface Props {
|
|
16
|
+
selectors: NavSelectorConfig[];
|
|
17
|
+
versionSelector?: NavSelectorConfig | null;
|
|
18
|
+
localeSwitch?: LocaleSwitchOption[];
|
|
19
|
+
route: string;
|
|
20
|
+
switcherStrings?: UIStrings["languageSwitcher"];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const { selectors, versionSelector, localeSwitch, route, switcherStrings } =
|
|
24
|
+
Astro.props;
|
|
25
|
+
const hasLocales = (localeSwitch?.length ?? 0) > 1;
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
{
|
|
29
|
+
(selectors.length > 0 || versionSelector || hasLocales) && (
|
|
30
|
+
<div class="mb-4 flex flex-col gap-2 border-border border-b pb-4 lg:hidden">
|
|
31
|
+
{selectors.map((selector) => (
|
|
32
|
+
<NavSelector route={route} selector={selector} variant="drawer" />
|
|
33
|
+
))}
|
|
34
|
+
{versionSelector && (
|
|
35
|
+
<NavSelector
|
|
36
|
+
route={route}
|
|
37
|
+
selector={versionSelector}
|
|
38
|
+
variant="drawer"
|
|
39
|
+
/>
|
|
40
|
+
)}
|
|
41
|
+
{localeSwitch && hasLocales && (
|
|
42
|
+
<LanguageSwitcher
|
|
43
|
+
label={switcherStrings?.label ?? "Language"}
|
|
44
|
+
options={localeSwitch}
|
|
45
|
+
untranslatedLabel={switcherStrings?.untranslated ?? "Not translated"}
|
|
46
|
+
variant="drawer"
|
|
47
|
+
/>
|
|
48
|
+
)}
|
|
49
|
+
</div>
|
|
50
|
+
)
|
|
51
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
// A no-op layout slot: renders nothing regardless of props. Used as the built-in
|
|
3
|
-
// fallback for the content-injection slots (
|
|
4
|
-
//
|
|
3
|
+
// fallback for the content-injection slots (PageHeader, PageFooter) that have
|
|
4
|
+
// no default, so an unconfigured slot renders empty while `resolveSlot`
|
|
5
5
|
// still returns a valid component and the generated pages stay type-safe.
|
|
6
6
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import Ask from "blume:ask";
|
|
3
3
|
import data from "blume:data";
|
|
4
4
|
import { withBase, withMountedBase } from "../islands/base-path.ts";
|
|
5
|
-
import {
|
|
5
|
+
import { newTabAttrs } from "../../core/new-tab.ts";
|
|
6
6
|
import type { ComponentOverride } from "../../core/define-components.ts";
|
|
7
7
|
import { EN_UI } from "../../core/i18n-ui.ts";
|
|
8
8
|
import type { UIStrings } from "../../core/i18n-ui.ts";
|
|
@@ -11,7 +11,6 @@ import type {
|
|
|
11
11
|
Navigation,
|
|
12
12
|
NavSelector as NavSelectorConfig,
|
|
13
13
|
} from "../../core/types.ts";
|
|
14
|
-
import { GITHUB_MARK } from "../github-mark.ts";
|
|
15
14
|
import Icon from "../Icon.astro";
|
|
16
15
|
import LanguageSwitcher from "./LanguageSwitcher.astro";
|
|
17
16
|
import Logo from "./Logo.astro";
|
|
@@ -129,11 +128,19 @@ const activeTab = currentTabForRoute(navigation.tabs, route, navigation.root);
|
|
|
129
128
|
// mobile nav below `lg`, so the inline tabs wait until `lg` to avoid duplicating
|
|
130
129
|
// the drawer's links between `md` and `lg`.
|
|
131
130
|
const tabsNavClass = hasSidebar
|
|
132
|
-
? "hidden gap-1 md:flex"
|
|
133
|
-
: "hidden gap-1 lg:flex";
|
|
131
|
+
? "hidden shrink-0 gap-1 md:flex"
|
|
132
|
+
: "hidden shrink-0 gap-1 lg:flex";
|
|
134
133
|
|
|
135
134
|
const iconButton =
|
|
136
|
-
"inline-flex size-9 cursor-pointer items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground";
|
|
135
|
+
"inline-flex size-9 shrink-0 cursor-pointer items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground";
|
|
136
|
+
|
|
137
|
+
// Below `lg`, where the sidebar is a drawer, the selectors, version selector,
|
|
138
|
+
// and language switcher move into a row at the top of it (see
|
|
139
|
+
// DrawerSwitchers.astro): they scope what the sidebar lists, and beside the
|
|
140
|
+
// logo, tabs, search, and icon buttons they'd overflow a phone or tablet
|
|
141
|
+
// header. With no drawer to open they have nowhere else to go, so they stay.
|
|
142
|
+
// Nothing in the header shrinks except the logo, whose title truncates.
|
|
143
|
+
const switcherClass = showNavToggle ? "hidden shrink-0 lg:block" : "shrink-0";
|
|
137
144
|
|
|
138
145
|
// Header links: plain actions are secondary and hide below `sm`, where the
|
|
139
146
|
// header has room for the logo and the drawer toggle and nothing else. The one
|
|
@@ -186,37 +193,44 @@ const clickScript = `(()=>{const dr=()=>{const h=document.querySelector("[data-b
|
|
|
186
193
|
---
|
|
187
194
|
|
|
188
195
|
<header
|
|
189
|
-
class="sticky top-0 z-40 flex h-16 items-center gap-
|
|
196
|
+
class="sticky top-0 z-40 flex h-16 items-center gap-2 bg-background/90 px-4 backdrop-blur sm:gap-3 md:px-6 lg:grid lg:grid-cols-[minmax(0,1fr)_auto_minmax(max-content,1fr)]"
|
|
190
197
|
data-blume-header
|
|
191
198
|
data-blume-header-transparent={transparent ? "" : undefined}
|
|
192
199
|
>
|
|
193
|
-
{
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
200
|
+
{/* From `lg` the header is three columns, so the tabs sit at its center:
|
|
201
|
+
the logo side and the controls side share the rest equally. The logo
|
|
202
|
+
side may shrink to nothing (its title truncates, as on phones); the
|
|
203
|
+
controls never shrink, so when they need more than half, the tabs move
|
|
204
|
+
over rather than overlap. Below `lg` it's one row, tabs after the logo. */}
|
|
205
|
+
<div class="flex min-w-0 items-center gap-2 sm:gap-3 lg:col-start-1">
|
|
206
|
+
{
|
|
207
|
+
showNavToggle && (
|
|
208
|
+
<button
|
|
209
|
+
aria-controls="blume-nav-drawer"
|
|
210
|
+
aria-expanded="false"
|
|
211
|
+
aria-label={n.toggleNavigation}
|
|
212
|
+
class={`${iconButton} lg:hidden`}
|
|
213
|
+
data-blume-nav-toggle
|
|
214
|
+
type="button"
|
|
215
|
+
>
|
|
216
|
+
<Icon name="menu" size={20} />
|
|
217
|
+
</button>
|
|
218
|
+
)
|
|
219
|
+
}
|
|
220
|
+
<LogoSlot locale={locale} logo={logo} site={site} />
|
|
221
|
+
{
|
|
222
|
+
navigation.selectors.length > 0 && (
|
|
223
|
+
<div class:list={["flex items-center gap-1.5", switcherClass]}>
|
|
224
|
+
{navigation.selectors.map((selector) => (
|
|
225
|
+
<NavSelector route={route} selector={selector} />
|
|
226
|
+
))}
|
|
227
|
+
</div>
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
</div>
|
|
217
231
|
{
|
|
218
232
|
navigation.tabs.length > 0 && (
|
|
219
|
-
<nav aria-label={n.sections} class={tabsNavClass}>
|
|
233
|
+
<nav aria-label={n.sections} class:list={[tabsNavClass, "lg:col-start-2"]}>
|
|
220
234
|
{navigation.tabs.map((tab) =>
|
|
221
235
|
tab.items && tab.items.length > 0 ? (
|
|
222
236
|
<NavTabMenu
|
|
@@ -241,38 +255,31 @@ const clickScript = `(()=>{const dr=()=>{const h=document.querySelector("[data-b
|
|
|
241
255
|
</nav>
|
|
242
256
|
)
|
|
243
257
|
}
|
|
244
|
-
<div class="flex-1"></div>
|
|
245
|
-
{
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
popularPages={data.config.search.popular}
|
|
270
|
-
strings={searchStrings}
|
|
271
|
-
version={searchVersion}
|
|
272
|
-
/>
|
|
273
|
-
)
|
|
274
|
-
}
|
|
275
|
-
<div class="flex items-center gap-2">
|
|
258
|
+
<div class="flex-1 lg:hidden"></div>
|
|
259
|
+
{/* Everything on the right sits in one group with a tight gap: the version
|
|
260
|
+
and language pickers, the header links, and the icon buttons. Below `lg`
|
|
261
|
+
the spacer absorbs its width, so pages without a version selector (blog,
|
|
262
|
+
generated references) keep the logo and tabs in place — no layout shift
|
|
263
|
+
when crossing into the docs. */}
|
|
264
|
+
<div class="flex shrink-0 items-center gap-1 lg:col-start-3 lg:justify-self-end">
|
|
265
|
+
{
|
|
266
|
+
versionSelector && (
|
|
267
|
+
<div class={switcherClass}>
|
|
268
|
+
<NavSelector align="end" route={route} selector={versionSelector} />
|
|
269
|
+
</div>
|
|
270
|
+
)
|
|
271
|
+
}
|
|
272
|
+
{
|
|
273
|
+
localeSwitch && localeSwitch.length > 1 && (
|
|
274
|
+
<div class={switcherClass}>
|
|
275
|
+
<LanguageSwitcher
|
|
276
|
+
label={switcherStrings?.label ?? "Language"}
|
|
277
|
+
options={localeSwitch}
|
|
278
|
+
untranslatedLabel={switcherStrings?.untranslated ?? "Not translated"}
|
|
279
|
+
/>
|
|
280
|
+
</div>
|
|
281
|
+
)
|
|
282
|
+
}
|
|
276
283
|
{
|
|
277
284
|
/* Plain links first, then the one filled button: the reader's eye lands
|
|
278
285
|
on the button because nothing beside it competes. */
|
|
@@ -299,29 +306,24 @@ const clickScript = `(()=>{const dr=()=>{const h=document.querySelector("[data-b
|
|
|
299
306
|
)
|
|
300
307
|
}
|
|
301
308
|
{
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
{
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
set:html={GITHUB_MARK}
|
|
314
|
-
viewBox="0 0 16 16"
|
|
315
|
-
width="18"
|
|
316
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
317
|
-
/>
|
|
318
|
-
</a>
|
|
309
|
+
/* The icon buttons, each named by a tooltip. The site's repository and
|
|
310
|
+
social profiles live in the footer. */
|
|
311
|
+
searchEnabled && (
|
|
312
|
+
<SearchSlot
|
|
313
|
+
assistantEnabled={assistantEnabled}
|
|
314
|
+
locale={searchLocale}
|
|
315
|
+
navigation={navigation}
|
|
316
|
+
popularPages={data.config.search.popular}
|
|
317
|
+
strings={searchStrings}
|
|
318
|
+
version={searchVersion}
|
|
319
|
+
/>
|
|
319
320
|
)
|
|
320
321
|
}
|
|
321
322
|
<button
|
|
322
323
|
aria-label={n.toggleTheme}
|
|
323
324
|
class={iconButton}
|
|
324
325
|
data-blume-theme-toggle
|
|
326
|
+
data-blume-tooltip={n.toggleTheme}
|
|
325
327
|
type="button"
|
|
326
328
|
>
|
|
327
329
|
<span class="inline-flex dark:hidden"><Icon name="sun" size={18} /></span>
|
|
@@ -334,6 +336,46 @@ const clickScript = `(()=>{const dr=()=>{const h=document.querySelector("[data-b
|
|
|
334
336
|
{transparent && <script is:inline set:html={transparentScript} />}
|
|
335
337
|
|
|
336
338
|
<style is:global>
|
|
339
|
+
/* The header's icon buttons are named by a tooltip below them, shown on hover
|
|
340
|
+
(where there is one) and on keyboard focus. It hangs from the button's end
|
|
341
|
+
edge, so the last button's tooltip never runs past the viewport, and it
|
|
342
|
+
keeps the page's own colors under a transparent header. */
|
|
343
|
+
[data-blume-tooltip] {
|
|
344
|
+
position: relative;
|
|
345
|
+
}
|
|
346
|
+
[data-blume-tooltip]::after {
|
|
347
|
+
content: attr(data-blume-tooltip);
|
|
348
|
+
position: absolute;
|
|
349
|
+
top: calc(100% + 0.375rem);
|
|
350
|
+
inset-inline-end: 0;
|
|
351
|
+
z-index: 50;
|
|
352
|
+
padding: 0.25rem 0.5rem;
|
|
353
|
+
border-radius: 0.375rem;
|
|
354
|
+
background-color: var(--blume-header-foreground);
|
|
355
|
+
color: var(--blume-header-background);
|
|
356
|
+
font-size: 0.75rem;
|
|
357
|
+
font-weight: 500;
|
|
358
|
+
line-height: 1rem;
|
|
359
|
+
white-space: nowrap;
|
|
360
|
+
pointer-events: none;
|
|
361
|
+
opacity: 0;
|
|
362
|
+
visibility: hidden;
|
|
363
|
+
transition:
|
|
364
|
+
opacity 120ms ease,
|
|
365
|
+
visibility 0s linear 120ms;
|
|
366
|
+
}
|
|
367
|
+
[data-blume-tooltip]:focus-visible::after {
|
|
368
|
+
opacity: 1;
|
|
369
|
+
visibility: visible;
|
|
370
|
+
transition: opacity 120ms ease;
|
|
371
|
+
}
|
|
372
|
+
@media (hover: hover) {
|
|
373
|
+
[data-blume-tooltip]:hover::after {
|
|
374
|
+
opacity: 1;
|
|
375
|
+
visibility: visible;
|
|
376
|
+
transition: opacity 120ms ease 400ms;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
337
379
|
/* Transparent header (PageLayout `transparentHeader`): at the top of the
|
|
338
380
|
page the bar has no background and its chrome renders in white so it can
|
|
339
381
|
sit over a dark hero; once scrolled it is the frosted bar again. The color
|