From 9f48631732b59d5ef8ca746b9a09a0043b691952 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Aug 2024 13:35:06 -0700 Subject: [PATCH 01/12] Bump stylelint from 16.8.2 to 16.9.0 (#1525) Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.8.2 to 16.9.0. - [Release notes](https://github.com/stylelint/stylelint/releases) - [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md) - [Commits](https://github.com/stylelint/stylelint/compare/16.8.2...16.9.0) --- updated-dependencies: - dependency-name: stylelint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 103 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 54 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index f75b07884a..46d3d0ce71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "npm-run-all": "^4.1.5", "prettier": "^3.3.3", - "stylelint": "^16.8.2", + "stylelint": "^16.9.0", "stylelint-config-standard-scss": "^13.1.0" } }, @@ -53,9 +53,9 @@ } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.0.tgz", - "integrity": "sha512-20hEErXV9GEx15qRbsJVzB91ryayx1F2duHPBrfZXQAHz/dJG0u/611URpr28+sFjm3EI7U17Pj9SVA9NSAGJA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", + "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", "dev": true, "funding": [ { @@ -71,13 +71,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.0" + "@csstools/css-tokenizer": "^3.0.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.0.tgz", - "integrity": "sha512-efZvfJyYrqH9hPCKtOBywlTsCXnEzAI9sLHFzUsDpBb+1bQ+bxJnwL9V2bRKv9w4cpIp75yxGeZRaVKoMQnsEg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", + "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", "dev": true, "funding": [ { @@ -94,9 +94,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.0.tgz", - "integrity": "sha512-W0JlkUFwXjo703wt06AcaWuUcS+6x6IEDyxV6W65Sw+vLCYp+uPsrps+PXTiIfN0V1Pqj5snPzN7EYLmbz1zjg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", "dev": true, "funding": [ { @@ -112,8 +112,8 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.0", - "@csstools/css-tokenizer": "^3.0.0" + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1" } }, "node_modules/@csstools/selector-specificity": { @@ -1421,9 +1421,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { "braces": "^3.0.3", @@ -2197,9 +2197,9 @@ } }, "node_modules/stylelint": { - "version": "16.8.2", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.8.2.tgz", - "integrity": "sha512-fInKATippQhcSm7AB+T32GpI+626yohrg33GkFT/5jzliUw5qhlwZq2UQQwgl3HsHrf09oeARi0ZwgY/UWEv9A==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", + "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", "dev": true, "funding": [ { @@ -2212,9 +2212,9 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.0", - "@csstools/css-tokenizer": "^3.0.0", - "@csstools/media-query-list-parser": "^3.0.0", + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", "@csstools/selector-specificity": "^4.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", @@ -2236,7 +2236,7 @@ "known-css-properties": "^0.34.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", - "micromatch": "^4.0.7", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.0.1", "postcss": "^8.4.41", @@ -2247,7 +2247,7 @@ "resolve-from": "^5.0.0", "string-width": "^4.2.3", "strip-ansi": "^7.1.0", - "supports-hyperlinks": "^3.0.0", + "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", "table": "^6.8.2", "write-file-atomic": "^5.0.1" @@ -2385,9 +2385,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", - "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, "dependencies": { "has-flag": "^4.0.0", @@ -2395,6 +2395,9 @@ }, "engines": { "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-hyperlinks/node_modules/has-flag": { @@ -2622,22 +2625,22 @@ } }, "@csstools/css-parser-algorithms": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.0.tgz", - "integrity": "sha512-20hEErXV9GEx15qRbsJVzB91ryayx1F2duHPBrfZXQAHz/dJG0u/611URpr28+sFjm3EI7U17Pj9SVA9NSAGJA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", + "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.0.tgz", - "integrity": "sha512-efZvfJyYrqH9hPCKtOBywlTsCXnEzAI9sLHFzUsDpBb+1bQ+bxJnwL9V2bRKv9w4cpIp75yxGeZRaVKoMQnsEg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", + "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", "dev": true }, "@csstools/media-query-list-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.0.tgz", - "integrity": "sha512-W0JlkUFwXjo703wt06AcaWuUcS+6x6IEDyxV6W65Sw+vLCYp+uPsrps+PXTiIfN0V1Pqj5snPzN7EYLmbz1zjg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", "dev": true, "requires": {} }, @@ -3596,9 +3599,9 @@ "dev": true }, "micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { "braces": "^3.0.3", @@ -4109,14 +4112,14 @@ "dev": true }, "stylelint": { - "version": "16.8.2", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.8.2.tgz", - "integrity": "sha512-fInKATippQhcSm7AB+T32GpI+626yohrg33GkFT/5jzliUw5qhlwZq2UQQwgl3HsHrf09oeARi0ZwgY/UWEv9A==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", + "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^3.0.0", - "@csstools/css-tokenizer": "^3.0.0", - "@csstools/media-query-list-parser": "^3.0.0", + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", "@csstools/selector-specificity": "^4.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", @@ -4138,7 +4141,7 @@ "known-css-properties": "^0.34.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", - "micromatch": "^4.0.7", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.0.1", "postcss": "^8.4.41", @@ -4149,7 +4152,7 @@ "resolve-from": "^5.0.0", "string-width": "^4.2.3", "strip-ansi": "^7.1.0", - "supports-hyperlinks": "^3.0.0", + "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", "table": "^6.8.2", "write-file-atomic": "^5.0.1" @@ -4217,9 +4220,9 @@ } }, "supports-hyperlinks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", - "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, "requires": { "has-flag": "^4.0.0", diff --git a/package.json b/package.json index 491bd845bc..eccdf500f2 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "devDependencies": { "npm-run-all": "^4.1.5", "prettier": "^3.3.3", - "stylelint": "^16.8.2", + "stylelint": "^16.9.0", "stylelint-config-standard-scss": "^13.1.0" }, "scripts": { From ce322120265cc4002557a4e07f175d865660224c Mon Sep 17 00:00:00 2001 From: Matt Wang Date: Wed, 4 Sep 2024 16:08:19 -0700 Subject: [PATCH 02/12] docs: add sitemap (via `jekyll-sitemap` plugin) (#1530) Splitting this out of #1513 to make my life reviewing a bit easier! Note that this does *not* affect our downstream users, just the docs site for this project itself. --------- Co-authored-by: Michael Ball --- CHANGELOG.md | 2 ++ Gemfile | 1 + Gemfile.lock | 3 ++ _config.yml | 66 ++++++++++++++++++------------------- fixtures/Gemfile-jekyll-3.9 | 1 + fixtures/Gemfile-jekyll-4.3 | 1 + 6 files changed, 40 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58a2dac286..4e06c8d0e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,9 +24,11 @@ Code changes to `main` that are *not* in the latest release: Docs changes made since the latest release: - Added: Allow unlimited multi-level navigation by [@pdmosses] in [#1440] +- Added: sitemap (via `jekyll-sitemap` plugin) by [@mattxwang] in [#1530] [#1431]: https://github.com/just-the-docs/just-the-docs/pull/1431 [#1440]: https://github.com/just-the-docs/just-the-docs/pull/1440 +[#1530]: https://github.com/just-the-docs/just-the-docs/pull/1530 ## Release v0.9.0 diff --git a/Gemfile b/Gemfile index 76bd13913f..b4057b6793 100644 --- a/Gemfile +++ b/Gemfile @@ -4,5 +4,6 @@ gemspec gem "jekyll-github-metadata", ">= 2.15" gem "jekyll-include-cache", group: :jekyll_plugins +gem "jekyll-sitemap", group: :jekyll_plugins gem "html-proofer", "~> 5.0", :group => :development diff --git a/Gemfile.lock b/Gemfile.lock index c9d640bae3..9f1e7be1c6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -85,6 +85,8 @@ GEM sass-embedded (~> 1.54) jekyll-seo-tag (2.8.0) jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) json (2.7.2) @@ -156,6 +158,7 @@ DEPENDENCIES html-proofer (~> 5.0) jekyll-github-metadata (>= 2.15) jekyll-include-cache + jekyll-sitemap just-the-docs! BUNDLED WITH diff --git a/_config.yml b/_config.yml index 23b9a9b5bc..eb87765435 100644 --- a/_config.yml +++ b/_config.yml @@ -22,40 +22,39 @@ repository: just-the-docs/just-the-docs # for github-metadata permalink: pretty defaults: - - - scope: + - scope: path: "docs" # an empty string here means all files in the project type: "pages" values: layout: "default" exclude: - # from https://github.com/jekyll/jekyll/blob/master/lib/site_template/_config.yml: - - .sass-cache/ - - .jekyll-cache/ - - gemfiles/ - - Gemfile - - Gemfile.lock - - node_modules/ - - vendor/bundle/ - - vendor/cache/ - - vendor/gems/ - - vendor/ruby/ - # specific to the theme website: - - bin/ - - lib/ - - "*.gemspec" - - "*.gem" - - LICENSE.txt - - package.json - - package-lock.json - - Rakefile - - README.md - - CODE_OF_CONDUCT.md - - docker-compose.yml - - Dockerfile - # theme test code - - fixtures/ + # from https://github.com/jekyll/jekyll/blob/master/lib/site_template/_config.yml: + - .sass-cache/ + - .jekyll-cache/ + - gemfiles/ + - Gemfile + - Gemfile.lock + - node_modules/ + - vendor/bundle/ + - vendor/cache/ + - vendor/gems/ + - vendor/ruby/ + # specific to the theme website: + - bin/ + - lib/ + - "*.gemspec" + - "*.gem" + - LICENSE.txt + - package.json + - package-lock.json + - Rakefile + - README.md + - CODE_OF_CONDUCT.md + - docker-compose.yml + - Dockerfile + # theme test code + - fixtures/ # Set a path/url to a logo that will be displayed instead of the title #logo: "/assets/images/just-the-docs.png" @@ -87,7 +86,7 @@ search: # Supports true or false (default) button: false # Focus the search input by pressing `ctrl + focus_shortcut_key` (or `cmd + focus_shortcut_key` on macOS) - focus_shortcut_key: 'k' + focus_shortcut_key: "k" # For copy button on code enable_copy_code_button: true @@ -134,8 +133,8 @@ nav_external_links: nav_error_report: true # default is false/nil. liquid: - error_mode: strict - strict_filters: true + error_mode: strict + strict_filters: true # Footer content # appears at the bottom of every page's main content @@ -144,14 +143,12 @@ liquid: back_to_top: true back_to_top_text: "Back to top" -footer_content: "Copyright © 2017-2020 Patrick Marsceill. Distributed by an MIT license. This site is powered by Netlify." +footer_content: 'Copyright © 2017-2020 Patrick Marsceill. Distributed by an MIT license. This site is powered by Netlify.' # Footer last edited timestamp last_edit_timestamp: true # show or hide edit time - page must have `last_modified_date` defined in the frontmatter last_edit_time_format: "%b %e %Y at %I:%M %p" # uses ruby's time format: https://ruby-doc.org/stdlib-2.7.0/libdoc/time/rdoc/Time.html - - # Footer "Edit this page on GitHub" link text gh_edit_link: true # show or hide edit this page link gh_edit_link_text: "Edit this page on GitHub" @@ -190,6 +187,7 @@ plugins: - jekyll-seo-tag - jekyll-github-metadata - jekyll-include-cache + - jekyll-sitemap kramdown: syntax_highlighter_opts: diff --git a/fixtures/Gemfile-jekyll-3.9 b/fixtures/Gemfile-jekyll-3.9 index a363677e0f..3fdb79f507 100644 --- a/fixtures/Gemfile-jekyll-3.9 +++ b/fixtures/Gemfile-jekyll-3.9 @@ -6,6 +6,7 @@ gem "jekyll-seo-tag", ">= 2.0" gem "rake", ">= 12.3.1" gem "jekyll-include-cache", group: :jekyll_plugins +gem "jekyll-sitemap", group: :jekyll_plugins # required for Jekyll 3 gem "webrick", "~> 1.7" diff --git a/fixtures/Gemfile-jekyll-4.3 b/fixtures/Gemfile-jekyll-4.3 index a77bf1b352..75e73f889b 100644 --- a/fixtures/Gemfile-jekyll-4.3 +++ b/fixtures/Gemfile-jekyll-4.3 @@ -6,6 +6,7 @@ gem "jekyll-seo-tag", ">= 2.0" gem "rake", ">= 12.3.1" gem "jekyll-include-cache", group: :jekyll_plugins +gem "jekyll-sitemap", group: :jekyll_plugins # docs-only gem "jekyll-github-metadata", ">= 2.15" From 8292f46be932b13cba1301dfa8ce914d5f72627e Mon Sep 17 00:00:00 2001 From: Matt Wang Date: Fri, 6 Sep 2024 13:18:26 -0700 Subject: [PATCH 03/12] docs: fix (non-systemic) accessibility issues flagged by aXe (#1531) This PR fixes some accessibility issues in our theme docs (i.e. not generated code) flagged by #1513. Here, I target changes that I say are not "systemic", i.e. issues that are easily resolvable by changing our copy and page structure (rather than issues that are created by how kramdown/rouge generates HTML, or reworking our color themes). Here's a quick summary of the manual changes I made: - ~~writing some JS to set `tabindex="0"` on all code blocks; I'd prefer a ruby-native solution, but that involves writing Ruby code, which is incompatible with the pages gem~~ I've moved this to #1533 - rewriting many headings named "Example" which were almost always h4s into more descriptive headings + the appropriate heading level, adding .text-delta to maintain the previous style when necessary - removing some old heading ID hacks in `index-test` that are no longer necessary, since Jekyll does this automatically now - fixing the table headings in `docs/utilities/layout.md` - adding accessible titles + descriptions to the mermaid examples - occasionally, slightly moving around copy to make it align with new headings If you test with #1513 with the following rules disabled: ```rb skipped_rules = [ 'color-contrast', # requires theme auditing # issues w/ autogenerated footnotes 'aria-allowed-role', 'landmark-no-duplicate-contentinfo', 'landmark-unique', 'aria-deprecated-role', # issues w/ markdown checkboxes 'label' ] ``` You should get passing tests :) which is awesome! ## next steps 1. we need to do a pass over our docs copy - very inconsistent. This has been a pain point for me for a while now, just need to find time to sit down and do it. In particular, I'd love to standardize how we display example code (perhaps even hiding it with `
` and ``?), our headings language, what goes into the ToC, our overall writing style, etc. 2. ~~I don't love the JS hack for adding `tabindex="0"` to code blocks (so that they are keyboard-focusable). Ideally, we'd add a custom formatter to rouge to do this, but we can't execute arbitrary Ruby code when users use `github-pages`. I'll look into this some more - maybe rouge would be open to adding this as a feature.~~ see: #1533 4. There are some systemic issues that need a deeper look: 1. The most common issue is still color-contrast. Fixing this involves: - looking at our whites/blacks/grays for core text and highlighting - reevaluating our syntax highlighting themes - fixing dark mode, once and for all :) - also, picking accessible callout colours! 2. kramdown's autogenerated footnotes feature creates a bunch of errors that aXe flags: it seems like a deprecated aria role is being used, and perhaps some misuse of markup. Need to look into this more before I can make a solid attempt at resolving this issue. 3. We demonstrate the use of `- [ ]`, but this generates `` values with no label. I'm not entirely sure what the best way to fix this problem is (without writing custom Ruby code). I'll have to think about this some more. --------- Co-authored-by: Michael Ball --- CHANGELOG.md | 2 ++ docs/customization.md | 16 ++++++++-------- docs/index-test.md | 14 ++++++++------ docs/layout/minimal/default-child.md | 4 +++- docs/layout/minimal/minimal-child.md | 2 ++ docs/minimal-test.md | 2 ++ docs/navigation/auxiliary.md | 5 ++++- docs/navigation/children.md | 3 ++- docs/navigation/in-page.md | 12 ++++-------- docs/navigation/main/ancestry.md | 3 ++- docs/navigation/main/collections.md | 8 +++++--- docs/navigation/main/exclude.md | 5 +++-- docs/navigation/main/external.md | 3 ++- docs/navigation/main/levels.md | 13 ++++++++----- docs/navigation/main/order.md | 7 ++++--- docs/search.md | 5 ++--- docs/ui-components/callouts.md | 28 ++++++++++++++-------------- docs/ui-components/code/index.md | 6 ++++++ docs/utilities/layout.md | 18 +++++++++--------- 19 files changed, 90 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e06c8d0e5..c70a0ca910 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,10 +25,12 @@ Docs changes made since the latest release: - Added: Allow unlimited multi-level navigation by [@pdmosses] in [#1440] - Added: sitemap (via `jekyll-sitemap` plugin) by [@mattxwang] in [#1530] +- Fixed: (non-systemic) accessibility issues flagged by aXe by [@mattxwang] in [#1531] [#1431]: https://github.com/just-the-docs/just-the-docs/pull/1431 [#1440]: https://github.com/just-the-docs/just-the-docs/pull/1440 [#1530]: https://github.com/just-the-docs/just-the-docs/pull/1530 +[#1530]: https://github.com/just-the-docs/just-the-docs/pull/1531 ## Release v0.9.0 diff --git a/docs/customization.md b/docs/customization.md index 8d70b44693..61ec820a92 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -20,8 +20,8 @@ Just the Docs supports two color schemes: light (default), and dark. To enable a color scheme, set the `color_scheme` parameter in your site's `_config.yml` file: -#### Example -{: .no_toc } +### Example: preview dark color scheme +{: .no_toc .text-delta } ```yaml # Color scheme supports "light" (default) and "dark" @@ -76,8 +76,8 @@ Available variables are listed in the [\_variables.scss](https://github.com/just For example, to change the link color from the purple default to blue, include the following inside your scheme file: -#### Example -{: .no_toc } +#### Example: custom link color +{: .no_toc .text-delta } ```scss $link-color: $blue-000; @@ -142,10 +142,10 @@ Additionally, you may want to add completely custom CSS specific to your content To do this, put your styles in the file `_sass/custom/custom.scss`. This will allow for all overrides to be kept in a single file, and for any upstream changes to still be applied. -For example, if you'd like to add your own styles for printing a page, you could add the following styles. +### Example: custom print styles +{: .no_toc .text-delta } -#### Example -{: .no_toc } +For example, if you'd like to add your own styles for printing a page, you could add the following styles. ```scss // Print-only styles. @@ -179,7 +179,7 @@ New (v0.4.0) If the page has any child pages, and `has_toc` is not set to `false`, this content appears as a heading above the [auto-generating list of child pages]({% link docs/navigation/children.md %}) after the page's content. -#### Example +#### Example: changing TOC heading {: .no_toc } To change the default TOC heading to "Contents", create `_includes/toc_heading_custom.html` and add: diff --git a/docs/index-test.md b/docs/index-test.md index 7e0c62b044..d664c78903 100644 --- a/docs/index-test.md +++ b/docs/index-test.md @@ -27,17 +27,17 @@ There should be whitespace between paragraphs. There should be whitespace between paragraphs. We recommend including a README, or a file with information about your project. -# [](#header-1)Header 1 +# Header 1 This is a normal paragraph following a header. GitHub is a code hosting platform for version control and collaboration. It lets you and others work together on projects from anywhere. -## [](#header-2)Header 2 +## Header 2 > This is a blockquote following a header. > > When something is important enough, you do it even if the odds are not in your favor. -### [](#header-3)Header 3 +### Header 3 ```js // Javascript code with syntax highlighting. @@ -54,19 +54,19 @@ GitHubPages::Dependencies.gems.each do |gem, version| end ``` -#### [](#header-4-with-code-not-transformed)Header 4 `with code not transformed` +#### Header 4 `with code not transformed` * This is an unordered list following a header. * This is an unordered list following a header. * This is an unordered list following a header. -##### [](#header-5)Header 5 +##### Header 5 1. This is an ordered list following a header. 2. This is an ordered list following a header. 3. This is an ordered list following a header. -###### [](#header-6)Header 6 +###### Header 6 [This is a very long link which wraps and therefore doesn't overflow even when it comes at the beginning](.) of the line. @@ -303,6 +303,8 @@ The following code is displayed as a diagram only when a `mermaid` key supplied ```mermaid graph TD; + accTitle: the diamond pattern + accDescr: a graph with four nodes: A points to B and C, while B and C both point to D A-->B; A-->C; B-->D; diff --git a/docs/layout/minimal/default-child.md b/docs/layout/minimal/default-child.md index 303558005b..9e09c95562 100644 --- a/docs/layout/minimal/default-child.md +++ b/docs/layout/minimal/default-child.md @@ -1,8 +1,10 @@ --- title: Default layout child page layout: default -parent: A minimal layout page +parent: A minimal layout page grand_parent: Layout --- +# A minimal layout page + This is a child page that uses the same minimal layout as its parent page. diff --git a/docs/layout/minimal/minimal-child.md b/docs/layout/minimal/minimal-child.md index 26bcff709e..2553b26bed 100644 --- a/docs/layout/minimal/minimal-child.md +++ b/docs/layout/minimal/minimal-child.md @@ -5,4 +5,6 @@ parent: A minimal layout page grand_parent: Layout --- +# Minimal layout child page + This is a child page that uses the same minimal layout as its parent page. diff --git a/docs/minimal-test.md b/docs/minimal-test.md index aa754d3172..72b59058ad 100644 --- a/docs/minimal-test.md +++ b/docs/minimal-test.md @@ -4,6 +4,8 @@ title: Minimal layout test nav_exclude: true --- +# Minimal Layout Test Page + [Return to main website]({{site.baseurl}}/). This page demonstrates the packaged `minimal` layout, which does not render the sidebar or header. It can be used for standalone pages. It is also an example of using the new modular site components to define custom layouts; see ["Custom layouts and includes" in the customization docs]({{site.baseurl}}/docs/customization/#custom-layouts-and-includes) for more information. diff --git a/docs/navigation/auxiliary.md b/docs/navigation/auxiliary.md index d1e4818ce3..621dc3cd2b 100644 --- a/docs/navigation/auxiliary.md +++ b/docs/navigation/auxiliary.md @@ -8,7 +8,10 @@ nav_order: 2 You can add a list of auxiliary links to your site, shown at the top right on all pages. You do this by including the `aux_links` [configuration option]({% link docs/configuration.md %}#aux-links) in your site's `_config.yml` file. -#### Example +## Example Auxiliary Link +{: .text-delta } + +This website has an auxiliary link: "Just the Docs on GitHub". It is rendered with the following code: ```yaml aux_links: diff --git a/docs/navigation/children.md b/docs/navigation/children.md index 481320542d..1df8c3e3df 100644 --- a/docs/navigation/children.md +++ b/docs/navigation/children.md @@ -10,7 +10,8 @@ By default, all parent pages will automatically have a so-called 'Table of Conte To disable this automatic list, set `has_toc: false` in the parent page's front matter. -#### Example +## Example: disabling table of contents +{: .text-delta } ```yaml --- diff --git a/docs/navigation/in-page.md b/docs/navigation/in-page.md index b84a95b678..cc963324b6 100644 --- a/docs/navigation/in-page.md +++ b/docs/navigation/in-page.md @@ -15,14 +15,13 @@ nav_order: 5 To support in-page navigation, you can generate a *Table of Contents* (TOC) with links to headings, like the one shown above, as well as a link to the top of the page. -## Table of Contents +## Generating Table of Contents To generate a *Table of Contents* in a page, you use Kramdown's `{:toc}` method, immediately after the start of a list. This will automatically generate a list of anchor links to various sections of the page, based on headings and heading levels. -If you want to omit a particular heading from the TOC, follow it immediately by `{: .no_toc }` (possibly together with other CSS class names). +## Omitting Heading from Table of Contents -#### Example -{: .no_toc } +If you want to omit a particular heading from the TOC, follow it immediately by `{: .no_toc }` (possibly together with other CSS class names). ```markdown # In-Page Navigation @@ -39,13 +38,10 @@ This example omits the top-level heading (`In-Page Navigation`) from the TOC, as To get an unordered list, replace `1. TOC` by `- TOC` in the above example. -## Collapsible Table of Contents +## Collapsible Table of Contents (with `
` and ``) You can make the Table of Contents collapsible using the `
` and `` elements, as in the following example. -#### Example -{: .no_toc } - ```markdown
diff --git a/docs/navigation/main/ancestry.md b/docs/navigation/main/ancestry.md index 8b7dac09f4..189dec3936 100644 --- a/docs/navigation/main/ancestry.md +++ b/docs/navigation/main/ancestry.md @@ -10,7 +10,8 @@ If no two pages on your website have the same `title`, you only need to set the If two parents have the same `title`, but different grandparents, you can set their `grand_parent` titles to distinguish between their parents. The `grand_parent` title needs to be the same as the `parent` of the `parent`. -#### Example +## Example: distinguishing parents with `grand_parent` +{: .text-delta } ```yaml --- diff --git a/docs/navigation/main/collections.md b/docs/navigation/main/collections.md index 9ef1bd33bb..acfba55116 100644 --- a/docs/navigation/main/collections.md +++ b/docs/navigation/main/collections.md @@ -14,7 +14,8 @@ However, you can configure Just the Docs to include also pages from [Jekyll coll [^1]: You can optionally specify a directory to store all your collections. For example, if you specify `collections_dir: my_collections` in `_config.yml`, you should then store the pages of the `tests` collection in the `my_collections/_tests` directory. -#### Example +## Example: defining custom collections +{: .text-delta } To define a Jekyll `tests` collection named `Tests` in your main navigation, store its pages in the `_tests` directory, and add the following to `_config.yml`: @@ -41,9 +42,10 @@ Together with the `name` to be used for a collection in the navigation, you can The main navigation for all your normal pages (if any) is displayed before those in collections. When *all* your pages are in a single collection, its name is not displayed. -You can configure multiple collections. This creates categories in the main navigation with the configured names. +## Example: multiple collections +{: .text-delta } -#### Example +You can configure multiple collections. This creates categories in the main navigation with the configured names. ```yaml collections: diff --git a/docs/navigation/main/exclude.md b/docs/navigation/main/exclude.md index 93f223f73c..5711cbfcd2 100644 --- a/docs/navigation/main/exclude.md +++ b/docs/navigation/main/exclude.md @@ -8,7 +8,8 @@ nav_order: 2 For specific pages that you do not wish to include in the main navigation (e.g., a 404 page or a landing page) set `nav_exclude: true` in their front matter. -#### Example +## Example: using `nav_exclude` +{: .text-delta } ```yaml --- @@ -19,7 +20,7 @@ permalink: /404 --- ``` -The `nav_exclude` parameter does not affect the [breadcrumbs]({% link docs/navigation/parents.md %}), nor the [lists of child pages]({% link docs/navigation/children.md %}), which you can use to access pages excluded from the main navigation. +The `nav_exclude` parameter does not affect the [breadcrumbs]({% link docs/navigation/parents.md %}), nor the [lists of child pages]({% link docs/navigation/children.md %}), which you can use to access pages excluded from the main navigation. Pages with no `title` are automatically excluded from the main navigation, except when they are in collections (where Jekyll provides default titles based on file names). diff --git a/docs/navigation/main/external.md b/docs/navigation/main/external.md index a0dfd8b55e..e4c3c6625b 100644 --- a/docs/navigation/main/external.md +++ b/docs/navigation/main/external.md @@ -9,7 +9,8 @@ nav_order: 6 To add external links to the navigation, add them to the `nav_external_links` [configuration]({% link docs/configuration.md %}) option in your site's `_config.yml` file. External links will appear in the navigation after the links to ordinary pages, but before any collections. -#### Example +## Example: external links +{: .text-delta } ```yaml # External navigation links diff --git a/docs/navigation/main/levels.md b/docs/navigation/main/levels.md index 2855ae824e..6ed73b522e 100644 --- a/docs/navigation/main/levels.md +++ b/docs/navigation/main/levels.md @@ -31,7 +31,8 @@ Sometimes you will want to create a page with many children. First, it is recomm └─ ... ``` -#### Example +## Example: page with no parents +{: .text-delta } ```yaml --- @@ -42,13 +43,14 @@ nav_order: 3 Here we're setting up the UI Components landing page that is available at URL `/docs/ui-components`, which is ordered second in the main navigation. -The navigation links for all pages with children come with an expander. When you click the expander, the display of the children is toggled, so you can expand or collapse all the children displays, regardless of which page is currently active. +The navigation links for all pages with children come with an expander. When you click the expander, the display of the children is toggled, so you can expand or collapse all the children displays, regardless of which page is currently active. ## Child Pages On child pages, simply set the `parent` front matter to the parent page's `title`, and set a navigation order (relative to pages having the same parent). -#### Example +### Example: creating a child page +{: .text-delta } ```yaml --- @@ -67,9 +69,10 @@ The Buttons page appears as a child of UI Components and appears second in the U ## Multi-level Child Pages -Child pages can themselves have children, to any number of levels. +Child pages can themselves have children, to any number of levels. -#### Example +### Example: pages with (recursive) children +{: .text-delta } ```yaml --- diff --git a/docs/navigation/main/order.md b/docs/navigation/main/order.md index e2bdaa2132..f99578ca6f 100644 --- a/docs/navigation/main/order.md +++ b/docs/navigation/main/order.md @@ -8,7 +8,8 @@ nav_order: 1 To specify a page order, you can use the `nav_order` parameter in the front matter of the pages. -#### Example +## Example: using `nav_order` +{: .text-delta } ```yaml --- @@ -30,6 +31,6 @@ Enclosing strings in quotation marks in front matter is optional, unless they co ---- -[^floats]: Jekyll treats each integer *N* as equal to the corresponding float *N.0*. +[^floats]: Jekyll treats each integer *N* as equal to the corresponding float *N.0*. -[^case-insensitive]: *Note for users of previous versions of Just the Docs:* The option `nav_sort: case_insensitive` previously affected the ordering of numerical `nav_order` parameters: e.g., `10` came before `2`. Also, all pages with explicit `nav_order` parameters previously came before all pages with default parameters. Both were potentially confusing, and they have now been eliminated. +[^case-insensitive]: *Note for users of previous versions of Just the Docs:* The option `nav_sort: case_insensitive` previously affected the ordering of numerical `nav_order` parameters: e.g., `10` came before `2`. Also, all pages with explicit `nav_order` parameters previously came before all pages with default parameters. Both were potentially confusing, and they have now been eliminated. diff --git a/docs/search.md b/docs/search.md index 7d12004d22..066b806367 100644 --- a/docs/search.md +++ b/docs/search.md @@ -113,8 +113,6 @@ Will make Ctrl + K focus the search bar for Windows users Sometimes you might have a page that you don't want to be indexed for the search nor to show up in search results, e.g., a 404 page. To exclude a page from search, add the `search_exclude: true` parameter to the page's YAML front matter: -#### Example - {: .no_toc } ```yaml @@ -158,7 +156,8 @@ By default, the search feature indexes a page's `.content`, `.title`, and *some* 2. Add a new file named `_includes/lunr/custom-data.json`. Insert custom Liquid code that reads your data (e.g. the page object at `include.page`) then generates custom Javascript fields that hold the custom data you want to index. Verify these fields in the generated `assets/js/search-data.json`. 3. Add a new file named `_includes/lunr/custom-index.js`. Insert custom Javascript code that reads your custom Javascript fields and inserts them into the search index. You may want to inspect `assets/js/just-the-docs.js` to better understand the code. -#### Example +### Example: adding custom `usage` and `examples` fields +{: .text-delta } This example adds front matter `usage` and `examples` fields to the search index. diff --git a/docs/ui-components/callouts.md b/docs/ui-components/callouts.md index bb3f41bcf6..bf6dee5007 100644 --- a/docs/ui-components/callouts.md +++ b/docs/ui-components/callouts.md @@ -22,8 +22,8 @@ When you have [configured]({% link docs/configuration.md %}#callouts) the `colo [^postfix]: You can put the callout markup either before or after its content. -#### An untitled callout -{: .no_toc } +## An untitled callout +{: .no_toc .text-delta } ```markdown {: .highlight } @@ -34,8 +34,8 @@ A paragraph A paragraph -#### A single paragraph callout -{: .no_toc } +## A single paragraph callout +{: .no_toc .text-delta } ```markdown {: .note } @@ -57,8 +57,8 @@ A paragraph > > A paragraph with a custom title callout -#### A multi-paragraph callout -{: .no_toc } +## A multi-paragraph callout +{: .no_toc .text-delta } ```markdown {: .important } @@ -96,8 +96,8 @@ A paragraph > > The last paragraph -#### An indented callout -{: .no_toc } +## An indented callout +{: .no_toc .text-delta } ```markdown > {: .highlight } @@ -107,8 +107,8 @@ A paragraph > {: .highlight } A paragraph -#### Indented multi-paragraph callouts -{: .no_toc } +## Indented multi-paragraph callouts +{: .no_toc .text-delta } ```markdown > {: .new } @@ -127,8 +127,8 @@ A paragraph > > The last paragraph -#### Nested callouts -{: .no_toc } +## Nested callouts +{: .no_toc .text-delta } ```markdown {: .important } @@ -140,8 +140,8 @@ A paragraph > {: .warning } > A paragraph -#### Opaque background -{: .no_toc } +## Opaque background +{: .no_toc .text-delta } ```markdown {: .important } diff --git a/docs/ui-components/code/index.md b/docs/ui-components/code/index.md index d4a70e20b7..bc3857d496 100644 --- a/docs/ui-components/code/index.md +++ b/docs/ui-components/code/index.md @@ -129,6 +129,8 @@ Once mermaid is installed, it can be used in markdown files. The markdown for a {% highlight markdown %} ```mermaid graph TD; + accTitle: the diamond pattern + accDescr: a graph with four nodes: A points to B and C, while B and C both point to D A-->B; A-->C; B-->D; @@ -140,6 +142,8 @@ which renders: ```mermaid graph TD; + accTitle: the diamond pattern + accDescr: a graph with four nodes: A points to B and C, while B and C both point to D A-->B; A-->C; B-->D; @@ -177,6 +181,8 @@ By default, AsciiDoc generates HTML markup that mermaid cannot properly parse. T ++++
 graph TD;
+    accTitle: the diamond pattern
+    accDescr: a graph with four nodes: A points to B and C, while B and C both point to D
     A-->B;
     A-->C;
     B-->D;
diff --git a/docs/utilities/layout.md b/docs/utilities/layout.md
index 65d371e957..13138e97ae 100644
--- a/docs/utilities/layout.md
+++ b/docs/utilities/layout.md
@@ -18,7 +18,7 @@ parent: Utilities
 
 These spacers are available to use for margins and padding with responsive utility classes. Combine these prefixes with a screen size and spacing scale to use them responsively.
 
-| Classname prefix | What it does                  |
+| Classname prefix | Related CSS Property          |
 |:-----------------|:------------------------------|
 | `.m-`            | `margin`                      |
 | `.mx-`           | `margin-left`, `margin-right` |
@@ -28,7 +28,7 @@ These spacers are available to use for margins and padding with responsive utili
 | `.mb-`           | `margin-bottom`               |
 | `.ml-`           | `margin-left`                 |
 
-| Classname prefix | What it does                    |
+| Classname prefix | Related CSS Property            |
 |:-----------------|:--------------------------------|
 | `.p-`            | `padding`                       |
 | `.px-`           | `padding-left`, `padding-right` |
@@ -54,8 +54,8 @@ Spacing values are based on a `1rem = 16px` spacing scale, broken down into thes
 
 Use `mx-auto` to horizontally center elements.
 
-#### Examples
-{: .no_toc }
+### Applying Spacing Utilities with `{: }`
+{: .no_toc .text-delta }
 
 In Markdown, use the `{: }` wrapper to apply custom classes:
 
@@ -69,7 +69,7 @@ This paragraph will have 2rem/32px of padding on the right and left at all scree
 
 ## Horizontal Alignment
 
-| Classname               | What it does                     |
+| CSS Class               | Applied CSS Declaration          |
 |:------------------------|:---------------------------------|
 | `.float-left`           | `float: left`                    |
 | `.float-right`          | `float: right`                   |
@@ -82,7 +82,7 @@ _Note: any of the `flex-` classes must be used on a parent element that has `d-f
 
 ## Vertical Alignment
 
-| Classname              | What it does                    |
+| CSS Class              | Applied CSS Declaration         |
 |:-----------------------|:--------------------------------|
 | `.v-align-baseline`    | `vertical-align: baseline`      |
 | `.v-align-bottom`      | `vertical-align: bottom`        |
@@ -95,7 +95,7 @@ _Note: any of the `flex-` classes must be used on a parent element that has `d-f
 
 Display classes aid in adapting the layout of the elements on a page:
 
-| Class             |                         |
+| CSS Class         | Applied CSS Declaration |
 |:------------------|:------------------------|
 | `.d-block`        | `display: block`        |
 | `.d-flex`         | `display: flex`         |
@@ -105,8 +105,8 @@ Display classes aid in adapting the layout of the elements on a page:
 
 Use these classes in conjunction with the responsive modifiers.
 
-#### Examples
-{: .no_toc }
+### Applying Display Utilities with `{: }`
+{: .no_toc .text-delta }
 
 In Markdown, use the `{: }` wrapper to apply custom classes:
 

From 3e6e3ab09aad56bb3ef1ed3783cec2ec55eca398 Mon Sep 17 00:00:00 2001
From: Matt Wang 
Date: Mon, 9 Sep 2024 12:59:48 -0700
Subject: [PATCH 04/12] Prep 0.10.0

---
 CHANGELOG.md                   | 32 +++++++++++++++++++++++++++++++-
 MIGRATION.md                   | 12 ++++++++++++
 docs/navigation/main/index.md  | 10 +++++-----
 docs/navigation/main/levels.md |  2 +-
 4 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index c70a0ca910..de0a061013 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,11 +17,41 @@ This website is built from the `HEAD` of the `main` branch of the theme reposito
 
 Code changes to `main` that are *not* in the latest release:
 
+- N/A
+
+Docs changes made since the latest release:
+
+- N/A
+
+## Release v0.10.0
+
+Hi folks! This minor release adds one of our most-requested features: unlimited multi-level navigation (also known as recursive navigation). Huge thanks to [@pdmosses] for his wonderful work in implementing this feature!
+
+This release should be a straightforward upgrade for all users of Just the Docs. Thank you for your continued support!
+
+### Using Release `v0.10.0`
+
+Users who have not pinned the theme version will be **automatically upgraded to `v0.9.0` the next time they build their site**.
+
+To use this release explicitly as a remote theme:
+
+```yml
+remote_theme: just-the-docs/just-the-docs@v0.10.0
+```
+
+To use this version explicitly as a gem-based theme, pin the version in your `Gemfile` and re-run `bundle install` or `bundle update just-the-docs`:
+
+```ruby
+gem "just-the-docs", "0.10.0"
+```
+
+To use and pin a previous version of the theme, replace the `0.10.0` with the desired release tag.
+
 ### New Features
 
 - Added: Allow unlimited multi-level navigation by [@pdmosses] in [#1431]
 
-Docs changes made since the latest release:
+### Documentation
 
 - Added: Allow unlimited multi-level navigation by [@pdmosses] in [#1440]
 - Added: sitemap (via `jekyll-sitemap` plugin) by [@mattxwang] in [#1530]
diff --git a/MIGRATION.md b/MIGRATION.md
index ee133cacf9..134f462465 100644
--- a/MIGRATION.md
+++ b/MIGRATION.md
@@ -43,6 +43,18 @@ This document contains instructions on how to migrate and upgrade Just the Docs
 
 [CHANGELOG]: {% link CHANGELOG.md %}
 
+## v0.9.x - v0.10.0
+
+There are no potentially-breaking changes in v0.10.0.
+
+## v0.8.x - v0.9.0
+
+There are no potentially-breaking changes in v0.9.0.
+
+## v0.7.x - v0.8.0
+
+There are no potentially-breaking changes in v0.8.0.
+
 ## v0.6.x - v0.7.0
 
 ### POTENTIALLY-BREAKING CHANGES in v0.7.0
diff --git a/docs/navigation/main/index.md b/docs/navigation/main/index.md
index 17edaff634..3f60e3b477 100644
--- a/docs/navigation/main/index.md
+++ b/docs/navigation/main/index.md
@@ -6,14 +6,14 @@ nav_order: 1
 
 # Main Navigation
 
-The main navigation for your Just the Docs site is at the left side of the page on large screens, and at the top (behind a tap) on small screens. 
+The main navigation for your Just the Docs site is at the left side of the page on large screens, and at the top (behind a tap) on small screens.
 
 You need to specify the `title` of each page in its front matter. Page titles are independent of file names and directory structure. The navigation uses the title of the page as an anchor for links to the page.
 
 By default, links to all pages appear in the main navigation at the top level, ordered alphabetically by their titles. By adding further fields to the front matter of individual pages, you can [change their order]({% link docs/navigation/main/order.md %}), [exclude pages]({% link docs/navigation/main/exclude.md %}), and change their [parent pages]({% link docs/navigation/main/levels.md %}).
 
 {: .new-title }
-> New (Multi-level)
+> New (v0.10.0)
 >
 > The main navigation can be structured as a multi-level menu of unlimited depth:
 > pages can always have child pages.
@@ -25,16 +25,16 @@ For the construction of the navigation display to work (and to avoid potential c
 * The title of each page must be different from the titles of all its child pages, and from the titles of their child pages, etc.
 
 {: .new-title }
-> New (Multi-level)
+> New (v0.10.0)
 >
 > If *all* the pages of your site have different titles, you need only to specify the `title` of each page, and the `parent` title of each lower-level page.[^1]
 
 [^1]: Previous versions of Just the Docs restricted the navigation to three levels. You also needed to specify `has_children: true` on all parent pages, and a `grand_parent` title on all grandchild pages. The `has_children` parameter is now redundant, and the `grand_parent` parameter can usually be omitted.
 
-If your site has pages with the same title, you need to avoid confusion when you reference that title as `parent` on other pages. When the pages with the same title have different `parent` pages, you can distinguish between them using the `grand_parent` parameter. 
+If your site has pages with the same title, you need to avoid confusion when you reference that title as `parent` on other pages. When the pages with the same title have different `parent` pages, you can distinguish between them using the `grand_parent` parameter.
 
 {: .new-title }
-> New (Multi-level)
+> New (v0.10.0)
 >
 > For deeper navigation structures, you can specify the title of a grandparent or higher level page as an `ancestor` title.
 
diff --git a/docs/navigation/main/levels.md b/docs/navigation/main/levels.md
index 6ed73b522e..38154e364f 100644
--- a/docs/navigation/main/levels.md
+++ b/docs/navigation/main/levels.md
@@ -63,7 +63,7 @@ nav_order: 2
 The Buttons page appears as a child of UI Components and appears second in the UI Components pages.
 
 {: .new-title }
-> New (Multi-level)
+> New (v0.10.0)
 >
 > The `has_children` field is now redundant (and ignored, except when significant for backwards compatibility).
 

From b20811368535305f269faa5cbcdd98a2550c8372 Mon Sep 17 00:00:00 2001
From: Matt Wang 
Date: Mon, 9 Sep 2024 13:00:15 -0700
Subject: [PATCH 05/12] 0.10.0

---
 Gemfile.lock          | 2 +-
 just-the-docs.gemspec | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 9f1e7be1c6..c6003544de 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,7 +1,7 @@
 PATH
   remote: .
   specs:
-    just-the-docs (0.9.0)
+    just-the-docs (0.10.0)
       jekyll (>= 3.8.5)
       jekyll-include-cache
       jekyll-seo-tag (>= 2.0)
diff --git a/just-the-docs.gemspec b/just-the-docs.gemspec
index 7affc9b767..30f38919d2 100644
--- a/just-the-docs.gemspec
+++ b/just-the-docs.gemspec
@@ -2,7 +2,7 @@
 
 Gem::Specification.new do |spec|
   spec.name          = "just-the-docs"
-  spec.version       = "0.9.0"
+  spec.version       = "0.10.0"
   spec.authors       = ["Patrick Marsceill", "Matthew Wang"]
   spec.email         = ["patrick.marsceill@gmail.com", "matt@matthewwang.me"]
 

From 96433368389c44f9552a9b622097a0e23f2c4f02 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 17 Sep 2024 12:31:21 -0700
Subject: [PATCH 06/12] Bump jekyll from 4.3.3 to 4.3.4 (#1537)

Bumps [jekyll](https://github.com/jekyll/jekyll) from 4.3.3 to 4.3.4.
- [Release notes](https://github.com/jekyll/jekyll/releases)
- [Changelog](https://github.com/jekyll/jekyll/blob/master/History.markdown)
- [Commits](https://github.com/jekyll/jekyll/compare/v4.3.3...v4.3.4)

---
updated-dependencies:
- dependency-name: jekyll
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 Gemfile.lock | 39 ++++++++++++++++++++-------------------
 1 file changed, 20 insertions(+), 19 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index c6003544de..e0fd6b638f 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -11,8 +11,8 @@ GEM
   remote: https://rubygems.org/
   specs:
     Ascii85 (1.1.0)
-    addressable (2.8.6)
-      public_suffix (>= 2.0.2, < 6.0)
+    addressable (2.8.7)
+      public_suffix (>= 2.0.2, < 7.0)
     afm (0.2.2)
     async (2.11.0)
       console (~> 1.25, >= 1.25.2)
@@ -21,7 +21,7 @@ GEM
       timers (~> 4.1)
     bigdecimal (3.1.8)
     colorator (1.1.0)
-    concurrent-ruby (1.2.3)
+    concurrent-ruby (1.3.4)
     console (1.25.2)
       fiber-annotation
       fiber-local (~> 1.1)
@@ -36,15 +36,18 @@ GEM
       faraday-net_http (>= 2.0, < 3.2)
     faraday-net_http (3.1.0)
       net-http
-    ffi (1.16.3)
+    ffi (1.17.0-arm64-darwin)
+    ffi (1.17.0-x86_64-linux-gnu)
     fiber-annotation (0.2.0)
     fiber-local (1.1.0)
       fiber-storage
     fiber-storage (0.1.0)
     forwardable-extended (2.6.0)
-    google-protobuf (4.26.1-arm64-darwin)
+    google-protobuf (4.28.1-arm64-darwin)
+      bigdecimal
       rake (>= 13)
-    google-protobuf (4.26.1-x86_64-linux)
+    google-protobuf (4.28.1-x86_64-linux)
+      bigdecimal
       rake (>= 13)
     hashery (2.1.2)
     html-proofer (5.0.9)
@@ -57,10 +60,10 @@ GEM
       yell (~> 2.0)
       zeitwerk (~> 2.5)
     http_parser.rb (0.8.0)
-    i18n (1.14.4)
+    i18n (1.14.6)
       concurrent-ruby (~> 1.0)
     io-event (1.5.1)
-    jekyll (4.3.3)
+    jekyll (4.3.4)
       addressable (~> 2.4)
       colorator (~> 1.0)
       em-websocket (~> 0.5)
@@ -116,26 +119,24 @@ GEM
       hashery (~> 2.0)
       ruby-rc4
       ttfunk
-    public_suffix (5.0.5)
+    public_suffix (6.0.1)
     racc (1.7.3)
     rainbow (3.1.1)
     rake (13.2.1)
     rb-fsevent (0.11.2)
-    rb-inotify (0.10.1)
+    rb-inotify (0.11.1)
       ffi (~> 1.0)
-    rexml (3.3.6)
-      strscan
-    rouge (4.2.1)
+    rexml (3.3.7)
+    rouge (4.4.0)
     ruby-rc4 (0.1.5)
     safe_yaml (1.0.5)
-    sass-embedded (1.75.0-arm64-darwin)
-      google-protobuf (>= 3.25, < 5.0)
-    sass-embedded (1.75.0-x86_64-linux-gnu)
-      google-protobuf (>= 3.25, < 5.0)
+    sass-embedded (1.78.0-arm64-darwin)
+      google-protobuf (~> 4.27)
+    sass-embedded (1.78.0-x86_64-linux-gnu)
+      google-protobuf (~> 4.27)
     sawyer (0.9.2)
       addressable (>= 2.3.5)
       faraday (>= 0.17.3, < 3)
-    strscan (3.1.0)
     terminal-table (3.0.2)
       unicode-display_width (>= 1.1.1, < 3)
     timers (4.3.5)
@@ -143,7 +144,7 @@ GEM
       bigdecimal (~> 3.1)
     typhoeus (1.4.1)
       ethon (>= 0.9.0)
-    unicode-display_width (2.5.0)
+    unicode-display_width (2.6.0)
     uri (0.13.0)
     webrick (1.8.1)
     yell (2.2.2)

From aeaa79cf274c85d68e914c145b6707ac7a918bfe Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 19 Sep 2024 10:33:36 -0700
Subject: [PATCH 07/12] Bump google-protobuf from 4.28.1 to 4.28.2 (#1538)

Bumps [google-protobuf](https://github.com/protocolbuffers/protobuf) from 4.28.1 to 4.28.2.
- [Release notes](https://github.com/protocolbuffers/protobuf/releases)
- [Changelog](https://github.com/protocolbuffers/protobuf/blob/main/protobuf_release.bzl)
- [Commits](https://github.com/protocolbuffers/protobuf/commits)

---
updated-dependencies:
- dependency-name: google-protobuf
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 Gemfile.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index e0fd6b638f..97b53d3a69 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -43,10 +43,10 @@ GEM
       fiber-storage
     fiber-storage (0.1.0)
     forwardable-extended (2.6.0)
-    google-protobuf (4.28.1-arm64-darwin)
+    google-protobuf (4.28.2-arm64-darwin)
       bigdecimal
       rake (>= 13)
-    google-protobuf (4.28.1-x86_64-linux)
+    google-protobuf (4.28.2-x86_64-linux)
       bigdecimal
       rake (>= 13)
     hashery (2.1.2)

From f5626b16a6c87576456735e593655b8a604a5b8e Mon Sep 17 00:00:00 2001
From: Matt Wang 
Date: Wed, 9 Oct 2024 01:25:18 -0700
Subject: [PATCH 08/12] Update CI language versions (#1549)

Bump main Ruby version to 3.3, change Node to 20.x (LTS)
---
 .github/workflows/ci.yml | 84 ++++++++++++++++++++--------------------
 1 file changed, 42 insertions(+), 42 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3954e53a5d..a441307a81 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -15,54 +15,54 @@ jobs:
       fail-fast: false
       matrix:
         jekyll-version: [3.9, 4.3]
-        os: [ ubuntu-latest, macos-latest, windows-latest ]
+        os: [ubuntu-latest, macos-latest, windows-latest]
         ruby-version: ["3.1", "3.2", "3.3"]
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v4
-    - name: Setup Ruby ${{ matrix.ruby-version }}
-      uses: ruby/setup-ruby@v1
-      with:
-        ruby-version: ${{ matrix.ruby-version }}
-        bundler-cache: false
-    - name: Bundle Install (Jekyll ${{ matrix.jekyll-version }})
-      run: bundle install
-      env:
-        BUNDLE_GEMFILE: fixtures/Gemfile-jekyll-${{ matrix.jekyll-version }}
-    - name: Init Search
-      run: bundle exec rake search:init
-      env:
-        BUNDLE_GEMFILE: fixtures/Gemfile-jekyll-${{ matrix.jekyll-version }}
-    - name: Build Site
-      run: bundle exec jekyll build
-      env:
-        BUNDLE_GEMFILE: fixtures/Gemfile-jekyll-${{ matrix.jekyll-version }}
+      - uses: actions/checkout@v4
+      - name: Setup Ruby ${{ matrix.ruby-version }}
+        uses: ruby/setup-ruby@v1
+        with:
+          ruby-version: ${{ matrix.ruby-version }}
+          bundler-cache: false
+      - name: Bundle Install (Jekyll ${{ matrix.jekyll-version }})
+        run: bundle install
+        env:
+          BUNDLE_GEMFILE: fixtures/Gemfile-jekyll-${{ matrix.jekyll-version }}
+      - name: Init Search
+        run: bundle exec rake search:init
+        env:
+          BUNDLE_GEMFILE: fixtures/Gemfile-jekyll-${{ matrix.jekyll-version }}
+      - name: Build Site
+        run: bundle exec jekyll build
+        env:
+          BUNDLE_GEMFILE: fixtures/Gemfile-jekyll-${{ matrix.jekyll-version }}
 
   github-pages-build:
     name: Build (github-pages gem)
     runs-on: ubuntu-latest
     steps:
-    - uses: actions/checkout@v4
-    - name: Setup Ruby
-      uses: ruby/setup-ruby@v1
-      with:
-        ruby-version: "3.2"
-        bundler-cache: false
-    - name: Bundle Install
-      run: bundle install
-      env:
-        BUNDLE_GEMFILE: fixtures/Gemfile-github-pages
-    - name: Build Site
-      run: bundle exec jekyll build
-      env:
-        BUNDLE_GEMFILE: fixtures/Gemfile-github-pages
+      - uses: actions/checkout@v4
+      - name: Setup Ruby
+        uses: ruby/setup-ruby@v1
+        with:
+          ruby-version: "3.3"
+          bundler-cache: false
+      - name: Bundle Install
+        run: bundle install
+        env:
+          BUNDLE_GEMFILE: fixtures/Gemfile-github-pages
+      - name: Build Site
+        run: bundle exec jekyll build
+        env:
+          BUNDLE_GEMFILE: fixtures/Gemfile-github-pages
 
   validate:
     name: Validate HTML
     strategy:
       fail-fast: false
       matrix:
-        ruby-version: ["3.2"]
+        ruby-version: ["3.3"]
     runs-on: ubuntu-latest
 
     steps:
@@ -96,13 +96,13 @@ jobs:
 
     strategy:
       matrix:
-        node-version: [18.x]
+        node-version: [20.x]
 
     steps:
-    - uses: actions/checkout@v4
-    - name: Use Node.js ${{ matrix.node-version }}
-      uses: actions/setup-node@v3
-      with:
-        node-version: ${{ matrix.node-version }}
-    - run: npm install
-    - run: npm test
+      - uses: actions/checkout@v4
+      - name: Use Node.js ${{ matrix.node-version }}
+        uses: actions/setup-node@v3
+        with:
+          node-version: ${{ matrix.node-version }}
+      - run: npm install
+      - run: npm test

From e97355444ca1b0f92e54f38e9f4c0e4a31dc88a1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 21 Oct 2024 11:49:22 -0700
Subject: [PATCH 09/12] Bump stylelint from 16.9.0 to 16.10.0 (#1554)

Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.9.0 to 16.10.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.9.0...16.10.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 package-lock.json | 246 ++++++++++++++++++++++++----------------------
 package.json      |   2 +-
 2 files changed, 128 insertions(+), 120 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 46d3d0ce71..09cbb609b2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,7 +11,7 @@
       "devDependencies": {
         "npm-run-all": "^4.1.5",
         "prettier": "^3.3.3",
-        "stylelint": "^16.9.0",
+        "stylelint": "^16.10.0",
         "stylelint-config-standard-scss": "^13.1.0"
       }
     },
@@ -199,18 +199,6 @@
         "url": "https://github.com/sponsors/epoberezkin"
       }
     },
-    "node_modules/ansi-regex": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
-      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
     "node_modules/ansi-styles": {
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -408,9 +396,9 @@
       }
     },
     "node_modules/css-functions-list": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
-      "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
+      "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
       "dev": true,
       "engines": {
         "node": ">=12 || >=16"
@@ -442,12 +430,12 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
-      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
       "dev": true,
       "dependencies": {
-        "ms": "2.1.2"
+        "ms": "^2.1.3"
       },
       "engines": {
         "node": ">=6.0"
@@ -644,9 +632,9 @@
       }
     },
     "node_modules/file-entry-cache": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz",
-      "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==",
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz",
+      "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==",
       "dev": true,
       "dependencies": {
         "flat-cache": "^5.0.0"
@@ -1446,9 +1434,9 @@
       }
     },
     "node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
       "dev": true
     },
     "node_modules/nanoid": {
@@ -1653,9 +1641,9 @@
       }
     },
     "node_modules/picocolors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
-      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+      "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
       "dev": true
     },
     "node_modules/picomatch": {
@@ -1692,9 +1680,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.4.41",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz",
-      "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==",
+      "version": "8.4.47",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+      "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
       "dev": true,
       "funding": [
         {
@@ -1712,8 +1700,8 @@
       ],
       "dependencies": {
         "nanoid": "^3.3.7",
-        "picocolors": "^1.0.1",
-        "source-map-js": "^1.2.0"
+        "picocolors": "^1.1.0",
+        "source-map-js": "^1.2.1"
       },
       "engines": {
         "node": "^10 || ^12 || >=14"
@@ -1732,9 +1720,9 @@
       "dev": true
     },
     "node_modules/postcss-safe-parser": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
-      "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz",
+      "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==",
       "dev": true,
       "funding": [
         {
@@ -2052,9 +2040,9 @@
       "dev": true
     },
     "node_modules/source-map-js": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
-      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
@@ -2172,21 +2160,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-      }
-    },
     "node_modules/strip-bom": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -2197,9 +2170,9 @@
       }
     },
     "node_modules/stylelint": {
-      "version": "16.9.0",
-      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz",
-      "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==",
+      "version": "16.10.0",
+      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.10.0.tgz",
+      "integrity": "sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==",
       "dev": true,
       "funding": [
         {
@@ -2220,17 +2193,17 @@
         "balanced-match": "^2.0.0",
         "colord": "^2.9.3",
         "cosmiconfig": "^9.0.0",
-        "css-functions-list": "^3.2.2",
-        "css-tree": "^2.3.1",
-        "debug": "^4.3.6",
+        "css-functions-list": "^3.2.3",
+        "css-tree": "^3.0.0",
+        "debug": "^4.3.7",
         "fast-glob": "^3.3.2",
         "fastest-levenshtein": "^1.0.16",
-        "file-entry-cache": "^9.0.0",
+        "file-entry-cache": "^9.1.0",
         "global-modules": "^2.0.0",
         "globby": "^11.1.0",
         "globjoin": "^0.1.4",
         "html-tags": "^3.3.1",
-        "ignore": "^5.3.2",
+        "ignore": "^6.0.2",
         "imurmurhash": "^0.1.4",
         "is-plain-object": "^5.0.0",
         "known-css-properties": "^0.34.0",
@@ -2239,14 +2212,13 @@
         "micromatch": "^4.0.8",
         "normalize-path": "^3.0.0",
         "picocolors": "^1.0.1",
-        "postcss": "^8.4.41",
+        "postcss": "^8.4.47",
         "postcss-resolve-nested-selector": "^0.1.6",
-        "postcss-safe-parser": "^7.0.0",
+        "postcss-safe-parser": "^7.0.1",
         "postcss-selector-parser": "^6.1.2",
         "postcss-value-parser": "^4.2.0",
         "resolve-from": "^5.0.0",
         "string-width": "^4.2.3",
-        "strip-ansi": "^7.1.0",
         "supports-hyperlinks": "^3.1.0",
         "svg-tags": "^1.0.0",
         "table": "^6.8.2",
@@ -2372,6 +2344,34 @@
         "stylelint": "^16.0.2"
       }
     },
+    "node_modules/stylelint/node_modules/css-tree": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.0.tgz",
+      "integrity": "sha512-o88DVQ6GzsABn1+6+zo2ct801dBO5OASVyxbbvA2W20ue2puSh/VOuqUj90eUeMSX/xqGqBmOKiRQN7tJOuBXw==",
+      "dev": true,
+      "dependencies": {
+        "mdn-data": "2.10.0",
+        "source-map-js": "^1.0.1"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+      }
+    },
+    "node_modules/stylelint/node_modules/ignore": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
+      "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/stylelint/node_modules/mdn-data": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.10.0.tgz",
+      "integrity": "sha512-qq7C3EtK3yJXMwz1zAab65pjl+UhohqMOctTgcqjLOWABqmwj+me02LSsCuEUxnst9X1lCBpoE0WArGKgdGDzw==",
+      "dev": true
+    },
     "node_modules/supports-color": {
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -2695,12 +2695,6 @@
         "require-from-string": "^2.0.2"
       }
     },
-    "ansi-regex": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
-      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
-      "dev": true
-    },
     "ansi-styles": {
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -2855,9 +2849,9 @@
       }
     },
     "css-functions-list": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
-      "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
+      "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
       "dev": true
     },
     "css-tree": {
@@ -2877,12 +2871,12 @@
       "dev": true
     },
     "debug": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
-      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
       "dev": true,
       "requires": {
-        "ms": "2.1.2"
+        "ms": "^2.1.3"
       }
     },
     "define-properties": {
@@ -3035,9 +3029,9 @@
       }
     },
     "file-entry-cache": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz",
-      "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==",
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz",
+      "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==",
       "dev": true,
       "requires": {
         "flat-cache": "^5.0.0"
@@ -3618,9 +3612,9 @@
       }
     },
     "ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
       "dev": true
     },
     "nanoid": {
@@ -3768,9 +3762,9 @@
       "dev": true
     },
     "picocolors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
-      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+      "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
       "dev": true
     },
     "picomatch": {
@@ -3792,14 +3786,14 @@
       "dev": true
     },
     "postcss": {
-      "version": "8.4.41",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz",
-      "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==",
+      "version": "8.4.47",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+      "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
       "dev": true,
       "requires": {
         "nanoid": "^3.3.7",
-        "picocolors": "^1.0.1",
-        "source-map-js": "^1.2.0"
+        "picocolors": "^1.1.0",
+        "source-map-js": "^1.2.1"
       }
     },
     "postcss-media-query-parser": {
@@ -3815,9 +3809,9 @@
       "dev": true
     },
     "postcss-safe-parser": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
-      "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz",
+      "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==",
       "dev": true,
       "requires": {}
     },
@@ -3998,9 +3992,9 @@
       }
     },
     "source-map-js": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
-      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
       "dev": true
     },
     "spdx-correct": {
@@ -4096,15 +4090,6 @@
         "es-abstract": "^1.20.4"
       }
     },
-    "strip-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^6.0.1"
-      }
-    },
     "strip-bom": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -4112,9 +4097,9 @@
       "dev": true
     },
     "stylelint": {
-      "version": "16.9.0",
-      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz",
-      "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==",
+      "version": "16.10.0",
+      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.10.0.tgz",
+      "integrity": "sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==",
       "dev": true,
       "requires": {
         "@csstools/css-parser-algorithms": "^3.0.1",
@@ -4125,17 +4110,17 @@
         "balanced-match": "^2.0.0",
         "colord": "^2.9.3",
         "cosmiconfig": "^9.0.0",
-        "css-functions-list": "^3.2.2",
-        "css-tree": "^2.3.1",
-        "debug": "^4.3.6",
+        "css-functions-list": "^3.2.3",
+        "css-tree": "^3.0.0",
+        "debug": "^4.3.7",
         "fast-glob": "^3.3.2",
         "fastest-levenshtein": "^1.0.16",
-        "file-entry-cache": "^9.0.0",
+        "file-entry-cache": "^9.1.0",
         "global-modules": "^2.0.0",
         "globby": "^11.1.0",
         "globjoin": "^0.1.4",
         "html-tags": "^3.3.1",
-        "ignore": "^5.3.2",
+        "ignore": "^6.0.2",
         "imurmurhash": "^0.1.4",
         "is-plain-object": "^5.0.0",
         "known-css-properties": "^0.34.0",
@@ -4144,18 +4129,41 @@
         "micromatch": "^4.0.8",
         "normalize-path": "^3.0.0",
         "picocolors": "^1.0.1",
-        "postcss": "^8.4.41",
+        "postcss": "^8.4.47",
         "postcss-resolve-nested-selector": "^0.1.6",
-        "postcss-safe-parser": "^7.0.0",
+        "postcss-safe-parser": "^7.0.1",
         "postcss-selector-parser": "^6.1.2",
         "postcss-value-parser": "^4.2.0",
         "resolve-from": "^5.0.0",
         "string-width": "^4.2.3",
-        "strip-ansi": "^7.1.0",
         "supports-hyperlinks": "^3.1.0",
         "svg-tags": "^1.0.0",
         "table": "^6.8.2",
         "write-file-atomic": "^5.0.1"
+      },
+      "dependencies": {
+        "css-tree": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.0.tgz",
+          "integrity": "sha512-o88DVQ6GzsABn1+6+zo2ct801dBO5OASVyxbbvA2W20ue2puSh/VOuqUj90eUeMSX/xqGqBmOKiRQN7tJOuBXw==",
+          "dev": true,
+          "requires": {
+            "mdn-data": "2.10.0",
+            "source-map-js": "^1.0.1"
+          }
+        },
+        "ignore": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
+          "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+          "dev": true
+        },
+        "mdn-data": {
+          "version": "2.10.0",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.10.0.tgz",
+          "integrity": "sha512-qq7C3EtK3yJXMwz1zAab65pjl+UhohqMOctTgcqjLOWABqmwj+me02LSsCuEUxnst9X1lCBpoE0WArGKgdGDzw==",
+          "dev": true
+        }
       }
     },
     "stylelint-config-recommended": {
diff --git a/package.json b/package.json
index eccdf500f2..ef5d7017b7 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
   "devDependencies": {
     "npm-run-all": "^4.1.5",
     "prettier": "^3.3.3",
-    "stylelint": "^16.9.0",
+    "stylelint": "^16.10.0",
     "stylelint-config-standard-scss": "^13.1.0"
   },
   "scripts": {

From 365a2ce86a808f8cd67a9f3c1cc8ea46561528eb Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 28 Oct 2024 23:40:55 -0700
Subject: [PATCH 10/12] Bump rexml from 3.3.7 to 3.3.9 (#1561)

Bumps [rexml](https://github.com/ruby/rexml) from 3.3.7 to 3.3.9.
- [Release notes](https://github.com/ruby/rexml/releases)
- [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md)
- [Commits](https://github.com/ruby/rexml/compare/v3.3.7...v3.3.9)

---
updated-dependencies:
- dependency-name: rexml
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 97b53d3a69..8d57c0b642 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -126,7 +126,7 @@ GEM
     rb-fsevent (0.11.2)
     rb-inotify (0.11.1)
       ffi (~> 1.0)
-    rexml (3.3.7)
+    rexml (3.3.9)
     rouge (4.4.0)
     ruby-rc4 (0.1.5)
     safe_yaml (1.0.5)

From a7af8a249edc24fc9e7894d5ab1b41b87b561882 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 28 Oct 2024 23:50:30 -0700
Subject: [PATCH 11/12] Bump webrick from 1.8.1 to 1.8.2 (#1550)

Bumps [webrick](https://github.com/ruby/webrick) from 1.8.1 to 1.8.2.
- [Release notes](https://github.com/ruby/webrick/releases)
- [Commits](https://github.com/ruby/webrick/compare/v1.8.1...v1.8.2)

---
updated-dependencies:
- dependency-name: webrick
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 8d57c0b642..fa6408c618 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -146,7 +146,7 @@ GEM
       ethon (>= 0.9.0)
     unicode-display_width (2.6.0)
     uri (0.13.0)
-    webrick (1.8.1)
+    webrick (1.8.2)
     yell (2.2.2)
     zeitwerk (2.6.13)
 

From 243e7259666f78e177c7e6d1e0b783b0bea81f51 Mon Sep 17 00:00:00 2001
From: Henry Fredrick Schreiner 
Date: Sat, 30 Jan 2021 18:53:22 -0500
Subject: [PATCH 12/12] feat: support automatic selectable dark theme

---
 assets/js/just-the-docs.js | 21 +++++++++++++++++++++
 docs/customization.md      | 14 +++++++++-----
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/assets/js/just-the-docs.js b/assets/js/just-the-docs.js
index d249b6d3c2..cc08ba1ec8 100644
--- a/assets/js/just-the-docs.js
+++ b/assets/js/just-the-docs.js
@@ -615,4 +615,25 @@ jtd.onReady(function(){
 
 })(window.jtd = window.jtd || {});
 
+{% if site.dark_color_scheme and site.dark_color_scheme != 'nil' -%}
+    if (window.matchMedia) {
+        window.matchMedia('(prefers-color-scheme: dark)')
+              .addEventListener('change', event => {
+          if (event.matches) {
+              jtd.setTheme('{{site.dark_color_scheme}}');
+          } else {
+              {% if site.color_scheme and site.color_scheme != 'nil' -%}
+                  jtd.setTheme('{{site.color_scheme}}');
+              {% else -%}
+                  jtd.setTheme('light');
+              {%- endif %}
+          }
+        });
+
+        if(window.matchMedia('(prefers-color-scheme: dark)').matches) {
+            jtd.setTheme('{{site.dark_color_scheme}}');
+        }
+    }
+{%- endif %}
+
 {% include js/custom.js %}
diff --git a/docs/customization.md b/docs/customization.md
index 61ec820a92..b0621756fe 100644
--- a/docs/customization.md
+++ b/docs/customization.md
@@ -44,14 +44,18 @@ jtd.addEvent(toggleDarkMode, 'click', function(){
 });
 
 
-### deprecated: `legacy_light`
-{: .d-inline-block .no_toc }
+### Automatic color scheme
 
-New (v0.4.2)
-{: .label .label-green }
+If you want your site to react to the user's system light/dark selection, define the `dark_color_scheme` parameter. This will enable automatic switching between `color_scheme` for light mode and `dark_color_scheme` for dark mode.
 
+#### Example
+{: .no_toc}
 
-In Just the Docs version `0.4.2`, we changed the default syntax highlighting theme for the `light` color scheme to have higher contrast. Users who want to use the old highlighting need to explicitly opt-in with the deprecated `legacy_light` color scheme. In a future major release of Just the Docs, we will remove this color scheme.
+```yaml
+color_scheme: light
+# Automatically switch to this when a user has a system dark mode enabled
+dark_color_scheme: dark
+```
 
 ## Custom schemes