diff --git a/.github/workflows/license-exceptions.json b/.github/workflows/license-exceptions.json
index 27b3b9c6552..8be7741529a 100644
--- a/.github/workflows/license-exceptions.json
+++ b/.github/workflows/license-exceptions.json
@@ -240,6 +240,11 @@
"package": "certifi",
"license": "Mozilla Public License 2.0 (MPL 2.0)"
},
+ {
+ "package": "nvidia-sphinx-theme",
+ "license": null,
+ "comment": "BSD"
+ },
{
"package": "rl_games",
"license": "UNKNOWN",
diff --git a/docs/Makefile b/docs/Makefile
index 0bff236671c..2d0d08b5ad1 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -10,8 +10,13 @@ BUILDDIR = _build
.PHONY: multi-docs
multi-docs:
+ @echo "Generating version switcher..."
+ @python3 generate_switcher.py
+ @echo "Building multi-version documentation..."
@sphinx-multiversion "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS)
+ @echo "Copying redirect page..."
@cp _redirect/index.html $(BUILDDIR)/index.html
+ @echo "Documentation built successfully!"
.PHONY: current-docs
current-docs:
diff --git a/docs/README.md b/docs/README.md
index 69a77a48d90..5768561bd72 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,6 +1,6 @@
# Building Documentation
-We use [Sphinx](https://www.sphinx-doc.org/en/master/) with the [Book Theme](https://sphinx-book-theme.readthedocs.io/en/stable/) for maintaining and generating our documentation.
+We use [Sphinx](https://www.sphinx-doc.org/en/master/) with NVIDIA's modified version of the [PyData Sphinx Theme](https://pydata-sphinx-theme.readthedocs.io/en/stable/) for maintaining and generating our documentation.
> **Note:** To avoid dependency conflicts, we strongly recommend using a Python virtual environment to isolate the required dependencies from your system's global Python environment.
@@ -22,6 +22,7 @@ make current-docs
# 3. Open the current docs
xdg-open _build/current/index.html
```
+
Windows
@@ -37,8 +38,8 @@ make current-docs
:: 3. Open the current docs
start _build\current\index.html
```
-
+
## Multi-Version Documentation
@@ -72,4 +73,5 @@ make multi-docs
:: 3. Open the multi-version docs
start _build\index.html
```
+
diff --git a/docs/_templates/versioning.html b/docs/_templates/versioning.html
deleted file mode 100644
index eb67be60e1c..00000000000
--- a/docs/_templates/versioning.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{% if versions %}
-
-{% endif %}
diff --git a/docs/conf.py b/docs/conf.py
index 248e14c3f89..b986146cf5f 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -17,9 +17,12 @@
#
import os
import sys
+from datetime import datetime
sys.path.insert(0, os.path.abspath("../source/isaaclab"))
sys.path.insert(0, os.path.abspath("../source/isaaclab/isaaclab"))
+sys.path.insert(0, os.path.abspath("../source/isaaclab_contrib"))
+sys.path.insert(0, os.path.abspath("../source/isaaclab_contrib/isaaclab_contrib"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_assets"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_assets/isaaclab_assets"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_tasks"))
@@ -28,13 +31,11 @@
sys.path.insert(0, os.path.abspath("../source/isaaclab_rl/isaaclab_rl"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_mimic"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_mimic/isaaclab_mimic"))
-sys.path.insert(0, os.path.abspath("../source/isaaclab_contrib"))
-sys.path.insert(0, os.path.abspath("../source/isaaclab_contrib/isaaclab_contrib"))
# -- Project information -----------------------------------------------------
project = "Isaac Lab"
-copyright = "2022-2025, The Isaac Lab Project Developers."
+copyright = f"2022-{datetime.now().year}, The Isaac Lab Project Developers."
author = "The Isaac Lab Project Developers."
# Read version from the package
@@ -227,11 +228,8 @@
# -- Options for HTML output -------------------------------------------------
-import sphinx_book_theme
-
-html_title = "Isaac Lab Documentation"
-html_theme_path = [sphinx_book_theme.get_html_theme_path()]
-html_theme = "sphinx_book_theme"
+html_title = "Isaac Lab"
+html_theme = "nvidia_sphinx_theme"
html_favicon = "source/_static/favicon.ico"
html_show_copyright = True
html_show_sphinx = False
@@ -243,56 +241,59 @@
html_static_path = ["source/_static/css"]
html_css_files = ["custom.css"]
+html_context = {
+ "github_user": "isaac-sim",
+ "github_repo": "IsaacLab",
+ "github_version": "main",
+ "doc_path": "docs",
+}
html_theme_options = {
- "path_to_docs": "docs/",
+ "pygments_light_style": "tango",
+ "pygments_dark_style": "monokai",
"collapse_navigation": True,
- "repository_url": "https://github.com/isaac-sim/IsaacLab",
- "use_repository_button": True,
- "use_issues_button": True,
+ "copyright_override": {"start": 2022},
+ "github_url": "https://github.com/isaac-sim/IsaacLab",
+ "secondary_sidebar_items": ["page-toc", "edit-this-page"],
"use_edit_page_button": True,
- "show_toc_level": 1,
- "use_sidenotes": True,
- "logo": {
- "text": "Isaac Lab Documentation",
- "image_light": "source/_static/NVIDIA-logo-white.png",
- "image_dark": "source/_static/NVIDIA-logo-black.png",
+ "navigation_depth": 2,
+ "switcher": {
+ "json_url": "https://isaac-sim.github.io/IsaacLab/main/_static/switcher.json",
+ "version_match": os.environ.get("SMV_CURRENT_VERSION", "main"),
},
+ "check_switcher": False, # Disable switcher check during local builds
"icon_links": [
{
- "name": "GitHub",
- "url": "https://github.com/isaac-sim/IsaacLab",
- "icon": "fa-brands fa-square-github",
+ "name": "Docker",
+ "url": "https://catalog.ngc.nvidia.com/orgs/nvidia/containers/isaac-lab",
+ "icon": "fa-brands fa-docker",
"type": "fontawesome",
},
{
- "name": "Isaac Sim",
- "url": "https://developer.nvidia.com/isaac-sim",
- "icon": "https://img.shields.io/badge/IsaacSim-5.1.0-silver.svg",
- "type": "url",
- },
- {
- "name": "Stars",
- "url": "https://img.shields.io/github/stars/isaac-sim/IsaacLab?color=fedcba",
- "icon": "https://img.shields.io/github/stars/isaac-sim/IsaacLab?color=fedcba",
- "type": "url",
+ "name": "PyPI",
+ "url": "https://pypi.org/project/isaaclab",
+ "icon": "fa-brands fa-python",
+ "type": "fontawesome",
},
],
- "icon_links_label": "Quick Links",
+ "footer_links": {},
}
templates_path = [
"_templates",
]
-# Whitelist pattern for remotes
+# -- Sphinx-multiversion configuration --------------------------------------
+
+# Whitelist pattern for remotes (branches/tags from which remote to include)
smv_remote_whitelist = r"^.*$"
# Whitelist pattern for branches (set to None to ignore all branches)
-smv_branch_whitelist = os.getenv("SMV_BRANCH_WHITELIST", r"^(main|devel|release/.*)$")
+smv_branch_whitelist = os.getenv("SMV_BRANCH_WHITELIST", r"^(main)$")
# Whitelist pattern for tags (set to None to ignore all tags)
smv_tag_whitelist = os.getenv("SMV_TAG_WHITELIST", r"^v[1-9]\d*\.\d+\.\d+$")
-html_sidebars = {
- "**": ["navbar-logo.html", "versioning.html", "icon-links.html", "search-field.html", "sbt-sidebar-nav.html"]
-}
+# Output directory format for each version
+smv_outputdir_format = "{ref.name}"
+# Prefer remote refs over local refs
+smv_prefer_remote_refs = False
# -- Advanced configuration -------------------------------------------------
diff --git a/docs/generate_switcher.py b/docs/generate_switcher.py
new file mode 100755
index 00000000000..647e3b9a76c
--- /dev/null
+++ b/docs/generate_switcher.py
@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+"""Generate switcher.json for version dropdown from git tags and branches."""
+
+import json
+import os
+import re
+import subprocess
+from pathlib import Path
+
+
+def get_git_tags_and_branches():
+ """Get all tags and branches matching the sphinx-multiversion patterns."""
+ # Get tag whitelist pattern from environment or use default
+ tag_pattern = os.getenv("SMV_TAG_WHITELIST", r"^v[1-9]\d*\.\d+\.\d+$")
+ branch_pattern = os.getenv("SMV_BRANCH_WHITELIST", r"^(main)$")
+
+ versions = []
+
+ # Get all tags
+ try:
+ result = subprocess.run(["git", "tag", "-l"], capture_output=True, text=True, check=True)
+ tags = result.stdout.strip().split("\n")
+ tags = [t for t in tags if t and re.match(tag_pattern, t)]
+
+ # Sort tags by version (newest first)
+ def version_key(tag):
+ # Extract version numbers from tag like v1.2.3
+ match = re.match(r"^v?(\d+)\.(\d+)\.(\d+)", tag)
+ if match:
+ return tuple(int(x) for x in match.groups())
+ return (0, 0, 0)
+
+ tags.sort(key=version_key, reverse=True)
+
+ # remove tags older than version 2.0.2
+ tags = [t for t in tags if version_key(t) >= (2, 0, 2)]
+
+ for tag in tags:
+ version_num = tag.lstrip("v")
+ versions.append({
+ "version": version_num,
+ "name": f"v{version_num}",
+ "url": f"https://isaac-sim.github.io/IsaacLab/{tag}/",
+ })
+
+ except subprocess.CalledProcessError:
+ print("Warning: Could not get git tags")
+
+ # Mark the latest tag as stable/preferred
+ if versions:
+ versions[0]["name"] = f"{versions[0]['name']} (stable)"
+ versions[0]["preferred"] = True
+
+ # Get all branches
+ try:
+ result = subprocess.run(["git", "branch", "-r"], capture_output=True, text=True, check=True)
+ branches = result.stdout.strip().split("\n")
+ # Clean up branch names (remove origin/ prefix and whitespace)
+ branches = [b.strip().replace("origin/", "") for b in branches if b.strip()]
+ # Filter by pattern and exclude HEAD
+ branches = [b for b in branches if b and re.match(branch_pattern, b) and "HEAD" not in b]
+
+ for branch in branches:
+ if branch == "main":
+ versions.insert(
+ 0,
+ {
+ "version": "main",
+ "name": "main (latest)",
+ "url": "https://isaac-sim.github.io/IsaacLab/main/",
+ },
+ )
+ elif branch == "devel":
+ versions.insert(
+ 1 if "main" in [v["version"] for v in versions] else 0,
+ {
+ "version": "dev",
+ "name": "devel (development)",
+ "url": "https://isaac-sim.github.io/IsaacLab/devel/",
+ },
+ )
+ else:
+ versions.append({
+ "version": branch,
+ "name": branch,
+ "url": f"https://isaac-sim.github.io/IsaacLab/{branch}/",
+ })
+
+ except subprocess.CalledProcessError:
+ print("Warning: Could not get git branches")
+
+ return versions
+
+
+def main():
+ """Generate switcher.json file."""
+ # Get the docs directory
+ docs_dir = Path(__file__).parent
+ static_dir = docs_dir / "source" / "_static"
+ static_dir.mkdir(parents=True, exist_ok=True)
+
+ # Generate version list
+ versions = get_git_tags_and_branches()
+
+ if not versions:
+ print("Warning: No versions found!")
+ versions = [{
+ "version": "main",
+ "name": "main (latest)",
+ "url": "https://isaac-sim.github.io/IsaacLab/main/",
+ "preferred": True,
+ }]
+
+ # Write switcher.json
+ switcher_file = static_dir / "switcher.json"
+ with open(switcher_file, "w") as f:
+ json.dump(versions, f, indent=4)
+
+ print(f"Generated {switcher_file} with {len(versions)} versions:")
+ for v in versions:
+ print(f" - {v['name']} ({v['version']})")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/docs/licenses/dependencies/nvidia-sphinx-theme-license.txt b/docs/licenses/dependencies/nvidia-sphinx-theme-license.txt
new file mode 100644
index 00000000000..809db98d338
--- /dev/null
+++ b/docs/licenses/dependencies/nvidia-sphinx-theme-license.txt
@@ -0,0 +1,84 @@
+NVIDIA LICENSE AGREEMENT
+
+This NVIDIA License Agreement (“AGREEMENT”) is a legal agreement between you and NVIDIA Corporation ("NVIDIA") and governs your use of the NVIDIA font, icons and other assets, and software, in each case if and when available (“Licensed Materials”).
+
+This AGREEMENT can be accepted only by an adult of legal age of majority in the country in which the Licensed Materials is used. If you are under the legal age of majority, you must ask your parent or legal guardian to consent to this AGREEMENT. If you are entering into this AGREEMENT on behalf of a company or other legal entity, you represent that you have legal authority and “you” will mean the entity you represent.
+
+By using the Licensed Materials, you affirm that you have reached the legal age of majority, you accept the terms of this AGREEMENT, and you take legal and financial responsibility for the actions of your permitted users.
+
+You agree to use the Licensed Materials only for purposes that are permitted by (a) this AGREEMENT, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions.
+
+1. LICENSE. Subject to the terms of this AGREEMENT, NVIDIA hereby grants you a limited, non-exclusive, non-assignable, non-transferable, non-sublicensable (except as expressly provided in this AGREEMENT) license to:
+1.1 use, copy and reproduce the Licensed Materials when provided in an NVIDIA products or service with the applicable NVIDIA product or service; and
+1.2 use, copy and reproduce the Licensed Materials when provided stand-alone with products, related packaging, advertising marketing collaterals and assets used for offline or online marketing, and web sites, in each case, in connection with NVIDIA’s products and services only (“PERMITTED PRODUCTS”).
+
+2. LIMITATIONS. Your license to use the Licensed Materials is restricted as follows:
+2.1 For Licensed Materials provided with an NVIDIA product or service, you must not separate or use the Licensed Materials apart from the applicable product or service.
+2.2 You may not reverse engineer, decompile or disassemble, or remove copyright or other proprietary notices from any portion of the Licensed Materials or copies of the Licensed Materials.
+2.3 Except as provided in this AGREEMENT, you may not copy, modify, adapt, convert the Licensed Materials, nor create derivative works from the Licensed Materials or any portion thereof. Further, you may not use the Licensed Materials in connection with software and/or hardware which create derivative works of such Licensed Materials.
+2.4 Except as provided in this AGREEMENT, you may not sell, rent, sublicense, transfer or distribute the Licensed Materials, or make its functionality available to others, or embed the Licensed Materials into a product or other content that is not a PERMITTED PRODUCT.
+2.5 You may not use the Licensed Materials for the purpose of developing competing products or technologies or assisting a third party in such activities.
+2.6 You may not bypass, disable, or circumvent any technical limitations, encryption, security, digital rights management or authentication mechanism in the Licensed Materials.
+2.7 You may not use the Licensed Materials in any manner that would cause it to become subject to an OSS License. “OSS License” means any software, data or documentation subject to any license identified as an open source license by the Open Source Initiative (http://opensource.org), Free Software Foundation (http://www.fsf.org) or other similar open source organization or listed by the Software Package Data Exchange (SPDX) Workgroup under the Linux Foundation (http://www.spdx.org).
+
+3. AUTHORIZED USERS. You may allow employees and contractors of your entity or of your subsidiary(ies) to access and use the Licensed Materials from your secure network to perform work on your behalf. If you are an academic institution you may allow users enrolled or employed by the academic institution to access and use the Licensed Materials from your secure network. You are responsible for the compliance with the terms of this AGREEMENT by your authorized users.
+
+4. UPDATES. NVIDIA is not obligated to support or update the Licensed Materials. This AGREEMENT also applies to Licensed Materials patches, workarounds or other updates, each of which will be deemed part of the Licensed Materials, unless other terms accompany those items.
+
+5. OWNERSHIP. NVIDIA reserves all rights, title and interest in and to the Licensed Materials not expressly granted to you under this AGREEMENT. The Licensed Materials and the related intellectual property rights therein, and all derivative works thereof, are and will remain the sole and exclusive property of NVIDIA or its licensors. The Licensed Materials is copyrighted and protected by the laws of the United States and other countries, and international treaty provisions.
+
+You agree to use trademarks associated with the Licensed Materials in accordance with the NVIDIA Trademark License Agreement (https://www.nvidia.com/content/dam/en-zz/Solutions/about-us/documents/Trademark-License-Agreement.pdf) and the NVIDIA Trademark and Logo Usage Guidelines (https://www.nvidia.com/content/dam/en-zz/Solutions/about-us/documents/NVIDIA-Trademark-and-Logo-Usage-Guidelines.pdf), including identification of the trademark owner and only in reference to output produced by the Licensed Materials. Referring to a trademark does not give you any ownership rights for that trademark and all use of any trademark shall inure to the sole benefit of NVIDIA. You may not change any trademark or trade name designation for the Licensed Materials.
+
+6. FEEDBACK. You may, but are not obligated to, provide to NVIDIA suggestions, fixes, modifications, feature requests or other feedback regarding the Licensed Materials (“Feedback”). Feedback, even if designated as confidential by Customer, will not create any confidentiality obligation for NVIDIA or its Affiliates beyond not identifying Customer as the source of the Feedback. If Customer provides Feedback, Customer hereby grants NVIDIA, its Affiliates and its designees a non-exclusive, perpetual, irrevocable, sublicensable, worldwide, royalty-free, fully paid-up, and transferable license, under Customer’s Intellectual Property Rights, to publicly perform, publicly display, reproduce, use, make, have made, sell, offer for sale, distribute (through multiple tiers of distribution), import, create derivative works of, and otherwise commercialize and exploit the Feedback for any purpose at NVIDIA’s discretion. NVIDIA agrees that Customer Feedback is provided “as-is” without a warranty of any kind.
+
+7. NO WARRANTIES. THE LICENSED MATERIALS ARE PROVIDED "AS IS". TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, NVIDIA DISCLAIMS ALL WARRANTIES AND REPRESENTATIONS OF ANY KIND, WHETHER EXPRESS, IMPLIED OR STATUTORY, RELATING TO OR ARISING UNDER THE AGREEMENT, INCLUDING, WITHOUT LIMITATION, THE WARRANTIES OF TITLE, NONINFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, USAGE OF TRADE AND COURSE OF DEALING. NVIDIA DOES NOT WARRANT THAT THE LICENSED MATERIALS WILL MEET YOUR REQUIREMENTS OR THAT THE OPERATION THEREOF WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ALL ERRORS WILL BE CORRECTED. NVIDIA does not warrant or assume responsibility for the accuracy or completeness of any information, text, graphics, links or other items contained within the Licensed Materials.
+
+8. LIMITATIONS OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL NVIDIA BE LIABLE FOR ANY (I) INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, OR (II) DAMAGES FOR THE (A) COST OF PROCURING SUBSTITUTE GOODS OR (B) LOSS OF PROFITS, REVENUES, USE, DATA OR GOODWILL ARISING OUT OF OR RELATED TO THIS AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY, OR OTHERWISE, AND EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND EVEN IF A PARTY'S REMEDIES FAIL THEIR ESSENTIAL PURPOSE. ADDITIONALLY, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, NVIDIA’S TOTAL CUMULATIVE AGGREGATE LIABILITY FOR ANY AND ALL LIABILITIES, OBLIGATIONS OR CLAIMS ARISING OUT OF OR RELATED TO THIS AGREEMENT WILL NOT EXCEED TEN U.S. DOLLARS (US$10).
+
+9. TERMINATION. Your rights under this AGREEMENT will terminate automatically without notice from NVIDIA if you fail to comply with any term of this AGREEMENT or if you commence or participate in any legal proceeding against NVIDIA with respect to the Licensed Materials. NVIDIA may terminate this AGREEMENT with advance written notice to you. Upon any termination of this AGREEMENT, you agree to promptly discontinue use of the Licensed Materials and destroy all copies in your possession or control. All provisions of this AGREEMENT will survive termination, except for the license granted to you and Section 3.
+
+10. APPLICABLE LAW. This AGREEMENT will be governed in all respects by the laws of the United States and of the State of Delaware, without regard to the conflicts of laws principles. The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. You agree to all terms of this AGREEMENT in the English language. The state or federal courts residing in Santa Clara County, California shall have exclusive jurisdiction over any dispute or claim arising out of this AGREEMENT. Notwithstanding this, you agree that NVIDIA shall still be allowed to apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction.
+
+11. NO ASSIGNMENT. This AGREMEENT and your rights and obligations thereunder may not be assigned by you by any means or operation of law without NVIDIA’s permission. Any attempted assignment not approved by NVIDIA in writing shall be void and of no effect.
+
+12. EXPORT. The Licensed Materials is subject to United States export laws and regulations. You agree to comply with all applicable U.S. and international export laws, including the Export Administration Regulations (EAR) administered by the U.S. Department of Commerce and economic sanctions administered by the U.S. Department of Treasury’s Office of Foreign Assets Control (OFAC). These laws include restrictions on destinations, end-users and end-use. By accepting this AGREEMENT, you confirm that you are not currently residing in a country or region currently embargoed by the U.S. and that you are not otherwise prohibited from receiving the Licensed Materials.
+
+13. GOVERNMENT USE. The Software, including its documentation and technology (“Protected Items”), are “Commercial products” as this term is defined at 48 C.F.R. 2.101, consisting of “commercial computer software” and “commercial computer software documentation” as such terms are used in, respectively, 48 C.F.R. 12.212 and 48 C.F.R. 227.7202 & 252.227-7014(a)(1). Before any Protected Items are supplied to the U.S. Government, you will (i) inform the U.S. Government in writing that the Protected Items are and must be treated as commercial computer software and commercial computer software documentation developed at private expense; (ii) inform the U.S. Government that the Protected Items are provided subject to the terms of this Agreement; and (iii) mark the Protected Items as commercial computer software and commercial computer software documentation developed at private expense. In no event will you permit the U.S. Government to acquire rights in Protected Items beyond those specified in 48 C.F.R. 52.227-19(b)(1)-(2) or 252.227-7013(c) except as expressly approved by NVIDIA in writing.
+
+14. NOTICES. Please direct your legal notices or other correspondence to NVIDIA Corporation, 2788 San Tomas Expressway, Santa Clara, California 95051, United States of America, Attention: Legal Department, with an emailed copy to legalnotices@nvidia.com.
+
+15. ENTIRE AGREEMENT. Regarding the subject matter of this Agreement, the parties agree that this Agreement constitutes the entire and exclusive agreement between the parties regarding the Licensed Materials and supersedes all prior and contemporaneous communications. If any provision of this Agreement is deemed invalid by a court of competent jurisdiction, the invalidity of such provision will not affect the validity of the remaining provisions of this Agreement, which will remain in full force and effect.
+
+(v. July 1, 2024)
+
+---
+
+BSD 3-Clause License
+
+Copyright (c) 2018, pandas
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 13b2bfe9d69..2dc057ac721 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,5 +1,5 @@
# for building the docs
-sphinx-book-theme==1.0.1
+nvidia_sphinx_theme
myst-parser
sphinxcontrib-bibtex==2.5.0
autodocsumm
diff --git a/docs/source/_static/css/custom.css b/docs/source/_static/css/custom.css
index 7f4f1601c6c..b3cbbe76662 100644
--- a/docs/source/_static/css/custom.css
+++ b/docs/source/_static/css/custom.css
@@ -3,86 +3,6 @@
* For colors: https://clrs.cc/
*/
-/* anything related to the light theme */
-html[data-theme="light"] {
- --pst-color-primary: #76B900;
- --pst-color-secondary: #5b8e03;
- --pst-color-secondary-highlight: #5b8e03;
- --pst-color-inline-code-links: #76B900;
- --pst-color-info: var(--pst-color-primary);
- --pst-color-info-highlight: var(--pst-color-primary);
- --pst-color-info-bg: #daedb9;
- --pst-color-attention: #ffc107;
- --pst-color-text-base: #323232;
- --pst-color-text-muted: #646464;
- --pst-color-shadow: #d8d8d8;
- --pst-color-border: #c9c9c9;
- --pst-color-inline-code: #76B900;
- --pst-color-target: #fbe54e;
- --pst-color-background: #fff;
- --pst-color-on-background: #fff;
- --pst-color-surface: #f5f5f5;
- --pst-color-on-surface: #e1e1e1;
- --pst-color-link: var(--pst-color-primary);
- --pst-color-link-hover: #789841;
- --pst-color-table-row-hover-bg: #daedb9;
- --pst-color-accent: var(--pst-color-primary);
-}
-
-/* anything related to the dark theme */
-html[data-theme="dark"] {
- --pst-color-primary: #76B900;
- --pst-color-secondary: #c2f26f;
- --pst-color-secondary-highlight: #c2f26f;
- --pst-color-inline-code-links: #b6e664;
- --pst-color-info: var(--pst-color-primary);
- --pst-color-info-highlight: var(--pst-color-primary);
- --pst-color-info-bg: #3a550b;
- --pst-color-attention: #dca90f;
- --pst-color-text-base: #cecece;
- --pst-color-text-muted: #a6a6a6;
- --pst-color-shadow: #212121;
- --pst-color-border: silver;
- --pst-color-inline-code: #76B900;
- --pst-color-target: #472700;
- --pst-color-background: #121212;
- --pst-color-on-background: #1e1e1e;
- --pst-color-surface: #212121;
- --pst-color-on-surface: #373737;
- --pst-color-link: var(--pst-color-primary);
- --pst-color-link-hover: #aee354;
- --pst-color-table-row-hover-bg: #3a550b;
- --pst-color-accent: var(--pst-color-primary);
-}
-
-a {
- text-decoration: none !important;
-}
-
-/* for the announcement link */
-.bd-header-announcement a,
-.bd-header-version-warning a {
- color: #7FDBFF;
-}
-
-/* for the search box in the navbar */
-.form-control {
- border-radius: 0 !important;
- border: none !important;
- outline: none !important;
-}
-
-/* reduce padding for logo */
-.navbar-brand {
- padding-top: 0.0rem !important;
- padding-bottom: 0.0rem !important;
-}
-
-.navbar-icon-links {
- padding-top: 0.0rem !important;
- padding-bottom: 0.0rem !important;
-}
-
/* showcase task tables */
.showcase-table {
diff --git a/docs/source/_static/switcher.json b/docs/source/_static/switcher.json
new file mode 100644
index 00000000000..064caca2350
--- /dev/null
+++ b/docs/source/_static/switcher.json
@@ -0,0 +1,43 @@
+[
+ {
+ "version": "main",
+ "name": "main (latest)",
+ "url": "https://isaac-sim.github.io/IsaacLab/main/"
+ },
+ {
+ "version": "2.3.1",
+ "name": "v2.3.1 (stable)",
+ "url": "https://isaac-sim.github.io/IsaacLab/v2.3.1/",
+ "preferred": true
+ },
+ {
+ "version": "2.3.0",
+ "name": "v2.3.0",
+ "url": "https://isaac-sim.github.io/IsaacLab/v2.3.0/"
+ },
+ {
+ "version": "2.2.1",
+ "name": "v2.2.1",
+ "url": "https://isaac-sim.github.io/IsaacLab/v2.2.1/"
+ },
+ {
+ "version": "2.2.0",
+ "name": "v2.2.0",
+ "url": "https://isaac-sim.github.io/IsaacLab/v2.2.0/"
+ },
+ {
+ "version": "2.1.1",
+ "name": "v2.1.1",
+ "url": "https://isaac-sim.github.io/IsaacLab/v2.1.1/"
+ },
+ {
+ "version": "2.1.0",
+ "name": "v2.1.0",
+ "url": "https://isaac-sim.github.io/IsaacLab/v2.1.0/"
+ },
+ {
+ "version": "2.0.2",
+ "name": "v2.0.2",
+ "url": "https://isaac-sim.github.io/IsaacLab/v2.0.2/"
+ }
+]
diff --git a/docs/source/api/lab/isaaclab.devices.rst b/docs/source/api/lab/isaaclab.devices.rst
index 5f04c4733cf..2e3df24cd83 100644
--- a/docs/source/api/lab/isaaclab.devices.rst
+++ b/docs/source/api/lab/isaaclab.devices.rst
@@ -18,16 +18,16 @@
HaplyDevice
OpenXRDevice
ManusVive
- isaaclab.devices.openxr.retargeters.GripperRetargeter
- isaaclab.devices.openxr.retargeters.Se3AbsRetargeter
- isaaclab.devices.openxr.retargeters.Se3RelRetargeter
- isaaclab.devices.openxr.retargeters.GR1T2Retargeter
+ openxr.retargeters.GripperRetargeter
+ openxr.retargeters.Se3AbsRetargeter
+ openxr.retargeters.Se3RelRetargeter
+ openxr.retargeters.GR1T2Retargeter
.. rubric:: Modules
.. autosummary::
- isaaclab.devices.openxr.retargeters
+ ~openxr.retargeters
Device Base
-----------
@@ -116,25 +116,27 @@ Manus + Vive
Retargeters
-----------
-.. autoclass:: isaaclab.devices.openxr.retargeters.GripperRetargeter
+.. currentmodule:: isaaclab.devices.openxr.retargeters
+
+.. autoclass:: GripperRetargeter
:members:
:inherited-members:
:show-inheritance:
:noindex:
-.. autoclass:: isaaclab.devices.openxr.retargeters.Se3AbsRetargeter
+.. autoclass:: Se3AbsRetargeter
:members:
:inherited-members:
:show-inheritance:
:noindex:
-.. autoclass:: isaaclab.devices.openxr.retargeters.Se3RelRetargeter
+.. autoclass:: Se3RelRetargeter
:members:
:inherited-members:
:show-inheritance:
:noindex:
-.. autoclass:: isaaclab.devices.openxr.retargeters.GR1T2Retargeter
+.. autoclass:: GR1T2Retargeter
:members:
:inherited-members:
:show-inheritance:
diff --git a/docs/source/api/lab_mimic/isaaclab_mimic.envs.rst b/docs/source/api/lab_mimic/isaaclab_mimic.envs.rst
index ea8dc82d161..9b04d4c0066 100644
--- a/docs/source/api/lab_mimic/isaaclab_mimic.envs.rst
+++ b/docs/source/api/lab_mimic/isaaclab_mimic.envs.rst
@@ -7,20 +7,20 @@
.. autosummary::
- isaaclab_mimic.envs.franka_stack_ik_rel_mimic_env.FrankaCubeStackIKRelMimicEnv
- isaaclab_mimic.envs.franka_stack_ik_rel_mimic_env_cfg.FrankaCubeStackIKRelMimicEnvCfg
- isaaclab_mimic.envs.franka_stack_ik_abs_mimic_env.FrankaCubeStackIKAbsMimicEnv
- isaaclab_mimic.envs.franka_stack_ik_abs_mimic_env_cfg.FrankaCubeStackIKAbsMimicEnvCfg
- isaaclab_mimic.envs.galbot_stack_rmp_rel_mimic_env.RmpFlowGalbotCubeStackRelMimicEnv
- isaaclab_mimic.envs.galbot_stack_rmp_rel_mimic_env_cfg.RmpFlowGalbotLeftArmGripperCubeStackRelMimicEnvCfg
- isaaclab_mimic.envs.galbot_stack_rmp_rel_mimic_env_cfg.RmpFlowGalbotRightArmSuctionCubeStackRelMimicEnvCfg
- isaaclab_mimic.envs.galbot_stack_rmp_abs_mimic_env.RmpFlowGalbotCubeStackAbsMimicEnv
- isaaclab_mimic.envs.galbot_stack_rmp_abs_mimic_env_cfg.RmpFlowGalbotLeftArmGripperCubeStackAbsMimicEnvCfg
- isaaclab_mimic.envs.galbot_stack_rmp_abs_mimic_env_cfg.RmpFlowGalbotRightArmSuctionCubeStackAbsMimicEnvCfg
- isaaclab_mimic.envs.pick_place_mimic_env.PickPlaceRelMimicEnv
- isaaclab_mimic.envs.pick_place_mimic_env.PickPlaceAbsMimicEnv
- isaaclab_mimic.envs.agibot_place_upright_mug_mimic_env_cfg.RmpFlowAgibotPlaceUprightMugMimicEnvCfg
- isaaclab_mimic.envs.agibot_place_toy2box_mimic_env_cfg.RmpFlowAgibotPlaceToy2BoxMimicEnvCfg
+ franka_stack_ik_rel_mimic_env.FrankaCubeStackIKRelMimicEnv
+ franka_stack_ik_rel_mimic_env_cfg.FrankaCubeStackIKRelMimicEnvCfg
+ franka_stack_ik_abs_mimic_env.FrankaCubeStackIKAbsMimicEnv
+ franka_stack_ik_abs_mimic_env_cfg.FrankaCubeStackIKAbsMimicEnvCfg
+ galbot_stack_rmp_rel_mimic_env.RmpFlowGalbotCubeStackRelMimicEnv
+ galbot_stack_rmp_rel_mimic_env_cfg.RmpFlowGalbotLeftArmGripperCubeStackRelMimicEnvCfg
+ galbot_stack_rmp_rel_mimic_env_cfg.RmpFlowGalbotRightArmSuctionCubeStackRelMimicEnvCfg
+ galbot_stack_rmp_abs_mimic_env.RmpFlowGalbotCubeStackAbsMimicEnv
+ galbot_stack_rmp_abs_mimic_env_cfg.RmpFlowGalbotLeftArmGripperCubeStackAbsMimicEnvCfg
+ galbot_stack_rmp_abs_mimic_env_cfg.RmpFlowGalbotRightArmSuctionCubeStackAbsMimicEnvCfg
+ pick_place_mimic_env.PickPlaceRelMimicEnv
+ pick_place_mimic_env.PickPlaceAbsMimicEnv
+ agibot_place_upright_mug_mimic_env_cfg.RmpFlowAgibotPlaceUprightMugMimicEnvCfg
+ agibot_place_toy2box_mimic_env_cfg.RmpFlowAgibotPlaceToy2BoxMimicEnvCfg
Franka Environments
-------------------
diff --git a/docs/source/refs/contributing.rst b/docs/source/refs/contributing.rst
index 3b0f534b71e..e1ebc762968 100644
--- a/docs/source/refs/contributing.rst
+++ b/docs/source/refs/contributing.rst
@@ -65,7 +65,7 @@ for the documentation are located in the ``IsaacLab/docs`` directory. The docume
`reStructuredText `__ format.
We use `Sphinx `__ with the
-`Book Theme `__
+NVIDIA's modified version of the `PyData Sphinx Theme `__
for maintaining the documentation.
Sending a pull request for the documentation is the same as sending a pull request for the codebase.
diff --git a/source/isaaclab/isaaclab/envs/mdp/actions/actions_cfg.py b/source/isaaclab/isaaclab/envs/mdp/actions/actions_cfg.py
index bf8748bdf3a..565f53a6b67 100644
--- a/source/isaaclab/isaaclab/envs/mdp/actions/actions_cfg.py
+++ b/source/isaaclab/isaaclab/envs/mdp/actions/actions_cfg.py
@@ -6,7 +6,7 @@
from dataclasses import MISSING
from isaaclab.controllers import DifferentialIKControllerCfg, OperationalSpaceControllerCfg
-from isaaclab.managers.action_manager import ActionTerm, ActionTermCfg
+from isaaclab.managers import ActionTerm, ActionTermCfg
from isaaclab.utils import configclass
from . import (
diff --git a/source/isaaclab/isaaclab/envs/mdp/actions/pink_actions_cfg.py b/source/isaaclab/isaaclab/envs/mdp/actions/pink_actions_cfg.py
index a82433be84c..d1b608a7919 100644
--- a/source/isaaclab/isaaclab/envs/mdp/actions/pink_actions_cfg.py
+++ b/source/isaaclab/isaaclab/envs/mdp/actions/pink_actions_cfg.py
@@ -3,14 +3,20 @@
#
# SPDX-License-Identifier: BSD-3-Clause
+from __future__ import annotations
+
from dataclasses import MISSING
+from typing import TYPE_CHECKING
from isaaclab.controllers.pink_ik import PinkIKControllerCfg
-from isaaclab.managers.action_manager import ActionTerm, ActionTermCfg
+from isaaclab.managers.action_manager import ActionTermCfg
from isaaclab.utils import configclass
from . import pink_task_space_actions
+if TYPE_CHECKING:
+ from isaaclab.managers import ActionTerm
+
@configclass
class PinkInverseKinematicsActionCfg(ActionTermCfg):
diff --git a/source/isaaclab/isaaclab/envs/mdp/actions/rmpflow_actions_cfg.py b/source/isaaclab/isaaclab/envs/mdp/actions/rmpflow_actions_cfg.py
index dfd7a72dcb7..1a09202c2e8 100644
--- a/source/isaaclab/isaaclab/envs/mdp/actions/rmpflow_actions_cfg.py
+++ b/source/isaaclab/isaaclab/envs/mdp/actions/rmpflow_actions_cfg.py
@@ -3,15 +3,20 @@
#
# SPDX-License-Identifier: BSD-3-Clause
+from __future__ import annotations
from dataclasses import MISSING
+from typing import TYPE_CHECKING
from isaaclab.controllers.rmp_flow import RmpFlowControllerCfg
-from isaaclab.managers.action_manager import ActionTerm, ActionTermCfg
+from isaaclab.managers.action_manager import ActionTermCfg
from isaaclab.utils import configclass
from . import rmpflow_task_space_actions
+if TYPE_CHECKING:
+ from isaaclab.managers import ActionTerm
+
@configclass
class RMPFlowActionCfg(ActionTermCfg):
diff --git a/source/isaaclab_contrib/isaaclab_contrib/mdp/actions/thrust_actions_cfg.py b/source/isaaclab_contrib/isaaclab_contrib/mdp/actions/thrust_actions_cfg.py
index a3b7c704fc8..54e1663c237 100644
--- a/source/isaaclab_contrib/isaaclab_contrib/mdp/actions/thrust_actions_cfg.py
+++ b/source/isaaclab_contrib/isaaclab_contrib/mdp/actions/thrust_actions_cfg.py
@@ -3,13 +3,19 @@
#
# SPDX-License-Identifier: BSD-3-Clause
+from __future__ import annotations
+
from dataclasses import MISSING
+from typing import TYPE_CHECKING
-from isaaclab.managers.action_manager import ActionTerm, ActionTermCfg
+from isaaclab.managers import ActionTermCfg
from isaaclab.utils import configclass
from . import thrust_actions
+if TYPE_CHECKING:
+ from isaaclab.managers import ActionTerm
+
##
# Drone actions.
##
diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/locomanipulation/pick_place/configs/action_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/locomanipulation/pick_place/configs/action_cfg.py
index b195334ba68..b67e49c2140 100644
--- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/locomanipulation/pick_place/configs/action_cfg.py
+++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/locomanipulation/pick_place/configs/action_cfg.py
@@ -3,13 +3,19 @@
#
# SPDX-License-Identifier: BSD-3-Clause
+from __future__ import annotations
+
from dataclasses import MISSING
+from typing import TYPE_CHECKING
-from isaaclab.managers.action_manager import ActionTerm, ActionTermCfg
+from isaaclab.managers.action_manager import ActionTermCfg
from isaaclab.utils import configclass
from ..mdp.actions import AgileBasedLowerBodyAction
+if TYPE_CHECKING:
+ from isaaclab.managers import ActionTerm
+
@configclass
class AgileBasedLowerBodyActionCfg(ActionTermCfg):