diff --git a/.github/workflows/docs-migration.yaml b/.github/workflows/docs-migration.yaml new file mode 100644 index 000000000000..4679b7e1f490 --- /dev/null +++ b/.github/workflows/docs-migration.yaml @@ -0,0 +1,236 @@ +# 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 + +name: Docs Migration + +on: + workflow_dispatch: + inputs: + dry_run: + description: "Dry run (build but don't deploy)" + required: false + default: "false" + type: choice + options: + - "false" + - "true" + +permissions: + contents: read + +jobs: + build-version: + name: Build ${{ matrix.ref }} + runs-on: ubuntu-latest + strategy: + matrix: + ref: + - main + - develop + - release/2.1.0 + - release/2.2.0 + - release/2.3.0 + - v1.0.0 + - v1.1.0 + - v1.2.0 + - v1.3.0 + - v1.4.0 + - v1.4.1 + - v2.0.0 + - v2.0.1 + - v2.0.2 + - v2.1.0 + - v2.1.1 + - v2.2.0 + - v2.2.1 + - v2.3.0 + - v2.3.1 + - v2.3.2 + - v3.0.0-beta + fail-fast: false + + steps: + - name: Checkout ref + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ matrix.ref }} + + - name: Setup python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: "3.12" + architecture: x64 + + - name: Install dev requirements + working-directory: ./docs + run: pip install -r requirements.txt + + - name: Determine slug + id: slug + env: + REF: ${{ matrix.ref }} + run: | + # For branches with slashes, replace / with - + SLUG="${REF//\//-}" + echo "slug=$SLUG" >> "$GITHUB_OUTPUT" + echo "Slug: $SLUG" + + - name: Build docs + working-directory: ./docs + env: + # Set the version slug so conf.py (on branches that have it) can + # configure the theme switcher's version_match correctly. + DOCS_VERSION_SLUG: ${{ steps.slug.outputs.slug }} + # No -W flag: old versions may have warnings that are acceptable. + run: | + rm -rf "_build" + sphinx-build -b html . "_build" + + - name: Upload artifact + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: docs-${{ steps.slug.outputs.slug }} + path: ./docs/_build + + deploy-all: + name: Deploy All Versions + runs-on: ubuntu-latest + needs: [build-version] + if: ${{ inputs.dry_run == 'false' }} + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + sparse-checkout: | + docs/_static/version-switcher.js + docs/_redirect/index.html + + - name: Download all artifacts + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + path: ./artifacts + + - name: Assemble site + run: | + mkdir -p site + + # Move each artifact into its versioned directory + for dir in artifacts/docs-*; do + SLUG="${dir#artifacts/docs-}" + echo "Assembling: $SLUG" + cp -r "$dir" "site/${SLUG}" + done + + # Inject version-switcher.js into every HTML file across all versions + find site/ -name "*.html" -exec sed -i \ + 's|||' {} + + + # Verify injection + TOTAL=$(find site/ -name "*.html" | wc -l) + INJECTED=$(grep -rl 'version-switcher.js' site/ --include="*.html" | wc -l) + echo "Injected version-switcher.js into ${INJECTED}/${TOTAL} HTML files" + if [ "$TOTAL" -gt 0 ] && [ "$INJECTED" -eq 0 ]; then + echo "::error::version-switcher.js injection found zero matches in ${TOTAL} HTML files" + exit 1 + fi + + # Copy static assets to root + cp docs/_static/version-switcher.js site/version-switcher.js + cp docs/_redirect/index.html site/index.html + + - name: Create stable alias + run: | + # Find the latest semver tag directory (highest version number) + LATEST_TAG="" + for dir in site/v*; do + [ -d "$dir" ] || continue + TAG="${dir#site/}" + if [ -z "$LATEST_TAG" ] || python3 -c " + import sys, re + def vt(s): return tuple(int(n) for n in re.findall(r'\d+', s)) + sys.exit(0 if vt(sys.argv[1]) > vt(sys.argv[2]) else 1) + " "$TAG" "$LATEST_TAG" 2>/dev/null; then + LATEST_TAG="$TAG" + fi + done + + if [ -n "$LATEST_TAG" ]; then + echo "Creating /stable/ from ${LATEST_TAG}" + cp -r "site/${LATEST_TAG}" "site/stable" + # Update root redirect to point to /stable/ + cat > site/index.html << 'HTMLEOF' + + + + Redirecting to the latest Isaac Lab documentation + + + + + +

Redirecting to Isaac Lab documentation...

+ + + HTMLEOF + else + echo "No tag directories found, skipping /stable/ creation" + fi + + - name: Generate versions.json + run: | + python3 << 'PYEOF' + import json, os, re, sys + + versions = [] + for name in sorted(os.listdir('site')): + path = os.path.join('site', name) + if not os.path.isdir(path): + continue + versions.append({ + 'name': name, + 'version': name, + 'url': '/IsaacLab/' + name + '/', + }) + + if not versions: + print('::error::No version directories found in site/') + sys.exit(1) + + # Sort: branches first, then releases, then tags + def _version_tuple(s): + """Extract numeric parts for semver-aware sorting.""" + return tuple(int(n) for n in re.findall(r'\d+', s)) + + def sort_key(v): + s = v['version'] + if s == 'main': + return (0, ()) + elif s == 'develop': + return (1, ()) + elif s.startswith('release-'): + return (2, _version_tuple(s)) + else: + return (3, _version_tuple(s)) + + versions.sort(key=sort_key) + + with open('site/versions.json', 'w') as f: + json.dump(versions, f, indent=2) + f.write('\n') + + print(f'Generated versions.json with {len(versions)} entries:') + for v in versions: + print(f' {v["version"]}') + PYEOF + + - name: Deploy to gh-pages + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./site + keep_files: false diff --git a/.github/workflows/docs-release.yml b/.github/workflows/docs-release.yml new file mode 100644 index 000000000000..431799cdd1f9 --- /dev/null +++ b/.github/workflows/docs-release.yml @@ -0,0 +1,258 @@ +# 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 + +name: Docs (release) + +on: + push: + branches: + - main + - 'release/**' + tags: + - 'v[1-9]*' + pull_request: + branches: + - main + - 'release/**' + types: [opened, synchronize, reopened] + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + check-secrets: + name: Check Secrets + runs-on: ubuntu-latest + outputs: + trigger-deploy: ${{ steps.trigger-deploy.outputs.defined }} + + steps: + - id: trigger-deploy + env: + REPO_NAME: ${{ secrets.REPO_NAME }} + if: >- + github.repository == env.REPO_NAME && + ( + github.ref == 'refs/heads/main' || + startsWith(github.ref, 'refs/heads/release/') || + startsWith(github.ref, 'refs/tags/v') + ) + run: echo "defined=true" >> "$GITHUB_OUTPUT" + + build-docs: + name: Build Docs + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Setup python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: "3.12" + architecture: x64 + + - name: Determine version slug + id: slug + env: + REF: ${{ github.ref }} + run: | + if [[ "$REF" == refs/tags/* ]]; then + SLUG="${REF#refs/tags/}" + elif [[ "$REF" == refs/heads/* ]]; then + SLUG="${REF#refs/heads/}" + SLUG="${SLUG//\//-}" + fi + # For PRs, SLUG remains unset — conf.py falls back to VERSION file. + if [ -n "$SLUG" ]; then + echo "slug=$SLUG" >> "$GITHUB_OUTPUT" + fi + + - name: Install dev requirements + working-directory: ./docs + run: pip install -r requirements.txt + + - name: Build docs + working-directory: ./docs + env: + DOCS_VERSION_SLUG: ${{ steps.slug.outputs.slug }} + run: make current-docs + + - name: Upload docs artifact + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: docs-html + path: ./docs/_build + + deploy-docs: + name: Deploy Docs + runs-on: ubuntu-latest + needs: [check-secrets, build-docs] + if: needs.check-secrets.outputs.trigger-deploy == 'true' + permissions: + contents: write + # Serialize deploys to avoid race conditions on versions.json. + concurrency: + group: docs-deploy-gh-pages + cancel-in-progress: false + + steps: + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + sparse-checkout: | + docs/_static/version-switcher.js + + - name: Download docs artifact + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: docs-html + path: ./artifact + + - name: Determine version slug + id: slug + env: + REF: ${{ github.ref }} + run: | + if [[ "$REF" == refs/tags/* ]]; then + SLUG="${REF#refs/tags/}" + elif [[ "$REF" == refs/heads/* ]]; then + SLUG="${REF#refs/heads/}" + SLUG="${SLUG//\//-}" + fi + if [ -z "$SLUG" ]; then + echo "::error::Could not determine version slug from ref: $REF" + exit 1 + fi + echo "slug=$SLUG" >> "$GITHUB_OUTPUT" + echo "Version slug: $SLUG" + + - name: Assemble deploy directory + env: + SLUG: ${{ steps.slug.outputs.slug }} + REF: ${{ github.ref }} + run: | + mkdir -p site + + # Copy built docs into versioned subdirectory + cp -r artifact/current "site/${SLUG}" + + # Inject version-switcher.js into every HTML file + find "site/${SLUG}" -name "*.html" -exec sed -i \ + 's|||' {} + + + # Verify injection + TOTAL=$(find "site/${SLUG}" -name "*.html" | wc -l) + INJECTED=$(grep -rl 'version-switcher.js' "site/${SLUG}" --include="*.html" | wc -l) + echo "Injected version-switcher.js into ${INJECTED}/${TOTAL} HTML files" + if [ "$TOTAL" -gt 0 ] && [ "$INJECTED" -ne "$TOTAL" ]; then + echo "::warning::version-switcher.js injection missed $((TOTAL - INJECTED)) of ${TOTAL} HTML files" + fi + + # Copy version-switcher.js to site root + cp docs/_static/version-switcher.js site/version-switcher.js + + # For tag deploys: create /stable/ alias and redirect root to it + if [[ "$REF" == refs/tags/* ]]; then + echo "Tag deploy detected — creating /stable/ alias" + cp -r "site/${SLUG}" "site/stable" + cat > site/index.html << 'HTMLEOF' + + + + Redirecting to the latest Isaac Lab documentation + + + + + +

Redirecting to Isaac Lab documentation...

+ + + HTMLEOF + fi + + - name: Update versions.json + env: + SLUG: ${{ steps.slug.outputs.slug }} + GH_REPO: ${{ github.repository }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Fetch existing versions.json from gh-pages branch (avoids CDN cache). + if gh api "repos/${GH_REPO}/contents/versions.json?ref=gh-pages" \ + --jq '.content' 2>/dev/null | base64 -d > existing.json 2>/dev/null; then + echo "Fetched existing versions.json from gh-pages branch" + else + echo "[]" > existing.json + echo "No existing versions.json, starting fresh" + fi + + # Upsert this version's entry + python3 << 'PYEOF' + import json, os, re, sys + + slug = os.environ.get('SLUG', '') + if not slug: + print('::error::SLUG environment variable is empty') + sys.exit(1) + + try: + with open('existing.json') as f: + versions = json.load(f) + except json.JSONDecodeError as e: + print(f'::warning::existing.json contains invalid JSON: {e}') + versions = [] + + if not isinstance(versions, list): + print(f'::warning::versions.json was not an array (got {type(versions).__name__}), resetting') + versions = [] + + # Remove existing entry for this slug + versions = [v for v in versions if isinstance(v, dict) and v.get('version') != slug] + + # Add updated entry + versions.append({ + 'name': slug, + 'version': slug, + 'url': '/IsaacLab/' + slug + '/', + }) + + # Sort: branches first (main, develop), then releases, then tags + def _version_tuple(s): + """Extract numeric parts for semver-aware sorting.""" + return tuple(int(n) for n in re.findall(r'\d+', s)) + + def sort_key(v): + s = v['version'] + if s == 'main': + return (0, ()) + elif s == 'develop': + return (1, ()) + elif s.startswith('release-'): + return (2, _version_tuple(s)) + else: + return (3, _version_tuple(s)) + + versions.sort(key=sort_key) + + with open('site/versions.json', 'w') as f: + json.dump(versions, f, indent=2) + f.write('\n') + PYEOF + + echo "Updated versions.json:" + cat site/versions.json + + - name: Deploy to gh-pages + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./site + keep_files: true diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml deleted file mode 100644 index 9af2d6e94f0b..000000000000 --- a/.github/workflows/docs.yaml +++ /dev/null @@ -1,87 +0,0 @@ -# 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 - -name: Build & deploy docs - -on: - push: - branches: - - main - - devel - - 'release/**' - pull_request: - types: [opened, synchronize, reopened] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - check-secrets: - name: Check secrets - runs-on: ubuntu-latest - outputs: - trigger-deploy: ${{ steps.trigger-deploy.outputs.defined }} - steps: - - id: trigger-deploy - env: - REPO_NAME: ${{ secrets.REPO_NAME }} - if: "${{ github.repository == env.REPO_NAME && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/devel' || startsWith(github.ref, 'refs/heads/release/')) }}" - run: echo "defined=true" >> "$GITHUB_OUTPUT" - - build-docs: - name: Build Docs - runs-on: ubuntu-latest - needs: [check-secrets] - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Setup python - uses: actions/setup-python@v2 - with: - python-version: "3.11" - architecture: x64 - - - name: Install dev requirements - working-directory: ./docs - run: pip install -r requirements.txt - - - name: Check branch docs building - working-directory: ./docs - if: needs.check-secrets.outputs.trigger-deploy != 'true' - run: make current-docs - - - name: Generate multi-version docs - working-directory: ./docs - run: | - git fetch --prune --unshallow --tags - make multi-docs - - - name: Upload docs artifact - uses: actions/upload-artifact@v4 - with: - name: docs-html - path: ./docs/_build - - deploy-docs: - name: Deploy Docs - runs-on: ubuntu-latest - needs: [check-secrets, build-docs] - if: needs.check-secrets.outputs.trigger-deploy == 'true' - - steps: - - name: Download docs artifact - uses: actions/download-artifact@v4 - with: - name: docs-html - path: ./docs/_build - - - name: Deploy to gh-pages - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./docs/_build diff --git a/docs/Makefile b/docs/Makefile index 0bff236671c8..002fdd60070a 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -8,11 +8,6 @@ SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build -.PHONY: multi-docs -multi-docs: - @sphinx-multiversion "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) - @cp _redirect/index.html $(BUILDDIR)/index.html - .PHONY: current-docs current-docs: @rm -rf "$(BUILDDIR)/current" diff --git a/docs/_static/version-switcher.js b/docs/_static/version-switcher.js new file mode 100644 index 000000000000..62bf86ed07b2 --- /dev/null +++ b/docs/_static/version-switcher.js @@ -0,0 +1,120 @@ +// 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 + +/** + * Standalone version switcher for Isaac Lab documentation. + * + * Injected into every version's HTML during deploy. Fetches versions.json + * and renders a floating dropdown. Skips rendering if the pydata-sphinx-theme + * built-in switcher is already present on the page. + */ +(function () { + "use strict"; + + // Skip if pydata-sphinx-theme's built-in switcher is present. + if (document.querySelector(".version-switcher__container")) { + return; + } + + // Resolve the base URL for the docs site. + // Works for both /IsaacLab/main/... and custom domain setups. + var pathParts = window.location.pathname.split("/").filter(Boolean); + // Expect at least ///... + var basePath = "/" + pathParts[0] + "/"; + var currentSlug = pathParts[1] || ""; + // The relative page path within the version (e.g. "api/index.html"). + var pagePath = pathParts.slice(2).join("/") || "index.html"; + + var JSON_URL = basePath + "versions.json"; + + function createSwitcher(versions) { + // Container + var container = document.createElement("div"); + container.id = "isaaclab-version-switcher"; + + // Label + var label = document.createElement("label"); + label.textContent = "Version: "; + label.setAttribute("for", "isaaclab-version-select"); + container.appendChild(label); + + // Select + var select = document.createElement("select"); + select.id = "isaaclab-version-select"; + for (var i = 0; i < versions.length; i++) { + var v = versions[i]; + var option = document.createElement("option"); + option.value = v.url; + option.textContent = v.name; + if (v.version === currentSlug) { + option.selected = true; + } + select.appendChild(option); + } + select.addEventListener("change", function () { + var targetBase = select.value; + // Try to navigate to the same page under the new version. + var targetUrl = targetBase + pagePath; + // Use a HEAD request to check if the page exists; fall back to index. + var xhr = new XMLHttpRequest(); + xhr.open("HEAD", targetUrl, true); + xhr.onload = function () { + window.location.href = xhr.status < 400 ? targetUrl : targetBase; + }; + xhr.onerror = function () { + window.location.href = targetBase; + }; + xhr.send(); + }); + container.appendChild(select); + + // Styles + var style = document.createElement("style"); + style.textContent = + "#isaaclab-version-switcher {" + + " position: fixed; top: 10px; right: 10px; z-index: 9999;" + + " background: #2b2b2b; color: #e0e0e0; padding: 6px 12px;" + + " border-radius: 6px; font-family: sans-serif; font-size: 13px;" + + " box-shadow: 0 2px 8px rgba(0,0,0,0.3);" + + "}" + + "#isaaclab-version-switcher label {" + + " margin-right: 4px; font-weight: bold;" + + "}" + + "#isaaclab-version-switcher select {" + + " background: #3c3c3c; color: #e0e0e0; border: 1px solid #555;" + + " border-radius: 4px; padding: 2px 6px; font-size: 13px;" + + "}" + + "@media (prefers-color-scheme: light) {" + + " #isaaclab-version-switcher { background: #f5f5f5; color: #333; }" + + " #isaaclab-version-switcher select { background: #fff; color: #333; border-color: #ccc; }" + + "}"; + document.head.appendChild(style); + document.body.appendChild(container); + } + + // Fetch versions.json and build the switcher. + var xhr = new XMLHttpRequest(); + xhr.open("GET", JSON_URL, true); + xhr.onload = function () { + if (xhr.status === 200) { + try { + var versions = JSON.parse(xhr.responseText); + if (!Array.isArray(versions)) { + console.warn("[version-switcher] versions.json is not an array"); + return; + } + createSwitcher(versions); + } catch (e) { + console.warn("[version-switcher] Failed to parse versions.json:", e.message); + } + } else if (xhr.status !== 0) { + console.warn("[version-switcher] versions.json returned HTTP", xhr.status); + } + }; + xhr.onerror = function () { + console.warn("[version-switcher] Network error fetching", JSON_URL); + }; + xhr.send(); +})(); diff --git a/docs/_templates/versioning.html b/docs/_templates/versioning.html deleted file mode 100644 index eb67be60e1c4..000000000000 --- 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 248e14c3f89c..7b00ed788b46 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -42,6 +42,10 @@ full_version = f.read().strip() version = ".".join(full_version.split(".")[:3]) +# CI sets DOCS_VERSION_SLUG (e.g. "main", "develop", "v2.3.2") for the +# version switcher. Local builds fall back to the semver from VERSION. +_version_slug = os.getenv("DOCS_VERSION_SLUG") or version + # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be @@ -64,7 +68,6 @@ "sphinx_copybutton", "sphinx_design", "sphinx_tabs.tabs", # backwards compatibility for building docs on v1.0.0 - "sphinx_multiversion", ] # mathjax hacks @@ -139,7 +142,16 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "_redirect", "_templates", "Thumbs.db", ".DS_Store", "README.md", "licenses/*"] +exclude_patterns = [ + "_build", + "_redirect", + "_templates", + "Thumbs.db", + ".DS_Store", + "README.md", + "licenses/*", + "superpowers", +] # Mock out modules that are not available on RTD autodoc_mock_imports = [ @@ -218,6 +230,15 @@ # analysis. Since those hints are actual hints that *CANNOT* by definition # by canonicalized, our only recourse is to squelch warnings altogether. "ref.python", + # Sphinx 7+ emits warnings when autosummary entries use fully-qualified + # names that include the current module. These are cosmetic and do not + # affect the generated output. + "autosummary.import_cycle", + # The pydata-sphinx-theme version switcher fetches versions.json at build + # time to validate it. Before the first deploy, the file does not exist on + # gh-pages, causing a 404 that becomes a warning. Suppress it so -W builds + # don't fail on PRs. + "config.invalid_switcher_json", ] # -- Internationalization ---------------------------------------------------- @@ -278,21 +299,14 @@ }, ], "icon_links_label": "Quick Links", + "switcher": { + "json_url": "https://isaac-sim.github.io/IsaacLab/versions.json", + "version_match": _version_slug, + }, + "navbar_end": ["version-switcher", "theme-switcher", "navbar-icon-links"], } -templates_path = [ - "_templates", -] - -# Whitelist pattern for remotes -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/.*)$") -# 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"] -} +html_sidebars = {"**": ["navbar-logo.html", "icon-links.html", "search-field.html", "sbt-sidebar-nav.html"]} # -- Advanced configuration ------------------------------------------------- diff --git a/docs/requirements.txt b/docs/requirements.txt index 13b2bfe9d69e..75b50a41e787 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,6 @@ # for building the docs -sphinx-book-theme==1.0.1 +sphinx>=7.0,<9 +sphinx-book-theme>=1.1 myst-parser sphinxcontrib-bibtex==2.5.0 autodocsumm @@ -8,7 +9,6 @@ sphinx-icon sphinx_design sphinxemoji sphinx-tabs # backwards compatibility for building docs on v1.0.0 -sphinx-multiversion==0.2.4 # basic python numpy