Skip to content 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.
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.
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.
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.
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).
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.
Added
- Fullscreen Mermaid viewer: wheel zoom and double-click zoom anchor to the pointer position.
- Zoom level badge (e.g.
84%) in the fullscreen viewer.
- GFM footnote styles: superscript
[n] reference markers, footnotes section with separator, styled ↩︎ back-references.
Fixed
- Mermaid diagrams sometimes breaking on Firefox and Safari. The toolbar script read
textContent after astro-mermaid had already rendered SVG into the element. Reads data-diagram first now.
- Horizontal rules in dark mode used
--nu-purple-140, which was invisible against the background. Switched to --nu-border-color.
Accessibility
- Fullscreen Mermaid overlay:
role="dialog", aria-modal, focus trap, focus restore on close.
- White focus rings on overlay controls, theme toggle, and menu button (all sit on dark backgrounds where the purple ring was invisible).
- Inline Mermaid toolbar buttons use a solid accent outline on focus instead of the near-invisible shadow ring.
Fixed
- Scrollbar gutter reserved space on splash pages, leaving a gap next to the topbar. Now only applied on pages with a scrollbar.
- Mermaid toolbar buttons use Northwestern purple focus rings instead of the browser default.
- Mermaid fullscreen close button dropped the red danger style and matches the other overlay buttons.
Changed
- Mermaid overlay buttons sized and styled to match the header theme toggle.
Added
- Fullscreen Mermaid viewer supports touch: one-finger pan, pinch-to-zoom, two-finger pan.
- Mermaid toolbar stays visible on touch devices (
hover: none) since hover is unavailable.
- SVG downloads use descriptive filenames derived from the site title, page slug, and diagram type (e.g.,
northwestern-starlight-theme_examples-mermaid-flowchart.svg).
Added
- Automatic favicon shipped with the theme, applied without touching
public/. Override with favicon in Starlight config.
homepage.imageWidth option for hero image size. Defaults to 500px; set higher for wide lockup images.
Fixed
showTitle: false now works in the centered hero layout (previously only worked in split layout).
- Search result titles and headings no longer appear white-on-white in light mode. The
.header a selector was too broad and bled into Pagefind’s search modal.
- Search input focus ring uses Northwestern purple instead of the browser default.
Changed
- Release workflow uses npm trusted publishing (OIDC) instead of long-lived tokens.
- Initial public release
- Northwestern Purple color palette mapped to Starlight’s accent system
- Akkurat Pro (body) and Poppins (headings) loaded from Northwestern CDN
- Styled tables, badges, asides, cards, tabs, and code blocks
- Mermaid diagram support with Northwestern colors and fullscreen viewer
- OpenAPI plugin compatibility with method badge preservation
- Reduced motion support for transitions