diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css
deleted file mode 100644
index 3ed87891439..00000000000
--- a/docs/_static/css/custom.css
+++ /dev/null
@@ -1,23 +0,0 @@
-.team-roster a img {
- border-radius: 50%;
- box-shadow: 0 0 0 7px #fff, 0 0 0 8px #cecece;
- margin: 9px 17px 9px 3px;
-}
-
-
-/* Center the RTD placement when not wide enough to float */
-#rtd-stickybox-container {
- text-align: center;
-}
-
-.wy-menu.wy-menu-vertical a.reference.external::after {
- /* \00a0 = no break space */
- content: "\00a0\f08e";
- font-family: FontAwesome;
- display: inline-block;
- font-style: normal;
- font-variant: normal;
- text-rendering: auto;
- -webkit-font-smoothing: antialiased;
-
-}
diff --git a/docs/_static/img/logo-dark-text.svg b/docs/_static/img/logo-dark-text.svg
new file mode 100644
index 00000000000..9a46fffa675
--- /dev/null
+++ b/docs/_static/img/logo-dark-text.svg
@@ -0,0 +1,134 @@
+
+
+
+
diff --git a/docs/_static/img/logo-light-text.svg b/docs/_static/img/logo-light-text.svg
new file mode 100644
index 00000000000..d0cbb66a1f3
--- /dev/null
+++ b/docs/_static/img/logo-light-text.svg
@@ -0,0 +1,134 @@
+
+
+
+
diff --git a/docs/_templates/breadcrumbs.html b/docs/_templates/breadcrumbs.html
deleted file mode 100644
index 69b5fd94e49..00000000000
--- a/docs/_templates/breadcrumbs.html
+++ /dev/null
@@ -1,14 +0,0 @@
-{% extends "!breadcrumbs.html" %}
-
-{% block breadcrumbs %}
- {# Close the parent
, inject CTA, reopen — hacky but avoids copying the full template #}
-
-
-
- {{ super() }}
-{% endblock %}
diff --git a/docs/conf.py b/docs/conf.py
index 673ba70f288..d2be5e83039 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -154,15 +154,19 @@
]
gettext_compact = False
-html_theme = "sphinx_rtd_theme"
+html_theme = "furo"
html_static_path = ["_static", f"{docset}/_static"]
-html_css_files = ["css/custom.css", "css/sphinx_prompt_css.css"]
+html_css_files = ["css/sphinx_prompt_css.css"]
html_js_files = ["js/expand_tabs.js"]
-html_logo = "img/logo.svg"
+# The wordmark is white-on-dark, so ship a dark-text variant for light mode
+# and reuse the original for dark mode.
html_theme_options = {
- "logo_only": True,
+ "light_logo": "img/logo-dark-text.svg",
+ "dark_logo": "img/logo-light-text.svg",
+ "sidebar_hide_name": True,
}
+
html_context = {
# Fix the "edit on" links.
# TODO: remove once we support different rtd config
diff --git a/requirements/docs.in b/requirements/docs.in
index 8663f967909..8b63173e4e7 100644
--- a/requirements/docs.in
+++ b/requirements/docs.in
@@ -7,7 +7,7 @@ sphinx==8.2.3
matplotlib # opengraph social cards
-sphinx_rtd_theme
+furo
sphinx-tabs
sphinx-intl
sphinx-design
diff --git a/requirements/docs.txt b/requirements/docs.txt
index 1872f1239ee..418f3a4f246 100644
--- a/requirements/docs.txt
+++ b/requirements/docs.txt
@@ -1,9 +1,7 @@
-#
-# This file is autogenerated by pip-compile with Python 3.12
-# by the following command:
-#
-# pip-compile --output-file=requirements/docs.txt requirements/docs.in
-#
+# This file was autogenerated by uv via the following command:
+# uv pip compile requirements/docs.in --output-file=requirements/docs.txt
+accessible-pygments==0.0.5
+ # via furo
alabaster==1.0.0
# via sphinx
anyio==4.13.0
@@ -14,6 +12,8 @@ babel==2.18.0
# via
# sphinx
# sphinx-intl
+beautifulsoup4==4.14.3
+ # via furo
certifi==2026.4.22
# via
# requests
@@ -35,10 +35,11 @@ docutils==0.21.2
# myst-parser
# sphinx
# sphinx-prompt
- # sphinx-rtd-theme
# sphinx-tabs
fonttools==4.62.1
# via matplotlib
+furo==2025.12.19
+ # via -r requirements/docs.in
h11==0.16.0
# via uvicorn
idna==3.13
@@ -83,6 +84,8 @@ pillow==12.2.0
# via matplotlib
pygments==2.20.0
# via
+ # accessible-pygments
+ # furo
# sphinx
# sphinx-prompt
# sphinx-tabs
@@ -100,28 +103,34 @@ roman-numerals==4.1.0
# via roman-numerals-py
roman-numerals-py==4.1.0
# via sphinx
+setuptools==82.0.1
+ # via pbr
six==1.17.0
# via python-dateutil
snowballstemmer==3.0.1
# via sphinx
+soupsieve==2.8.3
+ # via beautifulsoup4
sphinx==8.2.3
# via
# -r requirements/docs.in
+ # furo
# myst-parser
# sphinx-autobuild
+ # sphinx-basic-ng
# sphinx-copybutton
# sphinx-design
# sphinx-intl
# sphinx-notfound-page
# sphinx-prompt
- # sphinx-rtd-theme
# sphinx-tabs
# sphinxcontrib-httpdomain
- # sphinxcontrib-jquery
# sphinxemoji
# sphinxext-opengraph
sphinx-autobuild==2025.8.25
# via -r requirements/docs.in
+sphinx-basic-ng==1.0.0b2
+ # via furo
sphinx-copybutton==0.5.2
# via -r requirements/docs.in
sphinx-design==0.7.0
@@ -134,8 +143,6 @@ sphinx-notfound-page==1.1.0
# via -r requirements/docs.in
sphinx-prompt==1.10.2
# via -r requirements/docs.in
-sphinx-rtd-theme==3.1.0
- # via -r requirements/docs.in
sphinx-tabs==3.5.0
# via -r requirements/docs.in
sphinxcontrib-applehelp==2.0.0
@@ -146,15 +153,13 @@ sphinxcontrib-htmlhelp==2.1.0
# via sphinx
sphinxcontrib-httpdomain==2.0.0
# via -r requirements/docs.in
-sphinxcontrib-jquery==4.1
- # via sphinx-rtd-theme
sphinxcontrib-jsmath==1.0.1
# via sphinx
sphinxcontrib-qthelp==2.0.0
# via sphinx
sphinxcontrib-serializinghtml==2.0.0
# via sphinx
-sphinxcontrib-video @ git+https://github.com/readthedocs/sphinxcontrib-video/
+sphinxcontrib-video @ git+https://github.com/readthedocs/sphinxcontrib-video/@6aa06beb7e47de3426a6cf639bb027b4c7e87b88
# via -r requirements/docs.in
sphinxemoji==0.3.2
# via -r requirements/docs.in
@@ -165,6 +170,7 @@ starlette==1.0.0
typing-extensions==4.15.0
# via
# anyio
+ # beautifulsoup4
# starlette
urllib3==2.6.3
# via
@@ -176,6 +182,3 @@ watchfiles==1.1.1
# via sphinx-autobuild
websockets==16.0
# via sphinx-autobuild
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools