Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-pydata-sphinx-theme for 
openSUSE:Factory checked in at 2026-09-04 12:40:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pydata-sphinx-theme (Old)
 and      /work/SRC/openSUSE:Factory/.python-pydata-sphinx-theme.new.1265 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pydata-sphinx-theme"

Fri Sep  4 12:40:50 2026 rev:12 rq:1375595 version:0.21.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-pydata-sphinx-theme/python-pydata-sphinx-theme.changes
    2026-06-30 15:14:52.758980925 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-pydata-sphinx-theme.new.1265/python-pydata-sphinx-theme.changes
  2026-09-04 12:42:02.124009127 +0200
@@ -1,0 +2,36 @@
+Thu Sep  3 09:20:25 UTC 2026 - Daniel Garcia <[email protected]>
+
+- Change js vendoring to use node_modules obs service instead of a
+  custom script
+- Update to 0.21.0
+  # Breaking
+  - None.
+
+  # Fixes
+  - Fix navbar rendering for special pages in toctree
+  - Fix empty search page when search_as_you_type and dirhtml is used
+  - Tox run a11y-tests correctly defaults to chromium ; add doc to run a 
single test.
+  - fix: correct typo in source
+  - fix: don't share sidebars between pages with non-flat output URIs
+  - Prevent "Back to Top" button from being cropped on firefox/android
+
+  # Improvements
+  - Add helper release script to bump version
+  - Add GALACTIC documentation link to gallery
+  - Avoid redundant processing when collapse_navigation=False
+  - refactor: drop user-select rule superseded by Sphinx's basic.css
+
+- 0.20.0
+  # Breaking
+  - Drop Sphinx <= 8.1, Python <= 3.10
+
+  # Fixes
+  - Fix relative json_url on home page when using dirhtml builder
+  - Fix content of sidebar shifting vertically on page load
+  - Fix broken link in our example gallery and replace it with another one
+
+  # Internal tooling
+  - Unpin internal actions
+  - Fix incorrect tox env name in prerelease docs build step
+
+-------------------------------------------------------------------

Old:
----
  prepare_vendor.sh
  pydata-sphinx-theme-0.19.0.tar.gz
  python-pydata-sphinx-theme-0.19.0-vendor-licenses.txt
  python-pydata-sphinx-theme-0.19.0-vendor.tar.xz

New:
----
  _service
  node_modules.obscpio
  node_modules.spec.inc
  package-lock.json
  pydata-sphinx-theme-0.21.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-pydata-sphinx-theme.spec ++++++
--- /var/tmp/diff_new_pack.IOk9Uf/_old  2026-09-04 12:42:03.807068234 +0200
+++ /var/tmp/diff_new_pack.IOk9Uf/_new  2026-09-04 12:42:03.808068269 +0200
@@ -19,31 +19,33 @@
 %define skip_python36 1
 %{?sle15_python_module_pythons}
 Name:           python-pydata-sphinx-theme
-Version:        0.19.0
+Version:        0.21.0
 Release:        0
 Summary:        Bootstrap-based Sphinx theme from the PyData community
 License:        BSD-3-Clause
 URL:            https://github.com/pydata/pydata-sphinx-theme
 Source:         
https://files.pythonhosted.org/packages/source/p/pydata-sphinx-theme/pydata_sphinx_theme-%{version}.tar.gz#/pydata-sphinx-theme-%{version}.tar.gz
-# Source1 and Source2 created with ./prepare_vendor.sh
-Source1:        python-pydata-sphinx-theme-%{version}-vendor.tar.xz
-Source2:        python-pydata-sphinx-theme-%{version}-vendor-licenses.txt
-Source99:       prepare_vendor.sh
+# package-lock.json file generated with command:
+# npm install --package-lock-only --legacy-peer-deps --ignore-scripts
+Source1:        package-lock.json
+# node_modules generated using "osc service mr" with the 
https://github.com/openSUSE/obs-service-node_modules
+Source2:        node_modules.spec.inc
+%include        %{_sourcedir}/node_modules.spec.inc
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  %{python_module sphinx-theme-builder}
 BuildRequires:  %{python_module wheel}
 BuildRequires:  fdupes
+BuildRequires:  local-npm-registry
 BuildRequires:  python-rpm-macros
 Requires:       python-Babel
+Requires:       python-Jinja2
 Requires:       python-Sphinx
 Requires:       python-accessible-pygments
 Requires:       python-beautifulsoup4
 Requires:       python-docutils
-Requires:       python-packaging
 Requires:       python-pygments
-Requires:       python-sphinx-theme-builder
-Requires:       python-typing_extensions
+Requires:       python-requests
 Suggests:       python-beautifulsoup4
 Suggests:       python-codecov
 Suggests:       python-docutils
@@ -63,10 +65,8 @@
 BuildRequires:  %{python_module accessible-pygments}
 BuildRequires:  %{python_module beautifulsoup4}
 BuildRequires:  %{python_module docutils}
-BuildRequires:  %{python_module packaging}
 BuildRequires:  %{python_module pytest-regressions}
 BuildRequires:  %{python_module pytest}
-BuildRequires:  %{python_module typing_extensions}
 BuildRequires:  nodejs-default
 BuildRequires:  nodejs-devel
 BuildRequires:  nodejs-packaging
@@ -79,21 +79,14 @@
 Bootstrap-based Sphinx theme from the PyData community
 
 %prep
-%autosetup -p1 -n pydata_sphinx_theme-%{version} -a1
+%autosetup -p1 -n pydata_sphinx_theme-%{version}
 sed -i 's,^\(node-version = \)".*",\1"%{nodejs_version}",' pyproject.toml
-
-# Create a node header tarball so we don't try to download it
-mkdir -p node-v%{nodejs_version}/include
-cp -a %{_includedir}/node* node-v%{nodejs_version}/include/node
-tar czf node-v%{nodejs_version}-headers.tar.gz node-v%{nodejs_version}
-echo "tarball=\"$PWD/node-v%{nodejs_version}-headers.tar.gz\"" > .npmrc
+local-npm-registry %{_sourcedir} install --include=dev --include=peer
 
 %build
 export STB_USE_SYSTEM_NODE=1
 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
-export YARN_CACHE_FOLDER="$PWD/.package-cache"
 export NODE_OPTIONS=--openssl-legacy-provider
-yarn install --offline
 
 # nodeenv generated with python3, no need to generate a different
 # nodeenv for each flavor

++++++ _service ++++++
<services>
  <service name="node_modules" mode="manual">
    <param name="cpio">node_modules.obscpio</param>
    <param name="output">node_modules.spec.inc</param>
    <param name="source-offset">10000</param>
  </service>
</services>

++++++ node_modules.spec.inc ++++++
Source10000:         
https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz#/@babel-code-frame-7.29.7.tgz
Source10001:         
https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#/@babel-helper-validator-identifier-7.29.7.tgz
Source10002:         
https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz#/@cacheable-memory-2.2.0.tgz
Source10003:         
https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz#/@cacheable-utils-2.5.0.tgz
Source10004:         
https://registry.npmjs.org/@colordx/core/-/core-5.8.0.tgz#/@colordx-core-5.8.0.tgz
Source10005:         
https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#/@csstools-css-parser-algorithms-3.0.5.tgz
Source10006:         
https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.12.tgz#/@csstools-css-syntax-patches-for-csstree-1.1.12.tgz
Source10007:         
https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#/@csstools-css-tokenizer-3.0.4.tgz
Source10008:         
https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#/@csstools-media-query-list-parser-4.0.3.tgz
Source10009:         
https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz#/@csstools-selector-specificity-5.0.0.tgz
Source10010:         
https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#/@discoveryjs-json-ext-0.5.7.tgz
Source10011:         
https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz#/@dual-bundle-import-meta-resolve-4.2.1.tgz
Source10012:         
https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.3.1.tgz#/@fortawesome-fontawesome-free-7.3.1.tgz
Source10013:         
https://registry.npmjs.org/@jest/pattern/-/pattern-30.5.0.tgz#/@jest-pattern-30.5.0.tgz
Source10014:         
https://registry.npmjs.org/@jest/schemas/-/schemas-30.5.0.tgz#/@jest-schemas-30.5.0.tgz
Source10015:         
https://registry.npmjs.org/@jest/types/-/types-30.5.1.tgz#/@jest-types-30.5.1.tgz
Source10016:         
https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#/@jridgewell-gen-mapping-0.3.13.tgz
Source10017:         
https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#/@jridgewell-resolve-uri-3.1.2.tgz
Source10018:         
https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz#/@jridgewell-source-map-0.3.11.tgz
Source10019:         
https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz#/@jridgewell-sourcemap-codec-1.6.0.tgz
Source10020:         
https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#/@jridgewell-trace-mapping-0.3.31.tgz
Source10021:         
https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz#/@keyv-bigmap-1.3.1.tgz
Source10022:         
https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz#/@keyv-serialize-1.1.1.tgz
Source10023:         
https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#/@nodelib-fs.scandir-2.1.5.tgz
Source10024:         
https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#/@nodelib-fs.stat-2.0.5.tgz
Source10025:         
https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#/@nodelib-fs.walk-1.2.8.tgz
Source10026:         
https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz#/@parcel-watcher-2.6.0.tgz
Source10027:         
https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz#/@parcel-watcher-android-arm64-2.6.0.tgz
Source10028:         
https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz#/@parcel-watcher-darwin-arm64-2.6.0.tgz
Source10029:         
https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz#/@parcel-watcher-darwin-x64-2.6.0.tgz
Source10030:         
https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz#/@parcel-watcher-freebsd-x64-2.6.0.tgz
Source10031:         
https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz#/@parcel-watcher-linux-arm-glibc-2.6.0.tgz
Source10032:         
https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz#/@parcel-watcher-linux-arm-musl-2.6.0.tgz
Source10033:         
https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz#/@parcel-watcher-linux-arm64-glibc-2.6.0.tgz
Source10034:         
https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz#/@parcel-watcher-linux-arm64-musl-2.6.0.tgz
Source10035:         
https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz#/@parcel-watcher-linux-x64-glibc-2.6.0.tgz
Source10036:         
https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz#/@parcel-watcher-linux-x64-musl-2.6.0.tgz
Source10037:         
https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz#/@parcel-watcher-win32-arm64-2.6.0.tgz
Source10038:         
https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz#/@parcel-watcher-win32-x64-2.6.0.tgz
Source10039:         
https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz#/@polka-url-1.0.0-next.29.tgz
Source10040:         
https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz#/@popperjs-core-2.11.8.tgz
Source10041:         
https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz#/@sinclair-typebox-0.34.52.tgz
Source10042:         
https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz#/@types-estree-1.0.9.tgz
Source10043:         
https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#/@types-html-minifier-terser-6.1.0.tgz
Source10044:         
https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#/@types-istanbul-lib-coverage-2.0.6.tgz
Source10045:         
https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#/@types-istanbul-lib-report-3.0.3.tgz
Source10046:         
https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#/@types-istanbul-reports-3.0.4.tgz
Source10047:         
https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz#/@types-json-schema-7.0.15.tgz
Source10048:         
https://registry.npmjs.org/@types/node/-/node-26.4.1.tgz#/@types-node-26.4.1.tgz
Source10049:         
https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz#/@types-yargs-17.0.35.tgz
Source10050:         
https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#/@types-yargs-parser-21.0.3.tgz
Source10051:         
https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz#/@ungap-structured-clone-1.4.0.tgz
Source10052:         
https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz#/@webassemblyjs-ast-1.14.1.tgz
Source10053:         
https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#/@webassemblyjs-floating-point-hex-parser-1.13.2.tgz
Source10054:         
https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#/@webassemblyjs-helper-api-error-1.13.2.tgz
Source10055:         
https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#/@webassemblyjs-helper-buffer-1.14.1.tgz
Source10056:         
https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#/@webassemblyjs-helper-numbers-1.13.2.tgz
Source10057:         
https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#/@webassemblyjs-helper-wasm-bytecode-1.13.2.tgz
Source10058:         
https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#/@webassemblyjs-helper-wasm-section-1.14.1.tgz
Source10059:         
https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#/@webassemblyjs-ieee754-1.13.2.tgz
Source10060:         
https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#/@webassemblyjs-leb128-1.13.2.tgz
Source10061:         
https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#/@webassemblyjs-utf8-1.13.2.tgz
Source10062:         
https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#/@webassemblyjs-wasm-edit-1.14.1.tgz
Source10063:         
https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#/@webassemblyjs-wasm-gen-1.14.1.tgz
Source10064:         
https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#/@webassemblyjs-wasm-opt-1.14.1.tgz
Source10065:         
https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#/@webassemblyjs-wasm-parser-1.14.1.tgz
Source10066:         
https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#/@webassemblyjs-wast-printer-1.14.1.tgz
Source10067:         
https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz#/@webpack-cli-configtest-2.1.1.tgz
Source10068:         
https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz#/@webpack-cli-info-2.0.2.tgz
Source10069:         
https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz#/@webpack-cli-serve-2.0.5.tgz
Source10070:         
https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#/@xtuc-ieee754-1.2.0.tgz
Source10071:         
https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz#/@xtuc-long-4.2.2.tgz
Source10072:         
https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz#/acorn-8.18.0.tgz
Source10073:         
https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz#/acorn-walk-8.3.5.tgz
Source10074:         
https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#/adjust-sourcemap-loader-4.0.0.tgz
Source10075:         
https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz#/ajv-6.15.0.tgz
Source10076:         
https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz#/ajv-8.20.0.tgz
Source10077:         
https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz#/ajv-formats-2.1.1.tgz
Source10078:         
https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz#/ajv-keywords-3.5.2.tgz
Source10079:         
https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz#/ajv-keywords-5.1.0.tgz
Source10080:         
https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#/ansi-regex-5.0.1.tgz
Source10081:         
https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#/ansi-styles-4.3.0.tgz
Source10082:         
https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#/argparse-2.0.1.tgz
Source10083:         
https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#/array-union-2.1.0.tgz
Source10084:         
https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz#/astral-regex-2.0.0.tgz
Source10085:         
https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz#/axe-core-4.13.0.tgz
Source10086:         
https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz#/balanced-match-2.0.0.tgz
Source10087:         
https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz#/baseline-browser-mapping-2.11.20.tgz
Source10088:         
https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz#/big.js-5.2.2.tgz
Source10089:         
https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#/boolbase-1.0.0.tgz
Source10090:         
https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz#/bootstrap-5.3.8.tgz
Source10091:         
https://registry.npmjs.org/braces/-/braces-3.0.3.tgz#/braces-3.0.3.tgz
Source10092:         
https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz#/browserslist-4.28.8.tgz
Source10093:         
https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#/buffer-from-1.1.2.tgz
Source10094:         
https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz#/cacheable-2.5.0.tgz
Source10095:         
https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#/callsites-3.1.0.tgz
Source10096:         
https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz#/camel-case-4.1.2.tgz
Source10097:         
https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz#/caniuse-api-3.0.0.tgz
Source10098:         
https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz#/caniuse-lite-1.0.30001810.tgz
Source10099:         
https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#/chalk-4.1.2.tgz
Source10100:         
https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz#/chokidar-5.0.0.tgz
Source10101:         
https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#/chrome-trace-event-1.0.4.tgz
Source10102:         
https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz#/ci-info-4.4.0.tgz
Source10103:         
https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz#/clean-css-5.3.3.tgz
Source10104:         
https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz#/clone-deep-4.0.1.tgz
Source10105:         
https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#/color-convert-2.0.1.tgz
Source10106:         
https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#/color-name-1.1.4.tgz
Source10107:         
https://registry.npmjs.org/colord/-/colord-2.10.0.tgz#/colord-2.10.0.tgz
Source10108:         
https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz#/colorette-2.0.20.tgz
Source10109:         
https://registry.npmjs.org/commander/-/commander-10.0.1.tgz#/commander-10.0.1.tgz
Source10110:         
https://registry.npmjs.org/commander/-/commander-11.1.0.tgz#/commander-11.1.0.tgz
Source10111:         
https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#/commander-2.20.3.tgz
Source10112:         
https://registry.npmjs.org/commander/-/commander-7.2.0.tgz#/commander-7.2.0.tgz
Source10113:         
https://registry.npmjs.org/commander/-/commander-8.3.0.tgz#/commander-8.3.0.tgz
Source10114:         
https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz#/compare-versions-5.0.3.tgz
Source10115:         
https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz#/convert-source-map-1.9.0.tgz
Source10116:         
https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz#/cosmiconfig-9.0.2.tgz
Source10117:         
https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz#/cross-spawn-7.0.6.tgz
Source10118:         
https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz#/css-declaration-sorter-7.4.0.tgz
Source10119:         
https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz#/css-functions-list-3.3.3.tgz
Source10120:         
https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz#/css-loader-6.11.0.tgz
Source10121:         
https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-8.0.0.tgz#/css-minimizer-webpack-plugin-8.0.0.tgz
Source10122:         
https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz#/css-select-4.3.0.tgz
Source10123:         
https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz#/css-select-6.0.0.tgz
Source10124:         
https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz#/css-tree-2.2.1.tgz
Source10125:         
https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz#/css-tree-3.2.1.tgz
Source10126:         
https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz#/css-what-6.2.2.tgz
Source10127:         
https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz#/css-what-7.0.0.tgz
Source10128:         
https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz#/cssesc-3.0.0.tgz
Source10129:         
https://registry.npmjs.org/cssnano/-/cssnano-7.1.9.tgz#/cssnano-7.1.9.tgz
Source10130:         
https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.17.tgz#/cssnano-preset-default-7.0.17.tgz
Source10131:         
https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.3.tgz#/cssnano-utils-5.0.3.tgz
Source10132:         
https://registry.npmjs.org/csso/-/csso-5.0.5.tgz#/csso-5.0.5.tgz
Source10133:         
https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz#/debounce-1.2.1.tgz
Source10134:         
https://registry.npmjs.org/debug/-/debug-4.4.3.tgz#/debug-4.4.3.tgz
Source10135:         
https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz#/dedent-0.7.0.tgz
Source10136:         
https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz#/detect-libc-2.1.2.tgz
Source10137:         
https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#/dir-glob-3.0.1.tgz
Source10138:         
https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz#/dom-converter-0.2.0.tgz
Source10139:         
https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz#/dom-serializer-1.4.1.tgz
Source10140:         
https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz#/dom-serializer-2.0.0.tgz
Source10141:         
https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz#/domelementtype-2.3.0.tgz
Source10142:         
https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz#/domhandler-4.3.1.tgz
Source10143:         
https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz#/domhandler-5.0.3.tgz
Source10144:         
https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz#/domutils-2.8.0.tgz
Source10145:         
https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz#/domutils-3.2.2.tgz
Source10146:         
https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz#/dot-case-3.0.4.tgz
Source10147:         
https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz#/duplexer-0.1.2.tgz
Source10148:         
https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz#/electron-to-chromium-1.5.420.tgz
Source10149:         
https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#/emoji-regex-8.0.0.tgz
Source10150:         
https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz#/emojis-list-3.0.0.tgz
Source10151:         
https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz#/enhanced-resolve-5.24.5.tgz
Source10152:         
https://registry.npmjs.org/entities/-/entities-2.2.0.tgz#/entities-2.2.0.tgz
Source10153:         
https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#/entities-4.5.0.tgz
Source10154:         
https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz#/env-paths-2.2.1.tgz
Source10155:         
https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz#/envinfo-7.21.0.tgz
Source10156:         
https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz#/error-ex-1.3.4.tgz
Source10157:         
https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz#/es-errors-1.3.0.tgz
Source10158:         
https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz#/es-module-lexer-2.3.2.tgz
Source10159:         
https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz#/escalade-3.2.0.tgz
Source10160:         
https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#/escape-string-regexp-4.0.0.tgz
Source10161:         
https://registry.npmjs.org/events/-/events-3.3.0.tgz#/events-3.3.0.tgz
Source10162:         
https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#/fast-deep-equal-3.1.3.tgz
Source10163:         
https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz#/fast-diff-1.3.0.tgz
Source10164:         
https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz#/fast-glob-3.3.3.tgz
Source10165:         
https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#/fast-json-stable-stringify-2.1.0.tgz
Source10166:         
https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz#/fast-uri-3.1.7.tgz
Source10167:         
https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#/fastest-levenshtein-1.0.16.tgz
Source10168:         
https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz#/fastq-1.20.3.tgz
Source10169:         
https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz#/file-entry-cache-11.1.5.tgz
Source10170:         
https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz#/fill-range-7.1.1.tgz
Source10171:         
https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#/find-up-4.1.0.tgz
Source10172:         
https://registry.npmjs.org/flat/-/flat-5.0.2.tgz#/flat-5.0.2.tgz
Source10173:         
https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz#/flat-cache-6.1.23.tgz
Source10174:         
https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz#/flatted-3.4.4.tgz
Source10175:         
https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#/function-bind-1.1.2.tgz
Source10176:         
https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#/glob-parent-5.1.2.tgz
Source10177:         
https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz#/global-modules-2.0.0.tgz
Source10178:         
https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz#/global-prefix-3.0.0.tgz
Source10179:         
https://registry.npmjs.org/globby/-/globby-11.1.0.tgz#/globby-11.1.0.tgz
Source10180:         
https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz#/globjoin-0.1.4.tgz
Source10181:         
https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#/graceful-fs-4.2.11.tgz
Source10182:         
https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz#/gzip-size-6.0.0.tgz
Source10183:         
https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#/has-flag-4.0.0.tgz
Source10184:         
https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz#/hashery-1.5.1.tgz
Source10185:         
https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz#/hasown-2.0.4.tgz
Source10186:         https://registry.npmjs.org/he/-/he-1.2.0.tgz#/he-1.2.0.tgz
Source10187:         
https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz#/hookified-1.15.1.tgz
Source10188:         
https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz#/hookified-2.2.0.tgz
Source10189:         
https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz#/html-escaper-2.0.2.tgz
Source10190:         
https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#/html-minifier-terser-6.1.0.tgz
Source10191:         
https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz#/html-tags-3.3.1.tgz
Source10192:         
https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz#/html-webpack-plugin-5.6.8.tgz
Source10193:         
https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz#/htmlparser2-6.1.0.tgz
Source10194:         
https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz#/icss-utils-5.1.0.tgz
Source10195:         
https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz#/ignore-5.3.2.tgz
Source10196:         
https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz#/ignore-7.0.8.tgz
Source10197:         
https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz#/immutable-5.1.9.tgz
Source10198:         
https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz#/import-fresh-3.3.1.tgz
Source10199:         
https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz#/import-local-3.2.0.tgz
Source10200:         
https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz#/imports-loader-0.8.0.tgz
Source10201:         
https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#/imurmurhash-0.1.4.tgz
Source10202:         
https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#/ini-1.3.8.tgz
Source10203:         
https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz#/interpret-3.1.1.tgz
Source10204:         
https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#/is-arrayish-0.2.1.tgz
Source10205:         
https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz#/is-core-module-2.16.2.tgz
Source10206:         
https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#/is-extglob-2.1.1.tgz
Source10207:         
https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#/is-fullwidth-code-point-3.0.0.tgz
Source10208:         
https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#/is-glob-4.0.3.tgz
Source10209:         
https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#/is-number-7.0.0.tgz
Source10210:         
https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#/is-plain-object-2.0.4.tgz
Source10211:         
https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.1.0.tgz#/is-plain-object-5.1.0.tgz
Source10212:         
https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#/isexe-2.0.0.tgz
Source10213:         
https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#/isobject-3.0.1.tgz
Source10214:         
https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.5.0.tgz#/jest-regex-util-30.5.0.tgz
Source10215:         
https://registry.npmjs.org/jest-util/-/jest-util-30.5.1.tgz#/jest-util-30.5.1.tgz
Source10216:         
https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz#/jest-worker-27.5.1.tgz
Source10217:         
https://registry.npmjs.org/jest-worker/-/jest-worker-30.5.1.tgz#/jest-worker-30.5.1.tgz
Source10218:         
https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#/js-tokens-4.0.0.tgz
Source10219:         
https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz#/js-yaml-4.3.2.tgz
Source10220:         
https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#/json-parse-even-better-errors-2.3.1.tgz
Source10221:         
https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#/json-schema-traverse-0.4.1.tgz
Source10222:         
https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#/json-schema-traverse-1.0.0.tgz
Source10223:         
https://registry.npmjs.org/json5/-/json5-1.0.2.tgz#/json5-1.0.2.tgz
Source10224:         
https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#/json5-2.2.3.tgz
Source10225:         
https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz#/keyv-5.6.0.tgz
Source10226:         
https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#/kind-of-6.0.3.tgz
Source10227:         
https://registry.npmjs.org/klona/-/klona-2.0.6.tgz#/klona-2.0.6.tgz
Source10228:         
https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz#/known-css-properties-0.37.0.tgz
Source10229:         
https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz#/lilconfig-3.1.3.tgz
Source10230:         
https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#/lines-and-columns-1.2.4.tgz
Source10231:         
https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz#/loader-utils-1.4.2.tgz
Source10232:         
https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz#/loader-utils-2.0.4.tgz
Source10233:         
https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#/locate-path-5.0.0.tgz
Source10234:         
https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz#/lodash-4.18.1.tgz
Source10235:         
https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#/lodash.memoize-4.1.2.tgz
Source10236:         
https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#/lodash.truncate-4.4.2.tgz
Source10237:         
https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#/lodash.uniq-4.5.0.tgz
Source10238:         
https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz#/lower-case-2.0.2.tgz
Source10239:         
https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#/mathml-tag-names-2.1.3.tgz
Source10240:         
https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz#/mdn-data-2.0.28.tgz
Source10241:         
https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz#/mdn-data-2.27.1.tgz
Source10242:         
https://registry.npmjs.org/meow/-/meow-13.2.0.tgz#/meow-13.2.0.tgz
Source10243:         
https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#/merge-stream-2.0.0.tgz
Source10244:         
https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#/merge2-1.4.1.tgz
Source10245:         
https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz#/micromatch-4.0.8.tgz
Source10246:         
https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz#/mime-db-1.54.0.tgz
Source10247:         
https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz#/mini-css-extract-plugin-2.10.2.tgz
Source10248:         
https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz#/minimist-1.2.8.tgz
Source10249:         
https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.9.0.tgz#/minimizer-webpack-plugin-5.9.0.tgz
Source10250:         
https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz#/mrmime-2.0.1.tgz
Source10251:         https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#/ms-2.1.3.tgz
Source10252:         
https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz#/nanoid-3.3.18.tgz
Source10253:         
https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz#/neo-async-2.6.2.tgz
Source10254:         
https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz#/no-case-3.0.4.tgz
Source10255:         
https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz#/node-addon-api-7.1.1.tgz
Source10256:         
https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz#/node-releases-2.0.54.tgz
Source10257:         
https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#/normalize-path-3.0.0.tgz
Source10258:         
https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz#/nth-check-2.1.1.tgz
Source10259:         
https://registry.npmjs.org/opener/-/opener-1.5.2.tgz#/opener-1.5.2.tgz
Source10260:         
https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#/p-limit-2.3.0.tgz
Source10261:         
https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#/p-locate-4.1.0.tgz
Source10262:         
https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#/p-try-2.2.0.tgz
Source10263:         
https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz#/param-case-3.0.4.tgz
Source10264:         
https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#/parent-module-1.0.1.tgz
Source10265:         
https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#/parse-json-5.2.0.tgz
Source10266:         
https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz#/pascal-case-3.1.2.tgz
Source10267:         
https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#/path-exists-4.0.0.tgz
Source10268:         
https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#/path-key-3.1.1.tgz
Source10269:         
https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#/path-parse-1.0.7.tgz
Source10270:         
https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#/path-type-4.0.0.tgz
Source10271:         
https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz#/picocolors-1.1.1.tgz
Source10272:         
https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz#/picomatch-2.3.2.tgz
Source10273:         
https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz#/picomatch-4.0.7.tgz
Source10274:         
https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#/pkg-dir-4.2.0.tgz
Source10275:         
https://registry.npmjs.org/postcss/-/postcss-8.5.27.tgz#/postcss-8.5.27.tgz
Source10276:         
https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz#/postcss-calc-10.1.1.tgz
Source10277:         
https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.10.tgz#/postcss-colormin-7.0.10.tgz
Source10278:         
https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.12.tgz#/postcss-convert-values-7.0.12.tgz
Source10279:         
https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.8.tgz#/postcss-discard-comments-7.0.8.tgz
Source10280:         
https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.4.tgz#/postcss-discard-duplicates-7.0.4.tgz
Source10281:         
https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.3.tgz#/postcss-discard-empty-7.0.3.tgz
Source10282:         
https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.3.tgz#/postcss-discard-overridden-7.0.3.tgz
Source10283:         
https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#/postcss-media-query-parser-0.2.3.tgz
Source10284:         
https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.7.tgz#/postcss-merge-longhand-7.0.7.tgz
Source10285:         
https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.11.tgz#/postcss-merge-rules-7.0.11.tgz
Source10286:         
https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.3.tgz#/postcss-minify-font-values-7.0.3.tgz
Source10287:         
https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.5.tgz#/postcss-minify-gradients-7.0.5.tgz
Source10288:         
https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.9.tgz#/postcss-minify-params-7.0.9.tgz
Source10289:         
https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.1.2.tgz#/postcss-minify-selectors-7.1.2.tgz
Source10290:         
https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#/postcss-modules-extract-imports-3.1.0.tgz
Source10291:         
https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#/postcss-modules-local-by-default-4.2.0.tgz
Source10292:         
https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#/postcss-modules-scope-3.2.1.tgz
Source10293:         
https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#/postcss-modules-values-4.0.0.tgz
Source10294:         
https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.3.tgz#/postcss-normalize-charset-7.0.3.tgz
Source10295:         
https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.3.tgz#/postcss-normalize-display-values-7.0.3.tgz
Source10296:         
https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.4.tgz#/postcss-normalize-positions-7.0.4.tgz
Source10297:         
https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.4.tgz#/postcss-normalize-repeat-style-7.0.4.tgz
Source10298:         
https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.3.tgz#/postcss-normalize-string-7.0.3.tgz
Source10299:         
https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.3.tgz#/postcss-normalize-timing-functions-7.0.3.tgz
Source10300:         
https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.9.tgz#/postcss-normalize-unicode-7.0.9.tgz
Source10301:         
https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.3.tgz#/postcss-normalize-url-7.0.3.tgz
Source10302:         
https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.3.tgz#/postcss-normalize-whitespace-7.0.3.tgz
Source10303:         
https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.4.tgz#/postcss-ordered-values-7.0.4.tgz
Source10304:         
https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.9.tgz#/postcss-reduce-initial-7.0.9.tgz
Source10305:         
https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.3.tgz#/postcss-reduce-transforms-7.0.3.tgz
Source10306:         
https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz#/postcss-resolve-nested-selector-0.1.6.tgz
Source10307:         
https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz#/postcss-safe-parser-7.0.1.tgz
Source10308:         
https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz#/postcss-scss-4.0.9.tgz
Source10309:         
https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz#/postcss-selector-parser-7.1.6.tgz
Source10310:         
https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.3.tgz#/postcss-svgo-7.1.3.tgz
Source10311:         
https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.7.tgz#/postcss-unique-selectors-7.0.7.tgz
Source10312:         
https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#/postcss-value-parser-4.2.0.tgz
Source10313:         
https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz#/prettier-3.9.6.tgz
Source10314:         
https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz#/prettier-linter-helpers-1.0.1.tgz
Source10315:         
https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz#/pretty-error-4.0.0.tgz
Source10316:         
https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz#/punycode-2.3.1.tgz
Source10317:         
https://registry.npmjs.org/qified/-/qified-0.10.1.tgz#/qified-0.10.1.tgz
Source10318:         
https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#/queue-microtask-1.2.3.tgz
Source10319:         
https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz#/readdirp-5.1.1.tgz
Source10320:         
https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz#/rechoir-0.8.0.tgz
Source10321:         
https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz#/regex-parser-2.3.1.tgz
Source10322:         
https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz#/relateurl-0.2.7.tgz
Source10323:         
https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz#/renderkid-3.0.0.tgz
Source10324:         
https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#/require-from-string-2.0.2.tgz
Source10325:         
https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz#/resolve-1.22.12.tgz
Source10326:         
https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz#/resolve-cwd-3.0.0.tgz
Source10327:         
https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#/resolve-from-4.0.0.tgz
Source10328:         
https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#/resolve-from-5.0.0.tgz
Source10329:         
https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#/resolve-url-loader-5.0.0.tgz
Source10330:         
https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz#/reusify-1.1.0.tgz
Source10331:         
https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#/run-parallel-1.2.0.tgz
Source10332:         
https://registry.npmjs.org/sass/-/sass-1.103.1.tgz#/sass-1.103.1.tgz
Source10333:         
https://registry.npmjs.org/sass-loader/-/sass-loader-10.5.2.tgz#/sass-loader-10.5.2.tgz
Source10334:         
https://registry.npmjs.org/sax/-/sax-1.6.1.tgz#/sax-1.6.1.tgz
Source10335:         
https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz#/schema-utils-3.3.0.tgz
Source10336:         
https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz#/schema-utils-4.3.3.tgz
Source10337:         
https://registry.npmjs.org/semver/-/semver-7.8.5.tgz#/semver-7.8.5.tgz
Source10338:         
https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.1.tgz#/serialize-javascript-7.1.1.tgz
Source10339:         
https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz#/shallow-clone-3.0.1.tgz
Source10340:         
https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#/shebang-command-2.0.0.tgz
Source10341:         
https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#/shebang-regex-3.0.0.tgz
Source10342:         
https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#/signal-exit-4.1.0.tgz
Source10343:         
https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz#/sirv-2.0.4.tgz
Source10344:         
https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#/slash-3.0.0.tgz
Source10345:         
https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz#/slice-ansi-4.0.0.tgz
Source10346:         
https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#/source-map-0.6.1.tgz
Source10347:         
https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz#/source-map-js-1.2.1.tgz
Source10348:         
https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#/source-map-support-0.5.21.tgz
Source10349:         
https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#/string-width-4.2.3.tgz
Source10350:         
https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#/strip-ansi-6.0.1.tgz
Source10351:         
https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz#/style-loader-4.0.0.tgz
Source10352:         
https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.11.tgz#/stylehacks-7.0.11.tgz
Source10353:         
https://registry.npmjs.org/stylelint/-/stylelint-16.26.1.tgz#/stylelint-16.26.1.tgz
Source10354:         
https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz#/stylelint-config-recommended-17.0.0.tgz
Source10355:         
https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-16.0.2.tgz#/stylelint-config-recommended-scss-16.0.2.tgz
Source10356:         
https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-39.0.1.tgz#/stylelint-config-standard-39.0.1.tgz
Source10357:         
https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-16.0.0.tgz#/stylelint-config-standard-scss-16.0.0.tgz
Source10358:         
https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-4.1.0.tgz#/stylelint-prettier-4.1.0.tgz
Source10359:         
https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.14.0.tgz#/stylelint-scss-6.14.0.tgz
Source10360:         
https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#/supports-color-7.2.0.tgz
Source10361:         
https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz#/supports-color-8.1.1.tgz
Source10362:         
https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz#/supports-hyperlinks-3.2.0.tgz
Source10363:         
https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#/supports-preserve-symlinks-flag-1.0.0.tgz
Source10364:         
https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz#/svg-tags-1.0.0.tgz
Source10365:         
https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz#/svgo-4.1.0.tgz
Source10366:         
https://registry.npmjs.org/table/-/table-6.9.0.tgz#/table-6.9.0.tgz
Source10367:         
https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz#/tapable-2.3.3.tgz
Source10368:         
https://registry.npmjs.org/terser/-/terser-5.51.2.tgz#/terser-5.51.2.tgz
Source10369:         
https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz#/terser-webpack-plugin-5.6.1.tgz
Source10370:         
https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#/to-regex-range-5.0.1.tgz
Source10371:         
https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz#/totalist-3.0.1.tgz
Source10372:         
https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz#/tslib-2.8.1.tgz
Source10373:         
https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz#/undici-types-8.3.0.tgz
Source10374:         
https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz#/update-browserslist-db-1.3.2.tgz
Source10375:         
https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#/uri-js-4.4.1.tgz
Source10376:         
https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#/util-deprecate-1.0.2.tgz
Source10377:         
https://registry.npmjs.org/utila/-/utila-0.4.0.tgz#/utila-0.4.0.tgz
Source10378:         
https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz#/watchpack-2.5.2.tgz
Source10379:         
https://registry.npmjs.org/webpack/-/webpack-5.110.3.tgz#/webpack-5.110.3.tgz
Source10380:         
https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#/webpack-bundle-analyzer-4.10.2.tgz
Source10381:         
https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz#/webpack-cli-5.1.4.tgz
Source10382:         
https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz#/webpack-merge-5.10.0.tgz
Source10383:         
https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz#/webpack-sources-3.5.1.tgz
Source10384:         
https://registry.npmjs.org/which/-/which-1.3.1.tgz#/which-1.3.1.tgz
Source10385:         
https://registry.npmjs.org/which/-/which-2.0.2.tgz#/which-2.0.2.tgz
Source10386:         
https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz#/wildcard-2.0.1.tgz
Source10387:         
https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz#/write-file-atomic-5.0.1.tgz
Source10388:         
https://registry.npmjs.org/ws/-/ws-7.5.13.tgz#/ws-7.5.13.tgz

++++++ package-lock.json ++++++
++++ 5587 lines (skipped)

++++++ pydata-sphinx-theme-0.19.0.tar.gz -> pydata-sphinx-theme-0.21.0.tar.gz 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/PKG-INFO 
new/pydata_sphinx_theme-0.21.0/PKG-INFO
--- old/pydata_sphinx_theme-0.19.0/PKG-INFO     1970-01-01 01:00:00.000000000 
+0100
+++ new/pydata_sphinx_theme-0.21.0/PKG-INFO     1970-01-01 01:00:00.000000000 
+0100
@@ -1,12 +1,11 @@
 Metadata-Version: 2.4
 Name: pydata-sphinx-theme
-Version: 0.19.0
+Version: 0.21.0
 Summary: Bootstrap-based Sphinx theme from the PyData community
 Maintainer-Email: Joris Van den Bossche <[email protected]>
 License-File: LICENSE
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
@@ -16,14 +15,15 @@
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Operating System :: OS Independent
 Project-URL: Source, https://github.com/pydata/pydata-sphinx-theme
-Requires-Python: >=3.10
-Requires-Dist: sphinx<10,>=8.0
+Requires-Python: >=3.11
+Requires-Dist: sphinx<10,>=8.2
 Requires-Dist: beautifulsoup4
 Requires-Dist: docutils!=0.17.0
 Requires-Dist: Babel
 Requires-Dist: pygments>=2.7
 Requires-Dist: accessible-pygments
-Requires-Dist: typing-extensions
+Requires-Dist: jinja2
+Requires-Dist: requests
 Provides-Extra: doc
 Requires-Dist: astroid!=4.0.3,>=3; extra == "doc"
 Requires-Dist: numpydoc; extra == "doc"
@@ -66,6 +66,7 @@
 Requires-Dist: pytest-regressions; extra == "test"
 Requires-Dist: sphinx[test]; extra == "test"
 Requires-Dist: pytest-playwright; extra == "test"
+Requires-Dist: typing-extensions; extra == "test"
 Provides-Extra: a11y
 Requires-Dist: pydata-sphinx-theme[test]; extra == "a11y"
 Provides-Extra: i18n
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/RELEASE.md 
new/pydata_sphinx_theme-0.21.0/RELEASE.md
--- old/pydata_sphinx_theme-0.19.0/RELEASE.md   2026-06-15 11:27:42.451127800 
+0200
+++ new/pydata_sphinx_theme-0.21.0/RELEASE.md   2026-08-25 16:11:27.485900400 
+0200
@@ -16,6 +16,9 @@
 
 - [ ] Bump `__version__` in 
[`__init__.py`](https://github.com/pydata/pydata-sphinx-theme/blob/main/src/pydata_sphinx_theme/__init__.py#L16)
 - [ ] Update our [version switcher `.json` 
file](https://github.com/pydata/pydata-sphinx-theme/blob/main/docs/_static/switcher.json)
 with the new version
+
+The two above steps can be done automatically with `python 
tools/bump_version.py 0.2.0`.
+
 - [ ] Make a release commit: `git commit -m 'bump: 0.1.9 → 0.2.0'`
 - [ ] Push the RLS commit `git push upstream main`
 - [ ] If a **release candidate** is needed, tick this box when we're now ready 
for a full release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/docs/_extension/component_directive.py 
new/pydata_sphinx_theme-0.21.0/docs/_extension/component_directive.py
--- old/pydata_sphinx_theme-0.19.0/docs/_extension/component_directive.py       
2026-06-15 11:27:42.451675000 +0200
+++ new/pydata_sphinx_theme-0.21.0/docs/_extension/component_directive.py       
2026-08-25 16:11:27.486349600 +0200
@@ -8,7 +8,7 @@
 import re
 
 from pathlib import Path
-from typing import Any, Dict, List
+from typing import Any
 
 from docutils import nodes
 from sphinx.application import Sphinx
@@ -33,7 +33,7 @@
     optional_arguments = 0
     final_argument_whitespace = True
 
-    def run(self) -> List[nodes.Node]:
+    def run(self) -> list[nodes.Node]:
         """Create the list."""
         # get the list of all th jinja templates
         # not that to remain compatible with sphinx they are labeled as html 
files
@@ -84,7 +84,7 @@
         return [nodes.bullet_list("", *items)]
 
 
-def setup(app: Sphinx) -> Dict[str, Any]:
+def setup(app: Sphinx) -> dict[str, Any]:
     """Add custom configuration to sphinx app.
 
     Args:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/docs/_extension/gallery_directive.py 
new/pydata_sphinx_theme-0.21.0/docs/_extension/gallery_directive.py
--- old/pydata_sphinx_theme-0.19.0/docs/_extension/gallery_directive.py 
2026-06-15 11:27:42.451716200 +0200
+++ new/pydata_sphinx_theme-0.21.0/docs/_extension/gallery_directive.py 
2026-08-25 16:11:27.486420000 +0200
@@ -10,7 +10,7 @@
 """
 
 from pathlib import Path
-from typing import Any, ClassVar, Dict, List
+from typing import Any, ClassVar
 
 from docutils import nodes
 from docutils.parsers.rst import directives
@@ -67,7 +67,7 @@
         "class-card": directives.unchanged,
     }
 
-    def run(self) -> List[nodes.Node]:
+    def run(self) -> list[nodes.Node]:
         """Create the gallery grid."""
         if self.arguments:
             # If an argument is given, assume it's a path to a YAML file
@@ -128,7 +128,7 @@
         return [container.children[0]]
 
 
-def setup(app: Sphinx) -> Dict[str, Any]:
+def setup(app: Sphinx) -> dict[str, Any]:
     """Add custom configuration to sphinx app.
 
     Args:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/docs/_static/switcher.json 
new/pydata_sphinx_theme-0.21.0/docs/_static/switcher.json
--- old/pydata_sphinx_theme-0.19.0/docs/_static/switcher.json   2026-06-15 
11:27:42.463127900 +0200
+++ new/pydata_sphinx_theme-0.21.0/docs/_static/switcher.json   2026-08-25 
16:11:27.497900500 +0200
@@ -4,12 +4,22 @@
     "url": "https://pydata-sphinx-theme.readthedocs.io/en/latest/";
   },
   {
-    "name": "0.19.0 (stable)",
-    "version": "v0.19.0",
+    "name": "0.21.0 (stable)",
+    "version": "v0.21.0",
     "url": "https://pydata-sphinx-theme.readthedocs.io/en/stable/";,
     "preferred": true
   },
   {
+    "name": "0.20.0",
+    "version": "v0.20.0",
+    "url": "https://pydata-sphinx-theme.readthedocs.io/en/v0.20.0/";
+  },
+  {
+    "name": "0.19.0",
+    "version": "v0.19.0",
+    "url": "https://pydata-sphinx-theme.readthedocs.io/en/v0.19.0/";
+  },
+  {
     "name": "0.18.0",
     "version": "v0.18.0",
     "url": "https://pydata-sphinx-theme.readthedocs.io/en/v0.18.0/";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/docs/community/setup.md 
new/pydata_sphinx_theme-0.21.0/docs/community/setup.md
--- old/pydata_sphinx_theme-0.19.0/docs/community/setup.md      2026-06-15 
11:27:42.468282200 +0200
+++ new/pydata_sphinx_theme-0.21.0/docs/community/setup.md      2026-08-25 
16:11:27.503534800 +0200
@@ -237,6 +237,16 @@
 $ tox run -e tests-no-cov
 ```
 
+To run a single test in any pytest-based test environment, pass a pytest `-k`
+expression after `--`:
+
+```console
+$ tox run -e py314-tests-no-cov -- -k test_theme_loaded_as_extension
+```
+
+The `-k` expression matches test names by substring. The same syntax works with
+other test environments, such as `a11y-tests`.
+
 To run the accessibility checks:
 
 ```console
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/docs/community/topics/manual-dev.md 
new/pydata_sphinx_theme-0.21.0/docs/community/topics/manual-dev.md
--- old/pydata_sphinx_theme-0.19.0/docs/community/topics/manual-dev.md  
2026-06-15 11:27:42.468472200 +0200
+++ new/pydata_sphinx_theme-0.21.0/docs/community/topics/manual-dev.md  
2026-08-25 16:11:27.503900500 +0200
@@ -17,7 +17,7 @@
 
 Before you start, ensure that you have the following installed:
 
-- Python >= 3.10
+- Python >= 3.11
 - [Pandoc](https://pandoc.org/): we use `nbsphinx` to support notebook 
(`.ipynb`) files in the documentation, which requires [installing 
Pandoc](https://pandoc.org/installing.html) at a system level (or within a 
Conda environment).
 
 ## Clone the repository locally
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/docs/conf.py 
new/pydata_sphinx_theme-0.21.0/docs/conf.py
--- old/pydata_sphinx_theme-0.19.0/docs/conf.py 2026-06-15 11:27:42.468472200 
+0200
+++ new/pydata_sphinx_theme-0.21.0/docs/conf.py 2026-08-25 16:11:27.503900500 
+0200
@@ -10,7 +10,7 @@
 import sys
 
 from pathlib import Path
-from typing import Any, Dict
+from typing import Any
 
 from sphinx.application import Sphinx
 from sphinx.locale import _
@@ -67,7 +67,13 @@
 # This pattern also affects html_static_path and html_extra_path.
 exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints"]
 
-intersphinx_mapping = {"sphinx": ("https://www.sphinx-doc.org/en/master";, 
None)}
+intersphinx_mapping = {
+    "sphinx": ("https://www.sphinx-doc.org/en/master";, None),
+    # Sphinx treats typing.* as reftype = 'obj' but pyupgrade moved
+    # from typing.* in favor of collections.abc (reftype = 'class'),
+    # whose references are not found without the following line:
+    "python": ("https://docs.python.org/3";, None),
+}
 
 # -- Sitemap -----------------------------------------------------------------
 
@@ -350,7 +356,7 @@
     context["to_main"] = to_main
 
 
-def setup(app: Sphinx) -> Dict[str, Any]:
+def setup(app: Sphinx) -> dict[str, Any]:
     """Add custom configuration to sphinx app.
 
     Args:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/docs/examples/gallery.md 
new/pydata_sphinx_theme-0.21.0/docs/examples/gallery.md
--- old/pydata_sphinx_theme-0.19.0/docs/examples/gallery.md     2026-06-15 
11:27:42.468965300 +0200
+++ new/pydata_sphinx_theme-0.21.0/docs/examples/gallery.md     2026-08-25 
16:11:27.504603400 +0200
@@ -35,9 +35,6 @@
 - title: CuPy
   link-alt: CuPy docs
   link: https://docs.cupy.dev/en/stable/index.html
-- title: DecentralChain
-  link-alt: DecentralChain docs
-  link: https://docs.decentralchain.io/en/master/
 - title: Fairlearn
   link-alt: Fairlearn docs
   link: https://fairlearn.org/main/about/
@@ -56,6 +53,9 @@
 - title: movement
   link-alt: movement docs
   link: https://movement.neuroinformatics.dev
+- title: Napari
+  link-alt: napari docs
+  link: https://napari.org/stable/
 - title: Pastas
   link-alt: Pastas docs
   link: https://pastas.readthedocs.io/
@@ -65,4 +65,7 @@
 - title: PyVista
   link-alt: PyVista docs
   link: https://docs.pyvista.org
+- title: GALACTIC
+  link-alt: GALACTIC docs
+  link: https://www.thegalactic.org
 ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/docs/user_guide/index.md 
new/pydata_sphinx_theme-0.21.0/docs/user_guide/index.md
--- old/pydata_sphinx_theme-0.19.0/docs/user_guide/index.md     2026-06-15 
11:27:42.473127800 +0200
+++ new/pydata_sphinx_theme-0.21.0/docs/user_guide/index.md     2026-08-25 
16:11:27.509223700 +0200
@@ -11,13 +11,6 @@
 You can configure the behavior, look, and feel of the theme in many ways.
 The remaining pages in the user guide cover various ways of doing so.
 
-```{danger}
-This theme is still under active development, and we make no promises
-about the stability of any specific HTML structure, CSS variables, etc.
-Make these customizations at your own risk, and pin versions if you're
-worried about breaking changes!
-```
-
 There are a number of options for configuring your site's look and feel.
 All configuration options are passed with the `html_theme_options` variable in 
your `conf.py` file.
 This is a dictionary with `key: val` pairs that you can configure in various 
ways.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/package-lock.json 
new/pydata_sphinx_theme-0.21.0/package-lock.json
--- old/pydata_sphinx_theme-0.19.0/package-lock.json    2026-06-15 
11:27:42.474128000 +0200
+++ new/pydata_sphinx_theme-0.21.0/package-lock.json    2026-08-25 
16:11:27.510900500 +0200
@@ -2258,9 +2258,9 @@
       }
     },
     "node_modules/immutable": {
-      "version": "4.3.8",
-      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.8.tgz";,
-      "integrity": 
"sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==",
+      "version": "4.3.9",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.9.tgz";,
+      "integrity": 
"sha512-ObHy4YN7ycwZOUCLI1/6svfyAFu7vL8RhAvVu/bh/RZW9EPlOyDaQ9jDQWCtdqzaXUjgXZCW1migtHE7YI7UGQ==",
       "dev": true,
       "license": "MIT"
     },
@@ -2513,10 +2513,20 @@
       "license": "MIT"
     },
     "node_modules/js-yaml": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz";,
-      "integrity": 
"sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz";,
+      "integrity": 
"sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==",
       "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/puzrin";
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/nodeca";
+        }
+      ],
       "license": "MIT",
       "dependencies": {
         "argparse": "^2.0.1"
@@ -2820,9 +2830,9 @@
       "license": "MIT"
     },
     "node_modules/nanoid": {
-      "version": "3.3.11",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz";,
-      "integrity": 
"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+      "version": "3.3.16",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz";,
+      "integrity": 
"sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
       "dev": true,
       "funding": [
         {
@@ -3044,9 +3054,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.5.8",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz";,
-      "integrity": 
"sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
+      "version": "8.5.23",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz";,
+      "integrity": 
"sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==",
       "dev": true,
       "funding": [
         {
@@ -3064,7 +3074,7 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "nanoid": "^3.3.11",
+        "nanoid": "^3.3.16",
         "picocolors": "^1.1.1",
         "source-map-js": "^1.2.1"
       },
@@ -4700,9 +4710,9 @@
       "dev": true
     },
     "node_modules/svgo": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz";,
-      "integrity": 
"sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz";,
+      "integrity": 
"sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5209,9 +5219,10 @@
       }
     },
     "node_modules/ws": {
-      "version": "7.5.10",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz";,
-      "integrity": 
"sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+      "version": "7.5.11",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz";,
+      "integrity": 
"sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==",
+      "license": "MIT",
       "engines": {
         "node": ">=8.3.0"
       },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/pyproject.toml 
new/pydata_sphinx_theme-0.21.0/pyproject.toml
--- old/pydata_sphinx_theme-0.19.0/pyproject.toml       2026-06-15 
11:27:42.474128000 +0200
+++ new/pydata_sphinx_theme-0.21.0/pyproject.toml       2026-08-25 
16:11:27.510900500 +0200
@@ -20,15 +20,16 @@
 description = "Bootstrap-based Sphinx theme from the PyData community"
 dynamic = ["version"]
 readme = "README.md"
-requires-python = ">=3.10"
+requires-python = ">=3.11"
 dependencies = [
-  "sphinx>=8.0,<10",
+  "sphinx>=8.2,<10",
   "beautifulsoup4",
   "docutils!=0.17.0",
   "Babel",
   "pygments>=2.7",
   "accessible-pygments",
-  "typing-extensions",
+  "jinja2",
+  "requests",
 ]
 license = { file = "LICENSE" }
 maintainers = [
@@ -37,7 +38,6 @@
 classifiers = [
   "Development Status :: 5 - Production/Stable",
   "Programming Language :: Python :: 3",
-  "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
   "Programming Language :: Python :: 3.12",
   "Programming Language :: Python :: 3.13",
@@ -97,7 +97,8 @@
   "pytest-cov",
   "pytest-regressions",
   "sphinx[test]",
-  "pytest-playwright"
+  "pytest-playwright",
+  "typing-extensions",
 ]
 a11y = ["pydata-sphinx-theme[test]"]
 i18n = ["Babel", "jinja2"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/__init__.py 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/__init__.py
--- old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/__init__.py  
2026-06-15 11:27:42.474435300 +0200
+++ new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/__init__.py  
2026-08-25 16:11:27.511232900 +0200
@@ -4,7 +4,6 @@
 
 from functools import partial
 from pathlib import Path
-from typing import Dict
 from urllib.parse import urlparse
 
 import requests
@@ -17,7 +16,7 @@
 from . import edit_this_page, logo, pygments, short_link, toctree, translator, 
utils
 
 
-__version__ = "0.19.0"
+__version__ = "0.21.0"
 
 
 def update_config(app):
@@ -264,8 +263,13 @@
         """
         app.add_js_file(None, body=js)
 
-    # Specify whether search-as-you-type should be used or not.
-    search_as_you_type = str(context["theme_search_as_you_type"]).lower()
+    # Specify whether search-as-you-type should be used or not. It is always
+    # off on the dedicated search page, where it would fight searchtools.js
+    # over the #search-results container.
+    if pagename == "search":
+        search_as_you_type = "false"
+    else:
+        search_as_you_type = str(context["theme_search_as_you_type"]).lower()
     app.add_js_file(
         None, body=f"DOCUMENTATION_OPTIONS.search_as_you_type = 
{search_as_you_type};"
     )
@@ -310,7 +314,7 @@
         app.add_post_transform(short_link.ShortenLinkTransform)
 
 
-def setup(app: Sphinx) -> Dict[str, str]:
+def setup(app: Sphinx) -> dict[str, str]:
     """Setup the Sphinx application."""
     here = Path(__file__).parent.resolve()
     theme_path = here / "theme" / "pydata_sphinx_theme"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/scripts/pydata-sphinx-theme.js
 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/scripts/pydata-sphinx-theme.js
--- 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/scripts/pydata-sphinx-theme.js
        2026-06-15 11:27:42.474575800 +0200
+++ 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/scripts/pydata-sphinx-theme.js
        2026-08-25 16:11:27.511457400 +0200
@@ -329,15 +329,14 @@
  * to have that exact ID.
  */
 var setupSearchAsYouType = () => {
+  // False when the theme option is off, and also forced off by the Python
+  // html-page-context hook on the dedicated search page (search.html, or
+  // search/ under the dirhtml builder), where searchtools.js owns the
+  // #search-results container.
   if (!DOCUMENTATION_OPTIONS.search_as_you_type) {
     return;
   }
 
-  // Don't interfere with the default search UX on /search.html.
-  if (window.location.pathname.endsWith("/search.html")) {
-    return;
-  }
-
   // Bail if the Search class is not available. Search-as-you-type is
   // impossible without that class. layout.html should ensure that
   // searchtools.js loads.
@@ -568,7 +567,9 @@
             
"https://pydata-sphinx-theme.readthedocs.io/en/stable/user_guide/version-dropdown.html";,
         );
       }
-      const cutoff = window.location.href.indexOf(currentPath);
+      const cutoff = currentPath
+        ? window.location.href.indexOf(currentPath)
+        : -1;
       // cutoff == -1 can happen e.g. on the homepage of locally served docs, 
where you
       // get something like http://127.0.0.1:8000/ (no trailing `index.html`)
       const origin =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/styles/base/_base.scss
 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/styles/base/_base.scss
--- 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/styles/base/_base.scss
        2026-06-15 11:27:42.474880500 +0200
+++ 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/styles/base/_base.scss
        2026-08-25 16:11:27.511900400 +0200
@@ -175,7 +175,9 @@
   z-index: $zindex-tooltip;
   position: fixed;
   display: none;
-  top: 90vh;
+
+  // #2411: anchor on bottom to prevent overflowing on mobile
+  bottom: 1.5rem;
   left: 50vw;
   transform: translate(-50%);
   color: var(--pst-color-secondary-text);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/styles/components/_sidebar-collapse.scss
 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/styles/components/_sidebar-collapse.scss
--- 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/styles/components/_sidebar-collapse.scss
      2026-06-15 11:27:42.475128000 +0200
+++ 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/styles/components/_sidebar-collapse.scss
      2026-08-25 16:11:27.512198400 +0200
@@ -43,6 +43,7 @@
 
       // This value was also chosen by trial and error until it looked good.
       height: 1.3em;
+      box-sizing: content-box;
     }
 
     .pst-collapse-sidebar-label {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/styles/content/_hacks.scss
 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/styles/content/_hacks.scss
--- 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/styles/content/_hacks.scss
    2026-06-15 11:27:42.475459800 +0200
+++ 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/styles/content/_hacks.scss
    1970-01-01 01:00:00.000000000 +0100
@@ -1,12 +0,0 @@
-/**
- * Hacky fixes that don't fit cleanly into other sections
- */
-
-// Ensure user highlighting/selecting behaves properly
-// From https://stackoverflow.com/a/34372191
-table.highlighttable td.linenos,
-span.linenos,
-div.doctest > div.highlight span.gp {
-  /* gp: Generic.Prompt */
-  user-select: none;
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/styles/pydata-sphinx-theme.scss
 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/styles/pydata-sphinx-theme.scss
--- 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/assets/styles/pydata-sphinx-theme.scss
       2026-06-15 11:27:42.475731800 +0200
+++ 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/assets/styles/pydata-sphinx-theme.scss
       2026-08-25 16:11:27.513249600 +0200
@@ -62,7 +62,6 @@
 @import "./content/code";
 @import "./content/figures";
 @import "./content/footnotes";
-@import "./content/hacks";
 @import "./content/lists";
 @import "./content/quotes";
 @import "./content/spans";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/short_link.py 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/short_link.py
--- old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/short_link.py        
2026-06-15 11:27:42.477223900 +0200
+++ new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/short_link.py        
2026-08-25 16:11:27.515900600 +0200
@@ -64,7 +64,7 @@
             uri: the link to the platform content
 
         Returns:
-            the reformated url title
+            the reformatted url title
         """
         path = uri.path
         if path == "":
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/theme/pydata_sphinx_theme/components/sidebar-collapse.html
 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/theme/pydata_sphinx_theme/components/sidebar-collapse.html
--- 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/theme/pydata_sphinx_theme/components/sidebar-collapse.html
   2026-06-15 11:27:42.477424600 +0200
+++ 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/theme/pydata_sphinx_theme/components/sidebar-collapse.html
   2026-08-25 16:11:27.516213200 +0200
@@ -1,6 +1,5 @@
 <button id="pst-collapse-sidebar-button" aria-expanded="true" 
aria-controls="pst-primary-sidebar">
-  {#- Even though this SVG is not a Font Awesome SVG, we use the 
`svg-inline--fa` class to apply some useful styles -#}
-  <svg class="pst-icon svg-inline--fa" role="img" aria-hidden="true" 
focusable="false" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg";>
+  <svg class="pst-icon" role="img" aria-hidden="true" focusable="false" 
viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg";>
     <path fill="currentColor" d="M3 15.5C2.36232 15.5 1.74874 15.2564 1.28478 
14.8189C0.820828 14.3815 0.541576 13.7832 0.504167 13.1467L0.5 13L0.5 
3C0.499965 2.36232 0.743605 1.74874 1.18107 1.28478C1.61854 0.820828 2.21676 
0.541576 2.85333 0.504167L3 0.5L13 0.5C13.6377 0.499965 14.2513 0.743605 
14.7152 1.18107C15.1792 1.61854 15.4584 2.21676 15.4958 2.85333L15.5 3L15.5 
13C15.5 13.6377 15.2564 14.2513 14.8189 14.7152C14.3815 15.1792 13.7832 15.4584 
13.1467 15.4958L13 15.5L3 15.5ZM3 13.8333L10.5 13.8333L10.5 2.16667L3 
2.16667C2.79589 2.16669 2.59889 2.24163 2.44636 2.37726C2.29383 2.5129 2.19638 
2.69979 2.1725 2.9025L2.16667 3L2.16667 13C2.16669 13.2041 2.24163 13.4011 
2.37726 13.5536C2.5129 13.7062 2.69979 13.8036 2.9025 13.8275L3 
13.8333ZM6.65583 10.325L6.5775 10.2558L4.91083 8.58917C4.76735 8.44567 4.68116 
8.25476 4.66843 8.05223C4.65569 7.84971 4.71729 7.6495 4.84167 7.48917L4.91083 
7.41083L6.5775 5.74417C6.72747 5.59471 6.9287 5.50794 7.14032 5.50148C7.35194 
5.49502 7.55809 5.5
 6935 7.7169 5.70937C7.8757 5.8494 7.97525 6.04463 7.99533 6.25539C8.01541 
6.46616 7.95451 6.67667 7.825 6.84417L7.75583 6.9225L6.67917 8L7.75583 
9.0775C7.89931 9.22099 7.98551 9.41191 7.99824 9.61443C8.01097 9.81695 7.94938 
10.0172 7.825 10.1775L7.75583 10.2558C7.61234 10.3993 7.42142 10.4855 7.2189 
10.4982C7.01638 10.511 6.81617 10.4494 6.65583 10.325Z"/>
   </svg>
   <span class="pst-collapse-sidebar-label">{{ _("Collapse Sidebar") }}</span>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/toctree.py 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/toctree.py
--- old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/toctree.py   
2026-06-15 11:27:42.478128000 +0200
+++ new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/toctree.py   
2026-08-25 16:11:27.517456000 +0200
@@ -1,10 +1,12 @@
 """Methods to build the toctree used in the html pages."""
 
+import posixpath
+
+from collections.abc import Iterator
 from dataclasses import dataclass
 from functools import cache
 from itertools import count
 from textwrap import dedent
-from typing import Iterator, List, Tuple, Union
 from urllib.parse import urlparse
 
 from bs4 import BeautifulSoup
@@ -114,7 +116,7 @@
         return next(get_or_create_id_generator(base_id))
 
     @cache
-    def _generate_nav_info() -> List[LinkInfo]:
+    def _generate_nav_info() -> list[LinkInfo]:
         """Generate informations necessary to generate nav.
 
         Instead of messing with html later, having this as a util function
@@ -157,11 +159,22 @@
                 # sanitize page title for use in the html output if needed
                 if title is None:
                     title = ""
-                    for node in app.env.titles[page].children:
-                        if isinstance(node, nodes.math):
-                            title += add_inline_math(node)
-                        else:
-                            title += node.astext()
+                    if page in app.env.titles:
+                        for node in app.env.titles[page].children:
+                            if isinstance(node, nodes.math):
+                                title += add_inline_math(node)
+                            else:
+                                title += node.astext()
+                    elif page == "genindex":
+                        title = _("Index")
+                    elif page == "modindex":
+                        title = _("Python Module Index")
+                    elif page == "search":
+                        title = _("Search")
+                    else:
+                        raise RuntimeError(
+                            f"Could not find title for toctree entry: {page!r}"
+                        )
 
                 # set up the status of the link and the path
                 # if the path is relative then we use the context for the path
@@ -169,7 +182,13 @@
                 # If it's an absolute one then we use the external class and
                 # the complete url.
                 is_absolute = bool(urlparse(page).netloc)
-                link_href = page if is_absolute else context["pathto"](page)
+                link_href = (
+                    page
+                    if is_absolute
+                    else context["pathto"](
+                        "py-modindex" if page == "modindex" else page
+                    )
+                )
 
                 links_data.append(
                     LinkInfo(
@@ -196,7 +215,7 @@
     @cache
     def _generate_header_nav_before_dropdown(
         n_links_before_dropdown,
-    ) -> Tuple[str, List[str]]:
+    ) -> tuple[str, list[str]]:
         """Return html for navbar and dropdown.
 
         Given the number of links before the dropdown, return the html for the 
navbar,
@@ -310,7 +329,7 @@
     @cache
     def generate_toctree_html(
         kind: str, startdepth: int = 1, show_nav_level: int = 1, **kwargs
-    ) -> Union[BeautifulSoup, str]:
+    ) -> BeautifulSoup | str:
         """Return the navigation link structure in HTML.
 
         This is similar to Sphinx's own default TocTree generation, but it is 
modified
@@ -321,7 +340,8 @@
         It also modifies the generated TocTree slightly for Bootstrap classes
         and structure (via BeautifulSoup).
 
-        Arguments are passed to Sphinx "toctree" function (context["toctree"] 
below).
+        Arguments are passed to the Sphinx `_get_local_toctree` function
+        (`context["toctree"]` below).
 
         ref: https://www.sphinx-doc.org/en/master/templating.html#toctree
 
@@ -336,15 +356,16 @@
                 page load. By default, this level is 1, and only top-level 
pages are
                 shown, with drop-boxes to reveal children. Increasing 
`show_nav_level`
                 will show child levels as well.
-            kwargs : passed to the Sphinx `toctree` template function.
+            kwargs : passed to the Sphinx `_get_local_toctree` template 
function.
 
         Returns:
             HTML string (if kind == "sidebar") OR BeautifulSoup object
                 (if kind == "raw")
         """
-        if startdepth == 0:
-            html_toctree = context["toctree"](**kwargs)
-        else:
+        show_nav_level = int(show_nav_level)
+
+        ancestorname = toctree_obj = None
+        if startdepth > 0:
             # find relevant ancestor page; some pages (search, genindex) won't 
have one
             ancestorname, toctree_obj = _get_ancestor_pagename(
                 app=app, pagename=pagename, startdepth=startdepth
@@ -355,6 +376,27 @@
                     "ancestor found to act as root node. Please report this to 
theme "
                     "developers."
                 )
+
+        # Resolving and soup-ifying the sidebar toctree below is expensive on
+        # large sites, so where possible we serve it from a cache instead
+        # (see _sidebar_cache_key for when and _patch_cached_sidebar for how)
+        cache_key = _sidebar_cache_key(
+            kind,
+            ancestorname,
+            app.builder.get_target_uri(pagename),
+            show_nav_level,
+            kwargs,
+        )
+        if cache_key is not None:
+            cached_html = _patch_cached_sidebar(
+                app, cache_key, pagename, show_nav_level
+            )
+            if cached_html is not None:
+                return cached_html
+
+        if startdepth == 0:
+            html_toctree = context["toctree"](**kwargs)
+        else:
             # select the "active" subset of the navigation tree for the sidebar
             toctree_element = get_nonroot_toctree(
                 app, pagename, ancestorname, toctree_obj, **kwargs
@@ -405,10 +447,15 @@
             add_collapse_checkboxes(soup)
 
             # Open the sidebar navigation to the proper depth
-            for ii in range(int(show_nav_level)):
+            for ii in range(show_nav_level):
                 for details in soup.select(f"li.toctree-l{ii} > details"):
                     details["open"] = "open"
 
+        if cache_key is not None and soup.find("a", href="#") is not None:
+            # only cache a soup containing this page's own entry (rendered with
+            # href="#") so that a later cache hit can find and demote that 
entry
+            _sidebar_cache(app)[cache_key] = [pagename, soup]
+
         return soup
 
     @cache
@@ -460,7 +507,7 @@
         else:
             return soup
 
-    def navbar_align_class() -> List[str]:
+    def navbar_align_class() -> list[str]:
         """Return the class that aligns the navbar based on config."""
         align = context.get("theme_navbar_align", "content")
         align_options = {
@@ -483,6 +530,146 @@
     context["navbar_align_class"] = navbar_align_class
 
 
+def _sidebar_cache_key(
+    kind: str,
+    ancestorname: str | None,
+    page_uri: str,
+    show_nav_level: int,
+    kwargs: dict,
+) -> tuple | None:
+    """Return the sidebar toctree cache key for this page, or None if 
uncacheable.
+
+    When `collapse=False` (i.e., theme option `collapse_navigation=False`, 
which
+    is our default; note that Sphinx's `_get_local_toctree` defaults to
+    `collapse=True`), the resolved toctree has the same structure for every 
page
+    under the same ancestor -- only the "current" markers (`current`/`active`
+    classes and open `<details>`) and the relative link targets differ. So the
+    finished soup can be shared by all pages written to the same output
+    directory (same relative link targets) below the same ancestor, provided 
the
+    "current" markers are moved to each page's own toctree entry
+    (_patch_cached_sidebar).
+
+    `page_uri` is this page's output URI (`builder.get_target_uri()`), not its
+    docname: builders whose page URIs are directories rather than files (e.g.
+    "dirhtml") give every page its own output directory, so no two pages can
+    share a sidebar and nothing is cached for them.
+    """
+    if kind != "sidebar" or ancestorname is None or kwargs.get("collapse", 
True):
+        return None
+    if not page_uri or page_uri.endswith("/"):
+        return None
+    return (
+        ancestorname,
+        posixpath.dirname(page_uri),
+        show_nav_level,
+        tuple(sorted(kwargs.items())),
+    )
+
+
+def _sidebar_cache(app: Sphinx) -> dict:
+    """Return the per-build sidebar toctree cache, stored on the Sphinx app."""
+    if not hasattr(app, "_pst_sidebar_toctree_cache"):
+        app._pst_sidebar_toctree_cache = {}
+    return app._pst_sidebar_toctree_cache
+
+
+def _patch_cached_sidebar(
+    app: Sphinx, cache_key: tuple, pagename: str, show_nav_level: int
+) -> str | None:
+    """Return this page's sidebar HTML by patching a cached sibling page's 
soup.
+
+    Return None (and leave the cache unmodified) if no soup is cached under
+    `cache_key` yet, or if the cached soup contains no entry for this page
+    (e.g., it was pruned by `maxdepth`) -- the caller then builds the sidebar
+    the slow way.
+    """
+    cached = _sidebar_cache(app).get(cache_key)
+    if cached is None:
+        return None
+    cached_pagename, cached_soup = cached
+    patched = _move_current_markers(
+        cached_soup,
+        old_href=app.builder.get_relative_uri(pagename, cached_pagename),
+        new_href=app.builder.get_relative_uri(cached_pagename, pagename),
+        show_nav_level=show_nav_level,
+    )
+    if not patched:
+        return None
+    cached[0] = pagename  # the "current" markers are now on this page's entry
+    return str(cached_soup)
+
+
+def _move_current_markers(
+    soup: BeautifulSoup, *, old_href: str, new_href: str, show_nav_level: int
+) -> bool:
+    """Move the "current page" markers in a rendered sidebar toctree.
+
+    ``soup`` was rendered for another page in the same directory, whose entry 
(as
+    seen from the page at ``new_href``) is at ``old_href``. Relocate the
+    ``current``/``active`` classes and the ``open`` state of ``<details>``
+    disclosure widgets from that page's entry chain to the entry for the page 
at
+    ``new_href``. Return ``False`` (leaving ``soup`` unmodified) if no entry 
for
+    ``new_href`` exists.
+    """
+    if old_href == new_href:
+        return True  # same page, nothing to move
+    new_anchors = soup.find_all("a", href=new_href)
+    if not new_anchors:
+        return False
+    # Demote the previous page's entry; its self-link is rendered as href="#"
+    for anchor in soup.find_all("a", href="#"):
+        anchor["href"] = old_href
+        anchor["class"] = [cls for cls in anchor.get("class", []) if cls != 
"current"]
+        _set_current_chain(anchor, current=False, 
show_nav_level=show_nav_level)
+    # Promote this page's entry
+    for anchor in new_anchors:
+        anchor["href"] = "#"
+        anchor["class"] = ["current", *anchor.get("class", [])]
+        _set_current_chain(anchor, current=True, show_nav_level=show_nav_level)
+    return True
+
+
+def _set_current_chain(anchor, *, current: bool, show_nav_level: int) -> None:
+    """Add or remove current/active/open markers on an entry's ancestor 
chain."""
+    for parent in anchor.parents:
+        if parent.name == "li":
+            classes = parent.get("class", [])
+            # `li.toctree-l0` is a wrapper the theme synthesizes around a 
part's
+            # caption when `show_nav_level=0`; fresh builds never mark it 
current
+            is_part = "toctree-l0" in classes
+            if not is_part:
+                classes = [cls for cls in classes if cls not in ("current", 
"active")]
+                if current:
+                    # match the class order of a freshly built toctree, where
+                    # Sphinx adds "current" right after "toctree-l*"
+                    classes[1:1] = ["current", "active"]
+                parent["class"] = classes
+            # Every <details> disclosure widget added by 
`add_collapse_checkboxes`
+            # is a direct child of an <li> on the chain -- including the 
current
+            # entry's own <li> (when the current page has child pages), whose
+            # <details> is a *sibling* of `anchor` rather than an ancestor.
+            details = parent.find("details", recursive=False)
+            if details is not None:
+                if current:
+                    # fresh builds give an open part a bare `open` attribute
+                    details["open"] = None if is_part else "open"
+                elif not any(
+                    f"toctree-l{level}" in classes for level in 
range(show_nav_level)
+                ):
+                    # (keep <details> open where mandated by 
``show_nav_level``)
+                    details.attrs.pop("open", None)
+        elif parent.name == "ul":
+            classes = [cls for cls in parent.get("class", []) if cls != 
"current"]
+            # `ul.list-caption` is the theme-synthesized wrapper around all 
parts
+            # (`show_nav_level=0`); fresh builds never mark it current
+            if current and "list-caption" not in classes:
+                classes.insert(0, "current")
+            if classes:
+                parent["class"] = classes
+            else:
+                parent.attrs.pop("class", None)
+
+
 def add_collapse_checkboxes(soup: BeautifulSoup) -> None:
     """Add checkboxes to collapse children in a toctree."""
     # based on https://github.com/pradyunsg/furo
@@ -615,6 +802,8 @@
         kwargs["maxdepth"] = 0
     kwargs["maxdepth"] = int(kwargs["maxdepth"])
     # starting from ancestor page, recursively parse `toctree::` elements
+    if ancestorname not in toctree.env.tocs:
+        return None
     ancestor_doctree = toctree.env.tocs[ancestorname].deepcopy()
     toctrees = []
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/utils.py 
new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/utils.py
--- old/pydata_sphinx_theme-0.19.0/src/pydata_sphinx_theme/utils.py     
2026-06-15 11:27:42.478128000 +0200
+++ new/pydata_sphinx_theme-0.21.0/src/pydata_sphinx_theme/utils.py     
2026-08-25 16:11:27.517456000 +0200
@@ -4,14 +4,15 @@
 import os
 import re
 
-from typing import Any, Callable, Dict, Iterable, List, Optional, Union
+from collections.abc import Callable, Iterable
+from typing import Any
 
 from docutils.nodes import Node
 from sphinx.application import Sphinx
 from sphinx.util import logging, matching
 
 
-def get_theme_options_dict(app: Sphinx) -> Dict[str, Any]:
+def get_theme_options_dict(app: Sphinx) -> dict[str, Any]:
     """Return theme options for the application w/ a fallback if they don't 
exist.
 
     The "top-level" mapping (the one we should usually check first, and modify
@@ -38,7 +39,7 @@
 
 
 def traverse_or_findall(
-    node: Node, condition: Union[Callable, type], **kwargs
+    node: Node, condition: Callable | type, **kwargs
 ) -> Iterable[Node]:
     """Triage node.traverse (docutils <0.18.1) vs node.findall.
 
@@ -90,11 +91,11 @@
 
 def _update_and_remove_templates(
     app: Sphinx,
-    context: Dict[str, Any],
-    templates: Union[List, str],
+    context: dict[str, Any],
+    templates: list | str,
     section: str,
-    templates_skip_empty_check: Optional[List[str]] = None,
-) -> List[str]:
+    templates_skip_empty_check: list[str] | None = None,
+) -> list[str]:
     """
     Update templates to include html suffix if needed; remove templates which 
render
     empty.
@@ -155,8 +156,8 @@
 
 
 def _get_matching_sidebar_items(
-    pagename: str, sidebars: Dict[str, List[str]]
-) -> List[str]:
+    pagename: str, sidebars: dict[str, list[str]]
+) -> list[str]:
     """Get the matching sidebar templates to render for the given pagename.
 
     If a page matches more than one pattern, a warning is emitted, and the 
templates
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/tests/conftest.py 
new/pydata_sphinx_theme-0.21.0/tests/conftest.py
--- old/pydata_sphinx_theme-0.19.0/tests/conftest.py    2026-06-15 
11:27:42.478435800 +0200
+++ new/pydata_sphinx_theme-0.21.0/tests/conftest.py    2026-08-25 
16:11:27.517900500 +0200
@@ -3,18 +3,18 @@
 import re
 import time
 
+from collections.abc import Callable
 from http.client import HTTPConnection
 from os import environ
 from pathlib import Path
 from shutil import copytree
 from subprocess import PIPE, Popen
-from typing import Callable
+from typing import Self
 
 import pytest
 
 from bs4 import BeautifulSoup
 from sphinx.testing.util import SphinxTestApp
-from typing_extensions import Self
 
 
 pytest_plugins = "sphinx.testing.fixtures"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/tests/intermittent_warning_list.txt 
new/pydata_sphinx_theme-0.21.0/tests/intermittent_warning_list.txt
--- old/pydata_sphinx_theme-0.19.0/tests/intermittent_warning_list.txt  
2026-06-15 11:27:42.478435800 +0200
+++ new/pydata_sphinx_theme-0.21.0/tests/intermittent_warning_list.txt  
2026-08-25 16:11:27.517900500 +0200
@@ -2,8 +2,3 @@
 Matplotlib is building the font cache; this may take a moment.
 WARNING: failed to reach any of the inventories with the following issues:
 intersphinx inventory
-# THE FOLLOWING 4 LINES WILL GO AWAY WHEN OUR MIN SPHINX VERSION IS 7.3 OR 
HIGHER (because 7.3 introduces the versionremoved directive)
-We also support *italic*, **bold**, ``code``, `links 
<https://www.sphinx-doc.org/en/master/>`_, and more.
-Here's a version removed message.
-.. versionremoved:: v0.1.1
-ERROR: Unknown directive type "versionremoved".
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/tests/sites/test_toc_special_docnames/conf.py 
new/pydata_sphinx_theme-0.21.0/tests/sites/test_toc_special_docnames/conf.py
--- 
old/pydata_sphinx_theme-0.19.0/tests/sites/test_toc_special_docnames/conf.py    
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/pydata_sphinx_theme-0.21.0/tests/sites/test_toc_special_docnames/conf.py    
    2026-08-25 16:11:27.520096500 +0200
@@ -0,0 +1,18 @@
+"""Test conf file."""
+
+# -- Project information -----------------------------------------------------
+
+project = "Test"
+copyright = "Test"
+author = "Test"
+
+# -- General configuration ---------------------------------------------------
+
+# root_doc = "index-* overridden in test"
+
+# -- Options for HTML output -------------------------------------------------
+
+html_theme = "pydata_sphinx_theme"
+
+# see https://github.com/sphinx-doc/sphinx/issues/13462
+linkcheck_allowed_redirects = {}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/tests/sites/test_toc_special_docnames/index-custom.rst
 
new/pydata_sphinx_theme-0.21.0/tests/sites/test_toc_special_docnames/index-custom.rst
--- 
old/pydata_sphinx_theme-0.19.0/tests/sites/test_toc_special_docnames/index-custom.rst
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/pydata_sphinx_theme-0.21.0/tests/sites/test_toc_special_docnames/index-custom.rst
       2026-08-25 16:11:27.520240000 +0200
@@ -0,0 +1,10 @@
+:orphan:
+
+Test
+====
+
+.. toctree::
+    Custom & Page <page1>
+    Custom & Index <genindex>
+    Custom & Module Index <modindex>
+    Custom & Search <search>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/tests/sites/test_toc_special_docnames/index-default.rst
 
new/pydata_sphinx_theme-0.21.0/tests/sites/test_toc_special_docnames/index-default.rst
--- 
old/pydata_sphinx_theme-0.19.0/tests/sites/test_toc_special_docnames/index-default.rst
      1970-01-01 01:00:00.000000000 +0100
+++ 
new/pydata_sphinx_theme-0.21.0/tests/sites/test_toc_special_docnames/index-default.rst
      2026-08-25 16:11:27.520240000 +0200
@@ -0,0 +1,10 @@
+:orphan:
+
+Test
+====
+
+.. toctree::
+    page1
+    genindex
+    modindex
+    search
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/tests/sites/test_toc_special_docnames/page1.rst 
new/pydata_sphinx_theme-0.21.0/tests/sites/test_toc_special_docnames/page1.rst
--- 
old/pydata_sphinx_theme-0.19.0/tests/sites/test_toc_special_docnames/page1.rst  
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/pydata_sphinx_theme-0.21.0/tests/sites/test_toc_special_docnames/page1.rst  
    2026-08-25 16:11:27.520240000 +0200
@@ -0,0 +1,4 @@
+.. module:: test
+
+The ``test`` module
+===================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/tests/test_build/test_toc_special_docnames_custom.html
 
new/pydata_sphinx_theme-0.21.0/tests/test_build/test_toc_special_docnames_custom.html
--- 
old/pydata_sphinx_theme-0.19.0/tests/test_build/test_toc_special_docnames_custom.html
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/pydata_sphinx_theme-0.21.0/tests/test_build/test_toc_special_docnames_custom.html
       2026-08-25 16:11:27.521077000 +0200
@@ -0,0 +1,22 @@
+<ul class="bd-navbar-elements navbar-nav">
+ <li class="nav-item">
+  <a class="nav-link nav-internal" href="page1.html">
+   Custom &amp; Page
+  </a>
+ </li>
+ <li class="nav-item">
+  <a class="nav-link nav-internal" href="genindex.html">
+   Custom &amp; Index
+  </a>
+ </li>
+ <li class="nav-item">
+  <a class="nav-link nav-internal" href="py-modindex.html">
+   Custom &amp; Module Index
+  </a>
+ </li>
+ <li class="nav-item">
+  <a class="nav-link nav-internal" href="search.html">
+   Custom &amp; Search
+  </a>
+ </li>
+</ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/tests/test_build/test_toc_special_docnames_default.html
 
new/pydata_sphinx_theme-0.21.0/tests/test_build/test_toc_special_docnames_default.html
--- 
old/pydata_sphinx_theme-0.19.0/tests/test_build/test_toc_special_docnames_default.html
      1970-01-01 01:00:00.000000000 +0100
+++ 
new/pydata_sphinx_theme-0.21.0/tests/test_build/test_toc_special_docnames_default.html
      2026-08-25 16:11:27.521077000 +0200
@@ -0,0 +1,22 @@
+<ul class="bd-navbar-elements navbar-nav">
+ <li class="nav-item">
+  <a class="nav-link nav-internal" href="page1.html">
+   The test module
+  </a>
+ </li>
+ <li class="nav-item">
+  <a class="nav-link nav-internal" href="genindex.html">
+   Index
+  </a>
+ </li>
+ <li class="nav-item">
+  <a class="nav-link nav-internal" href="py-modindex.html">
+   Python Module Index
+  </a>
+ </li>
+ <li class="nav-item">
+  <a class="nav-link nav-internal" href="search.html">
+   Search
+  </a>
+ </li>
+</ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/tests/test_build.py 
new/pydata_sphinx_theme-0.21.0/tests/test_build.py
--- old/pydata_sphinx_theme-0.19.0/tests/test_build.py  2026-06-15 
11:27:42.479704100 +0200
+++ new/pydata_sphinx_theme-0.21.0/tests/test_build.py  2026-08-25 
16:11:27.520900500 +0200
@@ -7,6 +7,8 @@
 import pytest
 import sphinx.errors
 
+from bs4 import BeautifulSoup
+
 from pydata_sphinx_theme.utils import escape_ansi
 
 
@@ -569,6 +571,71 @@
         assert "open" in ii.attrs
 
 
[email protected]("buildername", ["html", "dirhtml"])
[email protected]("show_nav_level", [0, 1, 2])
+def test_sidebar_toctree_cache(
+    sphinx_build_factory, make_app, monkeypatch, show_nav_level, buildername
+):
+    """Sidebars patched from the cache must be identical to freshly built ones.
+
+    With collapse_navigation=False (the default), the sidebar of the second,
+    third, ... page written in a given directory is produced by moving the
+    "current" markers within a cached soup of a sibling page's sidebar instead
+    of being resolved from scratch (see generate_toctree_html). "dirhtml" is
+    covered too: it gives every page its own output directory, so no two pages
+    can share a sidebar and the cache has to stay out of the way.
+    """
+    from pydata_sphinx_theme import toctree
+
+    # spy on the cache-hit helper so we know the fast path was really exercised
+    hits = []
+    orig = toctree._move_current_markers
+
+    def spy(*args, **kwargs):
+        result = orig(*args, **kwargs)
+        hits.append(result)
+        return result
+
+    monkeypatch.setattr(toctree, "_move_current_markers", spy)
+    confoverrides = {"html_theme_options.show_nav_level": show_nav_level}
+    build = sphinx_build_factory(
+        "sidebars", confoverrides=confoverrides, buildername=buildername
+    ).build()
+    if buildername == "html":
+        assert any(hits), "no sidebar was served from the cache"
+    else:
+        assert not hits, "sidebars must not be shared when page URIs are not 
flat"
+    with_cache = {
+        path: path.read_text("utf8") for path in 
sorted(build.outdir.rglob("*.html"))
+    }
+    # every sidebar link must point at a page that actually exists
+    for path, html in with_cache.items():
+        nav = BeautifulSoup(html, "html.parser").select_one("nav.bd-docs-nav")
+        if nav is None:
+            continue
+        for anchor in nav.select("a.reference.internal"):
+            href = anchor["href"]
+            if href == "#":
+                continue
+            target = (path.parent / href).resolve()
+            if target.is_dir():
+                target = target / "index.html"
+            assert target.exists(), f"{path}: dangling sidebar link {href!r}"
+
+    # build again from scratch with every cache lookup missing (so each page's
+    # sidebar is built the slow way) and check that all pages come out 
identical
+    monkeypatch.setattr(toctree, "_move_current_markers", lambda *a, **kw: 
False)
+    app = make_app(
+        srcdir=build.src,
+        confoverrides=confoverrides,
+        buildername=buildername,
+        freshenv=True,
+    )
+    app.build()
+    for path, cached_html in with_cache.items():
+        assert path.read_text("utf8") == cached_html, path
+
+
 def test_included_toc(sphinx_build_factory) -> None:
     """
     Test that Sphinx project containing TOC (.. toctree::) included via .. 
include::
@@ -583,6 +650,26 @@
     assert included_page_html is not None
 
 
[email protected]("root", ["default", "custom"])
+def test_toc_special_docnames(sphinx_build_factory, file_regression, root) -> 
None:
+    """
+    Test that Sphinx project with TOC (.. toctree::) referencing genindex, 
modindex or
+    search virtual docnames can be successfully built.
+    """
+    # Regression test for #2446.
+    root_doc = f"index-{root}"
+    sphinx_build = sphinx_build_factory(
+        "test_toc_special_docnames", confoverrides={"root_doc": root_doc}
+    ).build()
+    index_html = sphinx_build.html_tree(f"{root_doc}.html")
+    navbar = index_html.select("ul.bd-navbar-elements")[0]
+    file_regression.check(
+        navbar.prettify(),
+        basename=f"test_toc_special_docnames_{root}",
+        extension=".html",
+    )
+
+
 def test_footer(sphinx_build_factory) -> None:
     """Test for expected footer contents."""
     overrides = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydata_sphinx_theme-0.19.0/tests/test_bump_version.py 
new/pydata_sphinx_theme-0.21.0/tests/test_bump_version.py
--- old/pydata_sphinx_theme-0.19.0/tests/test_bump_version.py   1970-01-01 
01:00:00.000000000 +0100
+++ new/pydata_sphinx_theme-0.21.0/tests/test_bump_version.py   2026-08-25 
16:11:27.521077000 +0200
@@ -0,0 +1,77 @@
+"""Tests for tools/bump_version.py."""
+
+import importlib.util
+
+from pathlib import Path
+
+
+spec = importlib.util.spec_from_file_location(
+    "bump_version", Path(__file__).parents[1] / "tools" / "bump_version.py"
+)
+bump_version = importlib.util.module_from_spec(spec)
+spec.loader.exec_module(bump_version)
+
+DEV = {"version": "dev", "url": f"{bump_version.DOCS_URL}/en/latest/"}
+
+
+def stable_entry(version):
+    """Build the switcher entry for the current stable `version`."""
+    return {
+        "name": f"{version} (stable)",
+        "version": f"v{version}",
+        "url": f"{bump_version.DOCS_URL}/en/stable/",
+        "preferred": True,
+    }
+
+
+def archived_entry(version):
+    """Build the switcher entry for a past, non-stable `version`."""
+    return {
+        "name": version,
+        "version": f"v{version}",
+        "url": f"{bump_version.DOCS_URL}/en/v{version}/",
+    }
+
+
+def test_bump_to_rc_inserts_a_new_entry():
+    """A release candidate bump inserts a new entry, keeping stable in 
place."""
+    entries = [DEV, stable_entry("0.18.0")]
+
+    entries = bump_version.compute_new_entries(entries, "0.18.0", "0.19.0rc0")
+
+    assert entries == [
+        DEV,
+        {
+            "name": "0.19.0rc0",
+            "version": "v0.19.0rc0",
+            "url": f"{bump_version.DOCS_URL}/en/v0.19.0rc0/",
+        },
+        stable_entry("0.18.0"),
+    ]
+
+
+def test_bump_rc_to_rc_updates_in_place():
+    """A new candidate for the same release updates the rc entry in place."""
+    entries = [DEV, archived_entry("0.19.0rc0"), stable_entry("0.18.0")]
+
+    entries = bump_version.compute_new_entries(entries, "0.19.0rc0", 
"0.19.0rc1")
+
+    assert entries == [DEV, archived_entry("0.19.0rc1"), 
stable_entry("0.18.0")]
+
+
+def test_bump_from_rc_to_final_promotes_and_demotes():
+    """A final release promotes its rc entry and demotes the old stable."""
+    entries = [DEV, archived_entry("0.19.0rc0"), stable_entry("0.18.0")]
+
+    entries = bump_version.compute_new_entries(entries, "0.19.0rc0", "0.19.0")
+
+    assert entries == [DEV, stable_entry("0.19.0"), archived_entry("0.18.0")]
+
+
+def test_bump_without_a_preceding_rc_demotes_current_stable():
+    """With no rc entry to promote, the current stable itself is demoted."""
+    entries = [DEV, stable_entry("0.18.0")]
+
+    entries = bump_version.compute_new_entries(entries, "0.18.0", "0.18.1")
+
+    assert entries == [DEV, stable_entry("0.18.1"), archived_entry("0.18.0")]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/tests/test_playwright.py 
new/pydata_sphinx_theme-0.21.0/tests/test_playwright.py
--- old/pydata_sphinx_theme-0.19.0/tests/test_playwright.py     2026-06-15 
11:27:42.480128000 +0200
+++ new/pydata_sphinx_theme-0.21.0/tests/test_playwright.py     2026-08-25 
16:11:27.521077000 +0200
@@ -6,8 +6,8 @@
 
 import re
 
+from collections.abc import Callable
 from pathlib import Path
-from typing import Callable
 from urllib.parse import urljoin
 
 import pytest
@@ -96,6 +96,21 @@
     _check_test_site(site_name, site_path, check_version_switcher_highlighting)
 
 
+def test_version_switcher_dirhtml_homepage(
+    sphinx_build_factory: Callable, page: Page, url_base: str
+) -> None:
+    """#2434: relative json_url + dirhtml builder resolves the switcher url on 
home."""
+    site_name = "version_switcher_dirhtml"
+    sphinx_build = sphinx_build_factory("version_switcher", 
buildername="dirhtml")
+    sphinx_build.build()
+
+    def check_switcher_populated():
+        page.goto(urljoin(url_base, f"playwright_tests/{site_name}/"))
+        expect(page.get_by_role("option", 
include_hidden=True)).to_have_count(2)
+
+    _check_test_site(site_name, sphinx_build.outdir, check_switcher_populated)
+
+
 def test_colors(sphinx_build_factory: Callable, page: Page, url_base: str) -> 
None:
     """Test that things get colored the way we expect them to.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/tools/bump_version.py 
new/pydata_sphinx_theme-0.21.0/tools/bump_version.py
--- old/pydata_sphinx_theme-0.19.0/tools/bump_version.py        1970-01-01 
01:00:00.000000000 +0100
+++ new/pydata_sphinx_theme-0.21.0/tools/bump_version.py        2026-08-25 
16:11:27.521783600 +0200
@@ -0,0 +1,98 @@
+"""Bump the theme version and update the version switcher.
+
+Usage:
+    python tools/bump_version.py <new_version>
+
+Updates __init__.py.
+
+Updates switcher.json:
+- stable to stable: update preferred entry to new version, create entry for 
the previous
+- rc to stable: update preferred entry to new version, remove the rc.
+- stable to rc: don't touch the preferred entry, add the rc
+- rc to rc: don't touch the preferred entry, replace the old rc by the new rc.
+"""
+
+import json
+import re
+import sys
+
+from pathlib import Path
+
+
+ROOT = Path(__file__).parent.parent
+INIT_PY = ROOT / "src/pydata_sphinx_theme/__init__.py"
+SWITCHER_JSON = ROOT / "docs/_static/switcher.json"
+DOCS_URL = "https://pydata-sphinx-theme.readthedocs.io";
+
+
+def read_version():
+    """Read the current `__version__` from `__init__.py`."""
+    return re.search(r'__version__ = "(.*)"', INIT_PY.read_text()).group(1)
+
+
+def write_version(new_version):
+    """Overwrite `__version__` in `__init__.py` with `new_version`."""
+    pattern = r'__version__ = ".*"'
+    text = re.sub(pattern, f'__version__ = "{new_version}"', 
INIT_PY.read_text())
+    INIT_PY.write_text(text)
+
+
+def compute_new_entries(entries, old_version, new_version):
+    """Update the switcher `entries` in place for `old_version` -> 
`new_version`."""
+    current = next((e for e in entries if e["version"] == f"v{old_version}"), 
None)
+    was_rc = current is not None and not current.get("preferred")
+
+    if "rc" in new_version:
+        if was_rc:
+            # Another candidate for the same release: update it in place.
+            current["name"] = new_version
+            current["version"] = f"v{new_version}"
+            current["url"] = f"{DOCS_URL}/en/v{new_version}/"
+        else:
+            entries.insert(
+                1,
+                {
+                    "name": new_version,
+                    "version": f"v{new_version}",
+                    "url": f"{DOCS_URL}/en/v{new_version}/",
+                },
+            )
+        return entries
+
+    if was_rc:
+        stable = next(e for e in entries if e.get("preferred"))
+        stable["name"] = stable["version"].removeprefix("v")
+        stable["url"] = f"{DOCS_URL}/en/{stable['version']}/"
+        del stable["preferred"]
+    else:
+        # No release candidate preceded this release: demote it ourselves.
+        entries.insert(
+            entries.index(current) + 1,
+            {
+                "name": old_version,
+                "version": f"v{old_version}",
+                "url": f"{DOCS_URL}/en/v{old_version}/",
+            },
+        )
+
+    current["name"] = f"{new_version} (stable)"
+    current["version"] = f"v{new_version}"
+    current["url"] = f"{DOCS_URL}/en/stable/"
+    current["preferred"] = True
+    return entries
+
+
+def main(new_version):
+    """Bump `__init__.py` and the switcher to `new_version`."""
+    old_version = read_version()
+    write_version(new_version)
+
+    switcher = json.loads(SWITCHER_JSON.read_text())
+    entries = compute_new_entries(switcher, old_version, new_version)
+    SWITCHER_JSON.write_text(json.dumps(entries, indent=2) + "\n")
+
+
+if __name__ == "__main__":
+    if len(sys.argv) != 2 or sys.argv[1] in ("-h", "--help"):
+        sys.exit(f"usage: {sys.argv[0]} <new_version>")
+    main(sys.argv[1])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydata_sphinx_theme-0.19.0/tox.ini 
new/pydata_sphinx_theme-0.21.0/tox.ini
--- old/pydata_sphinx_theme-0.19.0/tox.ini      2026-06-15 11:27:42.480471100 
+0200
+++ new/pydata_sphinx_theme-0.21.0/tox.ini      2026-08-25 16:11:27.521900400 
+0200
@@ -53,11 +53,11 @@
 # the tests without `compile-assets,i18n-compile`, for example:
 # tox run -e py310-tests
 # run tests with a specific Sphinx version
-# tox run -e compile-assets,i18n-compile,py310-sphinx80-tests
+# tox run -e compile-assets,i18n-compile,py310-sphinx82-tests
 # run tests without coverage
 # tox run -e compile-assets,i18n-compile,py310-tests-no-cov
 # by default we will retain playwright traces on failure
-[testenv:py3{10,11,12,13,14}{,-sphinx80,-sphinxdev,}-tests{,-no-cov}]
+[testenv:py3{11,12,13,14}{,-sphinx82,-sphinxdev,}-tests{,-no-cov}]
 description = "Run tests Python and Sphinx versions. If a Sphinx version is 
specified, it will use that version vs the default in pyproject.toml"
 # need to ensure the package is installed in editable mode
 package = editable
@@ -66,7 +66,7 @@
 pass_env = GITHUB_ACTIONS # so we can check if this is run on GitHub Actions
 deps =
     coverage[toml]
-    py310-sphinx80-tests: sphinx~=8.0.0
+    py311-sphinx82-tests: sphinx~=8.2.0
     py314-sphinxdev: sphinx[test] @ 
git+https://github.com/sphinx-doc/sphinx.git@master
 depends =
     compile-assets,
@@ -76,8 +76,8 @@
     bash
 commands =
     bash -c 'if [[ "{env:GITHUB_ACTIONS:}" == "true" ]]; then playwright 
install --with-deps; else playwright install; fi'
-    py3{10,11,12,13,14}{,-sphinx80,-sphinxdev,}-tests: coverage run -m pytest 
-m "not a11y" {posargs:--tracing=retain-on-failure}
-    py3{10,11,12,13,14}{,-sphinx80,-sphinxdev,}-tests-no-cov: pytest -m "not 
a11y" {posargs:--tracing=retain-on-failure}
+    py3{11,12,13,14}{,-sphinx82,-sphinxdev,}-tests: coverage run -m pytest -m 
"not a11y" {posargs:--tracing=retain-on-failure}
+    py3{11,12,13,14}{,-sphinx82,-sphinxdev,}-tests-no-cov: pytest -m "not 
a11y" {posargs:--tracing=retain-on-failure}
 
 # run accessibility tests with Playwright and axe-core
 # compiling the assets is needed before running the tests
@@ -85,7 +85,7 @@
 # by default we will retain playwright traces on failure and run the tests on 
chromium
 # to run the tests on firefox you can call:
 # tox run -e compile,py314-docs,a11y-tests-firefox
-[testenv:a11y-tests{-chromium,-firefox}]
+[testenv:a11y-tests{,-chromium,-firefox}]
 description = "run accessibility tests with Playwright and axe-core"
 base_python = py314 # keep in sync with tests.yml
 pass_env = GITHUB_ACTIONS # so we can check if this is run on GitHub Actions
@@ -107,16 +107,16 @@
 # build PST documentation with the default or a specific Sphinx version
 # since we are building the documentation we install the packaged dev version 
of PST
 # tox run -e py310-docs
-# tox run -e py310-sphinx80-docs
-[testenv:py3{10,14}{,-sphinx80}-docs]
+# tox run -e py310-sphinx82-docs
+[testenv:py3{11,14}{,-sphinx82}-docs]
 description = build the documentation and place in docs/_build/html
 # suppress Py3.11's new "can't debug frozen modules" warning
 set_env = PYDEVD_DISABLE_FILE_VALIDATION=1
 # keep this in sync across all docs environments
 extras = {[testenv:docs-no-checks]extras}
 deps =
-    py310-sphinx80-docs: sphinx~=8.0.0
-    py310-sphinx80-docs: astroid>=3.0,!=4.0.3
+    py311-sphinx82-docs: sphinx~=8.2.0
+    py311-sphinx82-docs: astroid>=3.0,!=4.0.3
 depends =
     compile-assets,
     i18n-compile

Reply via email to