-
#76
acfac20Thanks @mvvmm! - Replaceastro-iconwith a built-in icon system. This is a breaking change for any project usingastro-icondirectly.Why:
astro-iconstamped a generatedlastModifiedtimestamp into its virtual module on every build, invalidating thousands of cached pages in Astro's incremental build cache. The package is unmaintained so an upstream fix isn't coming.What's new: Nimbus now provides
virtual:nimbus/icons(a Vite plugin) and@cloudflare/nimbus-docs/components/Icon.astro. The plugin auto-detects installed@iconify-json/*packages and loads local SVGs fromsrc/icons/. The component API is compatible withastro-icon(name,size,width,height,is:inline,title,desc, and all<svg>attributes). SVG bodies are passed throughreplaceIDsso internal IDs (clipPath, mask, gradient defs) are unique per render — preventing collisions when the same icon appears more than once on a page.Breaking changes:
- Remove
astro-iconfrom yourpackage.jsonandastro.config.ts - Replace
import { Icon } from "astro-icon/components"withimport Icon from "@cloudflare/nimbus-docs/components/Icon.astro" - SVG output structure changed: SVGs are always inlined; the previous
<symbol>/<use>pattern produced duplicate DOM IDs when the same icon was used more than once on a page, so it has been removed. Any CSS or JS targetingsymboloruseelements will need updating.
Migration:
- import { Icon } from "astro-icon/components"; + import Icon from "@cloudflare/nimbus-docs/components/Icon.astro";
Starter templates updated: removed
astro-icondependency andicon()integration fromastro.config.ts; all component imports updated to the new path. - Remove
-
#70
b9620bcThanks @MohamedH1998! - Fix search dialog results not scrolling. The results wrapper now lays out as a flex column, so the results list gets a bounded height and itsoverflow-y-autoengages — long result sets scroll within the dialog instead of being clipped, while the search input stays in view above the scroll region. -
#71
4d6815fThanks @MohamedH1998! - Make pkg.pr.new preview builds scaffold from bundled PR templates and pin generated projects to the matching@cloudflare/nimbus-docspreview.Generated starters are now pinned to the verified Astro 7.0.x line while the upstream Astro 7.1.x static build regression is open.
-
#64
d551fa2Thanks @MohamedH1998! - Stop shipping the.nimbus/build directory into scaffolded projects.nimbus/holds build artifacts materialized byastro build(routes.json,lint.json). It had leaked into the starter source and was being copied into new projects, so a freshly scaffolded app carried stale route and lint truth from the template rather than its own..nimbusis now excluded by both the template-copy script and the runtime scaffolder, and removed from the starter source; a new project starts with no build artifacts and generates its own on first build. -
#64
e1e4e8dThanks @MohamedH1998! - Point the scaffolded AGENT.md atnimbus-docs checkThe generated
AGENT.mdnow documents the one-command model: a "Check it builds" row in the actions table (env + structure + authoring + types), and an "Audit this site" section that leads withnimbus-docs check --jsonbefore the manual walk of whatcheckdoesn't cover yet (route-file existence, registry hygiene, AI surface, post-build search, Cloudflare config).It teaches an agent the honest result contract: the primary signals are
status(passed|failed|partial) andreadiness(buildable|blocked|unknown), withokkept only for back-compat; a check that couldn't be evaluated yet (e.g. types before a build) is anoteunderscopes[].notes[]— never a finding, never afix— so the fix loop terminates onstatus !== "failed" && summary.fixable === 0rather than spinning on a coverage gap it cannot repair.
-
#55
a986d61Thanks @MohamedH1998! - The scaffolded starter's header now matches the Nimbus site. The mobile menu (hamburger) button moved from the left of the header to the right, alongside the theme toggle. The search trigger stays reachable on mobile: it previously usedhidden sm:flexand disappeared entirely below thesmbreakpoint, leaving phones with no way to search — it now renders as a compact magnifying-glass icon button on small screens and expands to the full "Search ⌘K" control fromsmup (the ⌘K hint is hidden on mobile). -
#55
6881e4eThanks @MohamedH1998! - Markdown tables in the scaffolded starter now round their outer corner cells to match the table's0.75remborder-radius. Because the table usesborder-collapse: separate, the corner cell backgrounds — most visibly the muted<thead>fill — previously kept square corners that poked past the rounded table border. The first/last<th>in the header and the first/last<td>in the last body row now carry the matchingborder-top-left/border-top-right/border-bottom-left/border-bottom-rightradius, so the fill clips cleanly to the border. Scoped to:not([class])authored markdown tables, so component-owned tables are untouched.
-
#42
8e4e210Thanks @MohamedH1998! - Scaffolded projects now include a committednimbus.json— a CLI-managed record of thecreate-nimbus-docsversion, thetemplates-v*tag, the install root, and (as younimbus-docs add) each installed component's provenance. Starter components also get an API-consistency pass:type→varianton Banner/Callout,VersionPicker→VersionSwitcher, hydration moved out of inline scripts into.client.tsfiles via themount()primitive, and a singlegetRouteFlagslayout-flag helper. The scaffoldedAGENT.mdnow documents theoutdated/diff/add --overwriteupgrade flow. -
#34
b8a1235Thanks @mvvmm! - Bump for the@cloudflare/nimbus-docsminor in this release (full glob support forignoreininternal-link/image-ref) — no starter-source changes.
-
#32
a6491c8Thanks @MohamedH1998! - Fix a batch of UI stress-sweep defects in the starter components:- TOC scroll-spy no longer desyncs when a heading slugs to an empty id (e.g. an emoji-only
## 🎉). The active-heading index now stays aligned with the full link/rail set instead of a resolvable-only subset, so every section below an unresolvable heading highlights correctly. - Mobile sidebar hamburger survives client-side navigation — the toggle re-binds on
astro:page-loadand tears down onastro:before-swap(viamount()), fixing a dead button after the first view transition, with the scroll lock balanced on a mid-open swap. - Dialog content taller than the cap now scrolls inside the panel (
overflow-y-auto) so the close button stays reachable. - Banner long unbroken strings (including the framework deprecation banner's version URL) wrap instead of overflowing.
- PackageManagers blocks with identical props on one page now get unique, incremental-build-stable DOM ids (per-page counter), fixing duplicate
id/aria-controls. - Dev-only warnings:
<Steps>around a bullet list, and duplicate labels within a<Tabs syncKey>group.
- TOC scroll-spy no longer desyncs when a heading slugs to an empty id (e.g. an emoji-only
-
#27
1ebfb6cThanks @MohamedH1998! - Align the sidebar + add a mobile "On this page" TOC matching cloudflare-docs, and tighten the docs layout's mobile and horizontal-overflow handling.- Sidebar + TOC: the sidebar filter gains a
press / to focuskbd hint and aplaceholderprop; sidebar groups render an optional leading icon (fromsidebar.group.icon); and a sticky native-<select>"On this page" TOC now appears under the page title on viewports belowxl, where the desktop TOC rail hides. - Mobile sidebar drawer: the drawer no longer dims or blurs the page — it slides in over a transparent overlay so the page copy stays readable, with a hairline edge instead of a shadow. Both the drawer panel and the desktop sidebar now paint their own background and contain overscroll, fixing a "no background" flash on fast/momentum scroll.
- Tabs: a tab strip wider than its column now scrolls horizontally (scrollbar hidden) instead of leaking past the page width, and the active tab is scrolled into view on activate/restore.
- Prose: long unbroken tokens (URLs, hashes) wrap within the content column via
overflow-wrap: break-wordinstead of overflowing the page; code blocks and wide tables keep their own scroll handling.
- Sidebar + TOC: the sidebar filter gains a
-
#24
52d5a0cThanks @MohamedH1998! - Fix scaffolded starter behavior across client-side navigations and add a 404 page.- Re-run component initializers on
astro:page-loadso interactive components (code groups, dialogs, popovers, file trees, search) keep working after ClientRouter/view-transition navigations. - Scope the search dialog's global key handler to a module variable instead of an
<html>attribute, preventing a duplicateCmd+Khandler from stacking on each navigation. - Mark inline SVG icons with
is:inlineso they render reliably. - Ship a default
404.astropage in the starter.
- Re-run component initializers on
- #22
7ec9715Thanks @MohamedH1998! - Republish with npm provenance attestations. Supersedes 0.6.0 / 0.5.0, which published without provenance and before the repo was public.
-
#20
fde68ebThanks @MohamedH1998! - Rename to the@cloudflarenpm scopenimbus-docs→@cloudflare/nimbus-docsandcreate-nimbus-docs→@cloudflare/create-nimbus-docs. The unscoped packages are deprecated and receive no further releases.Migration:
- Framework:
pnpm remove nimbus-docs && pnpm add @cloudflare/nimbus-docs, then update imports —from "nimbus-docs"→from "@cloudflare/nimbus-docs"(every subpath follows:/content,/schemas,/types,/client,/markdown,/react,/lib/pkgm,/components/NimbusHead.astro). Thenimbus-docsCLI bin name is unchanged. - Scaffolder:
pnpm create nimbus-docs→pnpm create @cloudflare/nimbus-docs.
No API, config, schema, or runtime behavior change — only the package names and import paths.
- Framework:
-
#16
479349bThanks @MohamedH1998! - Templates now pin nimbus-docs 0.5.0Scaffolds pin
nimbus-docsat the minor they were generated against, so this CLI re-releases to ship templates on 0.5.0 — which drops the built-in incremental-build cache (theincrementalBuildsoption, thepartialResolverhook, andnimbus-docs clean). New scaffolds use a plainastro build; Astro 7's native incremental building applies without any Nimbus opt-in.
-
#13
456ca74Thanks @MohamedH1998! - Move to Astro 7nimbus-docsnow peers onastro ^7.0.0(was>=6.4.0 <7.0.0) and builds against the Astro 7 ecosystem:@astrojs/mdx ^7,@astrojs/markdown-satteri ^0.3.4(Sätteri^0.9), Vite 8. The markdown pipeline — Sätteri plus thehastPlugins/mdastPluginsseam and Shiki dual-theme output — is unchanged; the Sätteri0.6→0.9jump left the plugin-definition types intact, so no seam code moved.Astro 7 makes Sätteri the default processor, which unblocks opt-in server output alongside it (the gate for hosted MCP, Ask AI, and content negotiation).
Starter templates: Tailwind v4 now wires through
@tailwindcss/viteinstead of the PostCSS plugin, which does not build under Astro 7's Vite 8 bundler. Scaffolded projects gain@tailwindcss/viteand drop@tailwindcss/postcss+postcss.config.mjs.Breaking (peer): sites must be on Astro 7. The
unified()escape hatch for remark/rehype plugins still works, but@astrojs/markdown-remarkmust now be installed explicitly (pnpm add @astrojs/markdown-remark) — pnpm does not expose it for import even though@astrojs/mdxpulls it transitively.
-
#9
d83ef06Thanks @MohamedH1998! - Ship the static agent-surface layer: full corpus, raw-source twins, version labels/llms-full.txt— the whole published site as one deterministic markdown document, via the newrenderCorpusMarkdown()helper behind a ten-line starter route. Scope matches the rootllms.txt(primary + secondary collections, non-current doc versions excluded); collation is sorted and timestamp-free, so output is byte-identical across rebuilds./llms.txtlinks to it.- Raw-source twin at
<page>/index.mdx— the authored MDX body served verbatim with the same canonical frontmatter block as the.mdtwin. Twin grammar:index.mdis the downleveled render for reading,index.mdxis the source. The.mdtwin'sSource:line now points at the.mdxtwin instead of itself. IndexedEntrygainssourceUrl(site-relative URL of the raw-source twin;undefinedfor entries without a string body) andversion(the entry's version label resolved from theversionsmanifest;undefinedon unversioned sites and non-docs collections). On versioned sites every twin's frontmatter carries aversion:label so agents can pin a version; unversioned sites are byte-for-byte unchanged.astropeer range is now>=6.4.0 <7.0.0, declaring the Astro 6 requirement that@astrojs/mdx@6always implied. Astro 7 support lands as its own release.
-
#4
1ae3a78Thanks @MohamedH1998! - Fix three defects found by post-0.2.0- Wide tables no longer overflow the page. A table with more columns than
the content column could fit slid under the TOC rail and forced page-level
horizontal scroll on desktop (the old scroll fallback only applied under
640px). A
<table>can't both fill its column and scroll —overflowis ignored ondisplay: table— so scroll now lives on a wrapper:nimbus-docs/markdownexports atableScroll()hast plugin that wraps class-less tables in a.nb-table-scrollcontainer, and the starter wires it up with matching styles. Short tables still fill the column with no dead space. <Badge>label</Badge>renders its children. Thetextprop is now optional and falls back to<slot />; previously a slotted label was silently dropped and the badge rendered empty.nimbus-docs addno longer crashes in non-TTY environments. A file conflict without--yesin CI, a pipe, or an agent crashed with a rawuv_tty_init returned EINVALtrace when the overwrite prompt tried to open a TTY that wasn't there. It now detects non-interactive stdin and exits with an actionable message pointing at--yes.
- Wide tables no longer overflow the page. A table with more columns than
the content column could fit slid under the TOC rail and forced page-level
horizontal scroll on desktop (the old scroll fallback only applied under
640px). A
-
bd5411fThanks @MohamedH1998! - Fetch templates at scaffold time from a tag-pinned source (giget)The CLI no longer bundles templates in its npm tarball. Templates are downloaded when you scaffold, pinned to the release tag matching the CLI's own version (
create-nimbus-docs@0.2.0fetchestemplates-v0.2.0) — reproducible forever, and old CLI versions are unaffected by new releases. Adds--template-dir <path>for fully offline scaffolding, and actionable errors for offline / missing-tag / rate-limited (403) fetches that name the tag tried,GIGET_AUTH, and--template-dir. -
24113e0Thanks @MohamedH1998! - Clear the Node and pnpm version gates that broke a fresh scaffold- Node floor raised to
>=22.12.0. Astro requires Node ≥ 22.12; the old>=20.0.0promise was a floor a scaffolded site could not actually build on (Node 20 is EOL and failsastro buildwithNode.js v20.x is not supported by Astro!). CI now runs Node 24 everywhere. pnpm installno longer hard-fails under modern pnpm. pnpm ≥ 10 gates dependency install scripts and pnpm ≥ 11 turns an ignored build into a hard error (ERR_PNPM_IGNORED_BUILDS, exit 1). Scaffolded projects now ship apnpm-workspace.yamlthat declines exactly the packages with install scripts —esbuildandsharp(plusworkerdon the Cloudflare target, which pullswrangler) — never a blanket approval. All three ship working prebuilds, so the site still builds while the supply-chain surface stays minimal. Verified green on pnpm 9, 10, 11, and npm.
- Node floor raised to