All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.20.3 - 2026-04-14
- h5 headings appearing larger than h4 (#381) —
h5had no dedicated CSS rule, so it inherited the browser default size and "PT Serif" (a visually larger serif font) whileh4used the more compact "Source Sans Pro" at1.2rem. Added explicith5styling (1rem, Source Sans Pro, weight 900) to restore the correct heading size hierarchy.
- Bump
actions/github-scriptfrom 8 to 9 (#380) - Bump
pypa/gh-action-pypi-publishfrom 1.13.0 to 1.14.0 (#379)
0.20.2 - 2026-04-06
- Emphasis color on "et al." in textual citations (#378) — the v0.20.1 fix only targeted
<em>inside<a class="reference">links. Withbibtex_reference_style: author_year, sphinxcontrib-bibtex places<em>et al.</em>as a sibling of the link, not a child. Addedspan:has(> a.reference) > emselector to handle this HTML structure across all theme variants.
0.20.1 - 2026-04-06
- Emphasis color applied to "et al." in citation links (#366) — added
a.reference emCSS overrides so<em>tags inside sphinxcontrib-bibtex citation reference links inherit color and font-weight from the parent anchor instead of the theme's emphasis styling. Applied across light, dark, and gruvbox color schemes.
- Relaxed
sphinxcontrib-bibtexupper bound (#366) — updated docs dependency from<=2.5.0to<3, allowing compatibility with the 2.6.x series (latest 2.6.5).
- Bump
codecov/codecov-actionfrom 5.5.2 to 6.0.0 (#377) - Bump
actions/deploy-pagesfrom 4 to 5 (#376)
0.20.0 - 2026-03-23
- Language switcher for multilingual site support (#374) — a globe icon dropdown in the bottom toolbar that enables users to switch between translated versions of a lecture site. Only renders when 2+ languages are configured via
html_theme_options. Includes keyboard navigation, click-outside-to-close, and dark mode support. - SEO hreflang tags (#374) — automatically injects
<link rel="alternate" hreflang="...">meta tags in<head>for all configured languages, improving search engine discovery of translated content. - Multilingual infrastructure documentation (#374) — new developer guide at
docs/developer/infrastructure.mdcovering three hosting options (GitHub Pages, subdomains, reverse proxy) for deploying translated lecture sites.
- Renamed
lecture-python-programming.mysttolecture-python-programming(#374) — updated all CI workflows, tox config, Playwright config, and documentation to reflect the renamed test repository.
0.19.0 - 2026-03-08
sticky_contentsnow defaults toTrue(#371) — the sticky right-hand table of contents with scroll spy is now enabled by default for all projects using the theme. To revert to the classic TOC, setsticky_contents: Falseinhtml_theme_options.- Increased CSS specificity for custom code highlighting (#373) — replaced
:where()wrappers withhtml body:not(.use-pygments-style)to ensure custom token colors are not overridden by pydata-sphinx-theme's Pygments rules whendata-themeis set.
data-themeattribute on<html>(#373) — sets the standarddata-theme="light"or"dark"attribute used by pydata-sphinx-theme, Furo, and sphinx-book-theme, fixing compatibility withmyst-nb1.4.0+ which uses this attribute for dark mode detection. Resolves dark code cell backgrounds appearing on light-themed sites for users with OS dark mode.inline_literal_boxtheme option (#373) — new boolean option (default:False) that controls whether inline code literals (code.literal) display with pydata-sphinx-theme's background box and border styling. Set toTrueto re-enable boxes.--qe-literal-colorCSS variable (#373) — inline code literal color integrated into the text color scheme system alongside emphasis, strong, and definition colors:- Seoul256:
#af5f5f(muted rust) /#d78787(soft rose) for dark mode - Gruvbox:
#9d0006(dark red) /#fb4934(bright red) for dark mode - None: inherits text color
- Overridable via
--qe-literal-colorin custom CSS
- Seoul256:
- Dark code cells with myst-nb 1.4+ (#373) — myst-nb 1.4.0 changed CSS dark mode detection to a space-toggle technique with
@media (prefers-color-scheme)fallback; since the theme only usedbody.dark-themeclass, myst-nb fell through to OS preference causing dark backgrounds on light sites. Fixed by settingdata-themeattribute.
- Bump
actions/upload-pages-artifactfrom 3 to 4 (#370) - Bump
actions/upload-artifactfrom 6 to 7 (#369)
0.18.0 - 2026-02-24
- Complete dark theme overhaul (#365) — rewrote the dark theme for a modern, consistent, and readable experience
- Replaced ad-hoc grays (
#222/#333/#444) with a cohesive navy-charcoal palette (#1a1a2ebackground,#252540surfaces,#d4d4e4text,#6cb6fflinks) - Images now use subtle opacity reduction instead of aggressive CSS inversion
- Replaced ad-hoc grays (
- CSS custom properties for dark theme (#365) — all 16 palette colors declared as overridable
--qe-dark-*custom properties; downstream projects can now customize colors without duplicating selectors
- Dark mode syntax highlighting (#365) — complete token colors for all ~40 Pygments syntax classes using a VS Code Dark+ inspired palette
- FOUC prevention (#365) — early inline script applies dark mode class before first paint, eliminating the flash of white on page load
- Dark mode documentation (#365) — new "Dark Mode" section in
configure.mdcovering palette, syntax highlighting, admonitions, image handling, and CSS customization with full reference table of all overridable custom properties - Dark mode coverage for unstyled elements (#365) — modals, admonitions (type-specific accents), homepage elements, collapse/toggle bars, tooltips, autodoc, footnotes, and non-QuantEcon project overrides
- Double logo in dark theme (#365) — when a dedicated dark logo is configured, both light and dark logos were shown; fixed
:only-childselector to check the<a>wrapper instead of the<img> - Page header unreadable in dark mode (#365) — title link, authors, "Last changed" button, and changelog dropdown used
#444text on dark backgrounds - Unreadable table text in dark mode (#365) — table rows used
#333text on dark backgrounds - Indistinguishable links in dark mode (#365) — all links were
#fff, same as body text - Inline code light border in dark mode (#365) — code spans retained light-theme borders
- Sidebar search white in dark mode (#365) — search input area remained white
- Toolbar border in dark mode (#365) — toolbar border remained light gray
- Syntax highlighting gaps (#365) — only 3 of ~40 token types had dark mode overrides
- Stderr warnings in dark mode (#365) — updated to use amber accents matching the new palette
0.17.1 - 2026-02-19
- Horizontal scrollbar on sticky TOC (#363) — added
overflow-x: hiddento the sticky "On this page" sidebar to prevent an unwanted horizontal scrollbar when long section titles wrap - npm security vulnerabilities (#364) — resolved 9 dependency vulnerabilities (5 high, 3 moderate, 1 low) via
npm audit fix, updating webpack, node-forge, qs, lodash, cross-spawn, ajv, and nanoid
0.17.0 - 2026-02-19
- Removed individual color options — the following
html_theme_optionshave been removed:emphasis_color,emphasis_color_dark,strong_color,strong_color_dark,definition_color,definition_color_dark. These are replaced by the newcolor_schemeoption (see Changed below). Projects using the old options should migrate to either the built-inseoul256scheme or acustom_color_scheme.cssfile.
- Sticky table of contents with scroll highlighting (#350, #133)
- New
sticky_contentsoption enables a fixed-position RHS TOC that tracks scroll position - Scroll spy highlights the currently visible section in the TOC
- Auto-expand subsections show the active hierarchy (configurable via
contents_autoexpand) - Copy section link: hover over any TOC entry to copy the full URL with anchor
- Back to top button appears after scrolling down 300px
- New
scrollspy.jsmodule withrequestAnimationFramethrottling - Full documentation in
docs/configure.md
- New
- CI:
/update-snapshotscommand (#362)- PR comment command to regenerate all Playwright visual baselines
- Text color scheme system (#360) — replaces individual color options with scheme-based approach
- New
color_schemetheme option (seoul256default,gruvbox,noneto disable) - Seoul256-inspired palette: dark teal (
#005f5f) for emphasis, dark amber (#875f00) for strong (light mode); medium-light teal (#5fafaf) and light amber-gold (#d7af5f) for dark mode - Gruvbox palette: earthy aqua (
#427b58) for emphasis, warm orange (#af3a03) for strong (light mode); light aqua (#8ec07c) and bright orange (#fe8019) for dark mode - Custom override via
custom_color_scheme.cssin project_static/(auto-detected) - New
_color-schemes.scssmodule for built-in scheme definitions
- New
- Math equation visual test stability (#361)
- Regenerated stale snapshots for consistent cross-environment rendering
- Increased tolerance with
maxDiffPixelRatio: 0.15for MathJax font variance
0.16.0 - 2026-02-06
- Customizable emphasis and bold text colors (#355, #356)
- Six new
html_theme_options:emphasis_color,emphasis_color_dark,strong_color,strong_color_dark,definition_color,definition_color_dark - Allows per-site color customization of italic (
<em>), bold (<strong>/<b>), and definition list (<dt>) elements - Supports light and dark mode independently
- CSS custom properties (
--qe-emphasis-color,--qe-strong-color,--qe-definition-color) with SCSS fallbacks - Server-side validation of color values to prevent CSS injection
- Comprehensive documentation in
docs/configure.mdwith examples
- Six new
- Math equation visual test stability (#357)
- Replaced fixed 1000ms timeout with
MathJax.startup.promisefor reliable math rendering detection - Captures paragraph container instead of tiny MathJax element to avoid dimension mismatches
- Replaced fixed 1000ms timeout with
- Update-snapshots workflow (#357)
- Added
continue-on-error: trueto handle missing snapshot exit codes gracefully
- Added
- Dependency updates (Dependabot)
- Bump codecov/codecov-action from 5.5.1 to 5.5.2 (#351)
- Bump actions/upload-artifact from 5 to 6 (#352)
0.15.1 - 2025-12-11
- Notebook launch URLs with
path_to_docs(#345)- Fixed bug where
path_to_docsprefix was incorrectly included in notebook URLs - When docs are in a subdirectory (e.g.,
lectures/) but notebooks are in a flat repo structure, launch buttons (Colab, JupyterHub, Binder) now generate correct URLs - Added comprehensive test coverage including backward compatibility tests
- Fixed bug where
- Visual regression test stability (#350)
- Fixed flaky MathJax visual regression test by using
maxDiffPixelsinstead ofmaxDiffPixelRatio - Handles minor rendering variations across different environments
- Fixed flaky MathJax visual regression test by using
- Dependency updates (Dependabot)
- Bump actions/github-script from 7 to 8 (#348)
- Bump actions/upload-artifact from 4 to 5 (#347)
- Bump actions/setup-node from 4 to 6 (#346)
0.15.0 - 2025-12-08
- Major refactoring and modernization (#335)
- Updated Node.js from 16.13.2 (EOL) to 18.18.0 LTS
- Modularized SCSS: Split 2038-line monolithic stylesheet into 11 focused modules
- Modularized JavaScript: Organized 565 lines into 8 feature-specific modules
- Updated npm dependencies: sass (1.94.2), sass-loader (16.0.6), css-loader (7.1.2), webpack (5.103.0), and more
- Updated Python dependencies: Added version constraints for pyyaml, docutils, beautifulsoup4
- Updated flake8 constraint from <3.8.0 to >=7.0.0
- Removed unused
clickdependency
- Performance optimizations (#335)
- Preconnect hints for CDN resources (unpkg.com, cdn.jsdelivr.net, fonts.googleapis.com)
- Reduces connection time by 100-300ms per CDN
- Security improvements (#335)
- Fixed 2 npm vulnerabilities (cross-spawn HIGH severity, nanoid MODERATE severity)
- Added SRI (Subresource Integrity) hashes to all CDN-loaded scripts
- Testing improvements (#335)
- New test infrastructure with conftest.py and shared fixtures
- Added test_module_structure.py with 10 new tests (13→23 total tests)
- Validates SCSS module structure, JavaScript module exports, layout template configuration
- Documentation improvements (#335)
- Comprehensive CONTRIBUTING.md with development guide
- New testing guide at docs/contributing/testing.md
- AI-assisted development guide at .github/copilot-instructions.md
- Added .editorconfig for consistent code formatting
- Added .nvmrc for Node.js version pinning
- Deprecation warnings (#335)
- Fixed deprecated
datetime.utcnow()→datetime.now(timezone.utc) - Fixed deprecated
datetime.utcfromtimestamp()→datetime.fromtimestamp(..., tz=timezone.utc) - All 19 deprecation warnings resolved
- Fixed deprecated
- Removed obsolete console polyfill for IE8/9 (#335)
- Reduces JavaScript bundle size from 8.91 KiB to 8.73 KiB
0.14.0 - 2025-12-01
- Visual regression testing with Playwright (#339)
- Automated screenshot comparison for theme styling
- Tests for code blocks, dark mode, math equations, headers, sidebars
- Desktop and mobile viewport coverage
- CI integration with GitHub Actions
- New
/update-new-snapshotsPR comment command (#340)- Automatically generates baseline snapshots for new visual tests
- Only creates missing snapshots (won't overwrite existing baselines)
- Documents workflow in tests/visual/README.md
- Removed italic formatting from f-string interpolation tokens (#324, #329)
- F-string placeholders like
{variable}now render in consistent monospace - Improves code readability by matching terminal/REPL output style
- F-string placeholders like
0.13.2 - 2025-11-25
- Updated Jupyter Book links to avoid redirects (#337)
- Footer "Powered by Jupyter Book" link now points directly to jupyterbook.org/v1/
- Eliminates redirect warnings in lecture linkcheckers
0.13.1 - 2025-11-25
- Colab launch button now correctly generates URLs for flat notebook repositories (#336)
- Added
nb_path_to_notebooksconfiguration option to specify notebook path independently frompath_to_docs - Defaults to empty string for flat repositories, fixing incorrect URL generation
- Added
0.13.0 - 2024-11-24
- Collapsible stderr warnings feature (#333)
- Automatically detects and wraps stderr output in notebook cells with a collapsible interface
- Displays a compact "⚠ Code warnings" button for cleaner presentation
- Improves readability when code produces verbose warnings from upstream packages
- Includes dark theme support and accessibility features (ARIA labels)
- Works seamlessly with myst-nb's
merge_streamsconfiguration option
0.12.0 - 2025-11-23
- Git-based metadata integration for lecture pages (#328, #331)
- Last modified timestamp displayed below authors
- Interactive changelog dropdown showing last 10 commits (configurable)
- Clickable commit hashes linking to GitHub commit pages
- Full commit history link for each document
- Configuration options:
last_modified_date_formatandchangelog_max_entries
- Improved lecture header layout (#328, #331)
- Removed redundant title display from page headers
- Increased lecture series heading font size by 44%
- Increased author names font size by 20%
- Repositioned metadata elements for better visual hierarchy
0.11.0 - 2025-11-20
- Color-based emphasis system for
<em>and<strong>tags (#327)<em>tags now render with distinctive color emphasis instead of italics<strong>tags render with both color emphasis and bold weight- New SCSS color variables for consistent emphasis styling
- Visual treatment of emphasized text now uses color rather than italics for improved readability
0.10.1 - 2024-XX-XX
- Customized toggle button text to display 'Show'/'Hide' instead of default text (#322)
0.10.0 - 2024-XX-XX
- Optional custom code style feature (#319)
- Users can now choose between custom QuantEcon syntax highlighting styles or Pygments built-in themes
- Configuration option
quantecon_book_theme_code_styleinconf.py
0.9.3 - 2024-XX-XX
- Collapse functionality bugs: CSS selectors, height parsing, and toggle bar creation (#300)
- Increased page max-width to accommodate 80-character code lines (#309)
0.9.2 - 2024-XX-XX
- Reference error in index.js (#311)
- Fixed coverage warnings in RTL functionality tests (#313)
0.9.1 - 2024-XX-XX
- Updated Jupyter Book footer link to reduce redirects (#303)
0.9.0 - 2024-XX-XX
- Initial stable release with core theme features