Skip to content

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 &amp; first, so a title containing the escaped text &amp;lt; came out as <. Decoding is now a single pass, and escaped text stays escaped.
  • The meta-refresh patterns used to rewrite legacy .html redirect 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 two astro:config:setup hooks, 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-validator 0.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 sets markdown.processor to unified() while astro.config.* is evaluated, before starlight() 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-mermaid 2.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 .html redirects. Sites migrated from VuePress had every page served at <slug>.html; external bookmarks and inbound links still point there. A new legacyHtmlRedirects option on defineNorthwesternConfig (default true) scans src/content/docs and emits a redirect from <slug>.html to the canonical <slug>/ URL for every page, with the URL hash preserved on forward so deep links like #schedule-management still land on the right anchor.

1.5.0

Added

  • defineNorthwesternConfig config helper. Single function that returns a complete Astro config with integration ordering (mermaid → starlight), plugin registration, and Expressive Code. Replaces the manual defineConfig + starlight() + northwesternMermaid() wiring. New ./config package export.
  • Automatic Expressive Code line numbers. defineNorthwesternConfig injects pluginLineNumbers() and GitHub syntax themes (github-dark / github-light). No ec.config.mjs file 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, and rehype-table-scroll.ts. E2E tests moved to tests/e2e/. CI runs unit tests in a dedicated job.

Fixed

  • Replaced astro-og-canvas + canvaskit-wasm with satori + @resvg/resvg-wasm. pnpm users no longer need canvaskit-wasm as a direct dependency.
  • OG image generation logs a warning and disables when Starlight title is empty or site is not set, instead of crashing or producing broken URLs.
  • OG font buffer uses correct Uint8Array offset slicing instead of casting the full backing ArrayBuffer.
  • 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

  • h1 keeps Noto Serif; h2–h6 switched to Poppins.
  • Package exports map includes types fields pointing to dist/*.d.ts for 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 site in your Astro config. pnpm users: run pnpm add canvaskit-wasm to 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, and twitter:image:alt meta tags to every page. Overrides twitter:card to summary_large_image.
    • New dependency: astro-og-canvas.

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-100 with white text.
  • Table striping moved to odd rows (#f9f6ff); dark mode uses rgb(78 42 132 / 10%).
  • --nu-purple-surface corrected to #f9f6ff, --nu-purple-surface-subtle to #f3f0f7.
  • Blockquote background uses #f9f6ff instead of translucent purple.
  • Horizontal rules use 3px --nu-purple-10 instead of 1px gray.
  • List markers use --nu-purple-100 instead 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>.
  • Tooltip component suite: <Tooltip>, <Glossary>, <Term>.
  • Keyboard component: <Kbd>.
  • 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.md with 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 #6e6e6e to #999 (4.6:1).
  • Code block copy button icon in dark mode used --nu-purple-100 on 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 used 15%. Both use 15% 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 MutationObservers accumulated 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 diagramSources Map leaked detached DOM nodes across view transitions. Switched to WeakMap.
  • Tooltip event listeners duplicated on Astro view transitions. Added WeakSet idempotency 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-x and --sl-menu-button-size so the close button aligns with the hamburger menu on mobile.
  • Removed right padding on active sidebar headings that broke nested heading alignment.