Changelog
1.6.3 Latest
Fixed
-
A CDN blip fetching an OG font no longer fails the whole build. The fonts for OG images are fetched from the Northwestern CDN at build time, because their licenses do not allow shipping them inside the package. Each font was fetched once, with no timeout, and any failure threw: one refused connection took down a docs build, and with it the deploy behind it.
Font requests now time out after 10 seconds and retry twice with exponential backoff. Network errors, timeouts, and 5xx responses are retried; a 4xx is a wrong URL rather than a blip, so it is reported immediately. A font that still will not load is logged as a warning and the image renders in whichever font did load, since an OG image in the wrong typeface beats a failed build. Only an empty font list still throws, because satori has nothing to draw text with. Results are cached per URL, failures included, so an outage costs one retry sequence for the build instead of one per page.
1.6.2
Fixed
- OG image text no longer unescapes twice. Entities were decoded in sequence with
&first, so a title containing the escaped text&lt;came out as<. Decoding is now a single pass, and escaped text stays escaped. - The meta-refresh patterns used to rewrite legacy
.htmlredirect pages are bounded. The previous patterns scanned the rest of the page from every start position, so time grew with the square of the page size: a 200 KB page of near-matches took over half a second. A tag longer than the bound is left alone, which skips hash forwarding for that page but keeps the redirect.
1.6.1
Fixed
-
Starlight plugins that extend the Markdown processor no longer stop working. Astro 7 renders Markdown with the Sätteri processor and hands every integration the same live processor object. Plugins extend the pipeline by changing that object. The theme replaced it with a
unified()processor from twoastro:config:setuphooks, which run after Starlight has already set up its plugins, so everything those plugins had registered was thrown away.The visible effect was
starlight-links-validator0.25 or newer: it validated zero links on every build and still printed “All internal links are valid”, so broken internal links passed unnoticed. Any plugin that configures itself against the Sätteri processor was affected the same way.defineNorthwesternConfig()now setsmarkdown.processortounified()whileastro.config.*is evaluated, beforestarlight()is created. No plugin ever sees Sätteri, and the theme only extends the processor it is given instead of replacing it. A processor you configure yourself is left alone. -
Mermaid no longer swaps the Markdown processor either.
astro-mermaid2.1 supports Sätteri on its own.
1.6.0
Added
- Fullscreen Mermaid diagrams can be downloaded as high-resolution PNG files. PNG exports render at up to 4× the diagram’s intrinsic size, use the active Mermaid theme’s configured canvas color for reliable contrast, and share the same descriptive filenames as SVG downloads.
1.5.1
Added
- Legacy
.htmlredirects. Sites migrated from VuePress had every page served at<slug>.html; external bookmarks and inbound links still point there. A newlegacyHtmlRedirectsoption ondefineNorthwesternConfig(defaulttrue) scanssrc/content/docsand emits a redirect from<slug>.htmlto the canonical<slug>/URL for every page, with the URL hash preserved on forward so deep links like#schedule-managementstill land on the right anchor.
1.5.0
Added
defineNorthwesternConfigconfig helper. Single function that returns a complete Astro config with integration ordering (mermaid → starlight), plugin registration, and Expressive Code. Replaces the manualdefineConfig+starlight()+northwesternMermaid()wiring. New./configpackage export.- Automatic Expressive Code line numbers.
defineNorthwesternConfiginjectspluginLineNumbers()and GitHub syntax themes (github-dark/github-light). Noec.config.mjsfile needed. A Vite plugin separates serializable config from plugin instances so the<Code>Astro component continues to work. - Type declarations (
.d.ts) shipped for all public exports. - OG images for changelog version pages with multi-line titles (e.g., “Changelog / 1.4.0”).
- JSON-LD structured data on each page.
- Unit test suite (Vitest) covering
config.ts,expressive-code.ts,mermaid.ts, andrehype-table-scroll.ts. E2E tests moved totests/e2e/. CI runs unit tests in a dedicated job.
Fixed
- Replaced
astro-og-canvas+canvaskit-wasmwithsatori+@resvg/resvg-wasm. pnpm users no longer needcanvaskit-wasmas a direct dependency. - OG image generation logs a warning and disables when Starlight
titleis empty orsiteis not set, instead of crashing or producing broken URLs. - OG font buffer uses correct
Uint8Arrayoffset slicing instead of casting the full backingArrayBuffer. - Larger OG text: title 48→56px, description 28→32px, logo 60→80px. Separate vertical (60px) and horizontal (220px) padding to avoid clipping.
- Runtime config validation now catches invalid theme, Mermaid, and config-helper options with friendly errors at the public API boundary instead of failing later with cryptic behavior.
- Rehype table scroll skips tables already inside
.nu-table-scroll, preventing double-wrapping on incremental rebuilds. - Aside borders use solid brand colors (
#5091cd,#008656,#ffc520,#ef553f) and a 3px left accent stripe instead of a translucent 1px box border. Dark mode borders match the text accent for each variant.
Changed
h1keepsNoto Serif;h2–h6switched toPoppins.- Package
exportsmap includestypesfields pointing todist/*.d.tsfor all entry points.
1.4.0
Added
- Open Graph image generation: builds a branded 1200x630 PNG per docs page. Favicon logo, page title, and description on Northwestern purple with a light purple accent border. Slack, Teams, and social media link previews use these images.
- Enabled by default. Set
sitein your Astro config. pnpm users: runpnpm add canvaskit-wasmto enable (build skips OG gracefully without it). - Disable with
ogImage: false. - Adds
og:image,og:image:type,og:image:width,og:image:height,og:image:alt,og:logo,twitter:image, andtwitter:image:altmeta tags to every page. Overridestwitter:cardtosummary_large_image. - New dependency:
astro-og-canvas.
- Enabled by default. Set
1.3.2
Fixed
- H1/H2 now use Noto Serif (
--nu-font-display), H3–H6 use Poppins (--nu-font-heading). Sizes, weights, and colors match the Department 4.0 stylesheet. - Poppins 400 loaded the Light file instead of Regular. Poppins 500 (Medium) added from v4 CDN.
- Table headers now use
--nu-purple-100with white text. - Table striping moved to odd rows (
#f9f6ff); dark mode usesrgb(78 42 132 / 10%). --nu-purple-surfacecorrected to#f9f6ff,--nu-purple-surface-subtleto#f3f0f7.- Blockquote background uses
#f9f6ffinstead of translucent purple. - Horizontal rules use 3px
--nu-purple-10instead of 1px gray. - List markers use
--nu-purple-100instead of--nu-purple-40.
1.3.1
Fixed
- Tooltips on mobile rendered outside the viewport near screen edges. Horizontal position now clamps with 8px padding; arrow shifts to track the trigger.
- Tooltips stayed visible while scrolling on touch devices. Dismisses when the trigger moves 50px from its open position or leaves the viewport.
- Tapping a tooltip after scroll-dismiss had no effect. Trigger now blurs on scroll-dismiss so the next tap re-focuses.
- Tooltips near the top of the page overlapped Starlight’s fixed header and “On this page” dropdown. Flips to bottom when space above is insufficient (100px header safe zone).
1.3.0
Added
- Property Table component suite:
<PropertyTable>,<Property>,<PropertyGroup>,<Expandable>.- See the documentation for more information.
- Tooltip component suite:
<Tooltip>,<Glossary>,<Term>.- See the documentation for more information.
- Keyboard component:
<Kbd>.- See the documentation for more information.
- Fullscreen Mermaid overlay: scale animation, dot grid background, pan momentum on drag release, toast notifications on copy.
@media (prefers-contrast: more): heavier borders, system colors for focus rings.@media (prefers-reduced-transparency: reduce): solid surfaces replace translucent backgrounds.CONTRIBUTING.mdwith development setup, conventions, and PR process.- JSDoc comments on public TypeScript interfaces.
Fixed
- Code block line numbers in dark mode had 2.85:1 contrast. Bumped from
#6e6e6eto#999(4.6:1). - Code block copy button icon in dark mode used
--nu-purple-100on hover. Switched to--nu-purple-40. - Wide tables overflowed into the sidebar. A rehype plugin now wraps each
<table>in a scrollable<div>at build time. - Reopening the fullscreen viewer after Escape showed a blue focus ring around the entire viewport.
- Mermaid hover toolbar sat unevenly relative to the diagram container border.
- Fullscreen close button used
rgb(255 255 255 / 20%)while the theme toggle used15%. Both use15%now. - Mobile sidebar: theme toggle and GitHub icon were white-on-white in light mode.
- Mobile sidebar: theme toggle was taller than wide; GitHub icon sat below it.
- Copy buttons did nothing on HTTP (insecure contexts). Added
document.execCommand("copy")fallback. - Clicking copy twice during the success animation duplicated the check icon. Debounced per button.
- iOS Safari toggled the URL bar when copying in the fullscreen viewer. The fallback textarea now appends inside the overlay.
- Mouse-opening the fullscreen viewer put a focus ring on the first control. Keyboard opens focus the first button; mouse opens focus the overlay container (no visible ring, Tab still works).
- Zoom in/out/reset buttons hidden on mobile (pinch-to-zoom covers it).
- Mermaid user overrides dropped on client-side theme toggle. Runtime configs now include merged user config.
- Mermaid lazy-rendered diagrams used stale theme after toggle. Observer callback now reads live theme mode.
- Mermaid pinch-to-zoom anchored to viewport center instead of pinch midpoint.
- Mermaid
MutationObserversaccumulated on view transitions. Previous observer now disconnected before creating a new one. - Mermaid render race on rapid theme toggles. Per-container version tracking discards stale async completions.
- Mermaid fullscreen close could fire twice during animation. Added guard against double-close.
- Mermaid
diagramSourcesMapleaked detached DOM nodes across view transitions. Switched toWeakMap. - Tooltip event listeners duplicated on Astro view transitions. Added
WeakSetidempotency guard. - Tooltip Popover API called without feature detection. Added fallback for unsupported browsers.
- Tooltip positioning drifted on scroll. Now repositions via scroll listener while visible.
- Sidebar active item border shifted text. All sidebar links now reserve space with a transparent left border.
- Search modal focus ring used browser default blue. Now uses
--nu-focus-ring. - Site title clipped on mobile. Added fluid font sizing with
clamp()and ellipsis overflow.
Changed
- Fullscreen controls bar uses Starlight’s
--sl-nav-pad-xand--sl-menu-button-sizeso the close button aligns with the hamburger menu on mobile. - Removed right padding on active sidebar headings that broke nested heading alignment.